/*
 * jQuery JavaScript Library v1.3.2
 * http://jquery.com/
 *
 * Copyright (c) 2009 John Resig
 * Dual licensed under the MIT and GPL licenses.
 * http://docs.jquery.com/License
 *
 * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
 * Revision: 6246
 */
(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
/*
 * Sizzle CSS Selector Engine - v0.9.3
 *  Copyright 2009, The Dojo Foundation
 *  Released under the MIT, BSD, and GPL Licenses.
 *  More information: http://sizzlejs.com/
 */
(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
/*
 * jQuery UI 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI
 */
jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/*
 * jQuery UI Datepicker 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Datepicker
 *
 * Depends:
 *	ui.core.js
 * 
 */
(function($){$.extend($.ui,{datepicker:{version:"1.7.2"}});var PROP_NAME="datepicker";function Datepicker(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._datepickerShowing=false;this._inDialog=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass="ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],dateFormat:"mm/dd/yy",firstDay:0,isRTL:false};this._defaults={showOn:"focus",showAnim:"show",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,showMonthAfterYear:false,yearRange:"-10:+10",showOtherMonths:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"normal",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false};$.extend(this._defaults,this.regional[""]);this.dpDiv=$('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>')}$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",log:function(){if(this.debug){console.log.apply("",arguments)}},setDefaults:function(settings){extendRemove(this._defaults,settings||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase();var inline=(nodeName=="div"||nodeName=="span");if(!target.id){target.id="dp"+(++this.uuid)}var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{});if(nodeName=="input"){this._connectDatepicker(target,inst)}else{if(inline){this._inlineDatepicker(target,inst)}}},_newInst:function(target,inline){var id=target[0].id.replace(/([:\[\]\.])/g,"\\\\$1");return{id:id,input:target,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:inline,dpDiv:(!inline?this.dpDiv:$('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}},_connectDatepicker:function(target,inst){var input=$(target);inst.append=$([]);inst.trigger=$([]);if(input.hasClass(this.markerClassName)){return}var appendText=this._get(inst,"appendText");var isRTL=this._get(inst,"isRTL");if(appendText){inst.append=$('<span class="'+this._appendClass+'">'+appendText+"</span>");input[isRTL?"before":"after"](inst.append)}var showOn=this._get(inst,"showOn");if(showOn=="focus"||showOn=="both"){input.focus(this._showDatepicker)}if(showOn=="button"||showOn=="both"){var buttonText=this._get(inst,"buttonText");var buttonImage=this._get(inst,"buttonImage");inst.trigger=$(this._get(inst,"buttonImageOnly")?$("<img/>").addClass(this._triggerClass).attr({src:buttonImage,alt:buttonText,title:buttonText}):$('<button type="button"></button>').addClass(this._triggerClass).html(buttonImage==""?buttonText:$("<img/>").attr({src:buttonImage,alt:buttonText,title:buttonText})));input[isRTL?"before":"after"](inst.trigger);inst.trigger.click(function(){if($.datepicker._datepickerShowing&&$.datepicker._lastInput==target){$.datepicker._hideDatepicker()}else{$.datepicker._showDatepicker(target)}return false})}input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});$.data(target,PROP_NAME,inst)},_inlineDatepicker:function(target,inst){var divSpan=$(target);if(divSpan.hasClass(this.markerClassName)){return}divSpan.addClass(this.markerClassName).append(inst.dpDiv).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});$.data(target,PROP_NAME,inst);this._setDate(inst,this._getDefaultDate(inst));this._updateDatepicker(inst);this._updateAlternate(inst)},_dialogDatepicker:function(input,dateText,onSelect,settings,pos){var inst=this._dialogInst;if(!inst){var id="dp"+(++this.uuid);this._dialogInput=$('<input type="text" id="'+id+'" size="1" style="position: absolute; top: -100px;"/>');this._dialogInput.keydown(this._doKeyDown);$("body").append(this._dialogInput);inst=this._dialogInst=this._newInst(this._dialogInput,false);inst.settings={};$.data(this._dialogInput[0],PROP_NAME,inst)}extendRemove(inst.settings,settings||{});this._dialogInput.val(dateText);this._pos=(pos?(pos.length?pos:[pos.pageX,pos.pageY]):null);if(!this._pos){var browserWidth=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;var browserHeight=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;var scrollY=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[(browserWidth/2)-100+scrollX,(browserHeight/2)-150+scrollY]}this._dialogInput.css("left",this._pos[0]+"px").css("top",this._pos[1]+"px");inst.settings.onSelect=onSelect;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);if($.blockUI){$.blockUI(this.dpDiv)}$.data(this._dialogInput[0],PROP_NAME,inst);return this},_destroyDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();$.removeData(target,PROP_NAME);if(nodeName=="input"){inst.append.remove();inst.trigger.remove();$target.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress)}else{if(nodeName=="div"||nodeName=="span"){$target.removeClass(this.markerClassName).empty()}}},_enableDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=false;inst.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().removeClass("ui-state-disabled")}}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)})},_disableDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=true;inst.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().addClass("ui-state-disabled")}}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)});this._disabledInputs[this._disabledInputs.length]=target},_isDisabledDatepicker:function(target){if(!target){return false}for(var i=0;i<this._disabledInputs.length;i++){if(this._disabledInputs[i]==target){return true}}return false},_getInst:function(target){try{return $.data(target,PROP_NAME)}catch(err){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(target,name,value){var inst=this._getInst(target);if(arguments.length==2&&typeof name=="string"){return(name=="defaults"?$.extend({},$.datepicker._defaults):(inst?(name=="all"?$.extend({},inst.settings):this._get(inst,name)):null))}var settings=name||{};if(typeof name=="string"){settings={};settings[name]=value}if(inst){if(this._curInst==inst){this._hideDatepicker(null)}var date=this._getDateDatepicker(target);extendRemove(inst.settings,settings);this._setDateDatepicker(target,date);this._updateDatepicker(inst)}},_changeDatepicker:function(target,name,value){this._optionDatepicker(target,name,value)},_refreshDatepicker:function(target){var inst=this._getInst(target);if(inst){this._updateDatepicker(inst)}},_setDateDatepicker:function(target,date,endDate){var inst=this._getInst(target);if(inst){this._setDate(inst,date,endDate);this._updateDatepicker(inst);this._updateAlternate(inst)}},_getDateDatepicker:function(target){var inst=this._getInst(target);if(inst&&!inst.inline){this._setDateFromField(inst)}return(inst?this._getDate(inst):null)},_doKeyDown:function(event){var inst=$.datepicker._getInst(event.target);var handled=true;var isRTL=inst.dpDiv.is(".ui-datepicker-rtl");inst._keyEvent=true;if($.datepicker._datepickerShowing){switch(event.keyCode){case 9:$.datepicker._hideDatepicker(null,"");break;case 13:var sel=$("td."+$.datepicker._dayOverClass+", td."+$.datepicker._currentClass,inst.dpDiv);if(sel[0] && false){$.datepicker._selectDay(event.target,inst.selectedMonth,inst.selectedYear,sel[0])}else{$.datepicker._hideDatepicker(null,$.datepicker._get(inst,"duration"))}return false;break;case 27:$.datepicker._hideDatepicker(null,$.datepicker._get(inst,"duration"));break;case 33:$.datepicker._adjustDate(event.target,(event.ctrlKey?-$.datepicker._get(inst,"stepBigMonths"):-$.datepicker._get(inst,"stepMonths")),"M");break;case 34:$.datepicker._adjustDate(event.target,(event.ctrlKey?+$.datepicker._get(inst,"stepBigMonths"):+$.datepicker._get(inst,"stepMonths")),"M");break;case 35:if(event.ctrlKey||event.metaKey){$.datepicker._clearDate(event.target)}handled=event.ctrlKey||event.metaKey;break;case 36:if(event.ctrlKey||event.metaKey){$.datepicker._gotoToday(event.target)}handled=event.ctrlKey||event.metaKey;break;case 37:if(event.ctrlKey||event.metaKey){$.datepicker._adjustDate(event.target,(isRTL?+1:-1),"D")}handled=event.ctrlKey||event.metaKey;if(event.originalEvent.altKey){$.datepicker._adjustDate(event.target,(event.ctrlKey?-$.datepicker._get(inst,"stepBigMonths"):-$.datepicker._get(inst,"stepMonths")),"M")}break;case 38:if(event.ctrlKey||event.metaKey){$.datepicker._adjustDate(event.target,-7,"D")}handled=event.ctrlKey||event.metaKey;break;case 39:if(event.ctrlKey||event.metaKey){$.datepicker._adjustDate(event.target,(isRTL?-1:+1),"D")}handled=event.ctrlKey||event.metaKey;if(event.originalEvent.altKey){$.datepicker._adjustDate(event.target,(event.ctrlKey?+$.datepicker._get(inst,"stepBigMonths"):+$.datepicker._get(inst,"stepMonths")),"M")}break;case 40:if(event.ctrlKey||event.metaKey){$.datepicker._adjustDate(event.target,+7,"D")}handled=event.ctrlKey||event.metaKey;break;default:handled=false}}else{if(event.keyCode==36&&event.ctrlKey){$.datepicker._showDatepicker(this)}else{handled=false}}if(handled){event.preventDefault();event.stopPropagation()}},_doKeyPress:function(event){var inst=$.datepicker._getInst(event.target);if($.datepicker._get(inst,"constrainInput")){var chars=$.datepicker._possibleChars($.datepicker._get(inst,"dateFormat"));var chr=String.fromCharCode(event.charCode==undefined?event.keyCode:event.charCode);return event.ctrlKey||(chr<" "||!chars||chars.indexOf(chr)>-1)}},_showDatepicker:function(input){input=input.target||input;if(input.nodeName.toLowerCase()!="input"){input=$("input",input.parentNode)[0]}if($.datepicker._isDisabledDatepicker(input)||$.datepicker._lastInput==input){return}var inst=$.datepicker._getInst(input);var beforeShow=$.datepicker._get(inst,"beforeShow");extendRemove(inst.settings,(beforeShow?beforeShow.apply(input,[input,inst]):{}));$.datepicker._hideDatepicker(null,"");$.datepicker._lastInput=input;$.datepicker._setDateFromField(inst);if($.datepicker._inDialog){input.value=""}if(!$.datepicker._pos){$.datepicker._pos=$.datepicker._findPos(input);$.datepicker._pos[1]+=input.offsetHeight}var isFixed=false;$(input).parents().each(function(){isFixed|=$(this).css("position")=="fixed";return !isFixed});if(isFixed&&$.browser.opera){$.datepicker._pos[0]-=document.documentElement.scrollLeft;$.datepicker._pos[1]-=document.documentElement.scrollTop}var offset={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null;inst.rangeStart=null;inst.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});$.datepicker._updateDatepicker(inst);offset=$.datepicker._checkOffset(inst,offset,isFixed);inst.dpDiv.css({position:($.datepicker._inDialog&&$.blockUI?"static":(isFixed?"fixed":"absolute")),display:"none",left:offset.left+"px",top:offset.top+"px"});if(!inst.inline){var showAnim=$.datepicker._get(inst,"showAnim")||"show";var duration=$.datepicker._get(inst,"duration");var postProcess=function(){$.datepicker._datepickerShowing=true;if($.browser.msie&&parseInt($.browser.version,10)<7){$("iframe.ui-datepicker-cover").css({width:inst.dpDiv.width()+4,height:inst.dpDiv.height()+4})}};if($.effects&&$.effects[showAnim]){inst.dpDiv.show(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[showAnim](duration,postProcess)}if(duration==""){postProcess()}if(inst.input[0].type!="hidden"){inst.input[0].focus()}$.datepicker._curInst=inst}},_updateDatepicker:function(inst){var dims={width:inst.dpDiv.width()+4,height:inst.dpDiv.height()+4};var self=this;inst.dpDiv.empty().append(this._generateHTML(inst)).find("iframe.ui-datepicker-cover").css({width:dims.width,height:dims.height}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){$(this).removeClass("ui-state-hover");if(this.className.indexOf("ui-datepicker-prev")!=-1){$(this).removeClass("ui-datepicker-prev-hover")}if(this.className.indexOf("ui-datepicker-next")!=-1){$(this).removeClass("ui-datepicker-next-hover")}}).bind("mouseover",function(){if(!self._isDisabledDatepicker(inst.inline?inst.dpDiv.parent()[0]:inst.input[0])){$(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");$(this).addClass("ui-state-hover");if(this.className.indexOf("ui-datepicker-prev")!=-1){$(this).addClass("ui-datepicker-prev-hover")}if(this.className.indexOf("ui-datepicker-next")!=-1){$(this).addClass("ui-datepicker-next-hover")}}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();var numMonths=this._getNumberOfMonths(inst);var cols=numMonths[1];var width=17;if(cols>1){inst.dpDiv.addClass("ui-datepicker-multi-"+cols).css("width",(width*cols)+"em")}else{inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("")}inst.dpDiv[(numMonths[0]!=1||numMonths[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");inst.dpDiv[(this._get(inst,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");if(inst.input&&inst.input[0].type!="hidden"&&inst==$.datepicker._curInst){$(inst.input[0]).focus()}},_checkOffset:function(inst,offset,isFixed){var dpWidth=inst.dpDiv.outerWidth();var dpHeight=inst.dpDiv.outerHeight();var inputWidth=inst.input?inst.input.outerWidth():0;var inputHeight=inst.input?inst.input.outerHeight():0;var viewWidth=(window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth)+$(document).scrollLeft();var viewHeight=(window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight)+$(document).scrollTop();offset.left-=(this._get(inst,"isRTL")?(dpWidth-inputWidth):0);offset.left-=(isFixed&&offset.left==inst.input.offset().left)?$(document).scrollLeft():0;offset.top-=(isFixed&&offset.top==(inst.input.offset().top+inputHeight))?$(document).scrollTop():0;offset.left-=(offset.left+dpWidth>viewWidth&&viewWidth>dpWidth)?Math.abs(offset.left+dpWidth-viewWidth):0;offset.top-=(offset.top+dpHeight>viewHeight&&viewHeight>dpHeight)?Math.abs(offset.top+dpHeight+inputHeight*2-viewHeight):0;return offset},_findPos:function(obj){while(obj&&(obj.type=="hidden"||obj.nodeType!=1)){obj=obj.nextSibling}var position=$(obj).offset();return[position.left,position.top]},_hideDatepicker:function(input,duration){var inst=this._curInst;if(!inst||(input&&inst!=$.data(input,PROP_NAME))){return}if(inst.stayOpen){this._selectDate("#"+inst.id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear))}inst.stayOpen=false;if(this._datepickerShowing){duration=(duration!=null?duration:this._get(inst,"duration"));var showAnim=this._get(inst,"showAnim");var postProcess=function(){$.datepicker._tidyDialog(inst)};if(duration!=""&&$.effects&&$.effects[showAnim]){inst.dpDiv.hide(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[(duration==""?"hide":(showAnim=="slideDown"?"slideUp":(showAnim=="fadeIn"?"fadeOut":"hide")))](duration,postProcess)}if(duration==""){this._tidyDialog(inst)}var onClose=this._get(inst,"onClose");if(onClose){onClose.apply((inst.input?inst.input[0]:null),[(inst.input?inst.input.val():""),inst])}this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if($.blockUI){$.unblockUI();$("body").append(this.dpDiv)}}this._inDialog=false}this._curInst=null},_tidyDialog:function(inst){inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(event){if(!$.datepicker._curInst){return}var $target=$(event.target);if(($target.parents("#"+$.datepicker._mainDivId).length==0)&&!$target.hasClass($.datepicker.markerClassName)&&!$target.hasClass($.datepicker._triggerClass)&&$.datepicker._datepickerShowing&&!($.datepicker._inDialog&&$.blockUI)){$.datepicker._hideDatepicker(null,"")}},_adjustDate:function(id,offset,period){var target=$(id);var inst=this._getInst(target[0]);if(this._isDisabledDatepicker(target[0])){return}this._adjustInstDate(inst,offset+(period=="M"?this._get(inst,"showCurrentAtPos"):0),period);this._updateDatepicker(inst)},_gotoToday:function(id){var target=$(id);var inst=this._getInst(target[0]);if(this._get(inst,"gotoCurrent")&&inst.currentDay){inst.selectedDay=inst.currentDay;inst.drawMonth=inst.selectedMonth=inst.currentMonth;inst.drawYear=inst.selectedYear=inst.currentYear}else{var date=new Date();inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear()}this._notifyChange(inst);this._adjustDate(target)},_selectMonthYear:function(id,select,period){var target=$(id);var inst=this._getInst(target[0]);inst._selectingMonthYear=false;inst["selected"+(period=="M"?"Month":"Year")]=inst["draw"+(period=="M"?"Month":"Year")]=parseInt(select.options[select.selectedIndex].value,10);this._notifyChange(inst);this._adjustDate(target)},_clickMonthYear:function(id){var target=$(id);var inst=this._getInst(target[0]);if(inst.input&&inst._selectingMonthYear&&!$.browser.msie){inst.input[0].focus()}inst._selectingMonthYear=!inst._selectingMonthYear},_selectDay:function(id,month,year,td){var target=$(id);if($(td).hasClass(this._unselectableClass)||this._isDisabledDatepicker(target[0])){return}var inst=this._getInst(target[0]);inst.selectedDay=inst.currentDay=$("a",td).html();inst.selectedMonth=inst.currentMonth=month;inst.selectedYear=inst.currentYear=year;if(inst.stayOpen){inst.endDay=inst.endMonth=inst.endYear=null}this._selectDate(id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear));if(inst.stayOpen){inst.rangeStart=this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay));this._updateDatepicker(inst)}},_clearDate:function(id){var target=$(id);var inst=this._getInst(target[0]);inst.stayOpen=false;inst.endDay=inst.endMonth=inst.endYear=inst.rangeStart=null;this._selectDate(target,"")},_selectDate:function(id,dateStr){var target=$(id);var inst=this._getInst(target[0]);dateStr=(dateStr!=null?dateStr:this._formatDate(inst));if(inst.input){inst.input.val(dateStr)}this._updateAlternate(inst);var onSelect=this._get(inst,"onSelect");if(onSelect){onSelect.apply((inst.input?inst.input[0]:null),[dateStr,inst])}else{if(inst.input){inst.input.trigger("change")}}if(inst.inline){this._updateDatepicker(inst)}else{if(!inst.stayOpen){this._hideDatepicker(null,this._get(inst,"duration"));this._lastInput=inst.input[0];if(typeof(inst.input[0])!="object"){inst.input[0].focus()}this._lastInput=null}}},_updateAlternate:function(inst){var altField=this._get(inst,"altField");if(altField){var altFormat=this._get(inst,"altFormat")||this._get(inst,"dateFormat");var date=this._getDate(inst);dateStr=this.formatDate(altFormat,date,this._getFormatConfig(inst));$(altField).each(function(){$(this).val(dateStr)})}},noWeekends:function(date){var day=date.getDay();return[(day>0&&day<6),""]},iso8601Week:function(date){var checkDate=new Date(date.getFullYear(),date.getMonth(),date.getDate());var firstMon=new Date(checkDate.getFullYear(),1-1,4);var firstDay=firstMon.getDay()||7;firstMon.setDate(firstMon.getDate()+1-firstDay);if(firstDay<4&&checkDate<firstMon){checkDate.setDate(checkDate.getDate()-3);return $.datepicker.iso8601Week(checkDate)}else{if(checkDate>new Date(checkDate.getFullYear(),12-1,28)){firstDay=new Date(checkDate.getFullYear()+1,1-1,4).getDay()||7;if(firstDay>4&&(checkDate.getDay()||7)<firstDay-3){return 1}}}return Math.floor(((checkDate-firstMon)/86400000)/7)+1},parseDate:function(format,value,settings){if(format==null||value==null){throw"Invalid arguments"}value=(typeof value=="object"?value.toString():value+"");if(value==""){return null}var shortYearCutoff=(settings?settings.shortYearCutoff:null)||this._defaults.shortYearCutoff;var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var year=-1;var month=-1;var day=-1;var doy=-1;var literal=false;var lookAhead=function(match){var matches=(iFormat+1<format.length&&format.charAt(iFormat+1)==match);if(matches){iFormat++}return matches};var getNumber=function(match){lookAhead(match);var origSize=(match=="@"?14:(match=="y"?4:(match=="o"?3:2)));var size=origSize;var num=0;while(size>0&&iValue<value.length&&value.charAt(iValue)>="0"&&value.charAt(iValue)<="9"){num=num*10+parseInt(value.charAt(iValue++),10);size--}if(size==origSize){throw"Missing number at position "+iValue}return num};var getName=function(match,shortNames,longNames){var names=(lookAhead(match)?longNames:shortNames);var size=0;for(var j=0;j<names.length;j++){size=Math.max(size,names[j].length)}var name="";var iInit=iValue;while(size>0&&iValue<value.length){name+=value.charAt(iValue++);for(var i=0;i<names.length;i++){if(name==names[i]){return i+1}}size--}throw"Unknown name at position "+iInit};var checkLiteral=function(){if(value.charAt(iValue)!=format.charAt(iFormat)){throw"Unexpected literal at position "+iValue}iValue++};var iValue=0;for(var iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)=="'"&&!lookAhead("'")){literal=false}else{checkLiteral()}}else{switch(format.charAt(iFormat)){case"d":day=getNumber("d");break;case"D":getName("D",dayNamesShort,dayNames);break;case"o":doy=getNumber("o");break;case"m":month=getNumber("m");break;case"M":month=getName("M",monthNamesShort,monthNames);break;case"y":year=getNumber("y");break;case"@":var date=new Date(getNumber("@"));year=date.getFullYear();month=date.getMonth()+1;day=date.getDate();break;case"'":if(lookAhead("'")){checkLiteral()}else{literal=true}break;default:checkLiteral()}}}if(year==-1){year=new Date().getFullYear()}else{if(year<100){year+=new Date().getFullYear()-new Date().getFullYear()%100+(year<=shortYearCutoff?0:-100)}}if(doy>-1){month=1;day=doy;do{var dim=this._getDaysInMonth(year,month-1);if(day<=dim){break}month++;day-=dim}while(true)}var date=this._daylightSavingAdjust(new Date(year,month-1,day));if(date.getFullYear()!=year||date.getMonth()+1!=month||date.getDate()!=day){throw"Invalid date"}return date},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TIMESTAMP:"@",W3C:"yy-mm-dd",formatDate:function(format,date,settings){if(!date){return""}var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var lookAhead=function(match){var matches=(iFormat+1<format.length&&format.charAt(iFormat+1)==match);if(matches){iFormat++}return matches};var formatNumber=function(match,value,len){var num=""+value;if(lookAhead(match)){while(num.length<len){num="0"+num}}return num};var formatName=function(match,value,shortNames,longNames){return(lookAhead(match)?longNames[value]:shortNames[value])};var output="";var literal=false;if(date){for(var iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)=="'"&&!lookAhead("'")){literal=false}else{output+=format.charAt(iFormat)}}else{switch(format.charAt(iFormat)){case"d":output+=formatNumber("d",date.getDate(),2);break;case"D":output+=formatName("D",date.getDay(),dayNamesShort,dayNames);break;case"o":var doy=date.getDate();for(var m=date.getMonth()-1;m>=0;m--){doy+=this._getDaysInMonth(date.getFullYear(),m)}output+=formatNumber("o",doy,3);break;case"m":output+=formatNumber("m",date.getMonth()+1,2);break;case"M":output+=formatName("M",date.getMonth(),monthNamesShort,monthNames);break;case"y":output+=(lookAhead("y")?date.getFullYear():(date.getYear()%100<10?"0":"")+date.getYear()%100);break;case"@":output+=date.getTime();break;case"'":if(lookAhead("'")){output+="'"}else{literal=true}break;default:output+=format.charAt(iFormat)}}}}return output},_possibleChars:function(format){var chars="";var literal=false;for(var iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)=="'"&&!lookAhead("'")){literal=false}else{chars+=format.charAt(iFormat)}}else{switch(format.charAt(iFormat)){case"d":case"m":case"y":case"@":chars+="0123456789";break;case"D":case"M":return null;case"'":if(lookAhead("'")){chars+="'"}else{literal=true}break;default:chars+=format.charAt(iFormat)}}}return chars},_get:function(inst,name){return inst.settings[name]!==undefined?inst.settings[name]:this._defaults[name]},_setDateFromField:function(inst){var dateFormat=this._get(inst,"dateFormat");var dates=inst.input?inst.input.val():null;inst.endDay=inst.endMonth=inst.endYear=null;var date=defaultDate=this._getDefaultDate(inst);var settings=this._getFormatConfig(inst);try{date=this.parseDate(dateFormat,dates,settings)||defaultDate}catch(event){this.log(event);date=defaultDate}inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();inst.currentDay=(dates?date.getDate():0);inst.currentMonth=(dates?date.getMonth():0);inst.currentYear=(dates?date.getFullYear():0);this._adjustInstDate(inst)},_getDefaultDate:function(inst){var date=this._determineDate(this._get(inst,"defaultDate"),new Date());var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");date=(minDate&&date<minDate?minDate:date);date=(maxDate&&date>maxDate?maxDate:date);return date},_determineDate:function(date,defaultDate){var offsetNumeric=function(offset){var date=new Date();date.setDate(date.getDate()+offset);return date};var offsetString=function(offset,getDaysInMonth){var date=new Date();var year=date.getFullYear();var month=date.getMonth();var day=date.getDate();var pattern=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;var matches=pattern.exec(offset);while(matches){switch(matches[2]||"d"){case"d":case"D":day+=parseInt(matches[1],10);break;case"w":case"W":day+=parseInt(matches[1],10)*7;break;case"m":case"M":month+=parseInt(matches[1],10);day=Math.min(day,getDaysInMonth(year,month));break;case"y":case"Y":year+=parseInt(matches[1],10);day=Math.min(day,getDaysInMonth(year,month));break}matches=pattern.exec(offset)}return new Date(year,month,day)};date=(date==null?defaultDate:(typeof date=="string"?offsetString(date,this._getDaysInMonth):(typeof date=="number"?(isNaN(date)?defaultDate:offsetNumeric(date)):date)));date=(date&&date.toString()=="Invalid Date"?defaultDate:date);if(date){date.setHours(0);date.setMinutes(0);date.setSeconds(0);date.setMilliseconds(0)}return this._daylightSavingAdjust(date)},_daylightSavingAdjust:function(date){if(!date){return null}date.setHours(date.getHours()>12?date.getHours()+2:0);return date},_setDate:function(inst,date,endDate){var clear=!(date);var origMonth=inst.selectedMonth;var origYear=inst.selectedYear;date=this._determineDate(date,new Date());inst.selectedDay=inst.currentDay=date.getDate();inst.drawMonth=inst.selectedMonth=inst.currentMonth=date.getMonth();inst.drawYear=inst.selectedYear=inst.currentYear=date.getFullYear();if(origMonth!=inst.selectedMonth||origYear!=inst.selectedYear){this._notifyChange(inst)}this._adjustInstDate(inst);if(inst.input){inst.input.val(clear?"":this._formatDate(inst))}},_getDate:function(inst){var startDate=(!inst.currentYear||(inst.input&&inst.input.val()=="")?null:this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return startDate},_generateHTML:function(inst){var today=new Date();today=this._daylightSavingAdjust(new Date(today.getFullYear(),today.getMonth(),today.getDate()));var isRTL=this._get(inst,"isRTL");var showButtonPanel=this._get(inst,"showButtonPanel");var hideIfNoPrevNext=this._get(inst,"hideIfNoPrevNext");var navigationAsDateFormat=this._get(inst,"navigationAsDateFormat");var numMonths=this._getNumberOfMonths(inst);var showCurrentAtPos=this._get(inst,"showCurrentAtPos");var stepMonths=this._get(inst,"stepMonths");var stepBigMonths=this._get(inst,"stepBigMonths");var isMultiMonth=(numMonths[0]!=1||numMonths[1]!=1);var currentDate=this._daylightSavingAdjust((!inst.currentDay?new Date(9999,9,9):new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");var drawMonth=inst.drawMonth-showCurrentAtPos;var drawYear=inst.drawYear;if(drawMonth<0){drawMonth+=12;drawYear--}if(maxDate){var maxDraw=this._daylightSavingAdjust(new Date(maxDate.getFullYear(),maxDate.getMonth()-numMonths[1]+1,maxDate.getDate()));maxDraw=(minDate&&maxDraw<minDate?minDate:maxDraw);while(this._daylightSavingAdjust(new Date(drawYear,drawMonth,1))>maxDraw){drawMonth--;if(drawMonth<0){drawMonth=11;drawYear--}}}inst.drawMonth=drawMonth;inst.drawYear=drawYear;var prevText=this._get(inst,"prevText");prevText=(!navigationAsDateFormat?prevText:this.formatDate(prevText,this._daylightSavingAdjust(new Date(drawYear,drawMonth-stepMonths,1)),this._getFormatConfig(inst)));var prev=(this._canAdjustMonth(inst,-1,drawYear,drawMonth)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery.datepicker._adjustDate(\'#'+inst.id+"', -"+stepMonths+", 'M');\" title=\""+prevText+'"><span class="ui-icon ui-icon-circle-triangle-'+(isRTL?"e":"w")+'">'+prevText+"</span></a>":(hideIfNoPrevNext?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+prevText+'"><span class="ui-icon ui-icon-circle-triangle-'+(isRTL?"e":"w")+'">'+prevText+"</span></a>"));var nextText=this._get(inst,"nextText");nextText=(!navigationAsDateFormat?nextText:this.formatDate(nextText,this._daylightSavingAdjust(new Date(drawYear,drawMonth+stepMonths,1)),this._getFormatConfig(inst)));var next=(this._canAdjustMonth(inst,+1,drawYear,drawMonth)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery.datepicker._adjustDate(\'#'+inst.id+"', +"+stepMonths+", 'M');\" title=\""+nextText+'"><span class="ui-icon ui-icon-circle-triangle-'+(isRTL?"w":"e")+'">'+nextText+"</span></a>":(hideIfNoPrevNext?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+nextText+'"><span class="ui-icon ui-icon-circle-triangle-'+(isRTL?"w":"e")+'">'+nextText+"</span></a>"));var currentText=this._get(inst,"currentText");var gotoDate=(this._get(inst,"gotoCurrent")&&inst.currentDay?currentDate:today);currentText=(!navigationAsDateFormat?currentText:this.formatDate(currentText,gotoDate,this._getFormatConfig(inst)));var controls=(!inst.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery.datepicker._hideDatepicker();">'+this._get(inst,"closeText")+"</button>":"");var buttonPanel=(showButtonPanel)?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(isRTL?controls:"")+(this._isInRange(inst,gotoDate)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery.datepicker._gotoToday(\'#'+inst.id+"');\">"+currentText+"</button>":"")+(isRTL?"":controls)+"</div>":"";var firstDay=parseInt(this._get(inst,"firstDay"),10);firstDay=(isNaN(firstDay)?0:firstDay);var dayNames=this._get(inst,"dayNames");var dayNamesShort=this._get(inst,"dayNamesShort");var dayNamesMin=this._get(inst,"dayNamesMin");var monthNames=this._get(inst,"monthNames");var monthNamesShort=this._get(inst,"monthNamesShort");var beforeShowDay=this._get(inst,"beforeShowDay");var showOtherMonths=this._get(inst,"showOtherMonths");var calculateWeek=this._get(inst,"calculateWeek")||this.iso8601Week;var endDate=inst.endDay?this._daylightSavingAdjust(new Date(inst.endYear,inst.endMonth,inst.endDay)):currentDate;var defaultDate=this._getDefaultDate(inst);var html="";for(var row=0;row<numMonths[0];row++){var group="";for(var col=0;col<numMonths[1];col++){var selectedDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,inst.selectedDay));var cornerClass=" ui-corner-all";var calender="";if(isMultiMonth){calender+='<div class="ui-datepicker-group ui-datepicker-group-';switch(col){case 0:calender+="first";cornerClass=" ui-corner-"+(isRTL?"right":"left");break;case numMonths[1]-1:calender+="last";cornerClass=" ui-corner-"+(isRTL?"left":"right");break;default:calender+="middle";cornerClass="";break}calender+='">'}calender+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+cornerClass+'">'+(/all|left/.test(cornerClass)&&row==0?(isRTL?next:prev):"")+(/all|right/.test(cornerClass)&&row==0?(isRTL?prev:next):"")+this._generateMonthYearHeader(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,row>0||col>0,monthNames,monthNamesShort)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var thead="";for(var dow=0;dow<7;dow++){var day=(dow+firstDay)%7;thead+="<th"+((dow+firstDay+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+dayNames[day]+'">'+dayNamesMin[day]+"</span></th>"}calender+=thead+"</tr></thead><tbody>";var daysInMonth=this._getDaysInMonth(drawYear,drawMonth);if(drawYear==inst.selectedYear&&drawMonth==inst.selectedMonth){inst.selectedDay=Math.min(inst.selectedDay,daysInMonth)}var leadDays=(this._getFirstDayOfMonth(drawYear,drawMonth)-firstDay+7)%7;var numRows=(isMultiMonth?6:Math.ceil((leadDays+daysInMonth)/7));var printDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,1-leadDays));for(var dRow=0;dRow<numRows;dRow++){calender+="<tr>";var tbody="";for(var dow=0;dow<7;dow++){var daySettings=(beforeShowDay?beforeShowDay.apply((inst.input?inst.input[0]:null),[printDate]):[true,""]);var otherMonth=(printDate.getMonth()!=drawMonth);var unselectable=otherMonth||!daySettings[0]||(minDate&&printDate<minDate)||(maxDate&&printDate>maxDate);tbody+='<td class="'+((dow+firstDay+6)%7>=5?" ui-datepicker-week-end":"")+(otherMonth?" ui-datepicker-other-month":"")+((printDate.getTime()==selectedDate.getTime()&&drawMonth==inst.selectedMonth&&inst._keyEvent)||(defaultDate.getTime()==printDate.getTime()&&defaultDate.getTime()==selectedDate.getTime())?" "+this._dayOverClass:"")+(unselectable?" "+this._unselectableClass+" ui-state-disabled":"")+(otherMonth&&!showOtherMonths?"":" "+daySettings[1]+(printDate.getTime()>=currentDate.getTime()&&printDate.getTime()<=endDate.getTime()?" "+this._currentClass:"")+(printDate.getTime()==today.getTime()?" ui-datepicker-today":""))+'"'+((!otherMonth||showOtherMonths)&&daySettings[2]?' title="'+daySettings[2]+'"':"")+(unselectable?"":" onclick=\"DP_jQuery.datepicker._selectDay('#"+inst.id+"',"+drawMonth+","+drawYear+', this);return false;"')+">"+(otherMonth?(showOtherMonths?printDate.getDate():"&#xa0;"):(unselectable?'<span class="ui-state-default">'+printDate.getDate()+"</span>":'<a class="ui-state-default'+(printDate.getTime()==today.getTime()?" ui-state-highlight":"")+(printDate.getTime()>=currentDate.getTime()&&printDate.getTime()<=endDate.getTime()?" ui-state-active":"")+'" href="#">'+printDate.getDate()+"</a>"))+"</td>";printDate.setDate(printDate.getDate()+1);printDate=this._daylightSavingAdjust(printDate)}calender+=tbody+"</tr>"}drawMonth++;if(drawMonth>11){drawMonth=0;drawYear++}calender+="</tbody></table>"+(isMultiMonth?"</div>"+((numMonths[0]>0&&col==numMonths[1]-1)?'<div class="ui-datepicker-row-break"></div>':""):"");group+=calender}html+=group}html+=buttonPanel+($.browser.msie&&parseInt($.browser.version,10)<7&&!inst.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");inst._keyEvent=false;return html},_generateMonthYearHeader:function(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,secondary,monthNames,monthNamesShort){minDate=(inst.rangeStart&&minDate&&selectedDate<minDate?selectedDate:minDate);var changeMonth=this._get(inst,"changeMonth");var changeYear=this._get(inst,"changeYear");var showMonthAfterYear=this._get(inst,"showMonthAfterYear");var html='<div class="ui-datepicker-title">';var monthHtml="";if(secondary||!changeMonth){monthHtml+='<span class="ui-datepicker-month">'+monthNames[drawMonth]+"</span> "}else{var inMinYear=(minDate&&minDate.getFullYear()==drawYear);var inMaxYear=(maxDate&&maxDate.getFullYear()==drawYear);monthHtml+='<select class="ui-datepicker-month" onchange="DP_jQuery.datepicker._selectMonthYear(\'#'+inst.id+"', this, 'M');\" onclick=\"DP_jQuery.datepicker._clickMonthYear('#"+inst.id+"');\">";for(var month=0;month<12;month++){if((!inMinYear||month>=minDate.getMonth())&&(!inMaxYear||month<=maxDate.getMonth())){monthHtml+='<option value="'+month+'"'+(month==drawMonth?' selected="selected"':"")+">"+monthNamesShort[month]+"</option>"}}monthHtml+="</select>"}if(!showMonthAfterYear){html+=monthHtml+((secondary||changeMonth||changeYear)&&(!(changeMonth&&changeYear))?"&#xa0;":"")}if(secondary||!changeYear){html+='<span class="ui-datepicker-year">'+drawYear+"</span>"}else{var years=this._get(inst,"yearRange").split(":");var year=0;var endYear=0;if(years.length!=2){year=drawYear-10;endYear=drawYear+10}else{if(years[0].charAt(0)=="+"||years[0].charAt(0)=="-"){year=drawYear+parseInt(years[0],10);endYear=drawYear+parseInt(years[1],10)}else{year=parseInt(years[0],10);endYear=parseInt(years[1],10)}}year=(minDate?Math.max(year,minDate.getFullYear()):year);endYear=(maxDate?Math.min(endYear,maxDate.getFullYear()):endYear);html+='<select class="ui-datepicker-year" onchange="DP_jQuery.datepicker._selectMonthYear(\'#'+inst.id+"', this, 'Y');\" onclick=\"DP_jQuery.datepicker._clickMonthYear('#"+inst.id+"');\">";for(;year<=endYear;year++){html+='<option value="'+year+'"'+(year==drawYear?' selected="selected"':"")+">"+year+"</option>"}html+="</select>"}if(showMonthAfterYear){html+=(secondary||changeMonth||changeYear?"&#xa0;":"")+monthHtml}html+="</div>";return html},_adjustInstDate:function(inst,offset,period){var year=inst.drawYear+(period=="Y"?offset:0);var month=inst.drawMonth+(period=="M"?offset:0);var day=Math.min(inst.selectedDay,this._getDaysInMonth(year,month))+(period=="D"?offset:0);var date=this._daylightSavingAdjust(new Date(year,month,day));var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");date=(minDate&&date<minDate?minDate:date);date=(maxDate&&date>maxDate?maxDate:date);inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();if(period=="M"||period=="Y"){this._notifyChange(inst)}},_notifyChange:function(inst){var onChange=this._get(inst,"onChangeMonthYear");if(onChange){onChange.apply((inst.input?inst.input[0]:null),[inst.selectedYear,inst.selectedMonth+1,inst])}},_getNumberOfMonths:function(inst){var numMonths=this._get(inst,"numberOfMonths");return(numMonths==null?[1,1]:(typeof numMonths=="number"?[1,numMonths]:numMonths))},_getMinMaxDate:function(inst,minMax,checkRange){var date=this._determineDate(this._get(inst,minMax+"Date"),null);return(!checkRange||!inst.rangeStart?date:(!date||inst.rangeStart>date?inst.rangeStart:date))},_getDaysInMonth:function(year,month){return 32-new Date(year,month,32).getDate()},_getFirstDayOfMonth:function(year,month){return new Date(year,month,1).getDay()},_canAdjustMonth:function(inst,offset,curYear,curMonth){var numMonths=this._getNumberOfMonths(inst);var date=this._daylightSavingAdjust(new Date(curYear,curMonth+(offset<0?offset:numMonths[1]),1));if(offset<0){date.setDate(this._getDaysInMonth(date.getFullYear(),date.getMonth()))}return this._isInRange(inst,date)},_isInRange:function(inst,date){var newMinDate=(!inst.rangeStart?null:this._daylightSavingAdjust(new Date(inst.selectedYear,inst.selectedMonth,inst.selectedDay)));newMinDate=(newMinDate&&inst.rangeStart<newMinDate?inst.rangeStart:newMinDate);var minDate=newMinDate||this._getMinMaxDate(inst,"min");var maxDate=this._getMinMaxDate(inst,"max");return((!minDate||date>=minDate)&&(!maxDate||date<=maxDate))},_getFormatConfig:function(inst){var shortYearCutoff=this._get(inst,"shortYearCutoff");shortYearCutoff=(typeof shortYearCutoff!="string"?shortYearCutoff:new Date().getFullYear()%100+parseInt(shortYearCutoff,10));return{shortYearCutoff:shortYearCutoff,dayNamesShort:this._get(inst,"dayNamesShort"),dayNames:this._get(inst,"dayNames"),monthNamesShort:this._get(inst,"monthNamesShort"),monthNames:this._get(inst,"monthNames")}},_formatDate:function(inst,day,month,year){if(!day){inst.currentDay=inst.selectedDay;inst.currentMonth=inst.selectedMonth;inst.currentYear=inst.selectedYear}var date=(day?(typeof day=="object"?day:this._daylightSavingAdjust(new Date(year,month,day))):this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return this.formatDate(this._get(inst,"dateFormat"),date,this._getFormatConfig(inst))}});function extendRemove(target,props){$.extend(target,props);for(var name in props){if(props[name]==null||props[name]==undefined){target[name]=props[name]}}return target}function isArray(a){return(a&&(($.browser.safari&&typeof a=="object"&&a.length)||(a.constructor&&a.constructor.toString().match(/\Array\(\)/))))}$.fn.datepicker=function(options){if(!$.datepicker.initialized){$(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv);$.datepicker.initialized=true}var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=="string"&&(options=="isDisabled"||options=="getDate")){return $.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this[0]].concat(otherArgs))}if(options=="option"&&arguments.length==2&&typeof arguments[1]=="string"){return $.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this[0]].concat(otherArgs))}return this.each(function(){typeof options=="string"?$.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this].concat(otherArgs)):$.datepicker._attachDatepicker(this,options)})};$.datepicker=new Datepicker();$.datepicker.initialized=false;$.datepicker.uuid=new Date().getTime();$.datepicker.version="1.7.2";window.DP_jQuery=$})(jQuery);;

function IsError(html)
{
	/// <summary>Determines whether the given string is a JSON object containing error messages. Performs regular expression match</summary>
	/// <param name="html" type="string">The potential json object in string form</param>

	// Test for Json array using regex
	var match = /^\[\{.*\}\]$/.test(html)
	return match;
}

function IsJsonError(json)
{
	/// <summary>Determines whether the given json object is an array of error messages</summary>
	/// <param name="json" type="object">The potential array of error messages</param>

	//we expect a collection of error messages, so the root object will be an array
	if (json != undefined && json.length > 0 && json[0].ErrorMessage != undefined)
	{
		return true;
	}
	
	return false;
}

function ShowError(errorsJson, customAction)
{
	/// <summary>
	/// Shows specified error in a message box by default, or pass optional customAction(errors) delegate.
	/// Handles a json object in string form
	/// </summary>
	/// <param name="errorsJson" type="string">A JSON object in string form</param>
	/// <param name="customAction" type="function" optional="true">A custom action to perform on the error collection</param>
	
	var errors = eval(errorsJson);

	ShowJsonError(errors, customAction);
}

function ShowJsonError(errors, customAction)
{
	/// <summary>
	/// Shows specified error in a message box by default, or pass optional customAction(errors) delegate.
	/// Handles a json object which is expected to be an array of error messages
	/// </summary>
	/// <param name="errors" type="object">A JSON object - collection of error messages</param>
	/// <param name="customAction" type="function" optional="true">A custom action to perform on the error collection</param>
	
	if (customAction === undefined)
	{
		// Default action: show in message box
		var msg = "";
		for (var i = 0; i < errors.length; i++)
		{
			if (i > 0) msg += "\n";
			msg += errors[i].ErrorMessage;
		}
		alert(msg);
	}
	else
	{
		// Custom action specified
		customAction(errors);
	}
}

function RemoveBad(strTemp) {
    if (strTemp != null)
        strTemp = strTemp.replace(/\<|\>|\"|\'|\%|\;|\(|\)|\&|\+|\-/g, "");
    return strTemp;
} 

// Create variables with defaults
var sessionTimeoutInMinutes = 50;
var sessionTimeoutUrl = "/";

$(document).ready(function() {
    monitorSession();
});


/// Activates a timer that keeps 
function monitorSession() {

    var sessionTimeoutInSeconds = (sessionTimeoutInMinutes * 60);

    // calculate the session expired timeout make it 10 seconds less than the server timeout
    var sessionExpiredTimeoutInMilliseconds = ((sessionTimeoutInSeconds - 10) * 1000);
    var sessionExpiredId = setTimeout(sessionExpiredHandler, sessionExpiredTimeoutInMilliseconds);

    // Intercept ajax send and reset the timer for each request
    jQuery().ajaxSend(function(ev, xhr, s) {
        clearTimeout(sessionExpiredId);
        sessionExpiredId = setTimeout(sessionExpiredHandler, sessionExpiredTimeoutInMilliseconds);
    });

}

// Handles the session timeout
function sessionExpiredHandler() {
    window.location = sessionTimeoutUrl;
}

/************************************** Splendid *************************************
 * Creation Date:    13th January 2009
 * Created By:       Steve
 * Edited ----------------------------------------------------------------------------
 *		By:	    On:
 * Description -----------------------------------------------------------------------
 *       This file contains the functions for the easyJet itinerary basket
 *       This includes both the open/close functionality and the floating functionality
 *       Requires jQuery to be included...
 *
 * The FloatingBasket object includes the following methods:
 *      init()
 *      slideBasket()
 *      checkTopButton()
 *      updateSizes()
 *      getTopValue()
 *
 **************************************************************************************/

/*********************************** Event Handlers **********************************/

/// <reference path="jquery.vsdoc.1.2.6.js" />

function getCookie(c_name) {
    if (document.cookie.length > 0) {
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1) {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) c_end = document.cookie.length;
            return unescape(document.cookie.substring(c_start, c_end));
        }
    }
    return "";
}

function setCookie(c_name, value, expiredays) {
    var exdate = new Date(); exdate.setDate(exdate.getDate() + expiredays);
    document.cookie = c_name + "=" + escape(value) +
((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
}

/****
 * This is called to initialise everything needed for the floating basket. 
 * It is called when the elements on the page have been loaded
 ****/
function itinBasketOnload() {
    if (!basketCanFloat) {
        return;
    }
    // !!! ONLY HERE FOR TESTING. NEEDS REMOVING !!!
    /*
    $("a#tmpShowHide").toggle(function() {
    $('.calendarTabs').slideUp("fast", function() {
    FloatingBasket.checkTopButton();
    });
    }, function() {
    $('.calendarTabs').slideDown("fast", function() {
    FloatingBasket.checkTopButton();
    });
    });
    */

    //TD681 - The pervents the situation occuring where the basket can shoot off the screen
    $(window).bind('resize', function() { FloatingBasket.checkTopButton(); });
    $("#floatItin").bind('resize', function() { FloatingBasket.checkTopButton(); });
    $(window).scroll(function() { FloatingBasket.checkTopButton(); });
    /********************************** Basket Animation *********************************/

    // Bind a jQuery toggle event to the show/hide flight details anchor.
    // Once open/closed need to re-check the basket size and work out whether it needs sliding on the screen.
    $("a#toggleFlightDetailsLink").toggle(function() {
        // This function called to open the flight details up
        $("#retFlight1").slideUp("fast", function() {
            $("#retFlight2").slideDown("fast");
            
        });
        $("#outFlight1").slideUp("fast", function() {
            $("#outFlight2").slideDown("fast", function() {
                $("#flightDetails").slideDown("slow", function() {
                    // Once all the animation is done, change the anchor class and text
                    $("a#toggleFlightDetailsLink").removeClass("show").addClass("hide").html("[hide flight details]");
                    // Now the basket is a new size, need to work out whether to slide it.
                    FloatingBasket.checkTopButton();
                    FloatingBasket.slideBasket();
                });
            });
        });
    }, function() {
        // This function is called to close the flight details
        $("#flightDetails").slideUp("slow", function() {
            $("#retFlight2").slideUp("fast", function() {
            $("#retFlight1").slideDown("fast");            
            });
            $("#outFlight2").slideUp("fast", function() {
                $("#outFlight1").slideDown("normal", function() {
                    // Once all the animation is done, change the anchor class and text
                    $("a#toggleFlightDetailsLink").removeClass("hide").addClass("show").html("[show flight details]");
                    // Now the basket is a new size, need to work out whether to slide it.
                    FloatingBasket.checkTopButton();
                    FloatingBasket.slideBasket();
                });
            });
        });
    });

    /****
    * Initialise the floating basket
    * Inputs: 
    *       The identifier for the wrapper div of the floating content
    *       The identifier for the left column content wrapping div
    *       The identifier for the footer wrapper div
    *       The identifier for the top continue button wrapper div
    *       The number of seconds to display the add tag for (set this to 0 to use the default of 5 seconds)
    ****/
    FloatingBasket.init("#floatItin", "#ColumnLeft", ".footer", "#btnTopContinue", 3);

    

}

/********************************** Basket Floating **********************************/

/****
 * The actual floating basket object and methods to control it.
 ****/
var FloatingBasket = {
    floatID: 'test',
    leftColID: '',
    topButtonID: '',
    windowHeight: 0,
    leftColHeight: 0,
    basketHeight: 0,
    pageFooter: 0,
    footerHeight: 0,
    originalBasketTop: 0,
    currentBasketTop: 0,

    scrollBasket: false,
    topButtonShown: false,
    padlocked: false,

    tagDisplayTime: 5000, // In milliseconds (1000 = 1 second)

    // A Javascript enum to give the jQuery identifier for the various parts of the basket that have data dynamically added.
    basketSection: {
        outFlight: "#outFlightDetails",
        retFlight: "#retFlightDetails",
        checkedBags: "#checkedBagDetails",
        speedyBoarding: "#speedyBoardDetails",
        sportsEquip: "#sportsDetails",
        carbonOffset: "#carbonOffsetDetails",
        hotel: "#hotelDetails",
        carHire: "#carHireDetails",
        travelIns: "#travelInsDetails"
    },

    /****
    * Function to intialise the floating basket.
    * Should be called from the page load or $(document).ready()
    ****/
    init: function(basketID, leftID, footerID, topBtnID, tagFade) {
        // Set up the global variables

        FloatingBasket.floatID = basketID;
        FloatingBasket.leftColID = leftID;
        FloatingBasket.topButtonID = topBtnID;
        FloatingBasket.footerHeight = FloatingBasket.getTopValue(footerID);

        if (parseInt(tagFade) > 0)
            FloatingBasket.tagDisplayTime = tagFade * 1000;

        // Just grab the original position of the top of the basket on the page
        originalBasketTop = FloatingBasket.getTopValue(FloatingBasket.floatID);

        // Bind a scroll event to check whether the basket needs to scroll when the page is scrolled.
        $(window).scroll(function() {
            FloatingBasket.slideBasket();
        });

        // Just check the basket size when the page initially loads.
        FloatingBasket.checkTopButton();
    },

    /****
    * This does the slide back to a preset position
    ****/
    slideBasketBackToCurrentBasketTopPosition: function() {
       
        if (!FloatingBasket.padlocked) {
            $(FloatingBasket.floatID).animate({ top: currentBasketTop + "px" }, { duration: 500, queue: false });
        }

    },
    /****
    * This sets a preset position to slide back to
    ****/
    setCurrentBasketTopPosition: function() {
        currentBasketTop = parseInt(FloatingBasket.basketHeight);
    },

    /****
    * This does the actual sliding and is called by the window scroll event
    ****/
    slideBasket: function() {
        var scrollTop = parseInt($(document).scrollTop());
        var basketBtm = parseInt(FloatingBasket.basketHeight + FloatingBasket.originalBasketTop + scrollTop) - 100;
        var offset = 0;

        //alert("inslide");

        if (!FloatingBasket.padlocked) {
        
            FloatingBasket.updateSizes();

            offset = parseInt(FloatingBasket.originalBasketTop + scrollTop) - 100;

            // If the new offset puts the basket too high on the screen, set to original top value
            if (offset < FloatingBasket.originalBasketTop)
                offset = FloatingBasket.originalBasketTop;

            // Top button show when basket too big, so don't wanna move it.
            if (FloatingBasket.topButtonShown)
                offset = FloatingBasket.originalBasketTop;

            if (basketBtm >= FloatingBasket.pageFooter)
                offset = FloatingBasket.originalBasketTop;

            $(FloatingBasket.floatID).animate({ top: offset + "px" }, { duration: 500, queue: false });

        }

    },

    /****
    * Adds a detail section into the basket.
    ****/
    addDetail: function(section, itemID) {

        // Need to get the data for displaying. I don't know how you want to do this?
        // I would do an AJAX callback and retrieve the formatted HTML to insert into the basket,
        // but could also do a JSON request for the data and then format it in javascript.
        // I've gone with the first option in this demo.
        $.get("FloatingBasket_CarDetail.html", { ID: itemID, type: "car" }, function(data) {
            // Add the data into the basket and animate it in.
            $(section).append(data).slideDown("slow", function() {

                // Fade in the tag to show what was added and the timeout trigger the fade out to get rid of it
                $(".AddTag").fadeIn("slow", function() {
                    setTimeout(FloatingBasket.removeAddTag, FloatingBasket.tagDisplayTime);
                });

                // Need to recheck the size of the basket and make sure it's following the rules properly
                FloatingBasket.checkTopButton();
                FloatingBasket.slideToPosition($(this));
            });
        });
    },

    /****
    * Checks whether the top continue button should be displayed
    * The button's shown if the basket is larger than the browser window
    ****/
    checkTopButton: function() {

        FloatingBasket.updateSizes();

        if (parseInt((FloatingBasket.basketHeight - $("#btnTopContinue").height()) + 120) > parseInt(FloatingBasket.windowHeight)) {
            $("#btnTopContinue").slideDown("slow", function() {
                //alert("value = " + document.getElementById("btnTopContinue").style.display);
                FloatingBasket.topButtonShown = true;
                FloatingBasket.slideBasket();
                //alert("value = " + document.getElementById("btnTopContinue").style.display);
            });
        } else {
            $("#btnTopContinue").slideUp("slow", function() {
                //alert("closing");
                FloatingBasket.topButtonShown = false;
                FloatingBasket.slideBasket();
            });
        }
    },

    /****
    * Removes the orange add tag from the page
    ****/
    removeAddTag: function() {
        $(".AddTag").fadeOut("slow", function() {
            $(this).remove();
        });
    },

    /****
    * LOCK
    ****/
    lockPosition: function() {
        FloatingBasket.padlocked = true;
        $("#PadlockImage").attr({ src: imagePath + "locked.gif", alt: basketLockedMsg });
    },

    /****
    * UNLOCK
    ****/
    unlockPosition: function() {
        FloatingBasket.padlocked = false;
        $("#PadlockImage").attr({ src: imagePath + "unlocked.gif", alt: basketUnlockedMsg });
    },

    /****
    * Moves the page to show the section on the screen.
    ***/
    slideToPosition: function(section) {
        $.scrollTo(section, { offset: 100 });
    },

    /****
    * Utility function to update the new element sizes when anything changes
    ****/
    updateSizes: function() {
        FloatingBasket.windowHeight = $(window).height();                       // Grab the height of the browser window (the bit you can actually see that is)
        FloatingBasket.leftColHeight = $(FloatingBasket.leftColID).height();    // Grab the height of the main content on the left of the page.
        FloatingBasket.basketHeight = $(FloatingBasket.floatID).height();       // Grab the height of the basket itinerary.
        FloatingBasket.pageHeight = $(document).height();                       // Grab the total height of the whole page (including the header & footer)
        FloatingBasket.pageFooter = parseInt($(document).height() - 90);        // The top position of the page footer.
    },

    /****
    * Utility function to get the css top value of the element supplied
    ****/
    getTopValue: function(elemID) {
        var topVal = 0;
        topVal = $(elemID).css("top");
		if (topVal === null)
			topVal = 0;
		else if (topVal.indexOf("px") > -1)
            topVal = parseInt(topVal.replace("px", ""));
		else if (topVal == "auto")
            topVal = 0;
        return topVal;
    }

}


// IE6 Background Hover Flicker Fix
try {
	document.execCommand('BackgroundImageCache',false,true);
	}catch(ignoreme){
}




function AjaxDataBuilder(includeBasketState) {

    this.names = new Array();
    this.values = new Array();

    ///
    /// Guards a method by throwing an exception if a parameter is null when it should not be passed
    /// in null.
    ///
    this.Guard = function(parameterName, value)
    {
    	if (value == undefined || value == null)
    	{
    		throw ("parameter " + parameterName + " can not be null");
    	}
    }


    this.Add = function(name, value) {
        /// <summary>
        /// Adds data to the builder
        /// </summary>
        /// <param name="name">The name of the posted field.</param>
        /// <param name="value">The value of the posted field.</param>

        this.Guard("name", name);
        this.Guard("value", value);

        this.names.push(name);
        this.values.push(value);

        return this;
    }

    this.Build = function() {
        /// <summary>
        /// Builds the data string for post or get
        /// </summary>

        //  jquery causes a 411 in firefox if you do not set post data to something so we
        //  must default the post data to a blank array.
        var data = "{}";

        // Basket state should be added by default
        if (includeBasketState || includeBasketState == undefined) {
            // Add the basket state by default
            this.names.push("__BasketState");
            this.values.push($('#__BasketState').val());
        }

        var index = 0;
        var count = this.names.length;

        for (index = 0; index < count; index++) {

            var name = this.names[index];
            var value = escape(this.values[index]);

            var assignment = name + "=" + value;

            if (index == 0) {
                data = assignment;
            }
            else {
                data = data + "&" + assignment;
            }
        }


        return data;

    }

    return this;

}





/* Queue.js - a function for creating an efficient queue in JavaScript
*
* The author of this program, Safalra (Stephen Morley), irrevocably releases
* all rights to this program, with the intention of it becoming part of the
* public domain. Because this program is released into the public domain, it
* comes with no warranty either expressed or implied, to the extent permitted
* by law.
*
* For more public domain JavaScript code by the same author, visit:
*
* http://www.safalra.com/web-design/javascript/
*/


/* Creates a new Queue. A Queue is a first-in-first-out (FIFO) data structure.
* Functions of the Queue object allow elements to be enqueued and dequeued, the
* first element to be obtained without dequeuing, and for the current size of
* the Queue and empty/non-empty status to be obtained.
*/
function Queue() {

    // the list of elements, initialised to the empty array
    var queue = [];

    // the amount of space at the front of the queue, initialised to zero
    var queueSpace = 0;

    /* Returns the size of this Queue. The size of a Queue is equal to the number
    * of elements that have been enqueued minus the number of elements that have
    * been dequeued.
    */
    this.getSize = function() {

        // return the number of elements in the queue
        return queue.length - queueSpace;

    }

    /* Returns true if this Queue is empty, and false otherwise. A Queue is empty
    * if the number of elements that have been enqueued equals the number of
    * elements that have been dequeued.
    */
    this.isEmpty = function() {

        // return true if the queue is empty, and false otherwise
        return (queue.length == 0);

    }

    /* Enqueues the specified element in this Queue. The parameter is:
    *
    * element - the element to enqueue
    */
    this.enqueue = function(element) {
        queue.push(element);
    }

    /* Dequeues an element from this Queue. The oldest element in this Queue is
    * removed and returned. If this Queue is empty then undefined is returned.
    */
    this.dequeue = function() {

        // initialise the element to return to be undefined
        var element = undefined;

        // check whether the queue is empty
        if (queue.length) {

            // fetch the oldest element in the queue
            element = queue[queueSpace];

            // update the amount of space and check whether a shift should occur
            if (++queueSpace * 2 >= queue.length) {

                // set the queue equal to the non-empty portion of the queue
                queue = queue.slice(queueSpace);

                // reset the amount of space at the front of the queue
                queueSpace = 0;

            }

        }

        // return the removed element
        return element;

    }

    /* Returns the oldest element in this Queue. If this Queue is empty then
    * undefined is returned. This function returns the same value as the dequeue
    * function, but does not remove the returned element from this Queue.
    */
    this.getOldestElement = function() {

        // initialise the element to return to be undefined
        var element = undefined;

        // if the queue is not element then fetch the oldest element in the queue
        if (queue.length) element = queue[queueSpace];

        // return the oldest element
        return element;

    }

}

/// <reference path="jquery.vsdoc.1.2.6.js" />

function Route() {
    /// <summary>
    /// Class for performing route specific tasks, e.g. route validation.
    /// Note: depends on jquery and Date.1.0.js and DateConstraint.1.0.js
    /// </summary>
}

Route.ValidateFlightDatesForRoute = function(linkedAirportData, outboundDate, returnDate, destinationAirportCode, dateBeforeRouteStartErrorMessage, dateAfterRouteEndErrorMessage) {
    for (i = 0; i < linkedAirportData.length; i++) {
        if (linkedAirportData[i].Code == destinationAirportCode) {
            var oDate = new Date(outboundDate);
            var oStartDate = Date.fromJson(linkedAirportData[i].OutboundStartDate);
            var oEndDate = Date.fromJson(linkedAirportData[i].OutboundEndDate);

            if (!Date.IsEmpty(oStartDate) && oDate.compareTo(oStartDate) == -1) {
                alert(dateBeforeRouteStartErrorMessage.replace("{0}", oStartDate.toString("dd MMM yyyy")));
                return false;
            }
            if (!Date.IsEmpty(oEndDate) && oDate.compareTo(oEndDate) == 1) {
                alert(dateAfterRouteEndErrorMessage.replace("{0}", oEndDate.toString("dd MMM yyyy")));
                return false;
            }

            if (returnDate != undefined && returnDate != "") {
                var rDate = new Date(returnDate);
                var rStartDate = Date.fromJson(linkedAirportData[i].ReturnStartDate);
                var rEndDate = Date.fromJson(linkedAirportData[i].ReturnEndDate);

                if (!Date.IsEmpty(rStartDate) && rDate.compareTo(rStartDate) == -1) {
                    alert(dateBeforeRouteStartErrorMessage.replace("{0}", rStartDate.toString("dd MMM yyyy")));
                    return false;
                }
                if (!Date.IsEmpty(rEndDate) && rDate.compareTo(rEndDate) == 1) {
                    alert(dateAfterRouteEndErrorMessage.replace("{0}", rEndDate.toString("dd MMM yyyy")));
                    return false;
                }
            }
            return true;
        }
    }
    return false;
}

///
/// Encapsulates an AJAX request in a command that has the ability to retry on failure
///
function AjaxPostCommand(url, dataBuilder, successCallback, errorCallback, timeoutInMilliseconds, retries, dataType) {
	/// <summary>Encapsulates an AJAX request in a command that has the ability to retry on failure</summary>
	/// <field name="dataType" type="string" optional="true">The data type we expect back from the request. See JQuery AJAX documentation</field>

    var dataBuilder = dataBuilder;
    var postData = {};
    var url = url;

    if (retries == undefined) {
        retries = 3;
    }

    if (timeoutInMilliseconds == undefined) {
    	timeoutInMilliseconds = AjaxPostCommand.DefaultTimeout;
    }
          
    var type = "POST";
        
    // Records the number of execution attempts
    var attemptCount = 0;

    // Records if the command is executing
    var executing = false;
    
    // Executes the ajax call and sets the attempt count
    function executeAjax () {
        attemptCount = attemptCount + 1;
        $.ajax(
                {
                    url: url,
                    cache: false,
                    data: postData,
                    type: type,
                    timeout: timeoutInMilliseconds,
                    success: successHandler,
                    error: errorHandler,
                    dataType: dataType
                }
            )
    }

    // Invokes the success callback
    function successHandler(data)
    {
    	// Only invoke the callback if its defined
    	if (successCallback != undefined)
    	{
    		try
    		{
    			successCallback(data);
    		}
    		catch (e)
    		{
    			if (typeof(console) != "undefined")
    			{
    				console.log('Error in AJAX success callback: ' + e);
    			}
    			// Do nothing because the callback should have handled the error
    		}

    	}

    	executing = false;
    }

    // Handles any errors and invokes the error callback when the number of retries have been exceeded
    function errorHandler(XMLHttpRequest, textStatus, errorThrown) {

        if (attemptCount < retries) {
            // Try again
            executeAjax()
        }
        else {
        
            // Only invoke the callback if its defined
            if (errorCallback != undefined) {

                try {

                    errorCallback(XMLHttpRequest, textStatus, errorThrown);
                    
                }
                catch (e) {
                    // Do nothing because the callback should have handled the error
                }

            }

            executing = false;
            
        }
    }

    ///
    /// Executes the command
    ///
    this.Execute = function()
    {
    	// Build the post data using the builder
    	postData = dataBuilder.Build();

    	// let it be know that we are executing
    	executing = true;

    	// Execute the ajax call
    	executeAjax();
    }

    ///
    /// Determines if the command has finished executing
    //
    this.HasExecutionCompleted = function() {
        return !executing;
    }

    return this;
        
}

/// Static fields

AjaxPostCommand.DefaultTimeout = 30000;
/// <reference path="../Content/Scripts/jquery.vsdoc.js" />

function AjaxGetCommand(url, dataBuilder, successCallback, errorCallback, timeoutInMilliseconds)
{
	/// <summary>Encapsulates an AJAX GET request in a command</summary>
	/// <param name="url" type="string">The URL to request</param>
    /// <param name="dataBuilder" type="string">Builds the querystring parameters to send with the request</param>
	/// <param name="successCallback" type="function">The callback function to execute on a successful response</param>
	/// <param name="errorCallback" type="function">The callback function to execute if an error occurs</param>
	/// <param name="timeoutInMilliseconds" type="Number" integer="true">The timeout to place on the request, in milliseconds</param>

    var dataBuilder = dataBuilder;
    var requestData = {};
	var url = url;

	if (timeoutInMilliseconds == undefined)
	{
		timeoutInMilliseconds = AjaxGetCommand.DefaultTimeout;
	}

	var type = "GET";

	// Records if the command is executing
	var executing = false;

	function executeAjax()
	{
		/// <summary>Executes the ajax call</summary>
		
		$.ajax(
                {
                	url: url,
                	cache: false,
                	data: requestData,
                	type: type,
                	timeout: timeoutInMilliseconds,
                	success: successHandler,
                	error: errorHandler
                }
            );
	}

	function successHandler(data)
	{
		/// <summary>Invokes the success callback</summary>

		// Only invoke the callback if its defined
		if (successCallback != undefined)
		{
			try
			{
				successCallback(data);
			}
			catch (e)
			{
				// Do nothing because the callback should have handled the error
			}

        }

        executing = false;

	}

	function errorHandler(XMLHttpRequest, textStatus, errorThrown)
	{
		/// <summary>Handles any errors and invokes the error callback</summary>
		
		// Only invoke the callback if its defined
		if (errorCallback != undefined)
		{
			try
			{
				errorCallback(XMLHttpRequest, textStatus, errorThrown);
			}
			catch (e)
			{
				// Do nothing because the callback should have handled the error
			}
        }

        executing = false;
		
	}

	this.Execute = function() {
	    /// <summary>Executes the command</summary>

	    // Build the request data using the builder
	    requestData = dataBuilder.Build();

	    // let it be know that we are executing
	    executing = true;

	    // Execute the ajax call
	    executeAjax();
    	
	}


	///
	/// Determines if the command has finished executing
	//
	this.HasExecutionCompleted = function() {
	    return !executing;
	}
	

	return this;

}

/// Static fields

AjaxGetCommand.DefaultTimeout = 30000;
/// <reference path="Queue.js" />

///
/// Throttles command execution by executing each command sequentialy off a queue (FIFO)
/// this class is implemented as singleton and can be used like this - 
/// CommandInvoker.getInstance().QueueCommand(myCommand)
///
var CommandInvoker = (function() {

    var instance = null;

    function PrivateConstructor() {

        //----------------------------------------------------------
        // Private fields
        //----------------------------------------------------------

        var throttlePeriod = 250; // Is in milliseconds
        var queue = new Queue()
        var initialized = false;
        var currentCommand = undefined;

        //----------------------------------------------------------
        // Private functions
        //----------------------------------------------------------

        //
        // Checks if the invoker is busy executing a command
        //
        function IsExecutingCommand() {

            if (currentCommand == undefined) {
                return false;
            }
            else {
                
                // We must still be executing if the command has not completed execution
                return !currentCommand.HasExecutionCompleted()
            }

        }

        ///
        /// Recursively retrieves commands off a queue and executes them. The commands are throttled by
        /// a timeout
        ///
        function executeCommands() {


            if (!IsExecutingCommand()) {

                //console.log("Get command off queue");

                // Get the next command from the queue
                currentCommand = queue.dequeue();

                // check if we got a command off the queue
                if (currentCommand != undefined) {
                    currentCommand.Execute();
                }

            }



            // Stop execution for a while so that the UI can queue some commands
            setTimeout(executeCommands, throttlePeriod);
        }

        //----------------------------------------------------------
        // Public functions
        //----------------------------------------------------------

        ///
        /// Adds a command to the internal queue
        ///
        this.QueueCommand = function(command) {

            // add the command to the internal queue
            queue.enqueue(command);

            // Initialize the invoker if not already initialized by executing the commands
            if (!initialized) {
                initialized = true;
                executeCommands();
            }

        }

    }

    ///
    /// Returns the singleton instance
    ///
    return new function() {
        this.getInstance = function() {
            if (instance == null) {
                instance = new PrivateConstructor();
                instance.constructor = null;
            }
            return instance;
        }
    }
})();

/// <reference path="../../Scripts/WebTracker.js" />
/// <reference path="../../Scripts/AjaxPostCommand.js" />
/// <reference path="../../Scripts/CommandInvoker.js" />
/// <reference path="../../Scripts/AjaxDataBuilder.js" />

var cancelAllRequests = false; // Required when deleting all flights so that the basket and panels are not refreshed while a redirect is taking place


$(document).ready(function() {
    $.ajaxSetup({
        beforeSend: function(ev, xhr, s) {
            if (cancelAllRequests) {
                return false;
            }
        }
    });

    AttachLuggageHandlers();

});

//attaches the handlers for the luggae panel callout to be displayed
//used on page load and basket update
function AttachLuggageHandlers() {

    
    $("#HoldBaggage").unbind("mouseover").mouseover(function() {

        DoShowCallOut("#callBasketBag", "#HoldBaggageLink", 30, 160);
        return false;
    });

    $("#HoldBaggage").unbind("mouseout").mouseout(function() {

        DoHideCallOut("#callBasketBag");

        return false;
    });

}

///
/// Registers an ajax timout 
///
function registerTimeout(activity, url) {
    
    if (timoutUrl != undefined) {

        var builder = new AjaxDataBuilder();
        builder.Add("activity", activity);
        builder.Add("url", url);

        // Fire and forget so not timeout
        // Create the command with required context
        var command = new AjaxPostCommand(timoutUrl, builder, undefined, undefined, 30000, 0);

        // queue the command for execution                        
        CommandInvoker.getInstance().QueueCommand(command);
    }

}

var padlocked = false;

function CheckUrls() {
    if (typeof BasketUrl == 'undefined')
    	alert("BasketUrl is not specified");

    if (typeof BasketOptions == 'undefined')
    	alert('BasketOptions is not specified');
}

function BasketOnload() {

	CheckUrls();

    // Add padlocking to the basket
    $("#padlock").unbind("click").click(function() {
        if (FloatingBasket.padlocked == false) {
            FloatingBasket.lockPosition();
            setCookie("EJ2BasketLockState", "locked", 100);
        }
        else {
            FloatingBasket.unlockPosition();
            setCookie("EJ2BasketLockState", "unlocked", 100);
        }
    });

    basketLockState = getCookie("EJ2BasketLockState");

    if (basketLockState != null && basketLockState != "") {
        if (basketLockState == "locked") {
            FloatingBasket.lockPosition();
        }
    }

    $(".deleteFromBasketLink").hide();

    $(".basketItem").unbind("mouseover").mouseover(function() {
        // Only do this if not selected
        var lnk = $(this).find(".deleteFromBasketLink");
        lnk.show();
    });

    $(".basketItem").unbind("mouseout").mouseout(function() {
        // Only do this if not selected
        var lnk = $(this).find(".deleteFromBasketLink");
        lnk.hide();
    });

    $("#DisplayCurrency").unbind("change").change(function()
    {
    	$("#currencyChanged").attr("value", "currencyChanged");

    	WebTracker.TrackEvent('choose_flights/action/' + this.id, 'Choose your flight action: ' + this.id);

    	$("#MainForm").submit();
    });

    $("#btnContinue").unbind("click").click(function() {
    	if ($("#btnContinue").hasClass("greyed")) {
    		return false;
    	}
    	else {
    		ShowBasketBusyIcon(true);
    		SubmitButtonClickHandler($(this));
    		WebTracker.TrackEvent('choose_flights/action/' + this.id, 'Choose your flight action: ' + this.id);
    		return false;
    	}
    });

    $("#btnTopContinue").unbind("click").click(function() {
    	if ($("#btnTopContinue").hasClass("greyed")) {
    		return false;
    	}
    	else {
    		ShowBasketBusyIcon(true);
    		SubmitButtonClickHandler($(this));
    		WebTracker.TrackEvent('choose_flights/action/' + this.id, 'Choose your flight action: ' + this.id);
    		return false;
    	}
 });

 $("#basketAddHoldBags").unbind("click").click(function() {

    AddDefaultHoldBaggage();

     
     return false;
 });

    //wire up function to show add more flights overlay
    $("#AddMoreFlights").unbind("click").click(function() {
        if (!$("#AddMoreFlights").hasClass("non-selected")) {
            //removed unbinding as caused loss of cached data with jquery1.3.2
            //$("#acAddMoreFlightsOriginAirport").unaclite();
            //$("#acAddMoreFlightsDestinationAirport").unaclite();
            $("#addFlightsOverlay").showOverlay();
            WebTracker.TrackEvent('choose_flights/action/' + this.id, 'Choose your flight action: ' + this.id);
            return false;
        }
    });

    $("#SearchOverlayButton").unbind("click").click(function() {
        if ($("#acAddMoreFlightsOriginAirportValue").val() == "") {
            alert(NoOriginErrorMessage);
            return false;
        }
        if ($("#acAddMoreFlightsDestinationAirportValue").val() == "") {
            alert(NoDestinationErrorMessage);
            return false;
        }

        var outboundDate = Date.fromEjDayMonthYearControls($("#oDayAdditional"), $("#oMonYearAdditional"));

        var isReturn = $("#AdditionalFlightSearchForm").find("#chkIsReturn").attr("checked");
        
        var returnDate = undefined;
        if (isReturn && $("#rDayAdditional").val() != '00' && $("#rMonYearAdditional").val() != '00') {
            returnDate = Date.fromEjDayMonthYearControls($("#rDayAdditional"), $("#rMonYearAdditional"));
        }

        if (!Route.ValidateFlightDatesForRoute(acAddMoreFlightsDestinationAirport_linkedAirports, outboundDate, returnDate, $("#acAddMoreFlightsDestinationAirportValue").val(), flightDateBeforeRouteStartErrorMessage, flightDateAfterRouteEndErrorMessage))
            return false;
        
        WebTracker.TrackEvent('choose_flights/action/addFlightsSearchButton', 'Choose your flight action: addFlightsSearchButton');

        $("#acAddMoreFlightsOriginAirport").unaclite();
        $("#acAddMoreFlightsDestinationAirport").unaclite();

        // Set the basket state before submit
        $("#AddMoreFlightsBasketState").val($("#__BasketState").val());

        $("#AdditionalFlightSearchForm").submit();

        return false;
    });

    $("#CancelOverlayButton").unbind("click").click(function()
    {
        $("#addFlightsOverlay").hideOverlay();
    	WebTracker.TrackEvent('choose_flights/action/addFlightsCancelButton', 'Choose your flight action: addFlightsCancelButton');
    	return false;
    });

    $("#CloseSearchOverlay").unbind("click").click(function()
    {
    	$("#addFlightsOverlay").hideOverlay();
    	WebTracker.TrackEvent('choose_flights/action/addFlightsCloseButton', 'Choose your flight action: addFlightsCloseButton');
    	return false;
    });

    $("#showHideFlights").unbind("click").click(function() {
        $("#Hide").slideToggle("fast", function() {
            if ($(this).is(":visible")) {
                $("#FlightOptionsState").val("Visible");
                $("#toggleMsg").html("");
                $("#showHideFlights").html(hideFlightOptionsMsg);
                $("#expandedFlights").css("display", "block");
                $("#collapsedFlights").css("display", "none");
            }
            else {
                $("#FlightOptionsState").val("Hidden");
                $("#toggleMsg").html(flightsAndOptionsMsg);
                $("#showHideFlights").html(showFlightOptionsMsg);
               $("#expandedFlights").css("display", "none");
                $("#collapsedFlights").css("display", "block");
            }

            return false;
        });

    });

    HideAddTag();
    //InitFlightDisplay();
   
}

function ShowBasketBusyIcon(setBusy) {

    var doTop = false;
    if ($("#btnTopContinue").is(":visible")) {
        doTop = true;
    }
    
    if (setBusy == true) {
        $("#btnContinue").parent().hide();
        $("#busyContinueBtn").show();

        if (doTop == true) {
            $("#btnTopContinue").parent().hide();
            $("#busyContinueBtnTop").show();
        }
    }
    else {        
        $("#btnContinue").parent().show();
        $("#busyContinueBtn").hide();        

        if (doTop == true) {
            $("#busyContinueBtnTop").hide();
            $("#btnTopContinue").parent().show();
        }
    }   
}
function SubmitButtonClickHandler(button, callback) {
    // ignore click if button is grayed out
    if (!(button.hasClass("greyed"))) {
        DoSubmitForm(callback);
    }
}

function DoSubmitForm(callback) {
    var submitForm = true;

    // if the opt-in reminder panel exists on the page...
    if ($("#optInFlightOptionsReminderOverlay").length > 0) {
        //
        // ...then show reminder provided:
        //
        //    1 - we haven't already shown it
        //    2 - the customer must opt in for all flight options
        //    3 - insurance and/or bags haven't been added to the basket
        //
        if (!optInFlightOptionsReminderShown && optInForAllFlightOptions) {
            var remindInsurance = (travelInsuranceAvailable && !travelInsuranceAdded);
            var remindBags = !bagsAdded

            if (remindInsurance || remindBags) {
                showOptInFlightOptionsReminderOverlay(remindInsurance, remindBags);
                submitForm = false;
            }
        }
    }

    //changed to allow a callback function instead of directly submitting the form
	//used initially for the payment page (which has extra stuff to do before submit)
    if (submitForm) {
    	if (callback != null && typeof (callback) != 'undefined') {
    		callback();
    	} else {
        $("#MainForm").submit();
    }
}
}

function InitFlightDisplay() {
     if ($("#FlightOptionsState").val("Visible")) {
        $("#expandedFlights").css("display", "block");
        $("#collapsedFlights").css("display", "none");
    } else {
        $("#expandedFlights").css("display", "none");
        $("#collapsedFlights").css("display", "block");
    }
}

function HideAddTag() {
    setTimeout(function() { $(".AddTag").fadeOut("slow"); }, 3000);
}

function AddFlight(newFlight, flightSearchSession, addFlightHandler, cannotAddFlightHandler) {
    
    var builder = new AjaxDataBuilder();
    builder.Add("flightToAddState", newFlight);
    builder.Add("flightSearchSession", flightSearchSession);
 
    AddToBasket('AddFlight', builder, addFlightHandler, cannotAddFlightHandler);
}

function AddSportsEquipment(sportsCategory) {
    var builder = new AjaxDataBuilder();
    builder.Add("category", sportsCategory);
    AddToBasket('AddSportsEquipment', builder, ShowSportsEquipmentSelectors);
    FloatingBasket.checkTopButton();
}

function RemoveSportsEquipment(categoryCode) {

    var builder = new AjaxDataBuilder();
    builder.Add("categoryCode", categoryCode);

    AddToBasket('RemoveSportsEquipment', builder, ShowSportsEquipmentSelectors);
    FloatingBasket.checkTopButton();
}

function UpdateSportsEquipment(categories) {

    var builder = new AjaxDataBuilder();
    builder.Add("categories", categories);

    AddToBasket('UpdateSportsEquipment', builder, ShowSportsEquipmentSelectors);

}

function AddCarHireToBasket(car, optionalExtras, pickup, dropOff) {

    var builder = new AjaxDataBuilder();
    builder.Add("car", car);
    builder.Add("optionalExtras", optionalExtras);
    builder.Add("pickup", pickup);
    builder.Add("dropOff", dropOff);

    AddToBasket('AddCarHire', builder, ReloadCarHirePanel);
    FloatingBasket.checkTopButton();
}

function AddCarHireOptionalExtra(optionalExtra) {

    var builder = new AjaxDataBuilder();
    builder.Add("optionalExtra", optionalExtra);

    AddToBasket('AddCarHireOptionalExtra', builder, function() { IncrementCarHireOption(optionalExtra); });
    FloatingBasket.checkTopButton();
}

function UpdateCarHireInsurance(purchased) {

    var builder = new AjaxDataBuilder();
    builder.Add("purchased", purchased);

    AddToBasket('UpdateCarHireInsurance', builder, function() { });
    FloatingBasket.checkTopButton();
}

function UpdateCarHireInsuranceWithCallback(purchased, callback)
{
	var builder = new AjaxDataBuilder();
	builder.Add("purchased", purchased);

	if (callback != undefined)
	{
		var successCallback = function()
		{
			ReloadCarHirePanel();
			callback();
		};
	}
	else
	{
		var successCallback = ReloadCarHirePanel;
	}

	AddToBasket('UpdateCarHireInsurance', builder, successCallback);
	FloatingBasket.checkTopButton();
}

function RemoveCarHireOptionalExtra(optionalExtra) {

    var builder = new AjaxDataBuilder();
    builder.Add("optionalExtra", optionalExtra);

    AddToBasket('RemoveCarHireOptionalExtra', builder, function() { DecrementCarHireOption(optionalExtra); });
    FloatingBasket.checkTopButton();
}

function AddHotelBookingToBasket(hotel, checkInDate, checkOutDate, roomOptions) {

    var builder = new AjaxDataBuilder();
    builder.Add("hotel", hotel);
    builder.Add("checkInDate", checkInDate);
    builder.Add("checkOutDate", checkOutDate);
    builder.Add("roomOptions", roomOptions);

    AddToBasket('AddHotelBooking', builder);
    FloatingBasket.checkTopButton();
}

function AddHotelBookingToBasketCallback(hotel, checkInDate, checkOutDate, roomOptions, addHotelHandler) {

    var builder = new AjaxDataBuilder();
    builder.Add("hotel", hotel);
    builder.Add("checkInDate", checkInDate);
    builder.Add("checkOutDate", checkOutDate);
    builder.Add("roomOptions", roomOptions);

    AddToBasket('AddHotelBooking', builder, addHotelHandler);
    FloatingBasket.checkTopButton();
}

function RemoveHotelBooking(roomPurchaseId) {
    DeleteFromBasket(roomPurchaseId);
    FloatingBasket.checkTopButton();
}

function AddDefaultHoldBaggage() {

    var builder = new AjaxDataBuilder();

    AddToBasket('AddDefaultHoldBaggage', builder, ReloadHoldBaggagePanelBasket);

    FloatingBasket.checkTopButton();
}

function ReloadHoldBaggagePanelBasket() {

    if ($("#holdBaggagePanel").length != 0)
       {
         ReloadHoldBaggagePanel();
     }

     // if we are in step 5, and the basket add baggage link is used
     // dont show the +/- control
     if ($("#Step5AddBagsContainer").length != 0) {
         $("#Step5AddBagsContainer").hide();
     }

}

function AddDefaultHoldBaggageFromBasket() {

    var builder = new AjaxDataBuilder();

    AddToBasket('AddDefaultHoldBaggage', builder);

    FloatingBasket.checkTopButton();
}

function AddHoldBaggage() {

    var builder = new AjaxDataBuilder();

    AddToBasket('AddHoldBaggage', builder, ReloadHoldBaggagePanel);
    FloatingBasket.checkTopButton();
}

function AddSingleHoldBagStep5() {
    var builder = new AjaxDataBuilder();
    AddToBasket('AddSingleHoldBagStep5', builder, UpdateBagCounterStep5);
    FloatingBasket.checkTopButton();
}

function RemoveSingleHoldBagStep5() {
    var builder = new AjaxDataBuilder();
    AddToBasket('RemoveSingleHoldBagStep5', builder, UpdateBagCounterStep5);
    FloatingBasket.checkTopButton();
}

function UpdateHoldBaggage(numberOfBags, excessWeight) {

    var builder = new AjaxDataBuilder();
    builder.Add("numberOfBags", numberOfBags);
    builder.Add("excessWeight", excessWeight);

    AddToBasket('UpdateHoldBaggage', builder, ReloadHoldBaggagePanel);
    FloatingBasket.checkTopButton();
}

function RemoveHoldBaggage() {
    DeleteFromBasket("HoldBaggage"); 
    FloatingBasket.checkTopButton();
}

function RemoveInsurance() {
    DeleteFromBasket("Insurance");
    FloatingBasket.checkTopButton();
}

function AddCarbonOffsetting(serializedCarbonOffsettingCost) {

    var builder = new AjaxDataBuilder();
    builder.Add("serializedCarbonOffsettingCost", serializedCarbonOffsettingCost);

    AddToBasket('AddCarbonOffsetting', builder, ReloadCarbonOffsettingPanel);
    // Need to recheck the size of the basket and make sure it's following the rules properly
    
    FloatingBasket.checkTopButton();
}

function AddSpeedyBoarding() {

    var builder = new AjaxDataBuilder();

    AddToBasket('AddSpeedyBoarding', builder, ReloadSpeedyBoardingPanel);

    FloatingBasket.checkTopButton();
}

function AddBundle(serializedBundle) {

    var builder = new AjaxDataBuilder();
    builder.Add("serializedBundle", serializedBundle)

    AddToBasket('AddBundle', builder, ReloadBundlePanel);
    FloatingBasket.checkTopButton();
}

function AddInsurance(serializedInsurance) {

    var builder = new AjaxDataBuilder();
    builder.Add("serializedInsurance", serializedInsurance)

    AddToBasket('AddInsurance', builder, ReloadTravelInsurancePanel);
    FloatingBasket.checkTopButton();
}

function ApplySpanishDiscount(spanishDiscountType) {

    var builder = new AjaxDataBuilder();
    builder.Add("spanishDiscountType", spanishDiscountType)

    AddToBasket('ApplySpanishDiscount', builder, ReloadSpanishDiscountPanel);
    FloatingBasket.checkTopButton();
}

function RemoveSpanishDiscount() {
    DeleteFromBasket("SpanishDiscount");
    FloatingBasket.checkTopButton();
}

function AddPromotionCode(redemptionCode) {

    var builder = new AjaxDataBuilder();
    builder.Add("redemptionCode", redemptionCode)

    AddToBasket('AddPromotionCode', builder, ReloadPromotionCodePanel);
    FloatingBasket.checkTopButton();
}

function AddSmsUpdates() {
    var builder = new AjaxDataBuilder();
    AddToBasket('AddSmsUpdates', builder);
    
    // Need to recheck the size of the basket and make sure it's following the rules properly
    FloatingBasket.checkTopButton();
}

function RemoveSmsUpdates() {
    DeleteFromBasket("SmsUpdates");
    FloatingBasket.checkTopButton();
}

function MakeButtonBusy(busyMe, addButtonName, busyButtonName)
{
	if (busyMe == true)
	{
		$(addButtonName).css("display", "none");
		$(busyButtonName).css("display", "block");
	}
	else
	{
		$(addButtonName).css("display", "block");
		$(busyButtonName).css("display", "none");
	}
}

///
/// Adds an item to the basket with an AJAX call
///
function AddToBasket(methodName, postDataBuilder, addSuccessCallback, addErrorCallback)
{   
    var url = BasketUrl.substring(0, BasketUrl.indexOf('Show')) + methodName;
    //alert(url);
	// Add the basket and flight options to the post data, The basket state is added by default in the builder
	postDataBuilder.Add("basketOptions", BasketOptions);
	postDataBuilder.Add("flightOptionsState", getFlightOptionState());

	var timeoutInMilliseconds = 5000;

	// Define the success callback function
	var successCallback = function(json) {

	    if (json.ShowWarning) {
	        alert(json.WarningMessage);
	    }

	    // update basket state
	    UpdateBasketState(json.BasketState);

	    // Update basket panel
	    UpdateBasket(json.Html);

	    // invoke calling function success callback
	    if (addSuccessCallback != undefined) {
	        addSuccessCallback(json);
	    }

	}
    
	// Define the error callback function                                    
	var errorCallback = function(XMLHttpRequest, textStatus, errorThrown)
	{
		if (textStatus == "timeout")
		{
			registerTimeout("AddToBasket", url);

			// Invoke the calling function callback if its defined
			if (addErrorCallback != undefined)
			{
			    alert('In addError');
				addErrorCallback()
			}
		}
		else
		{
			// Must have been a fatal error so just handle it as a fatal
			HandleFatalBasketCollapse();
		}
	}

	// Create the command with required context
	var command = new AjaxPostCommand
                        (
                            url,
                            postDataBuilder,
                            successCallback,
                            errorCallback,
                            timeoutInMilliseconds,
                            3,
                            "json"
                        );

	// queue the command for execution                        
	CommandInvoker.getInstance().QueueCommand(command);
}

///
/// Refreshes the basket panel
///
function RefreshBasketPanel()
{
	// Call the basket panel refresh with an error callback that attempts the refresh again with basket state being sent
	// on the request
	DoBasketPanelRefresh
                        (
                        false, 0,
                        function(XMLHttpRequest, textStatus, errorThrown)
                        {
                        	//alert(textStatus);
                        	// Do the refresh again passing in basket state
                        	DoBasketPanelRefresh(true, 2, HandleFatalBasketCollapse);
                     });
                     
}


///
/// Refreshes the basket panel with or without passing basket state
///
function DoBasketPanelRefresh(includeBasketOptions, retries, errorCallback)
{
	var postDataBuilder = new AjaxDataBuilder(true);

	if (includeBasketOptions)
	{
		postDataBuilder.Add("basketOptions", BasketOptions);
	}

    postDataBuilder.Add("flightOptionsState", "Visible");

	var url = BasketUrl.substring(0, BasketUrl.indexOf('Show')) + 'Reload';
	var timeoutInMilliseconds = 5000;

	var successCallback = function(json)
	{
		UpdateBasketState(json.BasketState);
		UpdateBasket(json.Html);
	}

	// Create the command with required context
	var command = new AjaxPostCommand
                        (
                            url,
                            postDataBuilder,
                            successCallback,
                            errorCallback,
                            timeoutInMilliseconds,
                            retries,
                            "json"
                        );

	// queue the command for execution
	CommandInvoker.getInstance().QueueCommand(command);
}

function DeleteFlightFromBasket(itemId, displayIndex) {

    DeleteFromBasket(itemId);

    WebTracker.TrackEvent('choose_flights/action/deleteFlightFromBasket', 'Choose your flight action: deleteFlightFromBasket');

    /// Global variable might not exist so use local and get value from global if its there.
    var showModifyFlight = false;
    if (typeof (isModifyFlight) != "undefined") {
        showModifyFlight = isModifyFlight;
    }
    
    if (showModifyFlight) {
        $("#flightHeader").hide();
        $("#flightModifyHeader").show();
        $("#flightModifyIndex").show();
        
        var ind = $("#flightModifyIndex").html();

        if (Number(ind) > Number(displayIndex)) {
            ind--;
            $("#flightModifyIndex").html(ind);
        }
    } else {
        $("#flightHeader").show();
        $("#flightModifyHeader").hide();
        $("#flightModifyIndex").hide();
    }
}

///
/// Gets the flight options state from a hidden field that is set when the basket 
/// is loaded
///
function getFlightOptionState() {

    var value = $("#FlightOptionsState").val();

    if (value == undefined || value == "") {
        value = "Visible";
    }

    return value;
}

function DeleteFromBasket(itemId)
{
	CheckOnRemovedHandler();

	// Only delete the item from the basket if the remove handler returns true
	if (FireOnBeforeRemovedHandler(itemId))
	{
		// Create the URL for the delete
		var url = BasketUrl.substring(0, BasketUrl.indexOf('Show')) + 'DeleteItem';

		// Create the post data builder and add the basket and flight options to the post data. 
		// The basket state is added by default in the builder
		var postDataBuilder = new AjaxDataBuilder();
		postDataBuilder.Add("basketOptions", BasketOptions);
		postDataBuilder.Add("flightOptionsState", getFlightOptionState());
		postDataBuilder.Add("itemId", itemId);

		var timeoutInMilliseconds = 5000;

		// Define the success callback function
		var successCallback = function(json)
		{
			DeleteFromBasketSuccessActions(itemId, json);
		}

		// Define the error callback function                                    
		var errorCallback = function(XMLHttpRequest, textStatus, errorThrown)
		{
			if (textStatus == "timeout")
			{
				registerTimeout("DeleteFromBasket", url);
			}
			else
			{
				// Must have been a fatal error so just handle it as a fatal
				HandleFatalBasketCollapse();
			}
		}

		// Create the command with required context
		var command = new AjaxPostCommand
                        (
                            url,
                            postDataBuilder,
                            successCallback,
                            errorCallback,
                            timeoutInMilliseconds,
                            3,
                            "json"
                        );

		// queue the command for execution                        
		CommandInvoker.getInstance().QueueCommand(command);
	}
}

function DeleteFromBasketSuccessActions(itemId, json) {

	// update basket state
	UpdateBasketState(json.BasketState);

	// update basket panel
	UpdateBasket(json.Html);

	if (!cancelAllRequests)
	{
		OnBasketItemRemoved(itemId);
	}
	else {
		// Enable refresh for the next delete
		//cancelAllRequests = false;
	}
}

function CheckOnRemovedHandler() {
    if (typeof OnBasketItemRemoved == 'undefined')
        alert("Cannot find OnBasketItemRemoved function.  Please add the function to your view's javascript file");
}

// updates the stored basket state
function UpdateBasketState(state)
{
	$("#__BasketState").val(state);
}

// updates the basket panel
function UpdateBasket(html) {
    //$(".ColumnRight").html(html);

    $("#basketPanel").html(html);
    AttachLuggageHandlers();
}

function HandleFatalBasketCollapse() {
	//if we are in the process of redirecting, don't show errors and try and go back
	if (cancelAllRequests)
		return;

	alert("There has been an error on this page that requires it to be reloaded. Your browser will now go back to the previous step. Please reselect your purchases.");
	history.back();
}

function FireOnBeforeRemovedHandler(itemId) {
    if (typeof OnBeforeBasketItemRemoved == 'undefined') {
        return true;
    }
    else {
        return OnBeforeBasketItemRemoved(itemId);
    }
}

function ShowHideModifyFlightMessage(status) {
    if (status == 'true')
        $("div.modifyflight").show();
    else {
        $("div.modifyflight").hide();
    }
    return false;
}

/// <reference path="../../Scripts/WebTracker.js" />

var selectedCheapestFlight;

function LowestFaresSummaryOnLoad()
{

	$("#LowestFareSummaryPanel .cheapestOutboundFlightPrice").hover(function() { $(this).css('cursor', 'pointer'); }, function() { $(this).css('cursor', ''); });
	$("#LowestFareSummaryPanel .cheapestReturnFlightPrice").hover(function() { $(this).css('cursor', 'pointer'); }, function() { $(this).css('cursor', ''); });

	$("#LowestFareSummaryPanel .cheapestOutboundFlightPrice").unbind("click").click(function()
	{
		WebTracker.TrackEvent('choose_flights/action/outboundMonthsListLink', 'Choose your flight action: outboundMonthsListLink');
		selectedCheapestFlight = $(this);
		eval(outboundSummaryLineClickAction);
		return false;
	});

	$("#LowestFareSummaryPanel .cheapestReturnFlightPrice").unbind("click").click(function()
	{
		WebTracker.TrackEvent('choose_flights/action/returnMonthsListLink', 'Choose your flight action: returnMonthsListLink');
		selectedCheapestFlight = $(this);
		eval(returnSummaryLineClickAction);
		return false;
	});
}

function ShowCheapestOutboundFlights() {
    var date = selectedCheapestFlight.children("#flightDate").val();
    var url = selectCheapestFaresUrl.substring(0, selectCheapestFaresUrl.indexOf('=') + 1)
    url = url + date;
    window.location = url;
}

function ShowCheapestReturnFlights() {
    var date = selectedCheapestFlight.children("#flightDate").val();
    var url = selectCheapestFaresUrl.substring(0, selectCheapestFaresUrl.indexOf('=') + 1)
    url = url.replace("ShowCheapestOutboundFlights", "ShowCheapestReturnFlights");
    url = url + date;
    window.location = url;
}

function ShowOutboundFlightsTimetable() {
    return;
}

/*

Example callout html code

<div id="CallOutId" class="CallOut" style="display:none">
    <p><%= ViewData.Model.WhateverMessage %></p>
    <div class="CallOutBtm"></div>
</div>


jQuery example

$("#element").unbind("mouseover").mouseover(function() {

    DoShowCallOut("#callOutID","relativeElement",0,0);
    return false;
});

$("#element").unbind("mouseout").mouseout(function() {

    DoHideCallOut("#callOutId");

    return false;
});


*/

function DoShowCallOut(callOutElementId, elementOffsetName, topOffset, leftOffset) {

    //p.optionButton is the element who we want to be offset to
    var t = $(elementOffsetName).position().top - topOffset + "px";
    var l = $(elementOffsetName).position().left - leftOffset + "px";

    $(callOutElementId).css("top", t);
    $(callOutElementId).css("left", l);

    $(callOutElementId).css("display", "block");
}

function DoHideCallOut(callOutElementId) {
    $(callOutElementId).css("display", "none");
}

/*
 * jQuery Easing v1.1.1 - http://gsgd.co.uk/sandbox/jquery.easing.php
 *
 * Uses the built in easing capabilities added in jQuery 1.1
 * to offer multiple easing options
 *
 * Copyright (c) 2007 George Smith
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 */

jQuery.extend(jQuery.easing, {
	easein: function(x, t, b, c, d) {
		return c*(t/=d)*t + b; // in
	},
	easeinout: function(x, t, b, c, d) {
		if (t < d/2) return 2*c*t*t/(d*d) + b;
		var ts = t - d/2;
		return -2*c*ts*ts/(d*d) + 2*c*ts/d + c/2 + b;		
	},
	easeout: function(x, t, b, c, d) {
		return -c*t*t/(d*d) + 2*c*t/d + b;
	},
	expoin: function(x, t, b, c, d) {
		var flip = 1;
		if (c < 0) {
			flip *= -1;
			c *= -1;
		}
		return flip * (Math.exp(Math.log(c)/d * t)) + b;		
	},
	expoout: function(x, t, b, c, d) {
		var flip = 1;
		if (c < 0) {
			flip *= -1;
			c *= -1;
		}
		return flip * (-Math.exp(-Math.log(c)/d * (t-d)) + c + 1) + b;
	},
	expoinout: function(x, t, b, c, d) {
		var flip = 1;
		if (c < 0) {
			flip *= -1;
			c *= -1;
		}
		if (t < d/2) return flip * (Math.exp(Math.log(c/2)/(d/2) * t)) + b;
		return flip * (-Math.exp(-2*Math.log(c/2)/d * (t-d)) + c + 1) + b;
	},
	bouncein: function(x, t, b, c, d) {
		return c - jQuery.easing['bounceout'](x, d-t, 0, c, d) + b;
	},
	bounceout: function(x, t, b, c, d) {
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
		} else {
			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
		}
	},
	bounceinout: function(x, t, b, c, d) {
		if (t < d/2) return jQuery.easing['bouncein'] (x, t*2, 0, c, d) * .5 + b;
		return jQuery.easing['bounceout'] (x, t*2-d,0, c, d) * .5 + c*.5 + b;
	},
	elasin: function(x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	},
	elasout: function(x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
	},
	elasinout: function(x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
	},
	backin: function(x, t, b, c, d) {
		var s=1.70158;
		return c*(t/=d)*t*((s+1)*t - s) + b;
	},
	backout: function(x, t, b, c, d) {
		var s=1.70158;
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	},
	backinout: function(x, t, b, c, d) {
		var s=1.70158;
		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
	}
});
/*
 * jQuery UI Accordion 1.6
 * 
 * Copyright (c) 2007 Jörn Zaefferer
 *
 * http://docs.jquery.com/UI/Accordion
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.accordion.js 4876 2008-03-08 11:49:04Z joern.zaefferer $
 *
 */

;(function($) {
	
// If the UI scope is not available, add it
$.ui = $.ui || {};

$.fn.extend({
	accordion: function(options, data) {
		var args = Array.prototype.slice.call(arguments, 1);

		return this.each(function() {
			if (typeof options == "string") {
				var accordion = $.data(this, "ui-accordion");
				accordion[options].apply(accordion, args);
			// INIT with optional options
			} else if (!$(this).is(".ui-accordion"))
				$.data(this, "ui-accordion", new $.ui.accordion(this, options));
		});
	},
	// deprecated, use accordion("activate", index) instead
	activate: function(index) {
		return this.accordion("activate", index);
	}
});

$.ui.accordion = function(container, options) {
	
	// setup configuration
	this.options = options = $.extend({}, $.ui.accordion.defaults, options);
	this.element = container;
	
	$(container).addClass("ui-accordion");
	
	if ( options.navigation ) {
		var current = $(container).find("a").filter(options.navigationFilter);
		if ( current.length ) {
			if ( current.filter(options.header).length ) {
				options.active = current;
			} else {
				options.active = current.parent().parent().prev();
				current.addClass("current");
			}
		}
	}
	
	// calculate active if not specified, using the first header
	options.headers = $(container).find(options.header);
	options.active = findActive(options.headers, options.active);

	if ( options.fillSpace ) {
		var maxHeight = $(container).parent().height();
		options.headers.each(function() {
			maxHeight -= $(this).outerHeight();
		});
		var maxPadding = 0;
		options.headers.next().each(function() {
			maxPadding = Math.max(maxPadding, $(this).innerHeight() - $(this).height());
		}).height(maxHeight - maxPadding);
	} else if ( options.autoheight ) {
		var maxHeight = 0;
		options.headers.next().each(function() {
			maxHeight = Math.max(maxHeight, $(this).outerHeight());
		}).height(maxHeight);
	}

	options.headers
		.not(options.active || "")
		.next()
		.hide();
	options.active.parent().andSelf().addClass(options.selectedClass);
	
	if (options.event)
		$(container).bind((options.event) + ".ui-accordion", clickHandler);
};

$.ui.accordion.prototype = {
	activate: function(index) {
		// call clickHandler with custom event
		clickHandler.call(this.element, {
			target: findActive( this.options.headers, index )[0]
		});
	},
	
	enable: function() {
		this.options.disabled = false;
	},
	disable: function() {
		this.options.disabled = true;
	},
	destroy: function() {
		this.options.headers.next().css("display", "");
		if ( this.options.fillSpace || this.options.autoheight ) {
			this.options.headers.next().css("height", "");
		}
		$.removeData(this.element, "ui-accordion");
		$(this.element).removeClass("ui-accordion").unbind(".ui-accordion");
	}
}

function scopeCallback(callback, scope) {
	return function() {
		return callback.apply(scope, arguments);
	};
}

function completed(cancel) {
	// if removed while animated data can be empty
	if (!$.data(this, "ui-accordion"))
		return;
	var instance = $.data(this, "ui-accordion");
	var options = instance.options;
	options.running = cancel ? 0 : --options.running;
	if ( options.running )
		return;
	if ( options.clearStyle ) {
		options.toShow.add(options.toHide).css({
			height: "",
			overflow: ""
		});
	}
	$(this).triggerHandler("change.ui-accordion", [options.data], options.change);
}

function toggle(toShow, toHide, data, clickedActive, down) {
	var options = $.data(this, "ui-accordion").options;
	options.toShow = toShow;
	options.toHide = toHide;
	options.data = data;
	var complete = scopeCallback(completed, this);
	
	// count elements to animate
	options.running = toHide.size() == 0 ? toShow.size() : toHide.size();
	
	if ( options.animated ) {
		if ( !options.alwaysOpen && clickedActive ) {
			$.ui.accordion.animations[options.animated]({
				toShow: jQuery([]),
				toHide: toHide,
				complete: complete,
				down: down,
				autoheight: options.autoheight
			});
		} else {
			$.ui.accordion.animations[options.animated]({
				toShow: toShow,
				toHide: toHide,
				complete: complete,
				down: down,
				autoheight: options.autoheight
			});
		}
	} else {
		if ( !options.alwaysOpen && clickedActive ) {
			toShow.toggle();
		} else {
			toHide.hide();
			toShow.show();
		}
		complete(true);
	}
}

function clickHandler(event) {
	var options = $.data(this, "ui-accordion").options;
	if (options.disabled)
		return false;
	
	// called only when using activate(false) to close all parts programmatically
	if ( !event.target && !options.alwaysOpen ) {
		options.active.parent().andSelf().toggleClass(options.selectedClass);
		var toHide = options.active.next(),
			data = {
				instance: this,
				options: options,
				newHeader: jQuery([]),
				oldHeader: options.active,
				newContent: jQuery([]),
				oldContent: toHide
			},
			toShow = options.active = $([]);
		toggle.call(this, toShow, toHide, data );
		return false;
	}
	// get the click target
	var clicked = $(event.target);
	
	// due to the event delegation model, we have to check if one
	// of the parent elements is our actual header, and find that
	if ( clicked.parents(options.header).length )
		while ( !clicked.is(options.header) )
			clicked = clicked.parent();
	
	var clickedActive = clicked[0] == options.active[0];
	
	// if animations are still active, or the active header is the target, ignore click
	if (options.running || (options.alwaysOpen && clickedActive))
		return false;
	if (!clicked.is(options.header))
		return;

	// switch classes
	options.active.parent().andSelf().toggleClass(options.selectedClass);
	if ( !clickedActive ) {
		clicked.parent().andSelf().addClass(options.selectedClass);
	}

	// find elements to show and hide
	var toShow = clicked.next(),
		toHide = options.active.next(),
		//data = [clicked, options.active, toShow, toHide],
		data = {
			instance: this,
			options: options,
			newHeader: clicked,
			oldHeader: options.active,
			newContent: toShow,
			oldContent: toHide
		},
		down = options.headers.index( options.active[0] ) > options.headers.index( clicked[0] );
	
	options.active = clickedActive ? $([]) : clicked;
	toggle.call(this, toShow, toHide, data, clickedActive, down );

	return false;
};

function findActive(headers, selector) {
	return selector != undefined
		? typeof selector == "number"
			? headers.filter(":eq(" + selector + ")")
			: headers.not(headers.not(selector))
		: selector === false
			? $([])
			: headers.filter(":eq(0)");
}

$.extend($.ui.accordion, {
	defaults: {
		selectedClass: "selected",
		alwaysOpen: true,
		animated: 'slide',
		event: "click",
		header: "a",
		autoheight: true,
		running: 0,
		navigationFilter: function() {
			return this.href.toLowerCase() == location.href.toLowerCase();
		}
	},
	animations: {
		slide: function(options, additions) {
			options = $.extend({
				easing: "swing",
				duration: 300
			}, options, additions);
			if ( !options.toHide.size() ) {
				options.toShow.animate({height: "show"}, options);
				return;
			}
			var hideHeight = options.toHide.height(),
				showHeight = options.toShow.height(),
				difference = showHeight / hideHeight;
			options.toShow.css({ height: 0, overflow: 'hidden' }).show();
			options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate({height:"hide"},{
				step: function(now) {
					var current = (hideHeight - now) * difference;
					if ($.browser.msie || $.browser.opera) {
						current = Math.ceil(current);
					}
					options.toShow.height( current );
				},
				duration: options.duration,
				easing: options.easing,
				complete: function() {
					if ( !options.autoheight ) {
						options.toShow.css("height", "auto");
					}
					options.complete();
				}
			});
		},
		bounceslide: function(options) {
			this.slide(options, {
				easing: options.down ? "bounceout" : "swing",
				duration: options.down ? 1000 : 200
			});
		},
		easeslide: function(options) {
			this.slide(options, {
				easing: "easeinout",
				duration: 700
			})
		}
	}
});

})(jQuery);

/*
* Autocompletelite - jQuery plugin 0.1
*
* Copyright (c) 2009 Anthony Cooper
*
* Based on autocomplete plugin by Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, J?rn Zaefferer.
* this is a client side only implementation that does not support ajax calls to retrieve matches
* use for lists of up to 500 records, and is optimised to work better with older browsers (e.g. IE6).
* Special features:
* - show all functionality to be have like normal dropdown
* 	- on clicking show all, automatically scrolls to last selected item, or first item found depending on search text
* - uses regex to match list entries with options of contains, any and startswith
* - optional hidden field for storing value member
* - tab hit event firing
* - shows no match warning when no matches found
*/
// use $ as jQuery alias
(function($) {

    // extend jQuery, create methods to be called from jQuery construct
    $.fn.extend({
        aclite: function(data, options) {
            options = $.extend({}, $.aclite.defaults, {
                data: data
            }, options);
            return this.each(function() {
                new $.aclite(this, options);
            });
        },
        selectChanged: function(handler) {
            return this.bind("selectChanged", handler);
        },
        showAll: function() {
            return this.trigger("showAll");
        },
        unaclite: function() {
            return this.trigger("unaclite");
        }
    });

    // aclite class 
    $.aclite = function(input, options) {
        var KEY = {
            UP: 38,
            DOWN: 40,
            DEL: 46,
            TAB: 9,
            RETURN: 13,
            ESC: 27,
            COMMA: 188,
            PAGEUP: 33,
            PAGEDOWN: 34,
            BACKSPACE: 8
        };

        // Create $ object for input element
        var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
        var uiState = {
            mouseDownOnSelect: false,
            lastKeyPressCode: null
        };
        var selectedVal = $.aclite.SelectedValue(options, input);
        var noMatch = $.aclite.NoMatch(options, input);
        var isShowing = false;
        var select = $.aclite.Select(options, input, selectCurrent, uiState, selectedVal);
        select.initialize();

        var previousValue = "";
        var timeout;

        var blockSubmit;

        // prevent form submit in opera when selecting with return key
        $.browser.opera &&
        $(input.form).bind("submit.aclite", function() {
            if (blockSubmit) {
                blockSubmit = false;
                return false;
            }
        });

        $input.bind(($.browser.opera ? "keypress" : "keydown") + ".aclite", function(event) {
            // track last key pressed
            uiState.lastKeyPressCode = event.keyCode;
            switch (event.keyCode) {
                case KEY.UP:
                    event.preventDefault();
                    if (select.visible()) {
                        select.prev();
                    }
                    else {
                        onChange(true);
                    }
                    break;
                case KEY.DOWN:
                    event.preventDefault();
                    if (select.visible()) {
                        select.next();
                    }
                    else {
                        onChange(true);
                    }
                    break;

                case KEY.PAGEUP:
                    event.preventDefault();
                    if (select.visible()) {
                        select.pageUp();
                    }
                    else {
                        onChange(true);
                    }
                    break;

                case KEY.PAGEDOWN:
                    event.preventDefault();
                    if (select.visible()) {
                        select.pageDown();
                    }
                    else {
                        onChange(true);
                    }
                    break;
                case undefined:
                    event.preventDefault();
                    alert("undefined");
                    break;
                case KEY.TAB:
                case KEY.RETURN:
                    if (selectCurrent()) {
                        // stop default to prevent a form submit, Opera needs special handling
                        event.preventDefault();
                        blockSubmit = true;
                        return false;
                    }
                    break;
                case KEY.ESC:
                    hideResults();
                    break;
                default:
                    clearTimeout(timeout);
                    timeout = setTimeout(onChange, options.delay);
                    break;
            }
        }).bind("showAll", function() {
            if (!isShowing) {
                isShowing = true;
                startLoading();
                select.search("");
                select.show();
                $input.focus();
                stopLoading();
            } else {
                hideResults();
                isShowing = false;
            }
        }).blur(function() {
            if (!uiState.mouseDownOnSelect) {
                hideResults();
            }
            noMatch.hide();
        }).bind("unaclite", function() {
            select.unbind();
            noMatch.unbind();
            $input.unbind();
            $(input.form).unbind(".aclite");
        });


        function selectCurrent() {
            var selected = select.selected();
            if (!selected)
                return false;

            noMatch.hide();

            var v = selected.result;
            previousValue = v;

            $input.val(v);

            selectedVal.set(selected.selectedValue);

            hideResults();
            $input.trigger("selectChanged", [selected.data, selected.value, uiState.lastKeyPressCode == KEY.TAB]);
            return true;
        }
        function hideResults() {
            stopLoading();
            var wasVisible = select.visible();
            select.hide();
            if (wasVisible)
            // position cursor at end of input field
                $.aclite.Selection(input, input.value.length, input.value.length);
            var selected_val = select.validateResult(input.value);
            if (selected_val) {
                $input.removeClass(options.warnClass);
                selectedVal.set(selected_val);
            }
            else {
                if (input.value.length >= options.minChars) {
                    $input.addClass(options.warnClass);
                }
                selectedVal.set("");
            }
        }
        function onChange(skipPrevCheck) {
            if (uiState.lastKeyPressCode == KEY.DEL) {
                hideResults();
                return;
            }

            var currentValue = $input.val();

            if (!skipPrevCheck && currentValue == previousValue)
                return;

            previousValue = currentValue;

            if (currentValue.length >= options.minChars) {
                startLoading();
                if (select.search(currentValue)) {
                    noMatch.hide();
                    select.show();
                    $input.removeClass(options.warnClass);
                    stopLoading();
                }
                else {
                    hideResults();
                    noMatch.show();
                }
            }
            else {
                hideResults();
                noMatch.hide();
            }
        }
        function stopLoading() {
            $input.removeClass(options.loadingClass);
        }
        function startLoading() {
            $input.addClass(options.loadingClass);
        };
    };

    $.aclite.defaults = {
        inputClass: "acl_input",
        loadingClass: "acl_loading",
        resultsClass: "acl_results",
        warnClass: "acl_warn",
        matchCase: false,
        matchContains: "contains",
        data: null,
        width: null,
        minChars: 2,
        regExIgnoreCharacters: ["(", ")", "*"],
        delay: 10,
        scroll: true,
        scrollHeight: 180,
        formatMatch: null,
        formatSelected: null,
        formatSelectedValue: null,
        resultValHolder: null,
        max: 200,
        noMatchText: "No Match",
        selectFirst: true,
        highlight: function(value, term) {
            return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
        }
    };

    $.aclite.SelectedValue = function(options, input) {
        var valueHolder = options.resultValHolder ? $(options.resultValHolder) : null;
        return {
            get: function() {
                return valueHolder ? valueHolder.val() : null;
            },
            set: function(val) {
                valueHolder && valueHolder.val(val);
            },
            available: function() {
                return valueHolder != null;
            }
        };
    };

    $.aclite.Select = function(options, input, selectCurrent, uiState, selectedValControl) {
        var CLASSES = {
            ACTIVE: "acl_over",
            ODD: "acl_odd",
            EVEN: "acl_even",
            VISIBLE: "acl_visible"
        };
        var list, listItems, element, active = -1, lastSearchTerm, scrollTimeout;
        function init() {
            element = $("<div/>").css("display", "none").addClass(options.resultsClass).css("position", "absolute").appendTo(document.body);

            list = $("<ul/>").appendTo(element).mouseover(function(event) {
                if (target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
                    active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
                    $(target(event)).addClass(CLASSES.ACTIVE);
                }
            }).click(function(event) {
                uiState.lastKeyPressCode = null;
                $(target(event)).addClass(CLASSES.ACTIVE);
                selectCurrent();
                input.focus();
                return false;
            }).mousedown(function() {
                uiState.mouseDownOnSelect = true;
            }).mouseup(function() {
                uiState.mouseDownOnSelect = false;
            });
            loadList(options.data);
            if (options.width && (typeof options.width == "string" || options.width > 0))
                element.css("width", options.width);

        }
        function loadList(data) {
            var max = data.length;
            for (var i = 0; i < max; i++) {
                if (!data[i])
                    continue;
                var formatted = options.formatMatch(data[i]);
                if (formatted === false)
                    continue;

                var li = $("<li/>").html(formatted).appendTo(list)[0];
                var resultValue = options.formatSelected && options.formatSelected(data[i]) || value;
                var row = {
                    value: formatted,
                    data: data[i],
                    result: resultValue,
                    selectedValue: options.formatSelectedValue && options.formatSelectedValue(data[i]) || resultValue
                };
                $.data(li, "ac_data", row);
                // apply bgiframe if available
                if ($.fn.bgiframe)
                    list.bgiframe();
            }
        }

        function target(event) {
            var element = event.target;
            while (element && element.tagName != "LI")
                element = element.parentNode;
            // more fun with IE, sometimes event.target is empty, just ignore it then
            if (!element)
                return [];
            return element;
        }

        function search(term) {
            lastSearchTerm = term;
            active = -1;
            var counter = 1;
            list.children("li").each(function(i) {
                if (counter > options.max) {
                    return false;
                }
                $(this).attr("class", "");
                var subjectText = $(this).data("ac_data").value;
                if (term == "") {
                    $(this).html(subjectText).addClass(counter % 2 == 0 ? CLASSES.EVEN : CLASSES.ODD).addClass(CLASSES.VISIBLE).show();
                    counter++;
                }
                else {
                    if (findMatch(term, subjectText)) {
                        $(this).html(options.highlight(subjectText, term)).addClass(counter % 2 == 0 ? CLASSES.EVEN : CLASSES.ODD).addClass(CLASSES.VISIBLE).show();
                        counter++;
                    }
                    else {
                        $(this).hide();
                    }
                }
            });
            listItems = list.find("li." + CLASSES.VISIBLE);
            if (options.selectFirst) {
                active = 0;
                listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
            }
            return listItems.size() > 0;
        }
        function findMatch(query, subject) {
            //match = start/contains/any
            //replace " " with \s
            query = query.replace(/ /g, "\\s");
            for (i = 0; i < options.regExIgnoreCharacters.length; i++) {
                var ignoreRegex = new RegExp("\\" + options.regExIgnoreCharacters[i], "g");
                query = query.replace(ignoreRegex, "\\" + options.regExIgnoreCharacters[i]);
            }
            var qRegex;
            var matchCase = options.matchCase ? "" : "i";
            try {
                switch (options.matchContains) {
                    case "contains":
                        qRegex = new RegExp("\\b" + query, "g" + matchCase);
                        break;
                    case "any":
                        qRegex = new RegExp(query, "g" + matchCase);
                        break;
                    default:
                        //start
                        qRegex = new RegExp("^" + query, matchCase);
                        break;
                }
                return qRegex.test(subject);
            }
            catch (err) {
                return false;
            }

        }
        function moveSelect(step) {

            var currentItem = listItems.slice(active, active + 1);
            if (currentItem.length > 0)
                currentItem.removeClass(CLASSES.ACTIVE);
            movePosition(step);
            var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
            if (options.scroll) {

                list.scrollTop(activeItem[0].offsetTop);
            }
        }
        function movePosition(step) {
            active += step;
            if (active < 0) {
                active = listItems.length - 1;
            }
            else
                if (active >= listItems.length) {
                active = 0;
            }
        }

        function scrollToSelected() {
            //remove active items
            list.find("li." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
            var activeItemBySearch;
            var activeItemBySearchIndex;

            var activeItemBySelectedVal;
            var activeItemBySelecteValIndex;

            var selectedStoredValue;
            if (selectedValControl.available()) {
                selectedStoredValue = selectedValControl.get();
            }

            var newActiveIndex;

            var qText = $(input).val();
            // find by input val
            // showAll has been called
            if (lastSearchTerm == "") {
                for (j = 0; j < listItems.length; j++) {
                    var itemData = $(listItems[j]).data("ac_data");
                    var subj = itemData.value;
                    var itemId = itemData.selectedValue;

                    if (qText != "" && !activeItemBySearch && findMatch(qText, subj)) {
                        activeItemBySearch = listItems[j];
                        activeItemBySearchIndex = j;
                    }
                    if (selectedStoredValue && !activeItemBySelectedVal && selectedStoredValue == itemId) {
                        activeItemBySelectedVal = listItems[j];
                        activeItemBySelecteValIndex = j;
                    }
                }
                newActiveIndex = activeItemBySearchIndex ? activeItemBySearchIndex :
									activeItemBySelecteValIndex ? activeItemBySelecteValIndex : undefined;
            }

            active = newActiveIndex ? newActiveIndex : active;

            moveSelect(0);
        }

        function show() {
            var offset = $(input).offset();
            element.css({
                width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
                top: offset.top + input.offsetHeight,
                left: offset.left
            }).show();
            if (options.scroll) {
                list.css({
                    maxHeight: options.scrollHeight,
                    overflow: "auto"
                });
                clearTimeout(scrollTimeout);
                scrollTimeout = setTimeout(scrollToSelected, options.delay);
                if ($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
                    var listHeight = 0;
                    listItems.each(function() {
                        listHeight += this.offsetHeight;
                    });
                    var scrollbarsVisible = listHeight > options.scrollHeight;
                    list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight);
                    if (!scrollbarsVisible) {
                        // IE doesn't recalculate width when scrollbar disappears
                        listItems.width(list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")));
                    }
                }
            }
        }

        function resultIsValid(result) {
            var isValid = false;
            list.children("li").each(function(i) {
                var itemData = $(this).data("ac_data");
                if (itemData.result && result == itemData.result) {
                    isValid = itemData.selectedValue;
                    return false; //break out of each loop
                }
            });
            return isValid;
        }
        return {
            initialize: init,
            search: function(term) {
                return search(term);
            },
            show: function() {
                show();
            },
            hide: function() {
                element && element.hide();
            },
            visible: function() {
                return element && element.is(":visible");
            },
            next: function() {
                moveSelect(1);
            },
            prev: function() {
                moveSelect(-1);
            },
            pageUp: function() {
                if (active != 0 && active - 8 < 0) {
                    moveSelect(-active);
                }
                else {
                    moveSelect(-8);
                }
            },
            pageDown: function() {
                if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
                    moveSelect(listItems.size() - 1 - active);
                }
                else {
                    moveSelect(8);
                }
            },
            selected: function() {
                var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
                return selected && selected.length && $.data(selected[0], "ac_data");
            },
            validateResult: function(result) {
                return resultIsValid(result);
            },
            unbind: function() {
                element && element.remove();
            }
        };
    };

    $.aclite.NoMatch = function(options, input) {
        var CLASSES = {
            NO_MATCH: "acl_nomatch"
        };
        var noMatch;

        // Create no match field
        noMatch = $("<div/>").css("display", "none").addClass(CLASSES.NO_MATCH).css("position", "absolute").html('<span>' + options.noMatchText + '</span>').appendTo(document.body);

        return {
            show: function() {
                var offset = $(input).offset();
                noMatch.css({
                    width: noMatch.css("width") == "" ? $(input).width() : noMatch.css("width"),
                    top: offset.top + input.offsetHeight,
                    left: offset.left
                }).show();
            },
            hide: function() {
                if (noMatch && noMatch.is(":visible"))
                    noMatch.hide();
            },
            unbind: function() {
                noMatch && noMatch.remove();
            }
        };
    };

    $.aclite.Selection = function(field, start, end) {
        if (field.createTextRange) {
            var selRange = field.createTextRange();
            selRange.collapse(true);
            selRange.moveStart("character", start);
            selRange.moveEnd("character", end);
            selRange.select();
        }
        else
            if (field.setSelectionRange) {
            field.setSelectionRange(start, end);
        }
        else {
            if (field.selectionStart) {
                field.selectionStart = start;
                field.selectionEnd = end;
            }
        }
        field.focus();
    };

})(jQuery);

/// <reference path="Calendar.js" />
/// <reference path="../../jquery.vsdoc.1.2.6.js" />
/// <reference path="../../Date.1.0.js" />

var isFromPreviousSearch = false;
var datePickerIsShowing = false;
function CheckUrls() {
    if (typeof SearchForFlightsUrl == 'undefined')
        alert("SearchForFlightsUrl is not specified");
}

function isOneWayChecked() {
    return ($("#isOneWay").is(':checked'));
}



function SearchPodMinOnLoad() {
    CheckUrls();
    function createTabOrderAndDatePickers() {
        specifyTabOrder(["#acOriginAirport",
            "#acDestinationAirport",
            "#isOneWay",
            "#flexibleOnDates",
            "#oDate",
            "#rDate",
            "#numberOfAdults",
            "label[for=numberOfChildren] a",
            "#numberOfChildren",
            "#numberOfInfants",
            "#searchPodSubmitButton"]);
            jQuery.fn.attachDateRangePickers($("#oDate"), $("#rDate"));
    }
    

    function specifyTabOrder(formSelectors) {
        $(formSelectors).tabGroup();
    }


    $("#isOneWay").click(function() { performOneWayAction(isOneWayChecked()); });
    $("#recentSearchLink").click(function(e) {
        e.preventDefault();
        expandSearches('previousSearchSection');
    });



    function performOneWayAction(oneWayChecked) {
        if (oneWayChecked) {
            removeTooltip($("#rDate"));
            $("#rDate").disableDatePicker();
        } else {
            validateFieldContents($("#rDate"));
            $("#rDate").removeAttr("disabled");
            $("#rDate").enableDatePicker();
        }
    }
    createTabOrderAndDatePickers();
    performOneWayAction(isOneWayChecked());
    //selectionChangedHandler
    
    $("#searchPodSubmitButton").unbind("click").click(submitSearchPod);
    $("#searchPodSubmitButton").unbind("enterPressed").bind("enterPressed", submitSearchPod);

    function submitSearchPod() {
        if (handleHasValidationMessages()) {
            if (searchParamsAreValid()) {
                if ((isOneWayChecked() || handleSameDayItinerary()) && handleDepartTodayDisclaimer()) {
                    if (handleChildDisclaimer() && handleInfantDisclaimer()) {
                        submitSearch();
                    }
                }
            }
        }
        return false;
    }
    
    $("#RecentSearchLink").hover(
        function() { $(this).css('cursor', 'pointer'); },
        function() { $(this).css('cursor', ''); }
     );
    $("#acOriginAirport").unbind("selectChanged").bind("selectChanged", function(sender, data, value, wasTabHit) {
        var originAirportCode = $("#acOriginAirportValue").val();
        if (originAirportCode) {
            $("#acDestinationAirport").val("");
            giveDestinationAirportInputFocus = wasTabHit;
            ReloadDestinationAirports(originAirportCode, "acDestinationAirport", function(sender, data, value, wasTabHit) { }, createTabOrderAndDatePickers);
           
        }
        else
        { alert("Origin Airport not selected"); }
    }
    );
        $("#acDestinationAirport").unbind("selectChanged").bind("selectChanged", function(sender, data, value, wasTabHit) {});
}



function searchParamsAreValid() {
    if ($("#acOriginAirportValue").val() == '') {
        alert(NoOriginErrorMessage);
        return false;
    }

    if ($("#acDestinationAirportValue").val() == '') {
        alert(NoDestinationErrorMessage);
        return false;
    }
    var valid = true;
    if ((!isOneWayChecked()) && $("#rDate").val() == '') {
        alert(IncompleteReturnDateErrorMessage);
        return false;
    }
    var numberOfAdults = parseInt($("#numberOfAdults").val());
    var numberOfFullFareTravelers = numberOfAdults + parseInt($("#numberOfChildren").val());
    if (numberOfFullFareTravelers == 0) {
        alert(ZeroTravelersErrorMessage);
        valid = false;
    }

    if (numberOfFullFareTravelers > 40) {
        alert(MaximumNumberOfTravelersErrorMessage);
        valid = false;
    }
    var numberOfInfants = parseInt($("#numberOfInfants").val());
    if (numberOfAdults < numberOfInfants) {
        alert(MoreInfantsThanAdultsErrorMessage);
        valid = false;
    }
    var outboundDate = Date.fromEjDateControl($("#oDate"));
    var today = getToday();
    if (outboundDate < today) {
        var day = dayValue.toString();
        var monthYear = monthValue.toString() + "" + yearValue.toString();
        $("#oDate").val(Date.toddMMyyyyFormattedString(today));
        $("#oDate").trigger('blur');
        alert(OutboundDateBeforeTodayErrorMessage);
        valid = false;
    }
    var returnDate = undefined;
    if (!isOneWayChecked()) {
        returnDate = Date.fromEjDateControl($("#rDate"));
    }
    valid = valid && Route.ValidateFlightDatesForRoute(acDestinationAirport_linkedAirports, outboundDate, returnDate, $("#acDestinationAirportValue").val(), flightDateBeforeRouteStartErrorMessage, flightDateAfterRouteEndErrorMessage);
    return valid;
}



function handleHasValidationMessages() {
    if (hasValidationMessages()) {
        alert(getValdationText());
        return false;
    }
    return true;
}

function handleSameDayItinerary() {
    var cont = true;
    if ($("#oDate").val() == $("#rDate").val()) {
        cont = confirm(SameDayItineraryWarningMessage);
    }
    return cont;
}

function handleDepartTodayDisclaimer() {
    var cont = true;
    var departureDate = Date.fromEjDateControl($("#oDate"));

    if (departureDate.toDateString() == getToday().toDateString())
        cont = confirm(DepartTodayDisclaimer);

    return cont;
}


function getToday() {
    return Date.Now();
}

function handleChildDisclaimer() {
    var cont = true;

    var numberOfAdults = parseInt($("#numberOfAdults").val(), 10);
    var numberOfChildren = parseInt($("#numberOfChildren").val(), 10);
    if (numberOfAdults == 0 && numberOfChildren > 0)
        cont = confirm(ChildDisclaimer);

    return cont;
}

function handleInfantDisclaimer() {
    var cont = true;

    var numberOfInfants = parseInt($("#numberOfInfants").val(), 10);
    if (numberOfInfants > 0)
        cont = confirm(InfantDisclaimer);

    return cont;
}

function submitSearch() {
    /// <summary>Submits the search form to EJ2 using deep linking url structure</summary>

    var departureDate = Date.toLegacyDate(Date.fromEjDateControl($("#oDate")));
    var returnDate = Date.toLegacyDate(Date.fromEjDateControl($("#rDate")));

    var params = '?dep=' + $("#acOriginAirportValue").val()
		+ '&dest=' + $("#acDestinationAirportValue").val()
		+ '&dd=' + $("#oDate").val()
		+ '&rd=' + $("#rDate").val()
		+ '&apax=' + $("#numberOfAdults").val()
		+ '&pid=' + getDocumentDomain()
		+ '&cpax=' + $("#numberOfChildren").val()
		+ '&ipax=' + $("#numberOfInfants").val()
		+ '&lang=' + currentLanguageCode
		+ '&isOneWay=' + (isOneWayChecked() ? 'on' : 'off')

    //go direct to week view if flexible on dates is checked
    if ($('#flexibleOnDates').attr('checked') == 'true') {
        params += '&view=w';
    }

    var url = DeepLinkUrl + params;
    window.location = url;
}


//js BaseDomain is only set to a value if we are not using the JS search pod delivery mechanism ie
//if we are using iframe. When using js delivery simply get the current window location.
function getDocumentDomain() {
    var url = '';
    if (typeof jsBaseDomain == 'undefined' || jsBaseDomain == '' || jsBaseDomain == null) {
        url = window.location + '';
    } else {
        url = jsBaseDomain;
    }
    url = url.split(/\/+/g)[1];
    return url;
}

function submitRecentSearch(oAC, dAC, oDate, rDate, numAd, numC, numI, flex) {
    var outBoundDate = Date.toLegacyDate(Date.fromddMMyyyyFormattedString(oDate));
    var returnDate = Date.toLegacyDate(Date.fromddMMyyyyFormattedString(rDate));

    var params = "?origAirportCode=" + oAC
        + "&destAirportCode=" + dAC
        + "&departureDay=" + outBoundDate.day
        + "&departureMonthYear=" + outBoundDate.monthYear
        + "&returnDay=" + returnDate.day
        + "&returnMonthYear=" + returnDate.monthYear
        + "&numberOfAdults=" + numAd
        + "&numberOfChildren=" + numC
        + "&numberOfInfants=" + numI
        + "&flexibleOnDates=" + flex
        + "&email=" + '';

    SearchForFlightsUrl = SearchForFlightsUrl + "/SearchForFlights" + params;

    window.location = SearchForFlightsUrl;
}


function DeletePreviousSearch(searchID) {
    var url = DeleteSearchFromCookieUrl.replace('P_SEARCH_ID', searchID);

    $.getJSON(url, searchID,
        function(jsonResponse) {
            if ((jsonResponse) == true) {

                getHeightOfPreviousSearch();
                $("#PreviousSearchLine_" + searchID).hide();
                previousSearchCount = previousSearchCount - 1;

                if (previousSearchCount == 0) {
                    // we are deleting so now hide header too.
                    $("#recentSearchLink").remove();  //hide();
                    getHeightOfPreviousSearch();
                }

                $("#sliderFlightSearchTab").animate({ 'height': OriginalHeightSearchFlightSearchTab + AdditionalAccordionHeightForDiv }, 'fast');
                $("#searchPodSlider").animate({ 'height': OriginalHeightSearchPodSlider + AdditionalAccordionHeightForDiv }, 'fast');
                $('#searchPodSlider').accordion({ animated: 'easeslide', header: 'div.accordionHeader' });
            }
            else { alert("error: failed to delete search"); }
        });
}

function getHeightOfPreviousSearch() {

    var totalHeight = $("#previousSearchSection").height();
    AdditionalAccordionHeightForDiv = totalHeight + 15;
}

function expandSearches(theDiv) {
    // force width to be 300 to stop rendering issues
    $("#searchPodSlider").width(300);

    if ($("#" + theDiv).is(":visible")) {
        //close
        $("#" + theDiv).css("display", "none");
        getHeightOfPreviousSearch();

        $("#searchPodSlider").height(OriginalHeightSearchPodSlider);
        $("#sliderFlightSearchTab").height(OriginalHeightSearchFlightSearchTab);

    }
    else {
        //open
        $("#" + theDiv).css("display", "block");
        getHeightOfPreviousSearch();

        $("#searchPodSlider").height(OriginalHeightSearchPodSlider + AdditionalAccordionHeightForDiv);
        $("#sliderFlightSearchTab").height(OriginalHeightSearchFlightSearchTab + AdditionalAccordionHeightForDiv);

    }

    $('#searchPodSlider').accordion({ animated: 'easeslide', header: 'div.accordionHeader' });
    return false;

}


function CheckAirportCodes(airportCodeOut, airportCodeRet) {
    if (airportCodeOut == 'EMA' || airportCodeRet == 'EMA') {
        return true;
    }
    else { return false; }
}


function hasValidationMessages() {
    var oDateValidationMessage = $('#oDateCallout');
    var rDateValidationMessage = $('#rDateCallout');

    return (oDateValidationMessage.is(':visible') ||
            rDateValidationMessage.is(':visible'));
}

function getValdationText() {
    var oDateValidationMessage = $('#oDateCallout');
    var rDateValidationMessage = $('#rDateCallout');
    var text = '';
    if (oDateValidationMessage.is(':visible')) {
        text = oDateValidationMessage.text() + '\n';
    }
    if (rDateValidationMessage.is(':visible')) {
        text = text + rDateValidationMessage.text() + '';
    }
    return text;
}

//Creates two date pickers from two input fields ensuring that rDateField >= to oDateField by incrementing rDateField if necassary when either field changes

jQuery.fn.attachDateRangePickers = function(oDateField, rDateField) {
    if (dateFormatInvalidMessage == null || dateFormatInvalidMessage == '' ||
        LatestMonthEndDate == null || LatestMonthEndDate == '' ||
        dateContentInvalidMessage == null || dateContentInvalidMessage == '' ||
        dateEnteredInPastMessage == null || dateEnteredInPastMessage == '' ||
        dateEnteredTooGreatMessage == null || dateEnteredTooGreatMessage == '') {
        throw "All the date validation message variables  must be defined LatestMonthEndDate,dateFormatInvalidMessage,dateContentInvalidMessage,dateEnteredInPastMessage,dateEnteredTooGreatMessage";
    }

    function balanceOutboundDate() {
        var returnDate = Date.fromEjDateControl(rDateField);
        var outboundDate = Date.fromEjDateControl(oDateField);
        if (returnDate != null && outboundDate != null && outboundDate.compareTo(returnDate) == 1) {
            rDateField.val(Date.toddMMyyyyFormattedString(outboundDate));
            removeTooltip(rDateField);
        }
    }
    function balanceReturnDate() {
        var returnDate = Date.fromEjDateControl(rDateField);
        var outboundDate = Date.fromEjDateControl(oDateField);
        if (outboundDate != null && returnDate != null && outboundDate.compareTo(returnDate) == 1) {
            oDateField.val(Date.toddMMyyyyFormattedString(returnDate));
            removeTooltip(oDateField);
        }
    }

        $(["#acOriginAirport",
                "#acDestinationAirport",
                "#isOneWay",
                "#flexibleOnDates",
                "#numberOfAdults",
                "label[for=numberOfChildren] a",
                "#numberOfChildren",
                "#numberOfInfants",
                "#searchPodSubmitButton"]).each(function() {
                    var input = $('' + this);
                    input.bind('click', hideAllDatePickers).
                        bind('tabOut', hideAllDatePickers).
                        bind('tabIn', hideAllDatePickers).
                        bind('focus', hideAllDatePickers).
                        bind('enterPressed', hideAllDatePickers)
                });
                

        function hideAllDatePickers() {
            $('.ui-datepicker').css('display', 'none');
            $('#rDate').datepicker('hide');
            $('#oDate').datepicker('hide');
        }

    function createDatePicker(inputField, dateBalancer, nextFieldToFocus) {
        var textEnteredEvent = function() {
            if (validateFieldContents(inputField)) {
                dateBalancer();
            }
        };

//        function showPicker() {
//            console.log('showing date picker');
//            inputField.datepicker('show');
//            alert('showing');
//        }
//        function hidePicker() {
//            console.log('hiding date picker');
//            //inputField.datepicker('hide');
//        }

//        inputField.click(showPicker);
//        inputField.blur(function(e) { e.preventDefault(); });

//        inputField.unbind("tabIn").bind("tabIn", showPicker);
//        inputField.bind("tabOut", function() { console.log('tab pressed'); hidePicker(); });
//        inputField.bind("enterPressed", hidePicker);
        inputField.datepicker('destroy')
        inputField.unmask();
        inputField.mask("99/99/9999");
        inputField.unbind("tabOut").bind("tabOut", textEnteredEvent);
        inputField.unbind("reverseTabOut").bind("reverseTabOut", textEnteredEvent);
        inputField.unbind("blur").blur(textEnteredEvent);
        inputField.datepicker({
            showOptions: { origin: ["top", "left"] },
            showOn: "both",
            showAnim: false,
            minDate: "0d",
            buttonImageOnly: true,
            maxDate: LatestMonthEndDate,
            buttonImage: CalendarButtonImage,
            dateFormat: 'dd/mm/yy',
            onSelect: function(e) { textEnteredEvent(); }

            //            beforeShow: function(myInput) { setTimeout("$('#" + inputField.attr("id") + "').select()", 500); },
            //onSelect: function(e) { selectNextField(); textEnteredEvent(); }
        });


    }
    createDatePicker(oDateField, balanceOutboundDate, rDateField);
    createDatePicker(rDateField, balanceReturnDate, $('#numberOfAdults'));
}



function redrawSearchBox() {
    var searchBox = $('#sliderFlightSearchTab');
    var expansionAmount = 50;
    if (hasValidationMessages() &&
            !searchBox.hasClass('expanded')
        ) {
        searchBox.height(searchBox.height() + expansionAmount);
        searchBox.addClass('expanded');
    }
    if (!hasValidationMessages() &&
            searchBox.hasClass('expanded')
        ) {
        searchBox.height(searchBox.height() - expansionAmount);
        searchBox.removeClass('expanded');
    }
}

function validateDateString(dateString) {
    if (!Date.isValidddMMyyyyFormattedString(dateString)) {
        return dateFormatInvalidMessage;
    }
    if (!Date.isValidddMMyyyyContent(dateString)) {
        return dateContentInvalidMessage;
    }
    var fieldDate = Date.fromddMMyyyyFormattedString(dateString);
    var nowDate = Date.Now();
    if (nowDate.compareTo(fieldDate) == 1) {
        return dateEnteredInPastMessage;
    }
    if (fieldDate.compareTo(LatestMonthEndDate) == 1) {
        return dateEnteredTooGreatMessage;
    }
    return null;
}


function validateFieldContents(dateInputField) {
    var result = validateDateString(dateInputField.val());
    if (result != null) {
        showTooltip(result, dateInputField);
        return false;
    } else {
        removeTooltip(dateInputField);
        return true;
    }
}

function showTooltip(tipText, inputField) {
    var calloutId = '#' + inputField.attr('id') + 'Callout';
    var callout = $(calloutId);
    if (!(callout.length > 0)) {
        throw "Unable to find callout id \"" + calloutId + "\"";
    }
    callout.html('<span>' + tipText + '</span>');
    inputField.addClass('fieldError');
    $(calloutId).show();
    redrawSearchBox();
}


function removeTooltip(inputField) {
    inputField.removeClass('fieldError');
    var calloutId = '#' + inputField.attr('id') + 'Callout';
    $(calloutId).hide();
    redrawSearchBox();
}


/// <reference path="Calendar.js" />
/// <reference path="../../jquery.vsdoc.1.2.6.js" />
/// <reference path="../../Date.1.0.js" />

var isFromPreviousSearch = false;



function SearchPodOnLoad() {
    SearchPodMinOnLoad();
    //selectionChangedHandler
    $("#searchPodSubmitButton").unbind("click").click(function() {
        if (handleHasValidationMessages()) {
            if (searchParamsAreValid()) {
                if ((isOneWayChecked() || handleSameDayItinerary()) && handleDepartTodayDisclaimer()) {
                    if (handleChildDisclaimer() && handleInfantDisclaimer()) {
                        WebTracker.TrackTaggedLink('BP: SHOW FLIGHTS BUTTON');
                        submitSearch();
                    }
                }
            }
        }
        return false;
    });
    $("#btnManageBookingLogin").unbind("click").click(function() {
        WebTracker.TrackTaggedLink('BP: MANAGE BOOKINGS BUTTON');
        submitLogin();
    }
        );
    $("#btn_Login").unbind("click").click(function() {
        var emailAddress =  $("#onlinecheckin_emailaddress").val();
        if ((emailAddress.indexOf('@') > 0)) {

            if (emailAddress != "" && $("#onlinecheckin_password").val() != "") {

                document.forms["signin"].strEmail.value = document.getElementById("onlinecheckin_emailaddress").value;
                document.forms["signin"].strPassword.value = document.getElementById("onlinecheckin_password").value;
                submitLogin();
                return false;
            }
            else {
                submitCheckin();
                WebTracker.TrackTaggedLink('BP: CHECKIN ONLINE BUTTON');
            }
        }
        else {
            submitCheckin();
            WebTracker.TrackTaggedLink('BP: CHECKIN ONLINE BUTTON');
            }
        }
        );

    $(".textInput").unbind("focus").focus(function() {
        if (this.value == this.defaultValue) {
            this.value = '';
        }
    }
    );

    $("#strPassword").unbind("focus").focus(function() {
        changeInputToPasswordType(this);
    }
    );

    $("#onlinecheckin_password").unbind("focus").focus(function() {
        changeInputToPasswordType(this);
    }
    );
}

function submitLegacySearch() {
    var departureDate = Date.toLegacyDate(Date.fromEjDateControl($("#oDate")));
    var returnDate = Date.toLegacyDate(Date.fromEjDateControl($("#rDate")));

    var params = "?origAirportCode=" + $("#acOriginAirportValue").val()
        + "&destAirportCode=" + $("#acDestinationAirportValue").val()
        + "&departureDay=" + departureDate.day
        + "&departureMonthYear=" + departureDate.monthYear
        + "&returnDay=" + returnDate.day
        + "&returnMonthYear=" + returnDate.monthYear
        + "&numberOfAdults=" + $("#numberOfAdults").val()
        + "&numberOfChildren=" + $("#numberOfChildren").val()
        + "&numberOfInfants=" + $("#numberOfInfants").val()
        + "&pid=" + getDocumentDomain()
        + "&flexibleOnDates=" + $('#flexibleOnDates').attr('checked')
        + "&isOneWay=" + $('#isOneWay').attr('checked')
        + "&email=" + '';

    SearchForFlightsUrl = SearchForFlightsUrl + "/SearchForFlights" + params;

    window.location = SearchForFlightsUrl;
}


function submitLogin() {
    if (ej1SignIn()) {
        document.signin.submit();
    }
}

function ShowBusyRecentSearchIcon(_number) {

    if (parseInt($("#recentLink_" + _number).height()) > 15) {
        $("#recentSearchBusy_" + _number).height(parseInt($("#recentLink_" + _number).height() ));
    }
    
    $("#recentLink_" + _number).hide();
    $("#recentSearchBusy_" + _number).show();

    return false;
   
}

function submitCheckin() {
    if (ej1CheckInLogin()) {
        document.onlinecheckin.submit();
    }
}

// copied from ej1 for quick implementation 
function ej1CheckInLogin() {
    var frmLogin = document.onlinecheckin;
    var intErrs = 0;
    var strErrMSG = '';

    var strSurname = frmLogin.strSurname.value;

    while (strSurname.indexOf(' ') != -1) {
        strSurname = strSurname.replace(' ', '');
    }
    if (strSurname == '') {
        intErrs++;
        strErrMSG += '\n- ' + checkInPassengersLastNameErrorMessage;
    }

    var strBookingReference = frmLogin.strBookingReference.value;

    while (strBookingReference.indexOf(' ') != -1) {
        strBookingReference = strBookingReference.replace(' ', '');
    }

    if (strBookingReference == '') {
        intErrs++;
        strErrMSG += '\n- ' + checkInBookingReferenceErrorMessage;
    }

    if (intErrs) {
        strErrMSG = clientSideValidationErrorMessage + strErrMSG;
    }

    if ($("#onlinecheckin_emailaddress").val().indexOf('@') < 0) {
        if (!frmLogin.chkAuthorised.checked) {
            intErrs++;
            strErrMSG += (strErrMSG == '' ? '' : '\n\n');
            strErrMSG += checkInAuthorisationErrorMessage;
        }
    }

    if (intErrs) {
        alert(strErrMSG);
        return false;
    } else {
        return true;
    }
}

// copied from ej1 for quick implementation 
function ej1SignIn() {
    var intErrs = 0;
    var strErrMSG = clientSideValidationErrorMessage;

    var emailVal = document.forms["signin"].strEmail.value;
    if ((emailVal.length < 5) || (emailVal.indexOf('@') < 0)) {
        intErrs++;
        strErrMSG += '\n- ' + invalidEmailErrorMessage;
    }

    var strPWord = document.forms["signin"].strPassword.value;
    while (strPWord.indexOf(' ') != -1) {
        strPWord = strPWord.replace(' ', '');
    }

    if (strPWord == '') {
        intErrs++;
        strErrMSG += '\n- ' + invalidPasswordErrorMessage;
    }

    if (intErrs) {
        alert(strErrMSG);
        return false;
    } else {
        return true;
    }
}

function changeInputToPasswordType(inputElm) {
    var iType = 'password';

    if (!inputElm || !inputElm.parentNode || inputElm.type == 'password')
        return;

    var isMSIE = /*@cc_on!@*/false;

    if (!isMSIE) {
        var newElm = document.createElement('input');
        newElm.type = iType;
    }
    else {
        var newElm = document.createElement('span');
        newElm.innerHTML = '<input type="' + iType + '" name="' + inputElm.name + '">';
        newElm = newElm.firstChild;
    }

    //replicate existing element's properties
    var props = ['name', 'id', 'className', 'size', 'tabIndex', 'accessKey'];
    for (var i = 0, l = props.length; i < l; i++) {
        if (inputElm[props[i]]) newElm[props[i]] = inputElm[props[i]];
    }

    //replace control with new passowrd input
    inputElm.parentNode.replaceChild(newElm, inputElm);

    //give the control focus
    window.tempElm = newElm;
    setTimeout("tempElm.hasFocus=true;tempElm.focus();", 1);
}

function CheckAirportCodes(airportCodeOut, airportCodeRet) {
    if (airportCodeOut == 'EMA' || airportCodeRet == 'EMA') {
        return true;
    }
    else { return false; }
}

function hasValidationMessages() {
    var oDateValidationMessage = $('#oDateCallout');
    var rDateValidationMessage = $('#rDateCallout');

    return (oDateValidationMessage.is(':visible') ||
            rDateValidationMessage.is(':visible'));
}

//Creates two date pickers from two input fields ensuring that rDateField >= to oDateField by incrementing rDateField if necassary when either field changes

/*	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
*/
var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
/// <reference path="../../jquery.vsdoc.1.2.6.js" />
 var blank = new Image();
 blank.src = '/content/images/easyJetImages/blank.gif';

$(document).ready(function() {
    var badBrowser = (/MSIE ((5\.5)|6)/.test(navigator.userAgent) && navigator.platform == "Win32");
    if (badBrowser) {
        // get all pngs on page
        $('img[src$=.png]').each(function() {
        if (!this.complete) {
            this.onload = function() { fixPng(this) };
        } 
        else {
            fixPng(this);
        }
     });
   }
});

function fixPng(png) {
   // get src
   var src = png.src;
   // set width and height
   if (!png.style.width) { png.style.width = $(png).width(); }
   if (!png.style.height) { png.style.height = $(png).height(); }
   // replace by blank image
   png.onload = function() { };
   png.src = blank.src;
   // set filter (display original image)
   png.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='scale')";
 }


/*
News ticker plugin (BBC news style)
Bryan Gullan,2007-2009
version 1.2
updated 2009-02-15
http://www.makemineatriple.com/jquery
Use and distrubute freely with this header

Options (defaults shown):
newsList: "#news" 	// assumes unordered list; specify the ul holding the news items
tickerRate: 80 		// time gap between display of each letter (ms)
startDelay: 100 	// delay before first run of the ticker (ms)
loopDelay: 3000 	// time for which full text of each item is shown at end of print-out (ms)
placeHolder1: " |"	// character placeholder shown on even loops
placeHolder2: "_"	// character placeholder shown on odd loops

Sample usage:
$(document).ready(function() {
	var options = {
  		newsList: "#news",
 		startDelay: 10,
 		placeHolder1: " []"
	}
	$().newsTicker(options);
});

for markup as follows:

<ul id="news">
<li><a href="http://www.makemineatriple.com">MakeMineATriple.com</a></li>
<li><a href="http://www.jquery.com">jQuery</a></li>
</ul>

Underline text decoration on the link is not recommended! :-)

*/

(function($) {
	
	function runTicker(settings) {
		if(settings.firstRun == 1){
			currentLength = settings.currentLength;
			currentItem = settings.currentItem;
			settings.firstRun = 0;
		}
		if(currentItem == settings.newsItemCounter + 1){
			currentItem = 0;
		}
		
		if(currentLength == 0) {
			if(settings.newsLinks[currentItem].length > 0) {
				$(settings.newsList).empty().append('<li><a href="'+ settings.newsLinks[currentItem] +'"></a></li>');
			}
			else {
				$(settings.newsList).empty().append('<li></li>');
			}
		}
		
		if( currentLength % 2 == 0) {
				placeHolder = settings.placeHolder1;
		}
		else {
			placeHolder = settings.placeHolder2;
		}
		
		if( currentLength <= settings.newsItems[currentItem].length + 1) {
			var tickerText = settings.newsItems[currentItem].substring(0,currentLength);
			if(settings.newsLinks[currentItem].length > 0) {
				$(settings.newsList + ' li a').text(tickerText + placeHolder);
			}
			else {
				$(settings.newsList + ' li').text(tickerText + placeHolder);
			}
			currentLength ++;
			setTimeout(function(){runTicker(settings); settings = null;},settings.tickerRate);
		}
		else {
			if(settings.newsLinks[currentItem].length > 0) {
				$(settings.newsList + ' li a').text(settings.newsItems[currentItem]);
			}
			else {
				$(settings.newsList + ' li').text(settings.newsItems[currentItem]);
			}
			currentLength = 0;
			currentItem ++;
			setTimeout(function(){runTicker(settings); settings = null;},settings.loopDelay);	
		}	
	}
	
	$.fn.extend({
		newsTicker: function(settings) {
			settings = jQuery.extend({
		 	  	newsList: "#news",
		   		tickerRate: 80,
		    	startDelay: 100,
		    	loopDelay: 3000,
		    	placeHolder1: " |",
		    	placeHolder2: "_"
			}, settings);
			
			var newsItems = new Array();
			var newsLinks = new Array();
			var newsItemCounter = 0;
			
			$(settings.newsList + ' li').each(function(){
				if($(this).children('a').length) {
					newsItems[newsItemCounter] = $(this).children('a').text();
					newsLinks[newsItemCounter] = $(this).children('a').attr('href');
				}
				else {
					newsItems[newsItemCounter] = $(this).text();
					newsLinks[newsItemCounter] = '';
				}
				newsItemCounter ++;
			});
			
			settings = jQuery.extend(settings,{
				newsItems: newsItems,
				newsLinks: newsLinks,
				newsItemCounter: newsItemCounter - 1,
				currentItem: 0,
				currentLength: 0,
				firstRun:1
			});
			
			setTimeout(function(){runTicker(settings); settings = null;},settings.startDelay);
		}
	
	});
	

})(jQuery);
/// <reference path="../../jquery.vsdoc.1.2.6.js" />

/*fullfat header*/

var OffMenuIdFullFat = "#HeaderRibbonMenuSectionInnerOff_";
var OnMenuIdFullFat = "#HeaderRibbonMenuSectionInnerOn_";
var MenuSectionContainer = "#HeaderMenu_";

function InitialiseFullFatMenu(){
    $(MenuSectionContainer + 1).unbind("hover").hover(function() { OpenFullFatMenu(1); }, function() { CloseFullFatMenu(1); });
    $(MenuSectionContainer + 2).unbind("hover").hover(function() { OpenFullFatMenu(2); }, function() { CloseFullFatMenu(2); });
    $(MenuSectionContainer + 3).unbind("hover").hover(function() { OpenFullFatMenu(3); }, function() { CloseFullFatMenu(3); });
    $(MenuSectionContainer + 4).unbind("hover").hover(function() { OpenFullFatMenu(4); }, function() { CloseFullFatMenu(4); });
    $(MenuSectionContainer + 5).unbind("hover").hover(function() { OpenFullFatMenu(5); }, function() { CloseFullFatMenu(5); });
}

function OpenFullFatMenu(menuid) {
    $(OffMenuIdFullFat + menuid).hide();
    $(OnMenuIdFullFat + menuid).show();
    SetElementHeight($(OnMenuIdFullFat + menuid).children(".menuSectionMiddle"));
    return false;
}

function CloseFullFatMenu(menuid) {
    $(OnMenuIdFullFat + menuid).hide();
    $(OffMenuIdFullFat + menuid).show();
    return false;
}

/*semi skimmed header*/

var OffMenuIdSkimmed = "HeaderRibbonMenuSectionInnerOff_";
var OnMenuIdSkimmed = "HeaderRibbonMenuSectionInnerOn_";

function InitialiseSemiSkimmedHeader() {

    $("#HeaderRibbonMenuSectionInnerOff_1").hover(function() { HighlightMenu(1) }, function() { UnHighlightMenu(1) });
    $("#HeaderRibbonMenuSectionInnerOff_2").hover(function() { HighlightMenu(2) }, function() { UnHighlightMenu(2) });
    $("#HeaderRibbonMenuSectionInnerOff_3").hover(function() { HighlightMenu(3) }, function() { UnHighlightMenu(3) });
    $("#HeaderRibbonMenuSectionInnerOff_4").hover(function() { HighlightMenu(4) }, function() { UnHighlightMenu(4) });
    $("#HeaderRibbonMenuSectionInnerOff_5").hover(function() { HighlightMenu(5) }, function() { UnHighlightMenu(5) });

    $("#HeaderRibbonMenuSectionInnerOff_1").unbind("click").bind("click", function() { OpenSkimmedMenu(1) });
    $("#HeaderRibbonMenuSectionInnerOff_2").unbind("click").bind("click", function() { OpenSkimmedMenu(2) });
    $("#HeaderRibbonMenuSectionInnerOff_3").unbind("click").bind("click", function() { OpenSkimmedMenu(3) });
    $("#HeaderRibbonMenuSectionInnerOff_4").unbind("click").bind("click", function() { OpenSkimmedMenu(4) });
    $("#HeaderRibbonMenuSectionInnerOff_5").unbind("click").bind("click", function() { OpenSkimmedMenu(5) });

    $("#HeaderMenuOff_1").unbind("mouseleave").bind("mouseleave", function() { CloseSkimmedMenu(1) });
    $("#HeaderMenuOff_2").unbind("mouseleave").bind("mouseleave", function() { CloseSkimmedMenu(2) });
    $("#HeaderMenuOff_3").unbind("mouseleave").bind("mouseleave", function() { CloseSkimmedMenu(3) });
    $("#HeaderMenuOff_4").unbind("mouseleave").bind("mouseleave", function() { CloseSkimmedMenu(4) });
    $("#HeaderMenuOff_5").unbind("mouseleave").bind("mouseleave", function() { CloseSkimmedMenu(5) });
}


function SwapImages(menuid) {

    var currentImgArrow = $("#ImageArrow_" + menuid).attr('src');
    $("#ImageArrow_" + menuid).attr('src', $("#ImageArrow_" + menuid).attr('hoverimage'));
    $("#ImageArrow_" + menuid).attr('hoverimage', currentImgArrow);

    var currentImgSection = $("#ImageSection_" + menuid).attr('src');
    $("#ImageSection_" + menuid).attr('src', $("#ImageSection_" + menuid).attr('hoverimage'));
    $("#ImageSection_" + menuid).attr('hoverimage', currentImgSection);
}

function HighlightMenu(menuid) {
    $("#TitleText_" + menuid).css("color", "White");
    SwapImages(menuid);
}

function UnHighlightMenu(menuid) {
    $("#TitleText_" + menuid).css("color", "rgb(255, 210, 190)");
    SwapImages(menuid);
}

function OpenSkimmedMenu(menuid) {
    $("#" + OnMenuIdSkimmed + menuid).show();
    SetElementHeight($("#" + OnMenuIdSkimmed + menuid).children(".menuSectionMiddle"));
    for (i = 1; i < 6; i++) {
        if (i != menuid) {
            CloseSkimmedMenu(i);
        }
    }
    return false;
}

function CloseSkimmedMenu(menuid) {
    if ($("#" + OnMenuIdSkimmed + menuid).css("display") != "none") {
        $("#" + OnMenuIdSkimmed + menuid).hide();
    }
    return false;
}

function SetElementHeight(element) {
    //need to set css height otherwise absolute positioned element has abnormal behaviour in IE
    element.css("height", element.height() + "px");
}
/// <reference path="../../jquery.vsdoc.1.2.6.js" />

var giveDestinationAirportInputFocus = false;
var destinationDropDownId;

function CheckUrls() {
    if (typeof ShowDestinationAirportsURL == 'undefined')
        alert("ShowDestinationAirportsURL is not specified");
}
 

function ReloadDestinationAirports(originAirportCode, controlId, selectChangedFunction, successCallbackFunction) {
    destinationDropDownId = controlId;
    $("#" + destinationDropDownId).unaclite();
    $("#" + destinationDropDownId).attr('disabled', true);

    var url = ShowDestinationAirportsURL.replace('P_ORIGIN_AIRPORT', originAirportCode).replace('P_CONTROL_ID', destinationDropDownId);
    var builder = new AjaxDataBuilder(false);
    var successCallback = function(html) {
        $("#" + destinationDropDownId + "_Container").html(html);
        $("#" + destinationDropDownId).unbind("selectChanged").bind("selectChanged", selectChangedFunction);
        
        if (giveDestinationAirportInputFocus) {
            $("#" + destinationDropDownId).focus();
        }
        if (successCallbackFunction != null && typeof (successCallbackFunction) != 'undefined') {
            successCallbackFunction();
        }
    };

    var errorCallback = function(XMLHttpRequest, textStatus, errorThrown) {
        alert("Error loading destination airports");
    };

    var command = new AjaxPostCommand(url, builder, successCallback, errorCallback);
    CommandInvoker.getInstance().QueueCommand(command);
}
///
/// Called on load. Binds the NotNamed label to DoNotNamed() 
///
function WelcomeBackOnLoad() {
    $("#NotNamed").unbind("click").bind("click", function() { DoNotNamed(); });
}

///
/// Uses an ajax command to run the NotNamed method on the WelcomeBackController.
///
function DoNotNamed() {

    var timeoutInMilliseconds = 5000;
    var builder = new AjaxDataBuilder(false);

    var successCallBack = function(html) {
        UpdateWelcomeBack(html);
    }

    var errorCallBack = function(html) {
    }

    var command = new AjaxGetCommand(notNamedUrl, builder, successCallBack, errorCallBack, timeoutInMilliseconds)

    CommandInvoker.getInstance().QueueCommand(command);
}

///
/// Updates the WelcomeBack panel with the result from NotNamed method.
///
function UpdateWelcomeBack(html) {
    $("#WelcomeBackPanelInclude").html(html);
}

/**
* jCache - A client cache plugin for jQuery
* Should come in handy when data needs to be cached in client to improve performance.
* Author: 	Phan Van An 
*			phoenixheart@gmail.com
*			http://www.skidvn.com
* License : Read jQuery's license

Usage:
1. 	Include this plugin into your web document after jQuery:
<script type="text/javascript" src="js/jquery.jcache.js"></script>
2.	[OPTIONAL] Set the max cached item number, for example 20
$.jCache.maxSize = 20; 
3. 	Start playing around with it:
- Put an item into cache: $.jCache.setItem(theKey, the Value);
- Retrieve an item from cache: var theValue = $.jCache.getItem(theKey);
- ...
*/
(function(jQuery) {
    this.version = '(beta)(0.0.1)';

    /**
    * The maximum items this cache should hold. 
    * If the cache is going to be overload, oldest item will be deleted (FIFO).
    * Since the cached object is retained inside browser's state, 
    * a too big value on a too big web apps may affect system memory.
    * Default is 10.
    */
    this.maxSize = 10;

    /**
    * An array to keep track of the cache keys
    */
    this.keys = new Array();

    /**
    * Number of currently cached items
    */
    this.cache_length = 0;

    /**
    * An associated array to contain the cached items
    */
    this.items = new Array();

    /*
    * @desc	Puts an item into the cache
    *
    * @param	string Key of the item
    * @param 	string Value of the item
    * @return	string Value of the item
    */
    this.setItem = function(pKey, pValue) {

        if (typeof (pValue) != 'undefined') {

            if (typeof (this.items[pKey]) == 'undefined') {

                this.cache_length++;
            }

            this.keys.push(pKey);
            this.items[pKey] = pValue;

            if (this.cache_length > this.maxSize) {

                this.removeOldestItem();
            }
        }

        return pValue;
    }

    /*
    * @desc	Removes an item from the cache using its key
    * @param 	string Key of the item
    */
    this.removeItem = function(pKey) {
        var tmp;
        if (typeof (this.items[pKey]) != 'undefined') {
            this.cache_length--;
            var tmp = this.items[pKey];
            delete this.items[pKey];
        }

        return tmp;
    }

    /*
    * @desc 	Retrieves an item from the cache by its key
    *
    * @param 	string Key of the item
    * @return	string Value of the item
    */
    this.getItem = function(pKey) {
        //alert(this.items[pKey]);
        return this.items[pKey];
    }

    /*
    * @desc	Indicates if the cache has an item specified by its key
    * @param 	string Key of the item
    * @return 	boolean TRUE or FALSE
    */
    this.hasItem = function(pKey) {
        return typeof (this.items[pKey]) != 'undefined';
    }

    /**
    * @desc	Removes the oldest cached item from the cache
    */
    this.removeOldestItem = function() {
        this.removeItem(this.keys.shift());
    }

    /**
    * @desc	Clears the cache
    * @return	Number of items cleared
    */
    this.clear = function() {
        var tmp = this.cache_length;
        this.keys = new Array();
        this.cache_length = 0;
        this.items = new Array();
        return tmp;
    }

    jQuery.jCache = this;
    return jQuery;
})(jQuery);
/*
	Masked Input plugin for jQuery
	Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
	Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
	Version: 1.2.2 (03/09/2009 22:39:06)
*/
(function(a){var c=(a.browser.msie?"paste":"input")+".mask";var b=(window.orientation!=undefined);a.mask={definitions:{"9":"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"}};a.fn.extend({caret:function(e,f){if(this.length==0){return}if(typeof e=="number"){f=(typeof f=="number")?f:e;return this.each(function(){if(this.setSelectionRange){this.focus();this.setSelectionRange(e,f)}else{if(this.createTextRange){var g=this.createTextRange();g.collapse(true);g.moveEnd("character",f);g.moveStart("character",e);g.select()}}})}else{if(this[0].setSelectionRange){e=this[0].selectionStart;f=this[0].selectionEnd}else{if(document.selection&&document.selection.createRange){var d=document.selection.createRange();e=0-d.duplicate().moveStart("character",-100000);f=e+d.text.length}}return{begin:e,end:f}}},unmask:function(){return this.trigger("unmask")},mask:function(j,d){if(!j&&this.length>0){var f=a(this[0]);var g=f.data("tests");return a.map(f.data("buffer"),function(l,m){return g[m]?l:null}).join("")}d=a.extend({placeholder:"_",completed:null},d);var k=a.mask.definitions;var g=[];var e=j.length;var i=null;var h=j.length;a.each(j.split(""),function(m,l){if(l=="?"){h--;e=m}else{if(k[l]){g.push(new RegExp(k[l]));if(i==null){i=g.length-1}}else{g.push(null)}}});return this.each(function(){var r=a(this);var m=a.map(j.split(""),function(x,y){if(x!="?"){return k[x]?d.placeholder:x}});var n=false;var q=r.val();r.data("buffer",m).data("tests",g);function v(x){while(++x<=h&&!g[x]){}return x}function t(x){while(!g[x]&&--x>=0){}for(var y=x;y<h;y++){if(g[y]){m[y]=d.placeholder;var z=v(y);if(z<h&&g[y].test(m[z])){m[y]=m[z]}else{break}}}s();r.caret(Math.max(i,x))}function u(y){for(var A=y,z=d.placeholder;A<h;A++){if(g[A]){var B=v(A);var x=m[A];m[A]=z;if(B<h&&g[B].test(x)){z=x}else{break}}}}function l(y){var x=a(this).caret();var z=y.keyCode;n=(z<16||(z>16&&z<32)||(z>32&&z<41));if((x.begin-x.end)!=0&&(!n||z==8||z==46)){w(x.begin,x.end)}if(z==8||z==46||(b&&z==127)){t(x.begin+(z==46?0:-1));return false}else{if(z==27){r.val(q);r.caret(0,p());return false}}}function o(B){if(n){n=false;return(B.keyCode==8)?false:null}B=B||window.event;var C=B.charCode||B.keyCode||B.which;var z=a(this).caret();if(B.ctrlKey||B.altKey||B.metaKey){return true}else{if((C>=32&&C<=125)||C>186){var x=v(z.begin-1);if(x<h){var A=String.fromCharCode(C);if(g[x].test(A)){u(x);m[x]=A;s();var y=v(x);a(this).caret(y);if(d.completed&&y==h){d.completed.call(r)}}}}}return false}function w(x,y){for(var z=x;z<y&&z<h;z++){if(g[z]){m[z]=d.placeholder}}}function s(){return r.val(m.join("")).val()}function p(y){var z=r.val();var C=-1;for(var B=0,x=0;B<h;B++){if(g[B]){m[B]=d.placeholder;while(x++<z.length){var A=z.charAt(x-1);if(g[B].test(A)){m[B]=A;C=B;break}}if(x>z.length){break}}else{if(m[B]==z[x]&&B!=e){x++;C=B}}}if(!y&&C+1<e){r.val("");w(0,h)}else{if(y||C+1>=e){s();if(!y){r.val(r.val().substring(0,C+1))}}}return(e?B:i)}if(!r.attr("readonly")){r.one("unmask",function(){r.unbind(".mask").removeData("buffer").removeData("tests")}).bind("focus.mask",function(){q=r.val();var x=p();s();setTimeout(function(){if(x==j.length){r.caret(0,x)}else{r.caret(x)}},0)}).bind("blur.mask",function(){p();if(r.val()!=q){r.change()}}).bind("keydown.mask",l).bind("keypress.mask",o).bind(c,function(){setTimeout(function(){r.caret(p(true))},0)})}p()})}})})(jQuery);
/// <reference path="../../Scripts/jquery-1.3.2-vsdoc2.js" />

(function($)
{
	$.fn.tabGroup = function(options)
	{
		var groupElements = new Array();
		var lastTabActionDelay = 150;
		var previousMillis = null;

		this.each(function()
		{
			groupElements.push($('' + this));
		});

		groupElements = $(groupElements);

		function checkIfDelayHasPassed()
		{
			var curr_msec = new Date().getTime();
			if (previousMillis == null || (curr_msec - previousMillis) > lastTabActionDelay)
			{
				previousMillis = curr_msec;
				return true;
			}
			return false;
		}

		//Capture tab, reverse tab key events
		groupElements.each(function(index, field)
		{
			var selectNextElement = function()
			{
				selectGroupElement(index + 1, false);
			}
			var selectPreviousElement = function()
			{
				selectGroupElement(index - 1, true);
			}

			//Opera does not support cancelling keydown events
			//And this code does not work in Firefox & co with a keypress event
			//So have to have both for now
			//Todo: Find a generic solution that is feature-based, not browser-based. SMF

			if (/Opera/.test(navigator.userAgent))
			{
				this.bind('keypress', 'tab', function(e)
				{
					if (typeof (e.preventDefault) == 'function')
					{
						e.preventDefault();
					}
					else
					{
						e.returnValue = false;
					}

					if (checkIfDelayHasPassed())
					{
						$(this).trigger("tabOut");
						selectNextElement();
					}

					return false;
				});
			}
			else
			{
				this.bind('keydown', 'tab', function(e)
				{
					if (typeof (e.preventDefault) == 'function')
					{
						e.preventDefault();
					}
					else
					{
						e.returnValue = false;
					}

					if (checkIfDelayHasPassed())
					{
						$(this).trigger("tabOut");
						selectNextElement();
					}

					return false;
				});
			}

			if (/Opera/.test(navigator.userAgent))
			{
				this.bind('keypress', 'shift+tab', function(e)
				{
					if (typeof (e.preventDefault) == 'function')
					{
						e.preventDefault();
					}
					else
					{
						e.returnValue = false;
					}

					if (checkIfDelayHasPassed())
					{
						$(this).trigger("reverseTabOut");
						selectPreviousElement();
					}

					return false;
				});
			}
			else
			{
				this.bind('keydown', 'shift+tab', function(e)
				{
					if (typeof (e.preventDefault) == 'function')
					{
						e.preventDefault();
					}
					else
					{
						e.returnValue = false;
					}

					if (checkIfDelayHasPassed())
					{
						$(this).trigger("reverseTabOut");
						selectPreviousElement();
					}

					return false;
				});
			}
		});

		//Element selection functions
		function selectGroupElement(index, reverse)
		{
			var element = getGroupElement(index, reverse);
			if (element != null)
			{
				element.focus();
				element.trigger("tabIn");
			}
		}
		function getGroupElement(index, reverse)
		{
			if (index < 0 || index >= groupElements.length)
			{
				return null;
			}
			var elementToSelect = groupElements[index];
			if (elementToSelect.is(':disabled'))
			{
				if (reverse)
				{
					return getGroupElement(index - 1);
				} else
				{
					return getGroupElement(index + 1);
				}
			}
			return groupElements[index];
		}
	}
})(jQuery);
(function(jQuery){jQuery.fn.__bind__=jQuery.fn.bind;jQuery.fn.__unbind__=jQuery.fn.unbind;jQuery.fn.__find__=jQuery.fn.find;var hotkeys={version:'0.7.9',override:/keypress|keydown|keyup/g,triggersMap:{},specialKeys:{27:'esc',9:'tab',32:'space',13:'return',8:'backspace',145:'scroll',20:'capslock',144:'numlock',19:'pause',45:'insert',36:'home',46:'del',35:'end',33:'pageup',34:'pagedown',37:'left',38:'up',39:'right',40:'down',109:'-',112:'f1',113:'f2',114:'f3',115:'f4',116:'f5',117:'f6',118:'f7',119:'f8',120:'f9',121:'f10',122:'f11',123:'f12',191:'/'},shiftNums:{"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+",";":":","'":"\"",",":"<",".":">","/":"?","\\":"|"},newTrigger:function(type,combi,callback){var result={};result[type]={};result[type][combi]={cb:callback,disableInInput:false};return result;}};hotkeys.specialKeys=jQuery.extend(hotkeys.specialKeys,{96:'0',97:'1',98:'2',99:'3',100:'4',101:'5',102:'6',103:'7',104:'8',105:'9',106:'*',107:'+',109:'-',110:'.',111:'/'});jQuery.fn.find=function(selector){this.query=selector;return jQuery.fn.__find__.apply(this,arguments);};jQuery.fn.unbind=function(type,combi,fn){if(jQuery.isFunction(combi)){fn=combi;combi=null;}
if(combi&&typeof combi==='string'){var selectorId=((this.prevObject&&this.prevObject.query)||(this[0].id&&this[0].id)||this[0]).toString();var hkTypes=type.split(' ');for(var x=0;x<hkTypes.length;x++){delete hotkeys.triggersMap[selectorId][hkTypes[x]][combi];}}
return this.__unbind__(type,fn);};jQuery.fn.bind=function(type,data,fn){var handle=type.match(hotkeys.override);if(jQuery.isFunction(data)||!handle){return this.__bind__(type,data,fn);}
else{var result=null,pass2jq=jQuery.trim(type.replace(hotkeys.override,''));if(pass2jq){result=this.__bind__(pass2jq,data,fn);}
if(typeof data==="string"){data={'combi':data};}
if(data.combi){for(var x=0;x<handle.length;x++){var eventType=handle[x];var combi=data.combi.toLowerCase(),trigger=hotkeys.newTrigger(eventType,combi,fn),selectorId=((this.prevObject&&this.prevObject.query)||(this[0].id&&this[0].id)||this[0]).toString();trigger[eventType][combi].disableInInput=data.disableInInput;if(!hotkeys.triggersMap[selectorId]){hotkeys.triggersMap[selectorId]=trigger;}
else if(!hotkeys.triggersMap[selectorId][eventType]){hotkeys.triggersMap[selectorId][eventType]=trigger[eventType];}
var mapPoint=hotkeys.triggersMap[selectorId][eventType][combi];if(!mapPoint){hotkeys.triggersMap[selectorId][eventType][combi]=[trigger[eventType][combi]];}
else if(mapPoint.constructor!==Array){hotkeys.triggersMap[selectorId][eventType][combi]=[mapPoint];}
else{hotkeys.triggersMap[selectorId][eventType][combi][mapPoint.length]=trigger[eventType][combi];}
this.each(function(){var jqElem=jQuery(this);if(jqElem.attr('hkId')&&jqElem.attr('hkId')!==selectorId){selectorId=jqElem.attr('hkId')+";"+selectorId;}
jqElem.attr('hkId',selectorId);});result=this.__bind__(handle.join(' '),data,hotkeys.handler)}}
return result;}};hotkeys.findElement=function(elem){if(!jQuery(elem).attr('hkId')){if(jQuery.browser.opera||jQuery.browser.safari){while(!jQuery(elem).attr('hkId')&&elem.parentNode){elem=elem.parentNode;}}}
return elem;};hotkeys.handler=function(event){var target=hotkeys.findElement(event.currentTarget),jTarget=jQuery(target),ids=jTarget.attr('hkId');if(ids){ids=ids.split(';');var code=event.which,type=event.type,special=hotkeys.specialKeys[code],character=!special&&String.fromCharCode(code).toLowerCase(),shift=event.shiftKey,ctrl=event.ctrlKey,alt=event.altKey||event.originalEvent.altKey,mapPoint=null;for(var x=0;x<ids.length;x++){if(hotkeys.triggersMap[ids[x]][type]){mapPoint=hotkeys.triggersMap[ids[x]][type];break;}}
if(mapPoint){var trigger;if(!shift&&!ctrl&&!alt){trigger=mapPoint[special]||(character&&mapPoint[character]);}
else{var modif='';if(alt)modif+='alt+';if(ctrl)modif+='ctrl+';if(shift)modif+='shift+';trigger=mapPoint[modif+special];if(!trigger){if(character){trigger=mapPoint[modif+character]||mapPoint[modif+hotkeys.shiftNums[character]]||(modif==='shift+'&&mapPoint[hotkeys.shiftNums[character]]);}}}
if(trigger){var result=false;for(var x=0;x<trigger.length;x++){if(trigger[x].disableInInput){var elem=jQuery(event.target);if(jTarget.is("input")||jTarget.is("textarea")||jTarget.is("select")||elem.is("input")||elem.is("textarea")||elem.is("select")){return true;}}
result=result||trigger[x].cb.apply(this,[event]);}
return result;}}}};window.hotkeys=hotkeys;return jQuery;})(jQuery);
