//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 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;}}); //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);}});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 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 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 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);}}); /*******************************   ScrollBar   *******************************
	Vertical and Horizontal
	Scrollbars with Arrows
	http://greghoustondesign.com/examples/mootools/scrollbars/
******************************************************************************/
var ScrollBar = new Class({

		Implements: [Events, Options],

		options: {
			frecuencia: 40,
			barWidth: 15,
			minThumbSize: 15,
			wheel: 8,
			arrows: false,
			autoSlide: false,
			autoThumbSize: true,
			client_x: 0,
			client_y: 0,
			hScroll: true // horizontal scrollbar
		},

		initialize: function(id_contenedor, arr_opciones){ /* id_contenedor, arr_opciones */
			this.setOptions(arr_opciones);
			this.main = $(id_contenedor);
			this.content = this.main.getElement('.contentScrollbar');
			
			if(this.options.arrows == true)	{ this.arrowOffset = this.options.barWidth + this.options.barWidth;	} else { this.arrowOffset = 0;		}
			if(this.options.hScroll == true){ this.hScrollOffset = this.options.barWidth;						} else { this.hScrollOffset = 0;	}
			
			/* barra de scroll vertical */
			this.vScrollbar = this.main.getElement('.vScrollbar');
			if( ! this.vScrollbar )		{ this.vScrollbar	= new Element('div', { 'class': 'vScrollbar' }).injectAfter(this.content);		}
			
			/* boton up */
			if(this.options.arrows == true){
				this.arrowUp = this.main.getElement('.arrowUp');
				if( ! this.arrowUp )	{ this.arrowUp		= new Element('div', { 'class': 'arrowUp' }).injectInside(this.vScrollbar);		}
			}
			
			/* carril de la barra de scroll vertical */
			this.vTrack = this.main.getElement('.vTrack');
			if( ! this.vTrack )			{ this.vTrack		= new Element('div', { 'class': 'vTrack' }).injectInside(this.vScrollbar);		}
			
			/* pivote de la barra de scroll vertical */
			this.vThumb = this.main.getElement('.vThumb');
			if( ! this.vThumb )			{ this.vThumb		= new Element('div', { 'class': 'vThumb' }).injectInside(this.vTrack);			}
			
			/* boton down */
			if(this.options.arrows == true){				
				this.arrowDown = this.main.getElement('.arrowDown');
				if( ! this.arrowDown )	{ this.arrowDown	= new Element('div', { 'class': 'arrowDown' }).injectInside(this.vScrollbar);	}
			}
			
			/* barra de scroll horizontal */
			if(this.options.hScroll == true){
				this.hScrollbar = this.main.getElement('.hScrollbar');
				if( ! this.hScrollbar )	{ this.hScrollbar	= new Element('div', { 'class': 'hScrollbar' }).injectAfter(this.vScrollbar);	}
			}
			
			/* boton left */
			if(this.options.arrows == true){				
				this.arrowLeft = this.main.getElement('.arrowLeft');
				if( ! this.arrowLeft )	{ this.arrowLeft	= new Element('div', { 'class': 'arrowLeft' }).injectInside(this.hScrollbar);	}
			}
			
			/* carril de la barra de scroll horizontal */
			if(this.options.hScroll == true){
				this.hTrack = this.main.getElement('.hTrack');
				if( ! this.hTrack )			{ this.hTrack		= new Element('div', { 'class': 'hTrack' }).injectInside(this.hScrollbar);		}
			}
			
			/* pivote de la barra de scroll horizontal */
			if(this.options.hScroll == true){
				this.hThumb = this.main.getElement('.hThumb');
				if( ! this.hThumb )			{ this.hThumb		= new Element('div', { 'class': 'hThumb' }).injectInside(this.hTrack);			}
			}
			
			/* boton right */
			if (this.options.arrows == true){
				this.arrowRight = this.main.getElement('.arrowRight');
				if( ! this.arrowRight )	{ this.arrowRight	= new Element('div', { 'class': 'arrowRight' }).injectInside(this.hScrollbar);	}
			}
			
			/* esquina inferior derecha (espacio entre las barras vertical y horizontal) */
			if(this.options.hScroll == true){
				this.corner = this.main.getElement('.corner');
				if( ! this.corner )			{ this.corner		= new Element('div', { 'class': 'corner' }).injectAfter(this.hScrollbar);		}
			}
			
			this.bound = {
				'vStart': this.vStart.bind(this),
				'hStart': this.hStart.bind(this),				
				'end': this.end.bind(this),
				'vDrag': this.vDrag.bind(this),
				'hDrag': this.hDrag.bind(this),				
				'wheel': this.wheel.bind(this),
				'vPage': this.vPage.bind(this),
				'hPage': this.hPage.bind(this)				
			};
			
			this.vPosition = {};
			this.hPosition = {};			
			this.vMouse = {};
			this.hMouse = {};			
			this.update();
			this.attach();
		},

		update: function(){
		    
			if(this.options.autoThumbSize == true) {
				this.vTrack.setStyle('height', this.content.offsetHeight - this.arrowOffset);
				if(this.options.hScroll == true){
					this.hTrack.setStyle('width', this.content.offsetWidth - this.arrowOffset);
				}
			} else {
				this.arrowOffset = this.content.offsetHeight - this.vTrack.offsetHeight;
			}
			
			// Remove and replace vertical scrollbar
			if (this.content.scrollHeight <= this.content.offsetHeight) { /* si NO es necesaria la barra vertical */
				this.vScrollbar.setStyle('display', 'none');
			} else { /* si SI es necesaria la barra vertical */
				this.vScrollbar.setStyle('display', 'block');
			}
			
			
			if (this.options.hScroll == true){
			
				// Remove and replace horizontal scrollbar
				if (this.content.scrollWidth <= this.content.offsetWidth) { /* si NO es necesaria la barra horizontal */
					this.hScrollbar.setStyle('display', 'none');
				} else { /* si SI es necesaria la barra horizontal */
					this.hScrollbar.setStyle('display', 'block');
				}
				
				// Remove and replace bottom right corner spacer			
				if (this.content.scrollHeight <= this.content.offsetHeight || this.content.scrollWidth <= this.content.offsetWidth) {
					this.corner.setStyle('display', 'none');
				} else {
					this.corner.setStyle('display', 'block');			
				}
			
				// Horizontal

				this.hContentSize = this.content.offsetWidth;
				this.hContentScrollSize = this.content.scrollWidth;
				this.hTrackSize = this.hTrack.offsetWidth;

				this.hContentRatio = this.hContentSize / this.hContentScrollSize;

				this.hScrollRatio = this.hContentScrollSize / this.hTrackSize;
				if(this.options.autoThumbSize == true) {
					this.hThumbSize = (this.hTrackSize * this.hContentRatio).limit(this.options.minThumbSize, this.hTrackSize);
					//this.hThumb.setStyle('width', this.hThumbSize); ***********Daba problemas con IE6************
				} else {
					this.hThumbSize = this.hThumb.offsetWidth;
				}

				this.hUpdateThumbFromContentScroll();
				this.hUpdateContentFromThumbPosition();			

			} else {
					this.hScrollbar.setStyle('display', 'none');
					this.corner.setStyle('display', 'none');										
			}
			

			// Vertical
			
			this.vContentSize = this.content.offsetHeight;
			this.vContentScrollSize = this.content.scrollHeight;
			this.vTrackSize = this.vTrack.offsetHeight;

			this.vContentRatio = this.vContentSize / this.vContentScrollSize;
			this.vScrollRatio = this.vContentScrollSize / this.vTrackSize;
			
			if(this.options.autoThumbSize == true) {
				this.vThumbSize = (this.vTrackSize * this.vContentRatio).limit(this.options.minThumbSize, this.vTrackSize);
				this.vThumb.setStyle('height', this.vThumbSize);
			} else {
				this.vThumbSize = this.vThumb.offsetHeight;
				this.vScrollRatio -= 1; // esto esta mal hay que calcularlo !!!!
			}

			this.vUpdateThumbFromContentScroll();
			this.vUpdateContentFromThumbPosition();
			
		},

		vUpdateContentFromThumbPosition: function(){
			this.content.scrollTop = this.vPosition.now * this.vScrollRatio;
		},
		
		hUpdateContentFromThumbPosition: function(){
			this.content.scrollLeft = this.hPosition.now * this.hScrollRatio;
		},

		vUpdateThumbFromContentScroll: function(){
			this.vPosition.now = (this.content.scrollTop / this.vScrollRatio).limit(0, (this.vTrackSize - this.vThumbSize));
			this.vThumb.setStyle('top', this.vPosition.now);
		},
		
		hUpdateThumbFromContentScroll: function(){
			this.hPosition.now = (this.content.scrollLeft / this.hScrollRatio).limit(0, (this.hTrackSize - this.hThumbSize));
			this.hThumb.setStyle('left', this.hPosition.now);
		},

		attach: function(){
			this.vThumb.addEvent('mousedown', this.bound.vStart);
			if (this.options.wheel) this.content.addEvent('mousewheel', this.bound.wheel);
			this.vTrack.addEvent('mouseup', this.bound.vPage);
			
			this.hThumb.addEvent('mousedown', this.bound.hStart);
			this.hTrack.addEvent('mouseup', this.bound.hPage);
			
			if(this.options.autoSlide == true){
				this.content.addEvent('mouseover', function(event){
					this.options.client_x_max = Math.round(this.content.offsetWidth / 2);
					this.options.client_x = this.content.getPosition().x + this.content.scrollLeft + this.options.client_x_max - event.client.x;
					if( this.options.client_x > this.options.client_x_max ) { this.options.client_x = this.options.client_x_max; }
					else if( this.options.client_x < -this.options.client_x_max ) { this.options.client_x = -this.options.client_x_max; }
					this.options.client_y_max = Math.round(this.content.offsetHeight / 2);
					this.options.client_y = this.content.getPosition().y + this.content.scrollTop + this.options.client_y_max - event.client.y;
					if( this.options.client_y > this.options.client_y_max ) { this.options.client_y = this.options.client_y_max; }
					else if( this.options.client_y < -this.options.client_y_max ) { this.options.client_y = -this.options.client_y_max; }
					$clear(this.interval);
					this.interval = (function(event){
						this.content.scrollLeft	-= Math.round( this.options.wheel * this.options.client_x / this.options.client_x_max );
						this.content.scrollTop	-= Math.round( this.options.wheel * this.options.client_y / this.options.client_y_max );
						this.vUpdateThumbFromContentScroll();
						if (this.options.hScroll == true){ this.hUpdateThumbFromContentScroll(); }
					}.bind(this).periodical(this.options.frecuencia));
				}.bind(this));
			
				this.content.addEvent('mouseout', function(event){
					$clear(this.interval);
				}.bind(this));
			
				this.content.addEvent('mouseenter', function(event){
					this.options.client_x_max = Math.round(this.content.offsetWidth / 2);
					this.options.client_x = this.content.getPosition().x + this.content.scrollLeft + this.options.client_x_max - event.client.x;
					if( this.options.client_x > this.options.client_x_max ) { this.options.client_x = this.options.client_x_max; }
					else if( this.options.client_x < -this.options.client_x_max ) { this.options.client_x = -this.options.client_x_max; }
					this.options.client_y_max = Math.round(this.content.offsetHeight / 2);
					this.options.client_y = this.content.getPosition().y + this.content.scrollTop + this.options.client_y_max - event.client.y;
					if( this.options.client_y > this.options.client_y_max ) { this.options.client_y = this.options.client_y_max; }
					else if( this.options.client_y < -this.options.client_y_max ) { this.options.client_y = -this.options.client_y_max; }
					$clear(this.interval);
					this.interval = (function(event){
						this.content.scrollLeft	-= Math.round( this.options.wheel * this.options.client_x / this.options.client_x_max );
						this.content.scrollTop	-= Math.round( this.options.wheel * this.options.client_y / this.options.client_y_max );
						this.vUpdateThumbFromContentScroll();
						if (this.options.hScroll == true){ this.hUpdateThumbFromContentScroll(); }
					}.bind(this).periodical(this.options.frecuencia));
				}.bind(this));
			
				this.content.addEvent('mouseleave', function(event){
					$clear(this.interval);
				}.bind(this));
			}		
			
			if (this.options.arrows == true){
				this.arrowUp.addEvent('mousedown', function(event){
						this.interval = (function(event){
						this.content.scrollTop -= this.options.wheel;
						this.vUpdateThumbFromContentScroll();
					}.bind(this).periodical(this.options.frecuencia))
				}.bind(this));
			
				this.arrowUp.addEvent('mouseup', function(event){
					$clear(this.interval);
				}.bind(this));
			
				this.arrowUp.addEvent('mouseout', function(event){
					$clear(this.interval);
				}.bind(this));
						
				this.arrowDown.addEvent('mousedown', function(event){
						this.interval = (function(event){
						this.content.scrollTop += this.options.wheel;
						this.vUpdateThumbFromContentScroll();
					}.bind(this).periodical(this.options.frecuencia))
				}.bind(this));
			
				this.arrowDown.addEvent('mouseup', function(event){
					$clear(this.interval);
				}.bind(this));
			
				this.arrowDown.addEvent('mouseout', function(event){
					$clear(this.interval);
				}.bind(this));
				if(this.options.hScroll == true){
					this.arrowLeft.addEvent('mousedown', function(event){
							this.interval = (function(event){
							this.content.scrollLeft -= this.options.wheel;
							this.hUpdateThumbFromContentScroll();
						}.bind(this).periodical(this.options.frecuencia))
					}.bind(this));
				
					this.arrowLeft.addEvent('mouseup', function(event){
						$clear(this.interval);
					}.bind(this));
				
					this.arrowLeft.addEvent('mouseout', function(event){
						$clear(this.interval);
					}.bind(this));
				
					this.arrowRight.addEvent('mousedown', function(event){
							this.interval = (function(event){
							this.content.scrollLeft += this.options.wheel;
							this.hUpdateThumbFromContentScroll();
						}.bind(this).periodical(this.options.frecuencia))
					}.bind(this));
				
					this.arrowRight.addEvent('mouseup', function(event){
						$clear(this.interval);
					}.bind(this));
				
					this.arrowRight.addEvent('mouseout', function(event){
						$clear(this.interval);
					}.bind(this));
				}
			}			
						
		},
		
		wheel: function(event){
			if(this.options.autoSlide == false) {
				this.content.scrollTop -= event.wheel * this.options.wheel;
				this.vUpdateThumbFromContentScroll();
				event.stop();
			}
		},

		vPage: function(event){
			if (event.page.y > this.vThumb.getPosition().y) this.content.scrollTop += this.content.offsetHeight;
			else this.content.scrollTop -= this.content.offsetHeight;
			this.vUpdateThumbFromContentScroll();
			event.stop();
		},
		
		hPage: function(event){
			if (event.page.x > this.hThumb.getPosition().x) this.content.scrollLeft += this.content.offsetWidth;
			else this.content.scrollLeft -= this.content.offsetWidth;
			this.hUpdateThumbFromContentScroll();
			event.stop();
		},		

		vStart: function(event){
			this.vMouse.start = event.page.y;
			this.vPosition.start = this.vThumb.getStyle('top').toInt();
			document.addEvent('mousemove', this.bound.vDrag);
			document.addEvent('mouseup', this.bound.end);
			this.vThumb.addEvent('mouseup', this.bound.end);
			event.stop();
		},
		
		hStart: function(event){
			this.hMouse.start = event.page.x;		
			this.hPosition.start = this.hThumb.getStyle('left').toInt();
			document.addEvent('mousemove', this.bound.hDrag);
			document.addEvent('mouseup', this.bound.end);
			this.hThumb.addEvent('mouseup', this.bound.end);
			event.stop();
		},		

		end: function(event){
			document.removeEvent('mousemove', this.bound.vDrag);
			document.removeEvent('mousemove', this.bound.hDrag);			
			document.removeEvent('mouseup', this.bound.end);
			this.vThumb.removeEvent('mouseup', this.bound.end);
			this.hThumb.removeEvent('mouseup', this.bound.end);			
			event.stop();
		},

		vDrag: function(event){
			this.vMouse.now = event.page.y;
			this.vPosition.now = (this.vPosition.start + (this.vMouse.now - this.vMouse.start)).limit(0, (this.vTrackSize - this.vThumbSize));
			this.vUpdateContentFromThumbPosition();
			this.vUpdateThumbFromContentScroll();
			event.stop();
		},
		
		hDrag: function(event){
			this.hMouse.now = event.page.x;
			this.hPosition.now = (this.hPosition.start + (this.hMouse.now - this.hMouse.start)).limit(0, (this.hTrackSize - this.hThumbSize));
			this.hUpdateContentFromThumbPosition();
			this.hUpdateThumbFromContentScroll();
			event.stop();
		}		

	});

/** function prepara_scroll(id_contenedor)
 * si queremos hacer un scroll con o sin barra los requisitos son:
		1) El scroll estara formado por dos capas:
			a) La capa contenedora que tiene un ancho y alto concreto y position:relative o absolute (como queramos)
					Ademas tendra overflow:hidden
					La capa contededora debe tener el className 'scroller_undanet' y el id que queramos (por ejemplo 'myid').
			b) La capa que tiene el contenido que tendra un ancho fijo y el alto dependera de su contenido
					Su position debe ser absolute.
					La capa de contenido debe tener el className 'Scroller-Container' y el id debe ser el de la contenedora
					con '_contenido' (por ejemplo 'myid_contenido').
		2) Si ademas queremos que tenga barra de scroll tendremos una capa con el id de la capa contenedora del scroll
					seguido de '_barra' (por ejemplo 'myid_barra').
					esta capa tendra los botones de subir y bajar (si no se quieren poner no son obligatorios) y la capa
					que determina el carril de scroll, dentro de esta capa de carril estara la capa que determina la pieza que
					podremos mover por el carril para desplazar el scroll. Siguiendo el ejemplo tendriamos:
						<div id="myid_barra">
							<a href="javascript:;" class="Scrollbar-Up"></a>
							<div class="Scrollbar-Track">
								<a href="javascript:;" class="Scrollbar-Handle"></a>
							</div>
							<a href="javascript:;" class="Scrollbar-Down"></a>
						</div>
					como se puede ver es obligatorio que los className de los componentes que forman la barra de scroll sean
					los del ejemplo ('Scrollbar-Up', 'Scrollbar-Track', 'Scrollbar-Handle', 'Scrollbar-Down') aun así
					podemos incluir otros estilos css para darle el aspecto visual deseado.
**/
var arr_scr = new Object();
function prepara_scroll(id_contenedor) {
	$ES('.Scrollbar',id_contenedor).each( function(scroller) {
		var scr = new ScrollBar(scroller.id, {
			autoSlide: scroller.hasClass('autoSlide'), // para que se desplace en base a la posicion del raton (mouseover)
			arrows: scroller.hasClass('arrows'), // si el scroll tiene botones de subir y bajar
			autoThumbSize: scroller.hasClass('autoThumbSize') // para que ajuste el tamaño del "pivote" en base a la proporcion visible
		} );
		arr_scr[scroller.id] = scr;
	} );
}

function update_scroll(id_contenedor) {
	$ES('.Scrollbar',id_contenedor).each( function(scroller) {
		var scr = arr_scr[scroller.id];
		scr.update();
	} );
} /**
 * 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; /*
Script: SexyAlertBox.js
  http://www.coders.me/web-js-html/javascript/sexy-alert-box
  
Version:
  1.1

Author: 
  Eduardo D. Sada 
  http://www.coders.me

License:
	MIT license.

Based in <PBBAcpBox> (Pokemon_JOJO, <http://www.mibhouse.org/pokemon_jojo>)

Features:
  Mootools 1.2 100% Compatible
  Chain Implemented (Cola de mensajes)
  More styles (info, error, alert, prompt, confirm)

*/

/*
Class: SexyAlertBox
	Clone class of original javascript function : 'alert', 'confirm' and 'prompt'

Arguments:
	options - see Options below

Options:
	name - name of the box for use different style
	zIndex - integer, zindex of the box
	onReturn - return value when box is closed. defaults to false
	onReturnFunction - a function to fire when return box value
	BoxStyles - stylesheets of the box
	OverlayStyles - stylesheets of overlay
	showDuration - duration of the box transition when showing (defaults to 200 ms)
	showEffect - transitions, to be used when showing
	closeDuration - Duration of the box transition when closing (defaults to 100 ms)
	closeEffect - transitions, to be used when closing
	onShowStart - a function to fire when box start to showing
	onCloseStart - a function to fire when box start to closing
	onShowComplete - a function to fire when box done showing
	onCloseComplete - a function to fire when box done closing
*/

var SexyAlertBox = new Class({
  Implements: [Chain],

	getOptions: function(){
		return {
			name: 'SexyAlertBox',
			zIndex: 65555,
			onReturn: false,
			onReturnFunction : $empty,
			BoxStyles: {
				'width': 500
			},
			OverlayStyles: {
				'background-color': '#000',
				'opacity': 0.7
			},
			showDuration: 200,
			showEffect: Fx.Transitions.linear,
      closeDuration: 100,
			closeEffect: Fx.Transitions.linear,
			moveDuration: 500,
			moveEffect: Fx.Transitions.Back.easeOut,
			onShowStart : $empty,
			onShowComplete : $empty,
			onCloseStart : $empty,
			onCloseComplete : function(properties) {
				this.options.onReturnFunction(this.options.onReturn);
			}.bind(this)
		};
	},

	initialize: function(options){
    this.i=0;
    
		this.setOptions(this.getOptions(), options);

		this.Overlay = new Element('div', {
			'id': 'BoxOverlay',
			'styles': {
				'display': 'none',
				'z-index': this.options.zIndex,
				'position': 'absolute',
				'top': '0',
				'left': '0',
				'background-color': this.options.OverlayStyles['background-color'],
				'opacity': 0,
				'height': window.getScrollHeight() + 'px',
				
				'width': window.getScrollWidth() + 'px'
			}
		});

		this.Content = new Element('div', {
			'id': this.options.name + '-BoxContenedor'
		});

    this.Contenedor = new Element('div', {
      'id': this.options.name + '-BoxContent'
    }).adopt(this.Content);

		this.InBox = new Element('div', {
			'id': this.options.name + '-InBox'
		}).adopt(this.Contenedor);;
		
		this.Box = new Element('div', {
			'id': this.options.name + '-Box',
			'styles': {
				'display': 'none',
				'z-index': this.options.zIndex + 2,
				'position': 'absolute',
				'top': '0',
				'left': '0',
				'width': this.options.BoxStyles['width'] + 'px'
			}
		}).adopt(this.InBox);

    this.Overlay.injectInside(document.body);
    this.Box.injectInside(document.body);

    this.preloadImages();
    
		window.addEvent('resize', function() {
			if(this.options.display == 1) {
				this.Overlay.setStyles({
					'height': window.getScrollHeight() + 'px',
					'width': window.getScrollWidth() + 'px'
				});
				this.replaceBox();
			}
		}.bind(this));
		
		window.addEvent('scroll', this.replaceBox.bind(this));
	},

  preloadImages: function() {
    var img = new Array(2);
    img[0] = new Image();img[1] = new Image();img[2] = new Image();
    img[0].src = this.Box.getStyle('background-image').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
    img[1].src = this.InBox.getStyle('background-image').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
    img[2].src = this.Contenedor.getStyle('background-image').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
  },


	/*
	Property: display
		Show or close box
		
	Argument:
		option - integer, 1 to Show box and 0 to close box (with a transition).
	*/	
	display: function(option){
		if(this.Transition)
			this.Transition.cancel();				

		// Show Box	
		if(this.options.display == 0 && option != 0 || option == 1) {

      if(Browser.Engine.trident4)
        $$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'hidden' });

			this.Overlay.setStyle('display', 'block');
			this.options.display = 1;
			this.fireEvent('onShowStart', [this.Overlay]);

			this.Transition = new Fx.Tween(this.Overlay,
				{
          property: 'opacity',
					duration: this.options.showDuration,
					transition: this.options.showEffect,
					onComplete: function() {

						sizes = window.getSize();
						scrollito = window.getScroll();
						this.Box.setStyles({
							'display': 'block',
							'left': (scrollito.x + (sizes.x - this.options.BoxStyles['width']) / 2).toInt()
						});

						this.replaceBox();
						this.fireEvent('onShowComplete', [this.Overlay]);

					}.bind(this)
				}
			).start(this.options.OverlayStyles['opacity']);

		}
		// Close Box
		else {

      if(Browser.Engine.trident4)
        $$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'visible' });

      this.queue.delay(500,this);

			this.Box.setStyles({
				'display': 'none',
				'top': 0
			});
			this.Content.empty();
			this.options.display = 0;

			this.fireEvent('onCloseStart', [this.Overlay]);

      if(this.i==1) {
        this.Transition = new Fx.Tween(this.Overlay,
          {
            property: 'opacity',
            duration: this.options.closeDuration,
            transition: this.options.closeEffect,
            onComplete: function() {
                this.fireEvent('onCloseComplete', [this.Overlay]);
            }.bind(this)
          }
        ).start(0);
      }

		}			
	},

	/*
	Property: replaceBox
		Move Box in screen center when brower is resize or scroll
	*/
	replaceBox: function() {
		if(this.options.display == 1) {
			sizes = window.getSize();
      scrollito = window.getScroll();

			if(this.MoveBox)
				this.MoveBox.cancel();
			
			this.MoveBox = new Fx.Morph(this.Box, {
				duration: this.options.moveDuration,
				transition: this.options.moveEffect
			}).start({

				'left': (scrollito.x + (sizes.x - this.options.BoxStyles['width']) / 2).toInt(),
				'top': (scrollito.y + (sizes.y - this.Box.offsetHeight) / 2).toInt()

			});

		}
	},


	queue: function() {
		this.i--;
		this.callChain();
	},


	/*
	Property: messageBox
		Core system for show all type of box
		
	Argument:
		type - string, 'alert' or 'confirm' or 'prompt'
		message - text to show in the box
		properties - see Options below
		input - text value of default 'input' when prompt
		
	Options:
		textBoxBtnOk - text value of 'Ok' button
		textBoxBtnCancel - text value of 'Cancel' button
		onComplete - a function to fire when return box value
	*/	
	messageBox: function(type, message, properties, input) {

		this.chain(function () {

      properties = $extend({
        'textBoxBtnOk': 'OK',
        'textBoxBtnCancel': 'Cancelar',
        'textBoxInputPrompt': null,
        'password': false,
        'onComplete': $empty
      }, properties || {});


      this.options.onReturnFunction = properties.onComplete;

      this.ContenedorBotones = new Element('div', {
        'id': this.options.name + '-Buttons'
      });
      

		
      if(type == 'alert' || type == 'info' || type == 'error' || type == 'ok' || type == 'carrito_ok' || type == 'carrito_ko')
      {

		  this.AlertBtnOk = new Element('input', {
            'id': 'BoxAlertBtnOk',
            'type': 'submit',
            'value': properties.textBoxBtnOk,
            'styles': {
              'width': '70px'
            }
          });

		  /*this.AlertBtnOk = new Element('div', {
            'id': 'BoxAlertBtnOk',
            'class': 'BoxsexyOk',
            'html': properties.textBoxBtnOk
          });*/
          
          this.AlertBtnOk.addEvent('click', function() {
            this.options.onReturn = true;
            this.display(0);
          }.bind(this));
        
          if(type == 'alert')
            this.clase = 'BoxAlert';
          else if(type == 'error')
            this.clase = 'BoxError';
          else if(type == 'info')
            this.clase = 'BoxInfo';
          else if(type == 'ok')
            this.clase = 'BoxOk';
          else if(type == 'carrito_ok')
            this.clase = 'BoxCartOk';
          else if(type == 'carrito_ko')
            this.clase = 'BoxCartKo';
        
          this.Content.setProperty('class',this.clase).set('html',message);

          this.AlertBtnOk.injectInside(this.ContenedorBotones);

          this.ContenedorBotones.injectInside(this.Content);
          this.display(1);
      }
      else if(type == 'confirm')
      {
          this.ConfirmBtnOk = new Element('input', {
            'id': 'BoxConfirmBtnOk',
            'type': 'submit',
            'value': properties.textBoxBtnOk,
            'styles': {
              'width': '70px'
            }
          });

          this.ConfirmBtnCancel = new Element('input', {
            'id': 'BoxConfirmBtnCancel',
            'type': 'submit',
            'value': properties.textBoxBtnCancel,
            'styles': {
              'width': '70px'
            }
          });

          this.ConfirmBtnOk.addEvent('click', function() {
            this.options.onReturn = true;
            this.display(0);
          }.bind(this));

          this.ConfirmBtnCancel.addEvent('click', function() {
            this.options.onReturn = false;
            this.display(0);
          }.bind(this));

          this.Content.setProperty('class','BoxConfirm').set('html',message);

          this.ConfirmBtnOk.injectInside(this.ContenedorBotones);
          this.ConfirmBtnCancel.injectInside(this.ContenedorBotones);
          
          this.ContenedorBotones.injectInside(this.Content);
          this.display(1);
      }
      else if(type == 'prompt')
      {
          this.PromptBtnOk = new Element('input', {
            'id': 'BoxPromptBtnOk',
            'type': 'submit',
            'value': properties.textBoxBtnOk,
            'styles': {
              'width': '70px'
            }
          });

          this.PromptBtnCancel = new Element('input', {
            'id': 'BoxPromptBtnCancel',
            'type': 'submit',
            'value': properties.textBoxBtnCancel,
            'styles': {
              'width': '70px'
            }
          });
          
          type = properties.password ? 'password' : 'text';
          this.PromptInput = new Element('input', {
            'id': 'BoxPromptInput',
            'type': type,
            'value': input,
            'styles': {
              'width': '250px'
            }
          });

          this.PromptBtnOk.addEvent('click', function() {
            this.options.onReturn = this.PromptInput.value;
            this.display(0);
          }.bind(this));

          this.PromptBtnCancel.addEvent('click', function() {
            this.options.onReturn = false;
            this.display(0);
          }.bind(this));

          this.Content.setProperty('class','BoxPrompt').set('html',message + '<br />');
          this.PromptInput.injectInside(this.Content);
          new Element('br').injectInside(this.Content);
          this.PromptBtnOk.injectInside(this.ContenedorBotones);
          this.PromptBtnCancel.injectInside(this.ContenedorBotones);


          this.ContenedorBotones.injectInside(this.Content);

          this.display(1);
      }
      else
      {
          this.options.onReturn = false;
          this.display(0);		
      }

    });

		this.i++;

		if(this.i==1) this.callChain();

	},

	/*
	Property: alert
		Shortcut for alert
		
	Argument:
		properties - see Options in messageBox
	*/		
	alert: function(message, properties){
		this.messageBox('alert', message, properties);
	},

	/*
	Property: info
		Shortcut for alert info
		
	Argument:
		properties - see Options in messageBox
	*/		
	info: function(message, properties){
		this.messageBox('info', message, properties);
	},

    /*
	Property: ok
		Shortcut for alert ok

	Argument:
		properties - see Options in messageBox
	*/
	ok: function(message, properties){
		this.messageBox('ok', message, properties);
	},
	
	/*
	Property: carrito_ok
		Shortcut for alert carrito_ok

	Argument:
		properties - see Options in messageBox
	*/
	carrito_ok: function(message, properties){
		this.messageBox('carrito_ok', message, properties);
	},
	
	/*
	Property: carrito_ko
		Shortcut for alert carrito_ko

	Argument:
		properties - see Options in messageBox
	*/
	carrito_ko: function(message, properties){
		this.messageBox('carrito_ko', message, properties);
	},

	/*
	Property: error
		Shortcut for alert error
		
	Argument:
		properties - see Options in messageBox
	*/		
	error: function(message, properties){
		this.messageBox('error', message, properties);
	},

	/*
	Property: confirm
		Shortcut for confirm
		
	Argument:
		properties - see Options in messageBox
	*/
	confirm: function(message, properties){
		this.messageBox('confirm', message, properties);
	},

	/*
	Property: prompt
		Shortcut for prompt
		
	Argument:
		properties - see Options in messageBox
	*/	
	prompt: function(message, input, properties){
		this.messageBox('prompt', message, properties, input);
	}
});


SexyAlertBox.implement(new Events, new Options); 
function prepara_tablas_redimensionables(id_contenedor) {
	$ES('.separador_int',id_contenedor).each( function(separador_int) {
		var separador_ext = separador_int.getParent();
	  var celda = separador_ext.getParent();	 
	  var enlace = celda.getFirst();
	  
	  var ancho_celda = celda.getCoordinates().width.toInt();
	  var ancho_enlace = enlace.getCoordinates().width.toInt();
	  separador_ext.setStyle('left',ancho_enlace);
		separador_int.setOpacity(0.3);
		separador_int.setStyle('left', ancho_celda - ancho_enlace - 19 );
		
		separador_int.makeDraggable({
			container: separador_ext,
			onStart: function(separador_int){
				separador_int.setOpacity(1);
			},
			onDrag: function(separador_int){
				var separador_ext = separador_int.getParent();
				var ancho_celda_old = separador_int.getParent().getParent().getCoordinates().width.toInt();
				var ancho_celda_new = separador_int.getStyle('left').toInt() + 19 + separador_ext.getStyle('left').toInt();
				$('anch_' + separador_int.id).setStyle('width', ancho_celda_new );
			},
			onComplete: function(separador_int){
				var separador_ext = separador_int.getParent();
			  var celda = separador_ext.getParent();	 
			  var enlace = celda.getFirst();
			  var ancho_celda = celda.getCoordinates().width.toInt();
			  var ancho_enlace = enlace.getCoordinates().width.toInt();
				separador_int.setStyle('left', ancho_celda - ancho_enlace - 19 );
				separador_int.setOpacity(0.3);
				ir_a('',http_app_path + '/intranet/vista/guardar_ancho_sesion?nombre_campo=anch_' + separador_int.id +'&ancho_campo='+ ancho_celda);
			}
		});
	});
}

/** function prepara_separador_izq_der()
	* Función que automatiza el control de redimensionado en la plantilla izq_der
*/
function prepara_color_picker() {
	
	var r = new MooRainbow('color_picker', {	
		'imgPath': http_app_path + '/comun/moorainbow/images/' ,
		'onChange': function(color) {
			$('d_titulo').value = color.hex;
		}
	});

}

/** function prepara_separador_izq_der()
	* Función que automatiza el control de redimensionado en la plantilla izq_der
*/
function prepara_separador_izq_der() {
	if($('barra_resizable')) {
		$('barra_resizable').setStyle('background-color','#a3a2a2');
		$('barra_resizable').setStyle('left',$('cuadro_izq_ext').getCoordinates().width.toInt() - 2);
		$('barra_resizable').makeDraggable({
			container: 'contenedor_principal',
			onStart: function(barra_resizable){
				$('barra_resizable').setStyle('background-color','#ededed');
			},
			onDrag: function(barra_resizable){
				var ancho_contenedor = $('contenedor_principal').getCoordinates().width.toInt();
				var posicion_barra = barra_resizable.getStyle('left').toInt() + 2;
				var porcentaje_izq = ((posicion_barra * 100)/ancho_contenedor).toInt();
				if( porcentaje_izq == 0 ) porcentaje_izq = 1;
				var porcentaje_der = 100 - porcentaje_izq;
				$('cuadro_izq_ext').setStyle('width', porcentaje_izq+'%' );
				$('cuadro_der_ext').setStyle('width', porcentaje_der+'%' );
			},
			onComplete: function(barra_resizable){
				barra_resizable.setStyle('left',$('cuadro_izq_ext').getCoordinates().width.toInt() - 2);
				ir_a('',http_app_path + '/intranet/vista/guardar_ancho_sesion?nombre_campo=cuadro_izq_ext&ancho_campo='+ $('cuadro_izq_ext').getStyle('width').toInt());
				ir_a('',http_app_path + '/intranet/vista/guardar_ancho_sesion?nombre_campo=cuadro_der_ext&ancho_campo='+ $('cuadro_der_ext').getStyle('width').toInt());
				$('barra_resizable').setStyle('background-color','#a3a2a2');
			}
		});
		window.addEvent('resize',function() {
			$('barra_resizable').setStyle('left',$('cuadro_izq_ext').getCoordinates().width.toInt() - 2);
		});
	}
}
		



/** function protect_inputs_on_enter(id_contenedor)
	* [id_contenedor]		Id de la capa que necesitamos proteger.
	*
	*	Esta función protege todos los elementos <input> ante la
	*	pulsación de la tecla enter. De modo que cuando se pulsa
	*	la tecla enter se cancelará dicha pulsación. Ademas permite
	*	configurar un comportamiento adicional que se disparará
	*	al detectar la tecla enter.
	*	El uso consiste en dar a aquellos input que lo requieran
	*	el className on_enter_XXXXXXX donde XXXXXXX seria el id
	*	de el link que pretendemos simular su click al pulsar enter
	*	en la caja de texto. Si unicamente queremos cancelar la
	*	pulsacion enter el className seria on_enter_cancel
**/
function protect_inputs_on_enter(id_contenedor) {
	if(id_contenedor=='') { id_contenedor = document.body; }
	$(id_contenedor).getElements('input').each(function( campo ){
		var className = campo.className;
		if(className.contains('on_enter_')) {
			var arr1 = className.split('on_enter_');
			var arr2 = arr1[1].split(' ');
			var accion = arr2[0];
			campo.onkeypress = ( function(e){
				var event = new Event(e)
				if(event.key=='enter') {
					if(accion!='cancel' && $(accion)){
						var href_accion = $(accion).getProperty('href');
						if(href_accion.contains('javascript:')) {
							eval(href_accion);
						} else {
							window.location.href = href_accion;
						}
					}
					return false;
				}
				return true;
			} );
		}
	});
}

function tooltips_undanet(id_contenedor){
	$ES('.tooltips_undanet',id_contenedor).each( function(toolTip) {
  	var titulo_completo = toolTip.getProperty('title');
  	var dual = titulo_completo.split('::');
		if (dual.length > 1){
			toolTip.store('tip:title', dual[0].trim());
  		toolTip.store('tip:text', dual[1].trim());
		}
		toolTip.addEvent('click', function(){ $(document.body).getLast().fade('out'); });
	});

	var tip = new Tips('.tooltips_undanet',{
          showDelay: 100,
          hideDelay: 100
      });
  tip.addEvent('onShow', function(tip){
    tip.fade('in');
  });
  tip.addEvent('onHide', function(tip){
    tip.fade('out');
  });
  $(document.body).getLast().setStyle('z-index',100);
}

function resaltar(id_elemento) {
	var elemento = $(id_elemento);
	if(elemento) {
		var color1 = elemento.getStyle('background-color');
		var color2 = elemento.getStyle('color').toString();
		var arr = color2.split('');
		for(var i=1;i<=6;i++) {
			if(arr[i]=='f') {				arr[i]='e';
				} else if(arr[i]=='e'){		arr[i]='f';
				} else if(arr[i]=='d'){		arr[i]='f';
				} else if(arr[i]=='c'){		arr[i]='e';
				} else if(arr[i]=='b'){		arr[i]='d';
				} else if(arr[i]=='a'){		arr[i]='c';
				} else if(arr[i]=='9'){		arr[i]='b';
				} else if(arr[i]=='8'){		arr[i]='a';
				} else {					arr[i]=arr[i].toInt()+2;
			}
		}
		color2 = arr[0] + arr[1] + arr[2] + arr[3] + arr[4] + arr[5] + arr[6];
		elemento.setStyle('background-color',color1);
		elemento.highlight( color2);
	}
}

function prepara_panel_activo(id_contenedor) {
	$ES('.panel_activo_undanet',id_contenedor).each( function(panel) {
		var id_panel_int = panel.id + '_int';
		var cod_inner_html = '<div id="'+id_panel_int+'" class="panel_activo_undanet_int">'+panel.innerHTML+'</div>';
		panel.innerHTML=cod_inner_html;
		panel.removeEvent('mouseenter');
		panel.removeEvent('mouseleave');
		panel.addEvents({
			mouseenter: function(){
				//alert('mouseenter');
				panel.getFirst().morph({
					'duration': 10,
					'opacity': 1
				});
			},
			mouseleave: function(){
				//alert('mouseleave');
				panel.getFirst().morph({
					'duration': 10,
					'opacity': ( Browser.Engine.trident ? 0.00000000001 : 0 )
				});
	
			}
		});
		panel.getFirst().setOpacity( ( Browser.Engine.trident ? 0.00000000001 : 0 ) );
	} );
}

/** function desactivar_segundo_estado(id_contenedor, class_name)
 * desactiva todos los enlaces ('a') que se encuentren en la capa contenedora
	para el class_name especificado. De modo que cada reemplaza en el className
	del anchor el class_name+'_seleccionado' por el class_name a secas.
	*	[id_contenedor] id de la capa en la que se van a buscar los links
	*	[class_name] class_name comun a los botones que simboliza su estado desactivado
				El estado activado debe llamarse igual mas el sufijo '_seleccionado'.
**/
function desactivar_segundo_estado(id_contenedor, class_name) {
	// si no nos indican la capa en la que aplicar la funcion, tomamos '' y asi se aplicara a todo el body
	if( ! id_contenedor )	{ id_contenedor=''; }
	
	var class_name_seleccionado = class_name + '_seleccionado';
	$ES('a',id_contenedor).each( function(enlace) {
		if(enlace.hasClass(class_name_seleccionado)) {
			enlace.addClass(class_name);
			enlace.removeClass(class_name_seleccionado);
		}
	} );
}

/** function sactivar_segundo_estado(id_contenedor, id_elemento, class_name)
 * activa el enlace ('a') indicado y desactiva el resto de enlaces que se encuentren
 	en la capa contenedora para el class_name especificado.
	*	[id_contenedor] id de la capa en la que se van a buscar los links
	*	[id_elemento] id del boton que queremos marcar como seleccionado
	*	[class_name] class_name comun a los botones que simboliza su estado desactivado
				El estado activado debe llamarse igual mas el sufijo '_seleccionado'.
**/
function activar_segundo_estado(id_contenedor, id_elemento, class_name ) {
	desactivar_segundo_estado(id_contenedor, class_name);
	var class_name_seleccionado = class_name + '_seleccionado';
	$(id_elemento).addClass(class_name_seleccionado);
	$(id_elemento).removeClass(class_name);
	if($(id_elemento+'_rel')) {
		$(id_elemento+'_rel').addClass(class_name_seleccionado);
		$(id_elemento+'_rel').removeClass(class_name);
	}
}

/** function dispara_evento(id_elemento, name_evento)
 * Evaluea el evento de ese elemento como código js.
	Es útil para forzar a que se ejecute un evento aunque no halla
	sucedido realmente. Incluso podemos inventar un evento propio y también
	lo evalua (aunque no cumpliría los standares web).
	*	[id_elemento] id del elemento que tiene el evento a ejecutar.
	*	[name_evento] nombre del evento.
**/
function dispara_evento(id_elemento, name_evento) {
	sentencia = $(id_elemento).get(name_evento);
	if($defined(sentencia)) {	
		sentencia = sentencia.toString().replace(/"this"/g, "$('"+id_elemento+"')");
		if(Browser.Engine.trident){
			sentencia = sentencia.toString().replace('function', "");
			sentencia = sentencia.toString().replace('anonymous()', "");
		}
		eval( sentencia );
	}
}

/** function prepara_scroll(id_contenedor)
 * si queremos hacer un scroll con o sin barra los requisitos son:
		1) El scroll estara formado por dos capas:
			a) La capa contenedora que tiene un ancho y alto concreto y position:relative o absolute (como queramos)
					Ademas tendra overflow:hidden
					La capa contededora debe tener el className 'scroller_undanet' y el id que queramos (por ejemplo 'myid').
			b) La capa que tiene el contenido que tendra un ancho fijo y el alto dependera de su contenido
					Su position debe ser absolute.
					La capa de contenido debe tener el className 'Scroller-Container' y el id debe ser el de la contenedora
					con '_contenido' (por ejemplo 'myid_contenido').
		2) Si ademas queremos que tenga barra de scroll tendremos una capa con el id de la capa contenedora del scroll
					seguido de '_barra' (por ejemplo 'myid_barra').
					esta capa tendra los botones de subir y bajar (si no se quieren poner no son obligatorios) y la capa
					que determina el carril de scroll, dentro de esta capa de carril estara la capa que determina la pieza que
					podremos mover por el carril para desplazar el scroll. Siguiendo el ejemplo tendriamos:
						<div id="myid_barra">
							<a href="javascript:;" class="Scrollbar-Up"></a>
							<div class="Scrollbar-Track">
								<a href="javascript:;" class="Scrollbar-Handle"></a>
							</div>
							<a href="javascript:;" class="Scrollbar-Down"></a>
						</div>
					como se puede ver es obligatorio que los className de los componentes que forman la barra de scroll sean
					los del ejemplo ('Scrollbar-Up', 'Scrollbar-Track', 'Scrollbar-Handle', 'Scrollbar-Down') aun así
					podemos incluir otros estilos css para darle el aspecto visual deseado.
**/
function prepara_scroll(id_contenedor) {
	$ES('.Scrollbar',id_contenedor).each( function(scroller) {
		var scr = new ScrollBar(scroller.id);
	} );
}

/** function prepara_efecto_alargado(id_contenedor)
	Establece un efecto de carga que estira las capas con className 'alargado'
**/
function prepara_efecto_alargado(id_contenedor) {
	$ES('.alargado',id_contenedor).each(function(barra){
		var w = barra.getStyle('width').toInt();
		var fx = barra.effects({
			duration: 1000,
			transition: Fx.Transitions.Back.easeOut 
		});
		fx.start({
			'opacity': [0, 1],
			'width': [0, w]
		})
	});
}

/** function prepara_calendario(id_contenedor)
	Establece el calendario js para aquellos input con un id que lo identifique y el className 'calendario_undanet'
	Si queremos que solo permita seleccionar fechas pasadas o solo fechas futuras fijaremos la propiedad direction="-1"
	o direction="1" respectivamente.
**/
function prepara_calendario(id_contenedor) {
	$ES('.calendario_undanet',id_contenedor).each( function(calendario) {
		var id_calendario = calendario.id.toString();

		Calendar.setup( {
			inputField : id_calendario,
			ifFormat : '%d/%m/%Y',
			align:'bR',
			step: 1,
			firstDay: 1
		} );
		
	} );
}

/** function prepara_textarea(id_contenedor)
			siempre que haya un textarea en un formulario con
			el class='editor_undanet_myid' donde 'myid' sea el id del textarea
			automaticamente lo transforma en un editor visual
**/
function prepara_textarea(id_contenedor) {
	$ES('textarea',id_contenedor).each( function(tipo_textarea) {
		if(tipo_textarea.hasClass('editor_undanet_'+tipo_textarea.id)) {
			
			tinyMCE.init({
				mode : "textareas",
				theme : "advanced",
				language : "es",
				plugins : "safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template",
				theme_advanced_buttons1 : "bold,italic,underline,separator,link,justifyleft,justifycenter,justifyright, justifyfull",
				theme_advanced_buttons2 : "",
				theme_advanced_buttons1_add: "pastetext,pasteword",
				theme_advanced_toolbar_location : "top",
				theme_advanced_toolbar_align : "left",
				theme_advanced_resizing : true,
				apply_source_formatting : false,
				width : tipo_textarea.getStyle('width').toInt(),
				height : tipo_textarea.getStyle('height').toInt(),
				editor_selector : 'editor_undanet_'+tipo_textarea.id
			});
			
		}
	} );
}

/** function asignar_resultado(variables, valores, delimitador)
		asigna los valores recibidos a las variables indicadas, para poder pasar
		n valores a n variables utilizamos un delimitador ( por defecto '|' )
**/
function asignar_resultado(variables, valores, delimitador) {
	if( ! delimitador ) delimitador = '|';
	arr_variables = variables.split(delimitador);
	arr_valores   = valores.split(delimitador);
	for(i=0 ; i<arr_variables.length ; ++i) {
		if($(arr_variables[i])) {
			$(arr_variables[i]).set('value', arr_valores[i] );
			dispara_evento(arr_variables[i], 'onchange');
		}
	}
}

/** function asignar_desde_popup(variables, valores, delimitador)
		utiliza la funcion asignar_resultado pero para asignarlos
		desde un popup a la ventana padre. Además cierra el popup.
**/
function asignar_desde_popup(variables, valores, delimitador) {
	if(window.opener) { // si aun esta abierta la ventana padre le pedimos que ejecute
		if( ! delimitador ) delimitador = '|';
		// la sentencia que asignara los resultados de busqueda.
		window.opener.setTimeout('asignar_resultado("'+variables+'","'+valores+'","'+delimitador+'");',1);
		window.close(); // cerramos el popup
	} else {
		show_error('No se encontró la ventana principal.');
	}
}
 /**
	*	function trim(str)
	* [str] contiene la cadena de origen.
	*
	*	Devuelve la cadena sin espacios por los flancos, es decir, quita los espacios
	*	que encuentre al inicio y final de la cadena. Si la cadena contiene solo espacios
	*	devolvera la cadena vacia.
**/
function trim(str) {
	return str.replace(/(^\s+)|(\s+$)/g, '');
}

/** function es_numerico(val)
	*	[val] valor que queremos saber si es o no numerico
	*
	* Determina si el valor recibido es numerico o no.
**/
function es_numerico(val) {
	return ( ! isNaN(val) );
}

/** function es_cif(cif)
	*	[cif] valor que queremos saber si es o no un cif
	*
	* Determina si el valor recibido es un cif o no.
**/
function es_cif(cif) {
	if(cif == '') return true;
	par = 0;
	non = 0;
	letras = "ABCDEFGHKLMNPQS";
	let = cif.charAt(0);

	if (cif.length!=9) {
		return false; // El Cif debe tener 9 digitos
	}
	if (letras.indexOf(let.toUpperCase())==-1) {
		return false; // El comienzo del Cif no es valido
	}
	for (zz=2;zz<8;zz+=2) {
		par = par+parseInt(cif.charAt(zz));
	}
	for (zz=1;zz<9;zz+=2) {
		nn = 2*parseInt(cif.charAt(zz));
		if (nn > 9) nn = 1+(nn-10);
		non = non+nn;
	}
	parcial = par + non;
	control = (10 - ( parcial % 10));
	if (control==10) control=0;
	if (control!=cif.charAt(8)) {
		return false; // El Cif no es valido
	}
	return true; // El Cif es valido
}

/** function es_nif(nif)
	*	[nif] valor que queremos saber si es o no un nif
	*
	* Determina si el valor recibido es un nif o no.
**/
function es_nif(nif) {
	if(nif == '') return true;
	dni=nif.substring(0,nif.length-1);
	let=nif.charAt(nif.length-1);
	if(!isNaN(let)) {
		return false; // Falta la letra
	} else {
		cadena = 'TRWAGMYFPDXBNJZSQVHLCKET';
		posicion = dni % 23;
		letra = cadena.substring(posicion,posicion+1);
		if(letra!=let.toUpperCase()) {
			return false; // Nif no valido
		}
	}
	return true; // Nif valido
}

/** function es_email(email)
	*	[email] valor que queremos saber si es o no un email
	*
	* Determina si el valor recibido es un email o no.
**/
function es_email(email) {
	if(email == '') return true;
	return email.match(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/);
}

/** function es_url(url)
	*	[url] valor que queremos saber si es o no una url
	*
	* Determina si el valor recibido es una url o no.
**/
function es_url(url) {
	if(url == '') return true;
	return url.match(/^(((ht|f)tp(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/);
}

/** function es_fecha(fecha)
	*	[fecha] valor que queremos saber si es o no una fecha en formato dd/mm/aaaa
	*
	* Determina si el valor recibido es o no una fecha en formato dd/mm/aaaa
**/
function es_fecha(fecha) {
	if(fecha == '') return true;
	if( ! fecha.match(/^(\d{2}\/\d{2}\/\d{4})$/) ) return false; // formato incorrecto
	dia = parseInt(fecha.substring(0,2),10);
	mes = parseInt(fecha.substring(3,5),10) - 1;
	ano = parseInt(fecha.substring(6),10);
	f_date = new Date(ano,mes,dia);
	if(f_date.getFullYear()!=ano || f_date.getMonth()!=mes || f_date.getDate()!=dia) return false;
	return true;
}

function es_minimo(valor) {
	if(valor.length < 6){
		return false;
	}
	return true;
}

/** function es_fecha_hora(fecha_hora)
	*	[fecha_hora] valor que queremos saber si es o no una fecha_hora en formato dd/mm/aaaa hh:mm:ss
	*
	* Determina si el valor recibido es o no una fecha_hora en formato dd/mm/aaaa hh:mm:ss
**/
function es_fecha_hora(fecha_hora) {
	if(fecha_hora == '') return true;
	if( ! fecha_hora.match(/^(\d{2}\/\d{2}\/\d{4}( \d{2}:\d{2}:\d{2})?)$/) ) return false; // formato incorrecto
	dia = parseInt(fecha_hora.substring(0,2),10);
	mes = parseInt(fecha_hora.substring(3,5),10) - 1;
	ano = parseInt(fecha_hora.substring(6,10),10);
	hora = 0;
	minuto = 0;
	segundo = 0;
	if( ! es_fecha(fecha_hora) ) {
		hora = parseInt(fecha_hora.substring(11,13),10);
		minuto = parseInt(fecha_hora.substring(14,16),10);
		segundo = parseInt(fecha_hora.substring(17),10);
	}
	f_date = new Date(ano,mes,dia,hora,minuto,segundo);
	if(f_date.getFullYear()!=ano || f_date.getMonth()!=mes || f_date.getDate()!=dia || f_date.getHours()!=hora || f_date.getMinutes()!=minuto || f_date.getSeconds()!=segundo) return false;
	return true;
}

/** function set_msg_err(campo, mensaje)
	*	[campo] representa el campo del formulario.
	*	[mensaje] es el mensaje de error que se desea visualizar.
	*
	*	La funcion muestra el mensaje en una capa cuyo id sera
	*	msg_err_ y el nombre asociado al campo. Para quitar el
	*	mensaje de error basta con llamar a esta funcion pasandole
	*	la cadena vacia como mensaje.
**/
function set_msg_err(campo, mensaje) {
	var titulo_campo = campo.get('title');
	if( ! titulo_campo ) { titulo_campo = campo.get('name'); }
    msg_err_total += titulo_campo+': '+mensaje+'<br/>';
    return; // fin del metodo.

	var id_msg_err = 'msg_err_' + campo.id;
	var capa_msg_err = $(id_msg_err);
	/* si no tenemos la capa de error, inyectamos una capa de error tratando que se suporponga al input */
	if( ! capa_msg_err ) {
		var alto = campo.getStyle('height').toInt()+campo.getStyle('border-top').toInt()+campo.getStyle('border-bottom').toInt();
		var ancho = campo.getStyle('width').toInt();
		if(Browser.Engine.trident) { ancho += campo.getStyle('border-right').toInt(); }
		if(ancho<10){ ancho=10; }
		if(alto<10)	{ alto=10;	}
		var arriba = campo.getTop().toInt();
		var izquierda = campo.getLeft().toInt()+campo.getStyle('border-left').toInt();
		var contenedor_total = $('contenedor_total');
		var referencia = $(document.body);
		if(contenedor_total) {
			arriba -= contenedor_total.getTop().toInt();
			izquierda -= contenedor_total.getLeft().toInt()+campo.getStyle('border-left').toInt();
			referencia = contenedor_total;
		}

		var capa_msg_err = new Element('div', {
													'id'	: id_msg_err,
													'styles': {
														'height'	: alto,
														'width'		: ancho,
														'top'		: arriba,
														'left'		: izquierda,
														'z-index'	: campo.getStyle('z-index').toInt()+1,
														'position'	: 'absolute',
														'background-color'	: '#cccccc',
														'color'				: '#ff0000',
														'border-color'		: '#ff0000',
														'text-align'		: 'left'
													},
													'events': {
														'click': function() {
															click_msg_err(this.id);
														}
													}
										} ).injectInside( referencia );

		capa_msg_err.className = campo.className;
	} else {
		capa_msg_err.set('background-color', '#FFFFFF');
		capa_msg_err.removeEvents('click');
		capa_msg_err.addEvent('click', function() {
			click_msg_err(this.id);
		} );
	}
	capa_msg_err.set('html',mensaje);
	if ( mensaje == '' ) {
		capa_msg_err.setStyle('display','none');
	} else {
		capa_msg_err.setStyle('display','block');
		resaltar(id_msg_err);
	}

	campo.blur();
	capa_msg_err.blur();
}

/** function click_msg_err(id_msg_err)
	*	A esta funcion la invocamos al hacer click en el mensaje de error.
	*	Oculta la capa del mensaje y pone el foco en el input asociado a dicha capa.
**/
function click_msg_err(id_msg_err) {
	var capa_msg_err = $(id_msg_err);
	var id_campo = id_msg_err.substr(8);
	var campo = $(id_campo);
	try {
		campo.focus();
	}catch(e){}
	capa_msg_err.setStyle('display','none');
}

/** function es_correcto(campo)
	*	[campo] representa el campo del formulario.
	*
	* Determina si el campo es correcto. Para ello aplica diversas validaciones
	*	en funcion de los diversos valores que presente en su className.
**/
function es_correcto(campo) {
	/* Este método es del editor de texto, lo que hacemos es forzarlo a que guarde el valor que contiene en el campo del textarea antes de ser enviado */
	if(campo.hasClass('editor_undanet_'+campo.id)) {
		tinyMCE.getInstanceById(campo.id).save();
		cont_editores++;
	}
	if(campo.hasClass('trim')) {
		campo.value = trim(campo.value);
	}
	if(campo.hasClass('obligatorio')) {
		if( campo.value == '' ) {
			set_msg_err(campo,'Campo obligatorio');
			return false;
		}
	}
	if(campo.hasClass('numerico')) {
		if( ! es_numerico(campo.value) ) {
			set_msg_err(campo,'Campo numérico');
			return false;
		}
	}
	if(campo.hasClass('email')) {
		if( ! es_email(campo.value) ) {
			set_msg_err(campo,'Formato erroneo');
			return false;
		}
	}
    if(campo.hasClass('minimo')) {
		if( ! es_minimo(campo.value) ) {
			set_msg_err(campo,'6 caracteres');
			return false;
		}
	}
	if(campo.hasClass('url')) {
		if( ! es_url(campo.value) ) {
			set_msg_err(campo,'Formato erroneo');
			return false;
		}
	}
	if(campo.hasClass('fecha')) {
		if( ! es_fecha(campo.value) ) {
			set_msg_err(campo,'Fecha incorrecta');
			return false;
		}
	}
	if(campo.hasClass('fecha_hora')) {
		if( ! es_fecha_hora(campo.value) ) {
			set_msg_err(campo,'Fecha incorrecta');
			return false;
		}
	}
	if(campo.hasClass('nif')) {
		if( ! es_nif(campo.value) ) {
			set_msg_err(campo,'Formato erroneo');
			return false;
		}
	}
	if(campo.hasClass('cif')) {
		if( ! es_cif(campo.value) ) {
			set_msg_err(campo,'Formato erroneo');
			return false;
		}
	}
	if(campo.hasClass('nif-cif')) {
		if( (! es_nif(campo.value)) && (! es_cif(campo.value)) ) {
			set_msg_err(campo,'Formato erroneo');
			return false;
		}
	}

	return true;
}

/** function validar_campo(campo)
	*	[campo] es el campo que queremos validar.
	*
	* Esta funcion valida el campo y devuelve true en caso de que cumpla las restricciones.
	*	Si encuentra errores muestra el mensaje de error en la capa correspondiente, en
	*	caso contrario limpia el posible mensaje de error que tubiera previamente asociado.
**/
function validar_campo(campo) {
	/*
		para que funcionen los metodos avanzados de mootools como 'hasClass' en IE es necesario crear una variable que referencie
		el objeto extraido del id. Esto implica que es necesario que todos los input del formulario tengan id.
	*/
	var campo = $(campo.id);
	campo.blur();
	return es_correcto(campo);
}

/** function validar_formulario_activo(formulario)
	*	[formulario] es el formulario que queremos validar.
	*
	* Esta funcion valida el formulario y devuelve true en caso de que se pueda enviar.
	*	Si encuentra errores muestra los mensajes de error en las capas correspondientes.
	*	Para ello recorre todos los campos y les aplica la funcion es_correcto
	*	uno a uno. Para los campos correctos limpia el posible mensaje de error que
	*	tubiera previamente asociado.
**/
var msg_err_total = '';
function validar_formulario(formulario) {
	msg_err_total = '';
	for(var i=0 ; i < formulario.elements.length ; ++i) {
		validar_campo(formulario.elements[i]);
	}
	if(msg_err_total == '') { return true; }
	else { show_error('<b>Por favor, revise los siguientes errores</b><br/><blockquote>'+msg_err_total+'</blockquote>', 'alerta'); return false; }
}

var cont_editores; /* variable global para saber si hay editores tinyMCE */

/** function submit_formulario(id_formulario)
	* [id_formulario]	Id del formulario que queremos validar y enviar.
	*
	*	Valida el formulario, y en caso de que todo sea correcto comprueba
	*	si hay editores (tinyMCE) y si los hay los quita para evitar problemas
	*	a loa hora de hacer el submit. Si todo es correcto envía el formulario
	*	ejecutando un submit dobre el mismo.
**/
function submit_formulario(id_formulario) {
	cont_editores = 0;
	var formulario = $(id_formulario);
	if(validar_formulario(formulario)) {
		if(cont_editores>0) tinyMCE.triggerSave();
		formulario.submit();
	}
}

/** function ir_a_validado(id_j_frame, id_formulario, run_js)
	* [id_j_frame]		Id de la capa donde queremos volcar el resultado del envio AJAX.
	* [id_formulario]	Id del formulario que queremos validar y enviar por AJAX.
	* [run_js]			Parametro opcional (por defecto false) que determina si queremos
	*					que se ejecuten los scripts encontrados en la respuesta AJAX
	*					y la funcion init.
	*
	*	Valida el formulario, y en caso de que todo sea correcto comprueba
	*	si hay editores (tinyMCE) y si los hay los quita para evitar problemas
	*	a loa hora de hacer el submit. Si todo es correcto envía el formulario
	*	ejecutando un submit dobre el mismo.
**/
function ir_a_validado(id_j_frame, id_formulario, run_js){
	var formulario = $(id_formulario);
	if(validar_formulario(formulario)==true) {
		ir_a_formulario(id_j_frame,id_formulario,run_js);
	}
}
 
/* 
 * Función para adaptar mootools 1.11 a  mootools 1.2 
 */

function $ES(class_selector, id_contenedor){
	var contenedor = $(document.body);
	if(id_contenedor){
		contenedor = $(id_contenedor);
	}
	return contenedor.getElements(class_selector);
}

/** function init(id_contenedor)
	Se ejecuta cuando se carga la pagina y también cuando se refresca alguna capa con ajax.
	Aquí se deben de programar todas las rutinas de carga oportunas.
	Cuando se carga la pagina completa init se ejecuta concretamente onDomReady
**/
var Sexy = null;

function init(id_contenedor) {
	// si no nos indican la capa en la que aplicar rutinas de inicio, tomamos '' y asi se aplicara a todo el body
	if( ! id_contenedor )	{ id_contenedor=''; }
	
	/* para que mozilla no marque los link como seleccionados al pinchar en ellos */
	$ES('a',id_contenedor).each( function(enlace) {
		
		if( ! Browser.Engine.trident ) { // si no es IE
			enlace.addEvent('click', function() { this.blur(); } );
		}
		if(enlace.hasClass('target_blank')) {
			enlace.setProperty('target','_blank');
		}
	} );

	if(id_contenedor==''){
		$try(function(){  Sexy = new SexyAlertBox(); });
	}

	$try(function(){ prepara_panel_activo(id_contenedor); });
	
 	$try(function(){ prepara_calendario(id_contenedor); });
 	
 	$try(function(){ prepara_scroll(id_contenedor); });
 	
 	$try(function(){ tooltips_undanet(id_contenedor); });
 	
 	$try(function(){ protect_inputs_on_enter(id_contenedor);});
 	
 	$try(function(){ start_menu(id_contenedor); });
 	
 	$try(function(){   prepara_tablas_redimensionables(id_contenedor); });
 	
 	$try(function(){   FancyForm.start($ES('input',id_contenedor)); });
 	
 	if(id_contenedor!='') { begin(id_contenedor); }
}



/** function begin(id_contenedor)
	Se ejecuta cuando se carga la pagina y también cuando se refresca alguna capa con ajax.
	Aquí se deben de programar aquellas rutinas de carga oportunas que necesiten que la web
	este cargada completamente (imagenes y demas componentes de carga pesados inclusive).
	Cuando se carga la pagina completa init se ejecuta concretamente onLoad
**/
function begin(id_contenedor) {
	// si no nos indican la capa en la que aplicar rutinas de inicio, tomamos '' y asi se aplicara a todo el body
	if( ! id_contenedor )	{ id_contenedor=''; }

	$try(function(){  prepara_textarea(id_contenedor);  });

	$try(function(){ prepara_carrusel_undanet(id_contenedor); });
 	
 	$try(function(){ prepara_separador_izq_der(); });
 	
 	$try(function(){
		if(window.self == window.top) { initLytebox(); }
	});
 	
}

/* domready se dispara cuando el navegador ya tiene cargado el arbol dom, es decir, cuando ha recibido todo el codigo html */
window.addEvent('domready',init);
/* load se dispara cuando el navegador ya tiene cargada toda la informacion, codigo html, imagenes, videos... */
window.addEvent('load', begin);
/* luego utilizaremos como funcion de arranque 'init' salvo que necesitemos que esten cargadas las imagenes en cuyo caso usariamos 'begin'.*/


/* ajustamos la altura minima de la web conforme a la altura de la ventana al cargar dicha ventana y al redimensionara */
window.addEvent('resize',set_altura_minima);
window.addEvent('load',set_altura_minima);
function set_altura_minima() {
	$ES('.altura_minima','').each( function(capa) { /* por cada capa con el className 'altura_minima' */
			capa.setStyle('height',window.getHeight()); /* establecemos el alto de la ventana */
	} );
}

/** function ir_a(id_contenedor, url [,run_js=false])
	*	[id_contenedor] id de la capa que se va a refrescar.
	*	[url] url del servicio web que se desea solicitar mediante AJAX.
	*	[run_js] boolano que determina si se deben ejecutar los scripts que se encuentren
	*		en el resultado obtenido tras ejecutar ajax y tambien la funcion init.
			Por defecto su valor es false.
	*	Envia una peticion de servicio por get mediante la libreria mootools.js
**/
function ir_a(id_contenedor, url, run_js) {
	// si no especifican el parametro run_js tomamos false por defecto.
	if( ! run_js ) run_js = false;
	// dividimos la url en base al '?' para obtener la uri y los parametros
	var uri = url.split('?'); // ejemplo-> { 0: 'http://..../app/servicio/accion', 1: 'param1=val1&param2=val2' }
	
	if(uri[1]) { uri[1] += '&contenedor=' + id_contenedor; } else { uri[1] = 'contenedor=' + id_contenedor; }

	var miRequest = new Request.HTML( {
		method		:	'get',
		encoding	:	'utf-8',
		url       	:  	uri[0],
		update		:	$(id_contenedor),
		onRequest   :	function() { show_loadings(); },
		onSuccess   :	function(resultado) {  hide_loadings(); if(run_js) { init(id_contenedor); } },
		evalScripts	:	run_js
	} ).send(uri[1]);
}

/** function ir_a_formulario(id_contenedor, id_formulario [,run_js=true])
	* [id_contenedor] id de la capa que se va a refrescar.
	* [id_formulario] id del formulario que queremos enviar.
	* [run_js] boolano que determina si se deben ejecutar los scripts que se encuentren
	*		en el resultado obtenido tras ejecutar ajax y tambien la funcion init.
			Por defecto su valor es false.
	*	
	*	Envia el formulario mediante la funcion ir_a
	*	Si el formulario requiere subir objetos de tipo file mediante multi-part esta
	*	funcion no sirve, ya que utiliza Ajax que envia los datos mediante SOAP que al
	*	fin y al cabo es un xml. Luego en caso de necesitar subir ficheros es necesario
	*	hacerlo mediante el envio normal post de formularios.
**/
function ir_a_formulario(id_contenedor, id_formulario, run_js)
{
	var formulario = $(id_formulario);
	var url = formulario.get('action');
	var nexo = ( url.match(/\?/) ? '&' : '?' );
	for(var i=0 ; i < formulario.elements.length ; ++i) { /* recorremos los campos del formulario */
		url += nexo + formulario.elements[i].get('name') + '=' + formulario.elements[i].get('value');
		nexo = '&';
	}
	ir_a(id_contenedor, url, run_js);
}

/** function abrir_ventana(url [,alto='auto'] [,ancho='auto'] [,tiene_scroll='yes'] [,resizable='yes'])
	*	[url] es la url que se va a cargar en la nueva ventana.
	*	[alto] determina el alto (en pixeles) que tendra la ventana. Por defecto su valor es 'auto'.
	*	[ancho] determina el ancho (en pixeles) que tendra la ventana. Por defecto su valor es 'auto'.
	*	[tiene_scroll] determina si queremos que el navegador presente barras de scroll en la ventana.
	*		Por defecto su valor es 'yes'.
	*	[resizable] determina si el usuario podrá modificar las dimensiones de la ventana. Por defecto es 'yes'.
	*
	*	Envia una peticion por get que se realizara en una nueva ventana. Si ya se abrio previamente una ventana
	* mediante esta funcion para el mismo servicio utilizara nuevamente dicha ventana gracias a que tendra
	* el mismo target. Es decir, el target determina que ventana utilizar. Además fuerza a que la ventana tome
	*	el foco y refresque el contenido.
**/
function abrir_ventana(url, alto, ancho, tiene_scroll, resizable)
{
	if( ! alto ) alto = 'auto';
	if( ! ancho ) ancho = 'auto';
	if( ! tiene_scroll ) tiene_scroll = 'yes';
	if( ! resizable ) resizable = 'yes';
	
	// dividimos la url en base al '?' para obtener la uri y los parametros
	var uri = url.split('?'); // ejemplo-> { 0: 'http://..../app/servicio/accion', 1: 'param1=val1&param2=val2' }
	var dirs = uri[0].split('/'); // el target que identifica a la ventana sera el ultimo dir de la uri
	var target_ventana = dirs[ dirs.length - 1 ];

	if(uri[1]) { url += '&contenedor=contenedor_popup'; } else { url += '?contenedor=contenedor_popup'; }
	
	var opciones =	'channelmode=no'
				+	',directories=no'
				+	',fullscreen=no'
				+	',height=' + alto
				+	',left=50'
				+	',location=no'
				+	',menubar=no'
				+	',resizable=' + resizable
				+	',scrollbars=' + tiene_scroll
				+	',status=no'
				+	',toolbar=no'
				+	',top=150'
				+	',width=' + ancho;
	var refrescar = true; // fuerza a refrescar la ventana en caso de que ya estubiese abierta.
	var nueva_ventana = window.open(url,target_ventana,opciones,refrescar);
	if(nueva_ventana) { nueva_ventana.focus(); }
}

/** function ir_a_desde_popup(id_contenedor, url, run_js)
		utiliza la funcion ir_a pero para invocarla
		desde un popup a la ventana padre. Además cierra el popup.
**/
function ir_a_desde_popup(id_contenedor, url, run_js) {
	if(window.opener) { // si aun esta abierta la ventana padre le pedimos que ejecute
		if( ! run_js ) run_js = false;
		// la sentencia ir_a.
		window.opener.setTimeout('ir_a("'+id_contenedor+'","'+url+'",'+run_js+');',1);
		window.close(); // cerramos el popup
	} else {
		show_error('No se encontró la ventana principal.');
	}
}

/**
  * hide_loadings()
  * oculta la capa con id 'capa_cargando'
  * Pone a 'default' el cursor del ratón
 **/
function hide_loadings(){
	if($('capa_cargando')) { $('capa_cargando').setStyle('visibility','hidden'); }
	$ES('.capa_cargando').each( function(capa_cargando) {
		capa_cargando.setStyle('visibility','hidden');
	} );
	$$('body').setStyle('cursor','default');
	$$('a').setStyle('cursor','pointer');
}

/**
  * show_loadings()
  * muestra la capa con id 'capa_cargando'
  * Pone a 'wait' el cursor del ratón
 **/
function show_loadings(){
	if($('capa_cargando')) { $('capa_cargando').setStyle('visibility','visible'); }
	$ES('.capa_cargando').each( function(capa_cargando) {
		capa_cargando.setStyle('visibility','visible');
	} );
	$$('body').setStyle('cursor','wait');
	$$('a').setStyle('cursor','wait');
}

/** show_error(msg_err_general,tipo)
	[msg_err_general] determina el mensaje de error a visualizar.
	[tipo] determina el tipo del mensaje de error a visualizar (por defecto es 'error').
	Los errores que queramos mostrar al usuario deben mostrarse siempre mediante esta
	función, dado que así, en caso de que quisieramos cambiar en algún momento el
	formato visual de todos los mensajes de error solo habria que modificar esta
	función.
**/
function show_error(msg_err_general,tipo) {

    tipo = (typeof tipo == 'undefined') ? 'error' : tipo;

	var tipo_alerta = tipo.toLowerCase();

	switch(tipo_alerta){
	    case 'error':
	        Sexy.error(msg_err_general);
	        break;
		case 'informacion':
		    Sexy.info(msg_err_general);
			break;
        case 'alerta':
		    Sexy.alert(msg_err_general);
			break;
        case 'ok':
		    Sexy.ok(msg_err_general);
			break;
        case 'carrito_ok':
		    Sexy.carrito_ok(msg_err_general);
			break;
        case 'carrito_ko':
		    Sexy.carrito_ko(msg_err_general);
			break;
		default:
		    Sexy.error(msg_err_general);
	}
}

/** seguro_eliminar(url [,id_contenedor] [,run_js])
	[url] determina la url de acceso al servicio de eliminación.
	[id_contenedor] parametro opcional que implicará el contenedor de refresco ajax.
	[run_js] parametro opcional que determina si debe ejecutar los js en caso de usar ajax.
	Pregunta al usuario se desea realmente eliminar el elemnto. En caso afirmativo
	navega hacia la url especificada. Si se especifica un id_contenedor la navegación
	se realizará por 'ajax'. En caso contrario se realizará por navegación 'natural'.
**/
function seguro_eliminar(url,id_contenedor,run_js) {
	Sexy.confirm('¿Desea eliminar realmente este elemento?', {
			onComplete: function(returnvalue) {
					if(returnvalue){
						if(id_contenedor) {
							ir_a(id_contenedor,url,run_js);
						} else {
							window.location.href = url;
						}
					}
			}
	} );
}
 
