
/**
 * yui/yui-min.js;
 */
/*
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 3.0.0
build: 1549
*/
(function(){var I={},B=new Date().getTime(),A,E,H=function(){if(window.addEventListener){return function(M,L,K,J){M.addEventListener(L,K,(!!J));};}else{if(window.attachEvent){return function(L,K,J){L.attachEvent("on"+K,J);};}else{return function(){};}}}(),F=function(){if(window.removeEventListener){return function(M,L,K,J){M.removeEventListener(L,K,!!J);};}else{if(window.detachEvent){return function(L,K,J){L.detachEvent("on"+K,J);};}else{return function(){};}}}(),D=function(){YUI.Env.windowLoaded=true;YUI.Env.DOMReady=true;F(window,"load",D);},C={"io.xdrReady":1,"io.xdrResponse":1},G=Array.prototype.slice;if(typeof YUI==="undefined"||!YUI){YUI=function(O,N,M,L,J){var K=this,R=arguments,Q,P=R.length;if(!(K instanceof YUI)){return new YUI(O,N,M,L,J);}else{K._init();for(Q=0;Q<P;Q++){K._config(R[Q]);}K._setup();return K;}};}YUI.prototype={_config:function(N){N=N||{};var O=this.config,L,K,J,M;M=O.modules;for(L in N){if(M&&L=="modules"){J=N[L];for(K in J){if(J.hasOwnProperty(K)){M[K]=J[K];}}}else{if(L=="win"){O[L]=N[L].contentWindow||N[L];O.doc=O[L].document;}else{O[L]=N[L];}}}},_init:function(){var J="3.0.0",K=this;if(J.indexOf("@")>-1){J="test";}K.version=J;K.Env={mods:{},cdn:"http://yui.yahooapis.com/"+J+"/build/",bootstrapped:false,_idx:0,_used:{},_attached:{},_yidx:0,_uidx:0,_loaded:{}};K.Env._loaded[J]={};if(YUI.Env){K.Env._yidx=(++YUI.Env._yidx);K.Env._guidp=("yui_"+J+"-"+K.Env._yidx+"-"+B).replace(/\./g,"_");K.id=K.stamp(K);I[K.id]=K;}K.constructor=YUI;K.config={win:window||{},doc:document,debug:true,useBrowserConsole:true,throwFail:true,bootstrap:true,fetchCSS:true,base:function(){var L,M,O,N;M=document.getElementsByTagName("script");for(O=0;O<M.length;O=O+1){N=M[O].src.match(/^(.*)yui\/yui[\.\-].*js(\?.*)?$/);L=N&&N[1];if(L){break;}}return L||K.Env.cdn;}(),loaderPath:"loader/loader-min.js"};},_setup:function(J){this.use("yui-base");},applyTo:function(P,O,L){if(!(O in C)){this.log(O+": applyTo not allowed","warn","yui");return null;}var K=I[P],N,J,M;if(K){N=O.split(".");J=K;for(M=0;M<N.length;M=M+1){J=J[N[M]];if(!J){this.log("applyTo not found: "+O,"warn","yui");}}return J.apply(K,L);}return null;},add:function(K,M,J,L){YUI.Env.mods[K]={name:K,fn:M,version:J,details:L||{}};return this;},_attach:function(K,O){var T=YUI.Env.mods,L=this.Env._attached,Q,P=K.length,M,N,R,S,J;for(Q=0;Q<P;Q=Q+1){M=K[Q];N=T[M];if(!L[M]&&N){L[M]=true;R=N.details;S=R.requires;J=R.use;if(S){this._attach(this.Array(S));}if(N.fn){N.fn(this);}if(J){this._attach(this.Array(J));}}}},use:function(){if(this._loading){this._useQueue=this._useQueue||new this.Queue();this._useQueue.add(G.call(arguments,0));return this;}var K=this,U=G.call(arguments,0),Z=YUI.Env.mods,b=K.Env._used,V,O=U[0],M=false,X=U[U.length-1],W=K.config.bootstrap,P,R,N,Q=[],J=[],S=K.config.fetchCSS,T=function(d){if(b[d]){return;}var Y=Z[d],c,e,a;if(Y){b[d]=true;e=Y.details.requires;a=Y.details.use;}else{if(!YUI.Env._loaded[K.version][d]){Q.push(d);}else{b[d]=true;}}if(e){if(K.Lang.isString(e)){T(e);}else{for(c=0;c<e.length;c=c+1){T(e[c]);}}}J.push(d);},L;if(typeof X==="function"){U.pop();}else{X=null;}L=function(Y){Y=Y||{success:true,msg:"not dynamic"};if(X){X(K,Y);}if(K.fire){K.fire("yui:load",K,Y);}K._loading=false;if(K._useQueue&&K._useQueue.size()&&!K._loading){K.use.apply(K,K._useQueue.next());}};if(O==="*"){U=[];for(P in Z){if(Z.hasOwnProperty(P)){U.push(P);}}if(X){U.push(X);}return K.use.apply(K,U);}if(K.Loader){M=true;V=new K.Loader(K.config);V.require(U);V.ignoreRegistered=true;V.allowRollup=false;V.calculate(null,(S)?null:"js");U=V.sorted;}N=U.length;for(R=0;R<N;R=R+1){T(U[R]);}N=Q.length;if(N){Q=K.Object.keys(K.Array.hash(Q));}if(W&&N&&K.Loader){K._loading=true;V=new K.Loader(K.config);V.onSuccess=L;V.onFailure=L;V.onTimeout=L;V.context=K;V.attaching=U;V.require((S)?Q:U);V.insert(null,(S)?null:"js");}else{if(W&&N&&K.Get&&!K.Env.bootstrapped){K._loading=true;U=K.Array(arguments,0,true);K.Get.script(K.config.base+K.config.loaderPath,{onEnd:function(){K._loading=false;K.Env.bootstrapped=true;K._attach(["loader"]);K.use.apply(K,U);}});return K;}else{if(N){}K._attach(J);L();}}return K;},namespace:function(){var J=arguments,N=null,L,K,M;for(L=0;L<J.length;L=L+1){M=(""+J[L]).split(".");N=this;for(K=(M[0]=="YAHOO")?1:0;K<M.length;K=K+1){N[M[K]]=N[M[K]]||{};N=N[M[K]];}}return N;},log:function(){},error:function(K,J){if(this.config.throwFail){throw (J||new Error(K));}else{this.message(K,"error");}return this;},guid:function(J){var K=this.Env._guidp+(++this.Env._uidx);return(J)?(J+K):K;},stamp:function(L,M){if(!L){return L;}var J=(typeof L==="string")?L:L._yuid;if(!J){J=this.guid();if(!M){try{L._yuid=J;}catch(K){J=null;}}}return J;}};A=YUI.prototype;for(E in A){YUI[E]=A[E];}YUI._init();H(window,"load",D);YUI.Env.add=H;YUI.Env.remove=F;})();YUI.add("yui-base",function(B){function A(){this._init();this.add.apply(this,arguments);}A.prototype={_init:function(){this._q=[];},next:function(){return this._q.shift();},add:function(){B.Array.each(B.Array(arguments,0,true),function(C){this._q.push(C);},this);return this;},size:function(){return this._q.length;}};B.Queue=A;(function(){B.Lang=B.Lang||{};var R=B.Lang,G="array",I="boolean",D="date",M="error",S="function",H="number",K="null",F="object",O="regexp",N="string",C=Object.prototype.toString,P="undefined",E={"undefined":P,"number":H,"boolean":I,"string":N,"[object Function]":S,"[object RegExp]":O,"[object Array]":G,"[object Date]":D,"[object Error]":M},J=/^\s+|\s+$/g,Q="";R.isArray=function(L){return R.type(L)===G;};R.isBoolean=function(L){return typeof L===I;};R.isFunction=function(L){return R.type(L)===S;};R.isDate=function(L){return R.type(L)===D;};R.isNull=function(L){return L===null;};R.isNumber=function(L){return typeof L===H&&isFinite(L);};R.isObject=function(T,L){return(T&&(typeof T===F||(!L&&R.isFunction(T))))||false;};R.isString=function(L){return typeof L===N;};R.isUndefined=function(L){return typeof L===P;};R.trim=function(L){try{return L.replace(J,Q);}catch(T){return L;}};R.isValue=function(T){var L=R.type(T);
switch(L){case H:return isFinite(T);case K:case P:return false;default:return !!(L);}};R.type=function(L){return E[typeof L]||E[C.call(L)]||(L?F:K);};})();(function(){var C=B.Lang,D=Array.prototype,E=function(M,J,L){var I=(L)?2:B.Array.test(M),H,G,F;if(I){try{return D.slice.call(M,J||0);}catch(K){F=[];for(H=0,G=M.length;H<G;H=H+1){F.push(M[H]);}return F;}}else{return[M];}};B.Array=E;E.test=function(H){var F=0;if(C.isObject(H)){if(C.isArray(H)){F=1;}else{try{if("length" in H&&!("tagName" in H)&&!("alert" in H)&&(!B.Lang.isFunction(H.size)||H.size()>1)){F=2;}}catch(G){}}}return F;};E.each=(D.forEach)?function(F,G,H){D.forEach.call(F||[],G,H||B);return B;}:function(G,I,J){var F=(G&&G.length)||0,H;for(H=0;H<F;H=H+1){I.call(J||B,G[H],H,G);}return B;};E.hash=function(H,G){var K={},F=H.length,J=G&&G.length,I;for(I=0;I<F;I=I+1){K[H[I]]=(J&&J>I)?G[I]:true;}return K;};E.indexOf=(D.indexOf)?function(F,G){return D.indexOf.call(F,G);}:function(F,H){for(var G=0;G<F.length;G=G+1){if(F[G]===H){return G;}}return -1;};E.numericSort=function(G,F){return(G-F);};E.some=(D.some)?function(F,G,H){return D.some.call(F,G,H);}:function(G,I,J){var F=G.length,H;for(H=0;H<F;H=H+1){if(I.call(J,G[H],H,G)){return true;}}return false;};})();(function(){var D=B.Lang,C="__",E=function(H,G){var F=G.toString;if(D.isFunction(F)&&F!=Object.prototype.toString){H.toString=F;}};B.merge=function(){var G=arguments,I={},H,F=G.length;for(H=0;H<F;H=H+1){B.mix(I,G[H],true);}return I;};B.mix=function(F,O,H,N,L,M){if(!O||!F){return F||B;}if(L){switch(L){case 1:return B.mix(F.prototype,O.prototype,H,N,0,M);case 2:B.mix(F.prototype,O.prototype,H,N,0,M);break;case 3:return B.mix(F,O.prototype,H,N,0,M);case 4:return B.mix(F.prototype,O,H,N,0,M);default:}}var K=M&&D.isArray(F),J,I,G;if(N&&N.length){for(J=0,I=N.length;J<I;++J){G=N[J];if(G in O){if(M&&D.isObject(F[G],true)){B.mix(F[G],O[G]);}else{if(!K&&(H||!(G in F))){F[G]=O[G];}else{if(K){F.push(O[G]);}}}}}}else{for(J in O){if(M&&D.isObject(F[J],true)){B.mix(F[J],O[J]);}else{if(!K&&(H||!(J in F))){F[J]=O[J];}else{if(K){F.push(O[J]);}}}}if(B.UA.ie){E(F,O);}}return F;};B.cached=function(H,F,G){F=F||{};return function(L,K){var J=(K)?Array.prototype.join.call(arguments,C):L,I=F[J];if(!(J in F)||(G&&F[J]==G)){F[J]=H.apply(H,arguments);}return F[J];};};})();(function(){B.Object=function(H){var G=function(){};G.prototype=H;return new G();};var E=B.Object,D=undefined,C=function(J,I){var H=(I===2),F=(H)?0:[],G;for(G in J){if(H){F++;}else{if(J.hasOwnProperty(G)){F.push((I)?J[G]:G);}}}return F;};E.keys=function(F){return C(F);};E.values=function(F){return C(F,1);};E.size=function(F){return C(F,2);};E.hasKey=function(G,F){return(F in G);};E.hasValue=function(G,F){return(B.Array.indexOf(E.values(G),F)>-1);};E.owns=function(G,F){return(G.hasOwnProperty(F));};E.each=function(J,I,K,H){var G=K||B,F;for(F in J){if(H||J.hasOwnProperty(F)){I.call(G,J[F],F,J);}}return B;};E.getValue=function(J,I){var H=B.Array(I),F=H.length,G;for(G=0;J!==D&&G<F;G=G+1){J=J[H[G]];}return J;};E.setValue=function(L,J,K){var I=B.Array(J),H=I.length-1,F,G=L;if(H>=0){for(F=0;G!==D&&F<H;F=F+1){G=G[I[F]];}if(G!==D){G[I[F]]=K;}else{return D;}}return L;};})();B.UA=function(){var F=function(J){var K=0;return parseFloat(J.replace(/\./g,function(){return(K++==1)?"":".";}));},I=navigator,H={ie:0,opera:0,gecko:0,webkit:0,mobile:null,air:0,caja:I.cajaVersion,secure:false,os:null},E=I&&I.userAgent,G=B.config.win.location,D=G&&G.href,C;H.secure=D&&(D.toLowerCase().indexOf("https")===0);if(E){if((/windows|win32/i).test(E)){H.os="windows";}else{if((/macintosh/i).test(E)){H.os="macintosh";}}if((/KHTML/).test(E)){H.webkit=1;}C=E.match(/AppleWebKit\/([^\s]*)/);if(C&&C[1]){H.webkit=F(C[1]);if(/ Mobile\//.test(E)){H.mobile="Apple";}else{C=E.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/);if(C){H.mobile=C[0];}}C=E.match(/AdobeAIR\/([^\s]*)/);if(C){H.air=C[0];}}if(!H.webkit){C=E.match(/Opera[\s\/]([^\s]*)/);if(C&&C[1]){H.opera=F(C[1]);C=E.match(/Opera Mini[^;]*/);if(C){H.mobile=C[0];}}else{C=E.match(/MSIE\s([^;]*)/);if(C&&C[1]){H.ie=F(C[1]);}else{C=E.match(/Gecko\/([^\s]*)/);if(C){H.gecko=1;C=E.match(/rv:([^\s\)]*)/);if(C&&C[1]){H.gecko=F(C[1]);}}}}}}return H;}();(function(){var F=["yui-base"],D,I=B.config,H=YUI.Env.mods,G,E;B.use.apply(B,F);if(I.core){D=I.core;}else{D=[];G=["get","loader","yui-log","yui-later"];for(E=0;E<G.length;E++){if(H[G[E]]){D.push(G[E]);}}}B.use.apply(B,D);})();},"3.0.0");YUI.add("get",function(A){(function(){var C=A.UA,B=A.Lang,E="text/javascript",F="text/css",D="stylesheet";A.Get=function(){var M={},K=0,U=false,W=function(a,X,b){var Y=b||A.config.win,c=Y.document,e=c.createElement(a),Z;for(Z in X){if(X[Z]&&X.hasOwnProperty(Z)){e.setAttribute(Z,X[Z]);}}return e;},T=function(Y,Z,X){var a={id:A.guid(),type:F,rel:D,href:Y};if(X){A.mix(a,X);}return W("link",a,Z);},S=function(Y,Z,X){var a={id:A.guid(),type:E,src:Y};if(X){A.mix(a,X);}return W("script",a,Z);},N=function(c){var X=M[c],Y,a,g,e,j,b,Z,f;if(X){Y=X.nodes;a=Y.length;g=X.win.document;e=g.getElementsByTagName("head")[0];if(X.insertBefore){j=L(X.insertBefore,c);if(j){e=j.parentNode;}}for(b=0;b<a;b=b+1){Z=Y[b];if(Z.clearAttributes){Z.clearAttributes();}else{for(f in Z){delete Z[f];}}e.removeChild(Z);}}X.nodes=[];},P=function(Y,Z,X){return{tId:Y.tId,win:Y.win,data:Y.data,nodes:Y.nodes,msg:Z,statusText:X,purge:function(){N(this.tId);}};},O=function(b,a,X){var Y=M[b],Z;if(Y&&Y.onEnd){Z=Y.context||Y;Y.onEnd.call(Z,P(Y,a,X));}},V=function(a,Z){var X=M[a],Y;if(X.timer){clearTimeout(X.timer);}if(X.onFailure){Y=X.context||X;X.onFailure.call(Y,P(X,Z));}O(a,Z,"failure");},L=function(X,a){var Y=M[a],Z=(B.isString(X))?Y.win.document.getElementById(X):X;if(!Z){V(a,"target node not found: "+X);}return Z;},I=function(a){var X=M[a],Z,Y;if(X.timer){clearTimeout(X.timer);}X.finished=true;if(X.aborted){Z="transaction "+a+" was aborted";V(a,Z);return;}if(X.onSuccess){Y=X.context||X;X.onSuccess.call(Y,P(X));}O(a,Z,"OK");},Q=function(Z){var X=M[Z],Y;if(X.onTimeout){Y=X.context||X;X.onTimeout.call(Y,P(X));
}O(Z,"timeout","timeout");},H=function(Z,c){var Y=M[Z],b,g,f,e,a,X,i;if(Y.timer){clearTimeout(Y.timer);}if(Y.aborted){b="transaction "+Z+" was aborted";V(Z,b);return;}if(c){Y.url.shift();if(Y.varName){Y.varName.shift();}}else{Y.url=(B.isString(Y.url))?[Y.url]:Y.url;if(Y.varName){Y.varName=(B.isString(Y.varName))?[Y.varName]:Y.varName;}}g=Y.win;f=g.document;e=f.getElementsByTagName("head")[0];if(Y.url.length===0){I(Z);return;}X=Y.url[0];if(!X){Y.url.shift();return H(Z);}if(Y.timeout){Y.timer=setTimeout(function(){Q(Z);},Y.timeout);}if(Y.type==="script"){a=S(X,g,Y.attributes);}else{a=T(X,g,Y.attributes);}J(Y.type,a,Z,X,g,Y.url.length);Y.nodes.push(a);if(Y.insertBefore){i=L(Y.insertBefore,Z);if(i){i.parentNode.insertBefore(a,i);}}else{e.appendChild(a);}if((C.webkit||C.gecko)&&Y.type==="css"){H(Z,X);}},G=function(){if(U){return;}U=true;var X,Y;for(X in M){if(M.hasOwnProperty(X)){Y=M[X];if(Y.autopurge&&Y.finished){N(Y.tId);delete M[X];}}}U=false;},R=function(Y,X,Z){Z=Z||{};var c="q"+(K++),a,b=Z.purgethreshold||A.Get.PURGE_THRESH;if(K%b===0){G();}M[c]=A.merge(Z,{tId:c,type:Y,url:X,finished:false,nodes:[]});a=M[c];a.win=a.win||A.config.win;a.context=a.context||a;a.autopurge=("autopurge" in a)?a.autopurge:(Y==="script")?true:false;if(Z.charset){a.attributes=a.attributes||{};a.attributes.charset=Z.charset;}setTimeout(function(){H(c);},0);return{tId:c};},J=function(Z,e,d,Y,c,b,X){var a=X||H;if(C.ie){e.onreadystatechange=function(){var f=this.readyState;if("loaded"===f||"complete"===f){e.onreadystatechange=null;a(d,Y);}};}else{if(C.webkit){if(Z==="script"){e.addEventListener("load",function(){a(d,Y);});}}else{e.onload=function(){a(d,Y);};e.onerror=function(f){V(d,f+": "+Y);};}}};return{PURGE_THRESH:20,_finalize:function(X){setTimeout(function(){I(X);},0);},abort:function(Y){var Z=(B.isString(Y))?Y:Y.tId,X=M[Z];if(X){X.aborted=true;}},script:function(X,Y){return R("script",X,Y);},css:function(X,Y){return R("css",X,Y);}};}();})();},"3.0.0");YUI.add("yui-log",function(A){(function(){var D=A,F="yui:log",B="undefined",C={debug:1,info:1,warn:1,error:1},E;D.log=function(I,Q,G,O){var H=D,P=H.config,K=false,N,L,J,M;if(P.debug){if(G){N=P.logExclude;L=P.logInclude;if(L&&!(G in L)){K=1;}else{if(N&&(G in N)){K=1;}}}if(!K){if(P.useBrowserConsole){J=(G)?G+": "+I:I;if(typeof console!=B&&console.log){M=(Q&&console[Q]&&(Q in C))?Q:"log";console[M](J);}else{if(typeof opera!=B){opera.postError(J);}}}if(H.fire&&!O){if(!E){H.publish(F,{broadcast:2,emitFacade:1});E=1;}H.fire(F,{msg:I,cat:Q,src:G});}}}return H;};D.message=function(){return D.log.apply(D,arguments);};})();},"3.0.0",{requires:["yui-base"]});YUI.add("yui-later",function(A){(function(){var B=A.Lang,C=function(K,E,L,G,H){K=K||0;E=E||{};var F=L,J=A.Array(G),I,D;if(B.isString(L)){F=E[L];}if(!F){}I=function(){F.apply(E,J);};D=(H)?setInterval(I,K):setTimeout(I,K);return{id:D,interval:H,cancel:function(){if(this.interval){clearInterval(D);}else{clearTimeout(D);}}};};A.later=C;B.later=C;})();},"3.0.0",{requires:["yui-base"]});YUI.add("yui",function(A){},"3.0.0",{use:["yui-base","get","yui-log","yui-later"]});

/**
 * yui/yui-init.js;
 */
YUI({
    modules: {
        'gallery-lightbox': {
            fullpath: context.urls.static + '/js/lightbox/gallery-lightbox.js',
            requires: [ 'base', 'anim', 'node' ]
        }
    }
}).use('node', 'node-event-simulate', 'io', 'io-upload-iframe', 'event', 'io-base', 'json-parse', 'overlay', 'dd-plugin', 'cookie', 'gallery-lightbox', function(Y) {
    window.Y = Y;
    Y.on('domready', function() {
        var mainbody = Y.one('#mainbody');
        if (mainbody) {
            mainbody.setStyle('visibility', 'visible');
        }
        Y.augment(TabView, Y.EventTarget);
        Y.augment(windowManager, Y.EventTarget);
        Y.augment(ContentLoader, Y.EventTarget);
        Y.each(FrontController.controllers.admin, function(v, k) {
            Y.mix(v, ListController);
        });
        Y.each(FrontController.controllers.mini, function(v, k) {
            Y.mix(v, FlashController);
        });
        Y.io.header('Accept', 'application/json');
        FrontController.init(context.initActions, context.page, context.action);
    });
});

/**
 * ajax/ajax.js;
 */
function Ajax(config) {
    this.loadingSelector = null;
    this.loadingClass = 'loading';
    this.method = 'GET';
    this.data = {};
    this.url = null;
    this.handlers = {};
    this.transactionId = null;
    this.context = window;
    this.form = null;
    if ('method' in config) {
        this.setMethod(config.method);
    }
    if ('loadingClass' in config) {
        this.loadingClass = config.loadingClass;
    }
    if ('loading' in config) {
        this.loadingSelector = config.loading;
    }
    if ('data' in config) {
        this.data = config.data;
    }
    if ('url' in config) {
        this.url = config.url;
    }
    if ('on' in config) {
        this.handlers = config.on;
    }
    if ('context' in config) {
        this.context = config.context;
    }
    if ('form' in config) {
        this.form = config.form;
    }
}

Ajax.prototype = {
    _constructParams: function() {
        var url = '';
        for (var key in this.data) {
            url += key + '=' + this.data[key] + '&';
        }
        url = url.substr(0, (url.length - 1));
        return url;
    },
    _overrideHandlers: function() {
        var origHandler = this.handlers.success;
        var that = this;
        var newHandler = function(id, o) {
            var pass = {};
            pass.json = Y.JSON.parse(o.responseText);
            // some very very very weird IE6 behaviour here, if you try to modify 'o', IE6 dies.
            //var o = Y.merge(o, { json: Y.JSON.parse(o.responseText) });
            that._removeLoading();
            that.transactionId = id;
            origHandler.call(this, id, pass);
        };
        this.handlers.success = newHandler;
    },
    _addLoading: function() {
        var node = Y.one(this.loadingSelector);
        if (node) {
            node.addClass(this.loadingClass);
        }
    },
    _removeLoading: function() {
        var node = Y.one(this.loadingSelector);
        if (node) {
            node.removeClass(this.loadingClass);
        }
    },
    send: function() {
        var url = this.url;
        this._overrideHandlers();
        if (this.loadingSelector) {
            this._addLoading();
        }
        var config = {
            method: this.method,
            on: this.handlers,
            context: this.context,
            form: this.form
        }
        if (this.method == 'GET') {
            var constructed = this._constructParams();
            if (constructed.length > 0) {
                url += '?' + this._constructParams();
            }
        } else if (this.method == 'POST') {
            config.data = this._constructParams();
        }
        this._addLoading();
        Y.io(url, config);
    },
    setParameters: function(params) {
        this.data = params;
    },
    setMethod: function(method) {
        var valid = [ 'POST', 'GET', 'PUT', 'DELETE' ];
        if (Y.Array.indexOf(valid, method) >= 0) {
            this.method = method;
        }
    }
};

/**
 * form/FormHelper.js;
 */
function FormHelper(form, errorContainer, successMsg) {
    this.form = form;
    this.errorContainer = errorContainer;
    this.successMsg = successMsg;
    this.onComplete = function() {};
    this.onError = null;
    this.data = {};
}

FormHelper.prototype = {
    submit: function() {
        var url = this.form.get('action');
        var config = {
            form: { id: this.form },
            url: url,
            data: this.data,
            method: 'POST',
            context: this,
            on: {
                success: this._validate
            }
        }
        var xhr = new Ajax(config);
        xhr.send();

    },
    addValue: function(key, value) {
        this.data[key] = value;
    },
    _validate: function(id, o) {
        var success = o.json.result;
        this._clearErrors();
        if (!success) {
            if (this.onError) {
                this.onError(this, o.json.errors);
            } else {
                this._fillErrors(o.json.errors);
            }
        } else {
            this._showSuccess();
            this.onComplete(o.json);
        }
    },
    _showSuccess: function() {
        if (this.successMsg) {
            this.errorContainer.setContent(this.successMsg);
        }
    },
    _fillErrors: function(errors) {
        var that = this;
        Y.each(errors, function(msg, key) {
            var error = msg.join(' ');
            var span = document.createElement('span');
            span.innerHTML = error;
            that.errorContainer.appendChild(span);
        });
    },
    _clearErrors: function() {
        this.errorContainer.set('innerHTML', '');
    }
}


/**
 * windows/cwindow.js;
 */
function cWindow(id, title, contentLoader, yOverlay, tabView) {
    this.title = title;
    this.id = id;
    this.yOverlay = yOverlay;
    this.contentLoader = contentLoader;
    this.tabView = tabView;
}

cWindow.prototype = {
    refetchTab: function() {
        this.tabView.refetch();
    },
    changeTab: function(newTab, args) {
        var that = this;
        //this.tabView.changeTab(newTab, args);
        this.contentLoader.load(newTab, function(id, o) {
            var json = o.json;
            that.setContent(o.json.html);
        }, args);
    },
    show: function() {
        this.yOverlay.show();
    },
    minimize: function() {
        this.yOverlay.hide();
    },
    close: function() {
        var node = this.yOverlay._stackNode;
        this.yOverlay.hide();
        this.yOverlay.destroy();
        node.remove();
    },
    setContent: function(content) {
        var node = Y.Node.getDOMNode(this.yOverlay._stackNode.one('.body'));
        Y.Event.purgeElement(node, true);
        this.yOverlay.set('bodyContent', content);
    }
}

/**
 * windows/WindowFactory.js;
 */
WindowFactory = {
    posX: 150,
    posY: 150,
    posZ: 1,
    create: function(id) {
        var title   = Y.one('#icon-' + id + ' span').get('innerHTML');
        var element = Y.one('#window-base').cloneNode(true);

        element.set('id', 'window-' + id);
        element.one('h2 .content').setContent(title);

        var instance = WindowFactory.createYUIOverlay(element);
        instance.render('#window-store');

        var tabView = WindowFactory.createTabView(id);

        var loader = new ContentLoader();
        loader.on('loader:contentReady', FrontController.route);

        var cw = new cWindow(id, title, loader, instance, tabView);
        tabView.on('tab:tabChange', cw.changeTab, cw);

        return cw;
    },
    createTabView: function(windowId) {
        var tabs = context.menu.tabs[windowId];
        var element = Y.one('#window-' + windowId + ' ul.tabs');
        var tabTemplate = element.one('li');
        Y.each(tabs, function(tabCaption, tabId) {
            var tabElement = tabTemplate.cloneNode(true);
            tabElement.set('id', tabId);
            tabElement.setContent(tabCaption);
            element.appendChild(tabElement);
        });
        tabTemplate.remove();
        var tabView = new TabView(element, tabs);
        return tabView;

    },
    createYUIOverlay: function(element) {
        var instance = new Y.Overlay({
            contentBox: element,
            width: '300px',
            xy: [ WindowFactory.posX, WindowFactory.posY ],
            plugins: [ Y.Plugin.Drag ],
            zIndex: WindowFactory.posZ
        });

        WindowFactory.posX += 20;
        WindowFactory.posY += 20;
        WindowFactory.posZ += 1;

        return instance;
    }

};

/**
 * windows/windowbar.js;
 */
function windowBar(node) {
    this.node = node;
    this.windows = {};
    this.listItems = {};
    this.active = null;
}

windowBar.prototype = {

    attach: function(cWindow) {
        this.windows[cWindow.id] = cWindow;
        this.createListItem(cWindow.id);
    },

    detach: function(cWindow) {
        delete(this.windows[cWindow.id]);
        this.removeListItem(cWindow.id);

        if (this.active == cWindow) {
            //console.log('removed active window :(');
        }
    },

    createListItem: function(id) {
        var cWindow = this.windows[id];
        var li      = Y.Node.create('<li class="windowicon"></li>');
        var content = document.createTextNode(cWindow.title);

        li.set('id', 'windowTask-' + id).appendChild(content);
        li.append(Y.Node.create('<span class="button close"></span>'));
        
        this.node.appendChild(Y.Node.getDOMNode(li));
        this.listItems[id] = li;
    },

    removeListItem: function(id) {
        var li = document.getElementById('windowTask-'+id);
        if (li) {
            li.parentNode.removeChild(li);
        }
    },
    markActive: function(id) {
        if (this.active) {
            this.listItems[this.active.id].removeClass('active');
        }
        this.active = this.windows[id];
        this.listItems[this.active.id].addClass('active');
    },
    getActive: function() {
        return this.active;
    },

    has: function(id) {
        return id in this.windows;
    }
}

/**
 * windows/ContentLoader.js;
 */
function ContentLoader() {
}

ContentLoader.prototype = {
    load: function(route, callback, params) {
        var page   = route;
        var action = '';
        if (page.indexOf('-')) {
            var temp  = page.split('-');
            var page   = temp[0];
            var action = temp[1] ? temp[1] : '';
        }
        var windowSelector = '#window-' + page + ' .body';
        var config = {
            data: params,
            method: 'GET',
            loading: windowSelector,
            url: context.urls.admin + '/' + page + '/' + action,
            on: {
                success: function(id, o) {
                    callback(id, o);
                    this.fire('loader:contentReady', route);
                }
            },
            context: this
        };
        var xhr = new Ajax(config);
        xhr.send();
    }

}

/**
 * windows/windowmanager.js;
 */
function windowManager(windowBar, feeder) {
    this.windows = {};
    this.windowBar = windowBar;
    this.active = null;
    this.feeder = feeder;
}

windowManager.prototype = {
    refresh: function() {
        this.active.refetchTab();
    },
    createWindow: function(id) {
        var cw = WindowFactory.create(id);
        this.windows[id] = cw;

        if (!this.windowBar.has(id)) {
            this.windowBar.attach(cw);
        }
        cw.tabView.changeTab(cw.tabView.getFirst());
    },
    changeTo: function(id) {
        if (!this.windows[id]) {
            this.createWindow(id);
        }
        this.activateWindow(id);
    },
    activateWindow: function(id) {
        var cWindow = this.windows[id];
        this.active = cWindow;
        this.windowBar.markActive(id);
        this.foreGround(cWindow);
        cWindow.show();
    },
    closeWindow: function(id) {
        var cWindow = this.windows[id];

        cWindow.close();
        this.windowBar.detach(cWindow);
        delete(this.windows[id]);
        this.fire('window:close', this);
    },
    minimizeWindow: function(id) {
    },
    foreGround: function(cWindow) {
        var windows = [];
        Y.each(this.windows, function(e) {
            windows.push(e);
        });
        var compare = function(a, b) {
            var aZ = a.yOverlay.get('zIndex');
            var bZ = b.yOverlay.get('zIndex');
            if (aZ > bZ) {
                return -1;
            } else if (aZ < bZ) {
                return 1;
            } else {
                return 0;
            }
        }
        windows.sort(compare);
        var highest = windows[0];
        if (cWindow.id !== highest.id) {
            var highestZ = highest.yOverlay.get('zIndex');
            var switchZ = cWindow.yOverlay.get('zIndex');

            cWindow.yOverlay.set('zIndex', highestZ);
            highest.yOverlay.set('zIndex', switchZ);
        }
    },
    get: function(id) {
        return this.windows[id];
    }

};

/**
 * tabview/TabView.js;
 */
function TabView(container, tabs) {
    this.tabs      = tabs;
    this.container = container;
    this.active    = null;
    this.activeParams = null;
    Y.delegate('click', function(e) {
        this.changeTab(e.target.get('id'));
    }, container, 'li.tab', this);
    this.on('tab:tabChange', this.tabChanged);
}

TabView.prototype = {
    refetch: function() {
        this.changeTab(this.active, this.activeParams);
    },
    getFirst: function() {
        var first = Y.Object.keys(this.tabs).shift();
        return first;
    },
    tabChanged: function(tabId, args) {
        if (this.active) {
            var tab = Y.one('#' + this.active);
            if (tab) {
                tab.removeClass('active');
            }
        }
        this.active = tabId;
        this.activeParams = args;
        var newTab = Y.one('#' + this.active);
        if (newTab) {
            newTab.addClass('active');
        }
    },
    getActive: function() {
        return this.active;
    },
    changeTab: function(tabId, params) {
        this.fire('tab:tabChange', tabId, params);
    }

}

/**
 * vote/vote.js;
 */
function Vote(value, box) {
    this.value = value;
    this.box = box;
}

Vote.prototype = {
    submit: function() {
        var config = {
            method: 'POST',
            loadingSelector: '.votebox',
            data: { voteId: this.value },
            url: context.urls.mini + '/szavazas/szavazok',
            context: this,
            on: {
                success: function(id, o) {
                    // IE6 doesn't want to set the cookie from the XHR, so we set it here manually
                    var date = new Date();
                    date.setDate(date.getDate() + 7);
                    var voteId = o.json.voteId;
                    var key = 'flrtvote' + voteId;
                    Y.Cookie.set(key, voteId, { expires: date });
                    this.box.set('innerHTML', o.json.html);
                    var button = Y.one('#vote-submit');
                    button.set('id', 'better-idea');
                    button.set('href', 'mailto: rendezo@megtakaritok.hu');
                }
            }
        }
        var xhr = new Ajax(config);
        xhr.send();
    }
};

/**
 * swfobject/swfobject.js;
 */
/*	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
*/
var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
/**
 * calendar/calendar.js;
 */
/*  Copyright Mihai Bazon, 2002-2005  |  www.bazon.net/mishoo
 * -----------------------------------------------------------
 *
 * The DHTML Calendar, version 1.0 "It is happening again"
 *
 * Details and latest version at:
 * www.dynarch.com/projects/calendar
 *
 */

/** The Calendar object constructor. */
Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) {
	// member variables
	this.activeDiv = null;
	this.currentDateEl = null;
	this.getDateStatus = null;
	this.getDateToolTip = null;
	this.getDateText = null;
	this.timeout = null;
	this.onSelected = onSelected || null;
	this.onClose = onClose || null;
	this.dragging = false;
	this.hidden = false;
	this.minYear = 1970;
	this.maxYear = 2050;
	this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"];
	this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"];
	this.isPopup = true;
	this.weekNumbers = true;
	this.firstDayOfWeek = typeof firstDayOfWeek == "number" ? firstDayOfWeek : Calendar._FD; // 0 for Sunday, 1 for Monday, etc.
	this.showsOtherMonths = false;
	this.dateStr = dateStr;
	this.ar_days = null;
	this.showsTime = false;
	this.time24 = true;
	this.yearStep = 2;
	this.hiliteToday = true;
	this.multiple = null;
	// HTML elements
	this.table = null;
	this.element = null;
	this.tbody = null;
	this.firstdayname = null;
	// Combo boxes
	this.monthsCombo = null;
	this.yearsCombo = null;
	this.hilitedMonth = null;
	this.activeMonth = null;
	this.hilitedYear = null;
	this.activeYear = null;
	// Information
	this.dateClicked = false;

	// one-time initializations
	if (typeof Calendar._SDN == "undefined") {
		// table of short day names
		if (typeof Calendar._SDN_len == "undefined")
			Calendar._SDN_len = 3;
		var ar = new Array();
		for (var i = 8; i > 0;) {
			ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len);
		}
		Calendar._SDN = ar;
		// table of short month names
		if (typeof Calendar._SMN_len == "undefined")
			Calendar._SMN_len = 3;
		ar = new Array();
		for (var i = 12; i > 0;) {
			ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len);
		}
		Calendar._SMN = ar;
	}
};

// ** constants

/// "static", needed for event handlers.
Calendar._C = null;

/// detect a special case of "web browser"
Calendar.is_ie = ( /msie/i.test(navigator.userAgent) &&
		   !/opera/i.test(navigator.userAgent) );

Calendar.is_ie5 = ( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) );

/// detect Opera browser
Calendar.is_opera = /opera/i.test(navigator.userAgent);

/// detect KHTML-based browsers
Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);

// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate
//        library, at some point.

Calendar.getAbsolutePos = function(el) {
	var SL = 0, ST = 0;
	var is_div = /^div$/i.test(el.tagName);
	if (is_div && el.scrollLeft)
		SL = el.scrollLeft;
	if (is_div && el.scrollTop)
		ST = el.scrollTop;
	var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
	if (el.offsetParent) {
		var tmp = this.getAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
};

Calendar.isRelated = function (el, evt) {
	var related = evt.relatedTarget;
	if (!related) {
		var type = evt.type;
		if (type == "mouseover") {
			related = evt.fromElement;
		} else if (type == "mouseout") {
			related = evt.toElement;
		}
	}
	while (related) {
		if (related == el) {
			return true;
		}
		related = related.parentNode;
	}
	return false;
};

Calendar.removeClass = function(el, className) {
	if (!(el && el.className)) {
		return;
	}
	var cls = el.className.split(" ");
	var ar = new Array();
	for (var i = cls.length; i > 0;) {
		if (cls[--i] != className) {
			ar[ar.length] = cls[i];
		}
	}
	el.className = ar.join(" ");
};

Calendar.addClass = function(el, className) {
	Calendar.removeClass(el, className);
	el.className += " " + className;
};

// FIXME: the following 2 functions totally suck, are useless and should be replaced immediately.
Calendar.getElement = function(ev) {
	var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget;
	while (f.nodeType != 1 || /^div$/i.test(f.tagName))
		f = f.parentNode;
	return f;
};

Calendar.getTargetElement = function(ev) {
	var f = Calendar.is_ie ? window.event.srcElement : ev.target;
	while (f.nodeType != 1)
		f = f.parentNode;
	return f;
};

Calendar.stopEvent = function(ev) {
	ev || (ev = window.event);
	if (Calendar.is_ie) {
		ev.cancelBubble = true;
		ev.returnValue = false;
	} else {
		ev.preventDefault();
		ev.stopPropagation();
	}
	return false;
};

Calendar.addEvent = function(el, evname, func) {
	if (el.attachEvent) { // IE
		el.attachEvent("on" + evname, func);
	} else if (el.addEventListener) { // Gecko / W3C
		el.addEventListener(evname, func, true);
	} else {
		el["on" + evname] = func;
	}
};

Calendar.removeEvent = function(el, evname, func) {
	if (el.detachEvent) { // IE
		el.detachEvent("on" + evname, func);
	} else if (el.removeEventListener) { // Gecko / W3C
		el.removeEventListener(evname, func, true);
	} else {
		el["on" + evname] = null;
	}
};

Calendar.createElement = function(type, parent) {
	var el = null;
	if (document.createElementNS) {
		// use the XHTML namespace; IE won't normally get here unless
		// _they_ "fix" the DOM2 implementation.
		el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
	} else {
		el = document.createElement(type);
	}
	if (typeof parent != "undefined") {
		parent.appendChild(el);
	}
	return el;
};

// END: UTILITY FUNCTIONS

// BEGIN: CALENDAR STATIC FUNCTIONS

/** Internal -- adds a set of events to make some element behave like a button. */
Calendar._add_evs = function(el) {
	with (Calendar) {
		addEvent(el, "mouseover", dayMouseOver);
		addEvent(el, "mousedown", dayMouseDown);
		addEvent(el, "mouseout", dayMouseOut);
		if (is_ie) {
			addEvent(el, "dblclick", dayMouseDblClick);
			el.setAttribute("unselectable", true);
		}
	}
};

Calendar.findMonth = function(el) {
	if (typeof el.month != "undefined") {
		return el;
	} else if (typeof el.parentNode.month != "undefined") {
		return el.parentNode;
	}
	return null;
};

Calendar.findYear = function(el) {
	if (typeof el.year != "undefined") {
		return el;
	} else if (typeof el.parentNode.year != "undefined") {
		return el.parentNode;
	}
	return null;
};

Calendar.showMonthsCombo = function () {
	var cal = Calendar._C;
	if (!cal) {
		return false;
	}
	var cal = cal;
	var cd = cal.activeDiv;
	var mc = cal.monthsCombo;
	if (cal.hilitedMonth) {
		Calendar.removeClass(cal.hilitedMonth, "hilite");
	}
	if (cal.activeMonth) {
		Calendar.removeClass(cal.activeMonth, "active");
	}
	var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];
	Calendar.addClass(mon, "active");
	cal.activeMonth = mon;
	var s = mc.style;
	s.display = "block";
	if (cd.navtype < 0)
		s.left = cd.offsetLeft + "px";
	else {
		var mcw = mc.offsetWidth;
		if (typeof mcw == "undefined")
			// Konqueror brain-dead techniques
			mcw = 50;
		s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px";
	}
	s.top = (cd.offsetTop + cd.offsetHeight) + "px";
};

Calendar.showYearsCombo = function (fwd) {
	var cal = Calendar._C;
	if (!cal) {
		return false;
	}
	var cal = cal;
	var cd = cal.activeDiv;
	var yc = cal.yearsCombo;
	if (cal.hilitedYear) {
		Calendar.removeClass(cal.hilitedYear, "hilite");
	}
	if (cal.activeYear) {
		Calendar.removeClass(cal.activeYear, "active");
	}
	cal.activeYear = null;
	var Y = cal.date.getFullYear() + (fwd ? 1 : -1);
	var yr = yc.firstChild;
	var show = false;
	for (var i = 12; i > 0; --i) {
		if (Y >= cal.minYear && Y <= cal.maxYear) {
			yr.innerHTML = Y;
			yr.year = Y;
			yr.style.display = "block";
			show = true;
		} else {
			yr.style.display = "none";
		}
		yr = yr.nextSibling;
		Y += fwd ? cal.yearStep : -cal.yearStep;
	}
	if (show) {
		var s = yc.style;
		s.display = "block";
		if (cd.navtype < 0)
			s.left = cd.offsetLeft + "px";
		else {
			var ycw = yc.offsetWidth;
			if (typeof ycw == "undefined")
				// Konqueror brain-dead techniques
				ycw = 50;
			s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px";
		}
		s.top = (cd.offsetTop + cd.offsetHeight) + "px";
	}
};

// event handlers

Calendar.tableMouseUp = function(ev) {
	var cal = Calendar._C;
	if (!cal) {
		return false;
	}
	if (cal.timeout) {
		clearTimeout(cal.timeout);
	}
	var el = cal.activeDiv;
	if (!el) {
		return false;
	}
	var target = Calendar.getTargetElement(ev);
	ev || (ev = window.event);
	Calendar.removeClass(el, "active");
	if (target == el || target.parentNode == el) {
		Calendar.cellClick(el, ev);
	}
	var mon = Calendar.findMonth(target);
	var date = null;
	if (mon) {
		date = new Date(cal.date);
		if (mon.month != date.getMonth()) {
			date.setMonth(mon.month);
			cal.setDate(date);
			cal.dateClicked = false;
			cal.callHandler();
		}
	} else {
		var year = Calendar.findYear(target);
		if (year) {
			date = new Date(cal.date);
			if (year.year != date.getFullYear()) {
				date.setFullYear(year.year);
				cal.setDate(date);
				cal.dateClicked = false;
				cal.callHandler();
			}
		}
	}
	with (Calendar) {
		removeEvent(document, "mouseup", tableMouseUp);
		removeEvent(document, "mouseover", tableMouseOver);
		removeEvent(document, "mousemove", tableMouseOver);
		cal._hideCombos();
		_C = null;
		return stopEvent(ev);
	}
};

Calendar.tableMouseOver = function (ev) {
	var cal = Calendar._C;
	if (!cal) {
		return;
	}
	var el = cal.activeDiv;
	var target = Calendar.getTargetElement(ev);
	if (target == el || target.parentNode == el) {
		Calendar.addClass(el, "hilite active");
		Calendar.addClass(el.parentNode, "rowhilite");
	} else {
		if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2)))
			Calendar.removeClass(el, "active");
		Calendar.removeClass(el, "hilite");
		Calendar.removeClass(el.parentNode, "rowhilite");
	}
	ev || (ev = window.event);
	if (el.navtype == 50 && target != el) {
		var pos = Calendar.getAbsolutePos(el);
		var w = el.offsetWidth;
		var x = ev.clientX;
		var dx;
		var decrease = true;
		if (x > pos.x + w) {
			dx = x - pos.x - w;
			decrease = false;
		} else
			dx = pos.x - x;

		if (dx < 0) dx = 0;
		var range = el._range;
		var current = el._current;
		var count = Math.floor(dx / 10) % range.length;
		for (var i = range.length; --i >= 0;)
			if (range[i] == current)
				break;
		while (count-- > 0)
			if (decrease) {
				if (--i < 0)
					i = range.length - 1;
			} else if ( ++i >= range.length )
				i = 0;
		var newval = range[i];
		el.innerHTML = newval;

		cal.onUpdateTime();
	}
	var mon = Calendar.findMonth(target);
	if (mon) {
		if (mon.month != cal.date.getMonth()) {
			if (cal.hilitedMonth) {
				Calendar.removeClass(cal.hilitedMonth, "hilite");
			}
			Calendar.addClass(mon, "hilite");
			cal.hilitedMonth = mon;
		} else if (cal.hilitedMonth) {
			Calendar.removeClass(cal.hilitedMonth, "hilite");
		}
	} else {
		if (cal.hilitedMonth) {
			Calendar.removeClass(cal.hilitedMonth, "hilite");
		}
		var year = Calendar.findYear(target);
		if (year) {
			if (year.year != cal.date.getFullYear()) {
				if (cal.hilitedYear) {
					Calendar.removeClass(cal.hilitedYear, "hilite");
				}
				Calendar.addClass(year, "hilite");
				cal.hilitedYear = year;
			} else if (cal.hilitedYear) {
				Calendar.removeClass(cal.hilitedYear, "hilite");
			}
		} else if (cal.hilitedYear) {
			Calendar.removeClass(cal.hilitedYear, "hilite");
		}
	}
	return Calendar.stopEvent(ev);
};

Calendar.tableMouseDown = function (ev) {
	if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) {
		return Calendar.stopEvent(ev);
	}
};

Calendar.calDragIt = function (ev) {
	var cal = Calendar._C;
	if (!(cal && cal.dragging)) {
		return false;
	}
	var posX;
	var posY;
	if (Calendar.is_ie) {
		posY = window.event.clientY + document.body.scrollTop;
		posX = window.event.clientX + document.body.scrollLeft;
	} else {
		posX = ev.pageX;
		posY = ev.pageY;
	}
	cal.hideShowCovered();
	var st = cal.element.style;
	st.left = (posX - cal.xOffs) + "px";
	st.top = (posY - cal.yOffs) + "px";
	return Calendar.stopEvent(ev);
};

Calendar.calDragEnd = function (ev) {
	var cal = Calendar._C;
	if (!cal) {
		return false;
	}
	cal.dragging = false;
	with (Calendar) {
		removeEvent(document, "mousemove", calDragIt);
		removeEvent(document, "mouseup", calDragEnd);
		tableMouseUp(ev);
	}
	cal.hideShowCovered();
};

Calendar.dayMouseDown = function(ev) {
	var el = Calendar.getElement(ev);
	if (el.disabled) {
		return false;
	}
	var cal = el.calendar;
	cal.activeDiv = el;
	Calendar._C = cal;
	if (el.navtype != 300) with (Calendar) {
		if (el.navtype == 50) {
			el._current = el.innerHTML;
			addEvent(document, "mousemove", tableMouseOver);
		} else
			addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver);
		addClass(el, "hilite active");
		addEvent(document, "mouseup", tableMouseUp);
	} else if (cal.isPopup) {
		cal._dragStart(ev);
	}
	if (el.navtype == -1 || el.navtype == 1) {
		if (cal.timeout) clearTimeout(cal.timeout);
		cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250);
	} else if (el.navtype == -2 || el.navtype == 2) {
		if (cal.timeout) clearTimeout(cal.timeout);
		cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250);
	} else {
		cal.timeout = null;
	}
	return Calendar.stopEvent(ev);
};

Calendar.dayMouseDblClick = function(ev) {
	Calendar.cellClick(Calendar.getElement(ev), ev || window.event);
	if (Calendar.is_ie) {
		document.selection.empty();
	}
};

Calendar.dayMouseOver = function(ev) {
	var el = Calendar.getElement(ev);
	if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) {
		return false;
	}
	if (el.ttip) {
		if (el.ttip.substr(0, 1) == "_") {
			el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1);
		}
		el.calendar.tooltips.innerHTML = el.ttip;
	}
	if (el.navtype != 300) {
		Calendar.addClass(el, "hilite");
		if (el.caldate) {
			Calendar.addClass(el.parentNode, "rowhilite");
		}
	}
	return Calendar.stopEvent(ev);
};

Calendar.dayMouseOut = function(ev) {
	with (Calendar) {
		var el = getElement(ev);
		if (isRelated(el, ev) || _C || el.disabled)
			return false;
		removeClass(el, "hilite");
		if (el.caldate)
			removeClass(el.parentNode, "rowhilite");
		if (el.calendar)
			el.calendar.tooltips.innerHTML = _TT["SEL_DATE"];
		return stopEvent(ev);
	}
};

/**
 *  A generic "click" handler :) handles all types of buttons defined in this
 *  calendar.
 */
Calendar.cellClick = function(el, ev) {
	var cal = el.calendar;
	var closing = false;
	var newdate = false;
	var date = null;
	if (typeof el.navtype == "undefined") {
		if (cal.currentDateEl) {
			Calendar.removeClass(cal.currentDateEl, "selected");
			Calendar.addClass(el, "selected");
			closing = (cal.currentDateEl == el);
			if (!closing) {
				cal.currentDateEl = el;
			}
		}
		cal.date.setDateOnly(el.caldate);
		date = cal.date;
		var other_month = !(cal.dateClicked = !el.otherMonth);
		if (!other_month && !cal.currentDateEl)
			cal._toggleMultipleDate(new Date(date));
		else
			newdate = !el.disabled;
		// a date was clicked
		if (other_month)
			cal._init(cal.firstDayOfWeek, date);
	} else {
		if (el.navtype == 200) {
			Calendar.removeClass(el, "hilite");
			cal.callCloseHandler();
			return;
		}
		date = new Date(cal.date);
		if (el.navtype == 0)
			date.setDateOnly(new Date()); // TODAY
		// unless "today" was clicked, we assume no date was clicked so
		// the selected handler will know not to close the calenar when
		// in single-click mode.
		// cal.dateClicked = (el.navtype == 0);
		cal.dateClicked = false;
		var year = date.getFullYear();
		var mon = date.getMonth();
		function setMonth(m) {
			var day = date.getDate();
			var max = date.getMonthDays(m);
			if (day > max) {
				date.setDate(max);
			}
			date.setMonth(m);
		};
		switch (el.navtype) {
		    case 400:
			Calendar.removeClass(el, "hilite");
			var text = Calendar._TT["ABOUT"];
			if (typeof text != "undefined") {
				text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : "";
			} else {
				// FIXME: this should be removed as soon as lang files get updated!
				text = "Help and about box text is not translated into this language.\n" +
					"If you know this language and you feel generous please update\n" +
					"the corresponding file in \"lang\" subdir to match calendar-en.js\n" +
					"and send it back to <mihai_bazon@yahoo.com> to get it into the distribution  ;-)\n\n" +
					"Thank you!\n" +
					"http://dynarch.com/mishoo/calendar.epl\n";
			}
			alert(text);
			return;
		    case -2:
			if (year > cal.minYear) {
				date.setFullYear(year - 1);
			}
			break;
		    case -1:
			if (mon > 0) {
				setMonth(mon - 1);
			} else if (year-- > cal.minYear) {
				date.setFullYear(year);
				setMonth(11);
			}
			break;
		    case 1:
			if (mon < 11) {
				setMonth(mon + 1);
			} else if (year < cal.maxYear) {
				date.setFullYear(year + 1);
				setMonth(0);
			}
			break;
		    case 2:
			if (year < cal.maxYear) {
				date.setFullYear(year + 1);
			}
			break;
		    case 100:
			cal.setFirstDayOfWeek(el.fdow);
			return;
		    case 50:
			var range = el._range;
			var current = el.innerHTML;
			for (var i = range.length; --i >= 0;)
				if (range[i] == current)
					break;
			if (ev && ev.shiftKey) {
				if (--i < 0)
					i = range.length - 1;
			} else if ( ++i >= range.length )
				i = 0;
			var newval = range[i];
			el.innerHTML = newval;
			cal.onUpdateTime();
			return;
		    case 0:
			// TODAY will bring us here
			if ((typeof cal.getDateStatus == "function") &&
			    cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) {
				return false;
			}
			break;
		}
		if (!date.equalsTo(cal.date)) {
			cal.setDate(date);
			newdate = true;
		} else if (el.navtype == 0)
			newdate = closing = true;
	}
	if (newdate) {
		ev && cal.callHandler();
	}
	if (closing) {
		Calendar.removeClass(el, "hilite");
		ev && cal.callCloseHandler();
	}
};

// END: CALENDAR STATIC FUNCTIONS

// BEGIN: CALENDAR OBJECT FUNCTIONS

/**
 *  This function creates the calendar inside the given parent.  If _par is
 *  null than it creates a popup calendar inside the BODY element.  If _par is
 *  an element, be it BODY, then it creates a non-popup calendar (still
 *  hidden).  Some properties need to be set before calling this function.
 */
Calendar.prototype.create = function (_par) {
	var parent = null;
	if (! _par) {
		// default parent is the document body, in which case we create
		// a popup calendar.
		parent = document.getElementsByTagName("body")[0];
		this.isPopup = true;
	} else {
		parent = _par;
		this.isPopup = false;
	}
	this.date = this.dateStr ? new Date(this.dateStr) : new Date();

	var table = Calendar.createElement("table");
	this.table = table;
	table.cellSpacing = 0;
	table.cellPadding = 0;
	table.calendar = this;
	Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown);

	var div = Calendar.createElement("div");
	this.element = div;
	div.className = "calendar";
	if (this.isPopup) {
		div.style.position = "absolute";
		div.style.display = "none";
	}
	div.appendChild(table);

	var thead = Calendar.createElement("thead", table);
	var cell = null;
	var row = null;

	var cal = this;
	var hh = function (text, cs, navtype) {
		cell = Calendar.createElement("td", row);
		cell.colSpan = cs;
		cell.className = "cal-button";
		if (navtype != 0 && Math.abs(navtype) <= 2)
			cell.className += " nav";
		Calendar._add_evs(cell);
		cell.calendar = cal;
		cell.navtype = navtype;
		cell.innerHTML = "<div unselectable='on'>" + text + "</div>";
		return cell;
	};

	row = Calendar.createElement("tr", thead);
	var title_length = 6;
	(this.isPopup) && --title_length;
	(this.weekNumbers) && ++title_length;

	hh("?", 1, 400).ttip = Calendar._TT["INFO"];
	this.title = hh("", title_length, 300);
	this.title.className = "title";
	if (this.isPopup) {
		this.title.ttip = Calendar._TT["DRAG_TO_MOVE"];
		this.title.style.cursor = "move";
		hh("&#x00d7;", 1, 200).ttip = Calendar._TT["CLOSE"];
	}

	row = Calendar.createElement("tr", thead);
	row.className = "headrow";

	this._nav_py = hh("&#x00ab;", 1, -2);
	this._nav_py.ttip = Calendar._TT["PREV_YEAR"];

	this._nav_pm = hh("&#x2039;", 1, -1);
	this._nav_pm.ttip = Calendar._TT["PREV_MONTH"];

	this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0);
	this._nav_now.ttip = Calendar._TT["GO_TODAY"];

	this._nav_nm = hh("&#x203a;", 1, 1);
	this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"];

	this._nav_ny = hh("&#x00bb;", 1, 2);
	this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"];

	// day names
	row = Calendar.createElement("tr", thead);
	row.className = "daynames";
	if (this.weekNumbers) {
		cell = Calendar.createElement("td", row);
		cell.className = "name wn";
		cell.innerHTML = Calendar._TT["WK"];
	}
	for (var i = 7; i > 0; --i) {
		cell = Calendar.createElement("td", row);
		if (!i) {
			cell.navtype = 100;
			cell.calendar = this;
			Calendar._add_evs(cell);
		}
	}
	this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild;
	this._displayWeekdays();

	var tbody = Calendar.createElement("tbody", table);
	this.tbody = tbody;

	for (i = 6; i > 0; --i) {
		row = Calendar.createElement("tr", tbody);
		if (this.weekNumbers) {
			cell = Calendar.createElement("td", row);
		}
		for (var j = 7; j > 0; --j) {
			cell = Calendar.createElement("td", row);
			cell.calendar = this;
			Calendar._add_evs(cell);
		}
	}

	if (this.showsTime) {
		row = Calendar.createElement("tr", tbody);
		row.className = "time";

		cell = Calendar.createElement("td", row);
		cell.className = "time";
		cell.colSpan = 2;
		cell.innerHTML = Calendar._TT["TIME"] || "&nbsp;";

		cell = Calendar.createElement("td", row);
		cell.className = "time";
		cell.colSpan = this.weekNumbers ? 4 : 3;

		(function(){
			function makeTimePart(className, init, range_start, range_end) {
				var part = Calendar.createElement("span", cell);
				part.className = className;
				part.innerHTML = init;
				part.calendar = cal;
				part.ttip = Calendar._TT["TIME_PART"];
				part.navtype = 50;
				part._range = [];
				if (typeof range_start != "number")
					part._range = range_start;
				else {
					for (var i = range_start; i <= range_end; ++i) {
						var txt;
						if (i < 10 && range_end >= 10) txt = '0' + i;
						else txt = '' + i;
						part._range[part._range.length] = txt;
					}
				}
				Calendar._add_evs(part);
				return part;
			};
			var hrs = cal.date.getHours();
			var mins = cal.date.getMinutes();
			var t12 = !cal.time24;
			var pm = (hrs > 12);
			if (t12 && pm) hrs -= 12;
			var H = makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23);
			var span = Calendar.createElement("span", cell);
			span.innerHTML = ":";
			span.className = "colon";
			var M = makeTimePart("minute", mins, 0, 59);
			var AP = null;
			cell = Calendar.createElement("td", row);
			cell.className = "time";
			cell.colSpan = 2;
			if (t12)
				AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]);
			else
				cell.innerHTML = "&nbsp;";

			cal.onSetTime = function() {
				var pm, hrs = this.date.getHours(),
					mins = this.date.getMinutes();
				if (t12) {
					pm = (hrs >= 12);
					if (pm) hrs -= 12;
					if (hrs == 0) hrs = 12;
					AP.innerHTML = pm ? "pm" : "am";
				}
				H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs;
				M.innerHTML = (mins < 10) ? ("0" + mins) : mins;
			};

			cal.onUpdateTime = function() {
				var date = this.date;
				var h = parseInt(H.innerHTML, 10);
				if (t12) {
					if (/pm/i.test(AP.innerHTML) && h < 12)
						h += 12;
					else if (/am/i.test(AP.innerHTML) && h == 12)
						h = 0;
				}
				var d = date.getDate();
				var m = date.getMonth();
				var y = date.getFullYear();
				date.setHours(h);
				date.setMinutes(parseInt(M.innerHTML, 10));
				date.setFullYear(y);
				date.setMonth(m);
				date.setDate(d);
				this.dateClicked = false;
				this.callHandler();
			};
		})();
	} else {
		this.onSetTime = this.onUpdateTime = function() {};
	}

	var tfoot = Calendar.createElement("tfoot", table);

	row = Calendar.createElement("tr", tfoot);
	row.className = "footrow";

	cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300);
	cell.className = "ttip";
	if (this.isPopup) {
		cell.ttip = Calendar._TT["DRAG_TO_MOVE"];
		cell.style.cursor = "move";
	}
	this.tooltips = cell;

	div = Calendar.createElement("div", this.element);
	this.monthsCombo = div;
	div.className = "combo";
	for (i = 0; i < Calendar._MN.length; ++i) {
		var mn = Calendar.createElement("div");
		mn.className = Calendar.is_ie ? "label-IEfix" : "label";
		mn.month = i;
		mn.innerHTML = Calendar._SMN[i];
		div.appendChild(mn);
	}

	div = Calendar.createElement("div", this.element);
	this.yearsCombo = div;
	div.className = "combo";
	for (i = 12; i > 0; --i) {
		var yr = Calendar.createElement("div");
		yr.className = Calendar.is_ie ? "label-IEfix" : "label";
		div.appendChild(yr);
	}

	this._init(this.firstDayOfWeek, this.date);
	parent.appendChild(this.element);
};

/** keyboard navigation, only for popup calendars */
Calendar._keyEvent = function(ev) {
	var cal = window._dynarch_popupCalendar;
	if (!cal || cal.multiple)
		return false;
	(Calendar.is_ie) && (ev = window.event);
	var act = (Calendar.is_ie || ev.type == "keypress"),
		K = ev.keyCode;
	if (ev.ctrlKey) {
		switch (K) {
		    case 37: // KEY left
			act && Calendar.cellClick(cal._nav_pm);
			break;
		    case 38: // KEY up
			act && Calendar.cellClick(cal._nav_py);
			break;
		    case 39: // KEY right
			act && Calendar.cellClick(cal._nav_nm);
			break;
		    case 40: // KEY down
			act && Calendar.cellClick(cal._nav_ny);
			break;
		    default:
			return false;
		}
	} else switch (K) {
	    case 32: // KEY space (now)
		Calendar.cellClick(cal._nav_now);
		break;
	    case 27: // KEY esc
		act && cal.callCloseHandler();
		break;
	    case 37: // KEY left
	    case 38: // KEY up
	    case 39: // KEY right
	    case 40: // KEY down
		if (act) {
			var prev, x, y, ne, el, step;
			prev = K == 37 || K == 38;
			step = (K == 37 || K == 39) ? 1 : 7;
			function setVars() {
				el = cal.currentDateEl;
				var p = el.pos;
				x = p & 15;
				y = p >> 4;
				ne = cal.ar_days[y][x];
			};setVars();
			function prevMonth() {
				var date = new Date(cal.date);
				date.setDate(date.getDate() - step);
				cal.setDate(date);
			};
			function nextMonth() {
				var date = new Date(cal.date);
				date.setDate(date.getDate() + step);
				cal.setDate(date);
			};
			while (1) {
				switch (K) {
				    case 37: // KEY left
					if (--x >= 0)
						ne = cal.ar_days[y][x];
					else {
						x = 6;
						K = 38;
						continue;
					}
					break;
				    case 38: // KEY up
					if (--y >= 0)
						ne = cal.ar_days[y][x];
					else {
						prevMonth();
						setVars();
					}
					break;
				    case 39: // KEY right
					if (++x < 7)
						ne = cal.ar_days[y][x];
					else {
						x = 0;
						K = 40;
						continue;
					}
					break;
				    case 40: // KEY down
					if (++y < cal.ar_days.length)
						ne = cal.ar_days[y][x];
					else {
						nextMonth();
						setVars();
					}
					break;
				}
				break;
			}
			if (ne) {
				if (!ne.disabled)
					Calendar.cellClick(ne);
				else if (prev)
					prevMonth();
				else
					nextMonth();
			}
		}
		break;
	    case 13: // KEY enter
		if (act)
			Calendar.cellClick(cal.currentDateEl, ev);
		break;
	    default:
		return false;
	}
	return Calendar.stopEvent(ev);
};

/**
 *  (RE)Initializes the calendar to the given date and firstDayOfWeek
 */
Calendar.prototype._init = function (firstDayOfWeek, date) {
	var today = new Date(),
		TY = today.getFullYear(),
		TM = today.getMonth(),
		TD = today.getDate();
	this.table.style.visibility = "hidden";
	var year = date.getFullYear();
	if (year < this.minYear) {
		year = this.minYear;
		date.setFullYear(year);
	} else if (year > this.maxYear) {
		year = this.maxYear;
		date.setFullYear(year);
	}
	this.firstDayOfWeek = firstDayOfWeek;
	this.date = new Date(date);
	var month = date.getMonth();
	var mday = date.getDate();
	var no_days = date.getMonthDays();

	// calendar voodoo for computing the first day that would actually be
	// displayed in the calendar, even if it's from the previous month.
	// WARNING: this is magic. ;-)
	date.setDate(1);
	var day1 = (date.getDay() - this.firstDayOfWeek) % 7;
	if (day1 < 0)
		day1 += 7;
	date.setDate(-day1);
	date.setDate(date.getDate() + 1);

	var row = this.tbody.firstChild;
	var MN = Calendar._SMN[month];
	var ar_days = this.ar_days = new Array();
	var weekend = Calendar._TT["WEEKEND"];
	var dates = this.multiple ? (this.datesCells = {}) : null;
	for (var i = 0; i < 6; ++i, row = row.nextSibling) {
		var cell = row.firstChild;
		if (this.weekNumbers) {
			cell.className = "day wn";
			cell.innerHTML = date.getWeekNumber();
			cell = cell.nextSibling;
		}
		row.className = "daysrow";
		var hasdays = false, iday, dpos = ar_days[i] = [];
		for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday + 1)) {
			iday = date.getDate();
			var wday = date.getDay();
			cell.className = "day";
			cell.pos = i << 4 | j;
			dpos[j] = cell;
			var current_month = (date.getMonth() == month);
			if (!current_month) {
				if (this.showsOtherMonths) {
					cell.className += " othermonth";
					cell.otherMonth = true;
				} else {
					cell.className = "emptycell";
					cell.innerHTML = "&nbsp;";
					cell.disabled = true;
					continue;
				}
			} else {
				cell.otherMonth = false;
				hasdays = true;
			}
			cell.disabled = false;
			cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday;
			if (dates)
				dates[date.print("%Y%m%d")] = cell;
			if (this.getDateStatus) {
				var status = this.getDateStatus(date, year, month, iday);
				if (this.getDateToolTip) {
					var toolTip = this.getDateToolTip(date, year, month, iday);
					if (toolTip)
						cell.title = toolTip;
				}
				if (status === true) {
					cell.className += " disabled";
					cell.disabled = true;
				} else {
					if (/disabled/i.test(status))
						cell.disabled = true;
					cell.className += " " + status;
				}
			}
			if (!cell.disabled) {
				cell.caldate = new Date(date);
				cell.ttip = "_";
				if (!this.multiple && current_month
				    && iday == mday && this.hiliteToday) {
					cell.className += " selected";
					this.currentDateEl = cell;
				}
				if (date.getFullYear() == TY &&
				    date.getMonth() == TM &&
				    iday == TD) {
					cell.className += " today";
					cell.ttip += Calendar._TT["PART_TODAY"];
				}
				if (weekend.indexOf(wday.toString()) != -1)
					cell.className += cell.otherMonth ? " oweekend" : " weekend";
			}
		}
		if (!(hasdays || this.showsOtherMonths))
			row.className = "emptyrow";
	}
	this.title.innerHTML = Calendar._MN[month] + ", " + year;
	this.onSetTime();
	this.table.style.visibility = "visible";
	this._initMultipleDates();
	// PROFILE
	// this.tooltips.innerHTML = "Generated in " + ((new Date()) - today) + " ms";
};

Calendar.prototype._initMultipleDates = function() {
	if (this.multiple) {
		for (var i in this.multiple) {
			var cell = this.datesCells[i];
			var d = this.multiple[i];
			if (!d)
				continue;
			if (cell)
				cell.className += " selected";
		}
	}
};

Calendar.prototype._toggleMultipleDate = function(date) {
	if (this.multiple) {
		var ds = date.print("%Y%m%d");
		var cell = this.datesCells[ds];
		if (cell) {
			var d = this.multiple[ds];
			if (!d) {
				Calendar.addClass(cell, "selected");
				this.multiple[ds] = date;
			} else {
				Calendar.removeClass(cell, "selected");
				delete this.multiple[ds];
			}
		}
	}
};

Calendar.prototype.setDateToolTipHandler = function (unaryFunction) {
	this.getDateToolTip = unaryFunction;
};

/**
 *  Calls _init function above for going to a certain date (but only if the
 *  date is different than the currently selected one).
 */
Calendar.prototype.setDate = function (date) {
	if (!date.equalsTo(this.date)) {
		this._init(this.firstDayOfWeek, date);
	}
};

/**
 *  Refreshes the calendar.  Useful if the "disabledHandler" function is
 *  dynamic, meaning that the list of disabled date can change at runtime.
 *  Just * call this function if you think that the list of disabled dates
 *  should * change.
 */
Calendar.prototype.refresh = function () {
	this._init(this.firstDayOfWeek, this.date);
};

/** Modifies the "firstDayOfWeek" parameter (pass 0 for Synday, 1 for Monday, etc.). */
Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) {
	this._init(firstDayOfWeek, this.date);
	this._displayWeekdays();
};

/**
 *  Allows customization of what dates are enabled.  The "unaryFunction"
 *  parameter must be a function object that receives the date (as a JS Date
 *  object) and returns a boolean value.  If the returned value is true then
 *  the passed date will be marked as disabled.
 */
Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) {
	this.getDateStatus = unaryFunction;
};

/** Customization of allowed year range for the calendar. */
Calendar.prototype.setRange = function (a, z) {
	this.minYear = a;
	this.maxYear = z;
};

/** Calls the first user handler (selectedHandler). */
Calendar.prototype.callHandler = function () {
	if (this.onSelected) {
		this.onSelected(this, this.date.print(this.dateFormat));
	}
};

/** Calls the second user handler (closeHandler). */
Calendar.prototype.callCloseHandler = function () {
	if (this.onClose) {
		this.onClose(this);
	}
	this.hideShowCovered();
};

/** Removes the calendar object from the DOM tree and destroys it. */
Calendar.prototype.destroy = function () {
	var el = this.element.parentNode;
	el.removeChild(this.element);
	Calendar._C = null;
	window._dynarch_popupCalendar = null;
};

/**
 *  Moves the calendar element to a different section in the DOM tree (changes
 *  its parent).
 */
Calendar.prototype.reparent = function (new_parent) {
	var el = this.element;
	el.parentNode.removeChild(el);
	new_parent.appendChild(el);
};

// This gets called when the user presses a mouse button anywhere in the
// document, if the calendar is shown.  If the click was outside the open
// calendar this function closes it.
Calendar._checkCalendar = function(ev) {
	var calendar = window._dynarch_popupCalendar;
	if (!calendar) {
		return false;
	}
	var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev);
	for (; el != null && el != calendar.element; el = el.parentNode);
	if (el == null) {
		// calls closeHandler which should hide the calendar.
		window._dynarch_popupCalendar.callCloseHandler();
		return Calendar.stopEvent(ev);
	}
};

/** Shows the calendar. */
Calendar.prototype.show = function () {
	var rows = this.table.getElementsByTagName("tr");
	for (var i = rows.length; i > 0;) {
		var row = rows[--i];
		Calendar.removeClass(row, "rowhilite");
		var cells = row.getElementsByTagName("td");
		for (var j = cells.length; j > 0;) {
			var cell = cells[--j];
			Calendar.removeClass(cell, "hilite");
			Calendar.removeClass(cell, "active");
		}
	}
	this.element.style.display = "block";
	this.hidden = false;
	if (this.isPopup) {
		window._dynarch_popupCalendar = this;
		Calendar.addEvent(document, "keydown", Calendar._keyEvent);
		Calendar.addEvent(document, "keypress", Calendar._keyEvent);
		Calendar.addEvent(document, "mousedown", Calendar._checkCalendar);
	}
	this.hideShowCovered();
};

/**
 *  Hides the calendar.  Also removes any "hilite" from the class of any TD
 *  element.
 */
Calendar.prototype.hide = function () {
	if (this.isPopup) {
		Calendar.removeEvent(document, "keydown", Calendar._keyEvent);
		Calendar.removeEvent(document, "keypress", Calendar._keyEvent);
		Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar);
	}
	this.element.style.display = "none";
	this.hidden = true;
	this.hideShowCovered();
};

/**
 *  Shows the calendar at a given absolute position (beware that, depending on
 *  the calendar element style -- position property -- this might be relative
 *  to the parent's containing rectangle).
 */
Calendar.prototype.showAt = function (x, y) {
	var s = this.element.style;
	s.left = x + "px";
	s.top = y + "px";
	this.show();
};

/** Shows the calendar near a given element. */
Calendar.prototype.showAtElement = function (el, opts) {
	var self = this;
	var p = Calendar.getAbsolutePos(el);
	if (!opts || typeof opts != "string") {
		this.showAt(p.x, p.y + el.offsetHeight);
		return true;
	}
	function fixPosition(box) {
		if (box.x < 0)
			box.x = 0;
		if (box.y < 0)
			box.y = 0;
		var cp = document.createElement("div");
		var s = cp.style;
		s.position = "absolute";
		s.right = s.bottom = s.width = s.height = "0px";
		document.body.appendChild(cp);
		var br = Calendar.getAbsolutePos(cp);
		document.body.removeChild(cp);
		if (Calendar.is_ie) {
			br.y += document.body.scrollTop;
			br.x += document.body.scrollLeft;
		} else {
			br.y += window.scrollY;
			br.x += window.scrollX;
		}
		var tmp = box.x + box.width - br.x;
		if (tmp > 0) box.x -= tmp;
		tmp = box.y + box.height - br.y;
		if (tmp > 0) box.y -= tmp;
	};
	this.element.style.display = "block";
	Calendar.continuation_for_the_fucking_khtml_browser = function() {
		var w = self.element.offsetWidth;
		var h = self.element.offsetHeight;
		self.element.style.display = "none";
		var valign = opts.substr(0, 1);
		var halign = "l";
		if (opts.length > 1) {
			halign = opts.substr(1, 1);
		}
		// vertical alignment
		switch (valign) {
		    case "T": p.y -= h; break;
		    case "B": p.y += el.offsetHeight; break;
		    case "C": p.y += (el.offsetHeight - h) / 2; break;
		    case "t": p.y += el.offsetHeight - h; break;
		    case "b": break; // already there
		}
		// horizontal alignment
		switch (halign) {
		    case "L": p.x -= w; break;
		    case "R": p.x += el.offsetWidth; break;
		    case "C": p.x += (el.offsetWidth - w) / 2; break;
		    case "l": p.x += el.offsetWidth - w; break;
		    case "r": break; // already there
		}
		p.width = w;
		p.height = h + 40;
		self.monthsCombo.style.display = "none";
		fixPosition(p);
		self.showAt(p.x, p.y);
	};
	if (Calendar.is_khtml)
		setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10);
	else
		Calendar.continuation_for_the_fucking_khtml_browser();
};

/** Customizes the date format. */
Calendar.prototype.setDateFormat = function (str) {
	this.dateFormat = str;
};

/** Customizes the tooltip date format. */
Calendar.prototype.setTtDateFormat = function (str) {
	this.ttDateFormat = str;
};

/**
 *  Tries to identify the date represented in a string.  If successful it also
 *  calls this.setDate which moves the calendar to the given date.
 */
Calendar.prototype.parseDate = function(str, fmt) {
	if (!fmt)
		fmt = this.dateFormat;
	this.setDate(Date.parseDate(str, fmt));
};

Calendar.prototype.hideShowCovered = function () {
	if (!Calendar.is_ie && !Calendar.is_opera)
		return;
	function getVisib(obj){
		var value = obj.style.visibility;
		if (!value) {
			if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C
				if (!Calendar.is_khtml)
					value = document.defaultView.
						getComputedStyle(obj, "").getPropertyValue("visibility");
				else
					value = '';
			} else if (obj.currentStyle) { // IE
				value = obj.currentStyle.visibility;
			} else
				value = '';
		}
		return value;
	};

	var tags = new Array("applet", "iframe", "select");
	var el = this.element;

	var p = Calendar.getAbsolutePos(el);
	var EX1 = p.x;
	var EX2 = el.offsetWidth + EX1;
	var EY1 = p.y;
	var EY2 = el.offsetHeight + EY1;

	for (var k = tags.length; k > 0; ) {
		var ar = document.getElementsByTagName(tags[--k]);
		var cc = null;

		for (var i = ar.length; i > 0;) {
			cc = ar[--i];

			p = Calendar.getAbsolutePos(cc);
			var CX1 = p.x;
			var CX2 = cc.offsetWidth + CX1;
			var CY1 = p.y;
			var CY2 = cc.offsetHeight + CY1;

			if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
				if (!cc.__msh_save_visibility) {
					cc.__msh_save_visibility = getVisib(cc);
				}
				cc.style.visibility = cc.__msh_save_visibility;
			} else {
				if (!cc.__msh_save_visibility) {
					cc.__msh_save_visibility = getVisib(cc);
				}
				cc.style.visibility = "hidden";
			}
		}
	}
};

/** Internal function; it displays the bar with the names of the weekday. */
Calendar.prototype._displayWeekdays = function () {
	var fdow = this.firstDayOfWeek;
	var cell = this.firstdayname;
	var weekend = Calendar._TT["WEEKEND"];
	for (var i = 0; i < 7; ++i) {
		cell.className = "day name";
		var realday = (i + fdow) % 7;
		if (i) {
			cell.ttip = Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[realday]);
			cell.navtype = 100;
			cell.calendar = this;
			cell.fdow = realday;
			Calendar._add_evs(cell);
		}
		if (weekend.indexOf(realday.toString()) != -1) {
			Calendar.addClass(cell, "weekend");
		}
		cell.innerHTML = Calendar._SDN[(i + fdow) % 7];
		cell = cell.nextSibling;
	}
};

/** Internal function.  Hides all combo boxes that might be displayed. */
Calendar.prototype._hideCombos = function () {
	this.monthsCombo.style.display = "none";
	this.yearsCombo.style.display = "none";
};

/** Internal function.  Starts dragging the element. */
Calendar.prototype._dragStart = function (ev) {
	if (this.dragging) {
		return;
	}
	this.dragging = true;
	var posX;
	var posY;
	if (Calendar.is_ie) {
		posY = window.event.clientY + document.body.scrollTop;
		posX = window.event.clientX + document.body.scrollLeft;
	} else {
		posY = ev.clientY + window.scrollY;
		posX = ev.clientX + window.scrollX;
	}
	var st = this.element.style;
	this.xOffs = posX - parseInt(st.left);
	this.yOffs = posY - parseInt(st.top);
	with (Calendar) {
		addEvent(document, "mousemove", calDragIt);
		addEvent(document, "mouseup", calDragEnd);
	}
};

// BEGIN: DATE OBJECT PATCHES

/** Adds the number of days array to the Date object. */
Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

/** Constants used for time computations */
Date.SECOND = 1000 /* milliseconds */;
Date.MINUTE = 60 * Date.SECOND;
Date.HOUR   = 60 * Date.MINUTE;
Date.DAY    = 24 * Date.HOUR;
Date.WEEK   =  7 * Date.DAY;

Date.parseDate = function(str, fmt) {
	var today = new Date();
	var y = 0;
	var m = -1;
	var d = 0;
	var a = str.split(/\W+/);
	var b = fmt.match(/%./g);
	var i = 0, j = 0;
	var hr = 0;
	var min = 0;
	for (i = 0; i < a.length; ++i) {
		if (!a[i])
			continue;
		switch (b[i]) {
		    case "%d":
		    case "%e":
			d = parseInt(a[i], 10);
			break;

		    case "%m":
			m = parseInt(a[i], 10) - 1;
			break;

		    case "%Y":
		    case "%y":
			y = parseInt(a[i], 10);
			(y < 100) && (y += (y > 29) ? 1900 : 2000);
			break;

		    case "%b":
		    case "%B":
			for (j = 0; j < 12; ++j) {
				if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; }
			}
			break;

		    case "%H":
		    case "%I":
		    case "%k":
		    case "%l":
			hr = parseInt(a[i], 10);
			break;

		    case "%P":
		    case "%p":
			if (/pm/i.test(a[i]) && hr < 12)
				hr += 12;
			else if (/am/i.test(a[i]) && hr >= 12)
				hr -= 12;
			break;

		    case "%M":
			min = parseInt(a[i], 10);
			break;
		}
	}
	if (isNaN(y)) y = today.getFullYear();
	if (isNaN(m)) m = today.getMonth();
	if (isNaN(d)) d = today.getDate();
	if (isNaN(hr)) hr = today.getHours();
	if (isNaN(min)) min = today.getMinutes();

	if (y != 0 && m != -1 && d != 0)
		return new Date(y, m, d, hr, min, 0);
	y = 0; m = -1; d = 0;
	for (i = 0; i < a.length; ++i) {
		if (a[i].search(/[a-zA-Z]+/) != -1) {
			var t = -1;
			for (j = 0; j < 12; ++j) {
				if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
			}
			if (t != -1) {
				if (m != -1) {
					d = m+1;
				}
				m = t;
			}
		} else if (parseInt(a[i], 10) <= 12 && m == -1) {
			m = a[i]-1;
		} else if (parseInt(a[i], 10) > 31 && y == 0) {
			y = parseInt(a[i], 10);
			(y < 100) && (y += (y > 29) ? 1900 : 2000);
		} else if (d == 0) {
			d = a[i];
		}
	}
	if (y == 0)
		y = today.getFullYear();
	if (m != -1 && d != 0)
		return new Date(y, m, d, hr, min, 0);
	return today;
};

/** Returns the number of days in the current month */
Date.prototype.getMonthDays = function(month) {
	var year = this.getFullYear();
	if (typeof month == "undefined") {
		month = this.getMonth();
	}
	if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) {
		return 29;
	} else {
		return Date._MD[month];
	}
};

/** Returns the number of day in the year. */
Date.prototype.getDayOfYear = function() {
	var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
	var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
	var time = now - then;
	return Math.floor(time / Date.DAY);
};

/** Returns the number of the week in year, as defined in ISO 8601. */
Date.prototype.getWeekNumber = function() {
	var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
	var DoW = d.getDay();
	d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
	var ms = d.valueOf(); // GMT
	d.setMonth(0);
	d.setDate(4); // Thu in Week 1
	return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
};

/** Checks date and time equality */
Date.prototype.equalsTo = function(date) {
	return ((this.getFullYear() == date.getFullYear()) &&
		(this.getMonth() == date.getMonth()) &&
		(this.getDate() == date.getDate()) &&
		(this.getHours() == date.getHours()) &&
		(this.getMinutes() == date.getMinutes()));
};

/** Set only the year, month, date parts (keep existing time) */
Date.prototype.setDateOnly = function(date) {
	var tmp = new Date(date);
	this.setDate(1);
	this.setFullYear(tmp.getFullYear());
	this.setMonth(tmp.getMonth());
	this.setDate(tmp.getDate());
};

/** Prints the date in a string according to the given format. */
Date.prototype.print = function (str) {
	var m = this.getMonth();
	var d = this.getDate();
	var y = this.getFullYear();
	var wn = this.getWeekNumber();
	var w = this.getDay();
	var s = {};
	var hr = this.getHours();
	var pm = (hr >= 12);
	var ir = (pm) ? (hr - 12) : hr;
	var dy = this.getDayOfYear();
	if (ir == 0)
		ir = 12;
	var min = this.getMinutes();
	var sec = this.getSeconds();
	s["%a"] = Calendar._SDN[w]; // abbreviated weekday name [FIXME: I18N]
	s["%A"] = Calendar._DN[w]; // full weekday name
	s["%b"] = Calendar._SMN[m]; // abbreviated month name [FIXME: I18N]
	s["%B"] = Calendar._MN[m]; // full month name
	// FIXME: %c : preferred date and time representation for the current locale
	s["%C"] = 1 + Math.floor(y / 100); // the century number
	s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31)
	s["%e"] = d; // the day of the month (range 1 to 31)
	// FIXME: %D : american date style: %m/%d/%y
	// FIXME: %E, %F, %G, %g, %h (man strftime)
	s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
	s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
	s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
	s["%k"] = hr;		// hour, range 0 to 23 (24h format)
	s["%l"] = ir;		// hour, range 1 to 12 (12h format)
	s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12
	s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
	s["%n"] = "\n";		// a newline character
	s["%p"] = pm ? "PM" : "AM";
	s["%P"] = pm ? "pm" : "am";
	// FIXME: %r : the time in am/pm notation %I:%M:%S %p
	// FIXME: %R : the time in 24-hour notation %H:%M
	s["%s"] = Math.floor(this.getTime() / 1000);
	s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
	s["%t"] = "\t";		// a tab character
	// FIXME: %T : the time in 24-hour notation (%H:%M:%S)
	s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn;
	s["%u"] = w + 1;	// the day of the week (range 1 to 7, 1 = MON)
	s["%w"] = w;		// the day of the week (range 0 to 6, 0 = SUN)
	// FIXME: %x : preferred date representation for the current locale without the time
	// FIXME: %X : preferred time representation for the current locale without the date
	s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99)
	s["%Y"] = y;		// year with the century
	s["%%"] = "%";		// a literal '%' character

	var re = /%./g;
	if (!Calendar.is_ie5 && !Calendar.is_khtml)
		return str.replace(re, function (par) { return s[par] || par; });

	var a = str.match(re);
	for (var i = 0; i < a.length; i++) {
		var tmp = s[a[i]];
		if (tmp) {
			re = new RegExp(a[i], 'g');
			str = str.replace(re, tmp);
		}
	}

	return str;
};

Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;
Date.prototype.setFullYear = function(y) {
	var d = new Date(this);
	d.__msh_oldSetFullYear(y);
	if (d.getMonth() != this.getMonth())
		this.setDate(28);
	this.__msh_oldSetFullYear(y);
};

// END: DATE OBJECT PATCHES


// global object that remembers the calendar
window._dynarch_popupCalendar = null;

/**
 * calendar/calendar-setup.js;
 */
Calendar.setup = function (params) {
	function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };

	param_default("inputField",     null);
	param_default("displayArea",    null);
	param_default("button",         null);
	param_default("eventName",      "click");
	param_default("ifFormat",       "%Y/%m/%d");
	param_default("daFormat",       "%Y/%m/%d");
	param_default("singleClick",    true);
	param_default("disableFunc",    null);
	param_default("dateStatusFunc", params["disableFunc"]);	// takes precedence if both are defined
	param_default("dateText",       null);
	param_default("firstDay",       null);
	param_default("align",          "Br");
	param_default("range",          [1900, 2999]);
	param_default("weekNumbers",    false);
	param_default("flat",           null);
	param_default("flatCallback",   null);
	param_default("onSelect",       null);
	param_default("onClose",        null);
	param_default("onUpdate",       null);
	param_default("date",           null);
	param_default("showsTime",      false);
	param_default("timeFormat",     "24");
	param_default("electric",       true);
	param_default("step",           2);
	param_default("position",       null);
	param_default("cache",          false);
	param_default("showOthers",     false);
	param_default("multiple",       null);

	var tmp = ["inputField", "displayArea", "button"];
	for (var i in tmp) {
		if (typeof params[tmp[i]] == "string") {
			params[tmp[i]] = document.getElementById(params[tmp[i]]);
		}
	}
	if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) {
		alert("Calendar.setup:\n  Nothing to setup (no fields found).  Please check your code");
		return false;
	}

	function onSelect(cal) {
		var p = cal.params;
		var update = (cal.dateClicked || p.electric);
		if (update && p.inputField) {
			p.inputField.value = cal.date.print(p.ifFormat);
			if (typeof p.inputField.onchange == "function")
				p.inputField.onchange();
		}
		if (update && p.displayArea)
			p.displayArea.innerHTML = cal.date.print(p.daFormat);
		if (update && typeof p.onUpdate == "function")
			p.onUpdate(cal);
		if (update && p.flat) {
			if (typeof p.flatCallback == "function")
				p.flatCallback(cal);
		}
		if (update && p.singleClick && cal.dateClicked)
			cal.callCloseHandler();
	};

	if (params.flat != null) {
		if (typeof params.flat == "string")
			params.flat = document.getElementById(params.flat);
		if (!params.flat) {
			alert("Calendar.setup:\n  Flat specified but can't find parent.");
			return false;
		}
		var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect);
		cal.showsOtherMonths = params.showOthers;
		cal.showsTime = params.showsTime;
		cal.time24 = (params.timeFormat == "24");
		cal.params = params;
		cal.weekNumbers = params.weekNumbers;
		cal.setRange(params.range[0], params.range[1]);
		cal.setDateStatusHandler(params.dateStatusFunc);
		cal.getDateText = params.dateText;
		if (params.ifFormat) {
			cal.setDateFormat(params.ifFormat);
		}
		if (params.inputField && typeof params.inputField.value == "string") {
			cal.parseDate(params.inputField.value);
		}
		cal.create(params.flat);
		cal.show();
		return false;
	}

	var triggerEl = params.button || params.displayArea || params.inputField;
	triggerEl["on" + params.eventName] = function() {
		var dateEl = params.inputField || params.displayArea;
		var dateFmt = params.inputField ? params.ifFormat : params.daFormat;
		var mustCreate = false;
		var cal = window.calendar;
		if (dateEl)
			params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt);
		if (!(cal && params.cache)) {
			window.calendar = cal = new Calendar(params.firstDay,
							     params.date,
							     params.onSelect || onSelect,
							     params.onClose || function(cal) { cal.hide(); });
			cal.showsTime = params.showsTime;
			cal.time24 = (params.timeFormat == "24");
			cal.weekNumbers = params.weekNumbers;
			mustCreate = true;
		} else {
			if (params.date)
				cal.setDate(params.date);
			cal.hide();
		}
		if (params.multiple) {
			cal.multiple = {};
			for (var i = params.multiple.length; --i >= 0;) {
				var d = params.multiple[i];
				var ds = d.print("%Y%m%d");
				cal.multiple[ds] = d;
			}
		}
		cal.showsOtherMonths = params.showOthers;
		cal.yearStep = params.step;
		cal.setRange(params.range[0], params.range[1]);
		cal.params = params;
		cal.setDateStatusHandler(params.dateStatusFunc);
		cal.getDateText = params.dateText;
		cal.setDateFormat(dateFmt);
		if (mustCreate)
			cal.create();
		cal.refresh();
		if (!params.position)
			cal.showAtElement(params.button || params.displayArea || params.inputField, params.align);
		else
			cal.showAt(params.position[0], params.position[1]);
		return false;
	};

	return cal;
};

/**
 * calculator/household.js;
 */
function HouseHoldCalculator() {
}

HouseHoldCalculator.prototype = {
    maxPages: 3,
    currentPage: 1,
    changeTab: function(tabId) {
        this.currentPage = tabId;
        Y.one('#calc').set('className', 'ts' + tabId);
    },
    nextPage: function(e) {
        e.halt();
        if (this.currentPage < this.maxPages) {
            this.changeTab(this.currentPage + 1);
        }
    },
    prevPage: function(e) {
        e.halt();
        if (this.currentPage > 1) {
            this.changeTab(this.currentPage - 1);
        }
    },
    calculateBox: function(box) {
        var sum = 0;
        var nodes = box.all('input').each(function(elem) {
            if (!elem.hasClass('sum')) {
                var value = parseInt(elem.get('value'), 10);
                sum += isNaN(value) ? 0 : value;
            }
        });
        if (!isNaN(sum)) {
            var output = box.one('input.sum');
            output.set('value', sum);
        }
    },
    calculateFinal: function(e) {
        e.halt();
        var total = 0;
        var income = parseInt(Y.get('#income').get('value'), 10);

        Y.all('input.sum').each(function(v) {
            if (v.get('id') != 'income') {
                total += parseInt(v.get('value'), 10);
            }
        });

        var balance = income - total;
        Y.get('#income-total').set('value', income);
        Y.get('#expenses').set('value', total);
        Y.get('#balance').set('value', balance);

        if (balance > 0) {
            Y.get('#household-calculator-errors').addClass('hidden');
        } else {
            Y.get('#household-calculator-errors').removeClass('hidden');
        }

    },
    sendCalculations: function(e) {
        var data = [
            '#income',
            '#overhead-expenses',
            '#rent-expenses',
            '#household-expenses',
            '#car-expenses',
            '#insurance-expenses',
            '#freetime-expenses',
            '#loan-expenses',
            '#other-expenses'
        ];
        var send = {};
        var income = 0;
        var expenses = 0;

        Y.Array.each(data, function(v) {
            var key = v.replace('#', '');
            key = key.replace('-', '_');
            send[key] = Y.one(v).get('value');
        });

        var totalExpenses = Y.Object.each(send, function(v, k) {
            if (k != 'income') {
                expenses += parseInt(v, 10);
            } else {
                income = parseInt(v, 10);
            }
        });
        if (income > expenses) {
            var config = {
                url: '/kalkulatorok/haztartasi-mentes',
                method: 'POST',
                data: send,
                on: {
                    success: function() {}
                }
            }
            var xhr = new Ajax(config);
            xhr.send();
        }
    }
};

/**
 * calendar/calendar-hu.js;
 */
Calendar._DN = new Array (
"Vasárnap",
"Hétfő",
"Kedd",
"Szerda",
"Csütörtök",
"Péntek",
"Szombat",
"Vasárnap"
);

Calendar._SDN = new Array (
"v",
"h",
"k",
"sze",
"cs",
"p",
"szo",
"v"
);

Calendar._MN = new Array (
"január",
"február",
"március",
"április",
"május",
"június",
"július",
"augusztus",
"szeptember",
"október",
"november",
"december"
);

Calendar._SMN = new Array (
"jan",
"feb",
"már",
"ápr",
"máj",
"jún",
"júl",
"aug",
"sze",
"okt",
"nov",
"dec"
);

Calendar._TT = {};
Calendar._TT["INFO"] = "A kalendáriumról";

Calendar._TT["ABOUT"] =
"Dátum választó naptár\n\n" +
"Dátum választás:\n" +
"- használja a \xab, \xbb gombokat az év kiválasztásához\n" +
"- használja a " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " gombokat a hónap kiválasztásához\n" +
"- tartsa lenyomva az egérgombot a gyors választáshoz.";

Calendar._TT["ABOUT_TIME"] = "\n\n" +
"Idő választás:\n" +
"- kattintva növelheti az időt\n" +
"- shift-tel kattintva csökkentheti\n" +
"- lenyomva tartva és húzva gyorsabban kiválaszthatja.";

Calendar._TT["PREV_YEAR"] = "Előző év (tartsa nyomva a menühöz)";
Calendar._TT["PREV_MONTH"] = "Előző hó (tartsa nyomva a menühöz)";
Calendar._TT["GO_TODAY"] = "Mai napra ugrás";
Calendar._TT["NEXT_MONTH"] = "Köv. hó (tartsa nyomva a menühöz)";
Calendar._TT["NEXT_YEAR"] = "Köv. év (tartsa nyomva a menühöz)";
Calendar._TT["SEL_DATE"] = "Válasszon dátumot";
Calendar._TT["DRAG_TO_MOVE"] = "Húzza a mozgatáshoz";
Calendar._TT["PART_TODAY"] = " (ma)";

Calendar._TT["DAY_FIRST"] = "%s legyen a hét első napja";

Calendar._TT["WEEKEND"] = "0,6";

Calendar._TT["CLOSE"] = "Bezár";
Calendar._TT["TODAY"] = "Ma";
Calendar._TT["TIME_PART"] = "(Shift-) Klikk vagy nyomvatartva húzás";

// date formats
Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
Calendar._TT["TT_DATE_FORMAT"] = "%B %e, %A";

Calendar._TT["WK"] = "hét";
Calendar._TT["TIME"] = "idő:";

/**
 * controller/FrontController.js;
 */
FrontController = {
    controllers: {
        admin: {},
        mini: {}
    },
    dispatch: function(page, action) {
        var controller = page.charAt(0).toUpperCase() + page.substr(1);
        var cUrl = context.currentUrl;
        if (controller in FrontController.controllers[cUrl]) {
            method = action;
            if (method in FrontController.controllers[cUrl][controller]) {
                FrontController.controllers[cUrl][controller][method].call(FrontController.controllers[cUrl][controller]);
            }
        }
    },
    init: function(globals, page, action) {
        FrontController.dispatchGlobals(globals);
        FrontController.dispatch(page, action);
    },
    route: function(route) {
        var route = route.split('-');
        var page = route[0];
        var action = route[1];
        FrontController.dispatch(page, action);
    },
    dispatchGlobals: function(globals) {
        Y.each(globals, function(route) {
            FrontController.route(route);
        });
    }

};

/**
 * controller/ListController.js;
 */
/**
 * A base controller class, that is to be augmented into other controllers.
 * Atm it only handles deleting of items, and handling clicks on paging
 */

ListController = {
    deleteItem: function(e, url) {
        var id     = e.target.ancestor('tr').get('id').split('-').pop();
        var answer = confirm('Biztosan törölni szeretnéd ezt az elemet?');

        e.halt();
        if (answer) {
            var config = {
                url: url,
                data: { id: id },
                method: 'POST',
                on: { 
                    success: function(id, o) {
                        manager.refresh();
                    }
                }
            };
            var xhr = new Ajax(config);
            xhr.send();
        }
    },
    initPager: function() {
        var pager = Y.one('div.pager');
        if (pager) {
            pager.delegate('click', function(e) {
                var target = e.target;
                if (target.get('nodeName') !== 'A') {
                    target = target.ancestor('a');
                }

                /**
                 * TODO
                 * TabView should handle refreshing with different params
                 */
                var tab = manager.active.tabView.active;
                var page = target.get('href').split('=').pop();
                var params = { page: page };
                manager.active.tabView.changeTab(tab, params);

                e.halt();
            }, 'li');
        }
    }

}

/**
 * controller/FlashController.js;
 */
FlashController = {
    embedSmall: function() {
//        swfobject.embedSWF('/base_sm.swf', 'flash-small', 280, 165, "8", null, {}, { wmode: 'transparent' });
    },
    embedActionFlash: function() {
        swfobject.embedSWF('/flash/action.swf', 'action-flash', 580, 200, "8", null, {}, { wmode: 'transparent' });
    },
    embedHowItWorks: function() {
        var visits    = 1;
        var date      = new Date();
        var params    = {};
        var cookieVal = Y.Cookie.get('mgtvisit', Number);

        if (cookieVal) {
            visits = cookieVal + 1;
        }

        date.setDate(date.getDate() + 7);
        Y.Cookie.set('mgtvisit', visits, { expires: date });

        if (!visits || visits <= 2) {
            params.startAnim = 'ok';
        }
        swfobject.embedSWF('/base.swf', 'flash', 560, 320, "8", null, params, { wmode: 'transparent' });
    },
    embedCalculator: function() {
        swfobject.embedSWF('/kalkulator.swf', 'spare-calculator', 560, 350, "8", null, context.calculator.spare, { wmode: 'transparent' });
    },
    embedPromoBox: function() {
        var flashUrl = context.urls.mini + '/flash/';
        var flashVars = {
            baseUrl: flashUrl,
            file1: 'raiffeisen_bevasarlolista_580x200_v2.jpg',
            duration1: 10,
            link1: '/bevasarlolista',
            file2: 'anim_base.swf',
            link2: '/termekismerteto',
            duration2: 46,
            file3: 'csajok.swf',
            link3: '/extra',
            duration3: 10

        };
        swfobject.embedSWF('/flash/promo_box.swf', 'flash', 580, 200, "8", null, flashVars, { wmode: 'transparent' });
    },
    embedTargetCalculator: function() {
        swfobject.embedSWF('/kalkulator_visszaszamolo.swf', 'target-calculator', 560, 450, "8", null, context.calculator.target, { wmode: 'transparent' });
    },
    embedSmallCalculator: function() {
        swfobject.embedSWF('/kalkulator_sm_plusz.swf', 'smallcalculator', 290, 200, "8", null, context.calculator.spare, { wmode: 'transparent' });
    }
}

/**
 * controller/mini/ContactController.js;
 */
FrontController.controllers.mini.Contact = {
    index: function() {
        var save = Y.one('#save-contact');
        if (save) {
            save.on('click', function(e) {
                e.halt();
                var form = e.target.ancestor('form');
                var fh = new FormHelper(form, form.one('.errors'));
                fh.onComplete = function() {
                    window.location = '/kapcsolat';
                }
                fh.submit();
            });
        }
    }
}

/**
 * controller/mini/CommentsController.js;
 */
FrontController.controllers.mini.Comments = {
    initSending: function() {
        var commentForm = Y.one('#comment-form');
        if (commentForm) {
            commentForm.on('submit', function(e) {
                e.halt();
                var commentText = Y.one('[name=comment-text]').get('value');
                if (Y.Lang.trim(commentText).length > 0) {
                    var config = {
                        method: 'POST',
                        url: '/komment',
                        data: {
                            text: commentText
                        },
                        loading: '#comment-form textarea',
                        on: {
                            success: function(o, id) {
                                var input     = commentForm.one('[name=comment-text]');
                                var container = Y.all('.comment-in-queue, .comment-in-queue-small');

                                input.addClass('hidden');
                                input.set('value', '');
                                container.removeClass('hidden');
                            }
                        }
                    };
                    var xhr = new Ajax(config);
                    xhr.send();
                }
            });
        }
    }
}

/**
 * controller/mini/RegistrationController.js;
 */
FrontController.controllers.mini.Registration = {
    showForm: function() {
        Y.one('#registration-showForm form button').on('click', function(e) {
            var form = e.target.ancestor('form');
            var fh = new FormHelper(form, form.previous('.errors'));

            fh.onComplete = function() {
                window.location = context.urls.mini + '/regisztracio/siker';
            }
            fh.submit();
        });
    }
}


/**
 * controller/mini/CalculatorController.js;
 */
FrontController.controllers.mini.Calculator = {
    spareCalculator: function() {
        this.embedCalculator();
    },
    targetCalculator: function() {
        this.embedTargetCalculator();
    },
    houseHoldCalculator: function() {
        var calc = new HouseHoldCalculator();
        Y.one('.tabs').delegate('click', function(e) {
            var tab = parseInt(e.target.get('innerHTML'));
            calc.changeTab(tab);
        }, 'b');

        Y.one('#calculate').on('click', function(e) {
                calc.calculateFinal(e);
                calc.sendCalculations(e);
            }
        );
        Y.all('.prev-page').on('click', calc.prevPage, calc);
        Y.all('.next-page').on('click', calc.nextPage, calc);
        Y.all('.set').each(function(elem) {
            if (!elem.hasClass('noauto')) {
                elem.delegate('keypress', function(e) {
                    // tab backspace left right delete F5
                    var validKeys = [ 8, 9, 37, 39, 46, 116 ];
                    // numbers
                    var isDigit = e.keyCode >= 48 && e.keyCode <= 57;
                    if (!isDigit && Y.Array.indexOf(validKeys, e.keyCode) < 0) {
                        e.halt();
                    } 
                }, 'input');
                elem.delegate('keyup', function(e) {
                    var box = e.target.ancestor('div.set');
                    calc.calculateBox(box);
                }, 'input');
            }
        })
    }
};

/**
 * controller/mini/StaticController.js;
 */
FrontController.controllers.mini.Static = {
    faq: function() {
        Y.all('.a').each(function(elem, k) {
            if (k != 0) {
                elem.addClass('hidden');
            }
        });
        Y.delegate('click', function(e) {
            var target = e.target;
            if (!target.hasClass('q')) {
                target = target.ancestor('.q');
            }
            var qId = target.get('id').split('-').pop();
            var answer = Y.one('#a-'+qId);
            answer.toggleClass('hidden');
        }, '.faq', '.q');
    },
    promo: function() {
        Y.one('#submit-quiz').on('click', function(e) {
            var points = 0;
            var checks = 0;

            Y.one('#quiz-error').setContent('&nbsp;');
            Y.all('input[type=radio]').each(function(elem) {
                if (elem.get('checked')) {
                    ++checks;
                    var value = elem.ancestor('li').get('className').split('-').pop();
                    points += parseInt(value);
                }
            });
            if (checks < 4) {
                Y.one('#quiz-error').setContent('Ön nem válaszolt minden kérdésre.');
            } else {
                var result;
                var container = Y.one('#quiz');
                Y.each(results, function(v, k) {
                    var boundaries = k.split('-');
                    var lower = boundaries.shift();
                    var upper = boundaries.shift();
                    if (points >= lower && points <= upper) {
                        result = v;
                    }
                });

                var resultElem = Y.Node.create('<p></p>');
                var link = Y.Node.create('<a href="/" class="ribbon-button" id="back-to-front"></a>');
                resultElem.addClass(result.htmlclass);
                resultElem.addClass('girls');
                resultElem.set('innerHTML', result.text);
                container.all('*').each(function(e) {
                    e.remove();
                });
                container.append(resultElem);
                container.append(link);
            }
        });
    },
    commercial: function() {
        if (!Y.one('#video-picker')) {
            return;
        }
        var pagingListener = function() {
            var videos     = Y.all('#video-picker .video-thumb');
            var lastVideo  = videos.item(videos.size() - 1);
            var firstVideo = videos.item(0);

            if (lastVideo.hasClass('hidden')) {
                Y.one('#video-paging-right').setStyle('visibility', 'visible');
            } else {
                Y.one('#video-paging-right').setStyle('visibility', 'hidden');
            }
            if (firstVideo.hasClass('hidden')) {
                Y.one('#video-paging-left').setStyle('visibility', 'visible');
            } else {
                Y.one('#video-paging-left').setStyle('visibility', 'hidden');
            }
        };
        var boundaryFinder = function() {
            var videos = Y.all('#video-picker .video-thumb');
            var lastVisible = -1;
            var firstVisible = 9999;
            videos.each(function(elem, i) {
                if (!elem.hasClass('hidden')) {
                    if (i > lastVisible) {
                        lastVisible = i;
                    }
                    if (i < firstVisible) {
                        firstVisible = i;
                    }
                }
            });
            return { first: firstVisible, last: lastVisible };
        };
        var videos = Y.all('#video-picker .video-thumb');
        if (videos.size() > 4) {
            videos.each(function(v, index) {
                if (index >= 4) {
                    v.addClass('hidden');
                }
            });
        }
        Y.one('#video-paging-right').on('click', function(e) {
            var boundaries = boundaryFinder();
            var nextToLast = videos.item(boundaries.last + 1);
            var first      = videos.item(boundaries.first);

            nextToLast.removeClass('hidden');
            first.addClass('hidden');
            pagingListener();
        });
        Y.one('#video-paging-left').on('click', function(e) {
            var boundaries  = boundaryFinder();
            var beforeFirst = videos.item(boundaries.first - 1);
            var last        = videos.item(boundaries.last);

            last.addClass('hidden');
            beforeFirst.removeClass('hidden');
            pagingListener();
        });
        var width = Y.one('#video-wrapper embed').get('width');
        Y.one('#video-wrapper').setStyle('width', width + 'px');
        pagingListener();
        var q = Y.one('#see-quiz');
        if (q) {
            q.on('click', function(e) {
                window.location = '/extra';
            });
        }
    },
    program: function() {
        this.commercial();
        if (Y.UA.ie == 6) {
            Y.all('a.lightbox').each(function(elem) {
                elem.set('rel', 'lightbox');
            });
        }
        Y.Lightbox.init();
    },
    /*game: function() {
        this.embedGame();
    },*/
    action: function() {
        this.embedActionFlash();
    }


};

/**
 * controller/mini/VoteController.js;
 */
FrontController.controllers.mini.Vote = {
    showVote: function() {
        swfobject.embedSWF('/videoValaszto.swf', 'votemovie', 584, 498, "8", null, {}, { wmode: 'transparent' });
        /*var submit = Y.one('#vote-submit');
        if (submit) {
            submit.on('click', function(e) {
                var voteBox = Y.one('.votebox');
                voteBox.all('input[type=radio]').each(function(elem) {
                    if (elem.get('checked')) {
                        var vote = new Vote(elem.get('value'), voteBox)
                        vote.submit();
                    }
                });
            });
        }*/
    }
};

/**
 * controller/mini/IndexController.js;
 */
FrontController.controllers.mini.Index = {
    init: function() {
        this.embedSmallCalculator();
        this.initFlash();
        this.initNewsletter();
        this.embedPromoBox();
        this.initExternalLinks();
    },
    initNewsletter: function() {
        Y.one('#subscribe a').on('click', function(e) {
            e.halt();
            var email = Y.one('#subscribe input').get('value');
            var url = 'http://www.raiffeisen.hu/rai/raiportal/ep/newsletter/emailRegister.do?email=' + email;
            window.open(url);
        });
    },
    closePopup: function() {
        Y.one('#sharepopup').addClass('hidden');
    },
    share: function() {
        Y.one('#share-send').on('click', function(e) {
            var shareMail = Y.one('#share-mail').get('value');
            var config = {
                url: '/megosztas',
                data: { mailAddress: shareMail },
                method: 'POST',
                on: { 
                    success: function() {
                        FrontController.controllers.mini.Index.closePopup();
                    }
                }
            };
            var xhr = new Ajax(config);
            xhr.send();
        });
/*        Y.one('#sharefriend').on('click', function(e) {
            var popup = Y.one('#sharepopup');
            var x = e.clientX + 'px';
            var y = e.clientY + 'px';
            popup.set('top', y);
            popup.set('left', x);
            popup.toggleClass('hidden');
            e.halt();
        });
*/
    },
    initFlash: function() {
        var small = Y.one('#flash-small');
        if (small) {
            swfobject.embedSWF('/base_sm.swf', 'flash-small', 280, 165, "8", null, {}, { wmode: 'transparent' });
        }
    },
    initExternalLinks: function() {
        Y.all('a[rel="external"]').each(function(elem) {
            elem.set('target', '_blank');
        });
    }

};

/**
 * controller/mini/ProductController.js;
 */
FrontController.controllers.mini.Product = {
    info: function() {
        this.embedHowItWorks();
    },
    iWantToJoin: function() {
        Y.one('input[name=is_client]').on('click', function(e) {
            var checked = e.target.get('checked');
            var container = Y.one('#dependent-fields');
            if (checked) {
                container.removeClass('hidden');
            } else {
                container.addClass('hidden');
            }
        });
        Y.one('.go-button').on('click', function(e) {
            e.halt();
            var phoneOk = true;
            var phoneErrors  = {};

            var l = function(element) {
                return element.get('value').length;
            }

            var country = Y.one('.phone-country');
            var area    = Y.one('.phone-area');
            var phone   = Y.one('.phone');
            var fullPhone = country.get('value') + area.get('value') + phone.get('value');


            var removeError = function(id) {
                var error = Y.one('.errors #' + id);
                if (error) {
                    error.remove();
                }
            }

            if (l(country) < 2) {
                phoneErrors.country = [ 'Az előhívószám legalább 2 karakterből kell hogy álljon' ];
                phoneOk = false;
            } else {
                removeError('country');
            }

            if (l(area) < 2) {
                phoneErrors.area = [ 'A körzetszám legalább 2 karakterből kell hogy álljon' ];
                phoneOk = false;
            } else {
                removeError('area');
            }

            if (fullPhone.length < 7) {
                phoneErrors.phone = [ 'A teljes telefonszám legalább 7 karakterből kell hogy álljon' ];
            }

            var areav = area.get('value');
            if (areav == '20' || areav == '30' || areav == '70') {
                var phone = Y.one('.phone').get('value');
                if (phone.length != 7) {
                    phoneOk = false;
                    phoneErrors.phone = [ 'A telefonszám 7 karakterből kell hogy álljon' ];
                }
            }

            var form      = e.target.ancestor('form');
            var fh        = new FormHelper(form, Y.one('#leadform .errors'));

            fh.onError = function(fh, errors) {
                delete(errors.phone);
                var errors = Y.merge(errors, phoneErrors);
                fh._fillErrors(errors);
            }
            fh.onComplete = function() {
                window.location = '/belepek/elkuldott';
            }
            fh.submit();

        });
        Calendar.setup({
            inputField:	"contact-time",
            button: "open-calendar",		
            ifFormat: "%Y-%m-%d %H:%M:%S",
            showsTime: true,
            firstDay: 1
        });
        Y.one('.phone-country').set('value', '+36');

        var keyValidatorMaker = function(charLim) {
            return function(e) {
                var c = e.charCode;
                // always allow arrows del backspace tab
                if ((c >= 37 && c <= 40) || c == 46 || c == 8 || c == 9) {
                    return;
                }

                // disallow everything but numbers
                if (c < 48 || c > 57) {
                    e.halt();
                    return;
                }

                // if chars >= charLim, reject
                if (e.target.get('value').length >= charLim) {
                    e.halt();
                }
            }
        };

        Y.one('.phone-country').on('keypress', keyValidatorMaker(3));
        Y.one('.phone-area').on('keypress', keyValidatorMaker(2));
        Y.one('.phone').on('keypress', keyValidatorMaker(7));
    },
    joined: function() {
        if (typeof(pageTracker) == 'object') {
            pageTracker._trackPageview('/belepek/elkuldott');
        }
    },
    index: function() {
        FrontController.controllers.mini.Static.faq();
    }
}

/**
 * controller/admin/CommentsController.js;
 */
FrontController.controllers.admin.Comments = {
    listQueue: function() {
        Y.delegate('click', function(e) {
            e.halt();
            var target = e.target;
            var cw = manager.get('comment');
            var id = target.ancestor('tr').get('id').split('-').pop();
            if (target.hasClass('approve')) {
                this.approveComment(id, cw);
            } else if (target.hasClass('delete')) {
                this.deleteItem(e, context.urls.admin + '/comments/delete');
            } else if (target.hasClass('edit')) {
                this.editComment(id, cw);
            }

        }, '#window-comment .body', 'td a', this);
        this.initPager();
    },

    listActive: function() {
        this.listQueue();
        this.initPager();
    },

    approveComment: function(id, cw) {
        var config = {
            url: '/comments/approve',
            method: 'POST',
            data: {
                commentId: id
            },
            on: {
                success: function(id, o) {
                    cw.refetchTab();
                }
            }
        };
        var xhr = new Ajax(config);
        xhr.send();
    },

    editComment: function(id, cw) {
        cw.tabView.changeTab('comments-edit', { id: id });
    },

    edit: function() {
        Y.one('#comment-form').on('submit', function(e) {
            e.halt();
            var form           = e.target;
            var errorContainer = Y.one('#comment-form .errors');
            var helper         = new FormHelper(form, errorContainer, 'Sikeres mentés');
            helper.onComplete  = function(result) {
                var cw = manager.get('comment');
                cw.tabView.changeTab('comments-listQueue');
            }
            helper.submit();
        });
    }

}

/**
 * controller/admin/VideoController.js;
 */
FrontController.controllers.admin.Video = {
    list: function() {
        Y.delegate('click', function(e) {
            e.halt();
            var target = e.target;
            var cw = manager.get('video');
            var id = target.ancestor('tr').get('id').split('-').pop();
            if (target.hasClass('delete')) {
                this.deleteItem(e, context.urls.admin + '/video/delete');
            } else if (target.hasClass('edit')) {
                this.editVideo(id, cw);
            }

        }, '#window-video .body', 'td a', this);
    },

    editVideo: function(id, cw) {
        cw.tabView.changeTab('video-edit', { id: id });
    },

    edit: function() {
        Y.one('#video-form').on('submit', function(e) {
            e.halt();
            var form           = e.target;
            var errorContainer = Y.one('#video-form .errors');
            var helper         = new FormHelper(form, errorContainer, 'Sikeres mentés');
            helper.onComplete  = function(result) {
                var cw = manager.get('video');
                cw.tabView.changeTab('video-list');
            }
            helper.submit();
        });
    }

}


/**
 * controller/admin/FileuploadController.js;
 */
FrontController.controllers.admin.Fileupload = {
    listFiles: function() {
        var showPreview = function(url, text) {
            Y.one('#file-preview img').set('src', url);
            Y.one('#file-preview p:last-child').setContent(text);
        }

        Y.one('#file-list').delegate('click', function(e) {
            e.halt();
            var mce = window.opener.tinyMCE;
            mce.execCommand('mceInsertContent', false, '<img src="' + e.target.get('href') + '"/>');
        }, 'a.add');

        Y.one('#file-list').delegate('mouseover', function(e) {
            if (e.currentTarget.ancestor('tbody')) {
                var url = e.currentTarget.one('td a.add').get('href');
                var text = e.currentTarget.one('td.filename').get('innerHTML');
                showPreview(url, text);
            }
        }, 'tr');

        Y.one('#file-list').delegate('click', function(e) {
            var answer = confirm('Biztosan törölni szeretnéd ezt a fájlt?');
            if (answer) {
                var fname = e.target.ancestor('tr').one('td.filename').get('innerHTML');
                var config = {
                    url: '/fileupload/deleteFile',
                    data: {
                        filename: fname
                    },
                    on: {
                        success: function() {
                            window.location.replace(window.location.pathname);
                        }
                    }
                };
                var xhr = new Ajax(config);
                xhr.send();
            }
        }, '.button.delete');

        Y.one('#upload-form').on('submit', function(e) {
            e.halt();
            var url = e.target.get('action');
            var cfg = {
                method: 'POST',
                form: {
                    id: 'upload-form',
                    upload: true
                },
                on: {
                    complete: function() {
                        window.location.replace(window.location.pathname);
                    }
                }
            }
            Y.io(url, cfg);
        });
    }
}

/**
 * controller/admin/ContentController.js;
 */
FrontController.controllers.admin.Content = {
    mceRegistered: false,
    index: function() {
        Y.delegate('click', function(e) {
            var cw = manager.get('content');
            var tr = e.target.ancestor('tr');
            var id = tr.get('id').split('-').pop();
            var params = { contentId: id };
            e.halt();
            if (e.target.hasClass('edit')) {
                cw.tabView.changeTab('content-edit', params);
            }
            else if (e.target.hasClass('revert')) {
                var answer = confirm('Biztosan vissza szeretnéd állitani ezt a tartalmat az alapállapotra?');
                if (answer) {
                    var config = {
                        url: '/content/revert',
                        method: 'POST',
                        data: { contentId: id },
                        on: {
                            success: function() {
                                manager.get('content').refetchTab();
                            }
                        }
                    };
                    var xhr = new Ajax(config);
                    xhr.send();
                }
            }
        }, '#window-content .body', 'td a');
    
    },
    edit: function() {
        tinyMCE.idCounter = 0;
        if (!this.mceRegistered) {
            var closeHandler = function() {
                tinyMCE.execCommand('mceRemoveControl', true, 'content-html')
            };
            var cw = manager.active.tabView.on('tab:tabChange', closeHandler);
            manager.on('window:close', closeHandler);
            this.mceRegistered = true;
        }
        Y.one('#window-content form').on('submit', function(e) {
            e.halt();
            var form           = e.target;
            var errorContainer = Y.one('#window-content .errors');
            var helper         = new FormHelper(form, errorContainer, 'Sikeres mentés');
            tinyMCE.triggerSave(true,true);
            helper.onComplete = function() {
                var cw = manager.get('content');
                cw.tabView.changeTab('content-index');
            }
            helper.submit();
        });
        tinyMCE.execCommand('mceAddControl', true, 'content-html')
    }
};

/**
 * controller/admin/LeadController.js;
 */
FrontController.controllers.admin.Lead = {
    listLeads: function() {
        this.initPager();
    
        Y.delegate('click', function(e) {
            var target = e.target;
            var cw = manager.get('lead');
            if (target.hasClass('delete')) {
                this.deleteItem(e, context.urls.admin + '/lead/delLead/');
            }
            else if (target.hasClass('show')) {
                var params = { id: target.ancestor('tr').get('id').split('-').pop() };
                cw.tabView.changeTab('lead-show', params);
            }
        }, '#window-lead .body', 'td a', this);
        FrontController.controllers.admin.Calculator.initExcelExport();
    }
}

/**
 * controller/admin/IndexController.js;
 */
FrontController.controllers.admin.Index = {
    init: function() {
       Y.delegate('click', function(e) {
            e.halt();
            var element = e.target;
            if (element.get('nodeName') == 'SPAN') {
                return;
            }
            var id = element.get('id').split('-').pop();
            manager.changeTo(id);
        }, Y.all('.windowchange'), 'li.windowicon');
        Y.delegate('click', function(e) {
            var element = e.target.ancestor('li');
            var id = element.get('id').split('-').pop();
            manager.closeWindow(id);
        }, '#window-list', 'span.close');
        Y.delegate('click', function(e) {
            var target = e.target;
            if (target.test('span.close')) {
                var id = target.ancestor('div.window').get('id').split('-').pop();
                manager.closeWindow(id);
            }
            else {
                if (!target.hasClass('window')) {
                    target = e.target.ancestor('div.window');
                }
                var id = target.get('id').split('-').pop();
                manager.changeTo(id);
            }
        }, '#window-store', '.window');
        window.manager = new windowManager(new windowBar(Y.one('#window-list')));
    }
};

/**
 * controller/admin/VoteController.js;
 */
FrontController.controllers.admin.Vote = {
    index: function() {
        Y.delegate('click', function(e) {
            var cw = manager.get('vote');
            var tr = e.target.ancestor('tr');
            var id = tr.get('id').split('-').pop();
            var params = { voteId: id };
            e.halt();
            if (e.target.hasClass('show')) {
                cw.tabView.changeTab('vote-show', params);
            }
            if (e.target.hasClass('edit')) {
                cw.tabView.changeTab('vote-edit', params);
            }
            if (e.target.hasClass('delete')) {
                this.deleteItem(e, context.urls.admin + '/vote/delete/');
            }
        }, '#window-vote .body', 'td a', this);
    },
    edit: function() {
        var voteId = Y.one('#vote-form-edit input[name=id]').get('value');
        Y.one('#vote-form-edit').on('submit', function(e) {
            e.halt();
            var form           = e.target;
            var errorContainer = Y.one('#vote-form-edit .errors');
            var helper         = new FormHelper(form, errorContainer, 'Sikeres mentés');
            helper.onComplete  = function(result) {
                var cw = manager.get('vote');
                cw.tabView.changeTab('vote-edit', { voteId: result.voteId });
            }
            helper.submit();
        });
        if (voteId) {
            Y.one('#add-new-answer').on('click', function(e) {
                e.halt();
                var answer = prompt('Az új válasz: ');
                if (answer) {
                    var config = {
                        url: context.urls.admin + '/vote/addAnswer/',
                        data: { answer: answer, voteId: voteId },
                        method: 'POST',
                        on: { 
                            success: function() {
                                manager.refresh();
                            }
                        }
                    };
                    var xhr = new Ajax(config);
                    xhr.send();
                }
            });
            Y.delegate('click', function(e) {
                var row = e.target.ancestor('li');
                var id = row.get('id').split('-').pop();
                if (confirm('Biztosan törölni szeretnéd ezt az elemet?')) {
                    var config = {
                        url: context.urls.admin + '/vote/delAnswer/' + id,
                        method: 'POST',
                        on: { 
                            success: function(id, o) {
                                if (o.json.result == true) {
                                    manager.refresh();
                                }
                            }
                        }
                    };
                    var xhr = new Ajax(config);
                    xhr.send();
                }
            }, '#vote-answer-list', 'span.delete');
        }
    }
};

/**
 * controller/admin/UserController.js;
 */
FrontController.controllers.admin.User = {
    index: function() {
        Y.delegate('click', function(e) {
            var cw = manager.get('user');
            var tr = e.target.ancestor('tr');
            var id = tr.get('id').split('-').pop();
            var params = { userId: id };
            e.halt();
            if (e.target.hasClass('edit')) {
                cw.tabView.changeTab('user-editMember', params);
            }
            if (e.target.hasClass('delete')) {
                this.deleteItem(e, context.urls.admin + '/user/delete');
            }
        }, '#window-user .body', 'td a', this);
    },
    editMember: function() {
        Y.one('#window-user button[name=save]').on('click', function(e) {
            e.halt();
            var form = Y.one('#window-user form');
            var fh = new FormHelper(form, Y.one('#window-user .errors'));
            fh.onComplete = function() {
                var cw = manager.get('user');
                cw.tabView.changeTab('user-index');
            }
            fh.submit();
        });
        Y.one('#window-user select').on('change', function(e) {
            var value = e.target.get('value');
            var userId = Y.one('#window-user input[name=id]').get('value');
            var config = {
                url: context.urls.admin + '/user/changeStatus',
                loading: '#window-user form .change-status',
                loadingClass: 'loader-throbber',
                method: 'POST',
                data: { status: value, userId: userId },
                on: {
                    success: function() {
                        // give some feedback
                    }
                }
            }
            var xhr = new Ajax(config);
            xhr.send();
        });
    },
    editAdmin: function() {
        Y.one('#window-user button[name=save]').on('click', function(e) {
            e.halt();
            var form = Y.one('#window-user form');
            var fh = new FormHelper(form, Y.one('#window-user .errors'));
            fh.onComplete = function() {
                var cw = manager.get('user');
                cw.tabView.changeTab('user-listAdmins');
            }
            fh.submit();
        });
    },
    listAdmins: function() {
        var controller = this;
        Y.delegate('click', function(e) {
            var cw = manager.get('user');
            var tr = e.target.ancestor('tr');
            var id = tr.get('id').split('-').pop();
            var params = { userId: id };
            e.halt();
            if (e.target.hasClass('edit')) {
                cw.tabView.changeTab('user-editAdmin', params);
            }
            if (e.target.hasClass('delete')) {
                controller.deleteItem(e, context.urls.admin + '/user/deleteAdmin/');
            }
        }, '#window-user .body', 'td a');
    }
};

/**
 * controller/admin/CalculatorController.js;
 */
FrontController.controllers.admin.Calculator = {
    index: function() {
        Y.one('#window-calculator form').on('submit', function(e) {
            e.halt();
            var form = e.target;
            var fh = new FormHelper(form, form.one('.errors'), 'Sikeres mentés');

            fh.submit();
        });
    },
    listCalculations: function() {
        this.initPager();
        Y.delegate('click', function(e) {
            this.deleteItem(e, context.urls.admin + '/calculator/deleteCalculation');
        }, '#window-calculator .body', 'td a', this);
        FrontController.controllers.admin.Calculator.initExcelExport();
    },

    listHouseholdCalculations: function() {
        this.initExcelExport();
        this.initPager();
        Y.delegate('click', function(e) {
            this.deleteItem(e, context.urls.admin + '/calculator/deleteHouseholdCalculation');
        }, '#window-calculator .body', 'td a', this);
    },

    listTargetCalculations: function() {
        this.initExcelExport();
        this.initPager();
        Y.delegate('click', function(e) {
            this.deleteItem(e, context.urls.admin + '/calculator/deleteTargetCalculation');
        }, '#window-calculator .body', 'td a', this);
    },

    initExcelExport: function() {
        Y.one('.excel-export a').on('click', function(e) {
           e.halt();
           var form = e.target.ancestor('form');
           var url  = e.target.get('href') + '&from=' + form.one('input[name=excel-from]').get('value') + '&to=' + form.one('input[name=excel-to]').get('value');
           window.open(url, 'Excel');
        });
    }
};
