// Copyright (c) David Arshba.

var MooTools={version:"1.11"};function $defined(A){return(A!=undefined);}function $type(B){if(!$defined(B)){return false;}if(B.htmlElement){return"element";
}var A=typeof B;if(A=="object"&&B.nodeName){switch(B.nodeType){case 1:return"element";case 3:return(/\S/).test(B.nodeValue)?"textnode":"whitespace";}}if(A=="object"||A=="function"){switch(B.constructor){case Array:return"array";
case RegExp:return"regexp";case Class:return"class";}if(typeof B.length=="number"){if(B.item){return"collection";}if(B.callee){return"arguments";}}}return A;
}function $merge(){var C={};for(var B=0;B<arguments.length;B++){for(var E in arguments[B]){var A=arguments[B][E];var D=C[E];if(D&&$type(A)=="object"&&$type(D)=="object"){C[E]=$merge(D,A);
}else{C[E]=A;}}}return C;}var $extend=function(){var A=arguments;if(!A[1]){A=[this,A[0]];}for(var B in A[1]){A[0][B]=A[1][B];}return A[0];};var $native=function(){for(var B=0,A=arguments.length;
B<A;B++){arguments[B].extend=function(C){for(var D in C){if(!this.prototype[D]){this.prototype[D]=C[D];}if(!this[D]){this[D]=$native.generic(D);}}};}};
$native.generic=function(A){return function(B){return this.prototype[A].apply(B,Array.prototype.slice.call(arguments,1));};};$native(Function,Array,String,Number);
function $chk(A){return !!(A||A===0);}function $pick(B,A){return $defined(B)?B:A;}function $random(B,A){return Math.floor(Math.random()*(A-B+1)+B);}function $time(){return new Date().getTime();
}function $clear(A){clearTimeout(A);clearInterval(A);return null;}var Abstract=function(A){A=A||{};A.extend=$extend;return A;};var Window=new Abstract(window);
var Document=new Abstract(document);document.head=document.getElementsByTagName("head")[0];window.xpath=!!(document.evaluate);if(window.ActiveXObject){window.ie=window[window.XMLHttpRequest?"ie7":"ie6"]=true;
}else{if(document.childNodes&&!document.all&&!navigator.taintEnabled){window.webkit=window[window.xpath?"webkit420":"webkit419"]=true;}else{if(document.getBoxObjectFor!=null){window.gecko=true;
}}}window.khtml=window.webkit;Object.extend=$extend;if(typeof HTMLElement=="undefined"){var HTMLElement=function(){};if(window.webkit){document.createElement("iframe");
}HTMLElement.prototype=(window.webkit)?window["[[DOMElement.prototype]]"]:{};}HTMLElement.prototype.htmlElement=function(){};if(window.ie6){try{document.execCommand("BackgroundImageCache",false,true);
}catch(e){}}var Class=function(B){var A=function(){return(arguments[0]!==null&&this.initialize&&$type(this.initialize)=="function")?this.initialize.apply(this,arguments):this;
};$extend(A,this);A.prototype=B;A.constructor=Class;return A;};Class.empty=function(){};Class.prototype={extend:function(B){var C=new this(null);for(var D in B){var A=C[D];
C[D]=Class.Merge(A,B[D]);}return new Class(C);},implement:function(){for(var B=0,A=arguments.length;B<A;B++){$extend(this.prototype,arguments[B]);}}};Class.Merge=function(C,D){if(C&&C!=D){var B=$type(D);
if(B!=$type(C)){return D;}switch(B){case"function":var A=function(){this.parent=arguments.callee.parent;return D.apply(this,arguments);};A.parent=C;return A;
case"object":return $merge(C,D);}}return D;};var Chain=new Class({chain:function(A){this.chains=this.chains||[];this.chains.push(A);return this;},callChain:function(){if(this.chains&&this.chains.length){this.chains.shift().delay(10,this);
}},clearChain:function(){this.chains=[];}});var Events=new Class({addEvent:function(B,A){if(A!=Class.empty){this.$events=this.$events||{};this.$events[B]=this.$events[B]||[];
this.$events[B].include(A);}return this;},fireEvent:function(C,B,A){if(this.$events&&this.$events[C]){this.$events[C].each(function(D){D.create({bind:this,delay:A,"arguments":B})();
},this);}return this;},removeEvent:function(B,A){if(this.$events&&this.$events[B]){this.$events[B].remove(A);}return this;}});var Options=new Class({setOptions:function(){this.options=$merge.apply(null,[this.options].extend(arguments));
if(this.addEvent){for(var A in this.options){if($type(this.options[A]=="function")&&(/^on[A-Z]/).test(A)){this.addEvent(A,this.options[A]);}}}return this;
}});Array.extend({forEach:function(C,D){for(var B=0,A=this.length;B<A;B++){C.call(D,this[B],B,this);}},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;},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;},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;},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;},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;},copy:function(D,C){D=D||0;if(D<0){D=this.length+D;}C=C||(this.length-D);var A=[];for(var B=0;B<C;B++){A[B]=this[D++];}return A;},remove:function(C){var B=0;
var A=this.length;while(B<A){if(this[B]===C){this.splice(B,1);A--;}else{B++;}}return this;},contains:function(A,B){return this.indexOf(A,B)!=-1;},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;},extend:function(C){for(var B=0,A=C.length;B<A;B++){this.push(C[B]);}return this;},merge:function(C){for(var B=0,A=C.length;
B<A;B++){this.include(C[B]);}return this;},include:function(A){if(!this.contains(A)){this.push(A);}return this;},getRandom:function(){return this[$random(0,this.length-1)]||null;
},getLast:function(){return this[this.length-1]||null;}});Array.prototype.each=Array.prototype.forEach;Array.each=Array.forEach;function $A(A){return Array.copy(A);
}function $each(C,B,D){if(C&&typeof C.length=="number"&&$type(C)!="object"){Array.forEach(C,B,D);}else{for(var A in C){B.call(D||C,C[A],A);}}}Array.prototype.test=Array.prototype.contains;
String.extend({test:function(A,B){return(($type(A)=="string")?new RegExp(A,B):A).test(this);},toInt:function(){return parseInt(this,10);},toFloat:function(){return parseFloat(this);
},camelCase:function(){return this.replace(/-\D/g,function(A){return A.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/\w[A-Z]/g,function(A){return(A.charAt(0)+"-"+A.charAt(1).toLowerCase());
});},capitalize:function(){return this.replace(/\b[a-z]/g,function(A){return A.toUpperCase();});},trim:function(){return this.replace(/^\s+|\s+$/g,"");
},clean:function(){return this.replace(/\s{2,}/g," ").trim();},rgbToHex:function(B){var A=this.match(/\d{1,3}/g);return(A)?A.rgbToHex(B):false;},hexToRgb:function(B){var A=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
return(A)?A.slice(1).hexToRgb(B):false;},contains:function(A,B){return(B)?(B+this+B).indexOf(B+A+B)>-1:this.indexOf(A)>-1;},escapeRegExp:function(){return this.replace(/([.*+?^${}()|[\]\/\\])/g,"\\$1");
}});Array.extend({rgbToHex:function(D){if(this.length<3){return false;}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("");},hexToRgb:function(C){if(this.length!=3){return false;}var A=[];
for(var B=0;B<3;B++){A.push(parseInt((this[B].length==1)?this[B]+this[B]:this[B],16));}return C?A:"rgb("+A.join(",")+")";}});Function.extend({create:function(A){var B=this;
A=$merge({bind:B,event:false,"arguments":null,delay:false,periodical:false,attempt:false},A);if($chk(A.arguments)&&$type(A.arguments)!="array"){A.arguments=[A.arguments];
}return function(E){var C;if(A.event){E=E||window.event;C=[(A.event===true)?E:new A.event(E)];if(A.arguments){C.extend(A.arguments);}}else{C=A.arguments||arguments;
}var F=function(){return B.apply($pick(A.bind,B),C);};if(A.delay){return setTimeout(F,A.delay);}if(A.periodical){return setInterval(F,A.periodical);}if(A.attempt){try{return F();
}catch(D){return false;}}return F();};},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});},bindAsEventListener: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})();
}});Number.extend({toInt:function(){return parseInt(this);},toFloat:function(){return parseFloat(this);},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){for(var A=0;A<this;A++){B(A);}}});var Element=new Class({initialize:function(D,C){if($type(D)=="string"){if(window.ie&&C&&(C.name||C.type)){var A=(C.name)?' name="'+C.name+'"':"";
var B=(C.type)?' type="'+C.type+'"':"";delete C.name;delete C.type;D="<"+D+A+B+">";}D=document.createElement(D);}D=$(D);return(!C||!D)?D:D.set(C);}});var Elements=new Class({initialize:function(A){return(A)?$extend(A,this):this;
}});Elements.extend=function(A){for(var B in A){this.prototype[B]=A[B];this[B]=$native.generic(B);}};function $(B){if(!B){return null;}if(B.htmlElement){return Garbage.collect(B);
}if([window,document].contains(B)){return B;}var A=$type(B);if(A=="string"){B=document.getElementById(B);A=(B)?"element":false;}if(A!="element"){return null;
}if(B.htmlElement){return Garbage.collect(B);}if(["object","embed"].contains(B.tagName.toLowerCase())){return B;}$extend(B,Element.prototype);B.htmlElement=function(){};
return Garbage.collect(B);}document.getElementsBySelector=document.getElementsByTagName;function $$(){var D=[];for(var C=0,B=arguments.length;C<B;C++){var A=arguments[C];
switch($type(A)){case"element":D.push(A);case"boolean":break;case false:break;case"string":A=document.getElementsBySelector(A,true);default:D.extend(A);
}}return $$.unique(D);}$$.unique=function(G){var D=[];for(var C=0,A=G.length;C<A;C++){if(G[C].$included){continue;}var B=$(G[C]);if(B&&!B.$included){B.$included=true;
D.push(B);}}for(var F=0,E=D.length;F<E;F++){D[F].$included=null;}return new Elements(D);};Elements.Multi=function(A){return function(){var D=arguments;
var B=[];var G=true;for(var E=0,C=this.length,F;E<C;E++){F=this[E][A].apply(this[E],D);if($type(F)!="element"){G=false;}B.push(F);}return(G)?$$.unique(B):B;
};};Element.extend=function(A){for(var B in A){HTMLElement.prototype[B]=A[B];Element.prototype[B]=A[B];Element[B]=$native.generic(B);var C=(Array.prototype[B])?B+"Elements":B;
Elements.prototype[C]=Elements.Multi(B);}};Element.extend({set:function(A){for(var C in A){var B=A[C];switch(C){case"styles":this.setStyles(B);break;case"events":if(this.addEvents){this.addEvents(B);
}break;case"properties":this.setProperties(B);break;default:this.setProperty(C,B);}}return this;},inject:function(C,A){C=$(C);switch(A){case"before":C.parentNode.insertBefore(this,C);
break;case"after":var B=C.getNext();if(!B){C.parentNode.appendChild(this);}else{C.parentNode.insertBefore(this,B);}break;case"top":var D=C.firstChild;if(D){C.insertBefore(this,D);
break;}default:C.appendChild(this);}return this;},injectBefore:function(A){return this.inject(A,"before");},injectAfter:function(A){return this.inject(A,"after");
},injectInside:function(A){return this.inject(A,"bottom");},injectTop:function(A){return this.inject(A,"top");},adopt:function(){var A=[];$each(arguments,function(B){A=A.concat(B);
});$$(A).inject(this);return this;},remove:function(){return this.parentNode.removeChild(this);},clone:function(C){var B=$(this.cloneNode(C!==false));if(!B.$events){return B;
}B.$events={};for(var A in this.$events){B.$events[A]={keys:$A(this.$events[A].keys),values:$A(this.$events[A].values)};}return B.removeEvents();},replaceWith:function(A){A=$(A);
this.parentNode.replaceChild(A,this);return A;},appendText:function(A){this.appendChild(document.createTextNode(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);},setStyle:function(B,A){switch(B){case"opacity":return this.setOpacity(parseFloat(A));
case"float":B=(window.ie)?"styleFloat":"cssFloat";}B=B.camelCase();switch($type(A)){case"number":if(!["zIndex","zoom"].contains(B)){A+="px";}break;case"array":A="rgb("+A.join(",")+")";
}this.style[B]=A;return this;},setStyles:function(A){switch($type(A)){case"object":Element.setMany(this,"setStyle",A);break;case"string":this.style.cssText=A;
}return this;},setOpacity:function(A){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(window.ie){this.style.filter=(A==1)?"":"alpha(opacity="+A*100+")";}this.style.opacity=this.$tmp.opacity=A;
return this;},getStyle:function(C){C=C.camelCase();var A=this.style[C];if(!$chk(A)){if(C=="opacity"){return this.$tmp.opacity;}A=[];for(var B in Element.Styles){if(C==B){Element.Styles[B].each(function(F){var E=this.getStyle(F);
A.push(parseInt(E)?E:"0px");},this);if(C=="border"){var D=A.every(function(E){return(E==A[0]);});return(D)?A[0]:false;}return A.join(" ");}}if(C.contains("border")){if(Element.Styles.border.contains(C)){return["Width","Style","Color"].map(function(E){return this.getStyle(C+E);
},this).join(" ");}else{if(Element.borderShort.contains(C)){return["Top","Right","Bottom","Left"].map(function(E){return this.getStyle("border"+E+C.replace("border",""));
},this).join(" ");}}}if(document.defaultView){A=document.defaultView.getComputedStyle(this,null).getPropertyValue(C.hyphenate());}else{if(this.currentStyle){A=this.currentStyle[C];
}}}if(window.ie){A=Element.fixStyle(C,A,this);}if(A&&C.test(/color/i)&&A.contains("rgb")){return A.split("rgb").splice(1,4).map(function(E){return E.rgbToHex();
}).join(" ");}return A;},getStyles:function(){return Element.getMany(this,"getStyle",arguments);},walk:function(A,C){A+="Sibling";var B=(C)?this[C]:this[A];
while(B&&$type(B)!="element"){B=B[A];}return $(B);},getPrevious:function(){return this.walk("previous");},getNext:function(){return this.walk("next");},getFirst:function(){return this.walk("next","firstChild");
},getLast:function(){return this.walk("previous","lastChild");},getParent:function(){return $(this.parentNode);},getChildren:function(){return $$(this.childNodes);
},hasChild:function(A){return !!$A(this.getElementsByTagName("*")).contains(A);},getProperty:function(D){var B=Element.Properties[D];if(B){return this[B];
}var A=Element.PropertiesIFlag[D]||0;if(!window.ie||A){return this.getAttribute(D,A);}var C=this.attributes[D];return(C)?C.nodeValue:null;},removeProperty:function(B){var A=Element.Properties[B];
if(A){this[A]="";}else{this.removeAttribute(B);}return this;},getProperties:function(){return Element.getMany(this,"getProperty",arguments);},setProperty:function(C,B){var A=Element.Properties[C];
if(A){this[A]=B;}else{this.setAttribute(C,B);}return this;},setProperties:function(A){return Element.setMany(this,"setProperty",A);},setHTML:function(){this.innerHTML=$A(arguments).join("");
return this;},setText:function(B){var A=this.getTag();if(["style","script"].contains(A)){if(window.ie){if(A=="style"){this.styleSheet.cssText=B;}else{if(A=="script"){this.setProperty("text",B);
}}return this;}else{this.removeChild(this.firstChild);return this.appendText(B);}}this[$defined(this.innerText)?"innerText":"textContent"]=B;return this;
},getText:function(){var A=this.getTag();if(["style","script"].contains(A)){if(window.ie){if(A=="style"){return this.styleSheet.cssText;}else{if(A=="script"){return this.getProperty("text");
}}}else{return this.innerHTML;}}return($pick(this.innerText,this.textContent));},getTag:function(){return this.tagName.toLowerCase();},empty:function(){Garbage.trash(this.getElementsByTagName("*"));
return this.setHTML("");}});Element.fixStyle=function(E,A,D){if($chk(parseInt(A))){return A;}if(["height","width"].contains(E)){var B=(E=="width")?["left","right"]:["top","bottom"];
var C=0;B.each(function(F){C+=D.getStyle("border-"+F+"-width").toInt()+D.getStyle("padding-"+F).toInt();});return D["offset"+E.capitalize()]-C+"px";}else{if(E.test(/border(.+)Width|margin|padding/)){return"0px";
}}return A;};Element.Styles={border:[],padding:[],margin:[]};["Top","Right","Bottom","Left"].each(function(B){for(var A in Element.Styles){Element.Styles[A].push(A+B);
}});Element.borderShort=["borderWidth","borderStyle","borderColor"];Element.getMany=function(B,D,C){var A={};$each(C,function(E){A[E]=B[D](E);});return A;
};Element.setMany=function(B,D,C){for(var A in C){B[D](A,C[A]);}return B;};Element.Properties=new Abstract({"class":"className","for":"htmlFor",colspan:"colSpan",rowspan:"rowSpan",accesskey:"accessKey",tabindex:"tabIndex",maxlength:"maxLength",readonly:"readOnly",frameborder:"frameBorder",value:"value",disabled:"disabled",checked:"checked",multiple:"multiple",selected:"selected"});
Element.PropertiesIFlag={href:2,src:2};Element.Methods={Listeners:{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;}}};window.extend(Element.Methods.Listeners);document.extend(Element.Methods.Listeners);Element.extend(Element.Methods.Listeners);var Garbage={elements:[],collect:function(A){if(!A.$tmp){Garbage.elements.push(A);
A.$tmp={opacity:1};}return A;},trash:function(D){for(var B=0,A=D.length,C;B<A;B++){if(!(C=D[B])||!C.$tmp){continue;}if(C.$events){C.fireEvent("trash").removeEvents();
}for(var E in C.$tmp){C.$tmp[E]=null;}for(var F in Element.prototype){C[F]=null;}Garbage.elements[Garbage.elements.indexOf(C)]=null;C.htmlElement=C.$tmp=C=null;
}Garbage.elements.remove(null);},empty:function(){Garbage.collect(window);Garbage.collect(document);Garbage.trash(Garbage.elements);}};window.addListener("beforeunload",function(){window.addListener("unload",Garbage.empty);
if(window.ie){window.addListener("unload",CollectGarbage);}});var Event=new Class({initialize:function(C){if(C&&C.$extended){return C;}this.$extended=true;
C=C||window.event;this.event=C;this.type=C.type;this.target=C.target||C.srcElement;if(this.target.nodeType==3){this.target=this.target.parentNode;}this.shift=C.shiftKey;
this.control=C.ctrlKey;this.alt=C.altKey;this.meta=C.metaKey;if(["DOMMouseScroll","mousewheel"].contains(this.type)){this.wheel=(C.wheelDelta)?C.wheelDelta/120:-(C.detail||0)/3;
}else{if(this.type.contains("key")){this.code=C.which||C.keyCode;for(var B in Event.keys){if(Event.keys[B]==this.code){this.key=B;break;}}if(this.type=="keydown"){var A=this.code-111;
if(A>0&&A<13){this.key="f"+A;}}this.key=this.key||String.fromCharCode(this.code).toLowerCase();}else{if(this.type.test(/(click|mouse|menu)/)){this.page={x:C.pageX||C.clientX+document.documentElement.scrollLeft,y:C.pageY||C.clientY+document.documentElement.scrollTop};
this.client={x:C.pageX?C.pageX-window.pageXOffset:C.clientX,y:C.pageY?C.pageY-window.pageYOffset:C.clientY};this.rightClick=(C.which==3)||(C.button==2);
switch(this.type){case"mouseover":this.relatedTarget=C.relatedTarget||C.fromElement;break;case"mouseout":this.relatedTarget=C.relatedTarget||C.toElement;
}this.fixRelatedTarget();}}}return this;},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;}});Event.fix={relatedTarget:function(){if(this.relatedTarget&&this.relatedTarget.nodeType==3){this.relatedTarget=this.relatedTarget.parentNode;
}},relatedTargetGecko:function(){try{Event.fix.relatedTarget.call(this);}catch(A){this.relatedTarget=this.target;}}};Event.prototype.fixRelatedTarget=(window.gecko)?Event.fix.relatedTargetGecko:Event.fix.relatedTarget;
Event.keys=new Abstract({enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46});Element.Methods.Events={addEvent:function(C,B){this.$events=this.$events||{};
this.$events[C]=this.$events[C]||{keys:[],values:[]};if(this.$events[C].keys.contains(B)){return this;}this.$events[C].keys.push(B);var A=C;var D=Element.Events[C];
if(D){if(D.add){D.add.call(this,B);}if(D.map){B=D.map;}if(D.type){A=D.type;}}if(!this.addEventListener){B=B.create({bind:this,event:true});}this.$events[C].values.push(B);
return(Element.NativeEvents.contains(A))?this.addListener(A,B):this;},removeEvent:function(C,B){if(!this.$events||!this.$events[C]){return this;}var F=this.$events[C].keys.indexOf(B);
if(F==-1){return this;}var A=this.$events[C].keys.splice(F,1)[0];var E=this.$events[C].values.splice(F,1)[0];var D=Element.Events[C];if(D){if(D.remove){D.remove.call(this,B);
}if(D.type){C=D.type;}}return(Element.NativeEvents.contains(C))?this.removeListener(C,E):this;},addEvents:function(A){return Element.setMany(this,"addEvent",A);
},removeEvents:function(A){if(!this.$events){return this;}if(!A){for(var B in this.$events){this.removeEvents(B);}this.$events=null;}else{if(this.$events[A]){this.$events[A].keys.each(function(C){this.removeEvent(A,C);
},this);this.$events[A]=null;}}return this;},fireEvent:function(C,B,A){if(this.$events&&this.$events[C]){this.$events[C].keys.each(function(D){D.create({bind:this,delay:A,"arguments":B})();
},this);}return this;},cloneEvents:function(C,A){if(!C.$events){return this;}if(!A){for(var B in C.$events){this.cloneEvents(C,B);}}else{if(C.$events[A]){C.$events[A].keys.each(function(D){this.addEvent(A,D);
},this);}}return this;}};window.extend(Element.Methods.Events);document.extend(Element.Methods.Events);Element.extend(Element.Methods.Events);Element.Events=new Abstract({mouseenter:{type:"mouseover",map:function(A){A=new Event(A);
if(A.relatedTarget!=this&&!this.hasChild(A.relatedTarget)){this.fireEvent("mouseenter",A);}}},mouseleave:{type:"mouseout",map:function(A){A=new Event(A);
if(A.relatedTarget!=this&&!this.hasChild(A.relatedTarget)){this.fireEvent("mouseleave",A);}}},mousewheel:{type:(window.gecko)?"DOMMouseScroll":"mousewheel"}});
Element.NativeEvents=["click","dblclick","mouseup","mousedown","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","keydown","keypress","keyup","load","unload","beforeunload","resize","move","focus","blur","change","submit","reset","select","error","abort","contextmenu","scroll"];
Function.extend({bindWithEvent:function(B,A){return this.create({bind:B,"arguments":A,event:Event});}});Elements.extend({filterByTag:function(A){return new Elements(this.filter(function(B){return(Element.getTag(B)==A);
}));},filterByClass:function(A,C){var B=this.filter(function(D){return(D.className&&D.className.contains(A," "));});return(C)?B:new Elements(B);},filterById:function(C,B){var A=this.filter(function(D){return(D.id==C);
});return(B)?A:new Elements(A);},filterByAttribute:function(B,A,D,E){var C=this.filter(function(F){var G=Element.getProperty(F,B);if(!G){return false;}if(!A){return true;
}switch(A){case"=":return(G==D);case"*=":return(G.contains(D));case"^=":return(G.substr(0,D.length)==D);case"$=":return(G.substr(G.length-D.length)==D);
case"!=":return(G!=D);case"~=":return G.contains(D," ");}return false;});return(E)?C:new Elements(C);}});function $E(A,B){return($(B)||document).getElement(A);
}function $ES(A,B){return($(B)||document).getElementsBySelector(A);}$$.shared={regexp:/^(\w*|\*)(?:#([\w-]+)|\.([\w-]+))?(?:\[(\w+)(?:([!*^$]?=)["']?([^"'\]]*)["']?)?])?$/,xpath:{getParam:function(B,D,E,C){var A=[D.namespaceURI?"xhtml:":"",E[1]];
if(E[2]){A.push('[@id="',E[2],'"]');}if(E[3]){A.push('[contains(concat(" ", @class, " "), " ',E[3],' ")]');}if(E[4]){if(E[5]&&E[6]){switch(E[5]){case"*=":A.push("[contains(@",E[4],', "',E[6],'")]');
break;case"^=":A.push("[starts-with(@",E[4],', "',E[6],'")]');break;case"$=":A.push("[substring(@",E[4],", string-length(@",E[4],") - ",E[6].length,' + 1) = "',E[6],'"]');
break;case"=":A.push("[@",E[4],'="',E[6],'"]');break;case"!=":A.push("[@",E[4],'!="',E[6],'"]');}}else{A.push("[@",E[4],"]");}}B.push(A.join(""));return B;
},getItems:function(B,E,G){var F=[];var A=document.evaluate(".//"+B.join("//"),E,$$.shared.resolver,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);for(var D=0,C=A.snapshotLength;
D<C;D++){F.push(A.snapshotItem(D));}return(G)?F:new Elements(F.map($));}},normal:{getParam:function(A,C,E,B){if(B==0){if(E[2]){var D=C.getElementById(E[2]);
if(!D||((E[1]!="*")&&(Element.getTag(D)!=E[1]))){return false;}A=[D];}else{A=$A(C.getElementsByTagName(E[1]));}}else{A=$$.shared.getElementsByTagName(A,E[1]);
if(E[2]){A=Elements.filterById(A,E[2],true);}}if(E[3]){A=Elements.filterByClass(A,E[3],true);}if(E[4]){A=Elements.filterByAttribute(A,E[4],E[5],E[6],true);
}return A;},getItems:function(A,B,C){return(C)?A:$$.unique(A);}},resolver:function(A){return(A=="xhtml")?"http://www.w3.org/1999/xhtml":false;},getElementsByTagName:function(D,C){var E=[];
for(var B=0,A=D.length;B<A;B++){E.extend(D[B].getElementsByTagName(C));}return E;}};$$.shared.method=(window.xpath)?"xpath":"normal";Element.Methods.Dom={getElements:function(A,H){var C=[];
A=A.trim().split(" ");for(var E=0,D=A.length;E<D;E++){var F=A[E];var G=F.match($$.shared.regexp);if(!G){break;}G[1]=G[1]||"*";var B=$$.shared[$$.shared.method].getParam(C,this,G,E);
if(!B){break;}C=B;}return $$.shared[$$.shared.method].getItems(C,this,H);},getElement:function(A){return $(this.getElements(A,true)[0]||false);},getElementsBySelector:function(A,E){var D=[];
A=A.split(",");for(var C=0,B=A.length;C<B;C++){D=D.concat(this.getElements(A[C],true));}return(E)?D:$$.unique(D);}};Element.extend({getElementById:function(C){var B=document.getElementById(C);
if(!B){return false;}for(var A=B.parentNode;A!=this;A=A.parentNode){if(!A){return false;}}return B;},getElementsByClassName:function(A){return this.getElements("."+A);
}});document.extend(Element.Methods.Dom);Element.extend(Element.Methods.Dom);Element.extend({getValue:function(){switch(this.getTag()){case"select":var A=[];
$each(this.options,function(B){if(B.selected){A.push($pick(B.value,B.text));}});return(this.multiple)?A:A[0];case"input":if(!(this.checked&&["checkbox","radio"].contains(this.type))&&!["hidden","text","password"].contains(this.type)){break;
}case"textarea":return this.value;}return false;},getFormElements:function(){return $$(this.getElementsByTagName("input"),this.getElementsByTagName("select"),this.getElementsByTagName("textarea"));
},toQueryString:function(){var A=[];this.getFormElements().each(function(D){var C=D.name;var E=D.getValue();if(E===false||!C||D.disabled){return ;}var B=function(F){A.push(C+"="+encodeURIComponent(F));
};if($type(E)=="array"){E.each(B);}else{B(E);}});return A.join("&");}});Element.extend({scrollTo:function(A,B){this.scrollLeft=A;this.scrollTop=B;},getSize:function(){return{scroll:{x:this.scrollLeft,y:this.scrollTop},size:{x:this.offsetWidth,y:this.offsetHeight},scrollSize:{x:this.scrollWidth,y:this.scrollHeight}};
},getPosition:function(A){A=A||[];var B=this,D=0,C=0;do{D+=B.offsetLeft||0;C+=B.offsetTop||0;B=B.offsetParent;}while(B);A.each(function(E){D-=E.scrollLeft||0;
C-=E.scrollTop||0;});return{x:D,y:C};},getTop:function(A){return this.getPosition(A).y;},getLeft:function(A){return this.getPosition(A).x;},getCoordinates:function(B){var A=this.getPosition(B);
var C={width:this.offsetWidth,height:this.offsetHeight,left:A.x,top:A.y};C.right=C.left+C.width;C.bottom=C.top+C.height;return C;}});Element.Events.domready={add:function(B){if(window.loaded){B.call(this);
return ;}var A=function(){if(window.loaded){return ;}window.loaded=true;window.timer=$clear(window.timer);this.fireEvent("domready");}.bind(this);if(document.readyState&&window.webkit){window.timer=function(){if(["loaded","complete"].contains(document.readyState)){A();
}}.periodical(50);}else{if(document.readyState&&window.ie){if(!$("ie_ready")){var C=(window.location.protocol=="https:")?"://0":"javascript:void(0)";document.write('<script id="ie_ready" defer src="'+C+'"><\/script>');
$("ie_ready").onreadystatechange=function(){if(this.readyState=="complete"){A();}};}}else{window.addListener("load",A);document.addListener("DOMContentLoaded",A);
}}}};window.onDomReady=function(A){return this.addEvent("domready",A);};window.extend({getWidth:function(){if(this.webkit419){return this.innerWidth;}if(this.opera){return document.body.clientWidth;
}return document.documentElement.clientWidth;},getHeight:function(){if(this.webkit419){return this.innerHeight;}if(this.opera){return document.body.clientHeight;
}return document.documentElement.clientHeight;},getScrollWidth:function(){if(this.ie){return Math.max(document.documentElement.offsetWidth,document.documentElement.scrollWidth);
}if(this.webkit){return document.body.scrollWidth;}return document.documentElement.scrollWidth;},getScrollHeight:function(){if(this.ie){return Math.max(document.documentElement.offsetHeight,document.documentElement.scrollHeight);
}if(this.webkit){return document.body.scrollHeight;}return document.documentElement.scrollHeight;},getScrollLeft:function(){return this.pageXOffset||document.documentElement.scrollLeft;
},getScrollTop:function(){return this.pageYOffset||document.documentElement.scrollTop;},getSize:function(){return{size:{x:this.getWidth(),y:this.getHeight()},scrollSize:{x:this.getScrollWidth(),y:this.getScrollHeight()},scroll:{x:this.getScrollLeft(),y:this.getScrollTop()}};
},getPosition:function(){return{x:0,y:0};}});var Fx={};Fx.Base=new Class({options:{onStart:Class.empty,onComplete:Class.empty,onCancel:Class.empty,transition:function(A){return -(Math.cos(Math.PI*A)-1)/2;
},duration:500,unit:"px",wait:true,fps:50},initialize:function(A){this.element=this.element||null;this.setOptions(A);if(this.options.initialize){this.options.initialize.call(this);
}},step:function(){var A=$time();if(A<this.time+this.options.duration){this.delta=this.options.transition((A-this.time)/this.options.duration);this.setNow();
this.increase();}else{this.stop(true);this.set(this.to);this.fireEvent("onComplete",this.element,10);this.callChain();}},set:function(A){this.now=A;this.increase();
return this;},setNow:function(){this.now=this.compute(this.from,this.to);},compute:function(B,A){return(A-B)*this.delta+B;},start:function(B,A){if(!this.options.wait){this.stop();
}else{if(this.timer){return this;}}this.from=B;this.to=A;this.change=this.to-this.from;this.time=$time();this.timer=this.step.periodical(Math.round(1000/this.options.fps),this);
this.fireEvent("onStart",this.element);return this;},stop:function(A){if(!this.timer){return this;}this.timer=$clear(this.timer);if(!A){this.fireEvent("onCancel",this.element);
}return this;},custom:function(B,A){return this.start(B,A);},clearTimer:function(A){return this.stop(A);}});Fx.Base.implement(new Chain,new Events,new Options);
Fx.CSS={select:function(B,C){if(B.test(/color/i)){return this.Color;}var A=$type(C);if((A=="array")||(A=="string"&&C.contains(" "))){return this.Multi;
}return this.Single;},parse:function(C,D,A){if(!A.push){A=[A];}var F=A[0],E=A[1];if(!$chk(E)){E=F;F=C.getStyle(D);}var B=this.select(D,E);return{from:B.parse(F),to:B.parse(E),css:B};
}};Fx.CSS.Single={parse:function(A){return parseFloat(A);},getNow:function(C,B,A){return A.compute(C,B);},getValue:function(C,A,B){if(A=="px"&&B!="opacity"){C=Math.round(C);
}return C+A;}};Fx.CSS.Multi={parse:function(A){return A.push?A:A.split(" ").map(function(B){return parseFloat(B);});},getNow:function(E,D,C){var A=[];for(var B=0;
B<E.length;B++){A[B]=C.compute(E[B],D[B]);}return A;},getValue:function(C,A,B){if(A=="px"&&B!="opacity"){C=C.map(Math.round);}return C.join(A+" ")+A;}};
Fx.CSS.Color={parse:function(A){return A.push?A:A.hexToRgb(true);},getNow:function(E,D,C){var A=[];for(var B=0;B<E.length;B++){A[B]=Math.round(C.compute(E[B],D[B]));
}return A;},getValue:function(A){return"rgb("+A.join(",")+")";}};Fx.Style=Fx.Base.extend({initialize:function(B,C,A){this.element=$(B);this.property=C;
this.parent(A);},hide:function(){return this.set(0);},setNow:function(){this.now=this.css.getNow(this.from,this.to,this);},set:function(A){this.css=Fx.CSS.select(this.property,A);
return this.parent(this.css.parse(A));},start:function(C,B){if(this.timer&&this.options.wait){return this;}var A=Fx.CSS.parse(this.element,this.property,[C,B]);
this.css=A.css;return this.parent(A.from,A.to);},increase:function(){this.element.setStyle(this.property,this.css.getValue(this.now,this.options.unit,this.property));
}});Element.extend({effect:function(B,A){return new Fx.Style(this,B,A);}});Fx.Elements=Fx.Base.extend({initialize:function(B,A){this.elements=$$(B);this.parent(A);
},setNow:function(){for(var C in this.from){var F=this.from[C],E=this.to[C],B=this.css[C],A=this.now[C]={};for(var D in F){A[D]=B[D].getNow(F[D],E[D],this);
}}},set:function(G){var B={};this.css={};for(var D in G){var F=G[D],C=this.css[D]={},A=B[D]={};for(var E in F){C[E]=Fx.CSS.select(E,F[E]);A[E]=C[E].parse(F[E]);
}}return this.parent(B);},start:function(D){if(this.timer&&this.options.wait){return this;}this.now={};this.css={};var I={},J={};for(var E in D){var G=D[E],A=I[E]={},H=J[E]={},C=this.css[E]={};
for(var B in G){var F=Fx.CSS.parse(this.elements[E],B,G[B]);A[B]=F.from;H[B]=F.to;C[B]=F.css;}}return this.parent(I,J);},increase:function(){for(var C in this.now){var A=this.now[C],B=this.css[C];
for(var D in A){this.elements[C].setStyle(D,B[D].getValue(A[D],this.options.unit,D));}}}});Fx.Slide=Fx.Base.extend({options:{mode:"vertical"},initialize:function(B,A){this.element=$(B);
this.wrapper=new Element("div",{styles:$extend(this.element.getStyles("margin"),{overflow:"hidden"})}).injectAfter(this.element).adopt(this.element);this.element.setStyle("margin",0);
this.setOptions(A);this.now=[];this.parent(this.options);this.open=true;this.addEvent("onComplete",function(){this.open=(this.now[0]===0);});if(window.webkit419){this.addEvent("onComplete",function(){if(this.open){this.element.remove().inject(this.wrapper);
}});}},setNow:function(){for(var A=0;A<2;A++){this.now[A]=this.compute(this.from[A],this.to[A]);}},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;},slideIn:function(A){this[A||this.options.mode]();
return this.start([this.element.getStyle(this.margin).toInt(),this.wrapper.getStyle(this.layout).toInt()],[0,this.offset]);},slideOut:function(A){this[A||this.options.mode]();
return this.start([this.element.getStyle(this.margin).toInt(),this.wrapper.getStyle(this.layout).toInt()],[-this.offset,0]);},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){if(this.wrapper.offsetHeight==0||this.wrapper.offsetWidth==0){return this.slideIn(A);
}return this.slideOut(A);},increase:function(){this.element.setStyle(this.margin,this.now[0]+this.options.unit);this.wrapper.setStyle(this.layout,this.now[1]+this.options.unit);
}});Fx.Transition=function(B,A){A=A||[];if($type(A)!="array"){A=[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 Abstract({linear:function(A){return A;}});Fx.Transitions.extend=function(A){for(var B in A){Fx.Transitions[B]=new Fx.Transition(A[B]);
Fx.Transitions.compat(B);}};Fx.Transitions.compat=function(A){["In","Out","InOut"].each(function(B){Fx.Transitions[A.toLowerCase()+B]=Fx.Transitions[A]["ease"+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]);});Fx.Transitions.compat(B);
});var Drag={};Drag.Base=new Class({options:{handle:false,unit:"px",onStart:Class.empty,onBeforeStart:Class.empty,onComplete:Class.empty,onSnap:Class.empty,onDrag:Class.empty,limit:false,modifiers:{x:"left",y:"top"},grid:false,snap:6},initialize:function(B,A){this.setOptions(A);
this.element=$(B);this.handle=$(this.options.handle)||this.element;this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.bound={start:this.start.bindWithEvent(this),check:this.check.bindWithEvent(this),drag:this.drag.bindWithEvent(this),stop:this.stop.bind(this)};
this.attach();if(this.options.initialize){this.options.initialize.call(this);}},attach:function(){this.handle.addEvent("mousedown",this.bound.start);return this;
},detach:function(){this.handle.removeEvent("mousedown",this.bound.start);return this;},start:function(C){this.fireEvent("onBeforeStart",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;}this.value.now[D]=this.element.getStyle(this.options.modifiers[D]).toInt();
this.mouse.pos[D]=C.page[D]-this.value.now[D];if(A&&A[D]){for(var B=0;B<2;B++){if($chk(A[D][B])){this.limit[D][B]=($type(A[D][B])=="function")?A[D][B]():A[D][B];
}}}}if($type(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid};}document.addListener("mousemove",this.bound.check);
document.addListener("mouseup",this.bound.stop);this.fireEvent("onStart",this.element);C.stop();},check:function(A){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){document.removeListener("mousemove",this.bound.check);document.addListener("mousemove",this.bound.drag);this.drag(A);this.fireEvent("onSnap",this.element);
}A.stop();},drag:function(A){this.out=false;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.limit[B]){if($chk(this.limit[B][1])&&(this.value.now[B]>this.limit[B][1])){this.value.now[B]=this.limit[B][1];this.out=true;}else{if($chk(this.limit[B][0])&&(this.value.now[B]<this.limit[B][0])){this.value.now[B]=this.limit[B][0];
this.out=true;}}}if(this.options.grid[B]){this.value.now[B]-=(this.value.now[B]%this.options.grid[B]);}this.element.setStyle(this.options.modifiers[B],this.value.now[B]+this.options.unit);
}this.fireEvent("onDrag",this.element);A.stop();},stop:function(){document.removeListener("mousemove",this.bound.check);document.removeListener("mousemove",this.bound.drag);
document.removeListener("mouseup",this.bound.stop);this.fireEvent("onComplete",this.element);}});Drag.Base.implement(new Events,new Options);Element.extend({makeResizable:function(A){return new Drag.Base(this,$merge({modifiers:{x:"width",y:"height"}},A));
}});Drag.Move=Drag.Base.extend({options:{droppables:[],container:false,overflown:[]},initialize:function(B,A){this.setOptions(A);this.element=$(B);this.droppables=$$(this.options.droppables);
this.container=$(this.options.container);this.position={element:this.element.getStyle("position"),container:false};if(this.container){this.position.container=this.container.getStyle("position");
}if(!["relative","absolute","fixed"].contains(this.position.element)){this.position.element="absolute";}var D=this.element.getStyle("top").toInt();var C=this.element.getStyle("left").toInt();
if(this.position.element=="absolute"&&!["relative","absolute","fixed"].contains(this.position.container)){D=$chk(D)?D:this.element.getTop(this.options.overflown);
C=$chk(C)?C:this.element.getLeft(this.options.overflown);}else{D=$chk(D)?D:0;C=$chk(C)?C:0;}this.element.setStyles({top:D,left:C,position:this.position.element});
this.parent(this.element);},start:function(C){this.overed=null;if(this.container){var A=this.container.getCoordinates();var B=this.element.getCoordinates();
if(this.position.element=="absolute"&&!["relative","absolute","fixed"].contains(this.position.container)){this.options.limit={x:[A.left,A.right-B.width],y:[A.top,A.bottom-B.height]};
}else{this.options.limit={y:[0,A.height-B.height],x:[0,A.width-B.width]};}}this.parent(C);},drag:function(A){this.parent(A);var B=this.out?false:this.droppables.filter(this.checkAgainst,this).getLast();
if(this.overed!=B){if(this.overed){this.overed.fireEvent("leave",[this.element,this]);}this.overed=B?B.fireEvent("over",[this.element,this]):null;}return this;
},checkAgainst:function(B){B=B.getCoordinates(this.options.overflown);var A=this.mouse.now;return(A.x>B.left&&A.x<B.right&&A.y<B.bottom&&A.y>B.top);},stop:function(){if(this.overed&&!this.out){this.overed.fireEvent("drop",[this.element,this]);
}else{this.element.fireEvent("emptydrop",this);}this.parent();return this;}});Element.extend({makeDraggable:function(A){return new Drag.Move(this,A);}});
var XHR=new Class({options:{method:"post",async:true,onRequest:Class.empty,onSuccess:Class.empty,onFailure:Class.empty,urlEncoded:true,encoding:"utf-8",autoCancel:false,headers:{}},setTransport:function(){this.transport=(window.XMLHttpRequest)?new XMLHttpRequest():(window.ie?new ActiveXObject("Microsoft.XMLHTTP"):false);
return this;},initialize:function(A){this.setTransport().setOptions(A);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers={};if(this.options.urlEncoded&&this.options.method=="post"){var B=(this.options.encoding)?"; charset="+this.options.encoding:"";
this.setHeader("Content-type","application/x-www-form-urlencoded"+B);}if(this.options.initialize){this.options.initialize.call(this);}},onStateChange:function(){if(this.transport.readyState!=4||!this.running){return ;
}this.running=false;var A=0;try{A=this.transport.status;}catch(B){}if(this.options.isSuccess.call(this,A)){this.onSuccess();}else{this.onFailure();}this.transport.onreadystatechange=Class.empty;
},isSuccess:function(A){return((A>=200)&&(A<300));},onSuccess:function(){this.response={text:this.transport.responseText,xml:this.transport.responseXML};
this.fireEvent("onSuccess",[this.response.text,this.response.xml]);this.callChain();},onFailure:function(){this.fireEvent("onFailure",this.transport);},setHeader:function(A,B){this.headers[A]=B;
return this;},send:function(A,C){if(this.options.autoCancel){this.cancel();}else{if(this.running){return this;}}this.running=true;if(C&&this.options.method=="get"){A=A+(A.contains("?")?"&":"?")+C;
C=null;}this.transport.open(this.options.method.toUpperCase(),A,this.options.async);this.transport.onreadystatechange=this.onStateChange.bind(this);if((this.options.method=="post")&&this.transport.overrideMimeType){this.setHeader("Connection","close");
}$extend(this.headers,this.options.headers);for(var B in this.headers){try{this.transport.setRequestHeader(B,this.headers[B]);}catch(D){}}this.fireEvent("onRequest");
this.transport.send($pick(C,null));return this;},cancel:function(){if(!this.running){return this;}this.running=false;this.transport.abort();this.transport.onreadystatechange=Class.empty;
this.setTransport();this.fireEvent("onCancel");return this;}});XHR.implement(new Chain,new Events,new Options);var Ajax=XHR.extend({options:{data:null,update:null,onComplete:Class.empty,evalScripts:false,evalResponse:false},initialize:function(B,A){this.addEvent("onSuccess",this.onComplete);
this.setOptions(A);this.options.data=this.options.data||this.options.postBody;if(!["post","get"].contains(this.options.method)){this._method="_method="+this.options.method;
this.options.method="post";}this.parent();this.setHeader("X-Requested-With","XMLHttpRequest");this.setHeader("Accept","text/javascript, text/html, application/xml, text/xml, */*");
this.url=B;},onComplete:function(){if(this.options.update){$(this.options.update).empty().setHTML(this.response.text);}if(this.options.evalScripts||this.options.evalResponse){this.evalScripts();
}this.fireEvent("onComplete",[this.response.text,this.response.xml],20);},request:function(A){A=A||this.options.data;switch($type(A)){case"element":A=$(A).toQueryString();
break;case"object":A=Object.toQueryString(A);}if(this._method){A=(A)?[this._method,A].join("&"):this._method;}return this.send(this.url,A);},evalScripts:function(){var B,A;
if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){A=this.response.text;}else{A=[];var C=/<script[^>]*>([\s\S]*?)<\/script>/gi;
while((B=C.exec(this.response.text))){A.push(B[1]);}A=A.join("\n");}if(A){(window.execScript)?window.execScript(A):window.setTimeout(A,0);}},getHeader:function(A){try{return this.transport.getResponseHeader(A);
}catch(B){}return null;}});Object.toQueryString=function(B){var C=[];for(var A in B){C.push(encodeURIComponent(A)+"="+encodeURIComponent(B[A]));}return C.join("&");
};Element.extend({send:function(A){return new Ajax(this.getProperty("action"),$merge({data:this.toQueryString()},A,{method:"post"})).request();}});var Cookie=new Abstract({options:{domain:false,path:false,duration:false,secure:false},set:function(C,D,B){B=$merge(this.options,B);
D=encodeURIComponent(D);if(B.domain){D+="; domain="+B.domain;}if(B.path){D+="; path="+B.path;}if(B.duration){var A=new Date();A.setTime(A.getTime()+B.duration*24*60*60*1000);
D+="; expires="+A.toGMTString();}if(B.secure){D+="; secure";}document.cookie=C+"="+D;return $extend(B,{key:C,value:D});},get:function(A){var B=document.cookie.match("(?:^|;)\\s*"+A.escapeRegExp()+"=([^;]*)");
return B?decodeURIComponent(B[1]):false;},remove:function(B,A){if($type(B)=="object"){this.set(B.key,"",$merge(B,{duration:-1}));}else{this.set(B,"",$merge(A,{duration:-1}));
}}});var Json={toString:function(C){switch($type(C)){case"string":return'"'+C.replace(/(["\\])/g,"\\$1")+'"';case"array":return"["+C.map(Json.toString).join(",")+"]";
case"object":var A=[];for(var B in C){A.push(Json.toString(B)+":"+Json.toString(C[B]));}return"{"+A.join(",")+"}";case"number":if(isFinite(C)){break;}case false:return"null";
}return String(C);},evaluate:function(str,secure){return(($type(str)!="string")||(secure&&!str.test(/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/)))?null:eval("("+str+")");
}};Json.Remote=XHR.extend({initialize:function(B,A){this.url=B;this.addEvent("onSuccess",this.onComplete);this.parent(A);this.setHeader("X-Request","JSON");
},send:function(A){return this.parent(this.url,"json="+Json.toString(A));},onComplete:function(){this.fireEvent("onComplete",[Json.evaluate(this.response.text,this.options.secure)]);
}});var Asset=new Abstract({javascript:function(C,B){B=$merge({onload:Class.empty},B);var A=new Element("script",{src:C}).addEvents({load:B.onload,readystatechange:function(){if(this.readyState=="complete"){this.fireEvent("load");
}}});delete B.onload;return A.setProperties(B).inject(document.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:Class.empty,onabort:Class.empty,onerror:Class.empty},B);var D=new Image();D.src=C;var A=new Element("img",{src:C});
["load","abort","error"].each(function(E){var F=B["on"+E];delete B["on"+E];A.addEvent(E,function(){this.removeEvent(E,arguments.callee);F.call(this);});
});if(D.width&&D.height){A.fireEvent("load",A,1);}return A.setProperties(B);},images:function(D,C){C=$merge({onComplete:Class.empty,onProgress:Class.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);B++;if(B==D.length){C.onComplete();
}}});A.push(E);});return new Elements(A);}});var Accordion=Fx.Elements.extend({options:{onActive:Class.empty,onBackground:Class.empty,display:0,show:false,height:true,width:false,opacity:true,fixedHeight:false,fixedWidth:false,wait:false,alwaysHide:false},initialize:function(){var C,E,F,B;
$each(arguments,function(I,H){switch($type(I)){case"object":C=I;break;case"element":B=$(I);break;default:var G=$$(I);if(!E){E=G;}else{F=G;}}});this.togglers=E||[];
this.elements=F||[];this.container=$(B);this.setOptions(C);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 D=0,A=this.togglers.length;D<A;D++){this.addSection(this.togglers[D],this.elements[D]);}this.elements.each(function(H,G){if(this.options.show===G){this.fireEvent("onActive",[this.togglers[G],H]);
}else{for(var I in this.effects){H.setStyle(I,0);}}},this);this.parent(this.elements);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.injectBefore(this.togglers[G]);C.injectAfter(E);}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?"onBackground":"onActive",[this.togglers[D],E]);
for(var F in this.effects){B[D][F]=C?0:E[this.effects[F]];}},this);return this.start(B);},showThisHideOpen:function(A){return this.display(A);}});Fx.Accordion=Accordion;

/*
Script: extensions.js
  Contains <StringBuffer>, <Table>, <Autocompleter.Ajax.Json2>, <TabSet>

License:
  not free for public use
*/

/*
Class: StringBuffer
  Small implementation of a string buffer.
*/
var StringBuffer = new Class({
  initialize: function(str) {
    this.strings = new Array();
    if (str) this.append(str);
  },

  append: function(str) {
    this.strings.push(str);
    return this;
  },

  toString: function() {
    return this.strings.join('');
  },

  isEmpty: function () {
    return this.strings.length == 0;
  }
});

Cookie.extend({
	set: function(key, value, options){
		options = $merge(this.options, options);
		value = encodeURIComponent(value);
		if (options.domain) value += '; domain=' + options.domain;
		if (options.path) value += '; path=' + options.path;
		if (options.duration){
			var date = new Date();
			date.setTime(date.getTime() + options.duration * 24 * 60 * 60 * 1000);
			value += '; expires=' + date.toGMTString();
		}
		if (options.time){
			var date = new Date();
			date.setTime(date.getTime() + options.time * 1000);
			value += '; expires=' + date.toGMTString();
		}
		if (options.secure) value += '; secure';
		document.cookie = key + '=' + value;
		return $extend(options, {'key': key, 'value': value});
	},

	exist: function(key){
		return document.cookie.match('(?:^|;)\\s*' + key.escapeRegExp() + '=([^;]*)') != null;
	},

    // Like Cookie.get, but doesn't try to decodeURIComponent (fails on some of our cookies)
    getRaw: function(key) {
        var val = document.cookie.match('(?:^|;)\\s*' + key.escapeRegExp() + '=([^;]*)');
        return val ? val[1] : false;
    }
});

Ajax.prototype._initialize = Ajax.prototype.initialize;
Ajax.prototype.initialize = function(url, options){
  // force URLs to be absolute to fix issue with BASE tag on geo-hostnames
  if (!/^http/.test(url)) {
    url = window.location.protocol + '//' + window.location.host + url;
  }
  else if (/^(\w+):\/\/([\w.]+)\/(.*)/.test(url) &&  RegExp.$2 != window.location.host) {
    url = RegExp.$1 + '://' + window.location.host + '/' + RegExp.$3;
  }
  return this._initialize(url, options);
}

Element.extend({
  getParents: function(selector){
    return $$(selector || '').filter(function(el){
      return (el.hasChild(this));}, this).reverse();
  },

  getParent: function(selector){
    if (!selector) return $(this.parentNode);
    return this.getParents(selector)[0] || this;
  },

  getLastElement: function(selector){
    return $(this.getElements(selector, true).reverse()[0] || false);
  },

  centerOnScreen: function(){
    var s = this.getCoordinates();
    this.style.left = Math.round((Window.getWidth() - s.width) / 2) + Window.getScrollLeft() + 'px';
    this.style.top  = Math.round((Window.getHeight() - s.height) / 2) + Window.getScrollTop() + 'px';
  },

  positionOnScreen: function(left, top){
    this.style.left = Window.getScrollLeft() + left + 'px';
    this.style.top  = Window.getScrollTop() + top + 'px';
  },

  contains: function(evnt){
    evnt = new Event(evnt);
    var s = this.getCoordinates();
    return (evnt.page.y >= s.top &&
            evnt.page.y <= s.bottom &&
            evnt.page.x >= s.left &&
            evnt.page.x <= s.right);
  },

  overlaps: function(elmt){
    var c = this.getCoordinates();
    var e = elmt.getCoordinates();
    var inH = (e.left > c.left && e.left < c.right) || (e.right > c.left && e.right < c.right);
    var top = e.top > c.top && e.top < c.bottom;
    var btm = e.bottom > c.top && e.bottom < c.bottom;
    return (top && inH) || (btm && inH);
  },

  // linkify caries the class from the element being replaced forward to the new 'a' tag
  linkify: function(){
    var a = this.replaceWith(new Element('a', {'class': this.className, href: 'javascript:;'})).setHTML(this.innerHTML);
    _processLink(a);
    return a;
  },

  setContent: function(content) {
    if (content instanceof Array) content.each( function(v) { this.adopt($(v)); }, this );
    // IDs are case insensitive in IE
    // don't get an element by id, just check if its already an element
    else if ($type(content) == 'element') this.adopt($(content));
    else this.setHTML(content);
    return this;
  },

  hidden: function() {
    return this.getStyle('display') == 'none';
  },

  show: function() {
    return this.setStyle('display', 'block');
  },

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

  inDocument: function() {
    return this.parentNode != null && this.parentNode.nodeType != 11;
  }
});

/*
Class: Table

Options:
  properties - (object) properties to set on the table
  rows - (array) table contents
*/
// TODO should this extend element with overrides so it can be injected and so forth?
var Table = new Class({
  options: {
    properties: {
      cellpadding: 0,
      cellspacing: 0,
      border: 0
    },
    rows: []
  },

  initialize: function(options) {
    this.setOptions(options);
    this.table = new Element('table').setProperties(this.options.properties);
    this.tbody = new Element('tbody').injectInside(this.table);
    this.options.rows.each(this.push.bind(this));
  },



  /*
  Property: pushCaption
  */
  // TODO should be set caption and only allow one
  pushCaption: function(content) {
    new Element('caption').setContent(content).injectTop(this.table);
    return this;
  }
});
Table.implement(new Options);


/*
Class: TabSet
  The TabSet class creates a group of elements that are toggled when their handles are clicked. When one element toggles in, the others toggle back.

Arguments:
  togglers - required, a collection of elements, the elements handlers that will be clickable.
  elements - required, a collection of elements the transitions will be applied to.
  options - optional, see options below, and <Fx.Base> options and events.

Options:
  show - integer, the Index of the element to show at start.

Events:
  onActive - function to execute when an element starts to show
  onBackground - function to execute when an element starts to hide
*/
var TabSet = new Class({
  options: {
    onActive: Class.empty,
    onBackground: Class.empty,
    show: 0
  },

  initialize: function() {
    var options, togglers, elements;
    $each(arguments, function(argument, i){
      switch($type(argument)){
        case 'object': options = argument; break;
        default:
          var temp = $$(argument);
          if (!togglers) togglers = temp;
          else elements = temp;
      }
    });
    this.togglers = togglers || [];
    this.elements = elements || [];
    this.setOptions(options);
    this.elements.each(function(el, i){
      this.togglers[i].addEvent('click', this.display.bind(this, i));
      if (this.options.show === i){
        el.show();
        this.previous = i;
        this.fireEvent('onActive', [this.togglers[i], el]);
      } else {
        el.hide();
      }
    }, this);
  },

  /*
  Property: display
    Shows a specific section and hides all others. Useful when triggering a tab from outside.

  Arguments:
    index - integer, the index of the item to show, or the actual element to show.
  */

  display: function(index) {
    if (this.previous || this.previous === 0) {
      this.fireEvent('onBackground', [this.togglers[this.previous], this.elements[this.previous]]);
      this.elements[this.previous].hide();
    }
    this.previous = index;
    this.fireEvent('onActive', [this.togglers[index], this.elements[index]]);
    this.elements[index].show();
    return this;
  }
});
TabSet.implement(new Events, new Options);


/*
Script: Behavior.js
  Behavior rules and related functions.
  Contains: <Behavior>
*/

var rules = {};
var rulesN = {};
var ajaxRules = {};

/*
Class: Behavior
  Custom class to help manage behavior stylish rules. Use register to register
  rules at page loading. Use reload to re-apply rules on element updated after
  an AJAX update.
 */
var Behavior = new Class({
  /*
  Property: register
    Applies the rules to the current DOM.

  Arguments:
    rules - (array) map of selectors to the functions that operate on them
  */
  register: function(rules){
    this.rules = rules;
    for (var i in this.rules) {
      this.reload(i);
    }

    for (var id in rulesN) {
      this.reloadN(id);
    }

    return this;
  },

  /*
  Property: reload
    Applies a single rule to the current DOM

  Arguments:
    rule - (string) selector that should be applied
  */
  reload: function(rule){
    elements = $$(rule);
    for(y=0;y<elements.length;y++){
      this.rules[rule](elements[y]);
    }
    return elements.length;
  },
  
  reloadN: function(id){
    var i = 0;
    while (n=$(id+(i++))) {
      rulesN[id](n);
    }
    return i - 1;
  },

  /*
  Property: apply
    Applies all registered rules to a subset of the DOM
  
  Arguments:
    elmt - (Element) DOM node to apply rules to
   */
  apply: function(elmt){

    // Process links - don't use rules[] because it is too slow for links.
    processLinks(elmt);

    for (var rule in this.rules) {
      window.applyLastRule = rule;
      elmt.getElements(rule).each(function(e){
        this.rules[rule](e);
      }, this);
    }

    for (var rule in ajaxRules) {
      window.applyLastRule = rule;
      elmt.getElements(rule).each(function(e){
        ajaxRules[rule](e);
      }, this);
    }
  }
});
window.behavior = new Behavior();


// func: doCookieCheck
//   Checks whether session cookies are accepted
//
// Returns:
//   true if session cookies are allowed
//
function doCookieCheck()
{
	// Session cookies not accepted
  Cookie.set('SessionTest', 'true', {duration: 0});
  if (Cookie.get('SessionTest')) {
    Cookie.remove('SessionTest');
    return true;
  }
  return false;
}
if (window.showPopup) showPopup();

window.addEvent('load', function() {
  Cookie.remove('NPID');

  //internet explorer fires onload event for every iframe, we only want top window
  if(window == window.top) {  
    var c = Cookie.get('ajaxAction');
    if (c) {
      Cookie.remove('ajaxAction', {domain:cookieDomain, path:"/"});
      c = c.split('|');
      if (window[c[0]]) window[c[0]](c[1]);// 0 - function to call, 1 - parameter as a string
    }
  }

  // Firefox and Safari calculate the scroll offset before content is collapsed
  // so make sure to scroll to the proper place once everything is loaded
  if (window.gecko || window.webkit) { 
    var id = window.location.hash;
    if (id.length > 1) id = id.substring(1);
    var t = $(id);
    if (t && t.getTop() != window.getScrollTop()) window.scrollTo(0, t.getTop());
  }
  
  // show any DHTML popup from the PopupManager.java
  if (typeof showDHTMLPopupOnLoad != "undefined") {
      showDHTMLPopupOnLoad();
  }
  
  if (typeof cpu_run != "undefined") cpu_run();
});

// Define the ready event - the point at which to load the behavior.
// This may need to be load instead of domready with cerain badly-behaving ads.
TAReadyEvent = window.TAReadyEvent || "domready";

// apply the rules when the DOM is ready.
window.addEvent(TAReadyEvent, behaviorFunction);

function behaviorFunction()
{
  // hide some elements
  if (window.hideOnLoad) $A(hideOnLoad).each(function(v){ var x = $(v); if (x) x.hide(); });


  
  // Process links - don't use rules[] because it is too slow for links.
  processLinks(document);

  // register the rules
  behavior.register(rules);

  // setup a tab set if need be
  var initTab = 0;
  if (window.location.hash && (hash = window.location.hash.match(/t(\d)/))) initTab = parseInt(hash[1]);
  var tabs = $$('#HOMEPAGE .perfecttrip .tabs h2');
  if ( tabs.length > 0 ) {
    var elmts = $$('#HOMEPAGE .perfecttrip .tripforms .interior');
    new TabSet(tabs, elmts, {
      show: initTab,
      onActive: function(toggler, element) {

        // fetch content via AJAX
        var t = element.getElement('a.src');
        if (t) 
        {
         // Set content to placeholder graphic
          var imgCntr = new Element('div', { 'class': 'progresstab' } );
          (new Asset.image(img_loop)).injectInside(imgCntr);
          imgCntr.injectInside(element);

          // Make AJAX call to get content.
          new Ajax(t.href, {
            onComplete: function(txt, xml) { 
                element.empty();
                element.innerHTML = txt;
                window.behavior.apply(element); 
              } // apply any defined behavior
            }).request();
        }

        toggler.addClass('current');
      },
      onBackground: function(toggler, element) {
        toggler.removeClass('current');
      }
    });
  }
  
  // setup the accordion(s) if need be
  var elmts = $$('#DEST_HOME #DEST_ACCORDION .pane');
  if ( elmts.length > 0 ) {
    window.accordion = new Accordion('#DEST_ACCORDION .window', elmts, {
      show: -1, // element to show by default
      //display: 0, // element to show by default w/ transition - requires onload instead of domready
      //fixedHeight: true, // force fixed height
      //fixedWidth: true, // force fixed width
      //height: false, // use height transition
      opacity: false, // use opacity transition
      //alwaysHide: true, // allow to hide all elements
      onActive: function(toggler, element) {
        var d = element.getElement('.preview');
        if (d) {d.remove();}// in case the user clicks the dt and not the preview layer
        toggler.addClass('active');
        element.addClass('active');
        new Ajax('/ActionRecord?action=' + toggler.id).request();
      },
      onBackground: function(toggler, element) {
        toggler.removeClass('active');
        element.removeClass('active');
      }
    });

    // setup 'preview' state
    window.accordion.preview = true;
    window.accordion.hovers = [];
    elmts.each(function(elmt, x) {
      // add hover layer
      var c = elmt.getCoordinates();
      var d = new Element('div', {
        'class': 'preview',
        events: {
          click: function(e) {
            // this click doesn't propagate to catch flyouts apparently...
            if (window.flyout) window.flyout.hide();
            if (window.ie6) elmt.getElements('select').setStyle('visibility', 'visible');
            window.accordion.hovers.each( function(elmt) {elmt.remove();} );
            window.accordion.display(x);
          },
          mouseenter: function() {
            if (window.ie6) elmt.getElements('select').setStyle('visibility', 'hidden');
            this.setOpacity(0.6).addClass('hover');// bloody IE6...
          },
          mouseleave: function() {
            if (window.ie6) elmt.getElements('select').setStyle('visibility', 'visible');
            this.setOpacity(0.01).removeClass('hover');
          }
        }
      }).setOpacity(0.01).setHTML('<span>' + JS_click_to_expand + '</span>').injectInside(elmt);
      window.accordion.hovers.push(d); 
      c = d.getCoordinates();
      elmt.setStyles({
        height: c.height + 'px',// let the CSS control the preview height
        // have to set these explicitly on the element because the Accordion JS does, too.
        visibility: 'visible'
      });
    });
  }
  
  // setup SIS Accordion ( no preview )
  // this needs to happen after the preview accordion above for IE6 to render correctly
  // used signed-in or not
  var sisAccordionElements = $$('#SIS_ACCORDION .pane');
  if ( sisAccordionElements.length > 0 )
  {
	
	// get the orignal heights of each pane
  	var overflowElements = {};
  	sisAccordionElements.each(function(elmt,x){
  		overflowElements[x] = elmt.getStyle('height').toInt();
	});
	
	// show the first pane with content
	var showIndex = 0;
	for (var i=0; i<sisAccordionElements.length; i++)
	{
		if (sisAccordionElements[i].getElement('.sisContribution'))
		{
			showIndex = i;
			break;			
		}
	}

	window.sisAccordion = new Accordion('#SIS_ACCORDION .window', sisAccordionElements, {
	  show: showIndex,
      opacity: false, // use opacity transition
      fixedHeight: 160,
      onActive: function(toggler, element) {
        toggler.addClass('active');
        element.addClass('active');
      },
      onBackground: function(toggler, element) {
        toggler.removeClass('active');
        element.removeClass('active');
      }
    });
	
	// Change overflow and height dynamically
	window.sisAccordion.elements.each(function(elmt,x){
		// give it a scroll bar
		if (overflowElements[x] > window.sisAccordion.options.fixedHeight)
		{
			elmt.setStyle('overflow-y', 'auto');
			elmt.setStyle('overflow-x', 'hidden');
		}
		// make the height the size of the content
		else
		{
			elmt.fullHeight = overflowElements[x];
		}
		
		// make sure the initial pane is the right height
		if (x == window.sisAccordion.options.show)
		{
			elmt.setStyle('height', elmt.fullHeight);
		}
		
		// BUG 22422
		// IE6 sucks so we have to apply the offset after the DEST_HOME accordion
		// or else it doesn't refresh the preview pane for some elements.
		// Even accessing the offsetTop property earlier than this causes this bug	
		/*var flyoutsL = $$('#SIS_ACCORDION .flyoutL');
		flyoutsL.each(function(f,i){
		  f.flyout.setOptions({offsets: {x:0, y:-1*f.offsetTop-16}});
		});
		
		var flyouts = $$('#SIS_ACCORDION .flyout');
		flyouts.each(function(f,i){
			f.flyout.setOptions({offsets: {x:4, y:-1*f.offsetTop-16}});
		});*/
	});
	
	// pad if we're in the left nav and have overflow
	var sisPaddingElements = $$('#LEFTNAV #SIS_ACCORDION .pane');
	sisPaddingElements.each(function(elmt, x){
		if (overflowElements[x] > window.sisAccordion.options.fixedHeight)
		{
			elmt.setStyle('width', '166px');
			var sisPaddingNums = elmt.getElements('.num');
			sisPaddingNums.each(function(num, i)
			{
				num.setStyle('padding-right', '20px');
			});
		}
 	});

  }
}

// Setup email replacement. e.g. #eobf( 'dmosales'  '.com')  -> mailto: 
rulesN['EOBF'] = function(elmt) {
  var e = elmt.innerHTML+'@tripadvisor'+elmt.title;
  elmt.replaceWith(new Element('a', {href: 'mailto:'+e}).setContent(e));
}


/*
Function: toggle
  Toggle the class (default: 'off') of the element this function is bound to.
*/
function toggle(e) {new Event(e).preventDefault(); this.toggleClass('off');}

/* Some generic rules
   ---------------------------------------------------------------------------------------------- */

// called when a link with a js_ class is clicked.
var doBehavior = function(e) {
  var e = new Event(e || window.event);
  var elmt = $(e.target);
  if (elmt.getTag() != "a") elmt = elmt.getParent("a");
  if (/pid(\d+)/.test(elmt.className)) Cookie.set('NPID', RegExp.$1, {domain: cookieDomain, time:5});
  $pick(elmt.className.match(/(js_\w+)/g), []).each(function(c) {
    linkMap[c](elmt, e);
  });
}

function _processLink(elmt) {
  if (elmt.className.indexOf('js_') >= 0 || elmt.className.indexOf('pid') >= 0) {
    if (elmt.addEventListener) elmt.addEventListener('click', doBehavior, false);
    else elmt.attachEvent('onclick', doBehavior);
  }
}

/* All Link rules in one function for performance */
function processLinks(root) 
{
  var aTags = $A(root.getElementsByTagName('a'));
  aTags.each(_processLink);
  return aTags.length;
}

function searchFocus()
{
  if($('mainSearch'))
  {
    try {
      $('mainSearch').focus();
    } catch(e) { }
  }
}

var linkMap = {};

function removeDHTMLPopup()
{
  // refresh if our dhtml popup has a child with the refreshOnClose class
  $$('#DHTMLPOPUP .refreshOnClose').each( function(item,index) {
    document.location.reload();
    return;
  });
  
  // otherwise just get rid of it
  if($('DHTMLPOPUP'))$('DHTMLPOPUP').remove();
  if($('dhtmlPopupIframe'))$('dhtmlPopupIframe').remove(); 
  if($('DHTMLPOPUP_LIGHTBOX'))
  {
    window.removeEvent('scroll', moveDHTMLPopupToScrollPosition);
    window.removeEvent('resize', resizeToWindow);
    $('DHTMLPOPUP_LIGHTBOX').remove();
    $$('select').setStyle('visibility', 'visible');
  } 
}

ajaxRules['a.dhtmlclose'] = function(elmt) {
  elmt.addEvent('click', removeDHTMLPopup);
};

// submit forms via AJAX
linkMap['js_ajaxSubmit'] = function(elmt, e) {
  var uri = elmt.href;
	if (!elmt.className.match(/\bform_(\w+)\b/)) return;
    var form = $(RegExp.$1);
	var ops = {
		data: form,
		onFailure: function(e) { alert(JS_Ajax_failed); }
	}
	if (elmt.className.match(/\method_(\w+)\b/)) ops.method = RegExp["$1"];
	if (elmt.className.match(/\btgt_(\w+)\b/)) ops.update = RegExp["$1"];
	else ops.onComplete = showInLightbox;
  new Event(e).preventDefault();
  var fn = window['validate'+form.id]; 
  if (
    $defined(fn) &&
    $type(fn) == "function" &&
    fn.apply(form) == false )
        return;
  new Ajax(uri, ops).request();
};

// used in translations: newsletter_9b5, newsletter_9b6
linkMap['js_ajax'] = function(elmt, e) {
  new Event(e).preventDefault();
  if (!(tgt = elmt.className.match(/\btgt_(\w+)\b/))) return;// target is required
  tgt = $(tgt[1]);
  new Ajax(elmt.href, {
    update: tgt,
    onFailure: function(e) { alert(JS_Ajax_failed); }
  }).request();
};

// like 'ajax', but expected to log-in first
linkMap['js_ajaxlogin'] = function(elmt, e) {
  new Event(e).preventDefault();
  if (!(tgt = elmt.className.match(/\btgt_(\w+)\b/))) return;// target is required
  var alHref = elmt.href;
  tgt = $(tgt[1]);
  new Ajax(elmt.href, {
    onComplete: function(txt, xml) {
      var bWasLoggedIn = (txt.indexOf('<!--nologin-->')<0);
      if(!bWasLoggedIn)
      {
          login(['tt','ajax','returnTo', alHref + "&rd=1", 'greeting', 'showuserreviews_vote_25ee' ]);
      }
      else
      {
          tgt.innerHTML = txt;
      }
    },
    onFailure: function(e) { alert(JS_Ajax_failed); }
  }).request();
};



// When clicked we go back to our last eligible URL as defined in FullServlet.handleReturnTo.
// If we have no cookie go to the homepage
linkMap['js_back']=function(elmt, e) {
     var matches = document.cookie.match('(?:^|;)\\s*TAReturnTo=\%1\%([^;]*)');
     if (matches)
     {
     	window.location = decodeURIComponent(matches[1]);
     }
     else
     {
     	window.location = "/";
     }
}

var popupConfig = {};

// This is the preferred way of showing a Dhtml Popup
// PopupManager.java uses these functions along with some velocty stuff in header_popup.vm
function showDHTMLPopup(popupServlet, popupServletUrl, popupLightbox)
{
    popupConfig.servlet = popupServlet;
    popupConfig.servletUrl = popupServletUrl;
    popupConfig.lightbox = popupLightbox;
    
    DHTMLPopupRequest("Open", DHTMLPopupResponse);
}

  
function popupResponseSuccess(content)
{
}

function popupResponeError(e)
{
}
  
var DHTMLPopupResponse = function(content) {

  // make sure we're not showing a flyout, if so destroy it!!!
  $$('#FLYOUT').each(function(item, index)
  {
    item.remove();
  });

  // make sure we're not showing a popup already, if so destroy it!!!
  $$('#DHTMLPOPUP').each(function(item, index)
  {
    item.remove();
  });
  
  // make sure we're not showing a lighbox already, if so destroy it!!!
  $$('#DHTMLPOPUP_LIGHTBOX').each(function(item, index)
  {
    item.remove();
  });
  
  $$('#dhtmlPopupIframe').each(function(item, index)
  {
    item.remove();
  });
  
  // DHTML lightbox
  var lightbox;
  if (popupConfig.lightbox)
  {
    lightbox = new Element('div', {id: 'DHTMLPOPUP_LIGHTBOX'}).injectInside(document.body);
	var pageSize = Math.max( window.getHeight(), window.getScrollHeight() );
	lightbox.setStyle('height', pageSize + 'px');
  }
  
  // create container elements
  var ctnr = new Element('div', {id: 'DHTMLPOPUP'}).injectInside(document.body);
  
  // rounded corners
  var top  = new Element('div', {'class': 'cnrR5 top'}).injectInside(ctnr);
  var tl   = new Element('div', {'class': 'lft'}).setContent("<!--Lft Corner-->").injectInside(top);
  var tm   = new Element('div', {'class': 'mid'}).setContent("<!--Mid Border-->").injectInside(top);
  var tr   = new Element('div', {'class': 'rgt'}).setContent("<!--Rgt Corner-->").injectInside(top);
  var btm  = new Element('div', {'class': 'cnrR5 btm'}).injectInside(ctnr);
  var bl   = new Element('div', {'class': 'lft'}).setContent("<!--Lft Corner-->").injectInside(btm);
  var bm   = new Element('div', {'class': 'mid'}).setContent("<!--Mid Border-->").injectInside(btm);
  var br   = new Element('div', {'class': 'rgt'}).setContent("<!--Rgt Corner-->").injectInside(btm);

  var div  = new Element('div', {'class': 'close'}).injectInside(ctnr);
  
  new Element('span', {'class': 'cnrL'}).injectInside(div);
  new Element('span', {'class': 'cnrB'}).injectInside(div);
  new Element('span', {'class': 'cnrBL'}).injectInside(div);
  var closeLink  = new Element('a', {'class': 'dhtmlclose popupClose'}).setStyle('cursor', 'pointer').setContent(lang_Close).injectInside(div);
  
  var inner = new Element('div', {'class': 'inner'}).setContent(content).injectInside(ctnr);
  
  // go back if we hit close
  if (inner.getElement('.popupBackOnClose'))
  {
    closeLink.removeClass('dhtmlclose');
    closeLink.addClass('js_back');
  }
  
  if (popupConfig.servlet)
  {
      // give us control to apply styles depending on which popup we're shoing
      ctnr.addClass("DefaultPopup");
      ctnr.addClass(popupConfig.servlet);
      inner.addClass(popupConfig.servlet+"Inner");
      
      // a subset of the actions defined in DhtmlPopup.java
      // only actions that are triggered by a mouse click
      ctnr.getElements('.popupClose').each(function(item, index){
        item.addEvent('click', function(){ DHTMLPopupRequest('Close'); } );
      });
      
      inner.getElements('.popupConvert').each(function(item, index){
        item.addEvent('click', function(){ DHTMLPopupRequest('Convert'); } );
      });
      
      inner.getElements('.popupDecline').each(function(item, index){
        item.addEvent('click', function(){ DHTMLPopupRequest('Decline'); } );
      });

      var popupSubmitOnEnterFunction = function(e)  
      {
        var charCode = (e.charCode) ? e.charCode :
            ((e.which) ? e.which : e.keyCode)
        if(charCode == 13 || charCode == 10)
        {
          popupSubmitFunction(e);
        }
      }

      var popupSuppressEnterFunction = function(e)  
      {
        var charCode = (e.charCode) ? e.charCode :
            ((e.which) ? e.which : e.keyCode)
        if(charCode == 13 || charCode == 10)
        {
          new Event(e).preventDefault();
        }
      }

      inner.getElements('.popupSubmitOnEnter').each(function(item, index){
        item.addEvent('keydown', popupSubmitOnEnterFunction );
      });

      var popupSendForgotEmailFunction = function(e) 
      {
        $$('#POPUP_FORM #sendpass').setProperty("value", "true");
        popupSubmitFunction(e);
      }

      inner.getElements('.popupSendForgotEmail').each(function(item, index){
        item.addEvent('click', popupSendForgotEmailFunction );
      });

      // avoid duplicate submits
      var popupSubmitFunction = function(e) 
      {
        new Event(e).preventDefault();

        inner.getElements('.popupSubmit').each(function(item, index){
          item.removeEvent('click', popupSubmitFunction);
        });

        inner.getElements('.popupSendForgotEmail').each(function(item, index){
          item.removeEvent('click', popupSendForgotEmailFunction);
        });

        inner.getElements('.popupSubmitOnEnter').each(function(item, index){
          item.removeEvent('keydown', popupSubmitOnEnterFunction);
          item.addEvent('keydown', popupSuppressEnterFunction);
        });
        
        DHTMLPopupRequest('Submit', DHTMLPopupResponse, null, inner.getElementById('POPUP_FORM')); 
      }

      inner.getElements('.popupSubmit').each(function(item, index){
        item.addEvent('click', popupSubmitFunction );
      });
  }

  // apply behavior
  window.behavior.apply(ctnr);

  // position relative to left corner of content and top of scroll positiion
  popupConfig.coords = ctnr.getCoordinates();
  var c = popupConfig.coords;
  ctnr.setStyle('left', $('PAGE').getLeft() + c.left + 'px');
  ctnr.setStyle('top', $('PAGE').getTop() + c.top + 'px');
  
  // fix corners
  top.setStyle('width', c.width + 'px');
  btm.setStyle('width', c.width + 'px');
  var t = c.width - tl.getCoordinates().width - tr.getCoordinates().width;
  var b = c.width - bl.getCoordinates().width - br.getCoordinates().width;
  tm.setStyle('width', (t > 0 ? t : 0) + "px");
  bm.setStyle('width', (b > 0 ? b : 0) + "px");

  if (window.ie6)
  {
    var iframeEl = new Element('IFRAME', {'id': 'dhtmlPopupIframe'});
    iframeEl.setStyles({zIndex: '9997', borderWidth: '0', position: 'absolute',
      display: 'block', top: $('PAGE').getTop() + c.top - 6, left: $('PAGE').getLeft() + c.left, 
      width: c.width, height: c.height + 12});
    iframeEl.injectInside($(document.body));
    
    // bug 25643
    if (lightbox)
    {
      $$('select').setStyle('visibility', 'hidden');
    }
  }
  
  if (lightbox)
  {
    // if we're in a light box, follow the scroll position
    ctnr.setStyle('top', window.getScrollTop() + c.top + 'px');
    window.addEvent('scroll', moveDHTMLPopupToScrollPosition.bindAsEventListener(ctnr));
    window.addEvent('resize', resizeToWindow.bindAsEventListener(lightbox));
  }
  
}

function moveDHTMLPopupToScrollPosition(event)
{
  var popupHeight = this.getSize().size.y;
  
  // popup is bigger than whole window so just don't move it
  if (popupHeight > window.getHeight()) {
    return;
  }
  // top offset pushes it out of window
  else if (popupConfig.coords.top + popupHeight > window.getHeight()) {
    var freeSpace = window.getHeight() - popupHeight;
    this.setStyle('top', window.getScrollTop() + (freeSpace/2) + 'px');
  }
  // keep the offset to top defined in base.css
  else {
  	this.setStyle('top', window.getScrollTop() + popupConfig.coords.top + 'px');
  }
}

function resizeToWindow(event)
{
  var pageSize = Math.max( window.getHeight(), window.getScrollHeight() );
  this.setStyle('height', pageSize + 'px');
}

function showToggleBlock(toggleClass)
{
  // only hide all the toggle blocks besides toggleClass
  $$('.js_toggleBlocks .js_toggleBlock').each( function(el, i) {
    el.hide();
	if (el.hasClass(toggleClass))
	{
	  el.show();
	}
  });
}

linkMap['js_reopenDhtmlPopup']=function(elmt, e) {
    new Event(e).preventDefault();
    showDHTMLPopup(popupConfig.servlet, popupConfig.servletUrl, popupConfig.lightbox);
} 

linkMap['js_toggleBlockTrigger'] =function (elmt, e) { 
  var toggleClass = elmt.getProperty("class");
  toggleClass.replace(/toggleBlock[0-9]+/g, function(match){ toggleClass = match; });
  showToggleBlock(toggleClass);
};

rules['#SWAPBLOCK .js_toggleBlock']=function(elmt) {
  // the default toggleBlock
  if (elmt.hasClass("js_toggleBlockSelected"))
  {
    var toggleClass = elmt.getProperty("class");
    toggleClass.replace(/toggleBlock[0-9]+/g, function(match){ toggleClass = match; });
    showToggleBlock(toggleClass);
  }
}

function clearPopupForm()
{
  // clear password
  $$('#POPUP_FORM #pass').setProperty("value", "");
  
  // clear errors
  $$('#DHTMLPOPUP .error-message').empty();
}

// only used in DHTML pop-ups
linkMap['js_clearPopupForm'] =function (elmt, e) { 
  clearPopupForm();
};

function setPopupFormAction(val)
{
  $$('#POPUP_FORM #action').setProperty("value", val);
}

// only used in DHTML pop-ups
linkMap['js_popupFormAction1'] =function (elmt, e) { 
  setPopupFormAction("1");
};
linkMap['js_popupFormAction2'] =function (elmt, e) { 
  setPopupFormAction("2");
};

function callPopupSendPasswordEmail(elmt)
{
  alert("callPopupSendPasswordEmail");
  $$('#POPUP_FORM #sendpass').setProperty("value", "true");
  popupSubmitFunction(elmt);
}

// only used in DHTML pop-ups
ajaxRules['.js_popupForgot']=function(elmt) {
  elmt.addEvent("click", callPopupSendPasswordEmail);
}

// MOVE - only used in Help Center
rules['#HELP_CENTER dl.js_toggleset'] = function(elmt) {
  var initTab = 0;
  var ts = new ToggleSet(elmt.getElements('dt'), elmt.getElements('dd'));
  if (window.location.hash && (hash = window.location.hash.match(/c(\d+)/))) ts.display(parseInt(hash[1]));
}

// XXX - used for pool testing of amenity icons
// This should be removed in the not so distant future
// Greg Belote  19aug08

var amenityFiredHoverEvent = false;

function recordAmenityIconHover ()
{
    // send an AJAX request that will log the hover
    new Ajax("/ActionRecord?action=amenityIconHover").request();

    // note that we've recorded one hover for this page view
    amenityFiredHoverEvent = true;
}

rules['#redesignAmenity .amenities img'] = function(icon) {
    icon.addEvent('mouseenter', function(e) {
        // if we haven't already recorded a hover for this page view...
        if (amenityFiredHoverEvent == false)
        {
            // set a timer at 750ms to record the user hovering
            icon.hoverTimeout = setTimeout ("recordAmenityIconHover()", 750);
        }
    });

    icon.addEvent('mouseleave', function(e) {
        // stop the timeout
        clearTimeout (icon.hoverTimeout);
        
        // remove any references to it
        icon.hoverTimeout = null;
    });
}

var propertyTypeClicked = false;

rules['#PROPERTY_TYPE .flyout a'] = function(questionMark)
{
    questionMark.addEvent('click', function(e) {
        if (propertyTypeClicked == false)
        {
            new Ajax("/ActionRecord?action=propertyTypeClicked").request();
            propertyTypeClicked = true;
        }
    });
}

rules['#HAC_FORM .js_hacRadio'] = function(elmt) {
  if(!elmt.checked)
  {
    elmt.addEvent("click", function(e) {
    	var aelmt = $('cat' + elmt.value + 'url');
    	if(aelmt)
    	{
          window.location = aelmt.href;
    	}
    });
  }
}

ajaxRules['div.CHECKED_SITES'] = function(elmt) {
  var csType = elmt.className.match(/cs_(\w\w)/)[1];
  var totOpenedVen = 0;
  var totCheckedVen = 0;
  for( x = 0; x < vendors.length; x++ ){
    if(vendors[x].checkbox.checked)
    {
      if(csType == 'ps' && !vendors[x].additionalOffer)
      {
        totCheckedVen++;
      }
      else if(csType == 'ao' && vendors[x].additionalOffer)
      {
        totCheckedVen++;
      }
      
      if(vendors[x].bOpened)
      {
        if(csType == 'ps' && !vendors[x].additionalOffer)
        {
          totOpenedVen++;
        }
        else if(csType == 'ao' && vendors[x].additionalOffer)
        {
          totOpenedVen++;
        }
        
      }
    }
  }
  elmt.getElement('span.opnSites').innerHTML = totOpenedVen;
  elmt.getElement('span.totSites').innerHTML = totCheckedVen;
}

rules['#CHECK_RATE'] = function(elmt) {
  elmt.addEvent('click', displayVendors.bindAsEventListener(elmt));
  if(typeof cr_loc_vend != "undefined")
  {
    cr_loc_vendImg = new Image().src = cr_loc_vend;
    cr_loc_vend_chImg = new Image().src = cr_loc_vend_ch;
    new Image().src = cr_loc_logo;
  }
};

rules['#ACCOM_OVERVIEW span.js_popTestCR'] = ajaxRules['span.js_popTestCR'] = function(box) {
  var accomId = box.className.match(/id_(\d+)/)[1];
  var pos = box.getPosition();
  var btn = box.getElement('img.btnPop');
  btn.addClass('relPos');
  var lb  = new Lightbox(btn, 'lbContentCR', 0, 0, true);
  lb.source = '/HotelCheckRates-d' + accomId;
}

rules['#ACCOM_DETAIL #BOOKPOP'] = function(box) {
  var pos = box.getPosition();
  var btn = box.getElement('img.btnPop');
  var lb  = new Lightbox(btn, 'lbContentCR', pos.x, pos.y);
  lb.source = '/vpages/bookit.html?lt=evt';
}

ajaxRules['div.icrStandalone form .siteLst'] = function(elmt) {
  if(elmt.className.match(/hdcEnabled/))
  {
    hdcEnabled = true;
  }
  
  if(typeof qcTopOffers != "undefined")
  {
    qcTopOffers.each(function(offer) {
      new Element('li').setHTML(
        '<input id="bn' + offer.author + '" class="chk" name="' + offer.author + '" type="checkbox"' + (offer.checked ? ' checked="checked"' : '') + '/>' +
        '<label for="bn' + offer.author + '">' + offer.vendor + '</label>'
      ).injectInside(elmt);
    }, elmt);
  }  
}

rules['div.icrStandalone form .siteLst'] = function(elmt) {
  if(elmt.className.match(/hdcEnabled/))
  {
    hdcEnabled = true;
  }
}

var slots;
var bWinXPSP2 = false;
var bOneAtATime = false;
var bUpdating = false;

// 330 days in future
var dTooFar = new Date();
for(var i = 0; i < 330; i++)
{
  dTooFar.setMilliseconds(86400000);
}

if(navigator.appVersion.indexOf('SV1') != -1)
{
  bWinXPSP2 = true;
  bOneAtATime = true;
}

function Slot(lx, ly, lw, lh){
  this.x = lx;
  this.y = ly;
  this.w = lw;
  this.h = lh;
  this.occupied = null;
}

function makeSlots(){
  var nW = 525;
  var nH = 460;
  var nXI = 24;
  var nYI = 24;
  //move all the pop windows away from the dhtml popup
  var nX = (typeof lb_ie_enabled != "undefined") ? 500 : 205;
  var nY = 5;

  if(screen.width > 1024){
    nW = 800;
    nH = 600;
    nXI = 80;
    nYI = 40;
  } else if(screen.width > 800){
    nW = 620;
    nH = 500;
    nXI = 60;
    nYI = 30;
  }
  slots = [];
  for (var i=0; i<20; i++){
    slots[i] = new Slot(nX,nY,nW,nH);
    nX = nX + nXI;
    nY = nY + nYI;
  }
}

function getOpenSlot(n){
  if(n<=0){
    n=1;
  }
  for (var i=n-1; i>=0; i-=1){
    if (slots[i].occupied == null){
      return slots[i];
    } else if (slots[i].occupied.closed){
      slots[i].occupied = null;
      return slots[i];
    }
  }
  for (var i=n; i<slots.length; i++){
    if (slots[i].occupied == null){
      return slots[i];
    } else if (slots[i].occupied.closed){
      slots[i].occupied = null;
      return slots[i];
    }
  }
  return null;
}

function focusSlots(){
  for (var i=0; i<slots.length; i++){
    if (slots[i].occupied != null && !slots[i].occupied.closed)
    {
      try {
        slots[i].occupied.focus();
      } catch(e) { }
    }
  }
}

var vendors = [];
function addVendor(vendor){
  vendors[vendors.length] = vendor;
}

function Vendor(lName, lCheckbox, lUrl, lVendorName, lAddOffer){
  this.name = lName;
  this.checkbox = lCheckbox;
  this.url = lUrl;
  this.window = null;
  this.lastDates = "";
  this.slot = null;
  this.bOpened = false;
  this.vendorName = lVendorName;
  this.additionalOffer = lAddOffer;
}

function displayVendors(customArea)
{
  var tempVal = $('HotelDateSearch');
  if(typeof tempVal == "undefined" || typeof tempVal.checkIn == "undefined") return;
  var valid = validateDates.bind($('HotelDateSearch'))();
  if (!valid) return;
  else
  {
    $('HotelDateSearch').getElement('span.error_msg').hide();
  }
  window.qcCustomArea = false;
  try {
    popwindows();
  } catch(e) { }
  return false;
}

function popwindows()
{
  var numChecked = 0;
  var numToOpen = 0;
  var numOpened = 0;
  var numOpen = 0;
  var numCheckedOrOpen = 0;

  
  for (var i=0; i<vendors.length; i++)
  {
    if (vendors[i].checkbox.checked)
    {
      numChecked++;
      if (vendors[i].window == null)
      {
        numToOpen++;
        numCheckedOrOpen++;
      } 
      else if (vendors[i].window.closed)
      {
        vendors[i].window = null;
        numToOpen++;
        numCheckedOrOpen++;
      } 
      else 
      {
        numOpen++;
        numCheckedOrOpen++;
      }
    } 
    else if (vendors[i].window != null && !vendors[i].window.closed)
    {
      numCheckedOrOpen++;
    }
  }
  
  if (numChecked == 0)
  {
    alert(js_0001); // "Please select at least one vendor from the list."
    return false;
  }
  
  // User Supplied Dates
  var sInMonthYear = $('qcInMonth').value.split(/\//);
  var dCheckin = new Date( sInMonthYear[1], sInMonthYear[0]-1 , $('qcInDay').value );
  var sOutMonthYear = $('qcOutMonth').value.split(/\//);
  var dCheckout = new Date(sOutMonthYear[1], sOutMonthYear[0]-1, $('qcOutDay').value);

  // Today; Force to midnight
  var dToday = new Date();
  dToday.setHours(0,0,0,0);

  // Calendar protects against this but keep it anyway
  if (dCheckin < dToday || dCheckout < dToday) {
    alert(js_0002); // "Please choose dates in the future."
    return false;
  }

  if (dCheckin >= dCheckout) {
    alert(js_0003); // "Please choose a check-out date that is at least one day later than your check-in date."
    return false;
  }

  if (dCheckin > dTooFar || dCheckout > dTooFar) {
    alert(js_0004); // "Please choose dates that are less than 330 days away."
    return false;
  }

  $("msgbox").innerHTML = js_0005; // "Searching for deals ... this may take a few moments"

  //set globally here
  sUserData = (
          "inMonth=" + escape(sInMonthYear[0] + " " + sInMonthYear[1]) +
          "&inDay=" + escape($('qcInDay').value) +
          "&outMonth=" + escape(sOutMonthYear[0] + " " + sOutMonthYear[1]) +
          "&outDay=" + escape($('qcOutDay').value) +
          "&adults=" + escape($('qcAdults').selectedIndex+1)
        );
  
  if(lb_ie_enabled)
  {
    popAll(sUserData);
    setUpdateText();
  }
  else{
    if(bOneAtATime)
    {
      var nIndex = getNextWindowIndex(sUserData);
      if(nIndex > -1)
      {
        popOne(nIndex, sUserData);
      }
      else if(bUpdating)
      {
        alert(js_0006); // "Your selections have not changed."
      }

      // Are we done?
      nIndex = getNextWindowIndex(sUserData);
      if(nIndex == -1)
      {
        setUpdateText();
      }
      else
      {
        setPopAnotherText();
      }
    }
    else
    {
      if(popAll(sUserData))
      {
        setUpdateText();
      }
      else
      {
        setPopAnotherText();
      }
    }
  }

  focusSlots();

  return true;
}

function getNextWindowIndex(sUserDataVar)
{
  for (var i=0; i<vendors.length; i++)
  {
    if(vendors[i].checkbox.checked && !vendors[i].bOpened)
    {
      return i;
    }
  }

  for (var i=0; i<vendors.length; i++)
  {
    if(vendors[i].checkbox.checked
       && vendors[i].window != null
       && !vendors[i].window.closed
       && sUserDataVar != vendors[i].lastDates)
    {
      return i;
    }
  }

  for (var i=0; i<vendors.length; i++)
  {
    if(vendors[i].checkbox.checked
       && vendors[i].lastDates != sUserDataVar)
      {
        return i;
      }
  }

  return -1;
}

function popOne(nIndex, sUserDataVar)
{
  try {
    var bReturn = false;
    var bHasWindow = (vendors[nIndex].window != null && !vendors[nIndex].window.closed);
    var sFinalUrl = vendors[nIndex].url + '&' + sUserDataVar;
    if (qcCustomArea) {
      sFinalUrl = sFinalUrl.replace(/&area\=\w+/, '&area=' + qcCustomArea);
    }
    var slot;
    if (bHasWindow)
    {
      slot = vendors[nIndex].slot;
    }
    else
    {
      slot = getOpenSlot(0); 
    }
    
    var popWidth = slot.w;
    var tester = typeof hdcEnabled != "undefined";
    if(typeof hdcEnabled != "undefined" && hdcEnabled && vendors[nIndex].vendorName == "hotels.com")
    {
      popWidth = 975;
    }
    
    var sProps = 'toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,copyhistory=yes,resizable=yes,alwaysraised=true';
    var sMyProps = sProps + ',screenX=' + slot.x + ',screenY=' + slot.y + ',left=' + slot.x + ',top=' + slot.y + ',height=' + slot.h + ',width=' + popWidth;
    vendors[nIndex].window = window.open(sFinalUrl, vendors[nIndex].name, sMyProps);

    if(typeof vendors[nIndex].window != "undefined" && vendors[nIndex].window != null)
    {
      slot.occupied = vendors[nIndex].window;
      vendors[nIndex].slot = slot;
      vendors[nIndex].window.focus();
      vendors[nIndex].bOpened = true;
      vendors[nIndex].lastDates = sUserDataVar;
      bReturn = true;
    }
  } catch(e) { }

  return bReturn;
}

function popAll(sUserDataVar)
{
  for (var i=0; i<vendors.length; i++)
  {
    if (vendors[i].checkbox.checked)
    {
      if (sUserDataVar != vendors[i].lastDates || vendors[i].bOpened == false
          || vendors[i].window == null || vendors[i].window.closed)
      {
        if(!popOne(i, sUserDataVar))
        {
          bOneAtATime = true;
          if(lb_ie_enabled)
          {
            popCheckRatesIE();
          }
          return false;
        }
      }
    }
  }
  
  return true;
}

function setUpdateText()
{
  // TODO: not a button anymore, an image
  //document.HotelDateSearch.submitbtn.value=js_0011; // "Update"
  $("errbox").innerHTML = "";
  $("msgbox").innerHTML = "";
  bUpdating = true
}

function setPopAnotherText()
{
  // TODO: not a button anymore
  //document.HotelDateSearch.submitbtn.value=js_0012; //"Show next offer";
  
  if(bWinXPSP2) {
    $("msgbox").innerHTML = js_0013; // "Please click the \"Check Rates!\" button above to open each window."
    $("errbox").innerHTML = qcErrorImage;
  }
  else {
    $("msgbox").innerHTML = js_0010; // "Please click again to open each window or adjust browser settings to disable popup blockers."
    $("errbox").innerHTML = qcErrorImage;
  }
}

function closewindows()
{
  for (var i=0; i<vendors.length; i++)
  {
    if (vendors[i].window != null && !vendors[i].window.closed)
    {
      try {
        vendors[i].window.close();
      } catch(e) { }
    }
    vendors[i].window = null;
  }
}

function closeMe(sUrl, bFromPop)
{
  closewindows();
  try 
  {
    if(self.opener != null && bFromPop != 'true')
    {
      if(self.opener.closed == true){
        w = window.open(sUrl, 'TripAdvisor');
        w.focus();
      }
      else 
      {
        if(self.opener.location.href != sUrl)
        {
          self.opener.location.href = sUrl;
        }
        self.opener.focus();
      }
    } 
    else 
    {
      w = window.open(sUrl, 'TripAdvisor');
      w.focus();
    }
  } catch(e) { }

  try {
    self.close();
  } catch(e) { }
}

function quickCheckInit() 
{ 
  makeSlots();
  if(typeof addVendors != "undefined")
  {
    addVendors();
  }  
}

// ========================================================================= //
// ================ Book Now Lightbox Functions ============================ //
// ========================================================================= //

function bn_displayVendors()
{
  var crLBform = $$('#lbContentCR form')[0];
  var valid = validateDates.attempt([], crLBform);
  if (!valid) return;
  else
  {
    if(crLBform && crLBform.getElement('span.error_msg') != null)
    {
      crLBform.getElement('span.error_msg').hide();
    }
  }
  
  window.qcCustomArea = 'QC_BOOKNOW';
  try {
    bn_popwindows();
  } catch(e) { }
  return false;
}

function bn_popwindows()
{
  var lb = $('lbContentCR');
  var form = lb.getElement('form');
  var numChecked = 0;
  var numToOpen = 0;
  var numOpened = 0;
  var numOpen = 0;
  var numCheckedOrOpen = 0;
  for (var i=0; i<vendors.length; i++)
  {
    if (form.getElement('#bn'+vendors[i].name).checked)
    {
      numChecked++;
      if (vendors[i].window == null)
      {
        numToOpen++;
        numCheckedOrOpen++;
      } 
      else if (vendors[i].window.closed)
      {
        vendors[i].window = null;
        numToOpen++;
        numCheckedOrOpen++;
      } 
      else 
      {
        numOpen++;
        numCheckedOrOpen++;
      }
    } 
    else if (vendors[i].window != null && !vendors[i].window.closed)
    {
      numCheckedOrOpen++;
    }
  }
  
  if (numChecked == 0)
  {
    alert(js_0001); // "Please select at least one vendor from the list."
    return false;
  }

  // User Supplied Dates
  var sInMonthYear = form.getElement('.chk-in input.month').getValue().split(/\//);
  var dCheckin = new Date(sInMonthYear[1], sInMonthYear[0]-1 , form.getElement('.chk-in input.day').getValue() );
  var sOutMonthYear = form.getElement('.chk-ot input.month').getValue().split(/\//);
  var dCheckout = new Date(sOutMonthYear[1], sOutMonthYear[0]-1, form.getElement('.chk-ot input.day').getValue());

  // Today; Force to midnight
  var dToday = new Date();
  dToday.setHours(0,0,0,0);

  // Calendar protects against this but keep it anyway
  if (dCheckin < dToday || dCheckout < dToday) {
    alert(js_0002); // "Please choose dates in the future."
    return false;
  }

  if (dCheckin >= dCheckout) {
    alert(js_0003); // "Please choose a check-out date that is at least one day later than your check-in date."
    return false;
  }

  if (dCheckin > dTooFar || dCheckout > dTooFar) {
    alert(js_0004); // "Please choose dates that are less than 330 days away."
    return false;
  }

  lb.getElement("div.remind").setText(js_0005); // "Searching for deals ... this may take a few moments"

  //set globally here
  sUserData = (
          "inMonth=" + escape(sInMonthYear[0] + " " + sInMonthYear[1]) +
          "&inDay=" + escape(form.getElement('.chk-in input.day').getValue()) +
          "&outMonth=" + escape(sOutMonthYear[0] + " " + sOutMonthYear[1]) +
          "&outDay=" + escape(form.getElement('.chk-ot input.day').getValue()) +
          "&adults=" + escape(form.getElement('.adults select').getValue())
        );

  if(lb_ie_enabled)
  {
    bn_popAll(sUserData);
    setUpdateText();
  }
  else{
    if(bOneAtATime)
    {
      var nIndex = bn_getNextWindowIndex(sUserData);
      if(nIndex > -1)
      {
        popOne(nIndex, sUserData);
      }
      else if(bUpdating)
      {
        alert(js_0006); // "Your selections have not changed."
      }

      // Are we done?
      nIndex = bn_getNextWindowIndex(sUserData);
      if(nIndex == -1)
      {
        bn_setUpdateText();
      }
      else
      {
        bn_setPopAnotherText();
      }
    }
    else
    {
      if(bn_popAll(sUserData))
      {
        bn_setUpdateText();
      }
      else
      {
        bn_setPopAnotherText();
      }
    }
  }

  focusSlots();

  return true;
}

function bn_getNextWindowIndex(sUserDataVar)
{
  var form = $$('#lbContentCR form')[0];
  for (var i=0; i<vendors.length; i++)
  {
    if(form.getElement('bn'+vendors[i].name).checked && !vendors[i].bOpened)
    {
      return i;
    }
  }

  for (var i=0; i<vendors.length; i++)
  {
    if(form.getElement('#bn'+vendors[i].name).checked
       && vendors[i].window != null
       && !vendors[i].window.closed
       && sUserDataVar != vendors[i].lastDates)
    {
      return i;
    }
  }

  for (var i=0; i<vendors.length; i++)
  {
    if(form.getElement('#bn'+vendors[i].name).checked
       && vendors[i].lastDates != sUserDataVar)
      {
        return i;
      }
  }

  return -1;
}

function bn_popAll(sUserDataVar)
{
  var form = $$('#lbContentCR form')[0];
  for (var i=0; i<vendors.length; i++)
  {
    if (form.getElement('#bn'+vendors[i].name).checked)
    {
      if (sUserDataVar != vendors[i].lastDates || vendors[i].bOpened == false
          || vendors[i].window == null || vendors[i].window.closed)
      {
        if(!popOne(i, sUserDataVar))
        {
          bOneAtATime = true;
          if(lb_ie_enabled)
          {
            popCheckRatesIE();
          }
          return false;
        }
      }
    }
  }
  
  return true;
}

function bn_setUpdateText()
{
  // TODO: not a button anymore, an image
  //document.HotelDateSearch.submitbtn.value=js_0011; // "Update"
  $$("#lbContentCR .js_error")[0].innerHTML = "";
  $$("#lbContentCR div.remind")[0].innerHTML = "";
  bUpdating = true
}

function bn_setPopAnotherText()
{
  // TODO: not a button anymore
  //document.HotelDateSearch.submitbtn.value=js_0012; //"Show next offer";
  
  if(bWinXPSP2) {
    $$("#lbContentCR div.remind")[0].innerHTML = js_0013; // "Please click the \"Check Rates!\" button above to open each window."
    $$("#lbContentCR .js_error")[0].innerHTML = qcErrorImage;
  }
  else {
    $$("#lbContentCR div.remind")[0].innerHTML = js_0010; // "Please click again to open each window or adjust browser settings to disable popup blockers."
    $$("#lbContentCR .js_error")[0].innerHTML = qcErrorImage;
  }
}

// ========================================================================= //
// ================ / Book Now Lightbox Functions ========================== //
// ========================================================================= //

rules['#BOOK_NOW'] = function(elmt) {
  elmt.addEvent('click', bn_displayVendors.bindAsEventListener(elmt));
}

window.addEvent(TAReadyEvent, quickCheckInit);

function popCheckRatesIE()
{
  if(typeof window.lightbox != "undefined")
  {
    window.lightbox.deactivate();
  }
  new Ajax( 'http://' + document.domain + '/vpages/quickcheck_lb.html', {
    onComplete: function(res){
      if (window.qcCustomArea && window.lightbox) window.lightbox.deactivate();
 	  var resPrep = new StringBuffer();
	  resPrep.append(res);
	  showInLightbox(resPrep.toString(), 'lbContent_org', 0, 0);
	  
    },
   	onFailure: function(e) { }
  }).request();
}

ajaxRules['#QUICK_CHECK_LB'] = function(elmt) {
  
  if(pageServlet == 'Hotels')
  {
    $(elmt).getElement('div.legend').show();
    if(typeof selectedHotelName != "undefined")
    {
      $(elmt).getElement('div.accomName').innerHTML = selectedHotelName;
    }
  }
  else
  {
    $('QUICK_CHECK_LB').getElement('h2.popBlock').show();
  }
  
  var vendorsShown = 0;
  var addOffers = 0;
  for( x = 0; x < vendors.length; x++ ){
    if(vendors[x].checkbox.checked)
    {
      vendorsShown++;
      var lnkUrl = vendors[x].url;
      if (qcCustomArea) {
        lnkUrl = lnkUrl.replace(/&area\=\w+/, '&area=' + qcCustomArea);
      }
      
      var listSectionId = 'QUICK_CHECK_LB_PARTNERS';
      if(vendors[x].additionalOffer)
      {
        listSectionId = 'QUICK_CHECK_LB_ADD_OFFERS';
        addOffers++;
      }
      var elemAnchor = new Element('a', {'id' : 'qc_'+x , 'href' : lnkUrl})
        .injectInside(new Element('div', {'class': 'qc_lb_name'})
          .injectInside($(listSectionId)) ).setContent(vendors[x].vendorName);
        
      var imgUrl = vendors[x].bOpened ? cr_loc_vend_ch : cr_loc_vend;
      elemAnchor.setStyle('background', 'url(' + imgUrl + ') no-repeat');
      
      elemAnchor.addEvent('click', function(e){
        
        var clickedVenderName = this.innerHTML;
        
        //update opened status of the popped vendor
        var iPopVendor = -1;
        var unopenedVendors = false;
        
        for( x = 0; x < vendors.length; x++ ){
          
          if(vendors[x].vendorName == clickedVenderName)
          {
            if(!vendors[x].bOpened)
	        {
	          var targ = new Event(e).target;
	          if(targ)
	          {
	            $(targ).setStyle('background', 'url(' + cr_loc_vend_ch + ') no-repeat');
	          }
	          iPopVendor = x;
	          var offerSection = vendors[x].additionalOffer ? 'div.cs_ao span.opnSites' : 'div.cs_ps span.opnSites';
	          var openSitesElem = $('QUICK_CHECK_LB').getElement(offerSection);
	          var openSites = parseInt(openSitesElem.innerHTML);
		      openSitesElem.innerHTML = openSites+1;
		      vendors[x].bOpened = true;
		    }
            popOne(x, sUserData);
          }
          
          if(vendors[x].checkbox.checked && !vendors[x].bOpened)
		  {
		    unopenedVendors = true;
		  }
		  
        }
        
	    if(!unopenedVendors)
        {
	      //if all vendors have popped, reset them and close the lb
	      for( x = 0; x < vendors.length; x++ ){
            vendors[x].bOpened = false;
	      }
	      //clear stored user data
	      sUserData = null;
	      window.lightbox.deactivate();
	    }

	    focusSlots();
	    
	    return false;
	  });
    }
  }
  
  if(addOffers == 0)
  {
    $('QUICK_CHECK_LB_ADD_OFFERS').addClass('qcl_hidden');
    $$('#QUICK_CHECK_LB .cs_ao')[0].addClass('qcl_hidden');
  }
};

var deferFM = function(e) {
  new Asset.javascript(mapsJs);
  new Event(e).stop();
}

rules['#FLOATMAP'] = function(elmt) {
  mapDivId = elmt.getElement('.js_map').id;
  fmThumb = elmt.getElement('.js_floatMap');
  fmThumb.myDeferFn = deferFM;
  fmThumb.addtl = elmt.getElement('div.all a').addEvent('click', fmThumb.myDeferFn);
  fmThumb.addEvent('click', fmThumb.myDeferFn);
}

/*
Created By: ARSHBA DAVID
*/

var Lightbox = new Class({

  initialize: function(ctrl, customContentId, leftPos, topPos, runScripts) {
    if (typeof(ctrl) == "string") {
      this.content = ctrl;
    }
    else {
      if (ctrl.getTag() == "a") this.source = ctrl.href;
      this.trigger = ctrl;
      ctrl.addEvent('click', this.activate.bindAsEventListener(this));
    }
    
    this.runScripts = runScripts;
    
    this.lPos = typeof leftPos != "undefined" ? leftPos : -1;
    this.tPos = typeof topPos != "undefined" ? topPos : -1;
    
    this.contentId = 'lbContent';
    if (typeof(customContentId) == "string") {
      this.contentId = customContentId;
    }
  },
	
  // Turn everything on - mainly the IE fixes
  activate: function(e){
    if (e) new Event(e).stop();// can be activated progamatically
    if ( ! $('overlay') ) this.addLightboxMarkup();
    if (window.ie6){
      $$('select').setStyle('visibility', 'hidden');
    }
    $('overlay').setStyle('height', getScrollHeight() + "px");
    this.displayLightbox("block");
    window.lightbox = this;
    this.positionLightbox(this.trigger);
    return this;
  },
  
  positionLightbox: function(trigger){
    if(typeof this.trigger != "undefined" && this.trigger.hasClass('relPos'))
    {
      this.lPos = this.trigger.getLeft() - window.getScrollLeft() + 106;
      this.tPos = this.trigger.getTop() - window.getScrollTop() - 55;
    }
  },
	
  // Add in markup necessary to make this work. Basically two divs:
  // Overlay holds the shadow
  // Lightbox is the centered square that the content is put into.
  addLightboxMarkup: function() {
    overlay = document.createElement('div');
    overlay.id = 'overlay';
    lb = document.createElement('div');
    lb.id = 'lightbox';
    lb.className = 'loading';
    lb.innerHTML = '<div id="lbLoadMessage"><p>'+JS_loading+'</p></div>';
    document.body.appendChild(overlay);
    document.body.appendChild(lb);
  },

  displayLightbox: function(display){
    $('overlay').setStyle('display', display);
    $('lightbox').setStyle('display', display);
    if(display != 'none') this.loadInfo();
    return this;
  },
	
  loadInfo: function() {
    if (this.content) return this.processInfo(this.content);
		var myAjax = new Ajax(this.source, {
      onComplete: this.processInfo.bindAsEventListener(this),
      evalScripts: this.runScripts
    }).request();
    return this;
  },
	
  processInfo: function(response){

    this.info = new Element('div', {id: this.contentId})

    // rounded corners
    this.top  = new Element('div', {'class': 'cnrR5 top'}).injectInside(this.info);
    this.tl   = new Element('div', {'class': 'lft'}).setContent("<!--Lft Corner-->").injectInside(this.top);
    this.tm   = new Element('div', {'class': 'mid'}).setContent("<!--Mid Border-->").injectInside(this.top);
    this.tr   = new Element('div', {'class': 'rgt'}).setContent("<!--Rgt Corner-->").injectInside(this.top);
    this.btm  = new Element('div', {'class': 'cnrR5 btm'}).injectInside(this.info);
    this.bl   = new Element('div', {'class': 'lft'}).setContent("<!--Lft Corner-->").injectInside(this.btm);
    this.bm   = new Element('div', {'class': 'mid'}).setContent("<!--Mid Border-->").injectInside(this.btm);
    this.br   = new Element('div', {'class': 'rgt'}).setContent("<!--Rgt Corner-->").injectInside(this.btm);

    var div   = new Element('div', {'class': 'close'}).injectInside(this.info);
    new Element('span', {'class': 'cnrL'}).injectInside(div);
    new Element('span', {'class': 'cnrB'}).injectInside(div);
    new Element('span', {'class': 'cnrBL'}).injectInside(div);
    
    this.closeLink  = new Element('a', {'id':'lb_close', 'class':'lbAction', rel:'deactivate', href:''}).setContent(lang_Close).injectInside(div);

    this.inner = new Element('div', {'class': 'inner'}).setContent(response).injectInside(this.info);
    this.info.injectBefore($('lbLoadMessage'));
    
    if(this.tPos < 0 || this.lPos < 0)
    {
      $('lightbox').setProperty('class', 'done').centerOnScreen();
    }
    else
    {
      $('lightbox').setProperty('class', 'done').positionOnScreen(this.lPos, this.tPos);
    }
    
    this.positionCorners();
		this.actions();			
    return this;
  },

  positionCorners: function() {
    var c = this.info.getCoordinates();
    this.top.setStyle('width', c.width + 'px');
    this.btm.setStyle('width', c.width + 'px');
    var tm = c.width - this.tl.getCoordinates().width - this.tr.getCoordinates().width;
    var bm = c.width - this.bl.getCoordinates().width - this.br.getCoordinates().width;
    this.tm.setStyle('width', (tm > 0 ? tm : 0) + "px");
    this.bm.setStyle('width', (bm > 0 ? bm : 0) + "px");
  },
	
	// Search through new links within the lightbox, and attach click event
	actions: function(){
		this.info.getElements('a.lbAction').each(function(v){
			v.addEvent('click', this[v.rel].bindAsEventListener(this));
		}, this);
    window.behavior.apply(this.info);
	},

  // Example of creating your own functionality once lightbox is initiated
  insert: function(e){
    if (e) new Event(e).stop();
    link = Event.element(e).parentNode;
    Element.remove(this.info);
    var myAjax = new Ajax(link.href,
      {onComplete: this.processInfo.bindAsEventListener(this)}
    ).request();
    return this;
  },

  // Example of creating your own functionality once lightbox is initiated
  deactivate: function(e){
    if (e) new Event(e).stop();
    if (!this.info.inDocument()) return false;
    Element.remove(this.info);
    if (window.ie) $$('select').setStyle('visibility', 'visible');
    this.displayLightbox("none");
    window.lightbox = null;
    return this;
  },
  
  // Example of creating your own functionality once lightbox is initiated
  // close and continue to link (return true)
  autoClose: function(e){
   if (window.ie) $$('select').setStyle('visibility', 'visible');
   this.displayLightbox("none");
   window.lightbox = null;
   return true;
  }
  
});

