


//MooTools, <http://mootools.net>, My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2008 Valerio Proietti, <http://mad4milk.net>, MIT Style License.

var MooTools={version:"1.2.0",build:""};var Native=function(J){J=J||{};var F=J.afterImplement||function(){};var G=J.generics;G=(G!==false);var H=J.legacy;
var E=J.initialize;var B=J.protect;var A=J.name;var C=E||H;C.constructor=Native;C.$family={name:"native"};if(H&&E){C.prototype=H.prototype;}C.prototype.constructor=C;
if(A){var D=A.toLowerCase();C.prototype.$family={name:D};Native.typize(C,D);}var I=function(M,K,N,L){if(!B||L||!M.prototype[K]){M.prototype[K]=N;}if(G){Native.genericize(M,K,B);
}F.call(M,K,N);return M;};C.implement=function(L,K,N){if(typeof L=="string"){return I(this,L,K,N);}for(var M in L){I(this,M,L[M],K);}return this;};C.alias=function(M,K,N){if(typeof M=="string"){M=this.prototype[M];
if(M){I(this,K,M,N);}}else{for(var L in M){this.alias(L,M[L],K);}}return this;};return C;};Native.implement=function(D,C){for(var B=0,A=D.length;B<A;B++){D[B].implement(C);
}};Native.genericize=function(B,C,A){if((!A||!B[C])&&typeof B.prototype[C]=="function"){B[C]=function(){var D=Array.prototype.slice.call(arguments);return B.prototype[C].apply(D.shift(),D);
};}};Native.typize=function(A,B){if(!A.type){A.type=function(C){return($type(C)===B);};}};Native.alias=function(E,B,A,F){for(var D=0,C=E.length;D<C;D++){E[D].alias(B,A,F);
}};(function(B){for(var A in B){Native.typize(B[A],A);}})({"boolean":Boolean,"native":Native,object:Object});(function(B){for(var A in B){new Native({name:A,initialize:B[A],protect:true});
}})({String:String,Function:Function,Number:Number,Array:Array,RegExp:RegExp,Date:Date});(function(B,A){for(var C=A.length;C--;C){Native.genericize(B,A[C],true);
}return arguments.callee;})(Array,["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice","toString","valueOf","indexOf","lastIndexOf"])(String,["charAt","charCodeAt","concat","indexOf","lastIndexOf","match","replace","search","slice","split","substr","substring","toLowerCase","toUpperCase","valueOf"]);
function $chk(A){return !!(A||A===0);}function $clear(A){clearTimeout(A);clearInterval(A);return null;}function $defined(A){return(A!=undefined);}function $empty(){}function $arguments(A){return function(){return arguments[A];
};}function $lambda(A){return(typeof A=="function")?A:function(){return A;};}function $extend(C,A){for(var B in (A||{})){C[B]=A[B];}return C;}function $unlink(C){var B;
switch($type(C)){case"object":B={};for(var E in C){B[E]=$unlink(C[E]);}break;case"hash":B=$unlink(C.getClean());break;case"array":B=[];for(var D=0,A=C.length;
D<A;D++){B[D]=$unlink(C[D]);}break;default:return C;}return B;}function $merge(){var E={};for(var D=0,A=arguments.length;D<A;D++){var B=arguments[D];if($type(B)!="object"){continue;
}for(var C in B){var G=B[C],F=E[C];E[C]=(F&&$type(G)=="object"&&$type(F)=="object")?$merge(F,G):$unlink(G);}}return E;}function $pick(){for(var B=0,A=arguments.length;
B<A;B++){if(arguments[B]!=undefined){return arguments[B];}}return null;}function $random(B,A){return Math.floor(Math.random()*(A-B+1)+B);}function $splat(B){var A=$type(B);
return(A)?((A!="array"&&A!="arguments")?[B]:B):[];}var $time=Date.now||function(){return new Date().getTime();};function $try(){for(var B=0,A=arguments.length;
B<A;B++){try{return arguments[B]();}catch(C){}}return null;}function $type(A){if(A==undefined){return false;}if(A.$family){return(A.$family.name=="number"&&!isFinite(A))?false:A.$family.name;
}if(A.nodeName){switch(A.nodeType){case 1:return"element";case 3:return(/\S/).test(A.nodeValue)?"textnode":"whitespace";}}else{if(typeof A.length=="number"){if(A.callee){return"arguments";
}else{if(A.item){return"collection";}}}}return typeof A;}var Hash=new Native({name:"Hash",initialize:function(A){if($type(A)=="hash"){A=$unlink(A.getClean());
}for(var B in A){this[B]=A[B];}return this;}});Hash.implement({getLength:function(){var B=0;for(var A in this){if(this.hasOwnProperty(A)){B++;}}return B;
},forEach:function(B,C){for(var A in this){if(this.hasOwnProperty(A)){B.call(C,this[A],A,this);}}},getClean:function(){var B={};for(var A in this){if(this.hasOwnProperty(A)){B[A]=this[A];
}}return B;}});Hash.alias("forEach","each");function $H(A){return new Hash(A);}Array.implement({forEach:function(C,D){for(var B=0,A=this.length;B<A;B++){C.call(D,this[B],B,this);
}}});Array.alias("forEach","each");function $A(C){if(C.item){var D=[];for(var B=0,A=C.length;B<A;B++){D[B]=C[B];}return D;}return Array.prototype.slice.call(C);
}function $each(C,B,D){var A=$type(C);((A=="arguments"||A=="collection"||A=="array")?Array:Hash).each(C,B,D);}var Browser=new Hash({Engine:{name:"unknown",version:""},Platform:{name:(navigator.platform.match(/mac|win|linux/i)||["other"])[0].toLowerCase()},Features:{xpath:!!(document.evaluate),air:!!(window.runtime)},Plugins:{}});
if(window.opera){Browser.Engine={name:"presto",version:(document.getElementsByClassName)?950:925};}else{if(window.ActiveXObject){Browser.Engine={name:"trident",version:(window.XMLHttpRequest)?5:4};
}else{if(!navigator.taintEnabled){Browser.Engine={name:"webkit",version:(Browser.Features.xpath)?420:419};}else{if(document.getBoxObjectFor!=null){Browser.Engine={name:"gecko",version:(document.getElementsByClassName)?19:18};
}}}}Browser.Engine[Browser.Engine.name]=Browser.Engine[Browser.Engine.name+Browser.Engine.version]=true;if(window.orientation!=undefined){Browser.Platform.name="ipod";
}Browser.Platform[Browser.Platform.name]=true;Browser.Request=function(){return $try(function(){return new XMLHttpRequest();},function(){return new ActiveXObject("MSXML2.XMLHTTP");
});};Browser.Features.xhr=!!(Browser.Request());Browser.Plugins.Flash=(function(){var A=($try(function(){return navigator.plugins["Shockwave Flash"].description;
},function(){return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version");})||"0 r0").match(/\d+/g);return{version:parseInt(A[0]||0+"."+A[1]||0),build:parseInt(A[2]||0)};
})();function $exec(B){if(!B){return B;}if(window.execScript){window.execScript(B);}else{var A=document.createElement("script");A.setAttribute("type","text/javascript");
A.text=B;document.head.appendChild(A);document.head.removeChild(A);}return B;}Native.UID=1;var $uid=(Browser.Engine.trident)?function(A){return(A.uid||(A.uid=[Native.UID++]))[0];
}:function(A){return A.uid||(A.uid=Native.UID++);};var Window=new Native({name:"Window",legacy:(Browser.Engine.trident)?null:window.Window,initialize:function(A){$uid(A);
if(!A.Element){A.Element=$empty;if(Browser.Engine.webkit){A.document.createElement("iframe");}A.Element.prototype=(Browser.Engine.webkit)?window["[[DOMElement.prototype]]"]:{};
}return $extend(A,Window.Prototype);},afterImplement:function(B,A){window[B]=Window.Prototype[B]=A;}});Window.Prototype={$family:{name:"window"}};new Window(window);
var Document=new Native({name:"Document",legacy:(Browser.Engine.trident)?null:window.Document,initialize:function(A){$uid(A);A.head=A.getElementsByTagName("head")[0];
A.html=A.getElementsByTagName("html")[0];A.window=A.defaultView||A.parentWindow;if(Browser.Engine.trident4){$try(function(){A.execCommand("BackgroundImageCache",false,true);
});}return $extend(A,Document.Prototype);},afterImplement:function(B,A){document[B]=Document.Prototype[B]=A;}});Document.Prototype={$family:{name:"document"}};
new Document(document);Array.implement({every:function(C,D){for(var B=0,A=this.length;B<A;B++){if(!C.call(D,this[B],B,this)){return false;}}return true;
},filter:function(D,E){var C=[];for(var B=0,A=this.length;B<A;B++){if(D.call(E,this[B],B,this)){C.push(this[B]);}}return C;},clean:function(){return this.filter($defined);
},indexOf:function(C,D){var A=this.length;for(var B=(D<0)?Math.max(0,A+D):D||0;B<A;B++){if(this[B]===C){return B;}}return -1;},map:function(D,E){var C=[];
for(var B=0,A=this.length;B<A;B++){C[B]=D.call(E,this[B],B,this);}return C;},some:function(C,D){for(var B=0,A=this.length;B<A;B++){if(C.call(D,this[B],B,this)){return true;
}}return false;},associate:function(C){var D={},B=Math.min(this.length,C.length);for(var A=0;A<B;A++){D[C[A]]=this[A];}return D;},link:function(C){var A={};
for(var E=0,B=this.length;E<B;E++){for(var D in C){if(C[D](this[E])){A[D]=this[E];delete C[D];break;}}}return A;},contains:function(A,B){return this.indexOf(A,B)!=-1;
},extend:function(C){for(var B=0,A=C.length;B<A;B++){this.push(C[B]);}return this;},getLast:function(){return(this.length)?this[this.length-1]:null;},getRandom:function(){return(this.length)?this[$random(0,this.length-1)]:null;
},include:function(A){if(!this.contains(A)){this.push(A);}return this;},combine:function(C){for(var B=0,A=C.length;B<A;B++){this.include(C[B]);}return this;
},erase:function(B){for(var A=this.length;A--;A){if(this[A]===B){this.splice(A,1);}}return this;},empty:function(){this.length=0;return this;},flatten:function(){var D=[];
for(var B=0,A=this.length;B<A;B++){var C=$type(this[B]);if(!C){continue;}D=D.concat((C=="array"||C=="collection"||C=="arguments")?Array.flatten(this[B]):this[B]);
}return D;},hexToRgb:function(B){if(this.length!=3){return null;}var A=this.map(function(C){if(C.length==1){C+=C;}return C.toInt(16);});return(B)?A:"rgb("+A+")";
},rgbToHex:function(D){if(this.length<3){return null;}if(this.length==4&&this[3]==0&&!D){return"transparent";}var B=[];for(var A=0;A<3;A++){var C=(this[A]-0).toString(16);
B.push((C.length==1)?"0"+C:C);}return(D)?B:"#"+B.join("");}});Function.implement({extend:function(A){for(var B in A){this[B]=A[B];}return this;},create:function(B){var A=this;
B=B||{};return function(D){var C=B.arguments;C=(C!=undefined)?$splat(C):Array.slice(arguments,(B.event)?1:0);if(B.event){C=[D||window.event].extend(C);
}var E=function(){return A.apply(B.bind||null,C);};if(B.delay){return setTimeout(E,B.delay);}if(B.periodical){return setInterval(E,B.periodical);}if(B.attempt){return $try(E);
}return E();};},pass:function(A,B){return this.create({arguments:A,bind:B});},attempt:function(A,B){return this.create({arguments:A,bind:B,attempt:true})();
},bind:function(B,A){return this.create({bind:B,arguments:A});},bindWithEvent:function(B,A){return this.create({bind:B,event:true,arguments:A});},delay:function(B,C,A){return this.create({delay:B,bind:C,arguments:A})();
},periodical:function(A,C,B){return this.create({periodical:A,bind:C,arguments:B})();},run:function(A,B){return this.apply(B,$splat(A));}});Number.implement({limit:function(B,A){return Math.min(A,Math.max(B,this));
},round:function(A){A=Math.pow(10,A||0);return Math.round(this*A)/A;},times:function(B,C){for(var A=0;A<this;A++){B.call(C,A,this);}},toFloat:function(){return parseFloat(this);
},toInt:function(A){return parseInt(this,A||10);}});Number.alias("times","each");(function(B){var A={};B.each(function(C){if(!Number[C]){A[C]=function(){return Math[C].apply(null,[this].concat($A(arguments)));
};}});Number.implement(A);})(["abs","acos","asin","atan","atan2","ceil","cos","exp","floor","log","max","min","pow","sin","sqrt","tan"]);String.implement({test:function(A,B){return((typeof A=="string")?new RegExp(A,B):A).test(this);
},contains:function(A,B){return(B)?(B+this+B).indexOf(B+A+B)>-1:this.indexOf(A)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,"");},clean:function(){return this.replace(/\s+/g," ").trim();
},camelCase:function(){return this.replace(/-\D/g,function(A){return A.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/[A-Z]/g,function(A){return("-"+A.charAt(0).toLowerCase());
});},capitalize:function(){return this.replace(/\b[a-z]/g,function(A){return A.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\$1");
},toInt:function(A){return parseInt(this,A||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(B){var A=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
return(A)?A.slice(1).hexToRgb(B):null;},rgbToHex:function(B){var A=this.match(/\d{1,3}/g);return(A)?A.rgbToHex(B):null;},stripScripts:function(B){var A="";
var C=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(){A+=arguments[1]+"\n";return"";});if(B===true){$exec(A);}else{if($type(B)=="function"){B(A,C);
}}return C;},substitute:function(A,B){return this.replace(B||(/\\?\{([^}]+)\}/g),function(D,C){if(D.charAt(0)=="\\"){return D.slice(1);}return(A[C]!=undefined)?A[C]:"";
});}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(B){for(var A in this){if(this.hasOwnProperty(A)&&this[A]===B){return A;}}return null;
},hasValue:function(A){return(Hash.keyOf(this,A)!==null);},extend:function(A){Hash.each(A,function(C,B){Hash.set(this,B,C);},this);return this;},combine:function(A){Hash.each(A,function(C,B){Hash.include(this,B,C);
},this);return this;},erase:function(A){if(this.hasOwnProperty(A)){delete this[A];}return this;},get:function(A){return(this.hasOwnProperty(A))?this[A]:null;
},set:function(A,B){if(!this[A]||this.hasOwnProperty(A)){this[A]=B;}return this;},empty:function(){Hash.each(this,function(B,A){delete this[A];},this);
return this;},include:function(B,C){var A=this[B];if(A==undefined){this[B]=C;}return this;},map:function(B,C){var A=new Hash;Hash.each(this,function(E,D){A.set(D,B.call(C,E,D,this));
},this);return A;},filter:function(B,C){var A=new Hash;Hash.each(this,function(E,D){if(B.call(C,E,D,this)){A.set(D,E);}},this);return A;},every:function(B,C){for(var A in this){if(this.hasOwnProperty(A)&&!B.call(C,this[A],A)){return false;
}}return true;},some:function(B,C){for(var A in this){if(this.hasOwnProperty(A)&&B.call(C,this[A],A)){return true;}}return false;},getKeys:function(){var A=[];
Hash.each(this,function(C,B){A.push(B);});return A;},getValues:function(){var A=[];Hash.each(this,function(B){A.push(B);});return A;},toQueryString:function(A){var B=[];
Hash.each(this,function(F,E){if(A){E=A+"["+E+"]";}var D;switch($type(F)){case"object":D=Hash.toQueryString(F,E);break;case"array":var C={};F.each(function(H,G){C[G]=H;
});D=Hash.toQueryString(C,E);break;default:D=E+"="+encodeURIComponent(F);}if(F!=undefined){B.push(D);}});return B.join("&");}});Hash.alias({keyOf:"indexOf",hasValue:"contains"});
var Event=new Native({name:"Event",initialize:function(A,F){F=F||window;var K=F.document;A=A||F.event;if(A.$extended){return A;}this.$extended=true;var J=A.type;
var G=A.target||A.srcElement;while(G&&G.nodeType==3){G=G.parentNode;}if(J.test(/key/)){var B=A.which||A.keyCode;var M=Event.Keys.keyOf(B);if(J=="keydown"){var D=B-111;
if(D>0&&D<13){M="f"+D;}}M=M||String.fromCharCode(B).toLowerCase();}else{if(J.match(/(click|mouse|menu)/i)){K=(!K.compatMode||K.compatMode=="CSS1Compat")?K.html:K.body;
var I={x:A.pageX||A.clientX+K.scrollLeft,y:A.pageY||A.clientY+K.scrollTop};var C={x:(A.pageX)?A.pageX-F.pageXOffset:A.clientX,y:(A.pageY)?A.pageY-F.pageYOffset:A.clientY};
if(J.match(/DOMMouseScroll|mousewheel/)){var H=(A.wheelDelta)?A.wheelDelta/120:-(A.detail||0)/3;}var E=(A.which==3)||(A.button==2);var L=null;if(J.match(/over|out/)){switch(J){case"mouseover":L=A.relatedTarget||A.fromElement;
break;case"mouseout":L=A.relatedTarget||A.toElement;}if(!(function(){while(L&&L.nodeType==3){L=L.parentNode;}return true;}).create({attempt:Browser.Engine.gecko})()){L=false;
}}}}return $extend(this,{event:A,type:J,page:I,client:C,rightClick:E,wheel:H,relatedTarget:L,target:G,code:B,key:M,shift:A.shiftKey,control:A.ctrlKey,alt:A.altKey,meta:A.metaKey});
}});Event.Keys=new Hash({enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46});Event.implement({stop:function(){return this.stopPropagation().preventDefault();
},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault();
}else{this.event.returnValue=false;}return this;}});var Class=new Native({name:"Class",initialize:function(B){B=B||{};var A=function(E){for(var D in this){this[D]=$unlink(this[D]);
}for(var F in Class.Mutators){if(!this[F]){continue;}Class.Mutators[F](this,this[F]);delete this[F];}this.constructor=A;if(E===$empty){return this;}var C=(this.initialize)?this.initialize.apply(this,arguments):this;
if(this.options&&this.options.initialize){this.options.initialize.call(this);}return C;};$extend(A,this);A.constructor=Class;A.prototype=B;return A;}});
Class.implement({implement:function(){Class.Mutators.Implements(this.prototype,Array.slice(arguments));return this;}});Class.Mutators={Implements:function(A,B){$splat(B).each(function(C){$extend(A,($type(C)=="class")?new C($empty):C);
});},Extends:function(self,klass){var instance=new klass($empty);delete instance.parent;delete instance.parentOf;for(var key in instance){var current=self[key],previous=instance[key];
if(current==undefined){self[key]=previous;continue;}var ctype=$type(current),ptype=$type(previous);if(ctype!=ptype){continue;}switch(ctype){case"function":if(!arguments.callee.caller){self[key]=eval("("+String(current).replace(/\bthis\.parent\(\s*(\))?/g,function(full,close){return"arguments.callee._parent_.call(this"+(close||", ");
})+")");}self[key]._parent_=previous;break;case"object":self[key]=$merge(previous,current);}}self.parent=function(){return arguments.callee.caller._parent_.apply(this,arguments);
};self.parentOf=function(descendant){return descendant._parent_.apply(this,Array.slice(arguments,1));};}};var Chain=new Class({chain:function(){this.$chain=(this.$chain||[]).extend(arguments);
return this;},callChain:function(){return(this.$chain&&this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){if(this.$chain){this.$chain.empty();
}return this;}});var Events=new Class({addEvent:function(C,B,A){C=Events.removeOn(C);if(B!=$empty){this.$events=this.$events||{};this.$events[C]=this.$events[C]||[];
this.$events[C].include(B);if(A){B.internal=true;}}return this;},addEvents:function(A){for(var B in A){this.addEvent(B,A[B]);}return this;},fireEvent:function(C,B,A){C=Events.removeOn(C);
if(!this.$events||!this.$events[C]){return this;}this.$events[C].each(function(D){D.create({bind:this,delay:A,"arguments":B})();},this);return this;},removeEvent:function(B,A){B=Events.removeOn(B);
if(!this.$events||!this.$events[B]){return this;}if(!A.internal){this.$events[B].erase(A);}return this;},removeEvents:function(C){for(var D in this.$events){if(C&&C!=D){continue;
}var B=this.$events[D];for(var A=B.length;A--;A){this.removeEvent(D,B[A]);}}return this;}});Events.removeOn=function(A){return A.replace(/^on([A-Z])/,function(B,C){return C.toLowerCase();
});};var Options=new Class({setOptions:function(){this.options=$merge.run([this.options].extend(arguments));if(!this.addEvent){return this;}for(var A in this.options){if($type(this.options[A])!="function"||!(/^on[A-Z]/).test(A)){continue;
}this.addEvent(A,this.options[A]);delete this.options[A];}return this;}});Document.implement({newElement:function(A,B){if(Browser.Engine.trident&&B){["name","type","checked"].each(function(C){if(!B[C]){return ;
}A+=" "+C+'="'+B[C]+'"';if(C!="checked"){delete B[C];}});A="<"+A+">";}return $.element(this.createElement(A)).set(B);},newTextNode:function(A){return this.createTextNode(A);
},getDocument:function(){return this;},getWindow:function(){return this.defaultView||this.parentWindow;},purge:function(){var C=this.getElementsByTagName("*");
for(var B=0,A=C.length;B<A;B++){Browser.freeMem(C[B]);}}});var Element=new Native({name:"Element",legacy:window.Element,initialize:function(A,B){var C=Element.Constructors.get(A);
if(C){return C(B);}if(typeof A=="string"){return document.newElement(A,B);}return $(A).set(B);},afterImplement:function(A,B){if(!Array[A]){Elements.implement(A,Elements.multi(A));
}Element.Prototype[A]=B;}});Element.Prototype={$family:{name:"element"}};Element.Constructors=new Hash;var IFrame=new Native({name:"IFrame",generics:false,initialize:function(){var E=Array.link(arguments,{properties:Object.type,iframe:$defined});
var C=E.properties||{};var B=$(E.iframe)||false;var D=C.onload||$empty;delete C.onload;C.id=C.name=$pick(C.id,C.name,B.id,B.name,"IFrame_"+$time());B=new Element(B||"iframe",C);
var A=function(){var F=$try(function(){return B.contentWindow.location.host;});if(F&&F==window.location.host){var H=new Window(B.contentWindow);var G=new Document(B.contentWindow.document);
$extend(H.Element.prototype,Element.Prototype);}D.call(B.contentWindow,B.contentWindow.document);};(!window.frames[C.id])?B.addListener("load",A):A();return B;
}});var Elements=new Native({initialize:function(F,B){B=$extend({ddup:true,cash:true},B);F=F||[];if(B.ddup||B.cash){var G={},E=[];for(var C=0,A=F.length;
C<A;C++){var D=$.element(F[C],!B.cash);if(B.ddup){if(G[D.uid]){continue;}G[D.uid]=true;}E.push(D);}F=E;}return(B.cash)?$extend(F,this):F;}});Elements.implement({filter:function(A,B){if(!A){return this;
}return new Elements(Array.filter(this,(typeof A=="string")?function(C){return C.match(A);}:A,B));}});Elements.multi=function(A){return function(){var B=[];
var F=true;for(var D=0,C=this.length;D<C;D++){var E=this[D][A].apply(this[D],arguments);B.push(E);if(F){F=($type(E)=="element");}}return(F)?new Elements(B):B;
};};Window.implement({$:function(B,C){if(B&&B.$family&&B.uid){return B;}var A=$type(B);return($[A])?$[A](B,C,this.document):null;},$$:function(A){if(arguments.length==1&&typeof A=="string"){return this.document.getElements(A);
}var F=[];var C=Array.flatten(arguments);for(var D=0,B=C.length;D<B;D++){var E=C[D];switch($type(E)){case"element":E=[E];break;case"string":E=this.document.getElements(E,true);
break;default:E=false;}if(E){F.extend(E);}}return new Elements(F);},getDocument:function(){return this.document;},getWindow:function(){return this;}});
$.string=function(C,B,A){C=A.getElementById(C);return(C)?$.element(C,B):null;};$.element=function(A,D){$uid(A);if(!D&&!A.$family&&!(/^object|embed$/i).test(A.tagName)){var B=Element.Prototype;
for(var C in B){A[C]=B[C];}}return A;};$.object=function(B,C,A){if(B.toElement){return $.element(B.toElement(A),C);}return null;};$.textnode=$.whitespace=$.window=$.document=$arguments(0);
Native.implement([Element,Document],{getElement:function(A,B){return $(this.getElements(A,true)[0]||null,B);},getElements:function(A,D){A=A.split(",");
var C=[];var B=(A.length>1);A.each(function(E){var F=this.getElementsByTagName(E.trim());(B)?C.extend(F):C=F;},this);return new Elements(C,{ddup:B,cash:!D});
}});Element.Storage={get:function(A){return(this[A]||(this[A]={}));}};Element.Inserters=new Hash({before:function(B,A){if(A.parentNode){A.parentNode.insertBefore(B,A);
}},after:function(B,A){if(!A.parentNode){return ;}var C=A.nextSibling;(C)?A.parentNode.insertBefore(B,C):A.parentNode.appendChild(B);},bottom:function(B,A){A.appendChild(B);
},top:function(B,A){var C=A.firstChild;(C)?A.insertBefore(B,C):A.appendChild(B);}});Element.Inserters.inside=Element.Inserters.bottom;Element.Inserters.each(function(C,B){var A=B.capitalize();
Element.implement("inject"+A,function(D){C(this,$(D,true));return this;});Element.implement("grab"+A,function(D){C($(D,true),this);return this;});});Element.implement({getDocument:function(){return this.ownerDocument;
},getWindow:function(){return this.ownerDocument.getWindow();},getElementById:function(D,C){var B=this.ownerDocument.getElementById(D);if(!B){return null;
}for(var A=B.parentNode;A!=this;A=A.parentNode){if(!A){return null;}}return $.element(B,C);},set:function(D,B){switch($type(D)){case"object":for(var C in D){this.set(C,D[C]);
}break;case"string":var A=Element.Properties.get(D);(A&&A.set)?A.set.apply(this,Array.slice(arguments,1)):this.setProperty(D,B);}return this;},get:function(B){var A=Element.Properties.get(B);
return(A&&A.get)?A.get.apply(this,Array.slice(arguments,1)):this.getProperty(B);},erase:function(B){var A=Element.Properties.get(B);(A&&A.erase)?A.erase.apply(this,Array.slice(arguments,1)):this.removeProperty(B);
return this;},match:function(A){return(!A||Element.get(this,"tag")==A);},inject:function(B,A){Element.Inserters.get(A||"bottom")(this,$(B,true));return this;
},wraps:function(B,A){B=$(B,true);return this.replaces(B).grab(B,A);},grab:function(B,A){Element.Inserters.get(A||"bottom")($(B,true),this);return this;
},appendText:function(B,A){return this.grab(this.getDocument().newTextNode(B),A);},adopt:function(){Array.flatten(arguments).each(function(A){A=$(A,true);
if(A){this.appendChild(A);}},this);return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;},clone:function(D,C){switch($type(this)){case"element":var H={};
for(var G=0,E=this.attributes.length;G<E;G++){var B=this.attributes[G],L=B.nodeName.toLowerCase();if(Browser.Engine.trident&&(/input/i).test(this.tagName)&&(/width|height/).test(L)){continue;
}var K=(L=="style"&&this.style)?this.style.cssText:B.nodeValue;if(!$chk(K)||L=="uid"||(L=="id"&&!C)){continue;}if(K!="inherit"&&["string","number"].contains($type(K))){H[L]=K;
}}var J=new Element(this.nodeName.toLowerCase(),H);if(D!==false){for(var I=0,F=this.childNodes.length;I<F;I++){var A=Element.clone(this.childNodes[I],true,C);
if(A){J.grab(A);}}}return J;case"textnode":return document.newTextNode(this.nodeValue);}return null;},replaces:function(A){A=$(A,true);A.parentNode.replaceChild(this,A);
return this;},hasClass:function(A){return this.className.contains(A," ");},addClass:function(A){if(!this.hasClass(A)){this.className=(this.className+" "+A).clean();
}return this;},removeClass:function(A){this.className=this.className.replace(new RegExp("(^|\\s)"+A+"(?:\\s|$)"),"$1").clean();return this;},toggleClass:function(A){return this.hasClass(A)?this.removeClass(A):this.addClass(A);
},getComputedStyle:function(B){if(this.currentStyle){return this.currentStyle[B.camelCase()];}var A=this.getWindow().getComputedStyle(this,null);return(A)?A.getPropertyValue([B.hyphenate()]):null;
},empty:function(){$A(this.childNodes).each(function(A){Browser.freeMem(A);Element.empty(A);Element.dispose(A);},this);return this;},destroy:function(){Browser.freeMem(this.empty().dispose());
return null;},getSelected:function(){return new Elements($A(this.options).filter(function(A){return A.selected;}));},toQueryString:function(){var A=[];
this.getElements("input, select, textarea").each(function(B){if(!B.name||B.disabled){return ;}var C=(B.tagName.toLowerCase()=="select")?Element.getSelected(B).map(function(D){return D.value;
}):((B.type=="radio"||B.type=="checkbox")&&!B.checked)?null:B.value;$splat(C).each(function(D){if(D){A.push(B.name+"="+encodeURIComponent(D));}});});return A.join("&");
},getProperty:function(C){var B=Element.Attributes,A=B.Props[C];var D=(A)?this[A]:this.getAttribute(C,2);return(B.Bools[C])?!!D:(A)?D:D||null;},getProperties:function(){var A=$A(arguments);
return A.map(function(B){return this.getProperty(B);},this).associate(A);},setProperty:function(D,E){var C=Element.Attributes,B=C.Props[D],A=$defined(E);
if(B&&C.Bools[D]){E=(E||!A)?true:false;}else{if(!A){return this.removeProperty(D);}}(B)?this[B]=E:this.setAttribute(D,E);return this;},setProperties:function(A){for(var B in A){this.setProperty(B,A[B]);
}return this;},removeProperty:function(D){var C=Element.Attributes,B=C.Props[D],A=(B&&C.Bools[D]);(B)?this[B]=(A)?false:"":this.removeAttribute(D);return this;
},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;}});(function(){var A=function(D,B,I,C,F,H){var E=D[I||B];var G=[];
while(E){if(E.nodeType==1&&(!C||Element.match(E,C))){G.push(E);if(!F){break;}}E=E[B];}return(F)?new Elements(G,{ddup:false,cash:!H}):$(G[0],H);};Element.implement({getPrevious:function(B,C){return A(this,"previousSibling",null,B,false,C);
},getAllPrevious:function(B,C){return A(this,"previousSibling",null,B,true,C);},getNext:function(B,C){return A(this,"nextSibling",null,B,false,C);},getAllNext:function(B,C){return A(this,"nextSibling",null,B,true,C);
},getFirst:function(B,C){return A(this,"nextSibling","firstChild",B,false,C);},getLast:function(B,C){return A(this,"previousSibling","lastChild",B,false,C);
},getParent:function(B,C){return A(this,"parentNode",null,B,false,C);},getParents:function(B,C){return A(this,"parentNode",null,B,true,C);},getChildren:function(B,C){return A(this,"nextSibling","firstChild",B,true,C);
},hasChild:function(B){B=$(B,true);return(!!B&&$A(this.getElementsByTagName(B.tagName)).contains(B));}});})();Element.Properties=new Hash;Element.Properties.style={set:function(A){this.style.cssText=A;
},get:function(){return this.style.cssText;},erase:function(){this.style.cssText="";}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase();
}};Element.Properties.href={get:function(){return(!this.href)?null:this.href.replace(new RegExp("^"+document.location.protocol+"//"+document.location.host),"");
}};Element.Properties.html={set:function(){return this.innerHTML=Array.flatten(arguments).join("");}};Native.implement([Element,Window,Document],{addListener:function(B,A){if(this.addEventListener){this.addEventListener(B,A,false);
}else{this.attachEvent("on"+B,A);}return this;},removeListener:function(B,A){if(this.removeEventListener){this.removeEventListener(B,A,false);}else{this.detachEvent("on"+B,A);
}return this;},retrieve:function(B,A){var D=Element.Storage.get(this.uid);var C=D[B];if($defined(A)&&!$defined(C)){C=D[B]=A;}return $pick(C);},store:function(B,A){var C=Element.Storage.get(this.uid);
C[B]=A;return this;},eliminate:function(A){var B=Element.Storage.get(this.uid);delete B[A];return this;}});Element.Attributes=new Hash({Props:{html:"innerHTML","class":"className","for":"htmlFor",text:(Browser.Engine.trident)?"innerText":"textContent"},Bools:["compact","nowrap","ismap","declare","noshade","checked","disabled","readonly","multiple","selected","noresize","defer"],Camels:["value","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","maxLength","readOnly","rowSpan","tabIndex","useMap"]});
Browser.freeMem=function(A){if(!A){return ;}if(Browser.Engine.trident&&(/object/i).test(A.tagName)){for(var B in A){if(typeof A[B]=="function"){A[B]=$empty;
}}Element.dispose(A);}if(A.uid&&A.removeEvents){A.removeEvents();}};(function(B){var C=B.Bools,A=B.Camels;B.Bools=C=C.associate(C);Hash.extend(Hash.combine(B.Props,C),A.associate(A.map(function(D){return D.toLowerCase();
})));B.erase("Camels");})(Element.Attributes);window.addListener("unload",function(){window.removeListener("unload",arguments.callee);document.purge();
if(Browser.Engine.trident){CollectGarbage();}});Element.Properties.events={set:function(A){this.addEvents(A);}};Native.implement([Element,Window,Document],{addEvent:function(E,G){var H=this.retrieve("events",{});
H[E]=H[E]||{keys:[],values:[]};if(H[E].keys.contains(G)){return this;}H[E].keys.push(G);var F=E,A=Element.Events.get(E),C=G,I=this;if(A){if(A.onAdd){A.onAdd.call(this,G);
}if(A.condition){C=function(J){if(A.condition.call(this,J)){return G.call(this,J);}return false;};}F=A.base||F;}var D=function(){return G.call(I);};var B=Element.NativeEvents[F]||0;
if(B){if(B==2){D=function(J){J=new Event(J,I.getWindow());if(C.call(I,J)===false){J.stop();}};}this.addListener(F,D);}H[E].values.push(D);return this;},removeEvent:function(D,C){var B=this.retrieve("events");
if(!B||!B[D]){return this;}var G=B[D].keys.indexOf(C);if(G==-1){return this;}var A=B[D].keys.splice(G,1)[0];var F=B[D].values.splice(G,1)[0];var E=Element.Events.get(D);
if(E){if(E.onRemove){E.onRemove.call(this,C);}D=E.base||D;}return(Element.NativeEvents[D])?this.removeListener(D,F):this;},addEvents:function(A){for(var B in A){this.addEvent(B,A[B]);
}return this;},removeEvents:function(B){var A=this.retrieve("events");if(!A){return this;}if(!B){for(var C in A){this.removeEvents(C);}A=null;}else{if(A[B]){while(A[B].keys[0]){this.removeEvent(B,A[B].keys[0]);
}A[B]=null;}}return this;},fireEvent:function(D,B,A){var C=this.retrieve("events");if(!C||!C[D]){return this;}C[D].keys.each(function(E){E.create({bind:this,delay:A,"arguments":B})();
},this);return this;},cloneEvents:function(D,A){D=$(D);var C=D.retrieve("events");if(!C){return this;}if(!A){for(var B in C){this.cloneEvents(D,B);}}else{if(C[A]){C[A].keys.each(function(E){this.addEvent(A,E);
},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,load:1,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1};
(function(){var A=function(B){var C=B.relatedTarget;if(C==undefined){return true;}if(C===false){return false;}return($type(this)!="document"&&C!=this&&C.prefix!="xul"&&!this.hasChild(C));
};Element.Events=new Hash({mouseenter:{base:"mouseover",condition:A},mouseleave:{base:"mouseout",condition:A},mousewheel:{base:(Browser.Engine.gecko)?"DOMMouseScroll":"mousewheel"}});
})();Element.Properties.styles={set:function(A){this.setStyles(A);}};Element.Properties.opacity={set:function(A,B){if(!B){if(A==0){if(this.style.visibility!="hidden"){this.style.visibility="hidden";
}}else{if(this.style.visibility!="visible"){this.style.visibility="visible";}}}if(!this.currentStyle||!this.currentStyle.hasLayout){this.style.zoom=1;}if(Browser.Engine.trident){this.style.filter=(A==1)?"":"alpha(opacity="+A*100+")";
}this.style.opacity=A;this.store("opacity",A);},get:function(){return this.retrieve("opacity",1);}};Element.implement({setOpacity:function(A){return this.set("opacity",A,true);
},getOpacity:function(){return this.get("opacity");},setStyle:function(B,A){switch(B){case"opacity":return this.set("opacity",parseFloat(A));case"float":B=(Browser.Engine.trident)?"styleFloat":"cssFloat";
}B=B.camelCase();if($type(A)!="string"){var C=(Element.Styles.get(B)||"@").split(" ");A=$splat(A).map(function(E,D){if(!C[D]){return"";}return($type(E)=="number")?C[D].replace("@",Math.round(E)):E;
}).join(" ");}else{if(A==String(Number(A))){A=Math.round(A);}}this.style[B]=A;return this;},getStyle:function(G){switch(G){case"opacity":return this.get("opacity");
case"float":G=(Browser.Engine.trident)?"styleFloat":"cssFloat";}G=G.camelCase();var A=this.style[G];if(!$chk(A)){A=[];for(var F in Element.ShortStyles){if(G!=F){continue;
}for(var E in Element.ShortStyles[F]){A.push(this.getStyle(E));}return A.join(" ");}A=this.getComputedStyle(G);}if(A){A=String(A);var C=A.match(/rgba?\([\d\s,]+\)/);
if(C){A=A.replace(C[0],C[0].rgbToHex());}}if(Browser.Engine.presto||(Browser.Engine.trident&&!$chk(parseInt(A)))){if(G.test(/^(height|width)$/)){var B=(G=="width")?["left","right"]:["top","bottom"],D=0;
B.each(function(H){D+=this.getStyle("border-"+H+"-width").toInt()+this.getStyle("padding-"+H).toInt();},this);return this["offset"+G.capitalize()]-D+"px";
}if(Browser.Engine.presto&&String(A).test("px")){return A;}if(G.test(/(border(.+)Width|margin|padding)/)){return"0px";}}return A;},setStyles:function(B){for(var A in B){this.setStyle(A,B[A]);
}return this;},getStyles:function(){var A={};Array.each(arguments,function(B){A[B]=this.getStyle(B);},this);return A;}});Element.Styles=new Hash({left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"});
Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(G){var F=Element.ShortStyles;
var B=Element.Styles;["margin","padding"].each(function(H){var I=H+G;F[H][I]=B[I]="@px";});var E="border"+G;F.border[E]=B[E]="@px @ rgb(@, @, @)";var D=E+"Width",A=E+"Style",C=E+"Color";
F[E]={};F.borderWidth[D]=F[E][D]=B[D]="@px";F.borderStyle[A]=F[E][A]=B[A]="@";F.borderColor[C]=F[E][C]=B[C]="rgb(@, @, @)";});(function(){Element.implement({scrollTo:function(H,I){if(B(this)){this.getWindow().scrollTo(H,I);
}else{this.scrollLeft=H;this.scrollTop=I;}return this;},getSize:function(){if(B(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight};
},getScrollSize:function(){if(B(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(B(this)){return this.getWindow().getScroll();
}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var I=this,H={x:0,y:0};while(I&&!B(I)){H.x+=I.scrollLeft;H.y+=I.scrollTop;I=I.parentNode;
}return H;},getOffsetParent:function(){var H=this;if(B(H)){return null;}if(!Browser.Engine.trident){return H.offsetParent;}while((H=H.parentNode)&&!B(H)){if(D(H,"position")!="static"){return H;
}}return null;},getOffsets:function(){var I=this,H={x:0,y:0};if(B(this)){return H;}while(I&&!B(I)){H.x+=I.offsetLeft;H.y+=I.offsetTop;if(Browser.Engine.gecko){if(!F(I)){H.x+=C(I);
H.y+=G(I);}var J=I.parentNode;if(J&&D(J,"overflow")!="visible"){H.x+=C(J);H.y+=G(J);}}else{if(I!=this&&(Browser.Engine.trident||Browser.Engine.webkit)){H.x+=C(I);
H.y+=G(I);}}I=I.offsetParent;if(Browser.Engine.trident){while(I&&!I.currentStyle.hasLayout){I=I.offsetParent;}}}if(Browser.Engine.gecko&&!F(this)){H.x-=C(this);
H.y-=G(this);}return H;},getPosition:function(K){if(B(this)){return{x:0,y:0};}var L=this.getOffsets(),I=this.getScrolls();var H={x:L.x-I.x,y:L.y-I.y};var J=(K&&(K=$(K)))?K.getPosition():{x:0,y:0};
return{x:H.x-J.x,y:H.y-J.y};},getCoordinates:function(J){if(B(this)){return this.getWindow().getCoordinates();}var H=this.getPosition(J),I=this.getSize();
var K={left:H.x,top:H.y,width:I.x,height:I.y};K.right=K.left+K.width;K.bottom=K.top+K.height;return K;},computePosition:function(H){return{left:H.x-E(this,"margin-left"),top:H.y-E(this,"margin-top")};
},position:function(H){return this.setStyles(this.computePosition(H));}});Native.implement([Document,Window],{getSize:function(){var I=this.getWindow();
if(Browser.Engine.presto||Browser.Engine.webkit){return{x:I.innerWidth,y:I.innerHeight};}var H=A(this);return{x:H.clientWidth,y:H.clientHeight};},getScroll:function(){var I=this.getWindow();
var H=A(this);return{x:I.pageXOffset||H.scrollLeft,y:I.pageYOffset||H.scrollTop};},getScrollSize:function(){var I=A(this);var H=this.getSize();return{x:Math.max(I.scrollWidth,H.x),y:Math.max(I.scrollHeight,H.y)};
},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var H=this.getSize();return{top:0,left:0,bottom:H.y,right:H.x,height:H.y,width:H.x};
}});var D=Element.getComputedStyle;function E(H,I){return D(H,I).toInt()||0;}function F(H){return D(H,"-moz-box-sizing")=="border-box";}function G(H){return E(H,"border-top-width");
}function C(H){return E(H,"border-left-width");}function B(H){return(/^(?:body|html)$/i).test(H.tagName);}function A(H){var I=H.getDocument();return(!I.compatMode||I.compatMode=="CSS1Compat")?I.html:I.body;
}})();Native.implement([Window,Document,Element],{getHeight:function(){return this.getSize().y;},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;
},getScrollLeft:function(){return this.getScroll().x;},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;
},getTop:function(){return this.getPosition().y;},getLeft:function(){return this.getPosition().x;}});Native.implement([Document,Element],{getElements:function(H,G){H=H.split(",");
var C,E={};for(var D=0,B=H.length;D<B;D++){var A=H[D],F=Selectors.Utils.search(this,A,E);if(D!=0&&F.item){F=$A(F);}C=(D==0)?F:(C.item)?$A(C).concat(F):C.concat(F);
}return new Elements(C,{ddup:(H.length>1),cash:!G});}});Element.implement({match:function(B){if(!B){return true;}var D=Selectors.Utils.parseTagAndID(B);
var A=D[0],E=D[1];if(!Selectors.Filters.byID(this,E)||!Selectors.Filters.byTag(this,A)){return false;}var C=Selectors.Utils.parseSelector(B);return(C)?Selectors.Utils.filter(this,C,{}):true;
}});var Selectors={Cache:{nth:{},parsed:{}}};Selectors.RegExps={id:(/#([\w-]+)/),tag:(/^(\w+|\*)/),quick:(/^(\w+|\*)$/),splitter:(/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),combined:(/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)["']?(.*?)["']?)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)};
Selectors.Utils={chk:function(B,C){if(!C){return true;}var A=$uid(B);if(!C[A]){return C[A]=true;}return false;},parseNthArgument:function(F){if(Selectors.Cache.nth[F]){return Selectors.Cache.nth[F];
}var C=F.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);if(!C){return false;}var E=parseInt(C[1]);var B=(E||E===0)?E:1;var D=C[2]||false;var A=parseInt(C[3])||0;
if(B!=0){A--;while(A<1){A+=B;}while(A>=B){A-=B;}}else{B=A;D="index";}switch(D){case"n":C={a:B,b:A,special:"n"};break;case"odd":C={a:2,b:0,special:"n"};
break;case"even":C={a:2,b:1,special:"n"};break;case"first":C={a:0,special:"index"};break;case"last":C={special:"last-child"};break;case"only":C={special:"only-child"};
break;default:C={a:(B-1),special:"index"};}return Selectors.Cache.nth[F]=C;},parseSelector:function(E){if(Selectors.Cache.parsed[E]){return Selectors.Cache.parsed[E];
}var D,H={classes:[],pseudos:[],attributes:[]};while((D=Selectors.RegExps.combined.exec(E))){var I=D[1],G=D[2],F=D[3],B=D[4],C=D[5],J=D[6];if(I){H.classes.push(I);
}else{if(C){var A=Selectors.Pseudo.get(C);if(A){H.pseudos.push({parser:A,argument:J});}else{H.attributes.push({name:C,operator:"=",value:J});}}else{if(G){H.attributes.push({name:G,operator:F,value:B});
}}}}if(!H.classes.length){delete H.classes;}if(!H.attributes.length){delete H.attributes;}if(!H.pseudos.length){delete H.pseudos;}if(!H.classes&&!H.attributes&&!H.pseudos){H=null;
}return Selectors.Cache.parsed[E]=H;},parseTagAndID:function(B){var A=B.match(Selectors.RegExps.tag);var C=B.match(Selectors.RegExps.id);return[(A)?A[1]:"*",(C)?C[1]:false];
},filter:function(F,C,E){var D;if(C.classes){for(D=C.classes.length;D--;D){var G=C.classes[D];if(!Selectors.Filters.byClass(F,G)){return false;}}}if(C.attributes){for(D=C.attributes.length;
D--;D){var B=C.attributes[D];if(!Selectors.Filters.byAttribute(F,B.name,B.operator,B.value)){return false;}}}if(C.pseudos){for(D=C.pseudos.length;D--;D){var A=C.pseudos[D];
if(!Selectors.Filters.byPseudo(F,A.parser,A.argument,E)){return false;}}}return true;},getByTagAndID:function(B,A,D){if(D){var C=(B.getElementById)?B.getElementById(D,true):Element.getElementById(B,D,true);
return(C&&Selectors.Filters.byTag(C,A))?[C]:[];}else{return B.getElementsByTagName(A);}},search:function(J,I,O){var B=[];var C=I.trim().replace(Selectors.RegExps.splitter,function(Z,Y,X){B.push(Y);
return":)"+X;}).split(":)");var K,F,E,V;for(var U=0,Q=C.length;U<Q;U++){var T=C[U];if(U==0&&Selectors.RegExps.quick.test(T)){K=J.getElementsByTagName(T);
continue;}var A=B[U-1];var L=Selectors.Utils.parseTagAndID(T);var W=L[0],M=L[1];if(U==0){K=Selectors.Utils.getByTagAndID(J,W,M);}else{var D={},H=[];for(var S=0,R=K.length;
S<R;S++){H=Selectors.Getters[A](H,K[S],W,M,D);}K=H;}var G=Selectors.Utils.parseSelector(T);if(G){E=[];for(var P=0,N=K.length;P<N;P++){V=K[P];if(Selectors.Utils.filter(V,G,O)){E.push(V);
}}K=E;}}return K;}};Selectors.Getters={" ":function(H,G,I,A,E){var D=Selectors.Utils.getByTagAndID(G,I,A);for(var C=0,B=D.length;C<B;C++){var F=D[C];if(Selectors.Utils.chk(F,E)){H.push(F);
}}return H;},">":function(H,G,I,A,F){var C=Selectors.Utils.getByTagAndID(G,I,A);for(var E=0,D=C.length;E<D;E++){var B=C[E];if(B.parentNode==G&&Selectors.Utils.chk(B,F)){H.push(B);
}}return H;},"+":function(C,B,A,E,D){while((B=B.nextSibling)){if(B.nodeType==1){if(Selectors.Utils.chk(B,D)&&Selectors.Filters.byTag(B,A)&&Selectors.Filters.byID(B,E)){C.push(B);
}break;}}return C;},"~":function(C,B,A,E,D){while((B=B.nextSibling)){if(B.nodeType==1){if(!Selectors.Utils.chk(B,D)){break;}if(Selectors.Filters.byTag(B,A)&&Selectors.Filters.byID(B,E)){C.push(B);
}}}return C;}};Selectors.Filters={byTag:function(B,A){return(A=="*"||(B.tagName&&B.tagName.toLowerCase()==A));},byID:function(A,B){return(!B||(A.id&&A.id==B));
},byClass:function(B,A){return(B.className&&B.className.contains(A," "));},byPseudo:function(A,D,C,B){return D.call(A,C,B);},byAttribute:function(C,D,B,E){var A=Element.prototype.getProperty.call(C,D);
if(!A){return false;}if(!B||E==undefined){return true;}switch(B){case"=":return(A==E);case"*=":return(A.contains(E));case"^=":return(A.substr(0,E.length)==E);
case"$=":return(A.substr(A.length-E.length)==E);case"!=":return(A!=E);case"~=":return A.contains(E," ");case"|=":return A.contains(E,"-");}return false;
}};Selectors.Pseudo=new Hash({empty:function(){return !(this.innerText||this.textContent||"").length;},not:function(A){return !Element.match(this,A);},contains:function(A){return(this.innerText||this.textContent||"").contains(A);
},"first-child":function(){return Selectors.Pseudo.index.call(this,0);},"last-child":function(){var A=this;while((A=A.nextSibling)){if(A.nodeType==1){return false;
}}return true;},"only-child":function(){var B=this;while((B=B.previousSibling)){if(B.nodeType==1){return false;}}var A=this;while((A=A.nextSibling)){if(A.nodeType==1){return false;
}}return true;},"nth-child":function(G,E){G=(G==undefined)?"n":G;var C=Selectors.Utils.parseNthArgument(G);if(C.special!="n"){return Selectors.Pseudo[C.special].call(this,C.a,E);
}var F=0;E.positions=E.positions||{};var D=$uid(this);if(!E.positions[D]){var B=this;while((B=B.previousSibling)){if(B.nodeType!=1){continue;}F++;var A=E.positions[$uid(B)];
if(A!=undefined){F=A+F;break;}}E.positions[D]=F;}return(E.positions[D]%C.a==C.b);},index:function(A){var B=this,C=0;while((B=B.previousSibling)){if(B.nodeType==1&&++C>A){return false;
}}return(C==A);},even:function(B,A){return Selectors.Pseudo["nth-child"].call(this,"2n+1",A);},odd:function(B,A){return Selectors.Pseudo["nth-child"].call(this,"2n",A);
}});Element.Events.domready={onAdd:function(A){if(Browser.loaded){A.call(this);}}};(function(){var B=function(){if(Browser.loaded){return ;}Browser.loaded=true;
window.fireEvent("domready");document.fireEvent("domready");};switch(Browser.Engine.name){case"webkit":(function(){(["loaded","complete"].contains(document.readyState))?B():arguments.callee.delay(50);
})();break;case"trident":var A=document.createElement("div");(function(){($try(function(){A.doScroll("left");return $(A).inject(document.body).set("html","temp").dispose();
}))?B():arguments.callee.delay(50);})();break;default:window.addEvent("load",B);document.addEvent("DOMContentLoaded",B);}})();var JSON=new Hash({encode:function(B){switch($type(B)){case"string":return'"'+B.replace(/[\x00-\x1f\\"]/g,JSON.$replaceChars)+'"';
case"array":return"["+String(B.map(JSON.encode).filter($defined))+"]";case"object":case"hash":var A=[];Hash.each(B,function(E,D){var C=JSON.encode(E);if(C){A.push(JSON.encode(D)+":"+C);
}});return"{"+A+"}";case"number":case"boolean":return String(B);case false:return"null";}return null;},$specialChars:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},$replaceChars:function(A){return JSON.$specialChars[A]||"\\u00"+Math.floor(A.charCodeAt()/16).toString(16)+(A.charCodeAt()%16).toString(16);
},decode:function(string,secure){if($type(string)!="string"||!string.length){return null;}if(secure&&!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""))){return null;
}return eval("("+string+")");}});Native.implement([Hash,Array,String,Number],{toJSON:function(){return JSON.encode(this);}});var Cookie=new Class({Implements:Options,options:{path:false,domain:false,duration:false,secure:false,document:document},initialize:function(B,A){this.key=B;
this.setOptions(A);},write:function(B){B=encodeURIComponent(B);if(this.options.domain){B+="; domain="+this.options.domain;}if(this.options.path){B+="; path="+this.options.path;
}if(this.options.duration){var A=new Date();A.setTime(A.getTime()+this.options.duration*24*60*60*1000);B+="; expires="+A.toGMTString();}if(this.options.secure){B+="; secure";
}this.options.document.cookie=this.key+"="+B;return this;},read:function(){var A=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)");
return(A)?decodeURIComponent(A[1]):null;},dispose:function(){new Cookie(this.key,$merge(this.options,{duration:-1})).write("");return this;}});Cookie.write=function(B,C,A){return new Cookie(B,A).write(C);
};Cookie.read=function(A){return new Cookie(A).read();};Cookie.dispose=function(B,A){return new Cookie(B,A).dispose();};var Swiff=new Class({Implements:[Options],options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"transparent",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object;
},initialize:function(L,M){this.instance="Swiff_"+$time();this.setOptions(M);M=this.options;var B=this.id=M.id||this.instance;var A=$(M.container);Swiff.CallBacks[this.instance]={};
var E=M.params,G=M.vars,F=M.callBacks;var H=$extend({height:M.height,width:M.width},M.properties);var K=this;for(var D in F){Swiff.CallBacks[this.instance][D]=(function(N){return function(){return N.apply(K.object,arguments);
};})(F[D]);G[D]="Swiff.CallBacks."+this.instance+"."+D;}E.flashVars=Hash.toQueryString(G);if(Browser.Engine.trident){H.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";
E.movie=L;}else{H.type="application/x-shockwave-flash";H.data=L;}var J='<object id="'+B+'"';for(var I in H){J+=" "+I+'="'+H[I]+'"';}J+=">";for(var C in E){if(E[C]){J+='<param name="'+C+'" value="'+E[C]+'" />';
}}J+="</object>";this.object=((A)?A.empty():new Element("div")).set("html",J).firstChild;},replaces:function(A){A=$(A,true);A.parentNode.replaceChild(this.toElement(),A);
return this;},inject:function(A){$(A,true).appendChild(this.toElement());return this;},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].extend(arguments));
}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction('<invoke name="'+fn+'" returntype="javascript">'+__flash__argumentsToXML(arguments,2)+"</invoke>");
return eval(rs);};var Fx=new Class({Implements:[Chain,Events,Options],options:{fps:50,unit:false,duration:500,link:"ignore",transition:function(A){return -(Math.cos(Math.PI*A)-1)/2;
}},initialize:function(A){this.subject=this.subject||this;this.setOptions(A);this.options.duration=Fx.Durations[this.options.duration]||this.options.duration.toInt();
var B=this.options.wait;if(B===false){this.options.link="cancel";}},step:function(){var A=$time();if(A<this.time+this.options.duration){var B=this.options.transition((A-this.time)/this.options.duration);
this.set(this.compute(this.from,this.to,B));}else{this.set(this.compute(this.from,this.to,1));this.complete();}},set:function(A){return A;},compute:function(C,B,A){return Fx.compute(C,B,A);
},check:function(A){if(!this.timer){return true;}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(A.bind(this,Array.slice(arguments,1)));
return false;}return false;},start:function(B,A){if(!this.check(arguments.callee,B,A)){return this;}this.from=B;this.to=A;this.time=0;this.startTimer();
this.onStart();return this;},complete:function(){if(this.stopTimer()){this.onComplete();}return this;},cancel:function(){if(this.stopTimer()){this.onCancel();
}return this;},onStart:function(){this.fireEvent("start",this.subject);},onComplete:function(){this.fireEvent("complete",this.subject);if(!this.callChain()){this.fireEvent("chainComplete",this.subject);
}},onCancel:function(){this.fireEvent("cancel",this.subject).clearChain();},pause:function(){this.stopTimer();return this;},resume:function(){this.startTimer();
return this;},stopTimer:function(){if(!this.timer){return false;}this.time=$time()-this.time;this.timer=$clear(this.timer);return true;},startTimer:function(){if(this.timer){return false;
}this.time=$time()-this.time;this.timer=this.step.periodical(Math.round(1000/this.options.fps),this);return true;}});Fx.compute=function(C,B,A){return(B-C)*A+C;
};Fx.Durations={"short":250,normal:500,"long":1000};Fx.CSS=new Class({Extends:Fx,prepare:function(D,E,B){B=$splat(B);var C=B[1];if(!$chk(C)){B[1]=B[0];
B[0]=D.getStyle(E);}var A=B.map(this.parse);return{from:A[0],to:A[1]};},parse:function(A){A=$lambda(A)();A=(typeof A=="string")?A.split(" "):$splat(A);
return A.map(function(C){C=String(C);var B=false;Fx.CSS.Parsers.each(function(F,E){if(B){return ;}var D=F.parse(C);if($chk(D)){B={value:D,parser:F};}});
B=B||{value:C,parser:Fx.CSS.Parsers.String};return B;});},compute:function(D,C,B){var A=[];(Math.min(D.length,C.length)).times(function(E){A.push({value:D[E].parser.compute(D[E].value,C[E].value,B),parser:D[E].parser});
});A.$family={name:"fx:css:value"};return A;},serve:function(C,B){if($type(C)!="fx:css:value"){C=this.parse(C);}var A=[];C.each(function(D){A=A.concat(D.parser.serve(D.value,B));
});return A;},render:function(A,D,C,B){A.setStyle(D,this.serve(C,B));},search:function(A){if(Fx.CSS.Cache[A]){return Fx.CSS.Cache[A];}var B={};Array.each(document.styleSheets,function(E,D){var C=E.href;
if(C&&C.contains("://")&&!C.contains(document.domain)){return ;}var F=E.rules||E.cssRules;Array.each(F,function(I,G){if(!I.style){return ;}var H=(I.selectorText)?I.selectorText.replace(/^\w+/,function(J){return J.toLowerCase();
}):null;if(!H||!H.test("^"+A+"$")){return ;}Element.Styles.each(function(K,J){if(!I.style[J]||Element.ShortStyles[J]){return ;}K=String(I.style[J]);B[J]=(K.test(/^rgb/))?K.rgbToHex():K;
});});});return Fx.CSS.Cache[A]=B;}});Fx.CSS.Cache={};Fx.CSS.Parsers=new Hash({Color:{parse:function(A){if(A.match(/^#[0-9a-f]{3,6}$/i)){return A.hexToRgb(true);
}return((A=A.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[A[1],A[2],A[3]]:false;},compute:function(C,B,A){return C.map(function(E,D){return Math.round(Fx.compute(C[D],B[D],A));
});},serve:function(A){return A.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(B,A){return(A)?B+A:B;}},String:{parse:$lambda(false),compute:$arguments(1),serve:$arguments(0)}});
Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(B,A){this.element=this.subject=$(B);this.parent(A);},set:function(B,A){if(arguments.length==1){A=B;
B=this.property||this.options.property;}this.render(this.element,B,A,this.options.unit);return this;},start:function(C,E,D){if(!this.check(arguments.callee,C,E,D)){return this;
}var B=Array.flatten(arguments);this.property=this.options.property||B.shift();var A=this.prepare(this.element,this.property,B);return this.parent(A.from,A.to);
}});Element.Properties.tween={set:function(A){var B=this.retrieve("tween");if(B){B.cancel();}return this.eliminate("tween").store("tween:options",$extend({link:"cancel"},A));
},get:function(A){if(A||!this.retrieve("tween")){if(A||!this.retrieve("tween:options")){this.set("tween",A);}this.store("tween",new Fx.Tween(this,this.retrieve("tween:options")));
}return this.retrieve("tween");}};Element.implement({tween:function(A,C,B){this.get("tween").start(arguments);return this;},fade:function(C){var E=this.get("tween"),D="opacity",A;
C=$pick(C,"toggle");switch(C){case"in":E.start(D,1);break;case"out":E.start(D,0);break;case"show":E.set(D,1);break;case"hide":E.set(D,0);break;case"toggle":var B=this.retrieve("fade:flag",this.get("opacity")==1);
E.start(D,(B)?0:1);this.store("fade:flag",!B);A=true;break;default:E.start(D,arguments);}if(!A){this.eliminate("fade:flag");}return this;},highlight:function(C,A){if(!A){A=this.retrieve("highlight:original",this.getStyle("background-color"));
A=(A=="transparent")?"#fff":A;}var B=this.get("tween");B.start("background-color",C||"#ffff88",A).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original"));
B.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(B,A){this.element=this.subject=$(B);this.parent(A);},set:function(A){if(typeof A=="string"){A=this.search(A);
}for(var B in A){this.render(this.element,B,A[B],this.options.unit);}return this;},compute:function(E,D,C){var A={};for(var B in E){A[B]=this.parent(E[B],D[B],C);
}return A;},start:function(B){if(!this.check(arguments.callee,B)){return this;}if(typeof B=="string"){B=this.search(B);}var E={},D={};for(var C in B){var A=this.prepare(this.element,C,B[C]);
E[C]=A.from;D[C]=A.to;}return this.parent(E,D);}});Element.Properties.morph={set:function(A){var B=this.retrieve("morph");if(B){B.cancel();}return this.eliminate("morph").store("morph:options",$extend({link:"cancel"},A));
},get:function(A){if(A||!this.retrieve("morph")){if(A||!this.retrieve("morph:options")){this.set("morph",A);}this.store("morph",new Fx.Morph(this,this.retrieve("morph:options")));
}return this.retrieve("morph");}};Element.implement({morph:function(A){this.get("morph").start(A);return this;}});(function(){var A=Fx.prototype.initialize;
Fx.prototype.initialize=function(B){A.call(this,B);var C=this.options.transition;if(typeof C=="string"&&(C=C.split(":"))){var D=Fx.Transitions;D=D[C[0]]||D[C[0].capitalize()];
if(C[1]){D=D["ease"+C[1].capitalize()+(C[2]?C[2].capitalize():"")];}this.options.transition=D;}};})();Fx.Transition=function(B,A){A=$splat(A);return $extend(B,{easeIn:function(C){return B(C,A);
},easeOut:function(C){return 1-B(1-C,A);},easeInOut:function(C){return(C<=0.5)?B(2*C,A)/2:(2-B(2*(1-C),A))/2;}});};Fx.Transitions=new Hash({linear:$arguments(0)});
Fx.Transitions.extend=function(A){for(var B in A){Fx.Transitions[B]=new Fx.Transition(A[B]);}};Fx.Transitions.extend({Pow:function(B,A){return Math.pow(B,A[0]||6);
},Expo:function(A){return Math.pow(2,8*(A-1));},Circ:function(A){return 1-Math.sin(Math.acos(A));},Sine:function(A){return 1-Math.sin((1-A)*Math.PI/2);
},Back:function(B,A){A=A[0]||1.618;return Math.pow(B,2)*((A+1)*B-A);},Bounce:function(D){var C;for(var B=0,A=1;1;B+=A,A/=2){if(D>=(7-4*B)/11){C=-Math.pow((11-6*B-11*D)/4,2)+A*A;
break;}}return C;},Elastic:function(B,A){return Math.pow(2,10*--B)*Math.cos(20*B*Math.PI*(A[0]||1)/3);}});["Quad","Cubic","Quart","Quint"].each(function(B,A){Fx.Transitions[B]=new Fx.Transition(function(C){return Math.pow(C,[A+2]);
});});var Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false},initialize:function(A){this.xhr=new Browser.Request();
this.setOptions(A);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers=new Hash(this.options.headers);},onStateChange:function(){if(this.xhr.readyState!=4||!this.running){return ;
}this.running=false;this.status=0;$try(function(){this.status=this.xhr.status;}.bind(this));if(this.options.isSuccess.call(this,this.status)){this.response={text:this.xhr.responseText,xml:this.xhr.responseXML};
this.success(this.response.text,this.response.xml);}else{this.response={text:null,xml:null};this.failure();}this.xhr.onreadystatechange=$empty;},isSuccess:function(){return((this.status>=200)&&(this.status<300));
},processScripts:function(A){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return $exec(A);}return A.stripScripts(this.options.evalScripts);
},success:function(B,A){this.onSuccess(this.processScripts(B),A);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain();
},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},setHeader:function(A,B){this.headers.set(A,B);
return this;},getHeader:function(A){return $try(function(){return this.xhr.getResponseHeader(A);}.bind(this));},check:function(A){if(!this.running){return true;
}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(A.bind(this,Array.slice(arguments,1)));return false;}return false;
},send:function(I){if(!this.check(arguments.callee,I)){return this;}this.running=true;var G=$type(I);if(G=="string"||G=="element"){I={data:I};}var D=this.options;
I=$extend({data:D.data,url:D.url,method:D.method},I);var E=I.data,B=I.url,A=I.method;switch($type(E)){case"element":E=$(E).toQueryString();break;case"object":case"hash":E=Hash.toQueryString(E);
}if(this.options.format){var H="format="+this.options.format;E=(E)?H+"&"+E:H;}if(this.options.emulation&&["put","delete"].contains(A)){var F="_method="+A;
E=(E)?F+"&"+E:F;A="post";}if(this.options.urlEncoded&&A=="post"){var C=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers.set("Content-type","application/x-www-form-urlencoded"+C);
}if(E&&A=="get"){B=B+(B.contains("?")?"&":"?")+E;E=null;}this.xhr.open(A.toUpperCase(),B,this.options.async);this.xhr.onreadystatechange=this.onStateChange.bind(this);
this.headers.each(function(K,J){if(!$try(function(){this.xhr.setRequestHeader(J,K);return true;}.bind(this))){this.fireEvent("exception",[J,K]);}},this);
this.fireEvent("request");this.xhr.send(E);if(!this.options.async){this.onStateChange();}return this;},cancel:function(){if(!this.running){return this;
}this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty;this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});(function(){var A={};
["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(B){A[B]=function(){var C=Array.link(arguments,{url:String.type,data:$defined});
return this.send($extend(C,{method:B.toLowerCase()}));};});Request.implement(A);})();Element.Properties.send={set:function(A){var B=this.retrieve("send");
if(B){B.cancel();}return this.eliminate("send").store("send:options",$extend({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")},A));
},get:function(A){if(A||!this.retrieve("send")){if(A||!this.retrieve("send:options")){this.set("send",A);}this.store("send",new Request(this.retrieve("send:options")));
}return this.retrieve("send");}};Element.implement({send:function(A){var B=this.get("send");B.send({data:this,url:A||B.options.url});return this;}});Request.HTML=new Class({Extends:Request,options:{update:false,evalScripts:true,filter:false},processHTML:function(C){var B=C.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
C=(B)?B[1]:C;var A=new Element("div");return $try(function(){var D="<root>"+C+"</root>",G;if(Browser.Engine.trident){G=new ActiveXObject("Microsoft.XMLDOM");
G.async=false;G.loadXML(D);}else{G=new DOMParser().parseFromString(D,"text/xml");}D=G.getElementsByTagName("root")[0];for(var F=0,E=D.childNodes.length;
F<E;F++){var H=Element.clone(D.childNodes[F],true,true);if(H){A.grab(H);}}return A;})||A.set("html",C);},success:function(D){var C=this.options,B=this.response;
B.html=D.stripScripts(function(E){B.javascript=E;});var A=this.processHTML(B.html);B.tree=A.childNodes;B.elements=A.getElements("*");if(C.filter){B.tree=B.elements.filter(C.filter);
}if(C.update){$(C.update).empty().adopt(B.tree);}if(C.evalScripts){$exec(B.javascript);}this.onSuccess(B.tree,B.elements,B.html,B.javascript);}});Element.Properties.load={set:function(A){var B=this.retrieve("load");
if(B){send.cancel();}return this.eliminate("load").store("load:options",$extend({data:this,link:"cancel",update:this,method:"get"},A));},get:function(A){if(A||!this.retrieve("load")){if(A||!this.retrieve("load:options")){this.set("load",A);
}this.store("load",new Request.HTML(this.retrieve("load:options")));}return this.retrieve("load");}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Object.type,url:String.type}));
return this;}});Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(A){this.parent(A);this.headers.extend({Accept:"application/json","X-Request":"JSON"});
},success:function(A){this.response.json=JSON.decode(A,this.options.secure);this.onSuccess(this.response.json,A);}});
//MooTools More, <http://mootools.net/more>. Copyright (c) 2006-2008 Valerio Proietti, <http://mad4milk.net>, MIT Style License.

Fx.Slide=new Class({Extends:Fx,options:{mode:"vertical"},initialize:function(B,A){this.addEvent("complete",function(){this.open=(this.wrapper["offset"+this.layout.capitalize()]!=0);
if(this.open&&Browser.Engine.webkit419){this.element.dispose().inject(this.wrapper);}},true);this.element=this.subject=$(B);this.parent(A);var C=this.element.retrieve("wrapper");
this.wrapper=C||new Element("div",{styles:$extend(this.element.getStyles("margin","position"),{overflow:"hidden"})}).wraps(this.element);this.element.store("wrapper",this.wrapper).setStyle("margin",0);
this.now=[];this.open=true;},vertical:function(){this.margin="margin-top";this.layout="height";this.offset=this.element.offsetHeight;},horizontal:function(){this.margin="margin-left";
this.layout="width";this.offset=this.element.offsetWidth;},set:function(A){this.element.setStyle(this.margin,A[0]);this.wrapper.setStyle(this.layout,A[1]);
return this;},compute:function(E,D,C){var B=[];var A=2;A.times(function(F){B[F]=Fx.compute(E[F],D[F],C);});return B;},start:function(B,E){if(!this.check(arguments.callee,B,E)){return this;
}this[E||this.options.mode]();var D=this.element.getStyle(this.margin).toInt();var C=this.wrapper.getStyle(this.layout).toInt();var A=[[D,C],[0,this.offset]];
var G=[[D,C],[-this.offset,0]];var F;switch(B){case"in":F=A;break;case"out":F=G;break;case"toggle":F=(this.wrapper["offset"+this.layout.capitalize()]==0)?A:G;
}return this.parent(F[0],F[1]);},slideIn:function(A){return this.start("in",A);},slideOut:function(A){return this.start("out",A);},hide:function(A){this[A||this.options.mode]();
this.open=false;return this.set([-this.offset,0]);},show:function(A){this[A||this.options.mode]();this.open=true;return this.set([0,this.offset]);},toggle:function(A){return this.start("toggle",A);
}});Element.Properties.slide={set:function(B){var A=this.retrieve("slide");if(A){A.cancel();}return this.eliminate("slide").store("slide:options",$extend({link:"cancel"},B));
},get:function(A){if(A||!this.retrieve("slide")){if(A||!this.retrieve("slide:options")){this.set("slide",A);}this.store("slide",new Fx.Slide(this,this.retrieve("slide:options")));
}return this.retrieve("slide");}};Element.implement({slide:function(D,E){D=D||"toggle";var B=this.get("slide"),A;switch(D){case"hide":B.hide(E);break;case"show":B.show(E);
break;case"toggle":var C=this.retrieve("slide:flag",B.open);B[(C)?"slideOut":"slideIn"](E);this.store("slide:flag",!C);A=true;break;default:B.start(D,E);
}if(!A){this.eliminate("slide:flag");}return this;}});Fx.Scroll=new Class({Extends:Fx,options:{offset:{x:0,y:0},wheelStops:true},initialize:function(B,A){this.element=this.subject=$(B);
this.parent(A);var D=this.cancel.bind(this,false);if($type(this.element)!="element"){this.element=$(this.element.getDocument().body);}var C=this.element;
if(this.options.wheelStops){this.addEvent("start",function(){C.addEvent("mousewheel",D);},true);this.addEvent("complete",function(){C.removeEvent("mousewheel",D);
},true);}},set:function(){var A=Array.flatten(arguments);this.element.scrollTo(A[0],A[1]);},compute:function(E,D,C){var B=[];var A=2;A.times(function(F){B.push(Fx.compute(E[F],D[F],C));
});return B;},start:function(C,H){if(!this.check(arguments.callee,C,H)){return this;}var E=this.element.getSize(),F=this.element.getScrollSize();var B=this.element.getScroll(),D={x:C,y:H};
for(var G in D){var A=F[G]-E[G];if($chk(D[G])){D[G]=($type(D[G])=="number")?D[G].limit(0,A):A;}else{D[G]=B[G];}D[G]+=this.options.offset[G];}return this.parent([B.x,B.y],[D.x,D.y]);
},toTop:function(){return this.start(false,0);},toLeft:function(){return this.start(0,false);},toRight:function(){return this.start("right",false);},toBottom:function(){return this.start(false,"bottom");
},toElement:function(B){var A=$(B).getPosition(this.element);return this.start(A.x,A.y);}});Fx.Elements=new Class({Extends:Fx.CSS,initialize:function(B,A){this.elements=this.subject=$$(B);
this.parent(A);},compute:function(G,H,I){var C={};for(var D in G){var A=G[D],E=H[D],F=C[D]={};for(var B in A){F[B]=this.parent(A[B],E[B],I);}}return C;
},set:function(B){for(var C in B){var A=B[C];for(var D in A){this.render(this.elements[C],D,A[D],this.options.unit);}}return this;},start:function(C){if(!this.check(arguments.callee,C)){return this;
}var H={},I={};for(var D in C){var F=C[D],A=H[D]={},G=I[D]={};for(var B in F){var E=this.prepare(this.elements[D],B,F[B]);A[B]=E.from;G[B]=E.to;}}return this.parent(H,I);
}});var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,modifiers:{x:"left",y:"top"}},initialize:function(){var B=Array.link(arguments,{options:Object.type,element:$defined});
this.element=$(B.element);this.document=this.element.getDocument();this.setOptions(B.options||{});var A=$type(this.options.handle);this.handles=(A=="array"||A=="collection")?$$(this.options.handle):$(this.options.handle)||this.element;
this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection=(Browser.Engine.trident)?"selectstart":"mousedown";this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:$lambda(false)};
this.attach();},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this;},detach:function(){this.handles.removeEvent("mousedown",this.bound.start);
return this;},start:function(C){if(this.options.preventDefault){C.preventDefault();}this.fireEvent("beforeStart",this.element);this.mouse.start=C.page;
var A=this.options.limit;this.limit={x:[],y:[]};for(var D in this.options.modifiers){if(!this.options.modifiers[D]){continue;}if(this.options.style){this.value.now[D]=this.element.getStyle(this.options.modifiers[D]).toInt();
}else{this.value.now[D]=this.element[this.options.modifiers[D]];}if(this.options.invert){this.value.now[D]*=-1;}this.mouse.pos[D]=C.page[D]-this.value.now[D];
if(A&&A[D]){for(var B=2;B--;B){if($chk(A[D][B])){this.limit[D][B]=$lambda(A[D][B])();}}}}if($type(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid};
}this.document.addEvents({mousemove:this.bound.check,mouseup:this.bound.cancel});this.document.addEvent(this.selection,this.bound.eventStop);},check:function(A){if(this.options.preventDefault){A.preventDefault();
}var B=Math.round(Math.sqrt(Math.pow(A.page.x-this.mouse.start.x,2)+Math.pow(A.page.y-this.mouse.start.y,2)));if(B>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop});
this.fireEvent("start",this.element).fireEvent("snap",this.element);}},drag:function(A){if(this.options.preventDefault){A.preventDefault();}this.mouse.now=A.page;
for(var B in this.options.modifiers){if(!this.options.modifiers[B]){continue;}this.value.now[B]=this.mouse.now[B]-this.mouse.pos[B];if(this.options.invert){this.value.now[B]*=-1;
}if(this.options.limit&&this.limit[B]){if($chk(this.limit[B][1])&&(this.value.now[B]>this.limit[B][1])){this.value.now[B]=this.limit[B][1];}else{if($chk(this.limit[B][0])&&(this.value.now[B]<this.limit[B][0])){this.value.now[B]=this.limit[B][0];
}}}if(this.options.grid[B]){this.value.now[B]-=(this.value.now[B]%this.options.grid[B]);}if(this.options.style){this.element.setStyle(this.options.modifiers[B],this.value.now[B]+this.options.unit);
}else{this.element[this.options.modifiers[B]]=this.value.now[B];}}this.fireEvent("drag",this.element);},cancel:function(A){this.document.removeEvent("mousemove",this.bound.check);
this.document.removeEvent("mouseup",this.bound.cancel);if(A){this.document.removeEvent(this.selection,this.bound.eventStop);this.fireEvent("cancel",this.element);
}},stop:function(A){this.document.removeEvent(this.selection,this.bound.eventStop);this.document.removeEvent("mousemove",this.bound.drag);this.document.removeEvent("mouseup",this.bound.stop);
if(A){this.fireEvent("complete",this.element);}}});Element.implement({makeResizable:function(A){return new Drag(this,$merge({modifiers:{x:"width",y:"height"}},A));
}});Drag.Move=new Class({Extends:Drag,options:{droppables:[],container:false},initialize:function(C,B){this.parent(C,B);this.droppables=$$(this.options.droppables);
this.container=$(this.options.container);if(this.container&&$type(this.container)!="element"){this.container=$(this.container.getDocument().body);}C=this.element;
var D=C.getStyle("position");var A=(D!="static")?D:"absolute";if(C.getStyle("left")=="auto"||C.getStyle("top")=="auto"){C.position(C.getPosition(C.offsetParent));
}C.setStyle("position",A);this.addEvent("start",function(){this.checkDroppables();},true);},start:function(B){if(this.container){var D=this.element,J=this.container,E=J.getCoordinates(D.offsetParent),F={},A={};
["top","right","bottom","left"].each(function(K){F[K]=J.getStyle("padding-"+K).toInt();A[K]=D.getStyle("margin-"+K).toInt();},this);var C=D.offsetWidth+A.left+A.right,I=D.offsetHeight+A.top+A.bottom;
var H=[E.left+F.left,E.right-F.right-C];var G=[E.top+F.top,E.bottom-F.bottom-I];this.options.limit={x:H,y:G};}this.parent(B);},checkAgainst:function(B){B=B.getCoordinates();
var A=this.mouse.now;return(A.x>B.left&&A.x<B.right&&A.y<B.bottom&&A.y>B.top);},checkDroppables:function(){var A=this.droppables.filter(this.checkAgainst,this).getLast();
if(this.overed!=A){if(this.overed){this.fireEvent("leave",[this.element,this.overed]);}if(A){this.overed=A;this.fireEvent("enter",[this.element,A]);}else{this.overed=null;
}}},drag:function(A){this.parent(A);if(this.droppables.length){this.checkDroppables();}},stop:function(A){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed]);
this.overed=null;return this.parent(A);}});Element.implement({makeDraggable:function(A){return new Drag.Move(this,A);}});Hash.Cookie=new Class({Extends:Cookie,options:{autoSave:true},initialize:function(B,A){this.parent(B,A);
this.load();},save:function(){var A=JSON.encode(this.hash);if(!A||A.length>4096){return false;}if(A=="{}"){this.dispose();}else{this.write(A);}return true;
},load:function(){this.hash=new Hash(JSON.decode(this.read(),true));return this;}});Hash.Cookie.implement((function(){var A={};Hash.each(Hash.prototype,function(C,B){A[B]=function(){var D=C.apply(this.hash,arguments);
if(this.options.autoSave){this.save();}return D;};});return A;})());var Color=new Native({initialize:function(B,C){if(arguments.length>=3){C="rgb";B=Array.slice(arguments,0,3);
}else{if(typeof B=="string"){if(B.match(/rgb/)){B=B.rgbToHex().hexToRgb(true);}else{if(B.match(/hsb/)){B=B.hsbToRgb();}else{B=B.hexToRgb(true);}}}}C=C||"rgb";
switch(C){case"hsb":var A=B;B=B.hsbToRgb();B.hsb=A;break;case"hex":B=B.hexToRgb(true);break;}B.rgb=B.slice(0,3);B.hsb=B.hsb||B.rgbToHsb();B.hex=B.rgbToHex();
return $extend(B,this);}});Color.implement({mix:function(){var A=Array.slice(arguments);var C=($type(A.getLast())=="number")?A.pop():50;var B=this.slice();
A.each(function(D){D=new Color(D);for(var E=0;E<3;E++){B[E]=Math.round((B[E]/100*(100-C))+(D[E]/100*C));}});return new Color(B,"rgb");},invert:function(){return new Color(this.map(function(A){return 255-A;
}));},setHue:function(A){return new Color([A,this.hsb[1],this.hsb[2]],"hsb");},setSaturation:function(A){return new Color([this.hsb[0],A,this.hsb[2]],"hsb");
},setBrightness:function(A){return new Color([this.hsb[0],this.hsb[1],A],"hsb");}});function $RGB(C,B,A){return new Color([C,B,A],"rgb");}function $HSB(C,B,A){return new Color([C,B,A],"hsb");
}function $HEX(A){return new Color(A,"hex");}Array.implement({rgbToHsb:function(){var B=this[0],C=this[1],J=this[2];var G,F,H;var I=Math.max(B,C,J),E=Math.min(B,C,J);
var K=I-E;H=I/255;F=(I!=0)?K/I:0;if(F==0){G=0;}else{var D=(I-B)/K;var A=(I-C)/K;var L=(I-J)/K;if(B==I){G=L-A;}else{if(C==I){G=2+D-L;}else{G=4+A-D;}}G/=6;
if(G<0){G++;}}return[Math.round(G*360),Math.round(F*100),Math.round(H*100)];},hsbToRgb:function(){var C=Math.round(this[2]/100*255);if(this[1]==0){return[C,C,C];
}else{var A=this[0]%360;var E=A%60;var F=Math.round((this[2]*(100-this[1]))/10000*255);var D=Math.round((this[2]*(6000-this[1]*E))/600000*255);var B=Math.round((this[2]*(6000-this[1]*(60-E)))/600000*255);
switch(Math.floor(A/60)){case 0:return[C,B,F];case 1:return[D,C,F];case 2:return[F,C,B];case 3:return[F,D,C];case 4:return[B,F,C];case 5:return[C,F,D];
}}return false;}});String.implement({rgbToHsb:function(){var A=this.match(/\d{1,3}/g);return(A)?hsb.rgbToHsb():null;},hsbToRgb:function(){var A=this.match(/\d{1,3}/g);
return(A)?A.hsbToRgb():null;}});var Group=new Class({initialize:function(){this.instances=Array.flatten(arguments);this.events={};this.checker={};},addEvent:function(B,A){this.checker[B]=this.checker[B]||{};
this.events[B]=this.events[B]||[];if(this.events[B].contains(A)){return false;}else{this.events[B].push(A);}this.instances.each(function(C,D){C.addEvent(B,this.check.bind(this,[B,C,D]));
},this);return this;},check:function(C,A,B){this.checker[C][B]=true;var D=this.instances.every(function(F,E){return this.checker[C][E]||false;},this);if(!D){return ;
}this.checker[C]={};this.events[C].each(function(E){E.call(this,this.instances,A);},this);}});var Asset=new Hash({javascript:function(F,D){D=$extend({onload:$empty,document:document,check:$lambda(true)},D);
var B=new Element("script",{src:F,type:"text/javascript"});var E=D.onload.bind(B),A=D.check,G=D.document;delete D.onload;delete D.check;delete D.document;
B.addEvents({load:E,readystatechange:function(){if(["loaded","complete"].contains(this.readyState)){E();}}}).setProperties(D);if(Browser.Engine.webkit419){var C=(function(){if(!$try(A)){return ;
}$clear(C);E();}).periodical(50);}return B.inject(G.head);},css:function(B,A){return new Element("link",$merge({rel:"stylesheet",media:"screen",type:"text/css",href:B},A)).inject(document.head);
},image:function(C,B){B=$merge({onload:$empty,onabort:$empty,onerror:$empty},B);var D=new Image();var A=$(D)||new Element("img");["load","abort","error"].each(function(E){var F="on"+E;
var G=B[F];delete B[F];D[F]=function(){if(!D){return ;}if(!A.parentNode){A.width=D.width;A.height=D.height;}D=D.onload=D.onabort=D.onerror=null;G.delay(1,A,A);
A.fireEvent(E,A,1);};});D.src=A.src=C;if(D&&D.complete){D.onload.delay(1);}return A.setProperties(B);},images:function(D,C){C=$merge({onComplete:$empty,onProgress:$empty},C);
if(!D.push){D=[D];}var A=[];var B=0;D.each(function(F){var E=new Asset.image(F,{onload:function(){C.onProgress.call(this,B,D.indexOf(F));B++;if(B==D.length){C.onComplete();
}}});A.push(E);});return new Elements(A);}});var Sortables=new Class({Implements:[Events,Options],options:{snap:4,opacity:1,clone:false,revert:false,handle:false,constrain:false},initialize:function(A,B){this.setOptions(B);
this.elements=[];this.lists=[];this.idle=true;this.addLists($$($(A)||A));if(!this.options.clone){this.options.revert=false;}if(this.options.revert){this.effect=new Fx.Morph(null,$merge({duration:250,link:"cancel"},this.options.revert));
}},attach:function(){this.addLists(this.lists);return this;},detach:function(){this.lists=this.removeLists(this.lists);return this;},addItems:function(){Array.flatten(arguments).each(function(A){this.elements.push(A);
var B=A.retrieve("sortables:start",this.start.bindWithEvent(this,A));(this.options.handle?A.getElement(this.options.handle)||A:A).addEvent("mousedown",B);
},this);return this;},addLists:function(){Array.flatten(arguments).each(function(A){this.lists.push(A);this.addItems(A.getChildren());},this);return this;
},removeItems:function(){var A=[];Array.flatten(arguments).each(function(B){A.push(B);this.elements.erase(B);var C=B.retrieve("sortables:start");(this.options.handle?B.getElement(this.options.handle)||B:B).removeEvent("mousedown",C);
},this);return $$(A);},removeLists:function(){var A=[];Array.flatten(arguments).each(function(B){A.push(B);this.lists.erase(B);this.removeItems(B.getChildren());
},this);return $$(A);},getClone:function(B,A){if(!this.options.clone){return new Element("div").inject(document.body);}if($type(this.options.clone)=="function"){return this.options.clone.call(this,B,A,this.list);
}return A.clone(true).setStyles({margin:"0px",position:"absolute",visibility:"hidden",width:A.getStyle("width")}).inject(this.list).position(A.getPosition(A.getOffsetParent()));
},getDroppables:function(){var A=this.list.getChildren();if(!this.options.constrain){A=this.lists.concat(A).erase(this.list);}return A.erase(this.clone).erase(this.element);
},insert:function(C,B){var A="inside";if(this.lists.contains(B)){this.list=B;this.drag.droppables=this.getDroppables();}else{A=this.element.getAllPrevious().contains(B)?"before":"after";
}this.element.inject(B,A);this.fireEvent("sort",[this.element,this.clone]);},start:function(B,A){if(!this.idle){return ;}this.idle=false;this.element=A;
this.opacity=A.get("opacity");this.list=A.getParent();this.clone=this.getClone(B,A);this.drag=new Drag.Move(this.clone,{snap:this.options.snap,container:this.options.constrain&&this.element.getParent(),droppables:this.getDroppables(),onSnap:function(){B.stop();
this.clone.setStyle("visibility","visible");this.element.set("opacity",this.options.opacity||0);this.fireEvent("start",[this.element,this.clone]);}.bind(this),onEnter:this.insert.bind(this),onCancel:this.reset.bind(this),onComplete:this.end.bind(this)});
this.clone.inject(this.element,"before");this.drag.start(B);},end:function(){this.drag.detach();this.element.set("opacity",this.opacity);if(this.effect){var A=this.element.getStyles("width","height");
var B=this.clone.computePosition(this.element.getPosition(this.clone.offsetParent));this.effect.element=this.clone;this.effect.start({top:B.top,left:B.left,width:A.width,height:A.height,opacity:0.25}).chain(this.reset.bind(this));
}else{this.reset();}},reset:function(){this.idle=true;this.clone.destroy();this.fireEvent("complete",this.element);},serialize:function(){var C=Array.link(arguments,{modifier:Function.type,index:$defined});
var B=this.lists.map(function(D){return D.getChildren().map(C.modifier||function(E){return E.get("id");},this);},this);var A=C.index;if(this.lists.length==1){A=0;
}return $chk(A)&&A>=0&&A<this.lists.length?B[A]:B;}});var Tips=new Class({Implements:[Events,Options],options:{onShow:function(A){A.setStyle("visibility","visible");
},onHide:function(A){A.setStyle("visibility","hidden");},showDelay:100,hideDelay:100,className:null,offsets:{x:16,y:16},fixed:false},initialize:function(){var C=Array.link(arguments,{options:Object.type,elements:$defined});
this.setOptions(C.options||null);this.tip=new Element("div").inject(document.body);if(this.options.className){this.tip.addClass(this.options.className);
}var B=new Element("div",{"class":"tip-top"}).inject(this.tip);this.container=new Element("div",{"class":"tip"}).inject(this.tip);var A=new Element("div",{"class":"tip-bottom"}).inject(this.tip);
this.tip.setStyles({position:"absolute",top:0,left:0,visibility:"hidden"});if(C.elements){this.attach(C.elements);}},attach:function(A){$$(A).each(function(D){var G=D.retrieve("tip:title",D.get("title"));
var F=D.retrieve("tip:text",D.get("rel")||D.get("href"));var E=D.retrieve("tip:enter",this.elementEnter.bindWithEvent(this,D));var C=D.retrieve("tip:leave",this.elementLeave.bindWithEvent(this,D));
D.addEvents({mouseenter:E,mouseleave:C});if(!this.options.fixed){var B=D.retrieve("tip:move",this.elementMove.bindWithEvent(this,D));D.addEvent("mousemove",B);
}D.store("tip:native",D.get("title"));D.erase("title");},this);return this;},detach:function(A){$$(A).each(function(C){C.removeEvent("mouseenter",C.retrieve("tip:enter")||$empty);
C.removeEvent("mouseleave",C.retrieve("tip:leave")||$empty);C.removeEvent("mousemove",C.retrieve("tip:move")||$empty);C.eliminate("tip:enter").eliminate("tip:leave").eliminate("tip:move");
var B=C.retrieve("tip:native");if(B){C.set("title",B);}});return this;},elementEnter:function(B,A){$A(this.container.childNodes).each(Element.dispose);
var D=A.retrieve("tip:title");if(D){this.titleElement=new Element("div",{"class":"tip-title"}).inject(this.container);this.fill(this.titleElement,D);}var C=A.retrieve("tip:text");
if(C){this.textElement=new Element("div",{"class":"tip-text"}).inject(this.container);this.fill(this.textElement,C);}this.timer=$clear(this.timer);this.timer=this.show.delay(this.options.showDelay,this);
this.position((!this.options.fixed)?B:{page:A.getPosition()});},elementLeave:function(A){$clear(this.timer);this.timer=this.hide.delay(this.options.hideDelay,this);
},elementMove:function(A){this.position(A);},position:function(D){var B=window.getSize(),A=window.getScroll();var E={x:this.tip.offsetWidth,y:this.tip.offsetHeight};
var C={x:"left",y:"top"};for(var F in C){var G=D.page[F]+this.options.offsets[F];if((G+E[F]-A[F])>B[F]){G=D.page[F]-this.options.offsets[F]-E[F];}this.tip.setStyle(C[F],G);
}},fill:function(A,B){(typeof B=="string")?A.set("html",B):A.adopt(B);},show:function(){this.fireEvent("show",this.tip);},hide:function(){this.fireEvent("hide",this.tip);
}});var SmoothScroll=new Class({Extends:Fx.Scroll,initialize:function(B,C){C=C||document;var E=C.getDocument(),D=C.getWindow();this.parent(E,B);this.links=(this.options.links)?$$(this.options.links):$$(E.links);
var A=D.location.href.match(/^[^#]*/)[0]+"#";this.links.each(function(G){if(G.href.indexOf(A)!=0){return ;}var F=G.href.substr(A.length);if(F&&$(F)){this.useLink(G,F);
}},this);if(!Browser.Engine.webkit419){this.addEvent("complete",function(){D.location.hash=this.anchor;},true);}},useLink:function(B,A){B.addEvent("click",function(C){this.anchor=A;
this.toElement(A);C.stop();}.bind(this));}});var Slider=new Class({Implements:[Events,Options],options:{onTick:function(A){if(this.options.snap){A=this.toPosition(this.step);
}this.knob.setStyle(this.property,A);},snap:false,offset:0,range:false,wheel:false,steps:100,mode:"horizontal"},initialize:function(E,A,D){this.setOptions(D);
this.element=$(E);this.knob=$(A);this.previousChange=this.previousEnd=this.step=-1;this.element.addEvent("mousedown",this.clickedElement.bind(this));if(this.options.wheel){this.element.addEvent("mousewheel",this.scrolledElement.bindWithEvent(this));
}var F,B={},C={x:false,y:false};switch(this.options.mode){case"vertical":this.axis="y";this.property="top";F="offsetHeight";break;case"horizontal":this.axis="x";
this.property="left";F="offsetWidth";}this.half=this.knob[F]/2;this.full=this.element[F]-this.knob[F]+(this.options.offset*2);this.min=$chk(this.options.range[0])?this.options.range[0]:0;
this.max=$chk(this.options.range[1])?this.options.range[1]:this.options.steps;this.range=this.max-this.min;this.steps=this.options.steps||this.full;this.stepSize=Math.abs(this.range)/this.steps;
this.stepWidth=this.stepSize*this.full/Math.abs(this.range);this.knob.setStyle("position","relative").setStyle(this.property,-this.options.offset);C[this.axis]=this.property;
B[this.axis]=[-this.options.offset,this.full-this.options.offset];this.drag=new Drag(this.knob,{snap:0,limit:B,modifiers:C,onDrag:this.draggedKnob.bind(this),onStart:this.draggedKnob.bind(this),onComplete:function(){this.draggedKnob();
this.end();}.bind(this)});if(this.options.snap){this.drag.options.grid=Math.ceil(this.stepWidth);this.drag.options.limit[this.axis][1]=this.full;}},set:function(A){if(!((this.range>0)^(A<this.min))){A=this.min;
}if(!((this.range>0)^(A>this.max))){A=this.max;}this.step=Math.round(A);this.checkStep();this.end();this.fireEvent("tick",this.toPosition(this.step));return this;
},clickedElement:function(C){var B=this.range<0?-1:1;var A=C.page[this.axis]-this.element.getPosition()[this.axis]-this.half;A=A.limit(-this.options.offset,this.full-this.options.offset);
this.step=Math.round(this.min+B*this.toStep(A));this.checkStep();this.end();this.fireEvent("tick",A);},scrolledElement:function(A){var B=(this.options.mode=="horizontal")?(A.wheel<0):(A.wheel>0);
this.set(B?this.step-this.stepSize:this.step+this.stepSize);A.stop();},draggedKnob:function(){var B=this.range<0?-1:1;var A=this.drag.value.now[this.axis];
A=A.limit(-this.options.offset,this.full-this.options.offset);this.step=Math.round(this.min+B*this.toStep(A));this.checkStep();},checkStep:function(){if(this.previousChange!=this.step){this.previousChange=this.step;
this.fireEvent("change",this.step);}},end:function(){if(this.previousEnd!==this.step){this.previousEnd=this.step;this.fireEvent("complete",this.step+"");
}},toStep:function(A){var B=(A+this.options.offset)*this.stepSize/this.full*this.steps;return this.options.steps?Math.round(B-=B%this.stepSize):B;},toPosition:function(A){return(this.full*Math.abs(this.min-A))/(this.steps*this.stepSize)-this.options.offset;
}});var Scroller=new Class({Implements:[Events,Options],options:{area:20,velocity:1,onChange:function(A,B){this.element.scrollTo(A,B);}},initialize:function(B,A){this.setOptions(A);
this.element=$(B);this.listener=($type(this.element)!="element")?$(this.element.getDocument().body):this.element;this.timer=null;this.coord=this.getCoords.bind(this);
},start:function(){this.listener.addEvent("mousemove",this.coord);},stop:function(){this.listener.removeEvent("mousemove",this.coord);this.timer=$clear(this.timer);
},getCoords:function(A){this.page=(this.listener.get("tag")=="body")?A.client:A.page;if(!this.timer){this.timer=this.scroll.periodical(50,this);}},scroll:function(){var B=this.element.getSize(),A=this.element.getScroll(),E=this.element.getPosition(),D={x:0,y:0};
for(var C in this.page){if(this.page[C]<(this.options.area+E[C])&&A[C]!=0){D[C]=(this.page[C]-this.options.area-E[C])*this.options.velocity;}else{if(this.page[C]+this.options.area>(B[C]+E[C])&&B[C]+B[C]!=A[C]){D[C]=(this.page[C]-B[C]+this.options.area-E[C])*this.options.velocity;
}}}if(D.y||D.x){this.fireEvent("change",[A.x+D.x,A.y+D.y]);}}});var Accordion=new Class({Extends:Fx.Elements,options:{display:0,show:false,height:true,width:false,opacity:true,fixedHeight:false,fixedWidth:false,wait:false,alwaysHide:false},initialize:function(){var C=Array.link(arguments,{container:Element.type,options:Object.type,togglers:$defined,elements:$defined});
this.parent(C.elements,C.options);this.togglers=$$(C.togglers);this.container=$(C.container);this.previous=-1;if(this.options.alwaysHide){this.options.wait=true;
}if($chk(this.options.show)){this.options.display=false;this.previous=this.options.show;}if(this.options.start){this.options.display=false;this.options.show=false;
}this.effects={};if(this.options.opacity){this.effects.opacity="fullOpacity";}if(this.options.width){this.effects.width=this.options.fixedWidth?"fullWidth":"offsetWidth";
}if(this.options.height){this.effects.height=this.options.fixedHeight?"fullHeight":"scrollHeight";}for(var B=0,A=this.togglers.length;B<A;B++){this.addSection(this.togglers[B],this.elements[B]);
}this.elements.each(function(E,D){if(this.options.show===D){this.fireEvent("active",[this.togglers[D],E]);}else{for(var F in this.effects){E.setStyle(F,0);
}}},this);if($chk(this.options.display)){this.display(this.options.display);}},addSection:function(E,C,G){E=$(E);C=$(C);var F=this.togglers.contains(E);
var B=this.togglers.length;this.togglers.include(E);this.elements.include(C);if(B&&(!F||G)){G=$pick(G,B-1);E.inject(this.togglers[G],"before");C.inject(E,"after");
}else{if(this.container&&!F){E.inject(this.container);C.inject(this.container);}}var A=this.togglers.indexOf(E);E.addEvent("click",this.display.bind(this,A));
if(this.options.height){C.setStyles({"padding-top":0,"border-top":"none","padding-bottom":0,"border-bottom":"none"});}if(this.options.width){C.setStyles({"padding-left":0,"border-left":"none","padding-right":0,"border-right":"none"});
}C.fullOpacity=1;if(this.options.fixedWidth){C.fullWidth=this.options.fixedWidth;}if(this.options.fixedHeight){C.fullHeight=this.options.fixedHeight;}C.setStyle("overflow","hidden");
if(!F){for(var D in this.effects){C.setStyle(D,0);}}return this;},display:function(A){A=($type(A)=="element")?this.elements.indexOf(A):A;if((this.timer&&this.options.wait)||(A===this.previous&&!this.options.alwaysHide)){return this;
}this.previous=A;var B={};this.elements.each(function(E,D){B[D]={};var C=(D!=A)||(this.options.alwaysHide&&(E.offsetHeight>0));this.fireEvent(C?"background":"active",[this.togglers[D],E]);
for(var F in this.effects){B[D][F]=C?0:E[this.effects[F]];}},this);return this.start(B);}});
/**
 * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
 *
 * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */
if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;
var LayerManager = {

  init : function() {
    this.eventKeyDown = this.keyboardListener.bindWithEvent(this);
    this.eventPosition = this.position.bind(this);

    this.overlay = new Element('div', {
      id :'mb_overlay',
      styles : {
        display :'none'
      }
    }).injectInside(document.body);
    this.center = new Element('div', {
      id :'mb_center',
      styles : {
        display :'none',
        width :'0px',
        height :'0px'
      }
    }).injectInside(document.body);
    this.contents = new Element('div').setProperty('id', 'mb_contents')
        .setStyle('border', '1px').injectInside(this.center);

    this.overlay.onclick = this.close.bind(this);
    //ie6
    //gestendo il click sul center non funzionano piu` i link del layer
    //testato su ie6 e ie7: il layer si chiude lo stesso
    //this.center.onclick = this.close.bind(this);
  },

  open : function(el, options) {
    el = $(el);
    options = $extend( {}, options);
    if (options.url) {
      var layer = el.getFirst();
      if (layer && !options.force) {
        delete options.url;
        this.open(layer, options);
      } else {
        var spinner = options.spinnerTarget ? new Spinner().show(options.spinnerTarget) : null;
        new Request.HTML( {
          url :options.url,
          update :el,
          evalScripts :false,
          onComplete : function(respTree, respElements, respHtml,
              respJavascript) {
            delete options.url;
            if (spinner) spinner.hide().destroy();
            this.open(el.getFirst(), options);
            $exec(respJavascript);
          }.bind(this)
        }).get();
      }
    } else {
      if (this.layer)
        this.close();

      if (options.modal) {
        this.position();
        this.setup(true);
        this.overlay.setStyles( {
          opacity :0.5,
          display :''
        });
      }

      var anchor = $(options.anchor);
      var scrollTop = options.ignoreScroll ? 0 : Window.getScrollTop();

      if (anchor) {
        this.center.setStyle('top', (scrollTop + anchor.getPosition().y) + 'px');
      }
      this.center.setStyle('display', '');

      this.layer = el;
      this.layerDisplay = this.layer.getStyle('display');
      this.layerPrev = this.layer.getPrevious();
      if (!this.layerPrev)
        this.layerParent = this.layer.getParent();
      this.loadContents();
      if (options.x) {
        this.center.setStyle('marginLeft', options.x);
      }
      
      if (!anchor) {
        this.center.setStyle('top', (scrollTop + ((Window.getHeight() - this.center.getHeight()) >> 1)) + 'px');
      }
    }
  },

  position : function() {
    this.overlay.setStyles( {
      top :Window.getScrollTop() + 'px',
      height :Window.getHeight() + 'px'
    });
  },

  setup : function(open) {
    var elements = $A($$('object'));
    elements.extend($$(window.ActiveXObject ? 'select' : 'embed'));
    elements.each( function(el) {
      el.style.visibility = open ? 'hidden' : '';
    });
    var fn = open ? 'addEvent' : 'removeEvent';
    window[fn]('scroll', this.eventPosition)[fn]('resize',
        this.eventPosition);
    document[fn]('keydown', this.eventKeyDown);
  },

  loadContents : function() {
    this.layer.inject(this.contents);
    this.layer.setStyle('display', 'block');
    this.resize();
    return false;
  },

  keyboardListener : function(event) {
    // close the MOOdalBox when the user presses CTRL + W, CTRL + X, ESC
    if ((event.control && event.key == 'w')
        || (event.control && event.key == 'x') || (event.key == 'esc')) {
      this.close();
    }
  },

  close : function() {
    if (this.overlay.getStyle('display') != 'none') {
      this.overlay.setStyles({
        opacity: 0,
        display: 'none'
      });
      this.setup(false);
    }

    this.center.setStyles( {
      display :'none'
    });

    this.layer.setStyle('display', this.layerDisplay);
    if (this.layerPrev)
      this.layer.inject(this.layerPrev, 'after');
    else if (this.layerParent)
      this.layer.inject(this.layerParent);

    this.contents.empty();
    this.layer = null;

    return false;
  },

  resize : function() {
    var alertContent = this.contents.getLast();
    this.contents.setStyles( {
      width :alertContent.offsetWidth + 'px',
      height :alertContent.offsetHeight + 'px',
      opacity :1
    });
    this.center.setStyles( {
      width :this.contents.offsetWidth + 'px',
      height :this.contents.offsetHeight + 'px',
      marginLeft :'-' + (this.contents.offsetWidth / 2) + 'px'
    });
  }

};

// startup
window.addEvent('domready', function() {
  LayerManager.init();
});

var Fotogallery = new Class( {

  Implements: Options,

  initialize : function(el, options) {
    this.el = $(el);
    this.setOptions(options);
    var close = this.el.getElement('a.close');
    if (close) {
      close.addEvent('click', function(e) {
        new Event(e).stop();
        LayerManager.close();
      });
    }

    this.imgs = this.el.getElements('.main-img');
    this.btnBars = this.el.getElements('.buttons');
    this.imgs.each( function(img, i) {
      if (img.hasClass('selected'))
        this.i = i;
    }, this);
    this.l = this.imgs.length;
    this.prev = this.el.getElement('a.prev');
    this.next = this.el.getElement('a.next');
    [ this.prev, this.next ].each( function(link, i) {
      if (link)
        link.addEvent('click', function(e) {
          new Event(e).stop();
          this.move(-1 + (i << 1));
        }.bind(this));
    }, this);
    
    var sendToFriend = this.el.getElement('a.sendToFriend');
    if (sendToFriend) sendToFriend.addEvent('click', this.handleSendToFriendClick.bindWithEvent(this));
  },

  move : function(delta) {
    var i1 = this.i;
    var i2 = (this.i + delta + this.l) % this.l;
    [ this.imgs, this.btnBars ].each( function(item) {
      item[i1].removeClass('selected');
      item[i2].addClass('selected');
    });
    this.i = i2;
  },

  handleSendToFriendClick: function(e) {
    e.stop();
    Emailsupporto(CONTEXT_PATH + this.options.sendToFriendUrl, this.options.sendToFriendTitle, this.options.sendToFriendLink)
  }

});

var FisheyeToolbar = new Class({

  Implements: Options,

  options: {
    itemOptions: {
    },
    center: false,
    debug: false
  },

  initialize: function(ul, options) {
    this.ul = $(ul);
    this.setOptions(options);

    if (this.options.debug) {
      this.cursor = new Element('div', {
        styles: {
          position: 'absolute',
          border: '1px solid red',
          margin: '-2px -2px 0 0',
          width: '4px',
          height: '4px'
        }
      });
      this.cursor.inject(document.body);
    }

    this.items = [];
    if (this.options.debug) this.itemBorders = [];
    this.ul.getElements('li').each(function(li) {
      if (this.options.debug) {
        this.itemBorders.push(new Element('div', {
          styles: {
            position: 'absolute',
            width: '3px',
            marginLeft: '-6px',
            border: '1px solid green',
            borderRight: 'none'
          }
        }).inject(document.body));
      }
      this.items.push(new FisheyeItem(li, this.options.itemOptions));
    }, this);
    this.ul.addEvent('mouseenter', this.handleMouseEnter.bindWithEvent(this));
    this.ul.addEvent('mousemove', this.handleMouseMove.bindWithEvent(this));
    this.ul.addEvent('mouseleave', this.handleMouseLeave.bindWithEvent(this));

    this.fx = new FisheyeFx(this.goTo.bind(this), { duration: 300, transition: Fx.Transitions.linear });
    this.p = this.ul.getPosition();
    this.height = this.padding = 0;
    this.resetElements();
  },

  handleMouseEnter: function(e) {
    this.fx.start(this.p, e.page);
  },

  handleMouseMove: function(e) {
    this.fx.start(this.p, e.page);
  },

  handleMouseLeave: function(e) {
    if (this.options.debug && e.relatedTarget == this.cursor) return;
    this.resetElements();
  },

  resetElements: function() {
    this.fx.stopTimer();
    var liTarget = this.items[this.items.length >> 1].li;

    var oneShotHandler = function() {
      this.fx.removeEvent('complete', oneShotHandler);
      this.goTo(this.getCenter(liTarget));
    }.bind(this);
    this.fx.addEvent('complete', oneShotHandler);

    this.fx.start(this.p, this.getCenter.bind(this, liTarget));
  },

  goTo: function(p) {
    var H = 0;
    this.items.each(function(item) {
      item.prepareScale(p);
      H += item.height + 1;
    });
    this.padding = this.options.center ? (this.ul.getHeight() - H) / 3 : 0;
    this.ul.setStyle('paddingTop', this.padding + 'px');
    this.items.each(function(item) {
      item.performScale();
    });
    this.p = p;
    this.height = H;
    if (this.options.debug) {
      H = 0;
      var pos = this.ul.getPosition();
      this.items.each(function(item, index) {
        this.itemBorders[index].setStyles({ left: pos.x + 'px', top: (pos.y + this.padding + H) + 'px', height: item.height + 'px' });
        H += item.height + 1;
      }, this);
      this.cursor.setStyles({ left: p.x + 'px', top: p.y + 'px' });
    }
  },

  getCenter: function(li) {
    var pos = li.getCoordinates();
    return { x: (pos.left + pos.right) >> 1, y: (pos.top + pos.bottom) >> 1 };
  }

});

var FisheyeItem = new Class( {

  Implements :Options,

  options : {
    distThreshold :160,
    dimFocus : {
      width :200,
      height :100
    },
    dimThumb : {
      width :80,
      height :40
    }
  },

  scale :0,

  initialize : function(li, options) {
    this.li = $(li);
    this.img = this.li.getElements('.fishimg');
    this.setOptions(options);
    this.minHeight = this.li.getHeight();
  },

  prepareScale : function(p) {
    var offset = this.li.getPosition().y
        + (this.options.dimFocus.height * this.scale) / 2;
    var dist = Math.abs(p.y - offset);
    var scale = dist > this.options.distThreshold ? 0 : Math
        .abs(this.options.distThreshold - dist)
        / this.options.distThreshold;
    if (this.options.scaleTransform) {
      scale = this.options.scaleTransform(scale);
    }
    this.dim = {
      width :scale * this.options.dimFocus.width,
      height :scale * this.options.dimFocus.height
    };
    this.height = Math.max(this.minHeight, this.dim.height + 1);
    this.scale = scale;
  },

  performScale : function() {
    this.img.setStyles( {
      width :this.dim.width + 'px',
      height :this.dim.height + 'px',
      visibility :this.dim.width < this.options.dimThumb.width
          || this.dim.height < this.options.dimThumb.height ? 'hidden'
          : 'visible'
    });
  }

});

var FisheyeFx = new Class( {

  Extends :Fx,

  initialize : function(f, options) {
    this.f = f;
    this.parent(options);
  },

  start : function(pf1, pf2) {
    this.f1 = $lambda(pf1);
    this.f2 = $lambda(pf2);
    this.parent(0, 1);
  },

  set : function(now) {
    var p1 = this.f1();
    var p2 = this.f2();
    var p = {
      x :p1.x + now * (p2.x - p1.x),
      y :p1.y + now * (p2.y - p1.y)
    };
    this.f(p);
  }

});

/*
Author:
	luistar15, <leo020588 [at] gmail.com>
License:
	MIT License
 
Class
	noobSlide (rev.19-06-08)

Arguments:
	Parameters - see Parameters below

Parameters:
	box: dom element | required
	items: dom collection | required
	size: int | item size (px) | default: 240
	mode: string | 'horizontal', 'vertical' | default: 'horizontal'
	addButtons:{
		previous: single dom element OR dom collection| default: null
		next:  single dom element OR dom collection | default: null
		play:  single dom element OR dom collection | default: null
		playback:  single dom element OR dom collection | default: null
		stop:  single dom element OR dom collection | default: null
	}
	button_event: string | event type | default: 'click'
	handles: dom collection | default: null
	handle_event: string | event type| default: 'click'
	fxOptions: object | Fx.Tween options | default: {duration:500,wait:false}
	interval: int | for periodical | default: 5000
	autoPlay: boolean | default: false
	onWalk: event | pass arguments: currentItem, currentHandle | default: null
	startItem: int | default: 0
	itemsToShow: int | default: 1

Properties:
	box: dom element
	items: dom collection
	size: int
	mode: string
	buttons: object
	button_event: string
	handles: dom collection
	handle_event: string
	previousIndex: int
	nextIndex: int
	fx: Fx.Tween instance
	interval: int
	autoPlay: boolean
	onWalk: function
	
Methods:
	previous(manual): walk to previous item
		manual: bolean | default:false
	next(manual): walk to next item
		manual: bolean | default:false
	play (interval,direction,wait): auto walk items
		interval: int | required
		direction: string | "previous" or "next" | required
		wait: boolean | required
	stop(): stop auto walk
	walk(item,manual,noFx): walk to item
		item: int | required
		manual: bolean | default:false
		noFx: boolean | default:false
	addHandleButtons(handles):
		handles: dom collection | required
	addActionButtons(action,buttons):
		action: string | "previous", "next", "play", "playback", "stop" | required
		buttons: dom collection | required

Requires:
	mootools 1.2 core
*/
var noobSlide = new Class({

	initialize: function(params){
		this.items = params.items;
		this.mode = params.mode || 'horizontal';
		this.modes = {horizontal:['left','width'], vertical:['top','height']};
		this.size = params.size || 240;
		this.box = params.box.setStyle(this.modes[this.mode][1],(this.size *this.items.length ) +'px');
		this.button_event = params.button_event || 'click';
		this.handle_event = params.handle_event || 'click';
		this.onWalk = params.onWalk || null;
		this.currentIndex = null;
		this.previousIndex = null;
		this.nextIndex = null;
		this.interval = params.interval || 5000;
		this.autoPlay = params.autoPlay || false;
		//fgrilli: added to roll over more than one item at a time 
		this.itemsToShow = params.itemsToShow || 1;
		//console.log works only with firebug
		//console.log('size is ' + this.size)
		//console.log('itemToShow is ' + this.itemsToShow)
		//console.log('mode is ' + this.mode)
		
		this._play = null;
		this.handles = params.handles || null;
		if(this.handles){
			this.addHandleButtons(this.handles);
		}
		this.buttons = {
			previous: [],
			next: [],
			play: [],
			playback: [],
			stop: []
		};
		if(params.addButtons){
			for(var action in params.addButtons){
				this.addActionButtons(action, $type(params.addButtons[action])=='array' ? params.addButtons[action] : [params.addButtons[action]]);
			}
		}
		this.fx = new Fx.Tween(this.box,$extend((params.fxOptions||{duration:500,wait:false}),{property:this.modes[this.mode][0]}));
		this.walk((params.startItem||0),true,true);
	},

	addHandleButtons: function(handles){
		for(var i=0;i<handles.length;i++){
			handles[i].addEvent(this.handle_event,this.walk.bind(this,[i,true]));
		}
	},

	addActionButtons: function(action,buttons){
		for(var i=0; i<buttons.length; i++){
			switch(action){
				case 'previous': buttons[i].addEvent(this.button_event,this.previous.bind(this,[true])); break;
				case 'next': buttons[i].addEvent(this.button_event,this.next.bind(this,[true])); break;
				case 'play': buttons[i].addEvent(this.button_event,this.play.bind(this,[this.interval,'next',false])); break;
				case 'playback': buttons[i].addEvent(this.button_event,this.play.bind(this,[this.interval,'previous',false])); break;
				case 'stop': buttons[i].addEvent(this.button_event,this.stop.bind(this)); break;
			}
			this.buttons[action].push(buttons[i]);
		}
	},

	previous: function(manual){
		this.walk((this.currentIndex>0 ? this.currentIndex-1 : this.items.length-this.itemsToShow),manual);
	},

	next: function(manual){
		this.walk((this.currentIndex<this.items.length-this.itemsToShow ? this.currentIndex+1 : 0),manual);
	},

	play: function(interval,direction,wait){
		this.stop();
		if(!wait){
			this[direction](false);
		}
		this._play = this[direction].periodical(interval,this,[false]);
	},

	stop: function(){
		$clear(this._play);
	},

	walk: function(item,manual,noFx){
		if(item!=this.currentIndex){
			this.currentIndex=item;
			this.previousIndex = this.currentIndex + (this.currentIndex>0 ? -1 : this.items.length-1);
			this.nextIndex = this.currentIndex + (this.currentIndex<this.items.length-1 ? 1 : 1-this.items.length);
			if(manual){
				this.stop();
			}
			//console.log works only with firebug
			//console.log('current item index is ' + this.currentIndex)
			//console.log('moving by ' + (this.size*-this.currentIndex) +'px')
			if(noFx){
				this.fx.cancel().set((this.size*-this.currentIndex)+'px');
			}else{
				this.fx.start(this.size*-this.currentIndex);
			}
			if(manual && this.autoPlay){
				this.play(this.interval,'next',true);
			}
			if(this.onWalk){
				this.onWalk((this.items[this.currentIndex] || null), (this.handles && this.handles[this.currentIndex] ? this.handles[this.currentIndex] : null));
			}
		}
	}
});
/*

CUSTOM FORM ELEMENTS

Created by Ryan Fait
www.ryanfait.com

The only thing you need to change in this file is the following
variables: checkboxHeight, radioHeight and selectWidth.

Replace the first two numbers with the height of the checkbox and
radio button. The actual height of both the checkbox and radio
images should be 4 times the height of these two variables. The
selectWidth value should be the width of your select list image.

You may need to adjust your images a bit if there is a slight
vertical movement during the different stages of the button
activation.

Visit http://ryanfait.com/ for more information.

 */

var checkboxHeight = "25";
var radioHeight = "25";
var selectWidth = "190";

/* No need to change anything after this */

document
    .write('<style type="text/css">input.styled { display: none; } select.styled { position: relative; width: ' + selectWidth + 'px; opacity: 0; z-index: 5; }</style>');

var Custom = {
  init : function() {
    var inputs = document.getElementsByTagName("input"), span = Array(), textnode, option, active;
    for (a = 0; a < inputs.length; a++) {
      if ((inputs[a].type == "checkbox" || inputs[a].type == "radio")
          && inputs[a].className == "styled") {
        span[a] = document.createElement("span");
        span[a].className = inputs[a].type;

        if (inputs[a].checked == true) {
          if (inputs[a].type == "checkbox") {
            position = "0 -" + (checkboxHeight * 2) + "px";
            span[a].style.backgroundPosition = position;
          } else {
            position = "0 -" + (radioHeight * 2) + "px";
            span[a].style.backgroundPosition = position;
          }
        }
        inputs[a].parentNode.insertBefore(span[a], inputs[a]);
        inputs[a].onchange = Custom.clear;
        span[a].onmousedown = Custom.pushed;
        span[a].onmouseup = Custom.check;
        document.onmouseup = Custom.clear;
      }
    }
    inputs = document.getElementsByTagName("select");
    for (a = 0; a < inputs.length; a++) {
      if (inputs[a].className == "styled") {
        option = inputs[a].getElementsByTagName("option");
        active = option[0].childNodes[0].nodeValue;
        textnode = document.createTextNode(active);
        for (b = 0; b < option.length; b++) {
          if (option[b].selected == true) {
            textnode = document
                .createTextNode(option[b].childNodes[0].nodeValue);
          }
        }
        span[a] = document.createElement("span");
        span[a].className = "select";
        span[a].id = "select" + inputs[a].name;
        span[a].appendChild(textnode);
        inputs[a].parentNode.insertBefore(span[a], inputs[a]);
        inputs[a].onchange = Custom.choose;
      }
    }
  },
  pushed : function() {
    element = this.nextSibling;
    if (element.checked == true && element.type == "checkbox") {
      this.style.backgroundPosition = "0 -" + checkboxHeight * 3 + "px";
    } else if (element.checked == true && element.type == "radio") {
      this.style.backgroundPosition = "0 -" + radioHeight * 3 + "px";
    } else if (element.checked != true && element.type == "checkbox") {
      this.style.backgroundPosition = "0 -" + checkboxHeight + "px";
    } else {
      this.style.backgroundPosition = "0 -" + radioHeight + "px";
    }
  },
  check : function() {
    element = this.nextSibling;
    if (element.checked == true && element.type == "checkbox") {
      this.style.backgroundPosition = "0 0";
      element.checked = false;
    } else {
      if (element.type == "checkbox") {
        this.style.backgroundPosition = "0 -" + checkboxHeight * 2 + "px";
      } else {
        this.style.backgroundPosition = "0 -" + radioHeight * 2 + "px";
        group = this.nextSibling.name;
        inputs = document.getElementsByTagName("input");
        for (a = 0; a < inputs.length; a++) {
          if (inputs[a].name == group && inputs[a] != this.nextSibling) {
            inputs[a].previousSibling.style.backgroundPosition = "0 0";
          }
        }
      }
      element.checked = true;
    }
  },
  clear : function() {
    inputs = document.getElementsByTagName("input");
    for ( var b = 0; b < inputs.length; b++) {
      if (inputs[b].type == "checkbox" && inputs[b].checked == true
          && inputs[b].className == "styled") {
        inputs[b].previousSibling.style.backgroundPosition = "0 -"
            + checkboxHeight * 2 + "px";
      } else if (inputs[b].type == "checkbox"
          && inputs[b].className == "styled") {
        inputs[b].previousSibling.style.backgroundPosition = "0 0";
      } else if (inputs[b].type == "radio" && inputs[b].checked == true
          && inputs[b].className == "styled") {
        inputs[b].previousSibling.style.backgroundPosition = "0 -"
            + radioHeight * 2 + "px";
      } else if (inputs[b].type == "radio" && inputs[b].className == "styled") {
        inputs[b].previousSibling.style.backgroundPosition = "0 0";
      }
    }
  },
  choose : function() {
    option = this.getElementsByTagName("option");
    for (d = 0; d < option.length; d++) {
      if (option[d].selected == true) {
        document.getElementById("select" + this.name).childNodes[0].nodeValue = option[d].childNodes[0].nodeValue;
      }
    }
  }
}
window.onload = Custom.init;
// Current Page Reference

function getURL(uri) {
  uri.dir = location.href.substring(0, location.href.lastIndexOf('\/'));
  uri.dom = uri.dir;
  if (uri.dom.substr(0, 7) == 'http:\/\/')
    uri.dom = uri.dom.substr(7);
  uri.path = '';
  var pos = uri.dom.indexOf('\/');
  if (pos > -1) {
    uri.path = uri.dom.substr(pos + 1);
    uri.dom = uri.dom.substr(0, pos);
  }
  uri.page = location.href.substring(uri.dir.length + 1,
      location.href.length + 1);
  pos = uri.page.indexOf('?');
  if (pos > -1) {
    uri.page = uri.page.substring(0, pos);
  }
  pos = uri.page.indexOf('#');
  if (pos > -1) {
    uri.page = uri.page.substring(0, pos);
  }
  uri.ext = '';
  pos = uri.page.indexOf('.');
  if (pos > -1) {
    uri.ext = uri.page.substring(pos + 1);
    uri.page = uri.page.substr(0, pos);
  }
  uri.file = uri.page;
  if (uri.ext != '')
    uri.file += '.' + uri.ext;
  if (uri.file == '')
    uri.page = 'index';
  uri.args = location.search.substr(1).split("?");
  return uri;
}

function printit() {

   print();

  }

function Emailsupporto(emailpage, title, linktosend) {
  var uri = new Object();
  var currenturi = getURL(uri);
  linktosend = linktosend
      || (currenturi.dir + "/" + currenturi.page + "." + currenturi.ext);
  /*
   * location.href = emailpage + "?msg=<a href='" + currenturi.dir + "/" +
   * currenturi.page + "." + currenturi.ext + "'>" + currenturi.dir + "/" +
   * currenturi.page + "." + currenturi.ext + "</a>&obj="+title+"";
   */
  location.href = emailpage + "?linktosend=" + linktosend + "&obj=" + title
      + "";
}

function vai(list) {
  location.href = list.options[list.selectedIndex].value;
}

function addToFavorites(bookmarktitle) {
  var url = location.href; /*
                 * this is for bookmarking the current page, if
                 * possible you can provide your own URL like
                 * (var url =
                 * "http://www.developersnippets.com";)
                 */

  bookmarkurl = url;
  if (document.all)
    window.external.AddFavorite(bookmarkurl, bookmarktitle)
  else if (window.sidebar) {
    window.sidebar.addPanel(bookmarktitle, bookmarkurl, "");
  }
}

function creaModalLayer() {
  var array = $$('.vocemenu');
  if (!array.length) return;
  var anchor = array[0].getElement('.toggler') || array[0];
  array.each(function(vocemenu) {
    vocemenu.addEvent('click', function(e) {
      new Event(e).stop();
      var layer = vocemenu.getNext();
      if (layer && layer.hasClass('layer')) {
        var headerprofile = $('sidebar').getElement('.headerprofile');
        LayerManager.open(layer, { modal: false, x: '-218px', anchor: anchor, ignoreScroll: true });
      }
    });
  });
}

window.addEvent('domready', creaModalLayer);

/*
 * TODO write doc
 * TODO clean up this mess and make a decent class of it
  Parameters:
  		this.overview = params.overview;
		this.background = params.backgroundImg;
		this.mask = params.mask;
		this.container = params.container;
		this.noobslide = params.noobslide; 
		this.textover = params.textover
		this.duration = params.duration; 

		Requires:
		  mootools 1.2 core
 */

var PageNavigationMenu = new Class( {

	initialize : function(params) {
		this.overview = params.overview;
		this.background = params.backgroundImg;
		this.mask = params.mask;
		this.container = params.container;
		this.noobslide = params.noobslide;
		this.textover = params.textover;
		this.duration = params.duration || 'normal';

		var initialBackgroundImage = this.background.get('src');

		var textover = this.textover
		var overview = this.overview

		// set the background image
		$('headerimg').setStyles( {
			'background-image' :'url(' + initialBackgroundImage + ')'
		})

		this.overview.setStyle('opacity', '0.8')
		var linkText = $('linkText')
		
		var menuFx = new Fx.Slide(this.mask, {
			'mode' :'vertical',
			'duration' :this.duration
		})
		// start hidden
		menuFx.hide();

		// add events to each menu item
		this.noobslide.items.each( function(item, index) {
			item.setStyles( {
				'margin-top' :'10px',
				'margin-bottom' :'10px'
			})
			item.getElementById('itemImage' + (index + 1)).setStyle('opacity','0.7')

			item.addEvents( {
				'click' : function() {
					$('page-nav').removeClass('withBg')
					bgImg = item.getElementById('backgroundImage' + (index + 1))
					if($defined(bgImg)) 
						$('headerimg').setStyle('background-image' ,'url(' + (bgImg.get('src')) + ')')
						
							textover.setStyle('display', 'none')
							itemText = item.getElementById('text' + (index + 1))
							itemTitle = item.getElementById('title' + (index + 1))
							link = item.getElementById('link' + (index + 1))
							if (itemText) {
								html = '<strong><h2 style="white-space:nowrap;overflow:hidden;">' + itemTitle.get('text')
										+ '</h2></strong><p class="paragraph">'
										+ itemText.get('text')
							if (link)
									html += '<br /><a href=\''
										 + link.get('text') + '\'>'
										+ linkText.get('text') + '</a>'
								html += '</p>'
								textover.set('html', html)
								textover.setStyles( {
									'display' :'block',
									'opacity' :'0.8'
								})
							}

							overview.fade(0.8)
							if (showButtons) {
								$('itemUp').setStyle('display', 'none')
								$('itemDown').setStyle('display', 'none')
							}
							menuFx.slideOut()
				},
				'mouseenter' : function() {
					item.getElementById('itemImage' + (index + 1)).fade('1')
				},
				'mouseleave' : function() {
					item.getElementById('itemImage' + (index + 1)).fade('0.7')
				}
			})
		})

		// get item size dynamically to pass it to noobslide
		var itemHeight = this.noobslide.items[0].getSize().y
		var margin = this.noobslide.items[0].getStyle('margin-top').toInt()
		itemHeight += margin
		// adjust item height with margins and border
		this.noobslide.size = itemHeight + 2

		var maxitems = this.noobslide.itemsToShow
		showButtons = false

		if (this.noobslide.items.length > 4) showButtons = true
		
			// show max n items at the same time
		this.mask.setStyles( {
			'height' :(itemHeight * maxitems) + 2
		})

		this.overview.addEvents( {
			'mouseenter' : function() {
				menuFx.cancel();
				overview.fade(0)
				// hides text layer temporarily otherwise the
				// menu gets unreadable
				textover.setStyle('opacity', 0)
				$('page-nav').addClass('withBg')
				menuFx.slideIn()
				if (showButtons) {
					$('itemUp').setStyle('display', 'block')
					$('itemDown').setStyle('display', 'block')
				}
			}
		})

		this.container.addEvents( {
			'mouseleave' : function() {
				menuFx.cancel();
				// text layer is visible again
				textover.setStyle('opacity', 0.8)
				overview.fade(0.8)
				$('page-nav').removeClass('withBg')
				menuFx.slideOut()
				if (showButtons) {
					$('itemUp').setStyle('display', 'none')
					$('itemDown').setStyle('display', 'none')
				}
			}
		})
	}
});
/**
 * ReMooz - Zoomer
 *
 * Inspired by so many boxes and zooms
 *
 * @version		1.0
 *
 * @license		MIT-style license
 * @author		Harald Kirschner <mail [at] digitarald.de>
 * @copyright	Author
 */

var ReMooz = new Class({

  Implements: [Events, Options, Chain],

  options: {
    link: null,
    type: 'image',
    container: null,
    className: null,
    centered: false,
    dragging: true,
    closeOnClick: true,
    shadow: (Browser.Engine.trident) ? 'onOpenEnd' : 'onOpen', // performance
    resize: true,
    margin: 20,
    resizeFactor: 0.95,
    resizeLimit: false, // {x: 640, y: 640}
    fixedSize: false,
    cutOut: true,
    addClick: true,
    opacityLoad: 0.6,
    opacityResize: 1,
    opacityTitle: 0.9,
    resizeOptions: {},
    fxOptions: {},
    closer: true,
    parse: false, // 'rel'
    parseSecure: false,
    temporary: false,
    onBuild: $empty,
    onLoad: $empty,
    onOpen: $empty,
    onOpenEnd: $empty,
    onClose: $empty,
    onCloseEnd: $empty,
    generateTitle: function(el) {
      var text = el.get('title');
      if (!text) return false;
      var title = text.split(' :: ');
      var head = new Element('h6', {'html': title[0]});
      return (title[1]) ? [head, new Element('p', {'html': title[1]})] : head;
    }
  },

  initialize: function(element, options) {
    this.element = $(element);
    this.setOptions(options);
    if (this.options.parse) {
      var obj = this.element.getProperty(this.options.parse);
      if (obj && (obj = JSON.decode(obj, this.options.parseSecure))) this.setOptions(obj);
    }
    var origin = this.options.origin;
    this.origin = ((origin) ? $(origin) || this.element.getElement(origin) : null) || this.element;
    this.link = this.options.link || this.element.get('href') || this.element.get('src');
    this.container = $(this.options.container) || this.element.getDocument();
    this.bound = {
      'click': function(e) {
        this.open.delay(1, this);
        return false;
      }.bind(this),
      'close': this.close.bind(this),
      'dragClose': function(e) {
        if (e.rightClick) return;
        this.close();
      }.bind(this)
    };
    if (this.options.addClick) this.bindToElement();
  },

  destroy: function() {
    if (this.box) this.box.destroy();
    this.box = this.tweens = this.body = this.content = null;
  },

  bindToElement: function(element) {
    ($(element) || this.element).addClass('remooz-element').addEvent('click', this.bound.click);
    return this;
  },

  getOriginCoordinates: function() {
    var coords = this.origin.getCoordinates();
    delete coords.right;
    delete coords.bottom;
    return coords;
  },

  open: function(e) {
    if (this.opened) return (e) ? this.close() : this;
    this.opened = this.loading = true;
    if (!this.box) this.build();
    this.coords = this.getOriginCoordinates();
    this.coords.opacity = this.options.opacityLoad;
    this.coords.display = '';
    this.tweens.box.set(this.coords);
    this.box.addClass('remooz-loading');
    ReMooz.open(this.fireEvent('onLoad'));
    this['open' + this.options.type.capitalize()]();
    return this;
  },

  finishOpen: function() {
    this.tweens.fade.start(0, 1);
    this.drag.attach();
    this.fireEvent('onOpenEnd').callChain();
  },

  close: function() {
    if (!this.opened) return this;
    this.opened = false;
    ReMooz.close(this.fireEvent('onClose'));
    if (this.loading) {
      this.box.setStyle('display', 'none');
      return this;
    }
    this.drag.detach();
    this.tweens.fade.cancel().set(0).fireEvent('onComplete');
    if (this.tweens.box.timer) this.tweens.box.clearChain();
    var vars = this.getOriginCoordinates();
    if (this.options.opacityResize != 1) vars.opacity = this.options.opacityResize;
    this.tweens.box.start(vars).chain(this.closeEnd.bind(this));
    return this;
  },

  closeEnd: function() {
    if (this.options.cutOut) this.element.setStyle('visibility', 'visible');
    this.box.setStyle('display', 'none');
    this.fireEvent('onCloseEnd').callChain();
    if (this.options.temporary) this.destroy();
  },

  openImage: function() {
    var tmp = new Image();
    tmp.onload = tmp.onabort = tmp.onerror = function(fast) {
      this.loading = tmp.onload = tmp.onabort = tmp.onerror = null;
      if (!tmp.width || !this.opened) {
        this.fireEvent('onError').close();
        return;
      }
      var to = {x: tmp.width, y: tmp.height};
      if (!this.content) this.content = $(tmp).inject(this.body);
      else tmp = null;
      this[(this.options.resize) ? 'zoomRelativeTo' : 'zoomTo'].create({
        'delay': (tmp && fast !== true) ? 1 : null,
        'arguments': [to],
        'bind': this
      })();
    }.bind(this);
    tmp.src = this.link;
    if (tmp && tmp.complete && tmp.onload) tmp.onload(true);
  },

  /**
   * @todo Test implementation
   */
  openElement: function() {
    this.content = this.content || $(this.link) || $E(this.link);
    if (!this.content) {
      this.fireEvent('onError').close();
      return;
    }
    this.content.inject(this.body);
    this.zoomTo({x: this.content.scrollWidth, y: this.content.scrollHeight});
  },

  zoomRelativeTo: function(to) {
    var scale = this.options.resizeLimit;
    if (!scale) {
      scale = this.container.getSize();
      scale.x *= this.options.resizeFactor;
      scale.y *= this.options.resizeFactor;
    }
    for (var i = 2; i--;) {
      if (to.x > scale.x) {
        to.y *= scale.x / to.x;
        to.x = scale.x;
      } else if (to.y > scale.y) {
        to.x *= scale.y / to.y;
        to.y = scale.y;
      }
    }
    return this.zoomTo({x: to.x.toInt(), y: to.y.toInt()});
  },

  zoomTo: function(to) {
    to = this.options.fixedSize || to;
    var box = this.container.getSize(), scroll = this.container.getScroll();
    var pos = (!this.options.centered) ? {
      x: (this.coords.left + (this.coords.width / 2) - to.x / 2).toInt()
        .limit(scroll.x + this.options.margin, scroll.x + box.x - this.options.margin - to.x),
      y: (this.coords.top + (this.coords.height / 2) - to.y / 2).toInt()
        .limit(scroll.y + this.options.margin, scroll.y + box.y - this.options.margin - to.y)
    } :  {
      x: scroll.x + ((box.x - to.x) / 2).toInt(),
      y: scroll.y + ((box.y - to.y) / 2).toInt()
    };
    if (this.options.cutOut) this.element.setStyle('visibility', 'hidden');
    this.box.removeClass('remooz-loading');
    var vars = {left: pos.x, top: pos.y, width: to.x, height: to.y};
    if (this.options.opacityResize != 1) vars.opacity = [this.options.opacityResize, 1];
    else this.box.set('opacity', 1);
    this.tweens.box.start(vars).chain(this.finishOpen.bind(this));
    this.fireEvent('onOpen');
  },

  build: function() {
    this.addEvent('onBlur', function() {
      this.focused = false;
      this.box.removeClass('remooz-box-focus').setStyle('z-index', ReMooz.options.zIndex);
    }, true);
    this.addEvent('onFocus', function() {
      this.focused = true;
      this.box.addClass('remooz-box-focus').setStyle('z-index', ReMooz.options.zIndexFocus);
    }, true);

    var classes = ['remooz-box', 'remooz-type-' + this.options.type, 'remooz-engine-' + Browser.Engine.name + Browser.Engine.version];
    if (this.options.className) classes.push(this.options.className);
    this.box = new Element('div', {
      'class': classes.join(' '),
      'styles': {
        'display': 'none',
        'top': 0,
        'left': 0,
        'zIndex': ReMooz.options.zIndex
      }
    });

    this.tweens = {
      'box': new Fx.Morph(this.box, $merge({
          'duration': 400,
          'unit': 'px',
          'transition': Fx.Transitions.Quart.easeOut,
          'chain': 'cancel'
        }, this.options.resizeOptions)
      ),
      'fade': new Fx.Tween(null, $merge({
          'property': 'opacity',
          'duration': (Browser.Engine.trident) ? 0 : 300,
          'chain': 'cancel'
        }, this.options.fxOptions)).addEvents({
          'onComplete': function() {
            if (!this.element.get('opacity')) this.element.setStyle('display', 'none');
          },
          'onStart': function() {
            if (!this.element.get('opacity')) this.element.setStyle('display', '');
          }
        }
      )
    };
    this.tweens.fade.element = $$();

    if (this.options.shadow) {
      if (Browser.Engine.webkit420) {
        this.box.setStyle('-webkit-box-shadow', '0 0 10px rgba(0, 0, 0, 0.7)');
      } else if (!Browser.Engine.trident4) {
        var shadow = new Element('div', {'class': 'remooz-bg-wrap'}).inject(this.box);
        ['n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'].each(function(dir) {
          new Element('div', {'class': 'remooz-bg remooz-bg-' + dir}).inject(shadow);
        });
        this.tweens.bg = new Fx.Tween(shadow, {
          'property': 'opacity',
          'chain': 'cancel'
        }).set(0);
        this.addEvent(this.options.shadow, this.tweens.bg.set.bind(this.tweens.bg, 1), true);
        this.addEvent('onClose', this.tweens.bg.set.bind(this.tweens.bg, 0), true);
      }
    }

    if (this.options.closer) {
      var closer = new Element('a', {
        'class': 'remooz-btn-close',
        'events': {'click': this.bound.close}
      }).inject(this.box);
      this.tweens.fade.element.push(closer);
    }
    this.body = new Element('div', {'class': 'remooz-body'}).inject(this.box);

    var title = this.options.title || this.options.generateTitle.call(this, this.element);
    if (title) { // thx ie6
      var title = new Element('div', {'class': 'remooz-title'}).adopt(
        new Element('div', {'class': 'remooz-title-bg', 'opacity': this.options.opacityTitle}),
        new Element('div', {'class': 'remooz-title-content'}).adopt(title)
      ).inject(this.box);
      this.tweens.fade.element.push(title);
    }
    this.tweens.fade.set(0).fireEvent('onComplete');

    this.drag = new Drag.Move(this.box, {
      'snap': 15,
      'preventDefault': true,
      'onBeforeStart': function() {
        if (!this.focused && !this.loading) ReMooz.focus(this);
        else if (this.loading || this.options.closeOnClick) this.box.addEvent('mouseup', this.bound.dragClose);
      }.bind(this),
      'onSnap': function() {
        this.box.removeEvent('mouseup', this.bound.dragClose);
        if (!this.options.dragging) this.drag.stop();
        else this.box.addClass('remooz-box-dragging');
      }.bind(this),
      'onComplete': function() {
        this.box.removeClass('remooz-box-dragging');
      }.bind(this)
    });
    this.drag.detach();

    this.fireEvent('onBuild', this.box, this.element);
    this.box.inject(this.element.getDocument().body);

    // @fgiust added to manage link on images,  should find a better way
    this.box.element = this.element;
  }

});

ReMooz.factory = function(extended) {
  return $extend(this, extended);
};

ReMooz.factory(new Options).factory({

  options: {
    zIndex: 41,
    zIndexFocus: 42,
    query: 'a.remooz',
    modal: false
  },

  assign: function(elements, options) {
    return $$(elements).map(function(element) {
      return new ReMooz(element, options);
    }, this);
  },

  stack: [],

  open: function(obj) {
    var last = this.stack.getLast();
    this.focus(obj);
    if (last && this.options.modal) last.close();
  },

  close: function(obj) {
    var length = this.stack.length - 1;
    if (length > 1 && this.stack[length] == obj) this.focus(this.stack[length - 1]);
    this.stack.erase(obj);
  },

  focus: function(obj) {
    var last = this.stack.getLast();
    obj.fireEvent('onFocus', [obj]);
    if (last == obj) return;
    if (last) last.fireEvent('onBlur', [last]);
    this.stack.erase(obj).push(obj);
  }

});
window.addEvent('domready', function() {
  $$('a[class^=external]').forEach( function(link) {
    link.target = "_blank";
  });
});

window.addEvent('domready', function() {
  if ($chk($("consigli"))) {
    var MyConsigli = new Consigli("consigli");
  }
});

window.addEvent('domready', function() {
  if (Cookie.read('dimension')) {
    var myCookie = Cookie.read('dimension');
    setDimension(myCookie);
  }
});

window.addEvent('domready', function() {
  if (Browser.Engine.trident4) {
    $$('html').forEach( function(e) {
      e.addClass("ie6");
    });
  }
});


window.addEvent('domready', function() {
  if ($chk($("banner"))) {
    var children = $('banner').getChildren();
    if (children.length <= 1){
      $('banner').setStyle('padding-top','0px');
      $('banner').setStyle('padding','0px');
      $('banner').setStyle('background','none');
    }
    else
    {
      $('banner').addClass('banner_noempty');

    }
   }
 });
/*window.addEvent('domready', function() {
  var altezza = $('footer').getPosition().y + "px";
  $('backright2').setStyle('height',altezza);
  $('backright1').setStyle('height',altezza);
  });
*/
/*FIX CHE SI APPLICA QUANDO IL MENï¿½ ï¿½ PIï¿½ LUNGO DEL CONTENUTO*/
window.addEvent('domready', function() {
  if ($chk($('fullLeft'))){
    if ($('fullLeft').getSize().y.toInt() > $('mainarea').getSize().y.toInt())
    {
        $('mainarea').setStyle('min-height',$('fullLeft').getSize().y+'px');
          $('mainarea').setStyle('height',$('fullLeft').getSize().y+'px');
    }
  }
 });
/**
 * Add a toggle function to all elements
 * copied with inner gratitude from http://davidwalsh.name/implementing-basic-fancy-show-hide-mootools
 * */
window.addEvent('domready', function() {
  Element.implement({
   toggle: function() {
     if(this.getStyle('display') == 'none')
       this.setStyle('display','')
     else
       this.setStyle('display','none')
       }
   })
 });

/*
window.addEvent('domready', function() {
  if (/MSIE (5\.5|6)/.test(navigator.userAgent)) {
    var printer = $('printer');
    if (printer) printer.setStyle('display', 'none');
  }
});
*/
// Calendar: a Javascript class for Mootools that adds accessible and unobtrusive date pickers to your form elements <http://electricprism.com/aeron/calendar>
// Calendar RC4, Copyright (c) 2007 Aeron Glemann <http://electricprism.com/aeron>, MIT Style License.
// fgrilli: had to remame js class to MooCalendar as it clashes with www.dynarch.com/projects/calendar
// fgrilli: converted to mootools 1.2 

var MooCalendar = new Class({	
	Implements: [Options, Events],

	options: {
		blocked: [], // blocked dates 
		classes: [], // ['calendar', 'prev', 'next', 'month', 'year', 'today', 'invalid', 'valid', 'inactive', 'active', 'hover', 'hilite']
		days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // days of the week starting at sunday
		direction: 0, // -1 past, 0 past + future, 1 future
		draggable: true,
		months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
		navigation: 1, // 0 = no nav; 1 = single nav for month; 2 = dual nav for month and year
		offset: 0, // first day of the week: 0 = sunday, 1 = monday, etc..
		onHideStart: Class.empty,
		onHideComplete: Class.empty,
		onShowStart: Class.empty,
		onShowComplete: Class.empty,
		pad: 1, // padding between multiple calendars
		tweak: {x: 0, y: 0} // tweak calendar positioning
	},

	// initialize: calendar constructor
	// @param obj (obj) a js object containing the form elements and format strings { id: 'format', id: 'format' etc }
	// @param props (obj) optional properties

	initialize: function(obj, options) {
		// basic error checking
		if (!obj) { return false; }

		this.setOptions(options);

		// create our classes array
		var keys = ['calendar', 'prev', 'next', 'month', 'year', 'today', 'invalid', 'valid', 'inactive', 'active', 'hover', 'hilite'];

		var values = keys.map(function(key, i) {
			if (this.options.classes[i]) {
				if (this.options.classes[i].length) { key = this.options.classes[i]; }
			}
			return key;
		}, this);

		this.classes = values.associate(keys);

		// create cal element with css styles required for proper cal functioning
		this.calendar = new Element('div', { 
			'styles': { left: '-1000px', opacity: 0, position: 'absolute', top: '-1000px', zIndex: 1000 }
		}).addClass(this.classes.calendar).injectInside(document.body);

		// iex 6 needs a transparent iframe underneath the calendar in order to not allow select elements to render through
		if (window.ie6) {
			this.iframe = new Element('iframe', { 
				'styles': { left: '-1000px', position: 'absolute', top: '-1000px', zIndex: 999 }
			}).injectInside(document.body);
			this.iframe.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';
		}
		// initialize fade method
		this.fx = new Fx.Tween(this.calendar, {
			property: 'opacity',
			onStart: function() { 
				if (this.calendar.getStyle('opacity') == 0) { // show
					if (window.ie6) { this.iframe.setStyle('display', 'block'); }
					this.calendar.setStyle('display', 'block');
					this.fireEvent('onShowStart', this.element);
				}
				else { // hide
					this.fireEvent('onHideStart', this.element);
				}
			}.bind(this),
			onComplete: function() { 
				if (this.calendar.getStyle('opacity') == 0) { // hidden
					this.calendar.setStyle('display', 'none');
					if (window.ie6) { this.iframe.setStyle('display', 'none'); }
					this.fireEvent('onHideComplete', this.element);
				}
				else { // shown
					this.fireEvent('onShowComplete', this.element);
				}
			}.bind(this)
		});

		// initialize drag method
		if (window.Drag && this.options.draggable) {
			this.drag = new Drag.Move(this.calendar, { 
				onDrag: function() {
					if (window.ie6) { this.iframe.setStyles({ left: this.calendar.style.left, top: this.calendar.style.top }); } 
				}.bind(this) 
			}); 
		}
		
		// create calendars array
		this.calendars = [];

		var id = 0;
		var d = new Date(); // today

		d.setDate(d.getDate() + this.options.direction.toInt()); // correct today for directional offset

		for (var i in obj) {
			var cal = { 
				button: new Element('button', { 'type': 'button' }),
				el: $(i),
				els: [],
				id: id++,
				month: d.getMonth(),
				visible: false,
				year: d.getFullYear()
			};

			// fix for bad element (naughty, naughty element!)
			if (!this.element(i, obj[i], cal)) { continue; }
			
			cal.el.addClass(this.classes.calendar);

			// create cal button
			cal.button.addClass(this.classes.calendar).addEvent('click', function(cal) { this.toggle(cal); }.pass(cal, this)).injectAfter(cal.el);

			// read in default value
			cal.val = this.read(cal);

			$extend(cal, this.bounds(cal)); // abs bounds of calendar

			$extend(cal, this.values(cal)); // valid days, months, years

			this.rebuild(cal);

			this.calendars.push(cal); // add to cals array		
		}	
	},


	// blocked: returns an array of blocked days for the month / year
	// @param cal (obj)
	// @returns blocked days (array)

	blocked: function(cal) {
		var blocked = [];
		var offset = new Date(cal.year, cal.month, 1).getDay(); // day of the week (offset)
		var last = new Date(cal.year, cal.month + 1, 0).getDate(); // last day of this month
		
		this.options.blocked.each(function(date){
			var values = date.split(' ');
			
			// preparation
			for (var i = 0; i <= 3; i++){ 
				if (!values[i]){ values[i] = (i == 3) ? '' : '*'; } // make sure blocked date contains values for at least d, m and y
				values[i] = values[i].contains(',') ? values[i].split(',') : new Array(values[i]); // split multiple values
				var count = values[i].length - 1;
				for (var j = count; j >= 0; j--){
					if (values[i][j].contains('-')){ // a range
						var val = values[i][j].split('-');
						for (var k = val[0]; k <= val[1]; k++){
							if (!values[i].contains(k)){ values[i].push(k + ''); }
						}
						values[i].splice(j, 1);
					}
				}
			}

			// execution
			if (values[2].contains(cal.year + '') || values[2].contains('*')){
				if (values[1].contains(cal.month + 1 + '') || values[1].contains('*')){
					values[0].each(function(val){ // if blocked value indicates this month / year
						if (val > 0){ blocked.push(val.toInt()); } // add date to blocked array
					});

					if (values[3]){ // optional value for day of week
						for (var i = 0; i < last; i++){
								var day = (i + offset) % 7;
	
								if (values[3].contains(day + '')){ 
									blocked.push(i + 1); // add every date that corresponds to the blocked day of the week to the blocked array
								}
						}
					}
				}
			}
		}, this);

		return blocked;
	},


	// bounds: returns the start / end bounds of the calendar
	// @param cal (obj)
	// @returns obj	

	bounds: function(cal) {
		// 1. first we assume the calendar has no bounds (or a thousand years in either direction)
		
		// by default the calendar will accept a millennium in either direction
		var start = new Date(1000, 0, 1); // jan 1, 1000
		var end = new Date(2999, 11, 31); // dec 31, 2999

		// 2. but if the cal is one directional we adjust accordingly
		var date = new Date().getDate() + this.options.direction.toInt();

		if (this.options.direction > 0) {
			start = new Date();
			start.setDate(date + this.options.pad * cal.id);
		}
		
		if (this.options.direction < 0) {
			end = new Date();
			end.setDate(date - this.options.pad * (this.calendars.length - cal.id - 1));
		}

		// 3. then we can further filter the limits by using the pre-existing values in the selects
		cal.els.each(function(el) {	
			if (el.get('tag') == 'select') {		
				if (el.format.test('(y|Y)')) { // search for a year select
					var years = [];

					el.getChildren().each(function(option) { // get options
						var values = this.unformat(option.value, el.format);
	
						if (!years.contains(values[0])) { years.push(values[0]); } // add to years array
					}, this);
	
					years.sort(this.sort);
			
					if (years[0] > start.getFullYear()) { 
						d = new Date(years[0], start.getMonth() + 1, 0); // last day of new month
					
						if (start.getDate() > d.getDate()) { start.setDate(d.getDate()); }
	
						start.setYear(years[0]); 
					}
					
					if (years.getLast() < end.getFullYear()) { 
						d = new Date(years.getLast(), end.getMonth() + 1, 0); // last day of new month
					
						if (end.getDate() > d.getDate()) { end.setDate(d.getDate()); }
	
						end.setYear(years.getLast());
					}		
				}
	
				if (el.format.test('(F|m|M|n)')) { // search for a month select
					var months_start = [];
					var months_end = [];

					el.getChildren().each(function(option) { // get options
						var values = this.unformat(option.value, el.format);
	
						if ($type(values[0]) != 'number' || values[0] == years[0]) { // if it's a year / month combo for curr year, or simply a month select
							if (!months_start.contains(values[1])) { months_start.push(values[1]); } // add to months array
						}
	
						if ($type(values[0]) != 'number' || values[0] == years.getLast()) { // if it's a year / month combo for curr year, or simply a month select
							if (!months_end.contains(values[1])) { months_end.push(values[1]); } // add to months array
						}
					}, this);
	
					months_start.sort(this.sort);
					months_end.sort(this.sort);
					
					if (months_start[0] > start.getMonth()) { 
						d = new Date(start.getFullYear(), months_start[0] + 1, 0); // last day of new month
					
						if (start.getDate() > d.getDate()) { start.setDate(d.getDate()); }
	
						start.setMonth(months_start[0]); 
					}
					
					if (months_end.getLast() < end.getMonth()) { 
						d = new Date(start.getFullYear(), months_end.getLast() + 1, 0); // last day of new month
					
						if (end.getDate() > d.getDate()) { end.setDate(d.getDate()); }
	
						end.setMonth(months_end.getLast());
					}		
				}
			}
		}, this);
		
		return { 'start': start, 'end': end };
	},


	// caption: returns the caption element with header and navigation
	// @param cal (obj)
	// @returns caption (element)

	caption: function(cal) {
		// start by assuming navigation is allowed
		var navigation = {
			prev: { 'month': true, 'year': true },
			next: { 'month': true, 'year': true }
		};
		
		// if we're in an out of bounds year
		if (cal.year == cal.start.getFullYear()) { 
			navigation.prev.year = false; 
			if (cal.month == cal.start.getMonth() && this.options.navigation == 1) { 
				navigation.prev.month = false;
			}		
		}		
		if (cal.year == cal.end.getFullYear()) { 
			navigation.next.year = false; 
			if (cal.month == cal.end.getMonth() && this.options.navigation == 1) { 
				navigation.next.month = false;
			}
		}

		// special case of improved navigation but months array with only 1 month we can disable all month navigation
		if ($type(cal.months) == 'array') {
			if (cal.months.length == 1 && this.options.navigation == 2) {
				navigation.prev.month = navigation.next.month = false;
			}
		}

		var caption = new Element('caption');

		var prev = new Element('a').addClass(this.classes.prev).appendText('\x3c'); // <		
		var next = new Element('a').addClass(this.classes.next).appendText('\x3e'); // >

		if (this.options.navigation == 2) {
			var month = new Element('span').addClass(this.classes.month).injectInside(caption);
			
			if (navigation.prev.month) { prev.clone().addEvent('click', function(cal) { this.navigate(cal, 'm', -1); }.pass(cal, this)).injectInside(month); }
			
			month.adopt(new Element('span').appendText(this.options.months[cal.month]));

			if (navigation.next.month) { next.clone().addEvent('click', function(cal) { this.navigate(cal, 'm', 1); }.pass(cal, this)).injectInside(month); }

			var year = new Element('span').addClass(this.classes.year).injectInside(caption);

			if (navigation.prev.year) { prev.clone().addEvent('click', function(cal) { this.navigate(cal, 'y', -1); }.pass(cal, this)).injectInside(year); }
			
			year.adopt(new Element('span').appendText(cal.year));

			if (navigation.next.year) { next.clone().addEvent('click', function(cal) { this.navigate(cal, 'y', 1); }.pass(cal, this)).injectInside(year); }
		}
		else { // 1 or 0
			if (navigation.prev.month && this.options.navigation) { prev.clone().addEvent('click', function(cal) { this.navigate(cal, 'm', -1); }.pass(cal, this)).injectInside(caption); }

			caption.adopt(new Element('span').addClass(this.classes.month).appendText(this.options.months[cal.month]));
			
			caption.adopt(new Element('span').addClass(this.classes.year).appendText(cal.year));
			
			if (navigation.next.month && this.options.navigation) { next.clone().addEvent('click', function(cal) { this.navigate(cal, 'm', 1); }.pass(cal, this)).injectInside(caption); }

		}

		return caption;
	},


	// changed: run when a select value is changed
	// @param cal (obj)

	changed: function(cal) {
		cal.val = this.read(cal); // update calendar val from inputs	

		$extend(cal, this.values(cal)); // update bounds - based on curr month

		this.rebuild(cal); // rebuild days select

		if (!cal.val) { return; } // in case the same date was clicked the cal has no set date we should exit		

		if (cal.val.getDate() < cal.days[0]) { cal.val.setDate(cal.days[0]); }
		if (cal.val.getDate() > cal.days.getLast()) { cal.val.setDate(cal.days.getLast()); }
		
		cal.els.each(function(el) {	// then we can set the value to the field
			el.value = this.format(cal.val, el.format); 		
		}, this);
		
		this.check(cal); // checks other cals

		this.calendars.each(function(kal) { // update cal graphic if visible
			if (kal.visible) { this.display(kal); }
		}, this);
	},


	// check: checks other calendars to make sure no overlapping values
	// @param cal (obj)

	check: function(cal) {
		this.calendars.each(function(kal, i) {
			if (kal.val) { // if calendar has value set
				var change = false;
			
				if (i < cal.id) { // preceding calendar
					var bound = new Date(Date.parse(cal.val));
					
					bound.setDate(bound.getDate() - (this.options.pad * (cal.id - i)));

					if (bound < kal.val) { change = true; }
				}
				if (i > cal.id) { // following calendar
					var bound = new Date(Date.parse(cal.val));
					
					bound.setDate(bound.getDate() + (this.options.pad * (i - cal.id)));
					
					if (bound > kal.val) { change = true; }
				}

				if (change) {
					if (kal.start > bound) { bound = kal.start; }
					if (kal.end < bound) { bound = kal.end; }

					kal.month = bound.getMonth();
					kal.year = bound.getFullYear();		

					$extend(kal, this.values(kal));			

					// TODO - IN THE CASE OF SELECT MOVE TO NEAREST VALID VALUE
					// IN THE CASE OF INPUT DISABLE

					// if new date is not valid better unset cal value
					// otherwise it would mean incrementally checking to find the nearest valid date which could be months / years away
					kal.val = kal.days.contains(bound.getDate()) ? bound : null;

					this.write(kal);

					if (kal.visible) { this.display(kal); } // update cal graphic if visible
				}
			}
			else {
				kal.month = cal.month;
				kal.year = cal.year;
			}
		}, this);
	},
	

	// clicked: run when a valid day is clicked in the calendar
	// @param cal (obj)

	clicked: function(td, day, cal) {
		cal.val = (this.value(cal) == day) ? null : new Date(cal.year, cal.month, day); // set new value - if same then disable

		this.write(cal); 

		// ok - in the special case that it's all selects and there's always a date no matter what (at least as far as the form is concerned)
		// we can't let the calendar undo a date selection - it's just not possible!!
		if (!cal.val) { cal.val = this.read(cal); }

		if (cal.val) {
			this.check(cal); // checks other cals						
			this.toggle(cal); // hide cal
		} 
		else { // remove active class and replace with valid
			td.addClass(this.classes.valid);
			td.removeClass(this.classes.active);
		}
	},
	

	// display: create calendar element
	// @param cal (obj)

	display: function(cal) {
		// 1. header and navigation
		this.calendar.empty(); // init div

		this.calendar.className = this.classes.calendar + ' ' + this.options.months[cal.month].toLowerCase();

		var div = new Element('div').injectInside(this.calendar); // a wrapper div to help correct browser css problems with the caption element

		var table = new Element('table').injectInside(div).adopt(this.caption(cal));
				
		// 2. day names		
		var thead = new Element('thead').injectInside(table);

		var tr = new Element('tr').injectInside(thead);
		
		for (var i = 0; i <= 6; i++) {
			var th = this.options.days[(i + this.options.offset) % 7];
			
			tr.adopt(new Element('th', { 'title': th }).appendText(th.substr(0, 1)));
		}

		// 3. day numbers
		var tbody = new Element('tbody').injectInside(table);
		var tr = new Element('tr').injectInside(tbody);

		var d = new Date(cal.year, cal.month, 1);
		var offset = ((d.getDay() - this.options.offset) + 7) % 7; // day of the week (offset)
		var last = new Date(cal.year, cal.month + 1, 0).getDate(); // last day of this month
		var prev = new Date(cal.year, cal.month, 0).getDate(); // last day of previous month
		var active = this.value(cal); // active date (if set and within curr month)
		var valid = cal.days; // valid days for curr month
		var inactive = []; // active dates set by other calendars
		var hilited = [];
		this.calendars.each(function(kal, i) {
			if (kal != cal && kal.val) {
				if (cal.year == kal.val.getFullYear() && cal.month == kal.val.getMonth()) { inactive.push(kal.val.getDate()); }

				if (cal.val) {
					for (var day = 1; day <= last; day++) {
						d.setDate(day);
						
						if ((i < cal.id && d > kal.val && d < cal.val) || (i > cal.id && d > cal.val && d < kal.val)) { 
							if (!hilited.contains(day)) { hilited.push(day); }
						}
					}
				}
			}
		}, this);
		var d = new Date();
		var today = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime(); // today obv 
		
		for (var i = 1; i < 43; i++) { // 1 to 42 (6 x 7 or 6 weeks)
			if ((i - 1) % 7 == 0) { tr = new Element('tr').injectInside(tbody); } // each week is it's own table row

			var td = new Element('td').injectInside(tr);
						
			var day = i - offset;
			var date = new Date(cal.year, cal.month, day);
			
			var cls = '';
			
			if (day === active) { cls = this.classes.active; } // active
			else if (inactive.contains(day)) { cls = this.classes.inactive; } // inactive
			else if (valid.contains(day)) { cls = this.classes.valid; } // valid
			else if (day >= 1 && day <= last) { cls = this.classes.invalid; } // invalid

			if (date.getTime() == today) { cls = cls + ' ' + this.classes.today; } // adds class for today

			if (hilited.contains(day)) { cls = cls + ' ' + this.classes.hilite; } // adds class if hilited

			td.addClass(cls);

			if (valid.contains(day)) { // if it's a valid - clickable - day we add interaction
				td.setProperty('title', this.format(date, 'D M jS Y'));
				
				td.addEvents({
					'click': function(td, day, cal) { 
						this.clicked(td, day, cal); 
					}.pass([td, day, cal], this),
					'mouseover': function(td, cls) { 
						td.addClass(cls); 
					}.pass([td, this.classes.hover]),
					'mouseout': function(td, cls) { 
						td.removeClass(cls); 
					}.pass([td, this.classes.hover])
				});
			}

			// pad calendar with last days of prev month and first days of next month
			if (day < 1) { day = prev + day; }
			else if (day > last) { day = day - last; }

			td.appendText(day);
		}
	},


	// element: helper function
	// @param el (string) element id
	// @param f (string) format string
	// @param cal (obj)

	element: function(el, f, cal) {
		if ($type(f) == 'object') { // in the case of multiple inputs per calendar
			for (var i in f) { 
				if (!this.element(i, f[i], cal)) { return false; }		
			}
			
			return true;
		}

		el = $(el);

		if (!el) { return false; }
		
		el.format = f;
		
		if (el.get('tag') == 'select') { // select elements allow the user to manually set the date via select option
			el.addEvent('change', function(cal) { this.changed(cal); }.pass(cal, this));
		}
		else { // input (type text) elements restrict the user to only setting the date via the calendar
			el.readOnly = true;
			el.addEvent('focus', function(cal) { this.toggle(cal); }.pass(cal, this));
		}

		cal.els.push(el);

		return true;
	},


	// format: formats a date object according to passed in instructions
	// @param date (obj)
	// @param f (string) any combination of punctuation / separators and d, j, D, l, S, m, n, F, M, y, Y
	// @returns string

	format: function(date, format) {
		var str = '';
		
		if (date) {
			var j = date.getDate(); // 1 - 31
      var w = date.getDay(); // 0 - 6
			var l = this.options.days[w]; // Sunday - Saturday
			var n = date.getMonth() + 1; // 1 - 12
			var f = this.options.months[n - 1]; // January - December
			var y = date.getFullYear() + ''; // 19xx - 20xx
			
			for (var i = 0, len = format.length; i < len; i++) {
				var cha = format.charAt(i); // format char
				
				switch(cha) {
					// year cases
					case 'y': // xx - xx
						y = y.substr(2);
					case 'Y': // 19xx - 20xx
						str += y;
						break;
	
					// month cases
					case 'm': // 01 - 12
						if (n < 10) { n = '0' + n; }
					case 'n': // 1 - 12
						str += n;
						break;
	
					case 'M': // Jan - Dec
						f = f.substr(0, 3);
					case 'F': // January - December
						str += f;
						break;
	
					// day cases
					case 'd': // 01 - 31
						if (j < 10) { j = '0' + j; }
					case 'j': // 1 - 31
						str += j;
						break;
	
					case 'D': // Sun - Sat
						l = l.substr(0, 3);
					case 'l': // Sunday - Saturday
						str += l;
						break;
	
					case 'N': // 1 - 7
						w += 1;
					case 'w': // 0 - 6
						str += w;
						break;

					case 'S': // st, nd, rd or th (works well with j)
						if (j % 10 == 1 && j != '11') { str += 'st'; }
						else if (j % 10 == 2 && j != '12') { str += 'nd'; }
						else if (j % 10 == 3 && j != '13') { str += 'rd'; }
						else { str += 'th'; }
						break;
	
					default:
						str += cha;
				}
			}
		}

	  return str; //  return format with values replaced
	},


	// navigate: calendar navigation
	// @param cal (obj)
	// @param type (str) m or y for month or year
	// @param n (int) + or - for next or prev

	navigate: function(cal, type, n) {
		switch (type) {
			case 'm': // month
					if ($type(cal.months) == 'array') {
						var i = cal.months.indexOf(cal.month) + n; // index of current month
						
						if (i < 0 || i == cal.months.length) { // out of range
							if (this.options.navigation == 1) { // if type 1 nav we'll need to increment the year
								this.navigate(cal, 'y', n);		
							}
		
							i = (i < 0) ? cal.months.length - 1 : 0;
						}

						cal.month = cal.months[i];
					}
					else { 
						var i = cal.month + n;
		
						if (i < 0 || i == 12) {
							if (this.options.navigation == 1) {
								this.navigate(cal, 'y', n);	
							}
		
							i = (i < 0) ? 11 : 0;
						}
						
						cal.month = i;
					}		
					break;

				case 'y': // year
					if ($type(cal.years) == 'array') {
						var i = cal.years.indexOf(cal.year) + n;

						cal.year = cal.years[i]; 
					}
					else { 
						cal.year += n;
					}						
					break;		
		}

		$extend(cal, this.values(cal));

		if ($type(cal.months) == 'array') { // if the calendar has a months select
			var i = cal.months.indexOf(cal.month); // and make sure the curr months exists for the new year

			if (i < 0) { cal.month = cal.months[0]; } // otherwise we'll reset the month
		}


		this.display(cal);
	},


	// read: compiles cal value based on array of inputs passed in
	// @param cal (obj)
	// @returns date (obj) or (null)

	read: function(cal) {
		var arr = [null, null, null];

		cal.els.each(function(el) {
			// returns an array which may contain empty values
			var values = this.unformat(el.value, el.format);
			
			values.each(function(val, i) { 
				if ($type(val) == 'number') { arr[i] = val; }
			}); 
		}, this);

		// we can update the cals month and year values
		if ($type(arr[0]) == 'number') { cal.year = arr[0]; }
		if ($type(arr[1]) == 'number') { cal.month = arr[1]; }

		var val = null;

		if (arr.every(function(i) { return $type(i) == 'number'; })) { // if valid date
			var last = new Date(arr[0], arr[1] + 1, 0).getDate(); // last day of month

			if (arr[2] > last) { arr[2] = last; } // make sure we stay within the month (ex in case default day of select is 31 and month is feb)
			
			val = new Date(arr[0], arr[1], arr[2]);
		}

		return (cal.val == val) ? null : val; // if new date matches old return null (same date clicked twice = disable)
	},

	
	// rebuild: rebuilds days + months selects
	// @param cal (obj)

	rebuild: function(cal) {
		cal.els.each(function(el) {			
			/*
			if (el.getTag() == 'select' && el.format.test('^(F|m|M|n)$')) { // special case for months-only select
				if (!cal.options) { cal.options = el.clone(); } // clone a copy of months select
			
				var val = (cal.val) ? cal.val.getMonth() : el.value.toInt();

				el.empty(); // initialize select

				cal.months.each(function(month) {
					// create an option element
					var option = new Element('option', {
						'selected': (val == month),
						'value': this.format(new Date(1, month, 1), el.format);
					}).appendText(day).injectInside(el);
				}, this);
			}
			*/

			if (el.get('tag') == 'select' && el.format.test('^(d|j)$')) { // special case for days-only select
				var d = this.value(cal);

				if (!d) { d = el.value.toInt(); } // if the calendar doesn't have a set value, try to use value from select

				el.empty(); // initialize select

				cal.days.each(function(day) {
					// create an option element
					var option = new Element('option', {
						'selected': (d == day),
						'value': ((el.format == 'd' && day < 10) ? '0' + day : day)
					}).appendText(day).injectInside(el);
				}, this);
			}
		}, this); 
	},


	// sort: helper function for numerical sorting

	sort: function(a, b) {
		return a - b;
	},


	// toggle: show / hide calendar 
	// @param cal (obj)

	toggle: function(cal) {
		document.removeEvent('mousedown', this.fn); // always remove the current mousedown script first
			
		if (cal.visible) { // simply hide curr cal						
			cal.visible = false;
			cal.button.removeClass(this.classes.active); // active
			
			this.fx.start(1, 0);
		}
		else { // otherwise show (may have to hide others)
			// hide cal on out-of-bounds click
			this.fn = function(e, cal) { 
				var e = new Event(e);
			
				var el = e.target;

				var stop = false;
				
				while (el != document.body && el.nodeType == 1) {
					if (el == this.calendar) { stop = true; }
					this.calendars.each(function(kal) {
						if (kal.button == el || kal.els.contains(el)) { stop = true; }
					});

					if (stop) { 
						e.stop();
						return false;
					}
					else { el = el.parentNode; }
				}
				
				this.toggle(cal);
			}.create({ 'arguments': cal, 'bind': this, 'event': true });				

			document.addEvent('mousedown', this.fn);

			this.calendars.each(function(kal) {
				if (kal == cal) {
					kal.visible = true;
					kal.button.addClass(this.classes.active); // css c-icon-active
				}
				else {
					kal.visible = false;
					kal.button.removeClass(this.classes.active); // css c-icon-active
				}
			}, this);
			
			var size = window.getSize().y;
			
			var coord = cal.button.getCoordinates();

			var x = coord.right + this.options.tweak.x;
			var y = coord.top + this.options.tweak.y;

			// make sure the calendar doesn't open off screen
			if (!this.calendar.coord) { this.calendar.coord = this.calendar.getCoordinates(); }

			if (x + this.calendar.coord.width > size.x) { x -= (x + this.calendar.coord.width - size.x); }
			if (y + this.calendar.coord.height > size.y) { y -= (y + this.calendar.coord.height - size.y); }
			
			this.calendar.setStyles({ left: x + 'px', top: y + 'px' });

			if (window.ie6) { 
				this.iframe.setStyles({ height: this.calendar.coord.height + 'px', left: x + 'px', top: y + 'px', width: this.calendar.coord.width + 'px' }); 
			}

			this.display(cal);
			
			this.fx.start(0, 1);
		}
	},


	// unformat: takes a value from an input and parses the d, m and y elements
	// @param val (string)
	// @param f (string) any combination of punctuation / separators and d, j, D, l, S, m, n, F, M, y, Y
	// @returns array
	
	unformat: function(val, f) {
		f = f.escapeRegExp();
		
		var re = {
			d: '([0-9]{2})',
			j: '([0-9]{1,2})',
			D: '(' + this.options.days.map(function(day) { return day.substr(0, 3); }).join('|') + ')',					
			l: '(' + this.options.days.join('|') + ')',
			S: '(st|nd|rd|th)',
			F: '(' + this.options.months.join('|') + ')',
			m: '([0-9]{2})',
			M: '(' + this.options.months.map(function(month) { return month.substr(0, 3); }).join('|') + ')',					
			n: '([0-9]{1,2})',
			Y: '([0-9]{4})',
			y: '([0-9]{2})'
		}

		var arr = []; // array of indexes

		var g = '';

		// convert our format string to regexp
		for (var i = 0; i < f.length; i++) {
			var c = f.charAt(i);
			
			if (re[c]) {
				arr.push(c);

				g += re[c];
			}
			else {
				g += c;
			}
		}

		// match against date
		var matches = val.match('^' + g + '$');
		
		var dates = new Array(3);

		if (matches) {
			matches = matches.slice(1); // remove first match which is the date

			arr.each(function(c, i) {
				i = matches[i];
				
				switch(c) {
					// year cases
					case 'y':
						i = '19' + i; // 2 digit year assumes 19th century (same as JS)
					case 'Y':
						dates[0] = i.toInt();
						break;

					// month cases
					case 'F':
						i = i.substr(0, 3);
					case 'M':
						i = this.options.months.map(function(month) { return month.substr(0, 3); }).indexOf(i) + 1;
					case 'm':
					case 'n':
						dates[1] = i.toInt() - 1;
						break;

					// day cases
					case 'd':
					case 'j':
						dates[2] = i.toInt();
						break;
				}
			}, this);
		}

		return dates;
	},


	// value: returns day value of calendar if set
	// @param cal (obj)
	// @returns day (int) or null

	value: function(cal) {
		var day = null;

		if (cal.val) {
			if (cal.year == cal.val.getFullYear() && cal.month == cal.val.getMonth()) { day = cal.val.getDate(); }
		}

		return day;
	},
	

	// values: returns the years, months (for curr year) and days (for curr month and year) for the calendar
	// @param cal (obj)
	// @returns obj	

	values: function(cal) {
		var years, months, days;

		cal.els.each(function(el) {	
			if (el.get('tag') == 'select') {		
				if (el.format.test('(y|Y)')) { // search for a year select
					years = [];

					el.getChildren().each(function(option) { // get options
						var values = this.unformat(option.value, el.format);
	
						if (!years.contains(values[0])) { years.push(values[0]); } // add to years array
					}, this);
	
					years.sort(this.sort);
				}
	
				if (el.format.test('(F|m|M|n)')) { // search for a month select
					months = []; // 0 - 11 should be

					el.getChildren().each(function(option) { // get options
						var values = this.unformat(option.value, el.format);
	
						if ($type(values[0]) != 'number' || values[0] == cal.year) { // if it's a year / month combo for curr year, or simply a month select
							if (!months.contains(values[1])) { months.push(values[1]); } // add to months array
						}
					}, this);
	
					months.sort(this.sort);
				}
				
				if (el.format.test('(d|j)') && !el.format.test('^(d|j)$')) { // search for a day select, but NOT a days only select
					days = []; // 1 - 31
					
					el.getChildren().each(function(option) { // get options
						var values = this.unformat(option.value, el.format);

						// in the special case of days we dont want the value if its a days only select
						// otherwise that will screw up the options rebuilding
						// we will take the values if they are exact dates though
						if (values[0] == cal.year && values[1] == cal.month) {
							if (!days.contains(values[2])) { days.push(values[2]); } // add to days array
						}
					}, this);
				}
			}
		}, this);
		
		// we start with what would be the first and last days were there no restrictions
		var first = 1;
		var last = new Date(cal.year, cal.month + 1, 0).getDate(); // last day of the month
		
		// if we're in an out of bounds year
		if (cal.year == cal.start.getFullYear()) {
			// in the special case of improved navigation but no months array, we'll need to construct one
			if (months == null && this.options.navigation == 2) {
				months = [];
				
				for (var i = 0; i < 12; i ++) { 
					if (i >= cal.start.getMonth()) { months.push(i); } 
				}
			}
			
			// if we're in an out of bounds month
			if (cal.month == cal.start.getMonth()) { 
				first = cal.start.getDate(); // first day equals day of bound
			}
		}		
		if (cal.year == cal.end.getFullYear()) {
			// in the special case of improved navigation but no months array, we'll need to construct one
			if (months == null && this.options.navigation == 2) {
				months = [];
				
				for (var i = 0; i < 12; i ++) { 
					if (i <= cal.end.getMonth()) { months.push(i); } 
				}
			}

			if (cal.month == cal.end.getMonth()) { 
				last = cal.end.getDate(); // last day equals day of bound
			}
		}

		// let's get our invalid days
		var blocked = this.blocked(cal);

		// finally we can prepare all the valid days in a neat little array
		if ($type(days) == 'array') { // somewhere there was a days select
			days = days.filter(function(day) {
				if (day >= first && day <= last && !blocked.contains(day)) { return day; }
			});
		}
		else { // no days select we'll need to construct a valid days array
			days = [];
			
			for (var i = first; i <= last; i++) { 
				if (!blocked.contains(i)) { days.push(i); }
			}
		}		

		days.sort(this.sort); // sorting our days will give us first and last of month

		return { 'days': days, 'months': months, 'years': years };
	},


	// write: sets calendars value to form elements
	// @param cal (obj)

	write: function(cal) {
		this.rebuild(cal);	 // in the case of options, we'll need to make sure we have the correct number of days available
		
		cal.els.each(function(el) {	// then we can set the value to the field
			el.value = this.format(cal.val, el.format); 		
		}, this);
	}
});
/**
 * RabidRatings - Simple and Pretty Ratings for Everyone JavaScript
 * functionality requires MooTools version 1.2 <http://www.mootools.net>.
 *
 * Full package available at <http://widgets.rabidlabs.net/ratings>.
 *
 * NOTE: The included JavaScript WILL ONLY WORK WITH MOOTOOLS. It will not work
 * if any other JavaScript framework is present on the page.
 *
 * Current MooTools version: 1.2
 *
 *
 * fgiust:
 *
 * Updated to work with mootools 1.2 final
 *
 * Disable vote if the css class ratingVoted is already set
 *
 * Enable fancy rating also on ie6
 *
 * Regexp changed from "/(\d*)-(\d*\.?\d+)_(\d*\.?\d+)$/" to
 * "/(\w*)-(\d*\.?\d+)_(\d*\.?\d+)$/" to allow non numeric ids
 *
 * @author Michelle Steigerwalt <http://www.msteigerwalt.com>
 * @copyright 2007, 2008 Michelle Steigerwalt
 * @license LGPL 2.1 <http://creativecommons.org/licenses/LGPL/2.1/>
 *
 *
 */
var RabidRatings = new Class(
    {

      Implements :Options,

      options : {
        url :null,
        leftMargin :0, /* The width in pixels of the margin before the stars. */
        starWidth :17, /* The width in pixels of each star. */
        starMargin :4, /* The width in pixels between each star. */
        scale :5, /* It's a five-star scale. */
        snap :1
      /* Will snap to the nearest star (can be made a decimal, too). */
      },

      initialize : function(options) {

        this.setOptions(options);
        var activeColor = this.options.activeColor;
        var votedColor = this.options.votedColor;
        var fillColor = this.options.fillColor;

        $$('.rabidRating').each( function(el) {
          // Does this if the browser is NOT IE6. IE6 users don't deserve fancy
            // ratings. >:(

            el.id = el.getAttribute('id');
            el.wrapper = el.getElement('.wrapper');
            el.textEl = el.getElement('.ratingText');
            el.offset = el.getPosition().x;
            el.fill = el.getElement('.ratingFill');
            el.starPercent = this.getStarPercent(el.id);
            el.ratableId = this.getRatableId(el.id);
            this.fillVote(el.starPercent, el);
            el.currentFill = this.getFillPercent(el.starPercent);
            el.morphFx = new Fx.Morph(el.fill, {
              'link' :'chain'
            });
            el.widthFx = new Fx.Tween(el.fill, 'width', {
              link :'chain'
            });

            el.mouseCrap = function(e) {
              var fill = e.client.x - el.offset;
              var fillPercent = this.getVotePercent(fill);
              var step;
              if (this.options.snap === 0)
                step = 1;
              else
                step = (100 / this.options.scale) * this.options.snap;
              var nextStep = Math.floor(fillPercent / step) + 1;
              this.fillVote(nextStep * step, el);
            }.bind(this);

            // @fgiust don't add event if already voted
            if (!el.fill.hasClass("ratingVoted")) {
              el.wrapper.addEvent('mouseenter', function(e) {
                el.morphFx.start('.rabidRating .ratingActive');
                el.wrapper.addEvent('mousemove', el.mouseCrap);
              });

              el.wrapper.addEvent('mouseleave', function(e) {
                el.removeEvent(el.mouseCrap);
                el.morphFx.start('.rabidRating .ratingFill');
                el.widthFx.start("width", el.currentFill);
              });

              el.wrapper.addEvent('click', function(e) {
                el.currentFill = el.newFill;
                el.morphFx.start('.rabidRating .ratingVoted');

                el.addClass('ratingVoted');
                el.textEl.addClass('loading');
                var votePercent = this.getVotePercent(el.newFill);
                if (this.options.url != null) {
                  var req = new Request( {
                    url :this.options.url,
                    onComplete :el.updateText
                  }).post( {
                    vote :votePercent,
                    id :el.ratableId
                  });
                }
              }.bind(this));
            }
            else
            {
              el.wrapper.removeEvents();
            }

            el.updateText = function(text) {
              error = text.split('ERROR:')[1];
              el.textEl.removeClass('loading');
              if (error) {
                el.showError(error);
                return false;
              }
              el.textEl.set('text', text);
            };

            el.showError = function(error) {
              el.textEl.addClass('ratingError');
              oldTxt = el.textEl.get('text');
              el.textEl.set('text', error);
              ( function() {
                el.textEl.set('text', oldTxt);
                el.textEl.removeClass('ratingError');
                el.textEl.set('text', '');
              }).delay(1000);
            };

            if (Browser.Engine.trident4) {
              // IE6.
              var plain = el.getElement('.ratingText').inject(el, 'before');
              //el.dispose();
            }
          }.bind(this));
      },

      fillVote : function(percent, el) {
        el.newFill = this.getFillPercent(percent);
        if (this.getVotePercent(el.newFill) > 100) {
          el.newFill = this.getFillPercent(100);
        }
        el.fill.setStyle('width', el.newFill);
      },

      getStarPercent : function(id) {
        /*
         * Format = anyStringHere-<id>-<float(currentStars)>_(scale); Example:
         * rabidRatings-5-3_5 //Primary key id = 5, 3/5 stars.
         */
        // @diego.schivo <id> may contain dash character
        var stars = id.match(/_([\w\-]*)_(\d*\.?\d+)_(\d*\.?\d+)$/);
        var ratableId = stars[1].toFloat();
        var score = stars[2].toFloat();
        var scale = stars[3].toFloat();
        var percent = (score / scale) * 100;
        return percent;
      },

      getFillPercent : function(starPercent) {
        return (starPercent / 100)
            * ((this.options.starWidth + this.options.starMargin) * this.options.scale)
            + this.options.leftMargin;
      },

      getVotePercent : function(divPosition) {
        var starsWidth = (this.options.starWidth + this.options.starMargin)
            * this.options.scale;
        var offset = this.options.leftMargin;
        var starPosition = divPosition - this.options.leftMargin;
        var percent = (starPosition / starsWidth * 100).round(2);
        return percent;
      },

      getRatableId : function(id) {
        // @diego.schivo <id> may contain dash character
        var stars = id.match(/_([\w\-]*)_(\d*\.?\d+)_(\d*\.?\d+)$/);
        return stars[1];
      }

    });


/**************************************************************

  Script		: MultiBox
  Version		: 1.3.1
  Authors		: Samuel Birch
  Desc		: Supports jpg, gif, png, flash, flv, mov, wmv, mp3, html, iframe
  Licence		: Open Source MIT Licence

**************************************************************/

var MultiBox = new Class({

  Implements: [Events, Options],

  options: {
      initialWidth: 250,
      initialHeight: 250,
      container: document.body,
      useOverlay: false,
      contentColor: '#FFF',
      showNumbers: true,
      showControls: true,
      //showThumbnails: false,
      //autoPlay: false,
      waitDuration: 2000,
      descClassName: false,
      descMinWidth: 400,
      descMaxWidth: 600,
      movieWidth: 400,
      movieHeight: 300,
      offset: {x:0, y:0},
      fixedTop: false,
      path: 'files/',
      onOpen: $empty,
      onClose: $empty,
      openFromLink: true,
      relativeToWindow: true
    },

  initialize: function(className, options){
    this.options.container = document.body;
    this.setOptions(options);

    this.openClosePos = {};
    this.timer = 0;
    this.contentToLoad = {};
    this.index = 0;
    this.opened = false;
    this.contentObj = {};
    this.containerDefaults = {};

    if(this.options.useOverlay){
      this.overlay = new Overlay({container: this.options.container, onClick:this.close.bind(this)});
    }

    this.content = $$('.'+className);
    if(this.options.descClassName){
      this.descriptions = $$('.'+this.options.descClassName);
      this.descriptions.each(function(el){
        el.setStyle('display', 'none');
      });
    }

    this.container = new Element('div').addClass('MultiBoxContainer').injectInside(this.options.container);
    this.iframe = new Element('iframe').setProperties({
      'id': 'multiBoxIframe',
      'name': 'mulitBoxIframe',
      'src': 'javascript:void(0);',
      'frameborder': 1,
      'scrolling': 'no'
    }).setStyles({
      'position': 'absolute',
      'top': -20,
      'left': -20,
      'width': '115%',
      'height': '115%',
      'filter': 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)',
      'opacity': 0
    }).injectInside(this.container);
    this.box = new Element('div').addClass('MultiBoxContent').injectInside(this.container);

    this.closeButton = new Element('div').addClass('MultiBoxClose').injectInside(this.container).addEvent('click', this.close.bind(this));

    this.controlsContainer = new Element('div').addClass('MultiBoxControlsContainer').injectInside(this.container);
    this.controls = new Element('div').addClass('MultiBoxControls').injectInside(this.controlsContainer);

    this.previousButton = new Element('div').addClass('MultiBoxPrevious').injectInside(this.controls).addEvent('click', this.previous.bind(this));
    this.nextButton = new Element('div').addClass('MultiBoxNext').injectInside(this.controls).addEvent('click', this.next.bind(this));

    this.title = new Element('div').addClass('MultiBoxTitle').injectInside(this.controls);
    this.number = new Element('div').addClass('MultiBoxNumber').injectInside(this.controls);
    this.description = new Element('div').addClass('MultiBoxDescription').injectInside(this.controls);



    if(this.content.length == 1){
      this.title.setStyles({
        'margin-left': 0
      });
      this.description.setStyles({
        'margin-left': 0
      });
      this.previousButton.setStyle('display', 'none');
      this.nextButton.setStyle('display', 'none');
      this.number.setStyle('display', 'none');
    }

    new Element('div').setStyle('clear', 'both').injectInside(this.controls);

    this.content.each(function(el,i){
      el.index = i;
      el.addEvent('click', function(e){
        new Event(e).stop();
        this.open(el);
      }.bind(this));
      if(el.href.indexOf('#') > -1){
        el.content = $(el.href.substr(el.href.indexOf('#')+1));
        if(el.content){el.content.setStyle('display','none');}
      }
    }, this);

    this.containerEffects = new Fx.Morph(this.container, {duration: 400, transition: Fx.Transitions.Sine.easeInOut});
    this.controlEffects = new Fx.Morph(this.controlsContainer, {duration: 300, transition: Fx.Transitions.Sine.easeInOut});

    this.reset();
  },

  setContentType: function(link){
    var str = link.href.substr(link.href.lastIndexOf('.')+1).toLowerCase();
    var contentOptions = {};
    if($chk(link.rel)){
      var optArr = link.rel.split(',');
      optArr.each(function(el){
        var ta = el.split(':');
        contentOptions[ta[0]] = ta[1];
      });
    }

    if(contentOptions.type != undefined){
      str = contentOptions.type;
    }

    this.contentObj = {};
    this.contentObj.url = link.href;
    this.contentObj.xH = 0;

    if(contentOptions.width){
      this.contentObj.width = contentOptions.width;
    }else{
      this.contentObj.width = this.options.movieWidth;
    }
    if(contentOptions.height){
      this.contentObj.height = contentOptions.height;
    }else{
      this.contentObj.height = this.options.movieHeight;
    }
    if(contentOptions.panel){
      this.panelPosition = contentOptions.panel;
    }else{
      this.panelPosition = this.options.panel;
    }


    switch(str){
      case 'jpg':
      case 'gif':
      case 'png':
        this.type = 'image';
        break;
      case 'swf':
        this.type = 'flash';
        break;
      case 'flv':
        this.type = 'flashVideo';
        this.contentObj.xH = 20;
        break;
      case 'mov':
        this.type = 'quicktime';
        break;
      case 'wmv':
        this.type = 'windowsMedia';
        break;
      case 'rv':
      case 'rm':
      case 'rmvb':
        this.type = 'real';
        break;
      case 'mp3':
        this.type = 'flashMp3';
        this.contentObj.width = 320;
        this.contentObj.height = 20;
        break;
      case 'element':
        this.type = 'htmlelement';
        this.elementContent = link.content;
        this.elementContent.setStyles({
          display: 'block',
          opacity: 0
        })

        if(this.elementContent.getStyle('width') != 'auto'){
          this.contentObj.width = this.elementContent.getStyle('width');
        }

        this.contentObj.height = this.elementContent.getSize().size.y;
        this.elementContent.setStyles({
          display: 'none',
          opacity: 1
        })
        break;

      default:

        this.type = 'iframe';
        if(contentOptions.ajax){
          this.type = 'ajax';
        }
        break;
    }
  },

  reset: function(){
    this.container.setStyles({
      'opacity': 0,
      'display': 'none'
    });
    this.controlsContainer.setStyles({
      'height': 0
    });
    this.removeContent();
    this.previousButton.removeClass('MultiBoxButtonDisabled');
    this.nextButton.removeClass('MultiBoxButtonDisabled');
    this.opened = false;
  },

  getOpenClosePos: function(el){
    if (this.options.openFromLink) {
      if (el.getFirst()) {
        var w = el.getFirst().getCoordinates().width - (this.container.getStyle('border').toInt() * 2);
        if (w < 0) {
          w = 0
        }
        var h = el.getFirst().getCoordinates().height - (this.container.getStyle('border').toInt() * 2);
        if (h < 0) {
          h = 0
        }
        this.openClosePos = {
          width: w,
          height: h,
          top: el.getFirst().getCoordinates().top,
          left: el.getFirst().getCoordinates().left
        };
      }
      else {
        var w = el.getCoordinates().width - (this.container.getStyle('border').toInt() * 2);
        if (w < 0) {
          w = 0
        }
        var h = el.getCoordinates().height - (this.container.getStyle('border').toInt() * 2);
        if (h < 0) {
          h = 0
        }
        this.openClosePos = {
          width: w,
          height: h,
          top: el.getCoordinates().top,
          left: el.getCoordinates().left
        };
      }
    }else{
      if(this.options.fixedTop){
        var top = this.options.fixedTop;
      }else{
        var top = ((window.getHeight()/2)-(this.options.initialHeight/2)-this.container.getStyle('border').toInt())+this.options.offset.y;
      }
      this.openClosePos = {
        width: this.options.initialWidth,
        height: this.options.initialHeight,
        top: top,
        left: ((window.getWidth()/2)-(this.options.initialWidth/2)-this.container.getStyle('border').toInt())+this.options.offset.x
      };
    }
    return this.openClosePos;
  },

  open: function(el){

    this.fireEvent('onOpen');

    this.index = this.content.indexOf(el);

    this.openId = el.getProperty('id');

    if(!this.opened){
      this.opened = true;

      if(this.options.useOverlay){
        this.overlay.show();
      }

      this.container.setStyles(this.getOpenClosePos(el));
      this.container.setStyles({
        opacity: 0,
        display: 'block'
      });

      if(this.options.fixedTop){
        var top = this.options.fixedTop;
      }else{
        var top = ((window.getHeight()/2)-(this.options.initialHeight/2)-this.container.getStyle('border').toInt())+this.options.offset.y;
      }

      this.containerEffects.start({
        width: this.options.initialWidth,
        height: this.options.initialHeight,
        top: top,
        left: ((window.getWidth()/2)-(this.options.initialWidth/2)-this.container.getStyle('border').toInt())+this.options.offset.x,
        opacity: [0, 1]
      });

      this.load(this.index);

    }else{
      if (this.options.showControls) {
        this.hideControls();
      }
      this.getOpenClosePos(this.content[this.index]);
      this.timer = this.hideContent.bind(this).delay(500);
      this.timer = this.load.pass(this.index, this).delay(1100);

    }

  },

  getContent: function(index){
    this.setContentType(this.content[index]);
    var desc = {};
    if(this.options.descClassName){
    this.descriptions.each(function(el,i){
      if(el.hasClass(this.openId)){
        desc = el.clone();
      }
    },this);
    }
    //var title = this.content[index].title;
    this.contentToLoad = {
      title: this.content[index].title || '&nbsp;',
      //desc: $(this.options.descClassName+this.content[index].id).clone(),
      desc: desc,
      number: index+1
    };
  },

  close: function(){
    if(this.options.useOverlay){
      this.overlay.hide();
    }
    if (this.options.showControls) {
      this.hideControls();
    }
    this.hideContent();
    this.containerEffects.cancel();
    this.zoomOut.bind(this).delay(500);
    this.fireEvent('onClose');
  },

  zoomOut: function(){
    this.containerEffects.start({
      width: this.openClosePos.width,
      height: this.openClosePos.height,
      top: this.openClosePos.top,
      left: this.openClosePos.left,
      opacity: 0
    });
    this.reset.bind(this).delay(500);
  },

  load: function(index){
    this.box.addClass('MultiBoxLoading');
    this.getContent(index);
    if(this.type == 'image'){
      var xH = this.contentObj.xH;
      this.contentObj = new Asset.image(this.content[index].href, {onload: this.resize.bind(this)});
      this.contentObj.xH = xH;
      /*this.contentObj = new Image();
      this.contentObj.onload = this.resize.bind(this);
      this.contentObj.src = this.content[index].href;*/
    }else{
      this.resize();
    }
  },

  resize: function(){
    if (this.options.fixedTop) {
      var top = this.options.fixedTop;
    }
    else {
      var top = ((window.getHeight() / 2) - ((Number(this.contentObj.height) + this.contentObj.xH) / 2) - this.container.getStyle('border').toInt() + window.getScrollTop()) + this.options.offset.y;
    }
    var left = ((window.getWidth() / 2) - (this.contentObj.width / 2) - this.container.getStyle('border').toInt()) + this.options.offset.x;
    if (top < 0) {
      top = 0
    }
    if (left < 0) {
      left = 0
    }

    this.containerEffects.cancel();
    this.containerEffects.start({
      width: this.contentObj.width,
      height: Number(this.contentObj.height) + this.contentObj.xH,
      top: top,
      left: left,
      opacity: 1
    });
    this.timer = this.showContent.bind(this).delay(500);
  },

  showContent: function(){
    this.box.removeClass('MultiBoxLoading');
    this.removeContent();

    this.contentContainer = new Element('div').setProperties({id: 'MultiBoxContentContainer'}).setStyles({opacity: 0, width: this.contentObj.width+'px', height: (Number(this.contentObj.height)+this.contentObj.xH)+'px'}).injectInside(this.box);

    if(this.type == 'image'){
      this.contentObj.injectInside(this.contentContainer);

    }else if(this.type == 'iframe'){
      new Element('iframe').setProperties({
        id: 'iFrame'+new Date().getTime(),
        width: this.contentObj.width,
        height: this.contentObj.height,
        src: this.contentObj.url,
        frameborder: 0,
        scrolling: 'auto'
      }).injectInside(this.contentContainer);

    }else if(this.type == 'htmlelement'){
      this.elementContent.clone().setStyle('display','block').injectInside(this.contentContainer);

    }else if(this.type == 'ajax'){
      new Ajax(this.contentObj.url, {
        method: 'get',
        update: 'MultiBoxContentContainer',
        evalScripts: true,
        autoCancel: true
      }).request();

    }else{
      var obj = this.createEmbedObject().injectInside(this.contentContainer);
      if(this.str != ''){
        $('MultiBoxMediaObject').innerHTML = this.str;
      }
    }

    this.contentEffects = new Fx.Morph(this.contentContainer, {duration: 500, transition: Fx.Transitions.linear});
    this.contentEffects.start({
      opacity: 1
    });

    this.title.set('html', this.contentToLoad.title);
    this.number.set('html', this.contentToLoad.number+' of '+this.content.length);
    if (this.options.descClassName) {
      if (this.description.getFirst()) {
        this.description.getFirst().dispose();
      }
      this.contentToLoad.desc.injectInside(this.description).setStyles({
        display: 'block'
      });
    }
    //this.removeContent.bind(this).delay(500);
    if (this.options.showControls) {
      this.timer = this.showControls.bind(this).delay(800);
    }
  },

  hideContent: function(){
    this.box.addClass('MultiBoxLoading');
    this.contentEffects.start({
      opacity: 0
    });
    this.removeContent.bind(this).delay(500);
  },

  removeContent: function(){
    if($('MultiBoxMediaObject')){
      $('MultiBoxMediaObject').empty();
      $('MultiBoxMediaObject').dispose();
    }
    if($('MultiBoxContentContainer')){
      //$('MultiBoxContentContainer').empty();
      $('MultiBoxContentContainer').dispose();
    }
  },

  showControls: function(){
    this.clicked = false;

    if(this.container.getStyle('height') != 'auto'){
      this.containerDefaults.height = this.container.getStyle('height')
      this.containerDefaults.backgroundColor = this.options.contentColor;
    }

    this.container.setStyles({
      //'backgroundColor': this.controls.getStyle('backgroundColor'),
      'height': 'auto'
    });

    if(this.contentToLoad.number == 1){
      this.previousButton.addClass('MultiBoxPreviousDisabled');
    }else{
      this.previousButton.removeClass('MultiBoxPreviousDisabled');
    }
    if(this.contentToLoad.number == this.content.length){
      this.nextButton.addClass('MultiBoxNextDisabled');
    }else{
      this.nextButton.removeClass('MultiBoxNextDisabled');
    }

    this.controlEffects.start({'height': this.controls.getStyle('height')});

  },

  hideControls: function(num){
    this.controlEffects.start({'height': 0}).chain(function(){
      this.container.setStyles(this.containerDefaults);
    }.bind(this));
  },

  showThumbnails: function(){

  },

  next: function(){
    if(this.index < this.content.length-1){
      this.index++;
      this.openId = this.content[this.index].getProperty('id');
      if (this.options.showControls) {
        this.hideControls();
      }
      this.getOpenClosePos(this.content[this.index]);
      //this.getContent(this.index);
      this.timer = this.hideContent.bind(this).delay(500);
      this.timer = this.load.pass(this.index, this).delay(1100);
    }
  },

  previous: function(){
    if(this.index > 0){
      this.index--;
      this.openId = this.content[this.index].getProperty('id');
      if (this.options.showControls) {
        this.hideControls();
      }
      this.getOpenClosePos(this.content[this.index]);
      //this.getContent(this.index);
      this.timer = this.hideContent.bind(this).delay(500);
      this.timer = this.load.pass(this.index, this).delay(1000);
    }
  },

  createEmbedObject: function(){
    if(this.type == 'flash'){
      var url = this.contentObj.url;

      var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});

      var s1 = new Swiff(url, {
        width:  this.contentObj.width,
        height: this.contentObj.height
      });
      this.str = s1.toElement().getParent().get('html');
    }

    if(this.type == 'flashVideo'){
      //var url = this.contentObj.url.substring(0, this.contentObj.url.lastIndexOf('.'));
      var url = this.contentObj.url;

      var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});

      this.str = '<embed id="bannerswf" width="' + this.contentObj.width + '" height="' + (this.contentObj.height + this.contentObj.xH) + '" ';
      this.str+= ' flashvars="file=' + url + '"';
      this.str+= ' wmode="opaque" allowscriptaccess="always" allowfullscreen="true" quality="high" bgcolor="#ffffff" type="application/x-shockwave-flash" name="swf"';
      this.str+= ' src="' + this.options.path + 'player.swf"/>';


/*
      var s1 = new Swiff(this.options.path +"player.swf", {
        width:  this.contentObj.width,
        height: this.contentObj.height + this.contentObj.xH,
        vars: {
          autostart: true,
          file: url
        }
      });
      this.str = s1.toElement().getParent().get('html');
      */
    }

    if(this.type == 'flashMp3'){
      var url = this.contentObj.url;

      var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});
      var s1 = new Swiff(this.options.path +"player.swf", {
        width:  this.contentObj.width,
        height: this.contentObj.height + this.contentObj.xH,
        vars: {
          autostart: true,
          file: url
        }
      });
      this.str = s1.toElement().getParent().get('html');
    }

    if(this.type == 'quicktime'){
      var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});
      this.str = '<object  type="video/quicktime" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab"';
      this.str += ' width="'+this.contentObj.width+'" height="'+this.contentObj.height+'">';
      this.str += '<param name="src" value="'+this.contentObj.url+'" />';
      this.str += '<param name="autoplay" value="true" />';
      this.str += '<param name="controller" value="true" />';
      this.str += '<param name="enablejavascript" value="true" />';
      this.str += '<embed src="'+this.contentObj.url+'" autoplay="true" pluginspage="http://www.apple.com/quicktime/download/" width="'+this.contentObj.width+'" height="'+this.contentObj.height+'"></embed>';
      this.str += '<object/>';

    }

    if(this.type == 'windowsMedia'){
      var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});
      this.str = '<object  type="application/x-oleobject" classid="CLSID:22D6f312-B0F6-11D0-94AB-0080C74C7E95" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,7,1112"';
      this.str += ' width="'+this.contentObj.width+'" height="'+this.contentObj.height+'">';
      this.str += '<param name="filename" value="'+this.contentObj.url+'" />';
      this.str += '<param name="Showcontrols" value="true" />';
      this.str += '<param name="autoStart" value="true" />';
      this.str += '<embed type="application/x-mplayer2" src="'+this.contentObj.url+'" Showcontrols="true" autoStart="true" width="'+this.contentObj.width+'" height="'+this.contentObj.height+'"></embed>';
      this.str += '<object/>';

    }

    if(this.type == 'real'){
      var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});
      this.str = '<object classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"';
      this.str += ' width="'+this.contentObj.width+'" height="'+this.contentObj.height+'">';
      this.str += '<param name="src" value="'+this.contentObj.url+'" />';
      this.str += '<param name="controls" value="ImageWindow" />';
      this.str += '<param name="autostart" value="true" />';
      this.str += '<embed src="'+this.contentObj.url+'" controls="ImageWindow" autostart="true" width="'+this.contentObj.width+'" height="'+this.contentObj.height+'"></embed>';
      this.str += '<object/>';

    }

    return obj;
  }

});

/*************************************************************/


function writeCookie(title) {
  var myCookie = Cookie.write('dimension', title,{duration: 0});
  setDimension(title);
}
function setDimension(title) {
   var dimensione = '1.0em';
   if (title == 'big1'){
      var dimensione = '1.2em';
    }
   if ($chk($("main"))) {
     $("main").setStyle('font-size', dimensione);
   }
   else if ($chk($("maincorp")))
   {
     $("maincorp").setStyle('font-size', dimensione);
   }
}

var LinkDownload = new Class({

  initialize: function(el, item, user) {
    this.el = $(el);
    this.item = item;
    this.user = user;
    this.callback = function() {
      if (++this.count == 2) location.href = this.el.href;
    }.bind(this);
  },
  
  handleClick: function() {
    this.count = 0;
    LinkDownload.download(this.item, this.user, this.callback);
  }
  
});

LinkDownload.download = function(item, user, callback) {
  new Request({
    url: CONTEXT_PATH + '/download.rat',
    onComplete: callback || $empty
  }).post({ id: item });
  new Request({
    url: CONTEXT_PATH + '/activity.rat',
    onComplete: callback || $empty
  }).post({ id: user });
};

var Survey = new Class({

  Implements: Options,
  
  Extends: Events,
  
  options: {
    ctx: '/'
  },

  initialize: function(buttons, item, user, options) {
    this.buttons = $$(buttons);
    this.item = item;
    this.user = user;
    this.setOptions(options);
    
    this.clickHandler = this.handleClick.bindWithEvent(this);
    this.buttons.each(function(b) {
      b.addEvent('click', this.clickHandler);
    }, this);
  },
  
  handleClick: function(e) {
    e = new Event(e);
    this.updateSurvey(e.target.value);
  },
  
  updateSurvey: function(vote) {
    new Request({
      url: this.options.ctx + '/survey.rat',
      onComplete: function(resp) {
        if (!resp.match(/ERROR:\s(.*)\shas\salready\svoted!/)) {
          this.updateActivity();
          this.fireEvent('done', 'success');
        } else {
          this.fireEvent('done', 'alreadyVoted');
        }
      }.bind(this)
    }).post({ id: this.item, user: this.user, vote: vote });
  },
  
  updateActivity: function() {
    new Request({
      url: this.options.ctx + '/activity.rat'
    }).post({ id: this.user });
  }
  
});

var Dropdown = new Class({

  Implements: [ Events, Options ],

  initialize: function(element, choices, options) {
    this.element = element;
    this.choices = choices;
    this.setOptions(options);

    this.element.setProperty('autocomplete', 'off').addEvent('focus', function() {
      this.element.blur();
      this.showChoices();
    }.bind(this));

    this.choices.addEvents({
      mouseover: this.handleMouseOver.bindWithEvent(this),
      click: this.handleClick.bindWithEvent(this),
      mouseleave: this.handleMouseLeave.bindWithEvent(this),
      mouseenter: this.handleMouseEnter.bind(this)
    });
  },

  showChoices: function() {
    var pos = this.element.getCoordinates(this.element.getOffsetParent());
    this.choices.setStyles({
      left: pos.left,
      top: pos.bottom,
      width: pos.width,  
      display: ''
    });
    // MAS-1694
    if (Browser.Engine.trident && this.options.fixMouseLeaveOnIE)
      this.mouseLeaveBounds = this.choices.getCoordinates();
  },

  hideChoices: function() {
    this.choices.setStyle('display', 'none');
  },

  handleMouseOver: function(e) {
    if (e.target.tagName != 'LI') return;
    if (this.liSelected) this.liSelected.removeClass('selected');
    this.liSelected = $(e.target);
    this.liSelected.addClass('selected');
  },

  handleClick: function(e) {
    if (e.target.tagName != 'LI') return;
    if (this.liSelected) this.liSelected.removeClass('selected');
    this.hideChoices();
    var li = $(e.target);
    this.element.value = li.innerText || li.textContent;
    this.fireEvent('select', li.getElement('input[name=option]').value);
  },

  handleMouseLeave: function(e) {
    if (this.liSelected) this.liSelected.removeClass('selected');
    if (this.mouseLeaveBounds){
      if (e.page.x >= this.mouseLeaveBounds.left && e.page.y >= this.mouseLeaveBounds.top
        && e.page.x < this.mouseLeaveBounds.right && e.page.y < this.mouseLeaveBounds.bottom)
        return;
    }
    this.hideTimer = this.hideChoices.delay(300, this);
  },

  handleMouseEnter: function() {
    if (!this.hideTimer) return;
    $clear(this.hideTimer);
    this.hideTimer = null;
  }

});
var SelectYourCountry = new Class({

  Implements: Options,

  options: {
    // popupDealerUrl: undefined,
    // fixMouseLeaveOnIE: undefined,
    modal: true
  },

  initialize: function(countryData, options) {
    this.countryData = countryData;
    this.setOptions(options);

    var el = $('selectyourcountry');
    var elChoices = $('selectyourcountry-choices');
    if (el && elChoices) {
      this.dropdown = new Dropdown(el, elChoices, { fixMouseLeaveOnIE: this.options.fixMouseLeaveOnIE });
      this.dropdown.addEvent('select', this.handleSelect.bindWithEvent(this));
    }
  },
  
  handleSelect: function(key) {
    if (key == '') return;

    values = countryData[key].split('|');
    var href = values[0];
    var multilang = values[1];

    if (href) location.href = href;
    //show splash page for language choice
    else if (multilang == 'true') LayerManager.open($('splash-'+key), { modal: this.options.modal });
    else {
      var url = this.options.popupDealerUrl + '?async=true&country=' + key;
      var ct = $$('.popup-dealer-ct').filter(function(ct) { return ct.hasClass('country_' + key) });
      LayerManager.open(ct[0], { modal: this.options.modal, url: url });
    }
  }

});
var RichMediaCorse = new Class({

  initialize: function(layerUrl) {
    this.layerUrl = layerUrl;
    this.panel = $('rich-media-corse').getElement('.panel');
    this.head = this.panel.getElement('span.head');
    this.racesNav = this.panel.getElement('.races-nav');

    this.fx = new Fx.Slide(this.racesNav, {
      mode: 'vertical',
      duration: 500,
      onStart: function() {
        if (this.fx.to[0] == 0) this.panel.addClass('expanded');
      }.bind(this),
      onComplete: function() {
        if (this.fx.to[1] == 0) this.panel.removeClass('expanded');
      }.bind(this)
    });
    this.fx.hide();

    this.mouseenterHandler = function() {
      this.fx.cancel();
      this.fx.slideIn();
    }.bind(this);
    this.mouseleaveHandler = function() {
      this.fx.cancel();
      this.fx.slideOut();
    }.bind(this);
    [ this.head, this.panel ].each(function(el) { el.addEvent('mouseenter', this.mouseenterHandler) }, this);
    this.panel.addEvent('mouseleave', this.mouseleaveHandler);

    var races = this.racesNav.getElement('.races');
    var navUp = this.racesNav.getElement('a.nav-up');
    var navDown = this.racesNav.getElement('a.nav-down');

    var i = 0, n = races.getElements('.race').length;

    var updateView = function() {
      races.setStyle('marginTop', '-' + (50 * i) + 'px');
      navUp.setStyle('visibility', i > 0 ? 'visible' : 'hidden');
      navDown.setStyle('visibility', i + 5 < n - 1 ? 'visible' : 'hidden');
    };

    navUp.addEvent('click', function(e) {
      new Event(e).stop();
      i--;
      updateView();
    });
    navDown.addEvent('click', function(e) {
      new Event(e).stop();
      i++;
      updateView();
    });
    updateView();

    this.toggle1 = this.panel.getElement('.toggle1');
    this.toggle2 = this.panel.getElement('.toggle2');

    this.fx1 = new Fx.Slide(this.toggle1, {
      mode: 'horizontal',
      duration: 250
    });
    this.fx2 = new Fx.Slide(this.toggle2, {
      mode: 'horizontal',
      duration: 250
    });

    var infos = races.getElements('a.info');
    infos.each(function(info, index) {
      info.addEvent('click', this.handleRaceClick.bindWithEvent(this, info));
    }, this);
  },

  handleRaceClick: function(e, info) {
    e.stop();
    var spinner = new Spinner().show(info);
    new Request.HTML({
      url: this.layerUrl,
      data: { async: true, uuid: info.name },
      update: this.toggle2,
      onComplete: function() {
        spinner.hide().destroy();
        var close = this.toggle2.getElement('a.close');
        if (close) close.addEvent('click', this.handleCloseLayer.bindWithEvent(this));
        [ 'mouseenter', 'mouseleave' ].each(function(evt) {
          this.panel.removeEvent(evt, this[evt + 'Handler']);
        }, this);
        this.fx1.slideOut().chain(this.openLayer.bind(this));
      }.bind(this)
    }).get();
  },

  openLayer: function() {
    this.toggle1.setStyle('display', 'none');
    this.fx2.hide();
    this.toggle2.setStyle('display', '');
    this.fx2.slideIn();
  },

  handleCloseLayer: function(e) {
    e.stop();
    this.fx2.slideOut().chain(function() {
      this.toggle2.setStyle('display', 'none');
      this.fx1.hide();
      this.toggle1.setStyle('display', '');
      this.fx1.slideIn().chain(function() {
        [ 'mouseenter', 'mouseleave' ].each(function(evt) {
          this.panel.addEvent(evt, this[evt + 'Handler']);
        }, this);
      }.bind(this));
    }.bind(this));
  }

});
/*consigli*/
var Consigli= new Class({
   initialize: function(consigliId){
    this.consigli = $(consigliId);
    $$('a[class^=domanda]').each(function(el){
            el.addEvent('click', function(){
              risposta = el.getNext();
              if (risposta.getStyle('display') == 'block'){
                    risposta.setStyles({'display':'none'});
                    risposta.setOpacity(0);
                }
               else{
                     risposta.setStyles({'display':'block'});
                     risposta.setOpacity(1);
                   }
            }.bind(this));
         })
  }
});





var LazyLink = new Class({

  initialize: function(el, query, params) {
    this.el = $(el);
    this.query = query;
    this.params = params;
  },

  handleClick: function() {
    jslog.debug
    if (!this.href) {
      new Request({
        url: CONTEXT_PATH + '/lazy-link',
        onComplete: this.callback.bind(this)
      }).post({ query: this.query });
    } else {
      location.href = this.href;
    }
  },
  
  callback: function(resp) {
    if (resp == 'NOT FOUND') {
      // TODO
    } else {
      location.href = this.href = resp + '?' + Hash.toQueryString(this.params);
    }
  }

});

var LinkAudio = new Class({

  initialize: function(el, url, preview, width) {
    this.el = $(el);
    this.url = url;
    this.preview = $(preview);
    this.preview.getPrevious('a').addEvent('click', this.handleClose.bindWithEvent(this));
    this.width = width;
  },

  handleClick: function() {
    var swfobject = new SWFObject(CONTEXT_PATH + '/.resources/media/players/player.swf','player',(this.width == null)?'320':this.width,'20','9','#ffffff');
    swfobject.addParam('flashvars','file=' + CONTEXT_PATH + this.url + '&autostart=true');
    swfobject.write(this.preview);
    this.preview.getParent().setStyle('display', 'block');
  },

  handleClose: function(e) {
    e.stop();
    this.preview.empty();
    this.preview.getParent().setStyle('display', 'none');
  }

});

function loadSubLov(className, element, target, callback, onEmpty) {
  var idx = element.selectedIndex;
  if (idx > 0) {
    var value = element.options[idx].value;
    if (value != "") {
      var req = new Request( {
        method :'get',
        url :CONTEXT_PATH + "/sublov",
        data : {
          'className' :className,
          'idParent' :value
        },
        onRequest : function() {
          // alert('Request made. Please wait...');
      },
        onComplete : function(response) {
          target.empty();

          var opt = new Element("OPTION").set('value', '').set('html', '---');
          target.adopt(opt);

          eval(response);
          root.each( function(item) {
            var opt = new Element("OPTION").set('value', item.id).set('html',
                item.lbl);
            target.adopt(opt);
            if ($('preferredDealer')) $('preferredDealer').setStyle('display', item.showdealers=='true' ? '' : 'none');
          });

          if (callback != null)
          {
            callback(response, root);
          }
        }
      }).send();
      return;
    }
  }

  target.empty();
  var opt = new Element("OPTION").set('value', '').set('html', '---');
  target.adopt(opt);
  target.selectedIndex = 0;

  if (onEmpty != null)
  {
    onEmpty(target);
  }
}
/*
	Class: FormCheck
		Performs different tests on forms and indicates errors.
		
	Usage:
		Works with these types of fields :
		- input (text, radio, checkbox)
		- textarea
		- select
		
		You just need to add a specific class to each fields you want to check. 
		For example, if you add the class
			(code)
			validate['required','length[4, -1]','differs[email]','digit']
			(end code)
		the value's field must be set (required) with a minimum length of four chars (4, -1), 
		must differs of the input named email (differs[email]), and must be digit. 
		
		You can perform check during the datas entry or on the submit action, shows errors as tips or in a div before or after the field, 
		show errors one by one or all together, show a list of all errors at the top of the form, localize error messages, add new regex check, ...
		
		The layout is design only with css. Now I added a hack to use transparent png with IE6, so you can use png images in formcheck.css (works only for theme, so the file must be named formcheck.css). It can also works with multiple forms on a single html page.
		The class supports now internationalization. To use it, simply specify a new <script> element in your html head, like this : <script type="text/javascript" src="formcheck/lang/fr.js"></script>.

		If you add the class
			(code)
			validate['submit']
			(end code)
		to an element like an anchor (or anything else), this element will act as a submit button.
		
		N.B. : you must load the language script before the formcheck and this method overpass the old way. You can create new languages following existing ones. You can otherwise still specifiy the alerts' strings when you initialize the Class, with options.
		If you don't use a language script, the alert will be displayed in english.
	
	Test type:
		You can perform various test on fields by addind them to the validate class. Be careful to *not use space chars*. Here is the list of them.
			
		required 					- The field becomes required. This is a regex, you can change it with class options.
		alpha 						- The value is restricted to alphabetic chars. This is a regex, you can change it with class options.
		alphanum 					- The value is restricted to alphanumeric characters only. This is a regex, you can change it with class options.
		nodigit 					- The field doesn't accept digit chars. This is a regex, you can change it with class options.
		digit 						- The value is restricted to digit (no floating point number) chars, you can pass two arguments (f.e. digit[21,65]) to limit the number between them. Use -1 as second argument to not set a maximum.
		number 						- The value is restricted to number, including floating point number. This is a regex, you can change it with class options.
		email 						- The value is restricted to valid email. This is a regex, you can change it with class options.
		phone 						- The value is restricted to phone chars. This is a regex, you can change it with class options.
		url: 						- The value is restricted to url. This is a regex, you can change it with class options.
		confirm 					- The value has to be the same as the one passed in argument. f.e. confirm[password].
		differs 					- The value has to be diferent as the one passed in argument. f.e. differs[user].
		length 						- The value length is restricted by argument (f.e. length[6,10]). Use -1 as second argument to not set a maximum.
		
	Parameters:
		When you initialize the class with addEvent, you can set some options. If you want to modify regex, you must do it in a hash, like for display or alert. You can also add new regex check method by adding the regex and an alert with the same name.
		
		Required:
			
			form_id - The id of the formular. This is required.
			
		Optional:
			
			submitByAjax 			- you can set this to true if you want to submit your form with ajax. You should use provided events to handle the ajax request (see below). By default it is false.
			ajaxResponseDiv 		- id of element to inject ajax response into (can also use onAjaxSuccess). By default it is false.
			ajaxEvalScripts 		- use evalScripts in the Request response. Can be true or false, by default it is false.
			onAjaxRequest 			- Function to fire when the Request event starts.
			onAjaxSuccess 			- Function to fire when the Request receives .  Args: response [the request response] - see Mootools docs for Request.onSuccess.
			onAjaxFailure 			- Function to fire if the Request fails.
			
			tipsClass 				- The class to apply to tipboxes' errors. By default it is 'fc-tbx'.
			errorClass 				- The class to apply to alertbox (not tips). By default it is 'fc-error'.
			fieldErrorClass 		- The class to apply to fields with errors, except for radios. You should also turn on  options.addClassErrorToField. By default it is 'fc-field-error'
		
		Display:
			This is a hash of display settings. in here you can modify.
			
			showErrors 				- 0 : onSubmit, 1 : onSubmit & onBlur, by default it is 1.
			errorsLocation 			- 1 : tips, 2 : before, 3 : after, by default it is 1.
			indicateErrors 			- 0 : none, 1 : one by one, 2 : all, by default it is 1.
			keepFocusOnError 		- 0 : normal behaviour, 1 : the current field keep the focus as it remain errors. By default it is 0.
			checkValueIfEmpty 		- 0 : When you leave a field and you have set the showErrors option to 1, the value is tested only if a value has been set. 1 : The value is tested  in any case.  By default it is 1.
			addClassErrorToField 	- 0 : no class is added to the field, 1 : the options.fieldErrorClass is added to the field with an error (except for radio). By default it is 0.

			fixPngForIe 			- 0 : do nothing, 1 : fix png alpha for IE6 in formcheck.css. By default it is 1.
			replaceTipsEffect 		- 0 : No effect on tips replace when we resize the broswer, 1: tween transition on browser resize;
			closeTipsButton 		- 0 : the close button of the tipbox is hidden, 1 : the close button of the tipbox is visible. By default it is 1.
			flashTips 				- 0 : normal behaviour, 1 : the tipbox "flash" (disappear and reappear) if errors remain when the form is submitted. By default it is 0.
			tipsPosition 			- 'right' : the tips box is placed on the right part of the field, 'left' to place it on the left part. By default it is 'right'.
			tipsOffsetX 			- Horizontal position of the tips box (margin-left), , by default it is 100 (px).
			tipsOffsetY				- Vertical position of the tips box (margin-bottom), , by default it is -10 (px).
			
			listErrorsAtTop 		- List all errors at the top of the form, , by default it is false.
			scrollToFirst 			- Smooth scroll the page to first error and focus on it, by default it is true.
			fadeDuration 			- Transition duration (in ms), by default it is 300.
		
		Alerts:
			This is a hash of alerts settings. in here you can modify strings to localize or wathever else. %0 and %1 represent the argument.
			
			required 				- "This field is required."
			alpha 					- "This field accepts alphabetic characters only."
			alphanum 				- "This field accepts alphanumeric characters only."
			nodigit 				- "No digits are accepted."
			digit 					- "Please enter a valid integer."
			digitmin 				- "The number must be at least %0"
			digitltd 				- "The value must be between %0 and %1"
			number 					- "Please enter a valid number."
			email 					- "Please enter a valid email: <br /><span>E.g. yourname@domain.com</span>"
			phone 					- "Please enter a valid phone."
			url 					- "Please enter a valid url: <br /><span>E.g. http://www.domain.com</span>"
			confirm 				- "This field is different from %0"
			differs 				- "This value must be different of %0"
			length_str 				- "The length is incorrect, it must be between %0 and %1"
			length_fix 				- "The length is incorrect, it must be exactly %0 characters"
			lengthmax 				- "The length is incorrect, it must be at max %0"
			lengthmin 				- "The length is incorrect, it must be at least %0"
			checkbox 				- "Please check the box"
			radios 					- "Please select a radio"
			select 					- "Please choose a value"
		
	Example:
		You can initialize a formcheck (no scroll, custom classes and alert) by adding for example this in your html head this code :
		
		(code)
		<script type="text/javascript">
			window.addEvent('domready', function() {
				var myCheck = new FormCheck('form_id', {
					tipsClass : 'tips_box',
					display : {
						scrollToFirst : false
					},
					alerts : {
						required : 'This field is ablolutely required! Please enter a value'
					}
				})
			});
		</script>
		(end code)
	
	About:
		formcheck.js v.1.4rc5 for mootools v1.2 - 09 / 2008
		
		by Floor SA (http://www.floor.ch) MIT-style license
		
		Created by Luca Pillonel, last modified by Luca Pillonel
		
	Credits:
		This class was inspired by fValidator by Fabio Zendhi Nagao (http://zend.lojcomm.com.br)	
 */

var FormCheck = new Class(
		{

			Implements : [ Options, Events ],

			options : {

				tipsClass :'fc-tbx', // tips error class
				errorClass :'fc-error', // div error class
				fieldErrorClass :'fc-field-error', // error class for elements

				submitByAjax :false, // false : standard submit way, true : submit by
															// ajax
				ajaxResponseDiv :false, // element to inject ajax response into (can
																// also use onAjaxSuccess) [cronix]
				ajaxEvalScripts :false, // use evalScripts in the Request response
																// [cronix]
				onAjaxRequest :$empty, // Function to fire when the Request event
																// starts
				onAjaxSuccess :$empty, // Function to fire when the Request receives .
																// Args: response [the request response] - see
																// Mootools docs for Request.onSuccess
				onAjaxFailure :$empty, // Function to fire if the Request fails

				display : {
					showErrors :1,
					errorsLocation :1,
					indicateErrors :1,
					keepFocusOnError :0,
					checkValueIfEmpty :1,
					addClassErrorToField :0,
					fixPngForIe :1,
					replaceTipsEffect :1,
					flashTips :0,
					closeTipsButton :1,
					tipsPosition :"right",
					tipsOffsetX :-45,
					tipsOffsetY :0,
					listErrorsAtTop :false,
					scrollToFirst :true,
					fadeDuration :300
				},

				alerts : {
					required :"This field is required.",
					alpha :"This field accepts alphabetic characters only.",
					alphanum :"This field accepts alphanumeric characters only.",
					nodigit :"No digits are accepted.",
					digit :"Please enter a valid integer.",
					digitltd :"The value must be between %0 and %1",
					number :"Please enter a valid number.",
					email :"Please enter a valid email.",
					phone :"Please enter a valid phone.",
					url :"Please enter a valid url.",
					date: "Please enter a valid date (format is yyyy-MM-dd)",
					name: "This field accepts alphabetic characters only",

					confirm :"This field is different from %0",
					differs :"This value must be different of %0",
					max :"The value must be lower or equal to %0",
					min :"The value must be greater or equal to %0",
					maxDate :"The value must be before or equal to %0",
					minDate :"The value must be after or equal to %0",
					length_str :"The length is incorrect, it must be between %0 and %1",
					length_fix :"The length is incorrect, it must be exactly %0 characters",
					lengthmax :"The length is incorrect, it must be at max %0",
					lengthmin :"The length is incorrect, it must be at least %0",
					checkbox :"Please check the box",
					radios :"Please select a radio",
					select :"Please choose a value"
				},

				regexp : {
					required :/[^.*]/,
					alpha :/^[a-z ._-]+$/i,
					alphanum :/^[a-z0-9._@-]+$/i,
					digit :/^[-+]?[0-9]+$/,
					nodigit :/^[^0-9]+$/,
					number :/^[-+]?\d*\.?\d+$/,
					email :/^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i,
					phone :/^[\d\s ().-]+$/,
					url :/^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%$#\=~])*$/i,
					date: /^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$/i,
					name: /^[A-Za-z\u00C0-\u017F\u1e00-\u1ef9\-\.\' ]*$/
				},
				
				dateFormat: 'yyyy-mm-dd'
			},

			/*
			 * Constructor: initialize Constructor
			 * 
			 * Add event on formular and perform some stuff, you now, like settings,
			 * ...
			 */
			initialize : function(form, options) {
				if (this.form = $(form)) {
					this.form.isValid = true;
					this.regex = [ 'length' ];
					this.setOptions(options);

					// internalization
					if (typeof (formcheckLanguage) != 'undefined')
						this.options.alerts = formcheckLanguage;

					this.validations = [];
					this.alreadyIndicated = false;
					this.firstError = false;

					var regex = new Hash(this.options.regexp);
					regex.each( function(el, key) {
						this.regex.push(key);
					}, this);

					this.form.getElements("*[class*=validate]").each( function(el) {
						el.validation = [];
						var classes = el.getProperty("class").split(' ');
						classes.each( function(classX) {
							if (classX.match(/^validate(\[.+\])$/)) {
								var validators = eval(classX.match(/^validate(\[.+\])$/)[1]);
								for ( var i = 0; i < validators.length; i++) {
									el.validation.push(validators[i]);
								}
								this.register(el);
							}
						}, this);
					}, this);

					this.form.addEvents( {
						"submit" :this.onSubmit.bind(this)
					});

					if (this.options.display.fixPngForIe)
						this.fixIeStuffs();
					document.addEvent('mousewheel', function() {
						this.isScrolling = false;
					}.bind(this));
				}
			},

			/*
			 * Function: register Private method
			 * 
			 * Add listener on fields
			 */
			register : function(el) {
				this.validations.push(el);
				el.errors = [];
				if (el.validation[0] == 'submit') {
					el.addEvent('click', function(e) {
						this.onSubmit(e);
					}.bind(this));
					return true;
				}

				var manageErrorFunc = this.manageError;
				
				if (this.isChildType(el) == false)
					el.addEvent('blur', function(e) {
						if ((el.element || this.options.display.showErrors == 1)
								&& (this.options.display.checkValueIfEmpty || el.value)) {
							//this.manageError(el, 'blur').delay(100);							
							manageErrorFunc.delay(100, this, [el, 'blur']);
						}						
					}.bind(this))
					// We manage errors on radio
				else if (this.isChildType(el) == true) {
					// We get all radio from the same group and add a blur option
					var nlButtonGroup = this.form.getElements('input[name="' + el
							.getProperty("name") + '"]');
					nlButtonGroup.each( function(radio) {
						radio.addEvent('blur', function() {
							if ((el.element || this.options.display.showErrors == 1)
									&& (this.options.display.checkValueIfEmpty || el.value)) {
								manageErrorFunc.delay(100, this, [el, 'click']);
							}
						}.bind(this))
					}, this);
				}
			},

			/*
			 * Function: validate Private method
			 * 
			 * Dispatch check to other methods
			 */
			validate : function(el) {
				el.errors = [];
				el.isOk = true;
				// On valide l'lment qui n'est pas un radio ni checkbox
				el.validation.each( function(rule) {
					if (this.isChildType(el)) {
						if (this.validateGroup(el) == false) {
							el.isOk = false;
						}
					} else {
						var ruleArgs = [];
						if (rule.match(/^.+\[/)) {
							var ruleMethod = rule.split('[')[0];
							ruleArgs = eval(rule.match(/^.+(\[.+\])$/)[1].replace(
									/([A-Z\.]+)/i, "'$1'"));
						} else
							var ruleMethod = rule;

						if (this.regex.contains(ruleMethod) && el.get('tag') != "select") {
							if (this.validateRegex(el, ruleMethod, ruleArgs) == false) {
								el.isOk = false;
							}
						}

						if (ruleMethod == 'confirm') {
							if (this.validateConfirm(el, ruleArgs) == false) {
								el.isOk = false;
							}
						}
						if (ruleMethod == 'differs') {
							if (this.validateDiffers(el, ruleArgs) == false) {
								el.isOk = false;
							}
						}
						if (el.get('tag') == "select"
								|| (el.type == "checkbox" && ruleMethod == 'required')) {
							if (this.simpleValidate(el) == false) {
								el.isOk = false;
							}
						}
						
						/**
						 * MANUEL
						 */
						if (ruleMethod == 'max') {
							if (this.validateMax(el, ruleArgs) == false) {
								el.isOk = false;
							}
						}
						if (ruleMethod == 'min') {
							if (this.validateMin(el, ruleArgs) == false) {
								el.isOk = false;
							}
						}
						if (ruleMethod == 'maxDate') {
							if (this.validateMaxDate(el, ruleArgs) == false) {
								el.isOk = false;
							}
						}
						if (ruleMethod == 'minDate') {
							if (this.validateMinDate(el, ruleArgs) == false) {
								el.isOk = false;
							}
						}
						/**
						 * END MANUEL
						 */
					}
				}, this);

				if (el.isOk)
					return true;
				else
					return false;
			},

			/*
			 * Function: simpleValidate Private method
			 * 
			 * Perform simple check for select fields and checkboxes
			 */
			simpleValidate : function(el) {
				if (el.get('tag') == 'select'
						&& (el.options[el.selectedIndex].text == el.options[0].text)) {
					el.errors.push(this.options.alerts.select);
					return false;
				} else if (el.type == "checkbox" && el.checked == false) {
					el.errors.push(this.options.alerts.checkbox);
					return false;
				}
				return true;
			},

			/*
			 * Function: validateRegex Private method
			 * 
			 * Perform regex validations
			 */
			validateRegex : function(el, ruleMethod, ruleArgs) {
				var msg = "";
				if (ruleArgs[1] && ruleMethod == 'length') {
					if (ruleArgs[1] == -1) {
						this.options.regexp.length = new RegExp("^[\\s\\S]{" + ruleArgs[0]
								+ ",}$");
						msg = this.options.alerts.lengthmin.replace("%0", ruleArgs[0]);
					} else if (ruleArgs[0] == ruleArgs[1]) {
						this.options.regexp.length = new RegExp("^[\\s\\S]{" + ruleArgs[0]
								+ "}$");
						msg = this.options.alerts.length_fix.replace("%0", ruleArgs[0]);
					} else {
						this.options.regexp.length = new RegExp("^[\\s\\S]{" + ruleArgs[0]
								+ "," + ruleArgs[1] + "}$");
						msg = this.options.alerts.length_str.replace("%0", ruleArgs[0])
								.replace("%1", ruleArgs[1]);
					}
				} else if (ruleArgs[0] && ruleMethod == 'length') {
					this.options.regexp.length = new RegExp("^.{0," + ruleArgs[0] + "}$");
					msg = this.options.alerts.lengthmax.replace("%0", ruleArgs[0]);
				} else {
					msg = this.options.alerts[ruleMethod];
				}
				if (ruleArgs[1] && ruleMethod == 'digit') {
					var regres = true;
					if (!this.options.regexp.digit.test(el.value)) {
						el.errors.push(this.options.alerts[ruleMethod]);
						regres = false;
					}
					if (ruleArgs[1] == -1) {
						if (el.value >= ruleArgs[0])
							var valueres = true;
						else
							var valueres = false;
						msg = this.options.alerts.digitmin.replace("%0", ruleArgs[0]);
					} else {
						if (el.value >= ruleArgs[0] && el.value <= ruleArgs[1])
							var valueres = true;
						else
							var valueres = false;
						msg = this.options.alerts.digitltd.replace("%0", ruleArgs[0])
								.replace("%1", ruleArgs[1]);
					}
					if (regres == false || valueres == false) {
						el.errors.push(msg);
						return false;
					}
				} else if (this.options.regexp[ruleMethod].test(el.value) == false) {
					el.errors.push(msg);
					return false;
				}
				return true;
			},

			/*
			 * Function: validateConfirm Private method
			 * 
			 * Perform confirm validations
			 */
			validateConfirm : function(el, ruleArgs) {
				if (el.validation.contains('required') == false) {
					el.validation.push('required');
				}
				var confirm = ruleArgs[0];
				if (el.value != this.form[confirm].value) {
					msg = this.options.alerts.confirm.replace("%0", ruleArgs[0]);
					el.errors.push(msg);
					return false;
				}
				return true;
			},

			/*
			 * Function: validateDiffers Private method
			 * 
			 * Perform differs validations
			 */
			validateDiffers : function(el, ruleArgs) {
				var confirm = ruleArgs[0];
				if (el.value == this.form[confirm].value) {
					msg = this.options.alerts.differs.replace("%0", ruleArgs[0]);
					el.errors.push(msg);
					return false;
				}
				return true;
			},

			/*
			 * Function: isChildType Private method
			 * 
			 * Determine if the field is a group of radio or not.
			 */
			isChildType : function(el) {
				var elType = el.type.toLowerCase();
				if ((elType == "radio"))
					return true;
				return false;
			},

			/*
			 * Function: validateGroup Private method
			 * 
			 * Perform radios validations
			 */
			validateGroup : function(el) {
				el.errors = [];
				var nlButtonGroup = this.form[el.getProperty("name")];
				el.group = nlButtonGroup;
				var cbCheckeds = false;

				for ( var i = 0; i < nlButtonGroup.length; i++) {
					if (nlButtonGroup[i].checked) {
						cbCheckeds = true;
					}
				}
				if (cbCheckeds == false) {
					el.errors.push(this.options.alerts.radios);
					return false;
				} else {
					return true;
				}
			},

			/*
			 * Function: listErrorsAtTop Private method
			 * 
			 * Display errors
			 */
			listErrorsAtTop : function(obj) {
				if (!this.form.element) {
					this.form.element = new Element('div', {
						'id' :'errorlist',
						'class' :this.options.errorClass
					}).injectTop(this.form);
				}
				if ($type(obj) == 'collection') {
					new Element('p').set('html',
							"<span>" + obj[0].name + " : </span>" + obj[0].errors[0])
							.injectInside(this.form.element);
				} else {
					if ((obj.validation.contains('required') && obj.errors.length > 0)
							|| (obj.errors.length > 0 && obj.value && obj.validation
									.contains('required') == false)) {
						obj.errors.each( function(error) {
							new Element('p').set('html',
									"<span>" + obj.name + " : </span>" + error).injectInside(
									this.form.element);
						}, this);
					}
				}
			},

			/*
			 * Function: manageError Private method
			 * 
			 * Manage display of errors boxes
			 */
			manageError : function(el, method) {
				var isValid = this.validate(el);
				if ((!isValid && el.validation.contains('required'))
						|| (!el.validation.contains('required') && el.value && !isValid)) {
					if (this.options.display.listErrorsAtTop == true
							&& method == 'submit')
						this.listErrorsAtTop(el, method);
					if (this.options.display.indicateErrors == 2
							|| this.alreadyIndicated == false
							|| el.name == this.alreadyIndicated.name) {
						if (!this.firstError)
							this.firstError = el;
						this.alreadyIndicated = el;
						if (this.options.display.keepFocusOnError
								&& el.name == this.firstError.name)
							( function() {
								el.focus()
							}).delay(20);
						this.addError(el);
						return false;
					}
				} else if ((isValid || (!el.validation.contains('required') && !el.value))
						&& el.element) {
					this.removeError(el);
					return true;
				}
				return true;
			},

			/*
			 * Function: addError Private method
			 * 
			 * Add error message
			 */
			addError : function(obj) {
				if (!obj.element && this.options.display.indicateErrors != 0) {
					if (this.options.display.errorsLocation == 1) {
						var pos = (this.options.display.tipsPosition == 'left') ? obj
								.getCoordinates().left : obj.getCoordinates().right;
						var options = {
							'opacity' :0,
							'position' :'absolute',
							'float' :'left',
							'left' :pos + this.options.display.tipsOffsetX
						}
						obj.element = new Element('div', {
							'class' :this.options.tipsClass,
							'styles' :options
						}).injectInside(document.body);
						this.addPositionEvent(obj);
					} else if (this.options.display.errorsLocation == 2) {
						obj.element = new Element('div', {
							'class' :this.options.errorClass,
							'styles' : {
								'opacity' :0
							}
						}).injectBefore(obj);
					} else if (this.options.display.errorsLocation == 3) {
						obj.element = new Element('div', {
							'class' :this.options.errorClass,
							'styles' : {
								'opacity' :0
							}
						});
						if ($type(obj.group) == 'object'
								|| $type(obj.group) == 'collection')
							obj.element.injectAfter(obj.group[obj.group.length - 1]);
						else
							obj.element.injectAfter(obj);
					}
				}
				if (obj.element) {
					obj.element.empty();
					if (this.options.display.errorsLocation == 1) {
						var errors = [];
						obj.errors.each( function(error) {
							errors.push(new Element('p').set('html', error));
						});
						var tips = this.makeTips(errors).injectInside(obj.element);
						if (this.options.display.closeTipsButton) {
							tips.getElements('a.close').addEvent('mouseup', function() {
								this.removeError(obj);
							}.bind(this));
						}
						obj.element.setStyle('top', obj.getCoordinates().top
								- tips.getCoordinates().height
								+ this.options.display.tipsOffsetY);
					} else {
						obj.errors.each( function(error) {
							new Element('p').set('html', error).injectInside(obj.element);
						});
					}

					if (!Browser.Engine.trident5 && obj.element.getStyle('opacity') == 0)
						new Fx.Morph(obj.element, {
							'duration' :this.options.display.fadeDuration
						}).start( {
							'opacity' : [ 1 ]
						});
					else
						obj.element.setStyle('opacity', 1);
				}
				if (this.options.display.addClassErrorToField
						&& this.isChildType(obj) == false) {
					obj.addClass(this.options.fieldErrorClass);
				}
			},

			/*
			 * Function: addPositionEvent
			 * 
			 * Update tips position after a browser resize
			 */
			addPositionEvent : function(obj) {
				if (this.options.display.replaceTipsEffect) {
					obj.event = function() {
						new Fx.Morph(obj.element, {
							'duration' :this.options.display.fadeDuration
						})
								.start( {
									'left' : [
											obj.element.getStyle('left'),
											obj.getCoordinates().right
													+ this.options.display.tipsOffsetX ],
									'top' : [
											obj.element.getStyle('top'),
											obj.getCoordinates().top
													- obj.element.getCoordinates().height
													+ this.options.display.tipsOffsetY ]
								});
					}.bind(this);

				} else {
					obj.event = function() {
						obj.element.setStyles( {
							'left' :obj.getCoordinates().right
									+ this.options.display.tipsOffsetX,
							'top' :obj.getCoordinates().top
									- obj.element.getCoordinates().height
									+ this.options.display.tipsOffsetY
						});
					}.bind(this)
				}
				window.addEvent('resize', obj.event);
			},

			/*
			 * Function: removeError Private method
			 * 
			 * Remove the error display
			 */
			removeError : function(obj) {
				this.firstError = false;
				this.alreadyIndicated = false;
				obj.errors = [];
				obj.isOK = true;
				window.removeEvent('resize', obj.event);
				if (this.options.display.errorsLocation == 2)
					new Fx.Morph(obj.element, {
						'duration' :this.options.display.fadeDuration
					}).start( {
						'height' : [ 0 ]
					});
				if (!Browser.Engine.trident5) {
					new Fx.Morph(obj.element, {
						'duration' :this.options.display.fadeDuration,
						'onComplete' : function() {
							if (obj.element) {
								obj.element.destroy();
								obj.element = false;
							}
						}.bind(this)
					}).start( {
						'opacity' : [ 1, 0 ]
					});
				} else {
					obj.element.destroy();
					obj.element = false;
				}

				if (this.options.display.addClassErrorToField && !this.isChildType(obj)) {
					obj.removeClass(this.options.fieldErrorClass);
				}
			},

			/*
			 * Function: focusOnError Private method
			 * 
			 * Create set the focus to the first field with an error if needed
			 */
			focusOnError : function(obj) {
				if (this.options.display.scrollToFirst && !this.alreadyFocused
						&& !this.isScrolling) {
					if (this.alreadyIndicated.element) {
						switch (this.options.display.errorsLocation) {
						case 1:
							var dest = obj.element.getCoordinates().top;
							break;
						case 2:
							var dest = obj.element.getCoordinates().top - 30;
							break;
						case 3:
							var dest = obj.getCoordinates().top - 30;
							break;
						}
						this.isScrolling = true;
					} else if (!this.options.display.indicateErrors) {
						var dest = obj.getCoordinates().top - 30;
					}
					if (window.getScroll.y != dest) {
						new Fx.Scroll(window, {
							onComplete : function() {
								this.isScrolling = false;
								obj.focus();
							}.bind(this)
						}).start(0, dest);
					} else {
						this.isScrolling = false;
						obj.focus();
					}
					this.alreadyFocused = true;
				}
			},

			/*
			 * Function: fixIeStuffs Private method
			 * 
			 * Fix png for IE6
			 */
			fixIeStuffs : function() {
				if (Browser.Engine.trident4) {
					// We fix png stuffs
					var rpng = new RegExp('url\\(([\.a-zA-Z0-9_/:-]+\.png)\\)');
					var search = new RegExp('(.+)formcheck\.css');
					for ( var i = 0; i < document.styleSheets.length; i++) {
						if (document.styleSheets[i].href.match(/formcheck\.css$/)) {
							var root = document.styleSheets[i].href.replace(search, '$1');
							var count = document.styleSheets[i].rules.length;
							for ( var j = 0; j < count; j++) {
								var cssstyle = document.styleSheets[i].rules[j].style;
								var bgimage = root
										+ cssstyle.backgroundImage.replace(rpng, '$1');
								if (bgimage && bgimage.match(/\.png/i)) {
									var scale = (cssstyle.backgroundRepeat == 'no-repeat') ? 'crop'
											: 'scale';
									cssstyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, src=\''
											+ bgimage + '\', sizingMethod=\'' + scale + '\')';
									cssstyle.backgroundImage = "none";
								}
							}
						}
					}
				}
			},

			/*
			 * Function: makeTips Private method
			 * 
			 * Create tips boxes
			 */
			makeTips : function(txt) {
				var table = new Element('table');
				table.cellPadding = '0';
				table.cellSpacing = '0';
				table.border = '0';

				var tbody = new Element('tbody').injectInside(table);
				var tr1 = new Element('tr').injectInside(tbody);
				new Element('td', {
					'class' :'tl'
				}).injectInside(tr1);
				new Element('td', {
					'class' :'t'
				}).injectInside(tr1);
				new Element('td', {
					'class' :'tr'
				}).injectInside(tr1);
				var tr2 = new Element('tr').injectInside(tbody);
				new Element('td', {
					'class' :'l'
				}).injectInside(tr2);
				var cont = new Element('td', {
					'class' :'c'
				}).injectInside(tr2);
				var errors = new Element('div', {
					'class' :'err'
				}).injectInside(cont);
				txt.each( function(error) {
					error.injectInside(errors);
				});
				if (this.options.display.closeTipsButton)
					new Element('a', {
						'class' :'close'
					}).injectInside(cont);
				// new Element('div', {'style' : "clear:both"}).injectInside(cont);
				new Element('td', {
					'class' :'r'
				}).injectInside(tr2);
				var tr3 = new Element('tr').injectInside(tbody);
				new Element('td', {
					'class' :'bl'
				}).injectInside(tr3);
				new Element('td', {
					'class' :'b'
				}).injectInside(tr3);
				new Element('td', {
					'class' :'br'
				}).injectInside(tr3);
				return table;
			},

			/*
			 * Function: reinitialize Private method
			 * 
			 * Reinitialize form before submit check
			 */
			reinitialize : function() {
				this.validations.each( function(el) {
					if (el.element) {
						el.errors = [];
						el.isOK = true;
						if (this.options.display.flashTips == 1) {
							el.element.destroy();
							el.element = false;
						}
					}
				}, this);
				if (this.form.element)
					this.form.element.empty();
				this.alreadyFocused = false;
				this.firstError = false;
				this.alreadyIndicated = false;
				this.form.isValid = true;
			},

			/*
			 * Function: submitByAjax Private method
			 * 
			 * Send the form by ajax, and replace the form with response
			 */

			submitByAjax : function() {
				var url = this.form.getProperty('action');
				this.fireEvent('ajaxRequest');
				new Request( {
					url :url,
					method :this.form.getProperty('method'),
					data :this.form.toQueryString(),
					evalScripts :this.options.ajaxEvalScripts,
					onFailure : function(instance) {
						this.fireEvent('ajaxFailure', instance);
					}.bind(this),
					onSuccess : function(result) {
						this.fireEvent('ajaxSuccess', result);
						if (this.options.ajaxResponseDiv)
							$(this.options.ajaxResponseDiv).set('html', result);
					}.bind(this)
				}).send();
			},

			/*
			 * Function: onSubmit Private method
			 * 
			 * Perform check on submit action
			 */
			onSubmit : function(event) {
				new Event(event).stop();
				this.reinitialize();

				this.validations.each( function(el) {
					if (!this.manageError(el, 'submit'))
						this.form.isValid = false;
				}, this);

				(this.form.isValid) ? (this.options.submitByAjax) ? this.submitByAjax()
						: this.form.submit() : this.focusOnError(this.firstError);
			}
			
			/**
			 * MANUEL
			 */
			,
			validateMax : function(el, ruleArgs) {
				var maxValue = ruleArgs[0];
				if (el.value > maxValue) {
					msg = this.options.alerts.max.replace("%0", ruleArgs[0]);
					el.errors.push(msg);
					return false;
				}
				return true;
			},

			validateMin : function(el, ruleArgs) {
				var minValue = ruleArgs[0];
				if (el.value < minValue) {
					msg = this.options.alerts.min.replace("%0", ruleArgs[0]);
					el.errors.push(msg);
					return false;
				}
				return true;
			},
			
			validateMaxDate : function(el, ruleArgs) {
				var maxValue = ruleArgs[0];
				if (el.value > maxValue) {
					msg = this.options.alerts.max.replace("%0", ruleArgs[0]);
					el.errors.push(msg);
					return false;
				}
				return true;
			},

			validateMinDate : function(el, ruleArgs) {
				var minValue = ruleArgs[0];
				if (el.value < minValue) {
					msg = this.options.alerts.min.replace("%0", ruleArgs[0]);
					el.errors.push(msg);
					return false;
				}
				return true;
			}
		});
/**
 *	Script: AutoAccordion.js
 *	A Plugins.Accordion extension that opens on mouseover rather than on click.
 *	@params: same as Mootools Accordion.js  
 *  @author: fgrilli
 *	
 **/
var AutoAccordion = new Class({

  Extends: Accordion,

	initialize: function(togglers, elements, options) {
		 //if delay is not defined, open the first element by default	
		 if (! $defined(options.display)) options.display = 0;
		 //opacity = true doesn't look nice
		 //options.opacity = false;
		 
		 /*if(togglers.length > 0)
		 	this.initialTogglerFontSize = togglers[0].getStyle('fontSize');
		 alert(this.initialTogglerFontSize)*/
		 	
		//elements can be displayed when not in magnolia edit mode
		 elements.each( function (el) {
				el.setStyle('display','block')});
				
		// run parent initializer
		this.parent(togglers, elements, options); //this.parent.apply(this, arguments);

		
		//when the mouse leaves the menu wrapper, opens the accordion on the default element
		$('dyn-nav').addEvent('mouseleave', function(){
					this.display(options.display);
		}.bind(this));
		
		// this next part adds the automatic opening magic to each 'Handle'
		this.togglers.each(function(handle, index, array) {
			
			// and the magic hover opening dealie!
			handle.hoverOpenTimer = null
			handle.addEvents({
				mouseenter: function(thisHandle) {
					thisHandle.hoverOpenTimer = $clear(thisHandle.hoverOpenTimer);
					thisHandle.hoverOpenTimer = this.display.delay(0, this, index);
				}.bind(this, handle),
				
				mouseleave: function(thisHandle) {
					thisHandle.hoverOpenTimer = $clear(thisHandle.hoverOpenTimer);
				}.bind(this, handle)
			});

		}.bind(this));
	}
});
var MenuSecondLevelMC = new Class({

  initialize: function(el, level) {
    this.el = $(el);
    this.addEventHandlers(this.el, 1, level);
    
    this.active = this.el.getElement('li.active');
    if (this.active == null) {
      var trail = this.el.getElements('li.trail');
      if (trail.length > 0) this.active = trail[trail.length - 1];
    }
    this.refresh();
  },

  addEventHandlers: function(el, l, L) {
    var ul = el.getElement('ul');
    if (ul) {
      jslog.debug('l=' + l + '; L=' + L);
      ul.getChildren('li').each(function(li) {
        var link = li.getElement('a');
        if (!link.hasClass('linkToPage')) {
          link.addEvent('click', this.linkClick.bindWithEvent(this, link));
          if (l < L) this.addEventHandlers(li, l + 1, L);
        }
      }, this);
    }
  },

  linkClick: function(e, link) {
    e.stop();
    if (this.active) this.active.removeClass('active');
    this.active = link.getParent('li');
    this.active.addClass('active');
    this.refresh();
  },

  refresh: function() {
    this.hideNonChildrenDescendants(this.active);
    this.hideNonAncestorBranches(this.active);
  },

  hideNonChildrenDescendants: function(li) {
    if (!li) return;
    var ul = li.getElement('ul');
    if (!ul) return;
    ul.getChildren('li').each(function(li) {
      var ulChild = li.getElement('ul');
      if (ulChild) ulChild.setStyle('display', 'none');
    });
  },

  hideNonAncestorBranches: function(li) {
    if (!li) return;
    li.getParents('ul').each(function(ulParent) {
      var liParent = ulParent.getParent();
      ulParent.getChildren('li').each(function(liSibling) {
        var ulSibling = liSibling.getElement('ul');
        if (ulSibling) ulSibling.setStyle('display', liSibling == li ? 'block' : 'none');
      });
      li = liParent;
    });
  }

});
  /*********************************************************/
 /*   vlaCalendar version 2.1 for mootools release 1.2    */
/*********************************************************/

var vlaCalendar = new Class({
	'slideDuration': 500,
	'fadeDuration': 500,
	'transition': Fx.Transitions.Quart.easeOut,
	'startMonday': false,
	'filePath': 'inc/',
	'defaultView': 'month',
	'style': '',
	
	initialize: function(_container, _options) {
		//Add the provided options to this object by extending
		if(_options) $extend(this, _options);
		
		this.loading = false;
		this.container = _container = $(_container);
		var _class = this;
		
		//Insert the base into the container and initialize elements
		var  pars = 'defaultView='+ this.defaultView;
		if(this.picker) {
			if($type(this.prefillDate) == 'object' && this.getInputDate(this.prefillDate)) pars += '&pickedDate='+ this.getInputDate(this.prefillDate);
			if(this.linkWithInput) pars += '&gotoPickedDate=1';
		}
		this.u('base', pars, function() { 
			_class.mainLoader = _container.getElement('div[class=loaderA]');
			_class.tempLoader = _container.getElement('div[class=loaderB]');
			_class.label 	  = _container.getElement('span[class=label]');
			_class.arrowLeft  = _container.getElement('div[class=arrowLeft]');
			_class.arrowRight = _container.getElement('div[class=arrowRight]');				
			_class.initializeCalendarFunctions();
			
			//Prefill/load picker date elements
			if(_class.picker) {
				if($type(_class.prefillDate) == 'object' && _class.getInputDate(_class.prefillDate)) _class.pick(_class.prefillDate);
				else if(_class.prefillDate == true) _class.pick(JSON.decode(_class.label.getProperty('date')));
			}
		}, _container);
	},
	
	initializeCalendarFunctions: function() {
		this.resetArrows();
		
		//Retrieve data (label, timestamp etc) which are stored as a Json string in the table attribute summary
		var vars = JSON.decode(this.mainLoader.getElement('table').getProperty('summary'));
		var _class = this; 
		
		//Change the label
		this.label.removeClass('noHover').set('html', vars.label)
			.onclick = vars.parent ? function() { _class.u(vars.parent, 'ts=' + vars.ts + '&parent=' + vars.current, function() { _class.fade() }) } : null;
			
		//Hide arrows if necessary and add arrow click events
		if(vars.hide_left_arrow) this.hideLeftArrow();
		else if(vars.hide_right_arrow) this.hideRightArrow();
		
		this.arrowLeft.onclick  = function() { _class.u(vars.current, 'ts=' + vars.pr_ts, function() { _class.slideLeft() }) }
		this.arrowRight.onclick = function() { _class.u(vars.current, 'ts=' + vars.nx_ts, function() { _class.slideRight() }) }		
		
		//Add cell click events
		var clickables = this.mainLoader.getElements('td');
		switch(vars.current) {
			case 'month':
				if(this.picker) {
					clickables.each(function(_clickable) {
						_clickable.onclick = function() { 
							_class.pick(JSON.decode(_clickable.getProperty('date')));
							_class.mainLoader.getElements('td').each(function(_clickable) { _clickable.removeClass('selected') });
							this.addClass('selected'); 
						}
					});
				}
				break;
			case 'year':
				clickables.each(function(_clickable) {
					_clickable.onclick = function() { _class.u('month', 'ts=' + _clickable.getProperty('ts'), function() { _class.fade() }) }
				});
				break;
			case 'decade':
				this.label.addClass('noHover');
				clickables.each(function(_clickable) {
					_clickable.onclick = function() { _class.u('year', 'ts=' + _clickable.getProperty('ts') + '&m_ts=' + _clickable.getProperty('m_ts'), function() { _class.fade() }) }
				});
				break;
		}
	},
	
	//Ajax updater function which handles all requests
	u: function(_url, _pars, _onComplete, _id) {
		if(!this.loading && !this.transitioning) {
			var _class = this;
			this.loading = true;
			var element = $(_id ? _id : this.tempLoader);
			_pars += '&picker=' + (this.picker ? 1 : 0) + '&startMonday=' + (this.startMonday ? 1 : 0) + '&style=' +  this.style;
			if(this.picker && this.getInputDate()) _pars += '&pickedDate='+ this.getInputDate();
			new Request({ method: 'post',
						  url: this.filePath + _url + '.php',
						  onComplete: function(data) { element.set('html', data); _onComplete(); _class.loading = false; }
						}).send(_pars);
		}
	},
	
	slideLeft: function() {
		var _class = this;
		this.transitioning = true;	
		this.tempLoader.setStyle('opacity', 1).set('tween', { duration: this.slideDuration, transition: this.transition }).tween('margin-left', [-164, 0]);
		this.mainLoader.setStyle('opacity', 1).set('tween', { duration: this.slideDuration, transition: this.transition, onComplete: function() { _class.transitioning = false } })
			.tween('margin-left', [0, 164]);
		this.switchLoaders();
	},
	
	slideRight: function() {
		var _class = this;
		this.transitioning = true;
		this.mainLoader.setStyle('opacity', 1).set('tween', { duration: this.slideDuration, transition: this.transition }).tween('margin-left', [0, -164]);
		this.tempLoader.setStyle('opacity', 1).set('tween', { duration: this.slideDuration, transition: this.transition, onComplete: function() { _class.transitioning = false } })
			.tween('margin-left', [164, 0]);
		this.switchLoaders();
	},
	
	fade: function(overRuleTrans) {
		var _class = this;
		this.transitioning = overRuleTrans ? false : true;
		this.tempLoader.setStyles({'opacity': 0, 'margin-left': 0});
		this.mainLoader.set('tween', { duration: this.fadeDuration, transition: this.transition}).fade('out');
		this.tempLoader.set('tween', { duration: this.fadeDuration, transition: this.transition, 
			onComplete: function() { 
					_class.tempLoader.setStyles({'opacity': 1, 'margin-left': -999});
					_class.transitioning = false;
				} 
			}).fade('in');
		this.switchLoaders();
	},
	
	switchLoaders: function() {
		this.mainLoader = this.mainLoader.className == 'loaderA' ? this.container.getElement('div[class=loaderB]') : this.container.getElement('div[class=loaderA]');
		this.tempLoader = this.tempLoader.className == 'loaderA' ? this.container.getElement('div[class=loaderB]') : this.container.getElement('div[class=loaderA]');
		this.initializeCalendarFunctions();
	},
	
	resetArrows: function() {
		this.arrowLeft.setStyle('visibility', 'visible');
		this.arrowRight.setStyle('visibility', 'visible');
	},
	
	hideLeftArrow: function() {
		this.arrowLeft.setStyle('visibility', 'hidden');
	},
	
	hideRightArrow: function() {
		this.arrowRight.setStyle('visibility', 'hidden');
	} 
});

var vlaDatePicker = new Class({
	Extends: vlaCalendar,
	
	'separateInput': false,
	'prefillDate': true,
	'linkWithInput': true,
	'leadingZero': true,
	'twoDigitYear': false,
	'separator': '/',
	'format': 'd/m/y',
	'openWith': null,
	'alignX': 'right',
	'alignY': 'inputTop',
	'offset': { 'x': 0, 'y': 0 },
	'style': '',
	'ieTransitionColor' : '#ffffff',
	'toggleDuration': 350,
	
	initialize: function(_element, _options) {
		//Add the provided options to this object by extending
		if(_options) $extend(this, _options);
		
		this.element = $(_element);
		if(!this.element) throw 'No (existing) element to create a datepicker for specified: new vlaDatePicker(ELEMENT, [options])';
		
		//Check if the user wants multiple input
		if(this.separateInput) {
			this.element.day   = this.element.getElement('input[name='+ this.separateInput.day +']');
			this.element.month = this.element.getElement('input[name='+ this.separateInput.month +']');
			this.element.year  = this.element.getElement('input[name='+ this.separateInput.year +']');
		}
		
		//Create the picker and calendar and inject in in the body
		this.picker = new Element('div', { 'class': 'vlaCalendarPicker' + (this.style != '' ? ' ' + this.style : '') }).injectTop($(document.body));
		this.pickerContent = new Element('div', { 'class': 'pickerBackground' }).injectTop(this.picker);
		this.parent(this.pickerContent);
		
		//Add events for showing and hiding the picker
		var _class = this;
		(this.openWith ? $(this.openWith) : this.element)
			.addEvent('focus',  function() { _class.show(); })
			.addEvent('click',  function() { _class.openWith ? _class.toggle() : _class.show() })
			.addEvent('change', function() { _class.hide(); });
		
		//If the datepicker is visible an outside click makes it hide
		document.addEvent('mousedown', function(e) { if(_class.outsideHide && _class.outsideClick(e, _class.picker)) _class.hide() });
		
		//linkWithInput
		if(this.linkWithInput) {
			if(this.separateInput) {
				this.element.day.addEvent('keyup',  function() { _class.linkedUpdate() });
				this.element.month.addEvent('keyup',  function() { _class.linkedUpdate() });
				this.element.year.addEvent('keyup',  function() { _class.linkedUpdate() });
			} else {
				this.element.addEvent('keyup',  function() { _class.linkedUpdate() });
			}
		}
		
		this.visible = false;
		this.outsideHide = false;
	},
	
	//Position the picker
	position: function() {
		var top, left;
		
		switch(this.alignX) {
			case 'left':
				left = this.element.getLeft();
				break;
			case 'center':
				var pickerMiddle = this.pickerContent.getStyle('width').toInt() / 2;
				if(pickerMiddle == 0) pickerMiddle = 83;
				left = this.element.getLeft() + (this.element.getSize().x / 2) - pickerMiddle -
						((parseInt(this.pickerContent.getStyle('padding-left')) + parseInt(this.pickerContent.getStyle('padding-right'))) / 2);
				break;
			case 'right': default:
				left = this.element.getLeft() + this.element.getSize().x;
				break;
		}
		
		switch(this.alignY) {
			case 'bottom':
				top = this.getPos(this.element).y + this.element.getSize().y;
				break;
			case 'top': 
				top = this.getPos(this.element).y - parseInt(this.pickerContent.getStyle('height')) - 
					(parseInt(this.pickerContent.getStyle('padding-top')) + parseInt(this.pickerContent.getStyle('padding-bottom')));
				break;
			case 'inputTop': default:
				top = this.getPos(this.element).y;
		}
		
		if(this.isNumber(this.offset.x)) left += this.offset.x;
		if(this.isNumber(this.offset.y)) top += this.offset.y;
		
		this.picker.setStyles({ 'top': top, 'left': left });
	},
	
	show: function() {
		this.position();
		if(!this.visible) {
			this.visible = true;
			var _class = this;
			this.picker.setStyles({ 'opacity': 0, 'display': 'inline' });
			if(Browser.Engine.trident5) this.picker.setStyle('background-color', this.ieTransitionColor); //Ugly transition fix for IE7
			this.picker.set('tween', { onComplete: function() { 
					if(Browser.Engine.trident5) _class.picker.setStyle('background-color', 'transparent');
					_class.outsideHide = true; 
				}, duration: this.toggleDuration }).fade('in');
		}
	},
	
	hide: function() {
		if(this.visible) {
			this.visible = false;
			var _class = this;
			if(Browser.Engine.trident5) this.picker.setStyle('background-color', this.ieTransitionColor); //Ugly transition fix for IE7
			this.picker.set('tween', { onComplete: function() { _class.picker.setStyle('display', 'none'); _class.outsideHide = false; }, duration: this.toggleDuration }).fade('out');
		}
	},
	
	toggle: function() {
		if(this.visible) this.hide();
		else this.show();
	},
	
	pick: function(_date) {
		if(this.leadingZero) {
			if(_date.day < 10)   _date.day = '0' + _date.day;
			if(_date.month < 10) _date.month = '0' + _date.month;
		}
		if(this.twoDigitYear) _date.year = _date.year.toString().substring(2, 4);
		
		if(this.separateInput) {
			if(this.element.day)   this.element.day.set('value', _date.day);
			if(this.element.month) this.element.month.set('value', _date.month);
			if(this.element.year)  this.element.year.set('value', _date.year);
			this.hide();
		} else {
			switch(this.format) {
				case "m/d/y": this.element.set('value', _date.month + this.separator + _date.day + this.separator + _date.year); break;
				case "y/m/d": this.element.set('value', _date.year + this.separator + _date.month + this.separator + _date.day); break;
				case "y/d/m": this.element.set('value', _date.year + this.separator +  _date.day + this.separator + _date.month); break;
				case "d/m/y": default: this.element.set('value', _date.day + this.separator + _date.month + this.separator + _date.year);
			}
			this.hide();
		}
	},
	
	getInputDate: function(_date) {
		var day, month, year;
		
		if(_date) {
			day = _date.day;
			month = _date.month;
			year = _date.year;
		} else if(this.separateInput) {
			day = this.element.day.get('value').toInt();
			month = this.element.month.get('value').toInt();
			year = this.element.year.get('value').toInt();
		} else {
			var date = this.element.get('value').split(this.separator);
			if(date.length != 3) return null;
			switch(this.format) {
				case "m/d/y": day = date[1]; month = date[0]; year = date[2]; break;
				case "y/m/d": day = date[2]; month = date[1]; year = date[0]; break;
				case "y/d/m": day = date[1]; month = date[2]; year = date[0]; break;
				case "d/m/y": default: day = date[0]; month = date[1]; year = date[2];
			}
		}
		
		if( !this.isNumber(day) || !this.isNumber(month) || !this.isNumber(year) ||	day == 0 || month == 0 || year == '0' ||
		    (this.twoDigitYear && year > 99) || (!this.twoDigitYear && year < 1979) || (!this.twoDigitYear && year > 2030) || month > 12 || day > 31 ) return null;
		
		if(this.twoDigitYear && this.isNumber(year) && year < 100) {
			year = year.toInt();
			if(year < 10) year = '200'+  year;
			else if(year < 70) year = '20'+  year;
			else if(year > 69) year = '19'+  year;
			else year = new Date().getFullYear();
		}
		
		return day +'/'+ month +'/'+ year;
	},
	
	//This function is being called on keyup event if linkWithInput is set to true and when a date is picked
	//If the full date is inserted the picker will change itself to that specific date (month view)
	linkedUpdate: function() {
		var _class = this;
		var date = this.getInputDate();
		if(date && this.pickedDate != date) {
			this.u('month', 'gotoPickedDate=1', function() { _class.fade(true) });
			this.pickedDate = date;
		}
	},
	
	outsideClick: function(_event, _element) {
		var mousePos = this.getMousePos(_event);
		var elementData = _element.getCoordinates();
		return (mousePos.x > elementData.left && mousePos.x < (elementData.left + elementData.width)) &&
			   (mousePos.y > elementData.top  && mousePos.y < (elementData.top + elementData.height)) ? false : true;
	},
	
	getMousePos: function(_event) {
		if(document.all) {
			return { 'x': window.event.clientX + window.getScrollLeft(),
					 'y': window.event.clientY + window.getScrollTop() };
		} else {
			return { 'x': _event.page['x'],
					 'y': _event.page['y'] };
		}
	},
	
	isNumber: function(_number) {
		if(_number == '') return false;
		return (_number >= 0) || (_number < 0) ? true : false;
	},
	
	//Retrieving positition funtions (like getCoordinates, getTop etc) don't seem to return correct values in some situations in mootools 1.2; 
	//Opera returns wrong values, IE returns too small values. This function returns the correct coordinates.
	getPos: function(_element) { 
		var x, y = 0;
		if(_element.offsetParent) {
			do {
				x += _element.offsetLeft;
				y += _element.offsetTop;
			} while(_element = _element.offsetParent);
		} else if(_element.x) {
			x += _element.x;
			y += _element.y;
		}
		return { 'x': x, 'y': y };
	}
});
  /****************************************************************************/
 /*   vlaCalendar Clientside v1.0.1 extension for vlaCalendar version 2.1    */
/****************************************************************************/

Date.implement({
	getWeek: function() {
		var oneJan = new Date(this.getFullYear(), 0, 1);
		return Math.ceil((((this - oneJan) / 86400000) + oneJan.getDay()) / 7);
	},
	
	getTs: function() {
		return parseInt((this.getTime() / 1000));
	},
	
	getMonthNo: function() {
		return (this.getMonth() + 1);
	}
});

vlaCalendar.implement({
	//New vars
	'weekDayLabels': ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],
	'monthLabels': ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
	'monthSmallLabels': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
	
	//Replaced functions
	u: function(_url, _pars, _onComplete, _id) {
		if(!this.loading && !this.transitioning) {
			this.loading = true;
			var _class = this;
			var element = $(_id ? _id : this.tempLoader);
			_pars += '&defaultView='+  _url;
			_pars += '&picker='+ (this.picker ? 1 : 0) +'&startMonday='+ (this.startMonday ? 1 : 0) +'&style='+ this.style;
			if(this.picker && this.getInputDate()) _pars += '&pickedDate='+ this.getInputDate();
			element.set('html', this.getHTML(_pars));
			_onComplete();
			this.loading = false;
		}
	},
	
	//New functions
	getHTML: function(args) {
		var pars = {};
		vars = args.split('&').each(function (e) {
			param = e.split('=');
			if(!pars[param[0]]) pars[param[0]] = param[1];
		});
		
		pars.startMonday = pars.startMonday.toInt();
		pars.picker = pars.picker.toInt();
		if(pars.gotoPickedDate) pars.gotoPickedDate = pars.gotoPickedDate.toInt();
		
		var pickedDate = null;
		if($defined(pars.pickedDate)) {
			if(pars.pickedDate == 't') {
				pickedDate = this.mkdate();					
				this.setDate(pickedDate);
			} else {
				match = pars.pickedDate.split('/');
				
				if(match != null) {
					if(match.length > 0) {
						pickedDate = this.mkdate(match[2], match[1] - 1, match[0]);
						if(pickedDate.getMonthNo() != match[1]) {
							pickedDate = this.mkdate(match[2], match[1] - 1, this.daysInMonth(match[2], match[1] - 1));
							this.setDate(pickedDate);
						}
					}
				}
			}
		}
		if(pickedDate == null) pickedDate = this.mkdate();
			
		if($defined(pars.ts)) {
			var date = new Date();
			date.setTime(parseInt(pars.ts) * 1000);
			ts = date.getTs();
		} else {
			ts = this.mktime(pickedDate.getFullYear(), pickedDate.getMonth(), 1);
		}
		
		pars.ts = ts;
		pars['pickedDate'] = pickedDate;
		
		if(pars.defaultView == 'decade') var picker = this.getDecadeHTML(pars);
		else if(pars.defaultView == 'year') var picker = this.getYearHTML(pars);
		else var picker = this.getMonthHTML(pars);
		
		if(!$defined(this.createContainer)) {
			this.createContainer = false;
			div  = '<div class="vlaCalendar'+ ($defined(args.style) ? ' '+ args.style : '') +'">';
				div += '<span class="indication"><div class="arrowRight"></div><div class="arrowLeft"></div>';
					div += '<span class="label" date="';
						div += "{'day': '"+ pickedDate.getDate() +"', 'month': '"+ pickedDate.getMonthNo() +"'";
						div += ", 'year': '"+ pickedDate.getFullYear() +'\'}">&nbsp;';
					div += '</span>';
				div += '</span>';
				div += '<div class="container">';
					div += '<div class="loaderB"></div>';
					div += '<div class="loaderA">'+ picker +'</div>';
				div += '</div>';
			div += '</div>';
			return div;
		} else return picker;
	},

	getMonthHTML: function(args) {
		var ts = this.ts2date(args.ts);
		var ts_year = ts.getFullYear();
		var ts_month = ts.getMonth();
		var ts_month_name = this.monthLabels[ts_month];
		var ts_nrodays = this.daysInMonth(ts.getFullYear(), ts.getMonth());
		
		var pr_date = this.mkdate(ts_year, ts_month-1, 1);
		var nx_date = this.mkdate(ts_year, ts_month+1, 1);
		
		var wdays_counter = ts.getDay() - (args.startMonday ? 1 : 0);
		if(wdays_counter == -1) wdays_counter = 6;
		
		ts = ts.getTs();
		var t = '<table class="month'+ (args.picker ? ' picker' : '') +'" cellpadding="0" summary="{';
			t += "'ts': '"+ ts +"', 'pr_ts': '"+ pr_date.getTs() +"', 'nx_ts': '"+ nx_date.getTs() +"', 'label': '"+ ts_month_name +", "+ ts_year +"'";
			t += ", 'current': 'month', 'parent': 'year'";
		t += '}">';
		t += '<tr>';
		
		if(args.startMonday) {
			var last_day = 6;
		} else {
			t += '<th>'+ this.weekDayLabels[6] +'</th>';
			var last_day = 5;
		}
		for(i = 0; i <= last_day; i++) {
			t += '<th>'+ this.weekDayLabels[i] +'</th>';
		}
		t += '</tr>';
		t += '<tr class="firstRow">';
		
		var row = 0;
		
		//Add days for the beginning non-month days
		for(i = 0; i < wdays_counter; i++) {
			last_day = this.daysInMonth(pr_date.getFullYear(), pr_date.getMonth());
			var day = last_day - (wdays_counter-i) + 1;
			i_date = this.mkdate(ts_year, ts_month-1, day, ts_year);
			t += '<td class="outsideDay" date="'+"{";
			t += "'day': '"+ day +"', 'month': '"+ i_date.getMonthNo() +"', 'year': '"+ i_date.getFullYear() +"'}";
			t += '">'+ day +'</td>';
		}
		
		//Add month days
		var pd_ts = args.pickedDate.getTs();
		for(i = 1; i <= ts_nrodays; i++) {
			i_date = this.mkdate(ts_year, ts_month, i); 
			i_ts = i_date.getTs();
			t += '<td'+ (i_ts == pd_ts ? ' class="selected"' : '');
			t += ' '+"date=\"{'day': '"+ i +"', 'month': '"+ i_date.getMonthNo() +"', 'year': '"+ ts_year +"'}\">";
			t += i; 
			t += '</td>';
			
			if(wdays_counter == 6) {
				// && (i - 1) != ts_nrodays) {
				week_num = i_date.getWeek() + 1;
				t += "</tr><tr>";
				wdays_counter = -1;
				row++;
			}
			wdays_counter++;
		}
		
		//Add outside days
		var a = 1;
		if(wdays_counter !== 0) {
			for(i = wdays_counter; i < 7; i++) {
				i_date = this.mkdate(ts_year, ts_month + 1, a); 
				i_ts = i_date.getTs();
				t += '<td class="outsideDay" date="'+"{'day': '"+ a +"', 'month': '"+ i_date.getMonthNo() +"', 'year': '"+ i_date.getFullYear() +"'}"+'">'+ a +'</td>';
				a++;
			}
			row++;
		}
		
		//Always have 6 rows
		if(row == 4 || row == 5) {
			if(wdays_counter !== 0) { t += "</tr><tr>"; }
			for(i = 0; i < (row == 5 ? 7 : 14); i++) {
				i_date = this.mkdate(ts_year, ts_month + 1, a); 
				t += '<td class="outsideDay" date="'+"{'day': '"+ a +"', 'month': '"+ i_date.getMonthNo() +"', 'year': '"+ i_date.getFullYear() +"'}"+'">'+ a +'</td>';
				a++;
				if(i == 6) { t += "</tr><tr>"; }
			}
		}	
		
		t += '</tr>';
		t += '</table>';
		return t;
	},

	getYearHTML: function(args) {
		var ts = this.ts2date(args.ts);
		if(args.parent == 'month') var m_ts = this.mktime(ts.getFullYear(), ts.getMonth(), 1); //Selected month timestamp
		else var m_ts = '';
		
		var pickedDate = args.pickedDate;
		
		var ts_year	= ts.getFullYear();
		var pr_ts = this.mktime(ts_year-1, 0, 1);
		var nx_ts = this.mktime(ts_year+1, 0, 1);
		
		ts = ts.getTs();
		var t = '<table class="year" cellpadding="0" summary="';
		t += "{'ts': '"+ ts +"', 'pr_ts': '"+ pr_ts +"', 'nx_ts': '"+ nx_ts +"', 'label': '";
			t += ts_year +"', 'current': 'year', 'parent': 'decade'";
		t += '}">';
		
		//Add years
		var m = 0;
		for(i = 0; i < 3; i++) {
			t += "<tr>";
			for(y = 0; y < 4; y++) {
				i_date = this.mkdate(ts_year, m, 1);
				i_ts = i_date.getTs();
				var current = (pickedDate.getMonthNo() == i_date.getMonthNo() && pickedDate.getFullYear() == i_date.getFullYear());
				t += '<td ts="'+ i_ts +'" class="'+ (m_ts == i_ts ? 'selected' : '') + (current ? 'current' : '') +'">'+ this.monthSmallLabels[i_date.getMonth()] +'</td>';
				m++;
			}
			t += "</tr>";
		}
		t += '</table>';
		return t;
	},

	getDecadeHTML: function(args) {
		var ts = this.ts2date(args.ts);
		var ts_year	= parseInt(ts.getFullYear());
		var decade = [ts_year-5, ts_year+5];
		
		var y_ts = this.mktime(ts.getFullYear(), 0, 1); 
		var m_ts = args.m_ts;
		
		var pr_ts = this.mktime(ts_year - 12, 0, 1);
		var nx_ts = this.mktime(ts_year + 12, 0, 1);
		
		var t = '<table class="year" cellpadding="0" summary="{';
		t += "'ts': '"+ ts.getTs() +"', 'pr_ts': '"+ pr_ts +"', 'nx_ts': '"+ nx_ts +"', 'label': '";
		t += (decade[0]) +' - '+ (decade[1]+1) +"', 'current': 'decade'"; 
		t += '}">';
		
		//Add decades
		var year = decade[0];
		for(i = 0; i < 3; i++) {
			t += "<tr>";
			for(y = 0; y < 4; y++) {
				i_ts = this.mktime(year, 0, 1);
				i_date = this.mkdate(year, 0, 1);
				t += '<td ts="'+ i_ts +'" m_ts="'+ m_ts +'" class="'+ (args.parent && y_ts == i_ts ? 'selected' : '') + (args.pickedDate.getFullYear() == i_date.getFullYear() ? 'current' : '') +'">'+ year +'</td>';
				year++;
			}
			t += "</tr>";
		}
		t += '</table>';
		
		return t;
	},
	
	setDate: function(jsdate) {
		this.pick({day: jsdate.getDate(), month: jsdate.getMonthNo(), year: jsdate.getFullYear()});
	},
	
	daysInMonth: function(iYear, iMonth) {
		return 32 - new Date(iYear, iMonth, 32).getDate();
	},

	mkdate: function(year, month, day) {
		var date = new Date();
		if($defined(year)) date.setYear(year);
		if($defined(month)) date.setMonth(month);
		if($defined(day)) date.setDate(day);
		
		date.setHours(0);
		date.setMinutes(0);
		date.setSeconds(0);
		date.setMilliseconds(0);
		return date;
	},

	ts2date: function(ts) {
		var date = new Date();
		date.setTime(parseInt(ts) * 1000);
		return date;
	},

	mktime: function(year, month, day) {
		var date = this.mkdate(year, month, day);
		return date.getTs();
	}
});
var PrimaryPhoneType = new Class({

  initialize: function(regForm, container) {
    this.regForm = $(regForm);
    this.container = $(container);
    this.items = this.container.getElements('.radio-item');
    ['user.phone1', 'user.phone2', 'user.cellPhone' ].each(function(name, i) { 
      var field = this.regForm.getElement('input[name=' + name + ']');
      if (field != null) {
        this.update(field, i);
        field.addEvent('blur', function(e) {
          this.update(field, i);
        }.bindWithEvent(this));
      }
    }, this);
  },

  update: function(field, i) {
    if (field.value) {
      this.items[i].setStyle('display', '');
      this.items[i].getElement('label').innerHTML = field.value;
    } else {
      this.items[i].setStyle('display', 'none');
    }
    var show = this.items.some(function(item) {
      return item.getStyle('display') != 'none';
    });
    this.container.setStyle('display', show ? '' : 'none');
  }

});

var TagCloud = new Class({

  Implements: Options,

  initialize: function(el, options) {
    this.el = $(el);
    this.setOptions(options);
    this.init();
  },

  init: function() {
    this.tagLinks = this.el.getElement('.tags').getElements('a');
    this.tagLinks.each(function(link) {
      link.addEvent('click', this.handleTagClick.bindWithEvent(this, link));
    }, this);
  },

  uninit: function() {
    this.tagLinks.each(function(link) {
      link.removeEvent('click');
    }, this);
    delete this.tagLinks;
    // TODO
    this.el.setStyle('height', '');
  },

  handleTagClick: function(e, link) {
    e.stop();
    this.uninit();
    new Request.HTML( {
      url: CONTEXT_PATH + this.options.url,
      data: Hash.toQueryString({
        async: true,
        uuid: this.options.uuid,
        titlecolor: this.options.titlecolor }) + '&' + link.href.replace(/^.*\?/, ''),
      update: this.el,
      evalScripts: false,
      onComplete: function() {
        this.init();
      }.bind(this)
    }).get();
  }

});

var SearchCompetitions = new Class({

  Implements: Options,

  initialize: function(el, options) {
    this.el = $(el);
    this.setOptions(options);
    this.init();
  },

  init: function() {
    this.form = this.el.getElement('form');
    this.chooseYear = this.form.getElement('select[name=chooseYear]');
    this.chooseCompetition = this.form.getElement('select[name=chooseCompetition]');
    this.button = this.form.getElement('a.button');
    this.chooseYear.addEvent('change', this.handleYearChange.bindWithEvent(this));
    this.chooseCompetition.addEvent('change', this.handleCompetitionChange.bindWithEvent(this));
    this.button.addEvent('click', this.handleButtonClick.bindWithEvent(this));
  },

  uninit: function() {
    this.chooseYear.removeEvent('change');
    this.chooseCompetition.removeEvent('change');
    this.button.removeEvent('click');
    // TODO
    this.el.setStyle('height', '');
  },

  handleYearChange: function(e) {
    e.stop();
    this.updateParagraph(false);
  },

  handleCompetitionChange: function(e) {
    e.stop();
    this.updateParagraph(false);
  },

  handleButtonClick: function(e) {
    e.stop();
    this.updateParagraph(true);
  },

  updateParagraph: function(search) {
    this.uninit();
    new Request.HTML( {
      url: CONTEXT_PATH + this.options.url,
      data: Hash.toQueryString({
        'async': true,
        'uuid': this.options.uuid,
        'search': search }) + '&' + this.form.toQueryString(),
      evalScripts: false,
      onComplete: function() {
        this.init();
      }.bind(this),
      onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
        this.el.set('html', responseHTML);
        this.init();
      }.bind(this)
    }).get();
  }

});

var Spinner = new Class({

  initialize: function() {
    this.el = new Element('div', {
      styles: { display: 'none' }
    }).addClass('spinner').injectInside(document.body);
  },

  show: function(target, rect) {
    var cc = $(target).getCoordinates();
    var r = $extend({ left: 0, top: 0, width: cc.width, height: cc.height }, rect);
    this.el.setStyles({
      left: (cc.left + ((r.width - 32) >> 1) + r.left) + 'px',
      top: (cc.top + ((r.height - 32) >> 1) + r.top) + 'px', display: '' });
    return this;
  },

  hide: function() {
    this.el.setStyle('display', 'none');
    return this;
  },

  destroy: function() {
    this.el.dispose();
    return this;
  }

});

var RacePlayer = new Class({

  Implements: Options,

  initialize: function(el, options) {
    this.el = $(el);
    this.setOptions(options);
    this.init();
  },

  init: function() {
    this.pageLinks = this.el.getElement('.paginatorecorse').getElements('a');
    this.pageLinks.each(function(link) {
      link.addEvent('click', this.handlePageClick.bindWithEvent(this, link));
    }, this);
  },

  uninit: function() {
    this.pageLinks.each(function(link) {
      link.removeEvent('click');
    }, this);
    // TODO
    this.el.setStyle('height', '');
  },

  handlePageClick: function(e, link) {
    e.stop();
    this.uninit();
    var spinner = new Spinner().show(this.el.getElement('.screen'));
    new Request.HTML( {
      url: CONTEXT_PATH + this.options.url,
      data: Hash.toQueryString({
        async: true,
        uuid: this.options.uuid
      }) + '&' + link.href.replace(/^.*\?/, ''),
      update: this.el,
      evalScripts: true,
      onComplete: function() {
        if (spinner) spinner.hide().destroy();
        this.init();
      }.bind(this)
    }).get();
  }

});

var LoadingAnimation = new Class({

  initialize: function(ct, rect) {
    window.addEvent('domready', function() {
      if (!this.load) this.spinner = new Spinner().show(ct, rect);
    });
    window.addEvent('load', function() {
      this.load = true;
      if (this.spinner) this.spinner.hide().destroy();
    });
  }

});

var RacePoll = new Class({

  Implements: Options,

  initialize: function(el, options) {
    this.el = $(el);
    this.setOptions(options);
    this.init();
  },

  init: function() {
    var answers = this.el.getElements('.pollAnswer');
    this.radios = answers.map(function(item) {
      return item.getElement('input[type=radio]');
    });
    this.layers = answers.map(function(item, index) {
      return this.buildLayer(item).addEvent('click', this.handleAnswerClick.bindWithEvent(this, index));
    }, this);
    if (Browser.Engine.trident) {
      this.buttons = [];
      [ 'input[type=submit]', 'input[type=button]' ].each(function(item) {
        var button = this.el.getElement(item);
        if (button) this.buttons.push(this.buildLayer(button).addEvent('click', this.handleButtonClick.bindWithEvent(this, button)));
      }, this);
    }
  },

  uninit: function() {
    this.layers.each(function(item) {
      item.removeEvent('click');
      item.dispose();
    });
    if (Browser.Engine.trident) {
      this.buttons.each(function(item) {
        item.removeEvent('click');
        item.dispose();
      });
    }
  },

  buildLayer: function(el) {
    var coord = el.getCoordinates();
    return new Element('div')
      .setStyles({
        position: 'absolute',
        left: coord.left + 'px',
        top: coord.top + 'px',
        width: coord.width + 'px',
        height: coord.height + 'px'
      })
      .inject(document.body);
  },

  handleAnswerClick: function(e, index) {
    e.stop();
    this.radios[index].checked = !this.radios[index].checked;
  },

  handleButtonClick: function(e, button) {
    e.stop();
    button.click();
  }

});

var Calendario = new Class({

  Implements: Options,

  options: {
    maxDayPrev: 30,
    maxDayNext: 30
  },

  initialize: function(el, options){
    this.setOptions(options);
    this.el = $(el);
    this.el._control = this;
    this.el.getElements('a.day').each(function(link){
      link.addEvent('click', this.handleDayClick.bindWithEvent(this, link));
    }, this);
    this.maxDay = [ this.options.maxDayPrev, this.options.maxDayNext ];
    this.el.addEvent('daySelected', this.handleDaySelected.bind(this));
  },

  handleDayClick: function(e, link){
    e.stop();
    var day = link.className.replace(/^.*\sday-([^\s]*).*$/, '$1');
    var m = link.className.match(/\sfDate-([^\s]*)/);
    var fDate = m ? m[1] : null;
    var em = this.el.getElement('em.day');
    em.getPrevious().setStyle('display', '');
    link.setStyle('display', 'none');
    em.innerHTML = link.innerHTML;
    em.className = link.className;
    em.inject(link, 'after');
    this.el.fireEvent('daySelected', [day, fDate]);
  },

  handleDaySelected: function(day){
    this.el.getElement('p.nav').getElements('a').each(function(link, index){
      link.href = link.href.replace(/^.*(\?date=\d\d\d\d-\d\d-)\d\d(.*)$/, '$1' + Math.min(day, this.maxDay[index]) + '$2');
    }, this);
  },

  getCurrent: function(){
    var c = this.el.getElement('em.day').getPrevious().className;
    var day = c.replace(/^.*\sday-([^\s]*).*$/, '$1');
    var m = c.match(/\sfDate-([^\s]*)/);
    var fDate = m ? m[1] : null;
    return [ day, fDate ];
  }

});

var RichMediaAgenda = new Class({

  Implements: Options,

  initialize: function(el, searchResultsLink, monthYear, day, dateFormatted, options) {
    this.el = $(el);
    this.el._control = this;
    this.searchResultsLink = searchResultsLink;
    this.monthYear = monthYear;
    this.setOptions(options);
    this.init();
  },

  init: function() {
    this.collapsed = this.el.getElement('.collapsed');
    this.expanded = this.el.getElement('.expanded');
    this.collapsed.getElement('a.heading').addEvent('click', this.handleCollapse.bindWithEvent(this));
    this.expanded.getElement('a.heading').addEvent('click', this.handleExpand.bindWithEvent(this));

    this.calendario = this.el.getElement('.calendario').addEvent('daySelected', this.handleDaySelected.bind(this));
    [ 'a.prevMonth', 'a.nextMonth' ].each(function(sel) {
      var link = this.calendario.getElement(sel);
      link.addEvent('click', this.handleMonthClick.bindWithEvent(this, link));
    }, this);

    var c = this.calendario._control.getCurrent();
    this.day = c[0];
    this.dateFormatted = c[1];
    this.handleDaySelected(this.day, this.dateFormatted);
  },

  uninit: function() {
    this.collapsed.getElement('a.heading').removeEvent('click');
    this.expanded.getElement('a.heading').removeEvent('click');
    [ 'a.prevMonth', 'a.nextMonth' ].each(function(sel) {
      this.calendario.getElement(sel).removeEvent('click');
    }, this);
  },

  handleCollapse: function(e) {
    e.stop();
    this.collapsed.setStyle('display', 'none');
    this.expanded.setStyle('display', '');
  },

  handleExpand: function(e) {
    e.stop();
    this.expanded.setStyle('display', 'none');
    this.collapsed.setStyle('display', '');
  },

  handleDaySelected: function(day, dateFormatted) {
    var date = this.monthYear + '-' + day;
    var div = this.calendario.getParent();
    var noEventsEl = div.getElement('.no-events');
    var showAllEl = div.getElement('.show-all');
    var newsEl = div.getElement('.news');
  
    $$('.box-news').setStyle('display','none');
    if (noEventsEl) noEventsEl.setStyle('display', '');
    if (showAllEl) showAllEl.setStyle('display', 'none');
  
    var news = div.getElements('.box-news');
    var showAll = false;
    if($$(".box-news input[value='"+ date +"']").length >= $('maxNews').get('value')) {
      showAll = true;
      $('linkShowAll').set('href', CONTEXT_PATH + this.searchResultsLink + '.html?search=true&datainizio='+date+'&datafine='+date)
    } else {
      news.each(function(box) {
        box.setStyle('display', box.getElement('input[name=date]').value == date ? '' : 'none');
      });
    }
    var h4 = div.getElement('span.heading');
    if (h4) h4.set('text', h4.get('text').replace(this.dateFormatted, dateFormatted));
    this.dateFormatted = dateFormatted;
  
    var show = news.some(function(box) {
      return box.getStyle('display') != 'none';
    }) || showAll;
    // console.log(show);
    if (h4) h4.setStyle('display', show ? '' : 'none');
    if (newsEl) newsEl.setStyle('display', show || showAll? '' : 'none');
    if (noEventsEl) noEventsEl.setStyle('display', show ? 'none' : '');
    if (showAllEl) showAllEl.setStyle('display', showAll ? '' : 'none');
  },

  handleMonthClick: function(e, link) {
    e.stop();
    this.uninit();
    var spinner = new Spinner().show(this.el);
    new Request.HTML( {
      url: CONTEXT_PATH + this.options.url,
      data: Hash.toQueryString({
        async: true,
        uuid: this.options.uuid
      }) + '&' + link.href.replace(/^.*\?/, ''),
      update: this.expanded,
      evalScripts: true,
      onComplete: function() {
        if (spinner) spinner.hide().destroy();
        this.init();
      }.bind(this)
    }).get();
  }

});
var viewer=new Class({mode:'rand',modes:['top','right','bottom','left','alpha'],sizes:{w:480,h:240},fxOptions:{duration:500},interval:5000,initialize:function(a,b){if(b)for(var o in b)this[o]=b[o];if(this.buttons){this.buttons.previous.addEvent('click',this.previous.bind(this,[true]));this.buttons.next.addEvent('click',this.next.bind(this,[true]))}this._current=0;this._previous=null;this.items=a.setStyle('display','none');this.items[this._current].setStyle('display','block');this.disabled=false;this.attrs={left:['left',-this.sizes.w,0,'px'],top:['top',-this.sizes.h,0,'px'],right:['left',this.sizes.w,0,'px'],bottom:['top',this.sizes.h,0,'px'],alpha:['opacity',0,1,'']};this.rand=this.mode=='rand';this.sequence=typeof(this.mode)=='object'?this.mode:false;this.curseq=0;this.timer=null},walk:function(n,b){if(this._current!==n&&!this.disabled){this.disabled=true;if(b){this.stop()}if(this.rand){this.mode=this.modes.getRandom()}else if(this.sequence){this.mode=this.sequence[this.curseq];this.curseq+=this.curseq+1<this.sequence.length?1:-this.curseq}this._previous=this._current;this._current=n;var a=this.attrs[this.mode].associate(['p','f','t','u']);for(var i=0;i<this.items.length;i++){if(this._current===i){this.items[i].setStyles($extend({'display':'block','z-index':'2'},JSON.decode('{"'+a.p+'":"'+a.f+a.u+'"}')))}else if(this._previous===i){this.items[i].setStyles({'z-index':'1'})}else{this.items[i].setStyles({'display':'none','z-index':'0'})}}this.items[n].set('tween',$merge(this.fxOptions,{onComplete:this.onComplete.bind(this)})).tween(a.p,a.f,a.t)}},play:function(a){this.stop();if(!a){this.next()}this.timer=this.next.periodical(this.interval,this,[false])},stop:function(){$clear(this.timer)},next:function(a){this.walk(this._current+1<this.items.length?this._current+1:0,a)},previous:function(a){this.walk(this._current>0?this._current-1:this.items.length-1,a)},onComplete:function(){this.disabled=false;this.items[this._previous].setStyle('display','none');if(this.onWalk)this.onWalk(this._current)}});
