/*
 * 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")}})})();;
(function(){
  var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;

  // The base Class implementation (does nothing)
  this.Class = function(){};
 
  // Create a new Class that inherits from this class
  Class.extend = function(prop) {
    var _super = this.prototype;
   
    // Instantiate a base class (but only create the instance,
    // do not run the init constructor)
    initializing = true;
    var prototype = new this();
    initializing = false;
   
    // Copy the properties over onto the new prototype
    for (var name in prop) {
      // Check if we are overwriting an existing function
      prototype[name] = typeof prop[name] == "function" &&
        typeof _super[name] == "function" && fnTest.test(prop[name]) ?
        (function(name, fn){
          return function() {
            var tmp = this._super;
           
            // Add a new ._super() method that is the same method
            // but on the super-class
            this._super = _super[name];
           
            // The method only need to be bound temporarily, so we
            // remove it when we are done executing
            var ret = fn.apply(this, arguments);       
            this._super = tmp;
           
            return ret;
          };
        })(name, prop[name]) :
        prop[name];
    }
   
    // The dummy class constructor
    function Class() {
      // All construction is actually done in the init method
      if ( !initializing && this.init )
        this.init.apply(this, arguments);
    }
   
    // Populate our constructed prototype object
    Class.prototype = prototype;
   
    // Enforce the constructor to be what we expect
    Class.constructor = Class;

    // And make this class extendable
    Class.extend = arguments.callee;
   
    return Class;
  };
})();
;
/*** $Id$ ***/
function json(){}
function json_init()
{
  var m = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' };
  var s = new Object();

  s['boolean'] = function (x) { return String(x); };
  s['null'   ] = function (x) { return "null";    };
  s['number' ] = function (x) { return isFinite(x) ? String(x) : 'null'; };
  s['array'  ] = function (x)
  {
    var a = ['['], b, f, i, l = x.length, v;
    for (i = 0; i < l; i += 1) {
      v = x[i];
      f = s[typeof v];
      if (f) {
        v = f(v);
        if (typeof v == 'string') {
         if (b) {
            a[a.length] = ',';
          }
          a[a.length] = v;
          b = true;
        }
      }
    }
    a[a.length] = ']';
    return a.join('');
  };

  s['object'] = function (x) {
    if (x) {
      if (x instanceof Array) return s.array(x);
      var a = ['{'], b, f, i, v;
      for (i in x) {
        v = x[i];
        f = s[typeof v];
        if (f) {
          v = f(v);
          if (typeof v == 'string') {
            if (b) a[a.length] = ',';
            a.push(s.string(i), ':', v);
            b = true;
          }
        }
      }
      a[a.length] = '}';
      return a.join('');
    }
    return 'null';
  };

  s['string'] = function (x) {
    if (/[\"\\\x00-\x1f]/.test(x)) {
      x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
        var c = m[b];
        if (c) return c;
        c = b.charCodeAt();
        return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
      });
    }
    return '"' + x + '"';
  };

  json.serialize = function (obj)
  {
    obj = obj || false;
    return s[ typeof(obj) ](obj);
  };

  json.deserialize = json.unserialize = function (str)
  {
    try
    {
      return (/^(\"(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(str)) && eval('(' + str + ')');
    }
    catch (e)
    {
      return false;
    }
  };
}

json_init();
;
/**
 * Cookie plugin
 *
 * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */

/**
 * Create a cookie with the given name and value and other optional parameters.
 *
 * @example $.cookie('the_cookie', 'the_value');
 * @desc Set the value of a cookie.
 * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
 * @desc Create a cookie with all available options.
 * @example $.cookie('the_cookie', 'the_value');
 * @desc Create a session cookie.
 * @example $.cookie('the_cookie', null);
 * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
 *       used when the cookie was set.
 *
 * @param String name The name of the cookie.
 * @param String value The value of the cookie.
 * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
 * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
 *                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
 *                             If set to null or omitted, the cookie will be a session cookie and will not be retained
 *                             when the the browser exits.
 * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
 * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
 * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
 *                        require a secure protocol (like HTTPS).
 * @type undefined
 *
 * @name $.cookie
 * @cat Plugins/Cookie
 * @author Klaus Hartl/klaus.hartl@stilbuero.de
 */

/**
 * Get the value of a cookie with the given name.
 *
 * @example $.cookie('the_cookie');
 * @desc Get the value of a cookie.
 *
 * @param String name The name of the cookie.
 * @return The value of the cookie.
 * @type String
 *
 * @name $.cookie
 * @cat Plugins/Cookie
 * @author Klaus Hartl/klaus.hartl@stilbuero.de
 */
jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options = $.extend({}, options); // clone object since it's unexpected behavior if the expired property were changed
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        // NOTE Needed to parenthesize options.path and options.domain
        // in the following expressions, otherwise they evaluate to undefined
        // in the packed version for some reason...
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};;
jQuery.fn.extend(
{
	/**
	 * Wrapper over bind that enables you to connect events to objects, not just callbacks
	 *
	 * @param type {String} Event type (click,focus,etc)
	 * @param obj {Object} The object you want to bind the event to
	 * @param method {String|Function} Either a string method name or function reference to call on obj
	 * @param args {Array} Optional arguments to pass to the callback (instead of the default ones)
	 */
	connect: function( type, obj, method, args )
	{
		return this.each( function()
		{
			var f = function()
			{
				var a = args || [this].concat(jQuery.makeArray(arguments));
				var r = (typeof method == 'string' ? obj[method].apply(obj, a ) : method.apply(obj, a ));
				return typeof r == 'boolean' ? r : false;
			};

			var ccache = jQuery.data(this,'connect:'+type) || [];
			ccache.push([obj,method,f]);
			jQuery.data(this,'connect:'+type,ccache);
			$(this).bind(type,f);
		});
	},

	/**
	 * Disconnect your connected events from the target object
	 *
	 * @param type {String} Event type (click,focus,etc)
	 * @param obj {Object} The object you want to disconnect the event from
	 * @param method {String|Function} Either a string method name or function that you used in your connect
	 */
	disconnect: function( type, obj, method )
	{
		return this.each(function()
		{
			var ccache = jQuery.data(this,'connect:'+type) || [];
			var hdlrs  = [];
			var ncache = [];
			var elmt   = this;

			jQuery.each(ccache, function(i,rec)
			{
				if (rec[0]==obj && rec[1]==method)
				{
					hdlrs.push(rec[2]);
				}
				else
				{
					ncache.push(rec);
				}
			});

			jQuery.each(hdlrs, function(i,hdlr)
			{
				$(elmt).unbind(type,hdlr);
			});

			jQuery.data(this,'connect:'+type,ncache.length ? ncache : false);

		});
	},

	/**
	 * Wrapper over live that enables you to connect events to objects, not just callbacks
	 *
	 * @param type {String} Event type (click,focus,etc)
	 * @param obj {Object} The object you want to bind the event to
	 * @param method {String|Function} Either a string method name or function reference to call on obj
	 * @param args {Array} Optional arguments to pass to the callback (instead of the default ones)
	 */
	liveConnect: function( type, obj, method, args )
	{
		var f = function()
		{
			var a = args || [this].concat(jQuery.makeArray(arguments)); 
			var r = (typeof method == 'string' ? obj[method].apply(obj, a ) : method.apply(obj, a ));
			return typeof r == 'boolean' ? r : false; 
		};

		var cacheid = 'liveconnect:'+type+':'+this.selector;
		var ccache  = jQuery.data(window,cacheid) || [];
		ccache.push([obj,method,f]);
		jQuery.data(window,cacheid,ccache);
		$(this.selector).live(type, f);
		return this;
	},

	/**
	 * Disconnect your live connected events from the target object
	 *
	 * @param type {String} Event type (click,focus,etc)
	 * @param obj {Object} The object you want to disconnect the event from
	 * @param method {String|Function} Either a string method name or function that you used in your connect
	 */
	liveDisconnect: function ( type, obj, method )
	{
		var cacheid= 'liveconnect:'+type+':'+this.selector;
		var ccache = jQuery.data(window,cacheid) || [];
		var hdlrs  = [];
		var ncache = [];
		var elmt   = this;

		jQuery.each(ccache, function(i,rec) 
		{ 
			if (rec[0]==obj && rec[1]==method)
			{
				hdlrs.push(rec[2]);
			}
			else
			{
				//Dont kill it, add it back to the cache for later
				ncache.push(rec);
			}
		});

		jQuery.each( hdlrs, function(i,hdlr) 
		{ 
			$(elmt).die(type,hdlr); 
		});

		jQuery.data(window,cacheid, ncache.length ? ncache : false);
		return this;
	},

	/**
	 * Test whether x and y are on this jquery element
	 *
	 * @param x {Number} The x position
	 * @param y {Number} The y position
	 * @return {Boolean} True if it hits, false if it doesn't
	 */
	hitTest: function (x,y)
	{
		var o  = this.getPosition();
		var ox = o.left;
		var oy = o.top;
		var w  = this[0].offsetWidth;
		var h  = this[0].offsetHeight;
		var ex = ox+w;
		var ey = oy+h;

		return ( x >= ox && y >= oy && x <= ex && y <= ey ) ? true : false;
	},

	/**
	 * Get the left and top positions for this element, essentially the x,y coordinates
	 *
	 * @return {Object} Left and Top coordinates
	 */
	getPosition: function ()
	{
		return this.eq(0).position();
	},

	/**
	 * Replace this dom element with html content
	 *
	 * @param value {String} The content you want to replace this dom element with
	 */
	replaceWith: function( value )
	{
		return this.each( function ()
		{
				var e = $(this);
				var p = e.parent();
				var s = e.prev();
				e.remove();

				if (s[0])
				{
					s.after(value);
				}
				else
				{
					p.prepend(value);
				}
		});
	},

	/**
	 * Search for html elements inside this selector and make image tags with png's transparent using IE filter hack
	 */
	fixPngImage: function()
	{
		if (!$.browser.msie || parseInt($.browser.version) >= 7.0 )
		{
			return this;
		}

		this.filter('[src$=png]').each( function ()
		{
			var i = $(this);
			i.after( '<div style="display:block; width: '+i.width()+'px; height: '+ i.height() +'px; padding: 0px; margin: 0px; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + i.attr('src') + '\', sizingMethod=\'image\');" ></div>').hide();
		});

		return this;
	},

	/**
	 * Search for html elements inside this selector and fix background png's using IE filter hack
	 */
	fixPngBackground: function()
	{
		if (!$.browser.msie || parseInt($.browser.version) >= 7.0 )
		{
			return this;
		}

		return this.each( function()
		{
			this.style.backgroundImage = '';
			var m = this.currentStyle.backgroundImage.match(/^url\("([^"]+)"\)/);

			if (!m || !m[1])
			{
				return;
			}

			var sz = this.currentStyle.backgroundRepeat == 'no-repeat' ? 'crop' : 'scale';
			this.style.backgroundImage = 'none';
			this.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+m[1]+'", sizingMethod="'+sz+'")';
		});
	},

	/**
	 * Fixes the png background images on hover for IE6.  Will add a "hover" class to the element on mouseover.
	 * @return {Object} returns itself so it can be chainable
	 */
	fixHoverPngBackground: function()
	{
		if ($.browser.msie && $.browser.version < 7)
		{
			var fn = function()
			{
				this.style.backgroundImage = "";
				$(this).toggleClass("hover").fixPngBackground();
			};

			return this.each(function()
			{
				$(this).mouseover(fn).mouseout(fn).fixPngBackground();
			});
		}
		return this;
	},

	/**
	 * Sits idle before returning control.  Works well in chain.
	 */
	idle: function(time, callback)
	{
		return this.animate({delay: 1}, time, callback);
	},

	/**
	 * Displays a comment in place of its parent.
	 * This replaces the parent container.  For example: <span class="parent"><!-- <img /> --></span> becomes <img />
	 * There should not be any space between around the comment.
	 * Bad:
	 *    <span class="comment">
	 *       <!-- <img /> -->
	 *    </span>
	 * Good:
	 *    <span class="comment"><!-- <img /> --></span>
	 * @return {Object} returns itself
	 */
	showComment: function()
	{
		return this.each(function()
		{
			var child = this.firstChild;
			if (child.nodeType === 8) // 8 is a comment node
			{
				this.innerHTML = ''; // Fixes IE sometimes breaking with replaceWith() call
				$(this).replaceWith(child.nodeValue);
			}
		});
	}
});

jQuery.extend({
	/**
	 * Dynamically loads a stylesheet
	 * @param {String} url
	 */
	getStyle: function(url)
	{
		if (url && typeof jQuery._syn.loaded_ui[url] == "undefined")
		{
			jQuery._syn.loaded_ui[url] = true;
			var ts = (new Date()).getTime();
			url += ((url.match(/\?/)) ? '&' : '?')+'_='+ts;
			$("head").eq(0).append('<link href="'+url+'" rel="stylesheet" type="text/css" />');
		}
	},

	/**
	 * Dynamically loads an array of stylesheets optionally prepending a prefix
	 * @param {Array} urls
	 * @param {String} prefix
	 */
	getStyles: function(urls, prefix)
	{
		urls_array = $.makeArray(urls);
		$.each(urls_array, function(i, url)
		{
			$.getStyle(prefix+url);
		});
	},

	/**
	 * Dynamically removes a stylesheet
	 * @param {String} url
	 */
	removeStyle: function(url)
	{
		if (url)
		{
			var ts_url = $("head").find("link[href^="+url+"?_]").attr('href');
			$("head").find("link[href="+ts_url+"]").remove();
			if (url && typeof jQuery._syn.loaded_ui[url] != "undefined")
			{
				jQuery._syn.loaded_ui[url] = null;
				delete jQuery._syn.loaded_ui[url];
			}
		}
	},

	/**
	 * Dynamically removes an array of stylesheets optionally prepending a prefix
	 * @param {Array} urls
	 * @param {String} prefix
	 */
	removeStyles: function(urls, prefix)
	{
		urls_array = $.makeArray(urls);
		$.each(urls_array, function(i, url)
		{
			$.removeStyle(prefix+url);
		});
	},

	/**
	 * Dynamically loads a number of scripts, optionally calling the callback once all scripts have been loaded (or failed)
	 * @param {Array} urls
	 * @param {Function} callback
	 * @param {String} prefix
	 */
	getScripts: function(urls, callback, prefix)
	{
		if (urls.length == 0)
		{
			callback();
			return;
		}

		var prefix = (prefix) ? prefix : "";
		urls = $.makeArray(urls);

		if (jQuery._syn.loaded_ui[prefix+urls[0]])
		{
			$.getScripts(urls.slice(1), callback, prefix);
		}
		else
		{
			$.getScript(prefix+urls[0], function()
			{
				jQuery._syn.loaded_ui[prefix+urls[0]] = true;
				$.getScripts(urls.slice(1), callback, prefix);
			});
		}
	}
});

(function(){

	var ajax_original = jQuery.ajax;

	jQuery.extend({

		ajax: function(options)
		{
			if (!options.jsCache)
			{
				ajax_original(options);
				return;
			}
		
			var param_key = (typeof(options.data) == 'string') ? options.data : json.serialize(options.data || {});
			var cacheid = options.url + '|' + param_key;
			var cache   = jQuery.data(window, cacheid);
			var success_orig = options.success;

			if ( cache )
			{
				success_orig.apply(options,cache);
				return;
			}

			options.success = function(req,status)
			{
				jQuery.data( window, cacheid, [req,status] );
				this.success = success_orig;
				success_orig.call(this,req,status);
			}

			ajax_original(options);
		}

	});

})();


jQuery._syn = {
	loaded_ui: []
};
;
/**
 * The ajax webservices communication class.
 * @constructor
 */
Syn.Comm = Class.extend(
{

	/**
	 * Initialize the portal webservices class. This is called automatically by the default constructor.
	 * @member Syn.Comm
	 * @param url {String} Location of portal webservices 
	 */
	init: function (url)
	{
		this.url = url;
		this.requests = {};
		this.nextRequestId = 0;
	},

	/**
	 * Call a webservice on the server 
	 * @member Syn.Comm
	 * @param classname {String} The class on the server you wish to call
	 * @param method {String} The method you wish to call on classname
	 * @param data {Mixed} Any data structure you want to serialize and pass to the server
	 * @param cb1 {Function|Object} Can be either a function or an object. If a function is passed, this will be called with the result. If an object is passed, the object will be the target 'this' of the cb2 method.
	 * @param cb2 {String|Function} The method to call on cb1 if an object was passed. Can be a string method name or a function reference.
	 */
	call: function (classname,method,data,cb1,cb2)
	{
		var callBackObj = {};
		
		if (typeof cb1 == 'function' )
		{
			callBackObj.callback = cb1;
			callBackObj.cb_obj   = false;
		}

		else if ( typeof cb1 == 'object' )
		{
			callBackObj.cb_obj = cb1;
			callBackObj.callback = cb2;
		}

		var robj = {
			'class'  : classname,
			'method' : method,
			'data'   : data
		};

		if (cb1)
		{
			this.requests[this.nextRequestId] = $.ajax({
				type: "POST",
				url: this.url,
				data: json.serialize(robj),
				contentType: 'application/json',
				success: this.onSuccessFunc(callBackObj, this.nextRequestId)
			});
			this.nextRequestId++;
		}
		else
		{
			return json.deserialize($.ajax({
				type: "POST",
				async: false,
				url: this.url,
				data: robj,
				contentType: 'application/json'
			}).responseText);
		}
	},
	
	/**
	 * Cancels all outstanding requests in this.requests and deletes them from this.requests
	 * @member Syn.Comm
	 */
	cancelAll: function()
	{
		for (var requestId in this.requests)
		{
			// We need to make sure there is a request to cancel
			if(typeof this.requests[requestId] != 'undefined')
			{
				this.requests[requestId].abort();
				this.requests[requestId]=null;
				delete this.requests[requestId];
			}
		}
	},
	
	/**
	 * Returns a function that is used when a webservice call is completed
	 * @member Syn.Comm
	 * @param callBackObj {Object} The object containing the callback data for this request
	 * @param requestId {Number} The number of the request coming from this object (1...n)
	 */
	onSuccessFunc: function(callBackObj, requestId)
	{
		var that = this;
		
		/**
		* The function that actually occurs when a request is complete.
		* @member Syn.Comm
		* @param responseText {String} The response text for a request
		* @param responseMessage {String} The response message for a request
		*/
		return function onSuccess(responseText, responseMessage)
		{
			var result = window["eval"]("(" + responseText + ")");
			
			if ( callBackObj.cb_obj )
			{
				(typeof callBackObj.callback == "string") ? callBackObj.cb_obj[callBackObj.callback](result) :callBackObj.callback.call(callBackObj.cb_obj, result);
			}
			else
			{
				callBackObj.callback(result);
			}
			
			//The request is done, delete the request from this Syn.Comm instance
			that.requests[requestId]=null;
			delete that.requests[requestId];
		}
	}
});
;
/**
 * Create a component instance.
 * @constructor
 */
Syn.Component = Class.extend(
{
	/**
	 * Initialize the component class. This is called automatically by the default constructor.
	 * In the config object, the following attributes are generally supplied
	 *   - {String} type The type of this component, eg (horoscope,movies,etc)
	 *   - {String} uid (v1) The unique identifier for this component instance
	 *   - {String} event_id (v2) The unique identifier for this component instance
	 *   - {String} ajaxtoken A data packet needed to reconstruct the component via webservices
	 * @member Syn.Component
	 * @param {Object} config
	 */
	init: function (config)
	{
		this.type      = config['type'] || '';
		this.uid       = config['uid'];
		this.config    = config;
		this.uid_esc   = this.uid.replace(/(:|\|)/g,'\\$1');
		this.ajaxtoken = config['ajaxtoken'];
		this.comp      = $('#'+this.uniqueKey());
		this.config['__i18n'] = this.config['__i18n'] ? this.config['__i18n'] : {};
	},

	/**
	 * Get the instance uid
	 * @member Syn.Component
	 * @return {String} The uid
	 */
	getUid: function ()
	{
		return this.uid;
	},

	/**
	 * Get the dom identifier for this simple 'key'. The key value gets expanded to the id of this unique instance of the component.
	 * @member Syn.Component
	 * @param {String} key A simple identifier that appears in your component
	 * @param {bool} no_escape Whether or not to escape the : in the key
	 * @return {String} The expanded per-instance identifier
	 */
	uniqueKey: function (key, no_escape)
	{
		var prefix = this.type ? this.type+'_' : '';

		if (no_escape)
		{
			return prefix+(key!=null ? key+'_' : '')+this.uid;
		}

		return prefix+(key!=null ? key+'_' : '')+this.uid_esc;
	},

	/**
	 * Return the jquery object for this component instance for this simple key
	 * @member Syn.Component
	 * @param {String} key A simple identifier that appears in your component
	 * @return {Object} The jquery object
	 */
	uniqueElmt: function (key)
	{
		return $('#'+this.uniqueKey(key));
	},

	/**
	 * Returns the jquery object for the entire component
	 * @return {Object} The component jquery object
	 */
	container: function ()
	{
		return this.uniqueElmt();
	},

	/**
	 * Submit some form elements via ajax to the component webservice. Will result in the component reloading with new settings.
	 * @param {Array} vals An array of form values to submit
	 * @param {Array} extra_opts
	 */
	submit: function (vals, extra_opts)
	{
		extra_opts = extra_opts||{};
		// Framework request
		if (this.config['uri'])
		{
			var self = this;
			var data = {};
			for (i in vals)
			{
				data[i] = vals[i];
			}

			data['_uri']        = data['_uri'] || this.config['uri'];
			data['_parent_uri'] = data['_parent_uri'] || this.config['parent_uri'];
			data['_root_url']   = Syn.Config.Framework.PortalRoot;
			data['_client_uri'] = 'client://client_config/'+Syn.Config.Framework.Client+'/';
			data['_site_uri']   = 'site://site_config/'+Syn.Config.Framework.Site+'/';
			data['_session']    = Syn.Config.Framework.Session;
			data['_user_id']    = Syn.Config.Framework.UserId;
			data['_auth_token'] = Syn.Config.Framework.AuthToken;

			if (extra_opts['render_wrapper'])
			{
				data['_render_wrapper'] = 1;
			}

			if (extra_opts['app_server'] || extra_opts['app_server_url'])
			{
				data._is_jsonp = 1;

				var url = extra_opts['app_server_url'] || Syn.Config.Framework.AppServer; 

				rq = {
					'url':         url + '_/',
					'contentType': 'application/json',
					'success':     function (x){ self.result(x); },
					'dataType':    'jsonp',
					'data':        data
				};
			}
			else
			{
				 rq = {
					'url':         Syn.Config.Framework.PortalRoot + '_/',
					'type':        'post',
					'contentType': 'application/json',
					'success':     function (x){ self.result(x); },
					'dataType':    'json',
					'data':        json.serialize(data)
				};
			}

			if (extra_opts.cache)
			{
				rq.jsCache = true;
			}

			$.ajax(rq);
			return;
		}

		// Perform the Troy ajax request
		if (!this.ajaxtoken)
		{
			return;
		}

		var packet = {'type':this.type, 'uid':this.uid, 'ajaxtoken':this.ajaxtoken, 'prefs':vals };

		if (extra_opts && extra_opts['norender'])
		{
			packet['norender'] = true;
		}

		this.comm = new Syn.Comm(Syn.Config.WebservicesUrl);
		this.comm.call('ComponentService', 'submit', packet, this, 'result');
	},

	/**
	 * Gets a component given a uri, parent uri and vals.
	 * @member Syn.Component
	 * @param {String} component_uri A uri of the component to render
	 * @param {String} parent_uri A uri of the parent uri for the component to render
	 * @param {Object} vals The values you wish to submit to the component
	 * @param obj {Object} The object that holds callback method.
	 * @param method {String|Function} Either a string method name or function used for callback.  (Optional)
	 * @param args {Array} Optional args for the callback.  (Optional)
	*/
	getComponent: function(component_uri, parent_uri, vals, obj, method)
	{
		return Syn.ComponentUtils.getComponent(component_uri, parent_uri, vals, obj, method);
	},

	loadUxAssets: function(res, callback)
	{
		return Syn.ComponentUtils.loadUxAssets(res, callback);
	},

	/**
	 * The target of the ajax component webservice. Replaces the component content.
	 * @param {mixed} res The content returned from the webservice
	 */
	result: function (res)
	{
		this.hideLoading();

		/**
		 * In case a Troy AJAX call has 'norender' set to true the response will be an empty string.
		 */
		if (!res)
		{
			return;
		}

		if (typeof res == 'string' && res)
		{
			this.container().replaceWith(res);
			return;
		}

		var self = this;
		var callback = function ()
		{
			if ( res['data'] )
			{
				self.onAjaxUpdate(res['data']);
			}
			else
			{
				var repl_target = res['has_wrapper'] ? self.wrapper() : self.container();
				repl_target.replaceWith(res['content']);
				var instance = Syn.ComponentMgr.getInstanceByUid(res.init.event_id);

				if (instance && instance != self)
				{
					Syn.ComponentMgr.remove(self);
				}
			}
		};

		this.loadUxAssets(res, callback);
	},

	/**
	 * Default ajax update handler, override this in subclasses to recieve the ajax update event
	 * @param {Object} config An associative array of config params
	 */
	onAjaxUpdate: function(config)
	{
		return;
	},

	/**
	 * Find a jquery element inside the component container
	 * @param {String} selector The jquery selector to execute inside the component container
	 * @return {Object} The jquery response object
	 */
	find: function(selector)
	{
		return $( '#'+this.uniqueKey()+ ( selector ? ' '+selector : '') );
	},

	/**
	 * Show the loading indicator.
	 * Options can be specified in the opts parameter.  The following opts are accepted:
	 *    target: {Object} A jQuery object where the loading layer will reside inside. [optional]
	 *    class: {String} An additional class name to use on the loading layer. [optional]
	 *
	 * @param {Object} opts Options for the loading layer
	 */
	showLoading: function(opts)
	{
		opts = opts || {};
		var loading = this.uniqueElmt("loading");
		var target  = opts["target"] || this.container();

		if (!loading.size())
		{
			loading = $("<div>").attr("id", this.uniqueKey("loading", true))
			                    .addClass("loading");

			// If the user specified an additional class, add it as well.
			if (opts["class"])
			{
				loading.addClass(opts["class"]);
			}
		}

		loading.css({
			width: target.outerWidth(),
			height: target.outerHeight()
		}).show();

		target.prepend(loading);

		return true;
	},

	/**
	 * Hide the loading indicator
	 */
	hideLoading: function()
	{
		this.uniqueElmt('loading').hide();
	},

	/**
	 * Loads scripts asynchronously and calls a callback when all scripts are done loading.
	 *
	 * @param scripts {Array|String} Array  of javascripts to load or String (for 1 js file to load)
	 * @param obj {Object} The object that holds callback method.
	 * @param method {String|Function} Either a string method name or function used for callback.
	 * @param number {int} The script index to start loading (Not required; defaults to 0)
	 * @member Syn.Component
	 */
	loadJs: function(scripts, obj, method, args, number)
	{
		var that = this;
		scripts = (typeof scripts == "string") ? [scripts] : scripts;
		number = number || 0;
		args = args || [];

		$.getScript(Syn.Config.PortalRoot+'js/'+scripts[number], function()
		{
			//Load the next one if we can
			if ((number+1) < scripts.length)
			{
				that.loadJs(scripts, obj, method,args, number+1);
			}
			else
			{
				//Do our callback now that we are done!
				(typeof method == 'string') ? obj[method].apply(obj, args ) : method.apply(obj, args );
			}
		});
	},

	/**
	 * Get the jquery handle to the component wrapper
	 * @return {Object} The wrapper container jquery object or the component container if no wrapper exists.
	 */
	wrapper: function()
	{
		// The Framework wrapper
		if (this.uniqueElmt('wrapper').length)
		{
			return this.uniqueElmt('wrapper');
		}

		/* Note: the wrap_sel selector has to iterate sub-nodes bcs the id's are not actually
			 unique for wrappers. :( Bad Troy, Bad.
		*/
		var res = this.uid.match(/^(\d+)[\w\:]*_([\w\d]+)$/);
		var wrap_sel = '#body_col_'+ res[1] +' div.comp_container[id=syn_comp_' + res[2] + ']';
		return $(wrap_sel).length ? $(wrap_sel) : this.container();
	},

	/**
	 * Remove the component and wrapper from the page.
	 */
	remove: function(options)
	{
		options = options || [];

		if ( Syn.ComponentMgr )
		{
			Syn.ComponentMgr.remove(this);
		}

		var target = options['target'] == 'wrapper' ? this.wrapper() : this.container();

		if (options['fade_out'])
		{
			target.fadeOut(options['fade_out'], function(){ $(this).remove(); } );
		}
		else
		{
			target.remove();
		}
	},

	/**
	 * Popup a component
	 * @param options {Object} Options
	 {
		 * component {Object | String} (Uri/avs if string)(Optional)
		 * - uri {String} Component Uri To Popup
		 * - params {Object} parameters passed to the component
		 * title {String} Title of component (Optional, overrides popup component title)
		 * layout {String} Layout of popup component, ie controls width (Optional, single|double|triple) 300px,612px, 960px) If not provided, defaults to single)
		 * css_class {String} CSS Class of popup component (Optional, If not provided, uses name of popup component)
		 * show_loading {String} true|false (Optional)
		 * draggable: true|false (Optional)
		 * closeable: true|false (Optional)
		 * resizable: true|false (Optional)
		 * modal: true|false (Optional)
		 * close_on_blur: true|false (Optional)
		 * show_title: true|false (Optional)
		 * center: "screen"|"component"| "#element_id" (Optional)
		 * max_popups: 1,2,3... (Optional) Defaults to 1)
		 * top: xxx (Optional)
		 * left: xxx (Optional)
		 * width: xxx (Optional)
		 * height: xxx (Optional)
	 }
	 *
	 * @param obj {Object} The object that holds callback method.
	 * @param method {String|Function} Either a string method name or function used for callback.  (Optional)
	 * @param args {Array} Optional args for the callback.  (Optional)
	 *
	 */
	popup: function(options, obj, method, args)
	{
		var that = this;
		var load_fn = function()
		{
			if (!that.syn_popup)
			{
				that.syn_popup = new Syn.Popup();
			}

			//If we want to center the popup over the component OR we have not specified a center + left + top
			if (options && options['center'] && options['center'] == 'component'
			 || (options && !options['center'] && !options['left'] && !options['top']))
			{
				options['center'] = '#'+that.uniqueKey();
			}

			that.syn_popup.popup(options, obj, method, args);
		};


		if (this.config['uri'])
		{
			//Load in Syn.Popup framework version
			$.getScripts(["en_US/globals/javascripts/framework/synpopup.js"], load_fn, Syn.Config.Framework.AssetsRoot);
		}
		else
		{
			//Load in Syn.Popup legacy
			$.getScripts(["framework/synpopup.packed.js"], load_fn, Syn.Config.PortalRoot+"js/");
		}
	},

	/**
	 * Live connects a tags for link submissions via ajax.
	 * @param {String|Object} sel
	 * @param {String|Function} method
	 */
	hrefToAjax: function(sel, method, extra_opts)
	{
		var obj = sel;
		if (typeof(obj) == "string")
		{
			obj = this.container().find(sel);
		}

		var self = this;
		obj.live("click", function()
		{
			if (method)
			{
				var a = [this];
				(typeof(method) == "string") ? self[method].apply(self, a) : method.apply(self, a);
			}

			var params = self.queryStrToObject($(this).attr("href"));
			self.submit(params,extra_opts);

			return false;
		});
	},

	/**
	 * Converts a query string to an object.
	 * @param {String} query_string
	 * @return {Array}
	 */
	queryStrToObject: function(query_string)
	{
		// query_string can be just a query string, or it can be a URL.  If it's a URL
		// with no query string, return an empty object.
		if (query_string.match(/^https?:\/\//) && query_string.indexOf("?") === -1)
		{
			return {};
		}

		var qs = query_string.match(/(?:^|\?)([^?]+)#?(?=#|$)/);
		qs = (qs) ? qs[1] : '';

		var params = qs.split(/&/);

		var arr = {};
		for (i = 0; i < params.length; ++i)
		{
			// PHP and JavaScript encode spaces differently.  Actually, PHP encodes spaces differently
			// as well.  http_build_query() in PHP encodes spaces as + (whereas rawurlencode() does %20).
			// JavaScript on the other hand encodes spaces a %20 only and doesn't encode the plus.  To fix this
			// we'll manually decode the plus as a space and then decode the rest.
			var keyvalue = params[i].split(/=/);
			var key = keyvalue[0];
			key = key.replace(/\+/g, ' ');
			key = decodeURIComponent(key);

			var value = keyvalue[1];
			if (value)
			{
				value = value.replace(/\+/g, ' ');
				value = decodeURIComponent(value);
			}
			arr[key] = (value) ? value : '';
		}

		return arr;
	},

	encodeDomId: function(str)
	{
	  return str.replace(/\W/g, function (char)
	  {
		return '-'+char.charCodeAt(0).toString(16);
	  });
	},

	decodeDomId: function(str)
	{
	  return str.replace(/\-([0-9a-f]{2})/ig, function (str,hex)
	  {
		return String.fromCharCode(parseInt(hex,16));
	  });
	},

	L: function(str)
	{
		return this.config['__i18n'][str] ? this.config['__i18n'][str] : str;
	}
});
;
function __syn_showTabbedComponent(tab, pzi, index)
{
	var i = 0;
	var container       = document.getElementById('tabbed_component_' + pzi + '_container');
	var componentToShow = document.getElementById('tabbed_component_' + pzi + '_' + index);
	if (!container || !componentToShow)
	{
		return;
	}

	// Hide all other components
	for (i = 0; i < container.childNodes.length; i++)
	{
		var componentDiv = container.childNodes[i];
		if (componentDiv.style && componentDiv != componentToShow)
		{
			componentDiv.style.display = 'none';
		}
	}

	// Show the selected component
	componentToShow.style.display = 'block';
	componentToShow.className     = 'on';

	var parentList = tab.parentNode;
	// Get default class name
	var defaultClassName = '';
	for (i = 0; i < parentList.childNodes.length; i++)
	{
		var element = parentList.childNodes[i];
		if (element != tab && element.className != 'on' && element.className && element.className != 'undefined')
		{
			defaultClassName = element.className;
			break;
		}
	}
	// Deselected all tabs 
	for (i = 0; i < parentList.childNodes.length; i++)
	{
		var element = parentList.childNodes[i];

		if (element.nodeName.toLowerCase() == 'li')
		{
			element.className = defaultClassName;
		}
	}

	// Set selected tab to on
	tab.className = 'on';
}

/***** Expedia javascript functions *****/

var divs = new Array('syn_exp_travel_flight', 'syn_exp_travel_car', 'syn_exp_travel_hotel', 'syn_exp_travel_cruise');

function syn_show_exp(obj)
{
	for (var i = 0; i < divs.length; i++)
	{
		if (document.getElementById(obj) && obj == divs[i])
		{
			document.getElementById(obj).style.display='block';
		}
		
		else if(document.getElementById(divs[i]))
		{
			document.getElementById(divs[i]).style.display='none';
		}
	}
}

function syn_check_exp(obj)
{
	if (document.getElementById(obj))
	{
		document.getElementById(obj).checked=true;
	}
}
;
/***** Utility functions *****/

Number.prototype.NaN0 = function()
{ 
	return isNaN(this) ? 0 : this;
}

function Utils()
{
}

Utils.getPosition = function(e)
{
	var root_offset_y = e.offsetTop;
	if (navigator.userAgent.indexOf('MSIE') != -1) 
	{
		e = e.offsetParent;
	}

	var left = 0;
	var top = 0;
	while (e.offsetParent)
	{
		left += e.offsetLeft + (e.currentStyle ? (parseInt(e.currentStyle.borderLeftWidth)).NaN0() : 0);
		top += e.offsetTop  + (e.currentStyle ? (parseInt(e.currentStyle.borderTopWidth)).NaN0() : 0);
		e = e.offsetParent;
	}

	left += e.offsetLeft + (e.currentStyle ? (parseInt(e.currentStyle.borderLeftWidth)).NaN0() : 0);
	top += e.offsetTop  + (e.currentStyle ? (parseInt(e.currentStyle.borderTopWidth)).NaN0() : 0);

	return { 
		x: left,
		y: top + (navigator.userAgent.indexOf('MSIE') != -1 ? root_offset_y : 0) 
	};
}

Utils.mouseCoords = function(ev)
{	
	if (!ev) 
	{
		var ev = window.event; 
	}

	if (ev.pageX || ev.pageY)
	{
		return {
			x: ev.pageX,
			y: ev.pageY
		};
	} 
	else if (ev.clientX || ev.clientY)
	{
		return {
			x: ev.clientX + document.body.scrollLeft + document.documentElement.scrollLeft,
			y: ev.clientY + document.body.scrollTop + document.documentElement.scrollTop
		};
	}
	else
	{
		return {
			x: 0,
			y: 0
		};
	}
}

Utils.getMouseOffset = function(target, ev)
{
	var docPos = getPosition(target);
	var mousePos = mouseCoords(ev ? ev : window.event);
	return {
		x: mousePos.x - docPos.x,
		y: mousePos.y - docPos.y
	};
}

Utils.getPageSize = function()
{
	var pageWidth = 0, pageHeight = 0;
	if (typeof( window.innerWidth ) == 'number')
	{
		//Non-IE
		pageWidth = window.innerWidth;
		pageHeight = window.innerHeight;
	}
	else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight))
	{
		//IE 6+ in 'standards compliant mode'
		pageWidth = document.documentElement.clientWidth;
		pageHeight = document.documentElement.clientHeight;
	}
	else if (document.body && (document.body.clientWidth || document.body.clientHeight))
	{
		//IE 4 compatible
		pageWidth = document.body.clientWidth;
		pageHeight = document.body.clientHeight;
	}

	return {
		x: pageWidth,
		y: pageHeight
	};
}

Utils.hitTest = function(element, x, y)
{
	var pos = Utils.getPosition(element);
	var ex  = pos.x;
	var ey  = pos.y;
	var ew  = elmt.offsetWidth;
	var eh  = elmt.offsetHeight;
	
	return (x >= ex && x <= ex + ew && y >= ey && y <= ey + eh) ? true : false;
}

Utils.horizontalHitTest = function(element, y)
{
	var pos = Utils.getPosition(element);
	var ey  = pos.y;
	var eh  = element.offsetHeight;
	
	return (y >= ey && y <= ey + eh) ? true : false;
}

Utils.addListener = function(event, method, use_capture)
{
	use_capture = use_capture ? use_capture : false;

	if (typeof window.addEventListener != 'undefined')
	{
		window.addEventListener(event, method, use_capture); // gecko, safari, konqueror and standard.
	}
	else if (typeof document.attachEvent != 'undefined')
	{
		document.attachEvent('on' + event, method); // IE
	}
	else
	{
		window['on' + event] = method;
	}
}

Utils.disableSelection = function(element) 
{
	element.onselectstart = function() 
	{
		return false;
	};
	//element.unselectable = 'on';
	element.style.MozUserSelect = 'none';
}

/***** Portal Events Handler *****/

function PortalEvents(){}

PortalEvents.listeners =
{
'onLoad'   :[],
'mouseMove':[],
'mouseDown':[],
'mouseUp'  :[]
};

PortalEvents.addListener = function (event,method,object)
{
	PortalEvents.listeners[event].push( {'method':method,'object':object} );
}

PortalEvents.onEvent = function (type,ev)
{
	ev = ev || window.event;

	var ls = PortalEvents.listeners[type];

	for (var i=0; i<ls.length; i++ )
	{
		var listener = ls[i];

		if ( typeof(listener['object']) == 'object' )
		{
			var target = listener['object'];
			target[listener['method']](ev);
		}
		else
		{
			listener['method'](ev);
		}
	}
}


// Install events
Utils.addListener('mousedown', function(ev) { PortalEvents.onEvent( 'mouseDown' , ev); }, false);
Utils.addListener('mouseup', function(ev) { PortalEvents.onEvent( 'mouseUp'   , ev); }, false);
Utils.addListener('mousemove', function(ev) { PortalEvents.onEvent( 'mouseMove' , ev);  }, false);

/***** Legacy functions *****/

function hide_overlay_elements(id)
{
	var element = document.getElementById(id)
	element.setAttribute('forced_hidden', 'true');
	element.style.visibility = 'hidden';
}

function show_overlay_elements(id)
{
	var element = document.getElementById(id)
	element.removeAttribute('forced_hidden');
	element.style.visibility = 'visible';
}

function hide_disruptive_overlay_elements()
{
	if (/MSIE (\d+\.\d+);/.test(navigator.userAgent))
        {
                var ieversion=new Number(RegExp.$1)
                if (ieversion >= 6 && ieversion < 7) // only hide elements if the browser is ie6
                {
			hide_elements_by_tag(['iframe', 'object', 'embed']);
		}
	}
}

function show_disruptive_overlay_elements()
{
	if (/MSIE (\d+\.\d+);/.test(navigator.userAgent))
        {
                var ieversion=new Number(RegExp.$1)
                if (ieversion >= 6 && ieversion < 7) // only show elements if the browser is ie6
                {
			show_elements_by_tag(['iframe', 'object', 'embed']);
		}
	}
}

function hide_elements_by_tag(element_names)
{
	for (var h = 0; h < element_names.length; h++)
	{
		var elements = document.getElementsByTagName(element_names[h]);
		for (var j = 0; j < elements.length; j++)
		{
			if (elements[j].style.visibility != 'hidden')
			{
				elements[j].setAttribute('forced_hidden', 'true');
				elements[j].style.visibility = 'hidden';
			}
		}
	}
}

function show_elements_by_tag(element_names)
{
	for (var h = 0; h < element_names.length; h++)
	{
		var elements = document.getElementsByTagName(element_names[h]);
		for (var j = 0; j < elements.length; j++)
		{
			if (elements[j].getAttribute('forced_hidden') == 'true')
			{
				elements[j].removeAttribute('forced_hidden');
				elements[j].style.visibility = 'visible';
			}
		}
	}
}

function SYNACOR_findObj(n, d)
{
	var p, i, x;
	if (!d)
	{
		d = document;
	}
	if ((p = n.indexOf("?")) > 0 && parent.frames.length)
	{
		d = parent.frames[n.substring(p + 1)].document;
		n = n.substring(0, p);
	}
	if (!(x=d[n]) && d.all)
	{
		x = d.all[n];
	}
	for (i = 0; !x && i < d.forms.length; i++)
	{
		x = d.forms[i][n];
	}
	for (i = 0; !x && d.layers && id.layers.length; i++)
	{
		x = SYNACOR_findObj(n, d.layers[i].document);
	}
	if (!x && d.getElementById)
	{
		x = d.getElementById(n);
	}

	return x;
}

function find_pos_x(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
	{
		curleft += obj.x;
	}
	
	return curleft;
}

function find_pos_y(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
	{
		curtop += obj.y;
	}
	return curtop;
}

function SYNACOR_Snap() 
{
	var args = SYNACOR_Snap.arguments;
	var x = 0;
	var y = 0;

	for (offset = 0; offset < args.length; offset += 4)
	{
		var source_element = args[offset];
		var move_element = args[offset + 1];
		var dest_x = parseInt(args[offset + 2]);
		var dest_y = parseInt(args[offset + 3]);

		source_element = document.getElementById(source_element);
		move_element   = document.getElementById(move_element);
		if (!source_element || !move_element)
		{
			return;
		}

		x = find_pos_x(source_element);
		y = find_pos_y(source_element);

		try
		{
			move_element.style.left = (x + dest_x) + 'px';
			move_element.style.top  = (y + dest_y) + 'px';
		}
		catch (e)
		{
			try
			{
				move_element.offsetLeft = x + dest_x;
				move_element.offsetTop  = y + dest_y;
			}
			catch (e)
			{
			}
		}
	}
	return;
}


function SYNACOR_showHideLayers()
{ //v6.0
	var i, p, v, obj, vv, vd;
	var args = SYNACOR_showHideLayers.arguments;
	for (i = 0; i < (args.length-2); i += 3)
	{
		if ((obj = SYNACOR_findObj(args[i])) != null)
		{
			v = args[i + 2];
			if (obj.style)
			{
				obj = obj.style;
				vv  = (v == 'show') ? 'visible' : (v == 'hide') ? 'hidden' : v;
				vd  = (v == 'show') ? 'block'   : (v == 'hide') ? 'none'   : v;
			}
			obj.visibility=vv;
			obj.display=vd;
		}
	}
}

function getXMLRequestObject()
{
	try	
	{
		return new ActiveXObject('Msxml2.XMLHTTP')
	}
	catch (exception) 
	{
		try 
		{
			return new ActiveXObject('Microsoft.XMLHTTP');
		}
		catch (exception)
		{
			try
			{
				return new XMLHttpRequest()
			}
			catch (exception)
			{
				return false;
			}
		}
	}
}

function get_cdata(dom, tag)
{
	var tag = dom.getElementsByTagName(tag);
	if (!tag || tag.length < 1 || !tag[0].firstChild ||	!tag[0].firstChild.data)
	{
		return '';
	}
	return tag[0].firstChild.data;
}

function get_attribute(dom, tag, attribute)
{
	var tag = dom.getElementsByTagName(tag);
	if (!tag || tag.length < 1 || !tag[0].attributes ||
	     tag[0].attributes.length < 1 || !tag[0].attributes.getNamedItem(attribute))
	{
		return '';
	}
	
	return tag[0].attributes.getNamedItem(attribute).value;
}

function hide_id(id_to_hide)
{
	var what = document.getElementById(id_to_hide);
	if (what)
	{
		what.style.display='none';
	}
}

function base64encode(str)
{
	var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	var out;
	var i;
	var len;
	var c1;
	var c2;
	var c3;
	var len = str.length;
	var i = 0;
	out = "";
	while (i < len)
	{
		c1 = str.charCodeAt(i++) & 0xff;
		if (i == len)
		{
			out += base64EncodeChars.charAt(c1 >> 2);
			out += base64EncodeChars.charAt((c1 & 0x3) << 4);
			out += "==";
			break;
		}
		c2 = str.charCodeAt(i++);
		if (i == len)
		{
			out += base64EncodeChars.charAt(c1 >> 2);
			out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
			out += base64EncodeChars.charAt((c2 & 0xF) << 2);
			out += "=";
			break;
		}
		c3 = str.charCodeAt(i++);
		out += base64EncodeChars.charAt(c1 >> 2);
		out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
		out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
		out += base64EncodeChars.charAt(c3 & 0x3F);
	}
	return out;
}

function trimStr(str)
{
	str = str.replace(/^\s*/, "");
	str = str.replace(/\s*$/, "");
	
	return str;
}

function add_event_listener(oRef, en, fn)
{
	obj = (typeof oRef == 'string')? document.getElementById(oRef) : oRef;
	if (window.addEventListener) 
	{
		obj.addEventListener(en, fn, false);
	}
	else if (window.attachEvent) 
	{
		obj.attachEvent('on'+en, fn);
	}
}

function remove_event_listener(oRef, en, fn)
{
	obj = (typeof oRef == 'string') ? document.getElementById(oRef) : oRef;
	if (window.addEventListener) 
	{
		obj.removeEventListener(en, fn, false);
	}
	else if (window.attachEvent) 
	{
		obj.detachEvent('on' + en, fn);
	}
}


function reg_repl_esc(text)
{
	return text.replace(/\$/g, '&#36;');
}


/**
 * Deprecated, do not use
 */
function openWindow(theURL, winName, features)
{
	window.open(theURL, winName, features);
}


function SYNACOR_swapImgRestore()
{ //v3.0
	var i, x;
	var a = document.SYNACOR_sr;
	for (i = 0; a && i < a.length && (x = a[i]) && x.oSrc; i++)
	{
		x.src = x.oSrc;
	}
}



function SYNACOR_swapImage() 
{ //v3.0
	var i, j = 0, x;
	var a = SYNACOR_swapImage.arguments;

	document.SYNACOR_sr = new Array;
	for (i = 0; i < (a.length - 2); i += 3)
	{
		if ((x = SYNACOR_findObj(a[i])) != null)
		{
			document.SYNACOR_sr[j++] = x;
			if (!x.oSrc)
			{
				x.oSrc = x.src;
			}
			x.src = a[i + 2];
		}
	}
}

function waterimg(arg) 
{
       window.location = arg;
}

function addLoadEvent(fn)
{
	if (window.addEventListener)
	{
		window.addEventListener('load', fn, false);
	}
	else if (window.attachEvent)
	{
		window.attachEvent('onload', fn);
	}
};
function externalLinks()
{
	if (!document.getElementsByTagName)
	{
		return;
	}
		
	var anchors = document.getElementsByTagName("a");
	for (var i=0; i<anchors.length; i++)
	{
		var anchor = anchors[i];
		
		if (anchor.getAttribute("href") && anchor.getAttribute("rel") == "external")
		{
			anchor.target = "_blank";
		}
	}
}
;
/**
 * Ajax JavaScript framework
 * Loosely based off of the Prototype JavaScript framework
 *    Prototype is (c) 2005 Sam Stephenson <sam@conio.net>
 *    Prototype is freely distributable under the terms of an MIT-style license.
 *    For details, see the Prototype web site: http://prototype.conio.net/
 */

SynAjax_Request_Events =
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];


function getTransport() 
{
	try	
	{
		return new ActiveXObject('Msxml2.XMLHTTP')
	}
	catch (exception) 
	{
		try 
		{
			return new ActiveXObject('Microsoft.XMLHTTP');
		}
		catch (exception)
		{
			try
			{
				return new XMLHttpRequest()
			}
			catch (exception)
			{
				return false;
			}
		}
	}
}

SynAjax = function()
{
	var self = new Object();

	self.transport = getTransport();
	
	self.request = function(url, options) 
	{
		this.doRequest(null, url, options);
	}

	self.update = function(element_id, url, options)
	{
		this.doRequest(element_id, url, options);
	}

	self.doRequest = function(element_id, url, options)
	{
		this.url        = url;
		this.options    = options;
		this.updater    = element_id;
		this.parameters = this.options.parameters || '';

		try 
		{
			if (this.options.method == 'get')
			{
				this.url += (this.url.match(/\?/) ? '&' : '?') + this.parameters;
			}

			var loader = this;
			this.transport.onreadystatechange = function()
			{
				loader.onStateChange.call(loader);
			}
			this.transport.open(this.options.method, this.url, true);
			this.setRequestHeaders();

			var body = this.options.postBody ? this.options.postBody : this.parameters;
			this.transport.send(this.options.method == 'post' ? body : null);

		}
		catch (exception) 
		{ }
	}

	self.setRequestHeaders = function() 
	{
		var requestHeaders =
			['X-Requested-With', 'XMLHttpRequest'];

		if (this.options.method == 'post') 
		{
			requestHeaders.push('Content-type',	'application/x-www-form-urlencoded');

			/**
			 * Force "Connection: close" for Mozilla browsers to work around
			 * a bug where XMLHttpReqeuest sends an incorrect Content-length
			 * header. See Mozilla Bugzilla #246651.
			 */
			if (this.transport.overrideMimeType)
				requestHeaders.push('Connection', 'close');
		}

		if (this.options.requestHeaders)
		{
			requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
		}

		for (var i = 0; i < requestHeaders.length; i += 2)
		{
			this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
		}
	}

	self.onStateChange = function()
	{
		if (!this.transport)
		{
			if (this.transport == 'undefined')
			{
				return;
			}
		}

		var event = SynAjax_Request_Events[this.transport.readyState];

		if (this.transport.readyState != 1)
		{
			if (event == 'Complete')
			{
				if (this.updater != null)
				{
					var element = document.getElementById(this.updater);
					try 
					{
						element.innerHTML = this.transport.responseText;
					}
					catch (exception)
					{ }
				}

				try
				{
					this.options.onComplete(this.transport);
				}
				catch (exception)
				{ }

				if ((this.header('Content-type') || '').match(/^text\/javascript/i))
				{
					this.evalResponse();
				}
			}

			// Avoid memory leak in MSIE: clean up the oncomplete event handler 
			if (event == 'Complete')
			{
				this.transport.onreadystatechange = function(){};
			}
		}
	}

	self.header = function(name)
	{
		try
		{
			return this.transport.getResponseHeader(name);
		}
		catch (exception)
		{
			return null;
		}
	}

	self.evalResponse = function()
	{
		try
		{
			return eval(this.transport.responseText);
		}
		catch (exception)
		{
			return null;
		}
	}

	return self;
}
;
Syn.setPreventSearchBarFocus=function(){Syn.preventSearchBarFocus=true;return true};$(document).ready(function(){if(document.location.hash==''){$('#q:visible:enabled').focus()}else{Syn.setPreventSearchBarFocus()}$(':input:not(#q)').bind('focus',Syn.setPreventSearchBarFocus)});$(window).load(function(){if(!Syn.preventSearchBarFocus){$('#q:visible:enabled').focus()}$(':input:not(#q)').unbind('focus',Syn.setPreventSearchBarFocus);delete Syn.preventSearchBarFocus;delete Syn.setPreventSearchBarFocus});
;
$(document).ready(function(){$('#left_nav .level_2 .trigger').each(function(){if($.cookie('left_nav_'+$(this).siblings('span').text())=='1'){$(this).parent().next('ul').show()}else if($.cookie('left_nav_'+$(this).siblings('span').text())=='0'){$(this).parent().next('ul').hide()}});var premiums=$('#left_nav .premium_services > li').size();var random_premium=(Math.floor(Math.random()*premiums));$('#left_nav .premium_services > li:eq('+random_premium+') ul').slideToggle().prev('h1').children('.trigger').toggleClass('nav_open');$('#left_nav .comp_container_premiumspotlight:has(img)').wrap('<li class="spotlight"></li>');$('#left_nav .comp_container_premiumspotlight:has(img)').show();$('#left_nav li:has(ul) h1 ~ ul:visible').prev().children('.trigger').addClass('nav_open');$('#left_nav .trigger, #left_nav li:has(ul) > h1 > span').click(function(){var trigger=$(this);$(this).parent().next('ul').slideToggle('normal',function(){var cookie_val=($(trigger).parent().next('ul').is(':visible'))?1:0;$.cookie('left_nav_'+$(trigger).parent().children('span').text(),cookie_val,{expires:365,path:'/'})});$(this).parent().children('.trigger').toggleClass('nav_open')})});;
/**
 * The Syn.EnomSearch Component Class 
 */

/**
 * Create a Syn.EnomSearch component instance 
 * @constructor
 */
Syn.EnomManageDomains = Syn.Component.extend(
{
	ajax_api_url: Syn.Config.PortalRoot + 'enom/enom_lock_api.php',

	status: 0,

	lock_target: null,

	enc_username: null,

	/**
	 * Initialize the component class. This is called automatically by the default constructor.
	 * @member Syn.EnomManageDomains
	 * @param {Object} config The configuration data structure 
	 */
	init: function(config)
	{	
		this._super(config);
		this.enc_username = config.enc_username;

		//Shows/Hides individual domain rows	
		this.uniqueElmt('domain_table').find('tr.domain_header_row:even').addClass('domain_management_tr_dark');
		this.uniqueElmt('domain_table').find('tr.domain_body_row:not(:first)').hide();
		this.uniqueElmt('domain_table').find('tr.domain_header_row').connect('click', this, 'toggleOpenDomain');
		this.uniqueElmt('domain_table').find('tr.domain_header_row a.domain_management_renew_link').connect('click', this, 'renewDomain');
		this.uniqueElmt('domain_table').find('.domain_management_hide').connect('click', this, 'toggleOpenDomain');

		//Controls for top navigation tabs - My Domains, Register, Transfer
		this.uniqueElmt('domain_nav').find('.domain_management_mydomains').connect('click', this, 'toggleMyDomains');
		this.uniqueElmt('domain_nav').find('.domain_management_register').connect('click', this, 'toggleRegister');
		this.uniqueElmt('domain_nav').find('.domain_management_transfer').connect('click', this, 'toggleTransfer');
		if (config.active_page == 'transfer')
		{
			this.toggleTransfer();
		}
		else
		{
			this.toggleMyDomains();
		}

		this.uniqueElmt('request_auth').connect('click', this, 'toggleTransferAuth');
		this.uniqueElmt('request_transfer').connect('click', this, 'toggleAuthTransfer');
		this.uniqueElmt('transfer_tld').connect('change', this, 'toggleAuthCode');

		//Controls for inner navigation tabs - General, DVS, Host, Email
		this.uniqueElmt('domain_table').find('.domain_management_general_tab').connect('click', this, 'toggleGeneral');
		this.uniqueElmt('domain_table').find('.domain_management_dns_tab').connect('click', this, 'toggleDNS');
		this.uniqueElmt('domain_table').find('.domain_management_host_tab').connect('click', this, 'toggleHost');
		this.uniqueElmt('domain_table').find('.domain_management_mail_tab').connect('click', this, 'toggleMail');
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_navigation li a:first').addClass('active');
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_navigation li a:last').addClass('domain_management_expanded_box_navigation_last');

		//Controls for Locking/Unlocking domains
		this.uniqueElmt('domain_table').find('.domain_management_lock').connect('click', this, 'alertLock');
		this.uniqueElmt('lock_yes').connect('click', this, 'toggleLock');
		this.uniqueElmt('lock_no').connect('click', this, 'cancelLock');
		this.uniqueElmt('lock_alert').find('.domain_management_alert_box_close a').connect('click', this, 'cancelLock');

		//Connect warning popup for General tab
		this.uniqueElmt('domain_table').find('.domain_management_save_and_go').connect('click', this, 'generalSubmit');
		this.uniqueElmt('domain_table').find('.domain_management_save').connect('click', this, 'generalSubmit');
		this.uniqueElmt('domain_table').find('.domain_management_alert_general .domain_management_alert_box_close a').connect('click', this.uniqueElmt('domain_table').find('.domain_management_alert_general'), 'hide', []);
		this.uniqueElmt('domain_table').find('.domain_management_alert_general .domain_management_cancel').connect('click', this.uniqueElmt('domain_table').find('.domain_management_alert_general'), 'hide', []);

		//Connect warning popup for DNS tab
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_inner_dns .domain_management_save').connect('click', this.uniqueElmt('domain_table').find('.domain_management_alert_dns'), 'show', []);
		this.uniqueElmt('domain_table').find('.domain_management_alert_dns .domain_management_alert_box_close a').connect('click', this.uniqueElmt('domain_table').find('.domain_management_alert_dns'), 'hide', []);
		this.uniqueElmt('domain_table').find('.domain_management_alert_dns .domain_management_cancel').connect('click', this.uniqueElmt('domain_table').find('.domain_management_alert_dns'), 'hide', []);
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_inner_dns .dns_default').connect('click', this, 'toggleDNSDefault');
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_inner_dns .dns_custom').connect('click', this, 'toggleDNSCustom');
		this.uniqueElmt('domain_table').find('.domain_management_dns_reset').connect('click', this, 'resetDNS');

		//Connect warning popup for Host tab
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_inner_host .domain_management_save').connect('click', this.uniqueElmt('domain_table').find('.domain_management_alert_host'), 'show', []);
		this.uniqueElmt('domain_table').find('.domain_management_alert_host .domain_management_alert_box_close a').connect('click', this.uniqueElmt('domain_table').find('.domain_management_alert_host'), 'hide', []);
		this.uniqueElmt('domain_table').find('.domain_management_alert_host .domain_management_cancel').connect('click', this.uniqueElmt('domain_table').find('.domain_management_alert_host'), 'hide', []);
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_inner_host .domain_management_host_add').connect('click', this, 'addHostRow');
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_inner_host .delete_host').connect('click', this, 'deleteHostRows');
		this.uniqueElmt('domain_table').find('.domain_management_host_reset').connect('click', this, 'resetHost');
		
		//Mailhosts
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_inner_email .domain_management_save').connect('click', this.uniqueElmt('domain_table').find('.domain_management_alert_mail'), 'show', []);
		this.uniqueElmt('domain_table').find('.domain_management_alert_mail .domain_management_alert_box_close a').connect('click', this.uniqueElmt('domain_table').find('.domain_management_alert_mail'), 'hide', []);
		this.uniqueElmt('domain_table').find('.domain_management_alert_mail .domain_management_cancel').connect('click', this.uniqueElmt('domain_table').find('.domain_management_alert_mail'), 'hide', []);
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_inner_email .domain_management_mail_add').connect('click', this, 'addMailHostRow');
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_inner_email .delete_mail').connect('click', this, 'deleteMailHostRows');
		this.uniqueElmt('domain_table').find('.domain_management_mail_reset').connect('click', this, 'resetMail');

		if (config.endpoint == 'custom')
		{
			this.uniqueElmt('domain_table').find('#' + config.err_domain + '_body').find('.domain_management_dns_tab').click();
			this.uniqueElmt('domain_table').find('#' + config.err_domain + '_body').find('.dns_default').attr('checked', '');
			this.uniqueElmt('domain_table').find('#' + config.err_domain + '_body').find('.dns_custom').attr('checked', 'checked');
			this.toggleResetFields();
		}

		if (config.err_tab != '')
		{
			switch (config.err_tab)
			{
				case 'transfer':
					this.uniqueElmt('domain_nav').find('.domain_management_transfer').click();
					this.uniqueElmt('request_auth').click();
					break;
				case 'register':
					this.uniqueElmt('domain_nav').find('.domain_management_register').click();
					 break;
				case 'dns':
					this.uniqueElmt('domain_table').find('#' + config.err_domain + '_body').find('.domain_management_dns_tab').click();
					this.uniqueElmt('domain_table').find('.domain_body_row').hide();
					this.uniqueElmt('domain_table').find('#' + config.err_domain + '_body').show();
					break;
				case 'hosts':
					this.uniqueElmt('domain_table').find('#' + config.err_domain + '_body').find('.domain_management_host_tab').click();
					this.uniqueElmt('domain_table').find('.domain_body_row').hide();
					this.uniqueElmt('domain_table').find('#' + config.err_domain + '_body').show();
					break;
				case 'mailhost':
					this.uniqueElmt('domain_table').find('#' + config.err_domain + '_body').find('.domain_management_mail_tab').click();
					this.uniqueElmt('domain_table').find('.domain_body_row').hide();
					this.uniqueElmt('domain_table').find('#' + config.err_domain + '_body').show();
					break;
				default:
					break;
			}

			if (config.err_type == 'save')
			{
				this.uniqueElmt('domain_table').find('#' + config.err_domain + '_body').find('.domain_management_expanded_box_save_confirm').show();
				this.uniqueElmt('domain_table').find('#' + config.err_domain + '_body').find('.form_error_red').html('');
			}
		}
	},	

	/**
	 * Sets up the submit button for the confirmation popup on the General tab.
	 */
	generalSubmit: function(target, event)
	{
		var target_name = $(target).attr('rel');
		$(target).parent().parent().find('.domain_management_alert_general .domain_management_form_name').attr('name', target_name);
		$(target).parent().parent().find('.domain_management_alert_general').show();
	},

	/**
	 * Switches between transfering domains into and out of eNom on the Transfer tab.
	 */
	toggleTransferAuth: function(target, event)
	{
		this.uniqueElmt('domain_transfer').hide();
		this.uniqueElmt('domain_auth').show();
	},

	/**
	 * Switches between requesting auth code and transfering domain on Transfer tab.
	 */
	toggleAuthTransfer: function(target, event)
	{
		this.uniqueElmt('domain_transfer').show();
		this.uniqueElmt('domain_auth').hide();
	},

	/**
	 * Event handler after 'No' is clicked when locking a domain.
	 */
	cancelLock: function(target, event)
	{
		this.lock_target = null;
		this.uniqueElmt('lock_alert').hide();
	},

	/**
	 * Handles the popup for locking/unlocking domains.
	 */
	alertLock: function(target, event)
	{
		this.lock_target = target;
		var domain = $(this.lock_target).attr('rel');
		domain = domain.split('|');
		var lock = domain[1];

		if (lock == 1)
		{
			this.uniqueElmt('lock_text').html('lock');
		}
		else
		{
			this.uniqueElmt('lock_text').html('unlock');
		}

		this.uniqueElmt('lock_alert').show();
	},

	/**
	 * AJAX Submit for locking / unlocking domain for transfer
	 * @member Syn.EnomManageDomains
	 * @param {Object} target is the handle of the object calling this function
	 * @param {Object} event is the event that was fired to call this object
	 */
	toggleLock: function(target, event)
	{	
		var domain = $(this.lock_target).attr('rel').split('|');
		var lock = domain[1];
		domain = domain[0];

		$.ajax({
			callback: null,
			complete: this.checkResponse,
			self: this,
			type: 'POST',
			dataType: 'text',
			url: this.ajax_api_url,
			data: 'domain=' + domain + '&lock=' + lock,
			page: this.page,
			pos: this.pos,
			zone: this.zone
		});

		if (this.status == 0)
		{
			if (lock == 1)
			{
				$(this.lock_target).attr('rel', domain + '|' + 0);
				$(this.lock_target).attr('src', '../components/images/enom/domain_management_lock.gif');
				$(this.lock_target).attr('alt', 'Unlock');
				$(this.lock_target).parent().attr('title', 'Unlock');
			}
			else
			{
				$(this.lock_target).attr('rel', domain + '|' + 1);
				$(this.lock_target).attr('src', '../components/images/enom/domain_management_unlock.gif');
				$(this.lock_target).attr('alt', 'Lock');
				$(this.lock_target).parent().attr('title', 'Lock');
			}
			this.uniqueElmt('lock_alert').hide();
		}	
	},

	/**
	 * Response checker function.
	 *
	 * This function will be responsible for checking the status of a recent
	 * Ajax request.  If the first character returned is not 0 then there was a failure
	 * otherwise it was a success.
	 *
	 * @param {Resource} req
	 * @member Syn.EnomManageDomains
	 */
	checkResponse: function(req)
	{
		this.status = parseFloat(req.responseText.substr(0,1));
		if (this.status != 0)
		{
			alert('An error occurred while trying to lock or unlock this domain for transfer.');
		}
	},

	/**
	 * Submit page after renew image is clicked.
	 */
	renewDomain: function(target, event)
	{
		window.location.href = 'index.php?action=renew&sld_tld=' + $(target).attr('rel') + '&id=' + this.enc_username;
	},

	/**
	 * Toggles tabs and sets MyDomains to the active tab
	 */
	toggleMyDomains: function(target, event)
	{
		this.uniqueElmt('domain_nav').find('li a').removeClass('active');
		this.uniqueElmt('domain_nav').find('li a:first').addClass('active');
		this.uniqueElmt('mydomains_tab').show();
		this.uniqueElmt('registered_tab').hide();
		this.uniqueElmt('transfer_tab').hide();
		this.toggleResetFields();
	},

	/**
	 * Toggles tabs and sets Register to the active tab
	 */
	toggleRegister: function(target, event)
	{
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_save_confirm').hide();
		this.uniqueElmt('domain_nav').find('li a').removeClass('active');
		$(target).addClass('active');
		this.uniqueElmt('mydomains_tab').hide();
		this.uniqueElmt('registered_tab').show();
		this.uniqueElmt('transfer_tab').hide();
	},

	/**
	 * Toggles tabs and sets Transfer to the active tab
	 */
	toggleTransfer: function(target, event)
	{
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_save_confirm').hide();
		this.uniqueElmt('domain_nav').find('li a').removeClass('active');
		this.uniqueElmt('domain_nav').find('li a:last').addClass('active');
		this.uniqueElmt('mydomains_tab').hide();
		this.uniqueElmt('registered_tab').hide();
		this.uniqueElmt('transfer_tab').show();
	},

	/**
	 * Disables the Auth Code textbox when a tld other than .com/.ent is selected
	 */
	toggleAuthCode: function(target, event)
	{
		var tld = $(target).val();

		if (tld == 'com' || tld == 'net')
		{
			this.uniqueElmt('auth').attr('disabled', '');
		}
		else
		{
			this.uniqueElmt('auth').attr('disabled', 'disabled');
			this.uniqueElmt('auth').val('');
		}
	},

	/**
	 * Toggles inner tabs and sets General as the active tab
	 */
	toggleGeneral: function(target, event)
	{
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_save_confirm').hide();
		var parent_elm = $(target).parents('.domain_body_row');
		parent_elm.find('.domain_management_expanded_box_navigation li a').removeClass('active');
		$(target).addClass('active');
		parent_elm.find('.domain_management_expanded_box_inner_general').show();
		parent_elm.find('.domain_management_expanded_box_inner_dns').hide();
		parent_elm.find('.domain_management_expanded_box_inner_host').hide();
		parent_elm.find('.domain_management_expanded_box_inner_email').hide();
	},

	/**
	 * Toggles inner tabs and sets DNS as the active tab
	 */
	toggleDNS: function(target, event)
	{
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_save_confirm').hide();
		var parent_elm = $(target).parents('.domain_body_row');
		parent_elm.find('.domain_management_expanded_box_navigation li a').removeClass('active');
		$(target).addClass('active');
		parent_elm.find('.domain_management_expanded_box_inner_general').hide();
		parent_elm.find('.domain_management_expanded_box_inner_dns').show();
		parent_elm.find('.domain_management_expanded_box_inner_host').hide();
		parent_elm.find('.domain_management_expanded_box_inner_email').hide();
	},

	/**
	 * Toggles inner tabs and sets Host as the active tab
	 */
	toggleHost: function(target, event)
	{
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_save_confirm').hide();
		var parent_elm = $(target).parents('.domain_body_row');
		parent_elm.find('.domain_management_expanded_box_navigation li a').removeClass('active');
		$(target).addClass('active');
		parent_elm.find('.domain_management_expanded_box_inner_general').hide();
		parent_elm.find('.domain_management_expanded_box_inner_dns').hide();
		parent_elm.find('.domain_management_expanded_box_inner_host').show();
		parent_elm.find('.domain_management_expanded_box_inner_email').hide();
	},

	/**
	 * Toggles inner tabs and sets Mail to the active tab
	 */
	toggleMail: function(target, event)
	{
		this.uniqueElmt('domain_table').find('.domain_management_expanded_box_save_confirm').hide();
		var parent_elm = $(target).parents('.domain_body_row');
		parent_elm.find('.domain_management_expanded_box_navigation li a').removeClass('active');
		$(target).addClass('active');
		parent_elm.find('.domain_management_expanded_box_inner_general').hide();
		parent_elm.find('.domain_management_expanded_box_inner_dns').hide();
		parent_elm.find('.domain_management_expanded_box_inner_host').hide();
		parent_elm.find('.domain_management_expanded_box_inner_email').show();
	},

	/**
	 * Switches the currently open domain
	 */
	toggleOpenDomain: function(target, event)
	{
		if ($(target).hasClass('domain_header_row'))
		{
			var table_row = $(target).next('tr.domain_body_row');
			if (table_row.is(':hidden'))
			{
				$(target).next('tr.domain_body_row').show();
				$(target).find('.domain_header_arrow').attr('src', '../components/images/enom/domain_management_arrow_dark_down.gif');
				this.toggleResetFields();
			}
			else
			{
				$(target).next('tr.domain_body_row').hide();
				$(target).parent().find('.domain_header_arrow').attr('src', '../components/images/enom/domain_management_arrow_dark.gif');
			}
		}
		else
		{
			var table_row = $(target).parents('.domain_body_row');
			table_row.hide();
			table_row.prev('tr.domain_header_row').find('.domain_header_arrow').attr('src', '../components/images/enom/domain_management_arrow_dark.gif');
		}
	},

	toggleDNSDefault: function(target, event)
	{
		var parent_elm = $(target).parents('.domain_body_row');
		parent_elm.find('.dns_default').attr('checked', 'checked');
		parent_elm.find('.dns_custom').attr('checked', '');
		this.toggleResetFields(target, event);
		event.stopImmediatePropagation();
	},

	toggleDNSCustom: function(target, event)
	{
		var parent_elm = $(target).parents('.domain_body_row');
		parent_elm.find('.dns_default').attr('checked', '');
		parent_elm.find('.dns_custom').attr('checked', 'checked');
		this.toggleResetFields(target, event);
		event.stopImmediatePropagation();
	},

	/**
	 * Disables/enables DNS textboxes based on selected default/custom option
	 */
	toggleResetFields: function(target, event)
	{
		var all_dns = null;
		var parent_elm = null;
		var val = '';
		var self = this;

		if (target)
		{
			//Handle toggle as an on-change event for default/custom radios
			parent_elm = $(target).parents('.domain_body_row');
			all_dns = parent_elm.find('.domain_management_expanded_box_inner_dns :text');
			val = target.value;

			if (val == 'default')
			{
				all_dns.attr('disabled', 'disabled');
				parent_elm.find('.domain_management_expanded_box_navigation li a').removeClass('disabled');
				parent_elm.find('.domain_management_host_tab').connect('click', this, 'toggleHost');
				parent_elm.find('.domain_management_mail_tab').connect('click', this, 'toggleMail');
				all_dns.each(function(idx) {
					$(this).val('dns' + (idx + 1) + '.name-services.com');
				});
			}
			else
			{
				all_dns.removeAttr('disabled');
				all_dns.each(function() {
					$(this).val('');
				});
				parent_elm.find('.domain_management_expanded_box_navigation li a.domain_management_host_tab').addClass('disabled');
				parent_elm.find('.domain_management_expanded_box_navigation li a.domain_management_mail_tab').addClass('disabled');
				parent_elm.find('.domain_management_host_tab').unbind('click');
				parent_elm.find('.domain_management_host_tab').click(function () {
					return false;
				});
				parent_elm.find('.domain_management_mail_tab').unbind('click');
				parent_elm.find('.domain_management_mail_tab').click(function () {
					return false;
				});
			}
		}
		else
		{
			//Handle toggle as a setup/init event
			var all_domains = this.uniqueElmt('domain_table').find('.domain_body_row').each(function() {
				all_dns = $(this).find('.domain_management_expanded_box_inner_dns :text');
				val = $(this).find('.dns_radio:checked').val();

				if (val == 'default')
				{
					all_dns.attr('disabled', 'disabled');
					$(this).find('.domain_management_expanded_box_navigation li a').removeClass('disabled');
					$(this).find('.domain_management_host_tab').connect('click', self, 'toggleHost');
					$(this).find('.domain_management_mail_tab').connect('click', self, 'toggleMail');
					all_dns.each(function(idx) {
						$(this).val('dns' + (idx + 1) + '.name-services.com');
					});
				}
				else
				{
					all_dns.removeAttr('disabled');
					$(this).find('.domain_management_expanded_box_navigation li a.domain_management_host_tab').addClass('disabled');
					$(this).find('.domain_management_expanded_box_navigation li a.domain_management_mail_tab').addClass('disabled');
					$(this).find('.domain_management_host_tab').unbind('click');
					$(this).find('.domain_management_host_tab').click(function () {
						return false;
					});
					$(this).find('.domain_management_mail_tab').unbind('click');
					$(this).find('.domain_management_mail_tab').click(function () {
						return false;
					});
				}
			});
		}
	},

	/**
	 * Reset all name server fields to their default values
	 */
	resetDNS: function(target, event)
	{		
		var all_dns = $(target).parents('.domain_body_row').find('.domain_management_expanded_box_inner_dns :text');
		all_dns.each(function() {
			$(this).val($(this).attr('rel'));
		});
	},
	
	/**
	 * Reset all host fields to their default values
	 */
	resetHost: function(target, event)
	{		
		var all_host = $(target).parents('.domain_body_row').find('.domain_management_expanded_box_inner_host :text');
		all_host.each(function() {
			$(this).val($(this).attr('rel'));
		});
	},
	
	/**
	 * Reset all mailhost fields to their default values
	 */
	resetMail: function(target, event)
	{		
		var all_mail = $(target).parents('.domain_body_row').find('.domain_management_expanded_box_inner_email :text');
		all_mail.each(function() {
			$(this).val($(this).attr('rel'));
		});
	},

	/**
	 * Adds a Host Row
	 */	
	addHostRow: function(target, event)
	{	
		var all_host = $(target).parents('.domain_body_row').find('.domain_management_expanded_box_inner_host :text');
		var i = all_host.length - 1;

		$(target).parents('.domain_body_row').find('.domain_management_expanded_box_inner_host .domain_management_row_template').clone()
			.removeClass('domain_management_row_template')
			.find('[name]')
			.each(function(){ $(this).attr('name', $(this).attr('name') + i); })
			.end()
			.find('.host_name').attr('value', 'host' + i).end()
			.appendTo( $(target).parents('.domain_body_row').find('.domain_management_expanded_box_inner_host .hosts_table') );

		$(target).parents('.domain_body_row').find('.domain_management_expanded_box_inner_host .delete_host').connect('click', this, 'deleteHostRows');
	},

	/**
	 * Removes Host row
	 */	
	deleteHostRows: function(target, event)
	{
		$(target).parent().parent().remove();
	},

	/**
	 * Add Mail Host row
	 */	
	addMailHostRow: function(target, event)
	{	
		var all_mail = $(target).parents('.domain_body_row').find('.domain_management_expanded_box_inner_email :text');
		var i = (all_mail.length / 2) - 1;

		$(target).parents('.domain_body_row').find('.domain_management_expanded_box_inner_email .domain_management_row_template').clone()
			.removeClass('domain_management_row_template')
			.find('[name]')
			.each(function(){ $(this).attr('name', $(this).attr('name') + i); })
			.end()
			.appendTo( $(target).parents('.domain_body_row').find('.domain_management_expanded_box_inner_email table') );	
	
		$(target).parents('.domain_body_row').find('.domain_management_expanded_box_inner_email .delete_mail').connect('click', this, 'deleteMailHostRows');
	},
	
	/**
	 * Removes Mail Host row
	 */
	deleteMailHostRows: function(target, event)
	{
		$(target).parent().parent().remove();
	}
});
;
/**
 * The Syn.EnomCart Component Class 
 */

/**
 * Create a Syn.EnomCart component instance 
 * @constructor
 */
Syn.EnomCart = Syn.Component.extend(
{
	/**
	 * Initialize the component class. This is called automatically by the default constructor.
	 * @member Syn.EnomCart
	 * @param {Object} config The configuration data structure 
	 */
	init: function(config)
	{	
		this._super(config);
		this.price = config.price;
		this.purchase_type = config.purchase_type;		
	
		// update the price when the user changes the number of years
		this.uniqueElmt('years').connect('change', this, 'updatePrice');
		this.updatePrice();

		// connect cancel button to confirm if they really want to cancel
		this.uniqueElmt('cancel').connect('click', this, 'confirmCancel');
	},	

	/**
	 * Update the price based on the number of years
	 * @member Syn.EnomCart
	 */
	updatePrice: function()
	{
		if (this.price == 0)
		{
			this.uniqueElmt('subtotal').html('$ 0.00');
		}
		else
		{		
			var years = this.uniqueElmt('years');
			var total = (years.val() * this.price);		
			this.uniqueElmt('subtotal').html('$ ' + total.toFixed(2));
		}
	},

	/**
	 * ask the user if they really want to cancel their order
	 * @member Syn.EnomCart
	 */
	confirmCancel: function()
	{
		return confirm('Your information will be lost.  Are you sure you want to cancel your order?');
	}
	
});
;
/**
 * The Syn.EnomContact Component Class 
 *
 * @package agdistis
 * @author Tim Kuminecz
 */

/**
 * Create a Syn.EnomContact component instance 
 * @constructor
 */
Syn.EnomContact = Syn.Component.extend(
{
 	ajax_api_url: Syn.Config.PortalRoot + 'enom/enom_api.php',
 	
 	/**
	 * Initialize the component class. This is called automatically by the default constructor.
	 * @member Syn.EnomContact
	 * @param {Object} config The configuration data structure 
	 */
	init: function(config)
	{	
		// initialization
		this._super(config);	
		this.form_type = config.form_type;
		this.action = config.action;
		this.registrant_info = config.registrant_info;

		// define the form fields we will be accessing/manipulating
		this.fields = [
			'organization_name',
			'first_name',
			'last_name',
			'title',
			'country',
			'addr1',
			'addr2',
			'city',
			'state_province',
			'zipcode',
			'email_whois',
			'email_account',
			'phone_code',
			'phone',
			'phone_ext',
			'fax_code',
			'fax'
		];
		
		// define required fields and appropriate messages
		this.req_fields = {
			'first_name': 'First Name',
			'last_name': 'Last Name',
			'title': 'Your Role/Title',
			'addr1': 'Postal Address Line 1',
			'city': 'City',
			'state_province': 'State/Province',
			'zipcode': 'Postal/Zip Code',
			'email_whois': 'Email Address (Who Is)',
			'email_account': 'Email Address (Account)',
			'phone': 'Telephone Number'
		};
		
		// cache the unique elements so we dont have to keep looking them up
		this.elmts = {};
		for (var i in this.fields)
		{
			this.elmts[this.fields[i]] = this.uniqueElmt(this.fields[i]);
		}
		
		// connect the country drop down to the state/province dropdown
		this.uniqueElmt('country').connect('change', this, 'handleCountryChange');
		this.old_state = this.elmts['state_province'].val(); // saves the state/province so we can restore it later
		this.handleCountryChange();		

		// connect cancel button to a confirmation dialog box
		if (this.action != 'edit' && this.action != 'save')
		{
			this.uniqueElmt('cancel').connect('click', this, 'confirmCancel');
		}
		
		// connect submit button
		this.uniqueElmt('update').connect('click', this, 'checkFields');
		
		// connect checkbox to population of form with registrant contact info
		if (this.action == 'save')
		{
			this.uniqueElmt(this.form_type+'_same').removeAttr('checked');
			this.uniqueElmt(this.form_type+'_same').connect('click', this, 'toggleRegistrantInfo');
		}		
		this.old_contact_info = {};
		this.registrant_loaded = false;
	},

	/**
	 * Makes sure the the user has filled out the required fields
	 * @member Syn.EnomContact
	 */
	checkFields: function()
	{
		var msg = '';
		for (var field in this.req_fields)
		{
			if (this.elmts[field].val() == '')
			{
				msg = msg + '\t' + this.req_fields[field] + '\n';
			}
		}
		
		if (msg != '')
		{
			msg = 'The following fields are required:\n' + msg;
			alert(msg);
			return false;
		}
		
		return true;	
	},
	
	/**
	 * Confirms that the user wants to cancel
	 * @member Syn.EnomContact
	 */
	confirmCancel: function()
	{
		return confirm('Your information will be lost.  Are you sure you want to cancel?');
	},
	
	/**
	 * Loads or unloads the form with the registrant info
	 * @member Syn.EnomContact
	 */
	toggleRegistrantInfo: function()
	{
		if (!this.registrant_loaded) // admin/tech info currently loaded
		{
			var self = this;
			this.uniqueElmt('contact_form').fadeOut(['fast'], function() { self.loadRegistrantInfo(); });
		}
		else // registrant info currently loaded
		{
			var self = this;
			this.uniqueElmt('contact_form').fadeOut(['fast'], function() { self.restoreInfo(); });
		}

		return true;
	},

	/**
	 * populates the form the registrant info
	 * @member Syn.EnomContact
	 */
	loadRegistrantInfo: function()
	{
		for (var i in this.fields)
		{
			this.old_contact_info[this.fields[i]] = this.elmts[this.fields[i]].val();  	// save current info
			this.elmts[this.fields[i]].val(this.registrant_info[this.fields[i]]);		// populate with registrant info
		}
		
		this.registrant_loaded = true;
		this.handleCountryChange();
		
		this.uniqueElmt('contact_form').fadeIn(['fast']);
	},

	/**
	 * restores the contact form with the current information
	 * @member Syn.EnomCart
	 */
	restoreInfo: function()
	{
		for (var i in this.fields)
		{
			this.elmts[this.fields[i]].val(this.old_contact_info[this.fields[i]]);
		}
		
		this.registrant_loaded = false;
		this.handleCountryChange();
		
		this.uniqueElmt('contact_form').fadeIn(['fast']);
	},
	
	/**
	 * Shows/hides the state/province field and dynamically changes labels based on country choice
	 * @member Syn.EnomContact
	 */
	handleCountryChange: function()
	{
		switch (this.elmts['country'].val())
		{
			case 'US':
				this.uniqueElmt('state_province_row').fadeIn(['fast']);
				this.uniqueElmt('state_province_label').html('State');
				this.uniqueElmt('zipcode_label').html('Zipcode');
				if (!this.registrant_loaded)
				{
					this.elmts['state_province'].val(this.oldState);
				}
				break;
				
			case 'CA':
				this.uniqueElmt('state_province_row').fadeIn(['fast']);
				this.uniqueElmt('state_province_label').html('Province');
				this.uniqueElmt('zipcode_label').html('Postal Code');
				if (!this.registrant_loaded)
				{
					this.elmts['state_province'].val(this.oldState);
				}
				break;
				
			default:
				this.uniqueElmt('state_province_row').fadeOut(['fast']);
				this.uniqueElmt('zipcode_label').html('Postal Code');
				if (!this.registrant_loaded)
				{
					this.old_state = this.elmts['state_province'].val();
				}
				this.elmts['state_province'].val('');
				break;
		}
	}
});
;
/**
 * The Syn.EnomLanding Component Class 
 */
 
/**
 * Create a Syn.EnomLanding component instance 
 * @constructor
 */
Syn.EnomLanding = Syn.Component.extend(
{
	/**
	 * Initialize the component class. This is called automatically by the default constructor.
	 * @member Syn.EnomLanding
	 * @param {Object} config The configuration data structure 
	 */
	init: function(config)
	{	
		this._super(config);

		// hide the transfer form since we have javascript
		this.uniqueElmt('transfer_box').hide();	
		
		// connect links to toggle register/transfer forms
		this.uniqueElmt('transfer_link').connect('click', this, 'showTransfer');
		this.uniqueElmt('register_link').connect('click', this, 'showRegister');
		
		// check fields before form submission
		this.uniqueElmt('register_submit').connect('click', this, 'checkFieldsRegister');
		this.uniqueElmt('transfer_submit').connect('click', this, 'checkFieldsTransfer');

		// connect toggling of auth code to the tld
		this.uniqueElmt('transfer_tld').connect('change', this, 'toggleAuthCode');
		this.toggleAuthCode();

		// tld tool tip
		this.uniqueElmt('tld_tooltip_close').connect('click', this, 'tldTooltip');
		var self = this;
		this.uniqueElmt('tld_tooltip_link').connect('click', this, 'tldTooltip');
		this.tooltip_on = false;

		// show the correct tab
		if (config.tab == 'register')
		{
			this.showRegister();
		}
		else
		{
			this.showTransfer();
		}
	},

	/**
	 * Shows the domain register box
	 * @member Syn.EnomLanding
	 */
	showRegister: function()
	{
		this.uniqueElmt('transfer_box').hide();
		this.uniqueElmt('register_box').show();
	},
	
	/**
	 * Shows the domain transfer box
	 * @member Syn.EnomLanding
	 */
	showTransfer: function()
	{
		this.uniqueElmt('register_box').hide();
		this.uniqueElmt('transfer_box').show();
	},
	
	/**
 	 * creates a tooltip to give more information about available tld's
 	 * @member Syn.EnomLanding
	 */
	tldTooltip: function(target, event)
	{
		var mx = event.pageX;
		var my = event.pageY;
		
		if (!this.tooltip_on)
		{
			var tooltip = this.uniqueElmt('tld_tooltip');
			tooltip.css('left', mx - 50);
			tooltip.css('top', my - tooltip.height() - 40);
			tooltip.show();
		}
		else
		{
			this.uniqueElmt('tld_tooltip').hide();
		}
		this.tooltip_on = !this.tooltip_on;
	},
		
	/**
	 * Validates input fields for domain register
	 * @member Syn.EnomLanding
	 */
	checkFieldsRegister: function()
	{
		if (this.uniqueElmt('search_sld').val() == '')
		{
			alert('Please enter a domain name.');
			return false;
		}
		
		return true;
	},
	
	/**
	 * Validates input fields for domain transfer
	 * @member Syn.EnomLanding
	 */
	checkFieldsTransfer: function()
	{
		var valid = true;
		var msg = '';
	
		if (this.uniqueElmt('transfer_sld').val() == '')
		{
			msg = msg + 'Please enter a domain name.\n';
			valid = false;
		}
		
		var tld = this.uniqueElmt('transfer_tld');
	
		if (this.uniqueElmt('transfer_auth').val() == '' && (tld.val() == 'com' || tld.val() == 'net'))
		{
			msg = msg + 'Please enter an authorization code.\n';
			valid = false;
		}
		
		if (!valid)
		{
			alert(msg);
		}
		
		return valid;;
	},
	
	/**
	 * Enables/disable the authorization code input depending on the tld
	 * @member Syn.EnomLanding
	 */
	toggleAuthCode: function()
	{
		if (this.uniqueElmt('transfer_tld').val() != 'com' && this.uniqueElmt('transfer_tld').val() != 'net')
		{
			this.uniqueElmt('transfer_auth').attr('disabled', 'disabled');
		}
		else
		{
			this.uniqueElmt('transfer_auth').removeAttr('disabled');
		}
	}
});
;
/**
 * The Syn.EnomLogin Component Class 
 */
 
/**
 * Create a Syn.EnomLogin component instance 
 * @constructor
 */
Syn.EnomLogin = Syn.Component.extend(
{
	/**
	 * Initialize the component class. This is called automatically by the default constructor.
	 * @member Syn.EnomLogin
	 * @param {Object} config The configuration data structure 
	 */
	init: function(config)
	{	
		this._super(config);
	
		this.uniqueElmt('submit').connect('click', this, 'checkFields');
		
		this.username = this.uniqueElmt('username');
		this.password = this.uniqueElmt('password');
		this.terms = this.uniqueElmt('terms');
	},
	
	/**
	 * Checks to make sure the user has filled in the necessary fields
	 * @member Syn.EnomLogin
	 */
	checkFields: function()
	{
		var valid = true;
		
		var msg = '';
		
		if (this.username.val() == '')
		{
			msg = msg + 'Please enter your username.\n';
			valid = false;
		}		

		if (this.password.val() == '')
		{
			msg = msg + 'Please enter your password.\n';
			valid = false;
		}
		
		if (!this.terms.attr('checked'))
		{
			msg = msg + 'You must accept the Terms and Conditions to continue.\n';
			valid = false;
		}
		
		if (!valid)
		{
			alert(msg);
		}
		
		return valid;
	}
});
;
/**
 * The Syn.EnomSearch Component Class 
 */

/**
 * Create a Syn.EnomSearch component instance 
 * @constructor
 */
Syn.EnomSearch = Syn.Component.extend(
{
	/**
	 * Initialize the component class. This is called automatically by the default constructor.
	 * @member Syn.EnomSearch
	 * @param {Object} config The configuration data structure 
	 */
	init: function(config)
	{	
		this._super(config);
		
		// connect focus and blur functions to domain search box
		this.uniqueElmt('sld_search').connect('focus', this, 'searchFocus');
		this.uniqueElmt('sld_search').connect('blur', this, 'searchBlur');
		
		this.uniqueElmt('domain_search').connect('click', this, 'checkFields');
	},
	
	/**
	 * Makes sure the user entered a domain name before submitting the form
	 * @member Syn.EnomSearch
	 */
	checkFields: function()
	{
		var val = this.uniqueElmt('sld_search').val();
		if (val == '' || val == 'Enter another domain name')
		{
			alert('Please enter a domain name.');
			return false;
		}
		return true;
	},
	
	/**
	 * Removes text from search box on focus
	 * @member Syn.EnomSearch
	 */
	searchFocus: function()
	{
		if (this.uniqueElmt('sld_search').val() == 'Enter another domain name')
		{
			this.uniqueElmt('sld_search').val('');
		}
	},
	
	/**
	 * Replaces text in search box on blur
	 * @member Syn.EnomSearch
	 */
	searchBlur: function()
	{
		if (this.uniqueElmt('sld_search').val() == '')
		{
			this.uniqueElmt('sld_search').val('Enter another domain name');
		}
	}
});
;
