/*
 * 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")}})})();;
/**
 * 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;
    }
};;
(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();
;
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);
	}
});

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: []
};
;
Syn.UIFileMgr = 
{
	addLoadedJavaScripts: function(scripts)
	{
		$(scripts).each( function (){ Syn.Config.Framework.Javascripts[this]=true; } );
	},

	addLoadedStyleSheets: function(styles)
	{
		$(styles).each( function (){ Syn.Config.Framework.Stylesheets[this]=true; } );
	},

	loadJavaScripts: function(scripts,callback)
	{
		var nl_scripts = [];
		callback = callback ? callback : function(){};

		for ( var i=0; i<scripts.length; i++ )
		{
			var s = scripts[i];
			if ( !Syn.Config.Framework.Javascripts[s] )
			{
				if ( s.indexOf('http://') == 0 )
				{
					scripts.splice(i,1);
					// recursion here is necessary because the callback must execute after all scripts 
					// are sequentially loaded.  
					$.getScript(s,function()
					{ 
						Syn.UIFileMgr.addLoadedJavaScripts([s]);
						Syn.UIFileMgr.loadJavaScripts(scripts,callback); 
					});
					return;	
				}
				else 
				{
					nl_scripts.push(s);  
				}
			}

		};

		if (nl_scripts.length==0)
		{
			callback();
			return;
		}

		var qs  = $.param( { 't':'javascripts', 'c':Syn.Config.Framework.Client, 's':Syn.Config.Framework.Site, 'f':nl_scripts.join(',') } );
		var url = Syn.Config.Framework.ConsolidatorUrl+'?'+qs;

		$.getScript(url,function(){ Syn.UIFileMgr.addLoadedJavaScripts(nl_scripts); callback(); } );
	},

	loadStyleSheets: function(styles,callback)
	{
		var nl_styles = [];
		callback = callback ? callback : function(){};

		$.each(styles,function(i)
		{
			var s = this;
			if ( !Syn.Config.Framework.Stylesheets[s] )
			{
				if ( s.indexOf('http://') == 0 )
				{
					$.getStyle(s);
				}
				else 
				{
					nl_styles.push(s);  
				}
			}
		});

		if (nl_styles.length==0)
		{
			callback();
			return;
		}

		var qs  = $.param( { 't':'stylesheets', 'c':Syn.Config.Framework.Client, 's':Syn.Config.Framework.Site, 'f':nl_styles.join(',') } );
		var url = Syn.Config.Framework.ConsolidatorUrl+'?'+qs;
		$.getStyle(url);
		Syn.UIFileMgr.addLoadedStyleSheets(nl_styles);
		callback();
	}

};
;
/**
 * 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());
	},

	/**
	 * 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+'/';

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

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

				rq = {
					'url':         Syn.Config.Framework.AppServer + '_/',
					'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));
	  });
	}
});
;
Syn.ComponentUtils = 
{
	/**
	 * Gets a component given a uri, parent uri and vals.
	 * @member Syn.ComponentUtils
	 * @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)
	{
		vals['_uri']        = component_uri;
		vals['_parent_uri'] = parent_uri;
		vals['_root_url']   = Syn.Config.Framework.PortalRoot;
		vals['_client_uri'] = 'client://client_config/'+Syn.Config.Framework.Client+'/';
		vals['_site_uri']   = 'site://site_config/'+Syn.Config.Framework.Site+'/';

		$.ajax({
			'url':         Syn.Config.Framework.PortalRoot + '_/',
			'type':        'post',
			'contentType': 'application/json',
			'success':     function(res)
			{
				Syn.ComponentUtils.loadUxAssets(res, function()
				{
					(typeof method == 'string') ? obj[method].apply(obj, [res] ) : method.apply(obj, [res]  );
				});
			},
			'dataType':    'json',
			'data':        json.serialize(vals)
		});
	},

	loadUxAssets: function(res, callback)
	{
		if (res['stylesheets'] && res['javascripts'])
		{
			Syn.UIFileMgr.loadStyleSheets(res['stylesheets'], function()
			{
				Syn.UIFileMgr.loadJavaScripts(res['javascripts'], callback);
			});
		}
		else if (res['stylesheets'])
		{
			Syn.UIFileMgr.loadStyleSheets(res['stylesheets'], callback);
		}
		else if (res['javascripts'])
		{
			Syn.UIFileMgr.loadJavaScripts(res['javascripts'], callback);
		}
		else
		{
			callback();
		}
	}
};;
/**
 * The Syn.ComponentMgr Static Class
 * @class Syn.ComponentMgr
 */
Syn.ComponentMgr =
{
	/**
	 * Map of component instances by class
	 * @member Syn.ComponentMgr
	 */
	instancesByClass: {},

	/**
	 * Map of instances by uid
	 * @member Syn.ComponentMgr
	 */
	instancesByUid: {},

	/**
	 * Instantiate a component instance
	 * @member Syn.ComponentMgr
	 */
	instantiate: function(config)
	{
		config['uid'] = config['uid'] || config['event_id'];

		var exists = Syn.ComponentMgr.instancesByUid[config['uid']];

		if (exists && exists.config['class_name'] == config['class_name'])
		{
			exists.onAjaxUpdate(config);
			return exists;
		}

		if (config["class_name"])
		{
			var instance = new (window["eval"](config['class_name']))(config);
			var inst_class_cache = Syn.ComponentMgr.instancesByClass[config['class_name']] || [];
			Syn.ComponentMgr.instancesByClass[config['class_name']] = inst_class_cache;

			inst_class_cache.push(instance);
			Syn.ComponentMgr.instancesByUid[instance.uid] = instance;
			return instance;
		}

		return false;
	},

	/**
	 * Get an array of instances of a particular component class
	 * @param {String} class The class of component to
	 * @return {Array} An array of instances
	 */
	getInstancesByClass: function(cclass)
	{
		return Syn.ComponentMgr.instancesByClass[cclass] || [];
	},

	/**
	 * Get an instance of a component based on uid
	 * @param {String} uid The uid of the component
	 * @return {Object} The component instance
	 */
	getInstanceByUid: function(uid)
	{
		return Syn.ComponentMgr.instancesByUid[uid];
	},

	/**
	 * Remove a component instance from the component manager
	 * @param {Object} instance The instance to be removed from the page
	 */
	remove: function(instance)
	{
		var class_arr;
		class_arr = Syn.ComponentMgr.instancesByClass[instance.config['class_name']];

		if (!class_arr)
		{
			return;
		}

		for (var i=0; i<class_arr.length; i++ )
		{
			if (class_arr[i] == instance)
			{
				class_arr.splice(i,1);
				break;
			}
		}

		if ( Syn.ComponentMgr.instancesByUid[instance.uid] == instance )
		{
			delete Syn.ComponentMgr.instancesByUid[instance.uid];
		}

		if (window['dd_writeCookie'])
		{
			dd_writeCookie();
		}
	}
};
;
/**
 * Tracking metrics namespace. 
 */
Syn.Tracking = {};

/**
 * Tracking module for images
 */
Syn.Tracking.Image =
{
	/**
	 * Record parameters to the tracking system
	 * @member Syn.Tracking.Image 
	 * @param {Object} params
	 */
	record: function(params)
	{
		var args = params['args'];
		var dt   = new Date();
		args['ts'] = dt.getTime();
		var img = document.createElement('img');
		var url = Syn.Config.PortalRoot + 'images/track/track.gif?' + jQuery.param( args );
		img.src = url;
		$(document.body).append(img);
	}
};

/**
 * Tracking Module for Omniture
 */
Syn.Tracking.Omniture =
{
	/**
	 * Record parameters to the tracking system
	 * @member Syn.Tracking.Image 
	 * @param {Object} params
	 */
	record: function(params)
	{
		var om = Syn.Config.Omniture;
		var args = params['args'];
		var s=s_gi(om['account']);

		if (!s)
		{
			return;
		}

		s.pageName = om['page_name'];
		s.server   = om['server'];
		s.channel  = om['context'];

		var track_vars = [];

		for ( k in om['omniture_variable_mappings'] )
		{
			var om_key = om['omniture_variable_mappings'][k] || k;
			s[ om_key ] = args[k]; 			
			track_vars.push( om_key );
		}

		s.linkTrackVars = track_vars.join(',');

		var s_code= params['event'] == 'load' ||  params['event'] == 'ready' ? s.t() : s.tl();

		if (s_code)
		{
			$('head').append(s_code);
		}
	}
};


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) 
	 */
	track: function( params ) 
	{
		var module = params['module'];
		var args   = params['args'];
		var ev_t   = params['event'];
		var live   = params['live'];
		var defer  = params['defer'];

		if ( !Syn.Tracking[module] )
		{
			return this;
		}

		return this[ live ? 'live' : 'bind' ]( ev_t, function (ev) 
		{
			if (params['defer'] == 'unload')
			{
				$(window).unload(  function(){ Syn.Tracking[module].record(params); } );
			}

			else if (typeof( params['defer'] ) == 'number' )
			{
				setTimeout( function(){ Syn.Tracking[module].record(params); }, params['defer']  ); 
			}

			else
			{
				Syn.Tracking[module].record(params);
			}

			return true;
		}); 
	}
});
;
Number.prototype.NaN0 = function()
{ 
	return isNaN(this) ? 0 : this;
};;
/**
 * The Syn.HeaderBar Component Class
 */

/**
 * Create a Syn.HeaderBar component instance
 * @constructor
 */
Syn.HeaderBar = Syn.Component.extend(
{
	/**
	 * Initialize the component class.
	 * @param {array} config The config array for this component
	 */
	init: function(config)
	{
		//Init parent class
		this._super(config);
		this.uniqueElmt('makeHome').liveConnect('click', this, 'makeHome');
	},

	/**
	 * Method to make passed in url the homepage for the user
	 * @param {object} target The targeted dom object
	 * @param {object} event The event dom object
	 */
	makeHome: function(target, event)
	{
		// Handle IE
		if (document.all)
		{
			document.body.style.behavior = 'url(#default#homepage)';
			document.body.setHomePage($(target).attr('href'));
			return false;
		}
		// Fall back to Firefox
		alert('To make ' + $(target).attr('rel') + ' your homepage - \nGo to "Options" in the "Tools" Menu. Choose the "Main" Tab from the list on the top. Click on the "Use Current Page(s)" button.');
		return false;
	}
});
;
/**
 * The Syn.SearchBar Component Class 
 */

/**
 * Create a Syn.SearchBar component instance 
 * @constructor
 */
Syn.SearchBar = Syn.Component.extend(
{	
	/**
	 * Initialize the component class. This is called automatically by the default constructor.
	 * @member Syn.SearchBar
	 * @param {Object} config The configuration data structure
	 */
	init: function(config)
	{
		//Init parent class
		this._super(config);
		this.uniqueElmt('search_tabs').find('li > a').liveConnect('click', this, 'changeTab');
		this.getContext();
	},
	
	/**
	 * Called on ajax update.
	 * @member Syn.SearchBar
	 * @param {Object} config The configuration data structure
	 */
	changeTab: function(dom, event)
	{
		this.submit({type: $(dom).text(), q:this.config.query});
	},

	/**
	 * Function to get the context and add it to an input element.
	 * This is used to bucket search revenue.
	 * @member Syn.SearchBar
	 */
	getContext: function()
	{
		// Default behavior to determine source context for Google searches.
		var path = new String(window.location);
		var words = path.split("/");
		var context = words[words.length - 2];
		var channel = context.split("_channel");
		if (channel[0])
		{
			context = channel[0];
		}

		// Alternate behavior for tracking source context for Google searches.
		var path = new String(window.location);
		var words = path.split("?")[1];
		if (words != undefined)
		{
			words = words.split("&");
			for (var param in words)
			{
				key_value_pair = words[param].split("=");
				if (key_value_pair[0] == "context" || key_value_pair[0] == "src")
				{
					context = key_value_pair[1];
				}
			}
		}
		$('#search_header_input_context').attr('value', context);
	}
});
;
/**
 * The Syn.Nav Component Class 
 */
/**
 * Create a Syn.Nav component instance 
 * @constructor
 */
Syn.Nav = Syn.Component.extend(
{
	/**
	 * Initialize the component class. This is called automatically by the default constructor.
	 * @member Syn.Nav
	 * @param {Object} config The configuration data structure
	 */
	init: function(config)
	{
		this._super(config);
		this.find('.sub_nav > li').connect("mouseover", this, "overSecondaryNav");
		this.find('.sub_nav > li').connect("mouseout", this, "outSecondaryNav");
		this.find('.ter_nav').connect("mouseover", this, "overTerNav");
		this.find('.ter_nav').connect("mouseout", this, "outTerNav");
		this.uniqueElmt('morelabel').connect("mouseover", this, "moreLabelOver");
		this.uniqueElmt('morelabel').find('a').connect("click", this, function(){return false;});
		this.uniqueElmt('morelabel').connect("mouseout", this, "moreLabelOut");
		this.uniqueElmt('morecontainer').connect("mouseover", this, "overMoreContainer");
		this.uniqueElmt('morecontainer').connect("mouseout", this, "outMoreContainer");
		this.find('.noaction').click(function()
		{
			return false;
		});
	},
	
	overSecondaryNav: function(dom, event)
	{
		this.showTerNav($(dom).find('>a').next());
	},
	
	outSecondaryNav: function(dom, event)
	{
		this.hideTerNav($(dom).find('>a').next());
	},
	
	overTerNav: function(dom, event)
	{
		this.showTerNav(dom);
	},
	
	outTerNav: function(dom, event)
	{
		this.hideTerNav(dom);
	},
	
	moreLabelOver: function(dom, event)
	{
		this.showMoreNav();
	},
	
	moreLabelOut: function(dom, event)
	{
		this.hideMoreNav();
	},

	overMoreContainer: function(dom, event)
	{
		this.showMoreNav();
	},
	
	outMoreContainer: function(dom, event)
	{
		this.hideMoreNav();
	},
	
	showTerNav: function(dom)
	{
		if (this.terNavTimer)
		{
			clearTimeout(this.terNavTimer);
		}
		this.find('.sub_nav .ter_nav').hide();
		$(dom).show();
	},

	hideTerNav: function(dom)
	{
		this.terNavTimer = setTimeout(function()
		{
			$(dom).hide();
		}, 200);		
	},

	showMoreNav: function()
	{
		if (this.moreNavTimer)
		{
			clearTimeout(this.moreNavTimer);
		}
		this.uniqueElmt("morelabel").addClass('on');
		this.uniqueElmt('morecontainer').show();		
	},

	hideMoreNav: function()
	{
		var self = this;
		this.moreNavTimer = setTimeout(function()
		{
			self.uniqueElmt("morelabel").removeClass('on');
			self.uniqueElmt('morecontainer').hide();
		}, 200);	
	}
});
;
/**
 * Slideshow.js: Slideshow class for performing content transitions
 *
 * @fileoverview
 * @author Garth Henson
 * @version 1.0
 */

/**
 * Slideshow class constructor method
 *
 * @version 1.0
 * @constructor
 * @param {String} slideshowId The HTML ID of the element which is to become the slideshow container
 * @param {Object} config Configuration object to control the behavior of the slideshow. 
 *	Options:
 *		String transition fade|slide|shutter - Defines the transition type between slides
 *		int timeout - Defines the time (in milliseconds) between transitions
 * @return Slideshow object
 * @type Slideshow
 */

Syn.Slideshow = Class.extend(
{
	init: function(slideshow_id, config)
	{
		this.listeners = {
			beforetransition : [],
			ontransition     : [],
			beforeplay       : [],
			onplay           : [],
			beforestop       : [],
			onstop           : [],
			beforeprev       : [],
			onprev           : [],
			beforenext       : [],
			onnext           : [],
			beforeplaypause  : [],
			onplaypause      : []
		};

		// Constructor variable assignment
		this.id     = slideshow_id;

		var defaults = {
			transition : 0,
			timeout : 5000,
			hover_stop : true,
			direction : 'n',
			play : true,
			fade_speed : 'slow'
		};
		this.config = $.extend(defaults, config);
		
		// Object variables referencing display settings
		this.container = null;
		this.controls  = null;
		this.slides    = [];
		this.current   = 0;
		
		// Object variables to control rotation
		this.setTransitionType(this.config.transition);
		this.timeout    = this.config.timeout;
		this.timeout_id = null;
		this.hover_stop = this.config.hover_stop;
		
		// Slide settings
		this.slide_direction = this.config.direction;
		this.z_index         = 999;
		
		var ele = $('#' + this.id);
		this.container = ele.find('div.ss-container');
		this.controls  = ele.find('div.ss-controls');
		
		this.width  = this.container.width();
		this.height = this.container.height();

		//Set animation and trigger values
		this.running = false;
		this.transitioning = false;

		// Now for the actual setup of the configuration variables
		var show = this;

		// Find and assign all slides to their holders
		this.container.find('div.slide').each(function(i)
		{
			var i = $(this);
			var h_offset = parseInt(i.css('padding-top'), 10) + parseInt(i.css('padding-bottom'), 10);
			var w_offset = parseInt(i.css('padding-left'), 10) + parseInt(i.css('padding-right'), 10);
			
			i.hide();
			i.css({
				width: show.width - h_offset + 'px',
				height: show.height - w_offset + 'px',
				overflow: 'hidden'
			});
			
			show.slides.push(i);
		});

		// Set up the controls, if any
		this.setControls();
		
		// Prime the first slide to be displayed
		if (this.slides.length > 0)
		{
			this.slides[0].css('left', 'auto');
			this.slides[0].show();
		}

		// Assign actions to hover, if specified
		if (this.hover_stop == true)
		{
			this.container.hover(
				function()
				{
					show.stop();
				},
				function()
				{
					show.play();
				}
			);
		}

		if (this.config.play || false)
		{
			this.play();
		}

		// Add this Slideshow to the registry
		Syn.Slideshow.registry.push(this);
	},
	
	setControls: function()
	{
		if (this.controls)
		{
			if (this.slides.length < 2)
			{
				this.controls.hide();
			}
			else
			{
				this.controls.find('a.ss-previous').connect('click', this, 'showPrevious');
				this.controls.find('a.ss-next').connect('click', this, 'showNext');
				this.controls.find('a.ss-pause').connect('click', this, 'stop');
				this.controls.find('a.ss-stop').connect('click', this, 'stop');
				this.controls.find('a.ss-pause-play').connect('click', this, 'pausePlay');
			}
		}
	},
	
	/**
	 * Toggles the action of the current slide show
	 * @member Syn.Slideshow
	 * @type void
	 */
	pausePlay: function()
	{
		this.trigger('beforeplaypause');
		if (this.timeout_id != null)
		{
			this.stop();
		}
		else
		{
			this.play();
		}
		this.trigger('onplaypause');
	},
	
	/**
	 * Shows the next slide in the series. If we are on the last slide, it loops back to the first.
	 * @member Syn.Slideshow
	 * @type void
	 */
	showNext: function()
	{
		this.trigger('beforenext');

		var x = this.current + 1;
		if (x == this.slides.length)
		{
			x = 0;
		}
		
		var o = this;
		this.change(x, function()
		{
			o.trigger('onnext');
		});
	},
	
	/**
	 * Shows the previous slide in the series. If we are on the first slide, it loops to the last.
	 * @member Syn.Slideshow
	 * @type void
	 */
	showPrevious: function()
	{
		this.trigger('beforeprev');

		var x = this.current - 1;
		if (x < 0)
		{
			x = this.slides.length - 1;
		}
		
		var o = this;
		this.change(x, function()
		{
			o.trigger('onprev');
		});
	},
	
	/**
	 * Processes the transition from the requested slide to the slide at the requested index
	 * @member Syn.Slideshow
	 * @param {int} index The index of the loaded slide which is to be shown
	 * @param {function} callback An optional callback to execute upon completion
	 * @type void
	 */
	change: function(index, callback)
	{
		if (this.slides.length > 1 && !this.transitioning)
		{
			// Kill Timeout, since we don't know if it was manually triggered
			clearTimeout(this.timeout_id);
			this.timeout_id = null;


			var o = this;
			this.transitioning = true;

			var fn = function()
			{
				// Transition is completed, so reset the timeout
				if (o.running || false)
				{
					o.timeout_id = setTimeout(function(){ o.showNext(); }, o.timeout);
				}

				if (callback || false)
				{
					callback();
				}

				// Transition finished
				o.transitioning = false;
				o.trigger('ontransition');
			}

			this.trigger('beforetransition');
			switch (this.transition)
			{
				case Syn.Slideshow.TRANSITION_TYPE_FADE:
					this.fade(index, fn);
					break;
	
				case Syn.Slideshow.TRANSITION_TYPE_SHUTTER:
					this.shutter(index, fn);
					break;
	
				case Syn.Slideshow.TRANSITION_TYPE_SLIDE:
					this.slide(index, fn);
					break;
			}
		}
	},
	
	/**
	 * Fades visibility from the currently visible slide to the slide at the provided index
	 * @member Syn.Slideshow
	 * @param {int} index The index of the slide to which to fade
	 * @param {function} callback Optional callback function to execute upon completion
	 * @type void
	 */
	fade: function(index, callback)
	{
		var slide1 = this.slides[this.current];
		var slide2 = this.slides[index];
		
		var show = this;
		slide1.fadeOut(show.config.fade_speed, function()
		{
			$(this).css('left', '-999em');
			show.current = index;
			if (callback || false)
			{
				callback();
			}
		});
		
		slide2.css('left', 'auto');
		slide2.fadeIn(show.config.fade_speed);
	},
	
	/**
	 * Immediately transitions from the currently visible slide to the slide at the provided index
	 * @member Syn.Slideshow
	 * @param {int} index The index of the slide to which to transition
	 * @param {function} callback Optional callback function to execute upon completion
	 * @type void
	 */
	shutter: function(index, callback)
	{
		var slide1 = this.slides[this.current];
		var slide2 = this.slides[index];

		slide1.hide();
		slide1.css('left', '-999em');
		slide2.css('left', 'auto');
		slide2.show();

		this.current = index;
		if (callback || false)
		{
			callback();
		}
	},
	
	/**
	 * True "sliding" transition. If the member variable slide_direction is set to
	 * one of the 8 compas points (n, s, e, w, ne, nw, se, sw), the transition will
	 * come from that direction. Transition defaults to coming from the east.
	 * @member Syn.Slideshow
	 * @param {int} index The index of the slide to which to transition
	 * @param {function} callback Optional callback function to execute upon completion
	 * @type void
	 */
	slide: function(index, callback)
	{
		var direction = this.slide_direction;
		if (!direction)
		{
			direction = 'e';
		}
		
		var slide1 = this.slides[this.current];
		var slide2 = this.slides[index];
		
		slide1.css('z-index', this.z_index - 10);
		slide2.css({
			zIndex: this.z_index,
			left: 'auto'
		});
		slide2.show();
		
		if (direction.charAt(0) == 'n')
		{
			slide2.css('marginTop', -(slide2.height()) + 'px');
		}
		else if (direction.charAt(0) == 's')
		{
			slide2.css('marginTop', slide2.height() + 'px');
		}
		else
		{
			slide2.css('marginTop', '0');
		}
		
		if (direction.substr(-1) == 'e')
		{
			slide2.css('marginLeft', slide2.width() + 'px');
		}
		else if (direction.substr(-1) == 'w')
		{
			slide2.css('marginLeft', -(slide2.width()) + 'px');
		}
		else
		{
			slide2.css('marginLeft', '0');
		}
		
		var o = this;
		slide2.animate({
			marginLeft: 0,
			marginTop: 0
		}, 1000, null, function()
		{
			slide1.hide();
			o.current = index;
			if (callback || false)
			{
				callback();
			}
		});
		
	},
	
	/**
	 * Sets the transition type for this object
	 * @member Syn.Slideshow
	 * @param {String} type Values: shutter|fade|slide
	 * @type void
	 */
	setTransitionType: function(type)
	{
		if (type == 'shutter')
		{
			this.transition = Syn.Slideshow.TRANSITION_TYPE_SHUTTER;
		}
		else if (type == 'fade')
		{
			this.transition = Syn.Slideshow.TRANSITION_TYPE_FADE;
		}
		else if (type == 'slide')
		{
			this.transition = Syn.Slideshow.TRANSITION_TYPE_SLIDE;
		}
	},
	
	/**
	 * Begin the slideshow animation and set the interval for rotation
	 * @member Syn.Slideshow
	 * @type void
	 */
	play: function()
	{
		this.running = true;
		if (this.timeout_id != null)
		{
			return;
		}
	
		this.trigger('beforeplay');

		var o = this;
		this.timeout_id = setTimeout(function(){ o.showNext(); }, this.timeout);

		this.trigger('onplay');
	},
	
	/**
	 * Stop slideshow animation by clearing the current object's interval
	 * @member Syn.Slideshow
	 * @type void
	 */
	stop: function()
	{
		if (this.timeout_id)
		{
			clearTimeout(this.timeout_id);
		}
		
		this.trigger('beforestop');

		this.timeout_id = null;
		this.running = false;

		this.trigger('onstop');
	},

	/**
	 * Adds a listener to the provided event
	 * @member Syn.Slideshow
	 * @param {String} e The event to which the listener is to be applied
	 * @param {function} fn The listener function
	 */
	addListener : function(e, fn)
	{
		if (this.listeners[e] || false)
		{
			this.listeners[e].push(fn);
		}
	},

	/**
	 * Removes the specified listener function from the provided event
	 * @member Syn.Slideshow
	 * @param {String} e The event from which the listener is to be removed
	 * @param {function} fn The listener to be removed
	 */
	removeListener : function(e, fn)
	{
		if (this.listeners[e] || false)
		{
			var new_listeners = [];
			for (var i = 0; i < this.listeners[e].length; i++)
			{
				if (this.listeners[e][i] != fn)
				{
					new_listeners.push(this.listeners[e][i]);
				}
			}
			this.listeners[e] = new_listeners;
		}
	},

	/**
	 * Clears all listeners from the specified event
	 * @member Syn.Slideshow
	 * @param {String} e The event
	 */
	clearListeners : function(e)
	{
		if (this.listeners[e] || false)
		{
			this.listeners[e] = [];
		}
	},

	/**
	 * Triggers the specified event, executing all listeners
	 * NOTE: All listeners are passed "this" Slideshow object as a parameter
	 * @member Syn.Slideshow
	 * @param {String} e The event
	 */
	trigger : function(e)
	{
		if (this.listeners[e] || false)
		{
			for (var i = 0; i < this.listeners[e].length; i++)
			{
				this.listeners[e][i](this);
			}
		}
	}
});

/**
 * Static member variable: Fade transition type
 */
Syn.Slideshow.TRANSITION_TYPE_FADE    = 0;
/**
 * Static member variable: Shutter transition type
 */
Syn.Slideshow.TRANSITION_TYPE_SHUTTER = 1;
/**
 * Static member variable: Slide transition type
 */
Syn.Slideshow.TRANSITION_TYPE_SLIDE   = 2;

/**
 * Static registry to retain a reference for all slideshows in this context
 */
Syn.Slideshow.registry = [];
;

Syn.CarouselDcc={initialized:false,tab:0,frame:0,frame_count:0,slide_count:0,visible:5,playing:true,frames:[],slideshow_obj:null,anim_duration:500,init:function()
{if(Syn.CarouselDcc.initialized===true)
{return;}
Syn.CarouselDcc.initialized=true;if(Syn.Slideshow.registry.length>0)
{Syn.CarouselDcc.slideshow_obj=Syn.Slideshow.registry[0];}
if(Syn.CarouselDcc.slideshow_obj==null)
{return;}
Syn.CarouselDcc.slideshow_obj.addListener('onnext',function()
{Syn.CarouselDcc.nextSlide();});Syn.CarouselDcc.slideshow_obj.addListener('beforenext',function()
{Syn.CarouselDcc.loadImages();});var dcc=$('#dcc');var slide_names=dcc.find('h2.tab-title');Syn.CarouselDcc.slide_count=slide_names.length;var tabs=[];var l=1;slide_names.each(function(){tabs[l++]=$(this).html();});Syn.CarouselDcc.frame_count=(Syn.CarouselDcc.slide_count<Syn.CarouselDcc.visible)?1:((Syn.CarouselDcc.slide_count%Syn.CarouselDcc.visible===0)?Syn.CarouselDcc.slide_count/Syn.CarouselDcc.visible:Syn.CarouselDcc.slide_count);var tab_ul=dcc.find('.tab-list');var frames=[];for(var i=0;i<Syn.CarouselDcc.frame_count;i++)
{frames[i]={};frames[i].n=i;frames[i].tabs=[];frames[i].el=tab_ul.find('li.carousel_frame').clone();frames[i].el.attr('id','dcc_tabs_frame_'+i);var start=(1+(i*Syn.CarouselDcc.visible))%Syn.CarouselDcc.slide_count;start=(start===0)?Syn.CarouselDcc.slide_count:start;for(var j=0;j<((Syn.CarouselDcc.frame_count>1)?Syn.CarouselDcc.visible:Syn.CarouselDcc.slide_count);j++)
{frames[i].tabs[j]={};next_slide=((start+j)%Syn.CarouselDcc.slide_count);next_slide=(next_slide===0)?Syn.CarouselDcc.slide_count:next_slide;frames[i].tabs[j].n=next_slide;var tab_el=frames[i].el.find('ul li').clone();tab_el.attr('class','carousel_tab tab_'+frames[i].tabs[j].n);tab_el.find('a').html(tabs[next_slide]);if(j==0)
{tab_el.addClass('first');}
frames[i].tabs[j].el=tab_el;}
if(Syn.CarouselDcc.frame_count===1&&Syn.CarouselDcc.slide_count<Syn.CarouselDcc.visible)
{for(var j=Syn.CarouselDcc.slide_count;j<Syn.CarouselDcc.visible;j++)
{frames[i].tabs[j]={};var tab_el=frames[i].el.find('ul li').clone();tab_el.attr('class','carousel_tab');tab_el.find('a').addClass('dummy');frames[i].tabs[j].el=tab_el;}}}
tab_ul.empty();for(var frame_i in frames)
{var frame=frames[frame_i];frame.el.appendTo(tab_ul);tab_ul.find('li#dcc_tabs_frame_'+frame.n+' ul').empty();for(var tab_i in frame.tabs)
{var tab=frame.tabs[tab_i];tab.el.appendTo(tab_ul.find('li#dcc_tabs_frame_'+frame.n+' ul'));}}
for(var k=0;k<Syn.CarouselDcc.slide_count;k++)
{var n=k+1;dcc.find('.tab-list li.tab_'+n).click(function(n){return function(){Syn.CarouselDcc.loadImages();Syn.CarouselDcc.goToTab(n);return false;};}(n));}
Syn.CarouselDcc.frames=frames;Syn.CarouselDcc.frame=0;Syn.CarouselDcc.tab=1;dcc.find('.tab-list li ul li.tab_1').addClass('on');dcc.find('.ss-controls a.ss-pause-play').click(Syn.CarouselDcc.togglePlayPause);dcc.find('.ss-controls a.ss-previous').click(Syn.CarouselDcc.prevSlide);var first_slide=dcc.find('div.slide');$(first_slide[0]).find('span').each(function(){var child=this.firstChild;if(child.nodeType===8)
{$(this).replaceWith(child.nodeValue);}});dcc.find('.ss-controls a.ss-previous').click(function(){Syn.CarouselDcc.loadImages();});dcc.find('.ss-controls a.ss-next').click(function(){Syn.CarouselDcc.loadImages();});$(window).ready(function(){$('#dcc').css('visibility','visible');});},loadImages:function()
{$('#dcc').find('span').each(function(){var child=this.firstChild;if(child.nodeType===8)
{$(this).replaceWith(child.nodeValue);}});},togglePlayPause:function()
{var dcc=$('#dcc');if(Syn.CarouselDcc.playing)
{Syn.CarouselDcc.slideshow_obj.stop();dcc.find('.ss-pause-play span').removeClass('dcc_nav_pause').addClass('dcc_nav_play');Syn.CarouselDcc.playing=false;}
else
{Syn.CarouselDcc.slideshow_obj.play();dcc.find('.ss-pause-play span').removeClass('dcc_nav_play').addClass('dcc_nav_pause');Syn.CarouselDcc.playing=true;}},nextSlide:function()
{var dcc=$('#dcc');dcc.find('.tab-list li ul li.tab_'+Syn.CarouselDcc.tab).removeClass('on');Syn.CarouselDcc.tab++;Syn.CarouselDcc.tab=(Syn.CarouselDcc.tab>Syn.CarouselDcc.slide_count)?1:Syn.CarouselDcc.tab;dcc.find('.tab-list li ul li.tab_'+Syn.CarouselDcc.tab).addClass('on');var curr_frame=Syn.CarouselDcc.frames[Syn.CarouselDcc.frame];if(!Syn.CarouselDcc.tabIsInFrame(Syn.CarouselDcc.tab,curr_frame))
{var from=Syn.CarouselDcc.frame;Syn.CarouselDcc.frame++;Syn.CarouselDcc.frame=(Syn.CarouselDcc.frame==Syn.CarouselDcc.frame_count)?0:Syn.CarouselDcc.frame;Syn.CarouselDcc.frameTransition(from,Syn.CarouselDcc.frame);}},prevSlide:function()
{var dcc=$('#dcc');dcc.find('.tab-list li ul li.tab_'+Syn.CarouselDcc.tab).removeClass('on');Syn.CarouselDcc.tab--;Syn.CarouselDcc.tab=(Syn.CarouselDcc.tab===0)?Syn.CarouselDcc.slide_count:Syn.CarouselDcc.tab;dcc.find('.tab-list li ul li.tab_'+Syn.CarouselDcc.tab).addClass('on');var curr_frame=Syn.CarouselDcc.frames[Syn.CarouselDcc.frame];if(!Syn.CarouselDcc.tabIsInFrame(Syn.CarouselDcc.tab,curr_frame))
{var from=Syn.CarouselDcc.frame;Syn.CarouselDcc.frame--;Syn.CarouselDcc.frame=(Syn.CarouselDcc.frame<0)?Syn.CarouselDcc.frame_count-1:Syn.CarouselDcc.frame;Syn.CarouselDcc.frameTransition(from,Syn.CarouselDcc.frame);}},goToTab:function(n)
{if(Syn.CarouselDcc.tab==n)
{return;}
if(!Syn.CarouselDcc.tabIsInFrame(n,Syn.CarouselDcc.frames[Syn.CarouselDcc.frame]))
{return;}
Syn.CarouselDcc.slideshow_obj.change(n-1);Syn.CarouselDcc.slideshow_obj.current=n-1;var dcc=$('#dcc');dcc.find('.tab-list li ul li.tab_'+Syn.CarouselDcc.tab).removeClass('on');Syn.CarouselDcc.tab=n;dcc.find('.tab-list li ul li.tab_'+Syn.CarouselDcc.tab).addClass('on');return false;},tabIsInFrame:function(nTab,frame)
{for(var tab_i in frame.tabs)
{var tab=frame.tabs[tab_i];if(tab.n==nTab)
{return true;}}
return false;},frameTransition:function(from,to)
{var last_frame=Syn.CarouselDcc.frame_count-1;var from_frame=$('#dcc_tabs_frame_'+from);var to_frame=$('#dcc_tabs_frame_'+to);from_frame.fadeOut(['fast']);to_frame.fadeIn(['fast']);},slideFrameFromRight:function(from,to)
{var from_frame=$('#dcc_tabs_frame_'+from);from_frame.animate({width:'0px'},Syn.CarouselDcc.anim_duration,function(){from_frame.appendTo('#dcc .dcc_nav .tab-list');from_frame.width('550px');});},slideFrameFromLeft:function(from,to)
{var to_frame=$('#dcc_tabs_frame_'+to);to_frame.width('0px');to_frame.prependTo('#dcc .dcc_nav .tab-list');to_frame.animate({width:'550px'},Syn.CarouselDcc.anim_duration);}};;

(function($){$.fn.jCarouselLite=function(o){o=$.extend({btnPrev:null,btnNext:null,btnGo:null,mouseWheel:false,auto:null,speed:200,easing:null,vertical:false,circular:true,visible:3,start:0,scroll:1,beforeStart:null,afterEnd:null},o||{});return this.each(function(){this.o=o;var running=false,animCss=o.vertical?"top":"left",sizeCss=o.vertical?"height":"width";var div=$(this),ul=$("ul",div),tLi=$("li",ul),tl=tLi.size(),v=o.visible;if(o.circular){ul.prepend(tLi.slice(tl-v-1+1).clone()).append(tLi.slice(0,v).clone());o.start+=v;}
var li=$("li",ul),itemLength=li.size(),curr=o.start;div.css("visibility","visible");li.css({overflow:"hidden",float:o.vertical?"none":"left"});ul.css({margin:"0",padding:"0",position:"relative","list-style-type":"none","z-index":"1"});div.css({overflow:"hidden",position:"relative","z-index":"2",left:"0px"});var liSize=o.vertical?height(li):width(li);var ulSize=liSize*itemLength;var divSize=liSize*v;li.css({width:li.width(),height:li.height()});ul.css(sizeCss,ulSize+"px").css(animCss,-(curr*liSize));div.css(sizeCss,divSize+"px");var self=this;if(o.btnPrev)
$(o.btnPrev).click(function(){return self.go(curr-o.scroll);});if(o.btnNext)
$(o.btnNext).click(function(){return self.go(curr+o.scroll);});if(o.btnGo)
$.each(o.btnGo,function(i,val){$(val).click(function(){return self.go(o.circular?o.visible+i:i);});});if(o.mouseWheel&&div.mousewheel)
div.mousewheel(function(e,d){return d>0?self.go(curr-o.scroll):self.go(curr+o.scroll);});if(o.auto)
setInterval(function(){self.go(curr+o.scroll);},o.auto+o.speed);function vis(){return li.slice(curr).slice(0,v);};this.go=function(to){if(!running){if(o.beforeStart)
o.beforeStart.call(this,vis());if(o.circular){if(to<=o.start-v-1){ul.css(animCss,-((itemLength-(v*2))*liSize)+"px");curr=to==o.start-v-1?itemLength-(v*2)-1:itemLength-(v*2)-o.scroll;}else if(to>=itemLength-v+1){ul.css(animCss,-((v)*liSize)+"px");curr=to==itemLength-v+1?v+1:v+o.scroll;}else curr=to;}else{if(to<0||to>itemLength-v)return;else curr=to;}
running=true;ul.animate(animCss=="left"?{left:-(curr*liSize)}:{top:-(curr*liSize)},o.speed,o.easing,function(){if(o.afterEnd)
o.afterEnd.call(this,vis());running=false;});if(!o.circular){$(o.btnPrev+","+o.btnNext).removeClass("disabled");$((curr-o.scroll<0&&o.btnPrev)||(curr+o.scroll>itemLength-v&&o.btnNext)||[]).addClass("disabled");}}
return false;};});};function css(el,prop){return parseInt($.css(el[0],prop))||0;};function width(el){return el[0].offsetWidth+css(el,'marginLeft')+css(el,'marginRight');};function height(el){return el[0].offsetHeight+css(el,'marginTop')+css(el,'marginBottom');};})(jQuery);;
/**
 * The Syn.TheaterListingsShowtimes Class
 */

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

		this.setup();
	},

	/**
	 * Reconfigure events
	 * @member Syn.TheaterListingsShowtimes
	 */
	onAjaxUpdate: function()
	{
		this.setup();
	},

	/**
	 * Setup events
	 */
	setup: function()
	{
		this.uniqueElmt('theaters_menu').connect('change', this, 'changeDateOrTheater');
		this.uniqueElmt('show_dates').connect('change', this, 'changeDateOrTheater');

		// Force the pagination component to post through ajax instead of a full page refresh
		this.hrefToAjax(this.container().find('.pagination a'));
	},

	/**
	 * Change the showtimes date or theater
	 * @member Syn.TheaterListingsShowtimes
	 * @param {Object} target
	 */
	changeDateOrTheater: function(target)
	{
		this.showLoading();
		this.submit({
			'action' : 'Showtimes',
			'show_date' : this.uniqueElmt('show_dates').val(),
			'theater_id' : this.uniqueElmt('theaters_menu').val()
		});
	}
});
;
/**
 * The Syn.Tabbed Component Class
 */

/**
 * Create a Syn.Tabbed component instance
 * @constructor
 */
Syn.Tabbed = Syn.Component.extend(
{
	/**
	 * Initialize the component class. This is called automatically by the default constructor.
	 * @member Syn.Tabbed
	 * @param {Object} config The configuration data structure
	 */
	init: function(config)
	{
		//Init parent class
		this._super(config);
		var cache = (config.cache === undefined) ? true : config.cache;
		this.hrefToAjax($('#' + this.uniqueKey('tabs') + ' li > a'), "changeTabSetup", {cache:cache});
	},

	/**
	 * Called on ajax update.
	 * @member Syn.Tabbed
	 * @param {Object} config The configuration data structure
	 */
	changeTabSetup: function(dom, event)
	{
		this.showLoading({target: this.find('.tabbed_body')});
	}
});
;
/**
 * The Syn.MovieListings Class
 */

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

		this.setup();
	},

	/**
	 * Called after component is updated through Ajax
	 * @member Syn.MovieListings
	 * @param {Object} config
	 */
	onAjaxUpdate: function(config)
	{
		if (config.redirect_url)
		{
			window.location = config.redirect_url;
		}
		else
		{
			this.setup();
		}
	},

	/**
	 * Do setup of component events
	 * @member Syn.MovieListings
	 */
	setup: function()
	{
		this.uniqueElmt('search_form').connect('submit', this, 'searchMovies');
		this.uniqueElmt('title').connect('click', this, 'clearText');
	},

	/**
	 * Callback to clear search text
	 * @member Syn.MovieListings
	 * @param {Object} target
	 */
	clearText: function(target)
	{
		if ($(target).hasClass('blur'))
		{
			$(target).val('');
			$(target).removeClass('blur');
		}
	},

	/**
	 * Submit movie search request
	 * @member Syn.MovieListings
	 */
	searchMovies: function()
	{
		this.submit({
			'title' : this.uniqueElmt('title').val(),
			'future_date' : this.uniqueElmt('future_dates').val(),
			'zip_code' : this.uniqueElmt('zip_code').val(),
			'action' : 'search'
		});
	}
});
;
/**
 * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
 *
 * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */
if (typeof deconcept == "undefined")
{
	var deconcept = new Object();
}
if (typeof deconcept.util == "undefined")
{
	deconcept.util = new Object();
}
if (typeof deconcept.SWFObjectUtil == "undefined")
{
	deconcept.SWFObjectUtil = new Object();
}
deconcept.SWFObject = function(swf, id, w, h, ver, c, quality, xiRedirectUrl, redirectUrl, detectKey) 
{
	if (!document.getElementById) 
	{ 
		return; 
	}
	this.DETECT_KEY = detectKey ? detectKey : 'detectflash';
	this.skipDetect = deconcept.util.getRequestParameter(this.DETECT_KEY);
	this.params = new Object();
	this.variables = new Object();
	this.attributes = new Array();
	if (swf) 
	{ 
		this.setAttribute('swf', swf); 
	}
	if (id) 
	{ 
		this.setAttribute('id', id); 
	}
	if (w) 
	{ 
		this.setAttribute('width', w); 
	}
	if (h) 
	{ 
		this.setAttribute('height', h); 
	}
	if (ver) 
	{ 
		this.setAttribute('version', new deconcept.PlayerVersion(ver.toString().split("."))); 
	}
	this.installedVer = deconcept.SWFObjectUtil.getPlayerVersion();
	if (!window.opera && document.all && this.installedVer.major > 7) 
	{
		deconcept.SWFObject.doPrepUnload = true;
	}
	if (c) 
	{ 
		this.addParam('bgcolor', c); 
	}
	var q = quality ? quality : 'high';
	this.addParam('quality', q);
	this.setAttribute('useExpressInstall', false);
	this.setAttribute('doExpressInstall', false);
	var xir = (xiRedirectUrl) ? xiRedirectUrl : window.location;
	this.setAttribute('xiRedirectUrl', xir);
	this.setAttribute('redirectUrl', '');
	if (redirectUrl) 
	{ 
		this.setAttribute('redirectUrl', redirectUrl); 
	}
};
deconcept.SWFObject.prototype = {
	useExpressInstall: function(path) {
		this.xiSWFPath = !path ? "expressinstall.swf" : path;
		this.setAttribute('useExpressInstall', true);
	},
	setAttribute: function(name, value){
		this.attributes[name] = value;
	},
	getAttribute: function(name){
		return this.attributes[name];
	},
	addParam: function(name, value){
		this.params[name] = value;
	},
	getParams: function(){
		return this.params;
	},
	addVariable: function(name, value)
	{
		this.variables[name] = value;
	},
	getVariable: function(name)
	{
		return this.variables[name];
	},
	getVariables: function()
	{
		return this.variables;
	},
	getVariablePairs: function(){
		var variablePairs = new Array();
		var key;
		var variables = this.getVariables();
		for (key in variables)
		{
			variablePairs[variablePairs.length] = key +"="+ variables[key];
		}
		return variablePairs;
	},
	getSWFHTML: function() {
		var swfNode = "";
		if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { 
			if (this.getAttribute("doExpressInstall")) 
			{
				this.addVariable("MMplayerType", "PlugIn");
				this.setAttribute('swf', this.xiSWFPath);
			}
			swfNode = '<embed type="application/x-shockwave-flash" src="'+ this.getAttribute('swf') +'" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'" style="'+ this.getAttribute('style') +'"';
			swfNode += ' id="'+ this.getAttribute('id') +'" name="'+ this.getAttribute('id') +'" ';
			var params = this.getParams();
			for (var key in params)
			{ 
				swfNode += [key] +'="'+ params[key] +'" '; 
			}
			var pairs = this.getVariablePairs().join("&");
			if (pairs.length > 0)
			{ 
				swfNode += 'flashvars="'+ pairs +'"'; 
			}
			swfNode += '/>';
		} 
		else 
		{ 
			if (this.getAttribute("doExpressInstall")) 
			{
				this.addVariable("MMplayerType", "ActiveX");
				this.setAttribute('swf', this.xiSWFPath);
			}
			swfNode = '<object id="'+ this.getAttribute('id') +'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'" style="'+ this.getAttribute('style') +'">';
			swfNode += '<param name="movie" value="'+ this.getAttribute('swf') +'" />';
			var params = this.getParams();
			for (var key in params) 
			{
				swfNode += '<param name="'+ key +'" value="'+ params[key] +'" />';
			}
			var pairs = this.getVariablePairs().join("&");
			if (pairs.length > 0) 
			{
				swfNode += '<param name="flashvars" value="'+ pairs +'" />';
			}
			swfNode += "</object>";
		}
		return swfNode;
	},
	write: function(elementId){
		if (this.getAttribute('useExpressInstall')) 
		{
			var expressInstallReqVer = new deconcept.PlayerVersion([6,0,65]);
			if (this.installedVer.versionIsValid(expressInstallReqVer) && !this.installedVer.versionIsValid(this.getAttribute('version'))) 
			{
				this.setAttribute('doExpressInstall', true);
				this.addVariable("MMredirectURL", escape(this.getAttribute('xiRedirectUrl')));
				document.title = document.title.slice(0, 47) + " - Flash Player Installation";
				this.addVariable("MMdoctitle", document.title);
			}
		}
		if (this.skipDetect || this.getAttribute('doExpressInstall') || this.installedVer.versionIsValid(this.getAttribute('version')))
		{
			var n = (typeof elementId == 'string') ? document.getElementById(elementId) : elementId;
			n.innerHTML = this.getSWFHTML();
			return true;
		}
		else
		{
			if (this.getAttribute('redirectUrl') != "") 
			{
				document.location.replace(this.getAttribute('redirectUrl'));
			}
		}
		return false;
	}
};

deconcept.SWFObjectUtil.getPlayerVersion = function(){
	var PlayerVersion = new deconcept.PlayerVersion([0,0,0]);
	if (navigator.plugins && navigator.mimeTypes.length)
	{
		var x = navigator.plugins["Shockwave Flash"];
		if (x && x.description) 
		{
			PlayerVersion = new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split("."));
		}
	} 
	else if (navigator.userAgent && navigator.userAgent.indexOf("Windows CE") >= 0)
	{ 
		var axo = 1;
		var counter = 3;
		while(axo) 
		{
			try 
			{
				counter++;
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+ counter);
				PlayerVersion = new deconcept.PlayerVersion([counter,0,0]);
			} 
			catch (e) 
			{
				axo = null;
			}
		}
	} 
	else 
	{ 
		try
		{
			var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		}
		catch(e)
		{
			try 
			{
				var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
				PlayerVersion = new deconcept.PlayerVersion([6,0,21]);
				axo.AllowScriptAccess = "always"; 
			} 
			catch(e) 
			{
				if (PlayerVersion.major == 6) 
				{
					return PlayerVersion;
				}
			}
			try 
			{
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			} 
			catch(e) 
			{
			}
		}
		if (axo != null) {
			PlayerVersion = new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));
		}
	}
	return PlayerVersion;
};
deconcept.PlayerVersion = function(arrVersion){
	this.major = arrVersion[0] != null ? parseInt(arrVersion[0]) : 0;
	this.minor = arrVersion[1] != null ? parseInt(arrVersion[1]) : 0;
	this.rev = arrVersion[2] != null ? parseInt(arrVersion[2]) : 0;
};
deconcept.PlayerVersion.prototype.versionIsValid = function(fv){
	if(this.major < fv.major) return false;
	if(this.major > fv.major) return true;
	if(this.minor < fv.minor) return false;
	if(this.minor > fv.minor) return true;
	if(this.rev < fv.rev) return false;
	return true;
};
deconcept.util = {
	getRequestParameter: function(param) {
		var q = document.location.search || document.location.hash;
		if (param == null) { return q; }
		if (q) 
		{
			var pairs = q.substring(1).split("&");
			for (var i=0; i < pairs.length; i++) 
			{
				if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) 
				{
					return pairs[i].substring((pairs[i].indexOf("=")+1));
				}
			}
		}
		return "";
	}
};
deconcept.SWFObjectUtil.cleanupSWFs = function() {
	var objects = document.getElementsByTagName("OBJECT");
	for (var i = objects.length - 1; i >= 0; i--) 
	{
		objects[i].style.display = 'none';
		for (var x in objects[i]) 
		{
			if (typeof objects[i][x] == 'function') 
			{
				objects[i][x] = function(){};
			}
		}
	}
};
if (deconcept.SWFObject.doPrepUnload) 
{
	if (!deconcept.unloadSet) 
	{
		deconcept.SWFObjectUtil.prepUnload = function() 
		{
			__flash_unloadHandler = function(){};
			__flash_savedUnloadHandler = function(){};
			window.attachEvent("onunload", deconcept.SWFObjectUtil.cleanupSWFs);
		};
		window.attachEvent("onbeforeunload", deconcept.SWFObjectUtil.prepUnload);
		deconcept.unloadSet = true;
	}
}
if (!document.getElementById && document.all) 
{ 
	document.getElementById = function(id) { 
		return document.all[id]; 
	};
}

var getQueryParamValue = deconcept.util.getRequestParameter;
var FlashObject = deconcept.SWFObject; 
var SWFObject = deconcept.SWFObject;
;
Syn.VideoPlayer = Class.extend(
{
	/**
	 * Holds the class that is able to convert generic Syn.VideoPlayer.Config
	 * parameters to player-specific parameters.
	 */
	configClass: null,

	/**
	 * The implementation of the video player.  This allows use to swap out
	 * different video players while using the same interface.  Should be a
	 * subclass of Syn.VideoPlayer.AbstractAdapter or
	 * Syn.VideoPlayer.AbstractDecorator
	 */
	impl: null,

	/**
	 * Constructor for the Syn.VideoPlayer class.
	 *
	 * @param {Object} config Object with at least the div to insert the player into.
	 * @constructor
	 */
	init: function(config)
	{
		var targetdiv = config.targetdiv;
		var videoConfig = config.videoConfig;
		if (!videoConfig)
		{
			videoConfig = new Syn.VideoPlayer.Config();
		}

		var configClass = Syn.VideoPlayer.Config.JwConfig;
		var adapterClass = Syn.VideoPlayer.JwAdapter;
		var adClass = Syn.VideoPlayer.Plugins.JwAds;
		var controlsClass = Syn.VideoPlayer.Plugins.JwControls;
		var controllerClass = Syn.VideoPlayer.Plugins.JwController;

		this.impl = new adapterClass();
		this.impl = new controllerClass(this.impl);

		if (videoConfig.plugins)
		{
			if (videoConfig.plugins.ads)
			{
				this.impl = new adClass(this.impl);
			}
			if (videoConfig.plugins.controls)
			{
				this.impl = new controlsClass(this.impl);
			}
		}

		this.configClass = configClass;

		this.impl.insertVideoPlayer(targetdiv, new configClass(videoConfig));
	},

	/**
	 * Loads a video into the player but will not play it unless autostart
	 * is set to true in the config.
	 *
	 * @param {String|Object} item The URL of the video or an object as specified in Syn.VideoPlayer.Config
	 */
	load: function(item)
	{
		this.impl.load(this.configClass.convertItem(item));
	},

	/**
	 * Loads and then plays a video if the item parameter is specified.
	 * If item is null, resumes the currenly loaded video. If playing a
	 * new item, this calls load() for you, so you don't have to.
	 *
	 * <p>
	 * The item parameter can either be
	 * - the URL to the video
	 * - an object of the form {url:URL, type:"{video|audio|image}", image:URL}
	 *
	 * The image parameter is only used if type=="audio" and an accompanying
	 * image is desired.  For playing videos by their ID, see playVideoById().
	 * </p>
	 *
	 * @param {String|Object} (optional) item The video to play.
	 * @see #playVideoById
	 */
	play: function(item)
	{
		this.impl.play(this.configClass.convertItem(item));
	},

	/**
	 * Pauses the video.
	 */
	pause: function()
	{
		this.impl.pause();
	},

	/**
	 * Stops the video and moves the playhead back to the beginning.
	 */
	stop: function()
	{
		this.impl.stop();
	},

	/**
	 * Mutes the video player
	 */
	mute: function()
	{
		this.impl.mute();
	},

	/**
	 * Unmutes the video player
	 */
	unmute: function()
	{
		this.impl.unmute();
	},

	/*
	Helper functions for playing Synacor video
	*/

	/**
	 * Plays a video by its ID by invoking the Synacor Play API.
	 *
	 * @param {String} id The Synacor ID of the video to be played.
	 */
	playVideoId: function(id)
	{
		this.impl.playVideoId(id);
	},

	/*
	Event Handling
	*/

	/**
	 * Registers a callback for a video player event. The
	 * available events are listed in Syn.VideoPlayer.Events.
	 * (e.g. Syn.VideoPlayer.Events.COMPLETE).
	 *
	 * @param {String} type The event to listen for
	 * @param {Object} scopeObj The scope for the callback
	 * @param {function} func The callback function
	 */
	addCallback: function(type, scopeObj, func)
	{
		this.impl.addCallback(type, scopeObj, func);
	},

	/**
	 * Unregisters a callback that was previously registered
	 * with addCallback(). All the parameters must match those
	 * passed to addCallback() for the listener to be removed.
	 *
	 * @param {String} type A The event to stop listening to
	 * @param {Object} scopeObj The scope of the registered callback
	 * @param {function} func The registered callback
	 */
	removeCallback: function(type, scopeObj, func)
	{
		this.impl.removeCallback(type, scopeObj, func);
	},

	/**
	 * Inserts an advertisement into the specified container.
	 * @param {mixed} container
	 * @param {String} display_url
	 * @param {String} click_url
	 * @param {int} width
	 * @param {int} height
	 */
	insertAd: function(container, display_url, click_url, width, height)
	{
		if (!display_url)
		{
			return;
		}

		// Make sure width and height are specified
		width = (width) ? width : 300;
		height = (height) ? height : 250;

		var swf_found         = (display_url.indexOf(".swf") > 0);
		var doubleclick_found = (display_url.indexOf("http://ad.doubleclick.net") === 0);
		var html_found        = (display_url.indexOf("&ext=.html") >= 0);

		container = (typeof(container) == "string") ? $(container) : container;

		if (doubleclick_found || html_found || swf_found)
		{
			// Need to include the frameborder in here because IE stinks
			var iframe = $('<iframe frameborder="0">').attr({
				height: height,
				marginheight: 0,
				marginwidth: 0,
				scrolling: "no",
				src: display_url,
				width: width
			});

			container.empty().append(iframe);
		}
		else
		{
			var banner = $("<img>").attr("src", display_url)
			                       .attr("alt", "")
								   .css("cursor", "pointer")
								   .click(function()
								   {
									   window.open(click_url, "ad_win");
								   });

			container.empty().append(banner);
		}
	}
});
;
Syn.VideoPlayer.PlayApi = Class.extend(
{
	PLAY_API_URL: Syn.Config.Framework.PortalRoot + "files/video/video_api.php",

	/**
	 * @constructor
	 */
	init: function()
	{
	},

	/**
	 * Calls the Play API primarily to get the URL for the video id.  Also
	 * retrieves status and ad variables are part of the return XML.
	 *
	 * @param {String} id The id of the video
	 * @param {Object} scope_object The scope of the callbacks
	 * @param {function) success_callback Called on Play API success
	 * @param {function} error_callback Called on Play API error
	 */
	getUrlFromId: function(id, scope_object, success_callback, error_callback)
	{
		$.ajax({
			url: this.PLAY_API_URL,
			data: "op=play&vid=" + id,
			success: function(data, textStatus)
			{
				var status_ok = $(data).find("status").text() == "ok";

				if (status_ok)
				{
					var content_server = $(data).find("content_server").text();
					var token = $(data).find("token").text();

					var obj = {};
					obj.url = content_server + "?token=" + token;
					obj.ads = [];

					var ads = $(data).find("ad");
					for(var i = 0; i < ads.length; i++)
					{
						var ad = $(ads.get(i));
						var provider = ad.find("ad_provider").text();
						var affiliate_level = ad.find("ad_affiliate_level").text();

						obj.ads.push({provider:provider, affiliate_level:affiliate_level});
					}

					success_callback.call(scope_object, obj);
				}
				else
				{
					error_callback.call(scope_object, $(data).find("message").text());
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown)
			{
				error_callback.call(scope_object, "unable to connect to server");
			}
		});
	}
});
;
Syn.VideoPlayer.Events = {};
Syn.VideoPlayer.Events.COMPLETE = "complete";
Syn.VideoPlayer.Events.ERROR = "error";
Syn.VideoPlayer.Events.READY = "ready";
Syn.VideoPlayer.Events.SHOW_BANNER_AD = "showBannerAd";
Syn.VideoPlayer.Events.HIDE_BANNER_AD = "hideBannerAd";
Syn.VideoPlayer.Events.NO_AD_LOADED = "noAdLoaded";
Syn.VideoPlayer.Events.EMAIL = "email";
;
Syn.VideoPlayer.Config = Class.extend(
{
	/**
	 * Set to true if loaded videos should begin playing immediately.
	 * Set to false if loaded videos should not play until play() is
	 * called.
	 */
	autostart: true,

	/**
	 * The media to load into the player at start up.  Will being playing
	 * automatically if autostart is true.  The acceptable formats are:
	 *
	 * 1) A URL to the media
	 * 2) An object with {url: "url", type: {mediaType}, image: "url"}
	 *
	 * The acceptable values for media types are:
	 * - "video"
	 * - "audio"
	 * - "image"
	 *
	 * The image parameter is only used if the mediaType is "audio" and
	 * an accompanying image is required.
	 */
	item: null,

	/**
	 * If the player should be muted at start up.
	 */
	mute: false,
		
	/**
	 * Any plugins that should be loaded into the player (e.g. ads)
	 */
	plugins: null,

	/**
	 * The scaling of the video that should be used
	 *
	 * The Synacor values for scaling are:
	 * - "fit"
	 * - "stretch"
	 * - "original"
	 */
	scaling: "fit",

	/**
	 * The skin to be used for the controls of the video player
	 */
	skin: null,

	/**
	 * The volume to start the video player with.
	 */
	volume: null,
	

	/*
	Included these Flash specific variables to allow for maximum
	control over the player. These should not be used if one of
	above variables would suffice.
	*/
	attributes: {},
	flashVars: {},
	params: {
		"allowfullscreen": "true",
		"allowscriptaccess": "always",
		"wmode": "opaque"
	},
	version: "9.0.28",

	/*
	If you want to specify a particular player.  Options are
	"jw_player" or "flow_player".
	*/
	player: "jw_player"
});
;
Syn.VideoPlayer.Config.JwConfig = Class.extend(
{
	init: function(config)
	{
		for (var prop in config)
		{
			switch(prop)
			{
				case "item":
					this[prop] = Syn.VideoPlayer.Config.JwConfig.convertItem(config[prop]);
					break;
				case "scaling":
					this[prop] = Syn.VideoPlayer.Config.JwConfig.convertScaling(config[prop]);
					break;
				default:
					this[prop] = config[prop];
					break;
			}
		}
	}	
});
/**
 * Converts an item specified in the Synacor format to a file in the
 * format as requested by the JW Player.  The Synacor format is:
 *
 * 1) A URL to the media
 * 2) An object with {url: "url", type: "type", image: "image"}
 *
 * The JW Player format is similar, taking either
 *
 * 1) A URL to the media
 * 2) An object like {file: "url", type: "type", image: "image"}
 *
 * @param item A file to be played in the general Synacor format
 * @return An item congruent to the input but in the JW player format
 *
 **/
Syn.VideoPlayer.Config.JwConfig.convertItem = function(item)
{
	// JW player requires a streamer property to be set for RTMP
	// videos.  So (1) must be converted to (2):
	// (1) {file:"rtmp://path/to/video.flv"}
	// (2) {file:"video.flv", streamer:"rtmp://path/to/"}
	var convertRtmp = function (obj)
	{
		if (obj.file.match(/^rtmp:\/\//))
		{
			obj.streamer = obj.file.match(/^.*\//)[0];
			obj.file = obj.file.match(/[^\/]+$/)[0];
			obj.type = "rtmp";
		}
		return obj;
	};

	if(typeof(item) == "string")
	{
		return convertRtmp({file:item, type:"video"});
	}

	if(item instanceof Array)
	{
		var n = item.length;
		for(var i = 0; i < n; i++)
		{
			item[i] = Syn.VideoPlayer.Config.JwConfig.convertItem(item[i]);
		}
		return item;
	}

	if(item && item.url)
	{
		var jw = {
			file:item.url,
			type:Syn.VideoPlayer.Config.JwConfig.convertType(item.type),
			image:item.image,
			ads:item.ads,
			cdn:item.cdn,
			tags:item.tags,
			title:item.title,
			id:item.id
		};

		convertRtmp(jw);

		// Convert each of the fallback CDN items too!
		if (jw.cdn)
		{
			jw.cdn = Syn.VideoPlayer.Config.JwConfig.convertItem(jw.cdn);
		}

		return jw;
	}
	return null;
};

/**
 * The Synacor acceptable values for media types are:
 * - video
 * - audio
 * - image
 *
 * The Jw Player acceptable types are:
 * - video
 * - sound
 * - image
 *
 * @param The type of media to be played defined in Synacor format
 * @return The media type of the input as a JW Player value
 */
Syn.VideoPlayer.Config.JwConfig.convertType = function(type)
{
	if(!type)
	{
		type = "video";
	}
	else if(type == "audio")
	{
		type = "sound";
	}
	return type;
};

/**
 * Converts a Synacor specified scaling into the JW Player expected
 * format of scaling.
 *
 * The Synacor values for scaling are:
 * - fit
 * - stretch
 * - original
 *
 * This JW Player expeected values are:
 * - none ~= original
 * - exactfit ~= stretch
 * - uniform ?? fit
 * - fill ?? fit
 *
 * @param scaling The scaling of the video specified in Synacor values
 * @return the scaling of the video in JW Player values
 */
Syn.VideoPlayer.Config.JwConfig.convertScaling = function(scaling)
{
	switch(scaling)
	{
		case "stretch":
			return "exactfit";
		case "original":
			return "none";
	}

	return "uniform";
};
;
Syn.VideoPlayer.Plugins = {};
Syn.VideoPlayer.Plugins.ADS = "ads";
;
Syn.VideoPlayer.AbstractDecorator = Class.extend(
{
	init: function(adapter)
	{
		this.adapter = adapter;
	},

	insertVideoPlayer: function(div, config)
	{
		this.adapter.insertVideoPlayer(div, config);
	},

	/*
	Control the player
	*/
	load: function(item)
	{
		this.adapter.load(item);
	},

	play: function(item)
	{
		this.adapter.play(item);
	},

	pause: function()
	{
		this.adapter.pause();
	},

	stop: function()
	{
		this.adapter.stop();
	},

	mute: function()
	{
		this.adapter.mute();
	},
	
	unmute: function()
	{
		this.adapter.unmute();
	},

	next: function()
	{
		this.adapter.next();
	},

	previous: function()
	{
		this.adapter.previous();
	},

	error: function(msg)
	{
		this.adapter.error(msg);
	},
	

	/*
	Helper functions for handling Synacor video
	*/

	/**
	 * Passes our own success and error functions to playVideoId so that the
	 * callbacks are override-able by any decorator classes.  Otherwise, only
	 * the adapters have access to the callbacks, and that made things tough.
	 *
	 * <p>
	 * For example, the ads plugin class is a decorator.  Since it did not inherit
	 * from the adapter class (it is composed of one), we couldn't simply override
	 * the onPlayApiSuccess method to get access to the results.
	 * </p>
	 *
	 * @see #onPlayApiSuccess
	 */
	playVideoId: function(id)
	{
		this.adapter.playVideoId(id, this, this.onPlayApiSuccess, this.onPlayApiError);
	},
	/**
	 * Default success handler for playVideoId().  Since this AbstractDecorator
	 * class is the base class for all decorators, we passed our own callbacks
	 * to playVideoId() so that they could be overridden by any subclass so that
	 * they could have access to the Play API results.
	 *
	 * @see #playVideoId
	 */
	onPlayApiSuccess: function(result)
	{
		this.adapter.onPlayApiSuccess(result);
	},
	/**
	 * Default error handler for playVideoId().
	 */
	onPlayApiError: function(result)
	{
		this.adapter.onPlayApiError(result);
	},


	/*
	Event Handling
	*/
	addCallback: function(type, scopeObj, func)
	{
		this.adapter.addCallback(type, scopeObj, func);
	},
	removeCallback: function(type, scopeObj, func)
	{
		this.adapter.removeCallback(type, scopeObj, func);
	},
	notifyCallbacks: function(type, args)
	{
		this.adapter.notifyCallbacks(type, args);
	},

	/*
	Queue method call if player is not ready
	*/
	maybeQueue: function(func, args)
	{
		return this.adapter.maybeQueue(func, args);
	},

	/*
	Provide access to player
	*/
	getPlayer: function()
	{
		return this.adapter.getPlayer();
	},
	getPlayerId: function()
	{
		return this.adapter.getPlayerId();
	}
});
;
Syn.VideoPlayer.Plugins.AbstractAds = Syn.VideoPlayer.AbstractDecorator.extend(
{
	/**
	 * @constructor
	 */
	init: function(adapter)
	{
		this._super(adapter);
	},

	/*
	Companion Banner Ad
	*/

	/**
	 * Called by the ads plugin when we are to display a banner ad.  We forward
	 * this event to any listeners.  The implementation should listen for the
	 * SHOW_BANNER_AD event and act appropriately.
	 *
	 * @param {String} displayURL The URL of the banner ad to be shown
	 * @param {String} clickURL The URL to direct the user to if they click on the ad
	 */
	showBannerAd: function(displayURL, clickURL)
	{
		this.notifyCallbacks(Syn.VideoPlayer.Events.SHOW_BANNER_AD, [displayURL, clickURL]);
	},
	/**
	 * Called by the ads plugin when we are to hide the banner ad.  We forward
	 * this event to any listeners.  The implementation should listen for the
	 * HIDE_BANNER_AD event and act appropriately.
	 */
	hideBannerAd: function()
	{
		this.notifyCallbacks(Syn.VideoPlayer.Events.HIDE_BANNER_AD);
	},
	/**
	 * Called by the ads plugin after video ads were requested, but no ads were
	 * returned.  The implemetation may listen for the NO_AD_LOADED event.
	 */
	noAdLoaded: function()
	{
		this.notifyCallbacks(Syn.VideoPlayer.Events.NO_AD_LOADED);
	},


	/*
	Sort ads by priority
	*/

	/**
	 * An array sort function that orders the array so that the highest priority
	 * ad providers are first.  When we pass the array to the ads plugin, it cycles
	 * through the array, finding the highest priority provider that returns an ad.
	 *
	 * @param {Object} a An ad with the provider property set
	 * @param {Object} b An ad with the provider property set
	 * @returns -1(if a is higher priority), 1(if b is higher), 0 if it doesn't matter
	 * @type int
	 */
	sortAds: function(a, b)
	{
		if (a.provider == "doubleclick")
		{
			return -1;
		}
		if (b.provider == "doubleclick")
		{
			return 1;
		}

		return 0;
	}
});
;
