/*
 * jQuery JavaScript Library v1.3.2
 * http://jquery.com/
 *
 * Copyright (c) 2009 John Resig
 * Dual licensed under the MIT and GPL licenses.
 * http://docs.jquery.com/License
 *
 * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
 * Revision: 6246
 */
(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
/*
 * Sizzle CSS Selector Engine - v0.9.3
 * Copyright 2009, The Dojo Foundation
 * Released under the MIT, BSD, and GPL Licenses.
 * More information: http://sizzlejs.com/
 */
(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
jQuery.noConflict();
/**
 * tools.tabs 1.0.3 - Tabs done right.
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/tabs.html
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * Launch : November 2008
 * Date: ${date}
 * Revision: ${revision} 
 */ 
(function($) {
 
 // static constructs
 $.tools = $.tools || {};
 
 $.tools.tabs = {
 version: '1.0.3',
 
 conf: {
 tabs: 'a',
 current: 'current',
 onBeforeClick: null,
 onClick: null, 
 effect: 'default',
 initialIndex: 0, 
 event: 'click',
 api:false,
 rotate: false
 },
 
 addEffect: function(name, fn) {
 effects[name] = fn;
 }
 }; 
 
 
 var effects = {
 
 // simple "toggle" effect
 'default': function(i, done) { 
 this.getPanes().hide().eq(i).show();
 done.call();
 }, 
 
 /*
 configuration:
 - fadeOutSpeed (positive value does "crossfading")
 - fadeInSpeed
 */
 fade: function(i, done) {
 var conf = this.getConf(), 
 speed = conf.fadeOutSpeed,
 pane = this.getCurrentPane();
 
 if (speed) {
 pane.fadeOut(speed); 
 } else {
 pane.hide(); 
 }

 this.getPanes().eq(i).fadeIn(conf.fadeInSpeed, done); 
 },
 
 // for basic accordions
 slide: function(i, done) {
 this.getCurrentPane().slideUp(200);
 this.getPanes().eq(i).slideDown(400, done); 
 }, 

 // simple AJAX effect
 ajax: function(i, done) { 
 this.getPanes().eq(0).load(this.getTabs().eq(i).attr("href"), done); 
 }
 
 }; 
 
 var w;
 
 // this is how you add effects
 $.tools.tabs.addEffect("horizontal", function(i, done) {
 
 // store original width of a pane into memory
 if (!w) { w = this.getPanes().eq(0).width(); }
 
 // set current pane's width to zero
 this.getCurrentPane().animate({width: 0}, function() { $(this).hide(); });
 
 // grow opened pane to it's original width
 this.getPanes().eq(i).animate({width: w}, function() { 
 $(this).show();
 done.call();
 });
 
 }); 
 

 function Tabs(tabs, panes, conf) { 
 
 var self = this, $self = $(this), current;

 // bind all callbacks from configuration
 $.each(conf, function(name, fn) {
 if ($.isFunction(fn)) { $self.bind(name, fn); }
 });
 
 
 // public methods
 $.extend(this, { 
 click: function(i) {
 
 var pane = self.getCurrentPane(); 
 var tab = tabs.eq(i); 
 
 if (typeof i == 'string' && i.replace("#", "")) {
 tab = tabs.filter("[href*=" + i.replace("#", "") + "]");
 i = Math.max(tabs.index(tab), 0);
 }
 
 if (conf.rotate) {
 var last = tabs.length -1; 
 if (i < 0) { return self.click(last); }
 if (i > last) { return self.click(0); } 
 }
 
 if (!tab.length) { 
 if (current >= 0) { return self; }
 i = conf.initialIndex;
 tab = tabs.eq(i);
 } 
 
 // possibility to cancel click action
 var e = $.Event("onBeforeClick");
 $self.trigger(e, [i]); 
 if (e.isDefaultPrevented()) { return; }

 
 // current tab is being clicked
 if (i === current) { return self; } 
 
 tab.addClass(conf.current);
 
 // call the effect
 effects[conf.effect].call(self, i, function() {

 // onClick callback
 $self.trigger("onClick", [i]);
 
 }); 
 
 
 tabs.removeClass(conf.current); 
 tab.addClass(conf.current);
 current = i;
 return self;
 },
 
 getConf: function() {
 return conf; 
 },

 getTabs: function() {
 return tabs; 
 },
 
 getPanes: function() {
 return panes; 
 },
 
 getCurrentPane: function() {
 return panes.eq(current); 
 },
 
 getCurrentTab: function() {
 return tabs.eq(current); 
 },
 
 getIndex: function() {
 return current; 
 }, 
 
 next: function() {
 return self.click(current + 1);
 },
 
 prev: function() {
 return self.click(current - 1); 
 }, 
 
 bind: function(name, fn) {
 $self.bind(name, fn);
 return self; 
 }, 
 
 onBeforeClick: function(fn) {
 return this.bind("onBeforeClick", fn);
 },
 
 onClick: function(fn) {
 return this.bind("onClick", fn);
 },
 
 unbind: function(name) {
 $self.unbind(name);
 return self; 
 } 
 
 });
 
 
 // setup click actions for each tab
 tabs.each(function(i) { 
 $(this).bind(conf.event, function(e) {
 self.click(i);
 return e.preventDefault();
 }); 
 });

 // if no pane is visible --> click on the first tab
 if (location.hash) {
 self.click(location.hash);
 } else {
 self.click(conf.initialIndex); 
 } 
 
 // cross tab anchor link
 panes.find("a[href^=#]").click(function() {
 self.click($(this).attr("href")); 
 }); 
 }
 
 
 // jQuery plugin implementation
 $.fn.tabs = function(query, conf) {
 
 // return existing instance
 var el = this.eq(typeof conf == 'number' ? conf : 0).data("tabs");
 if (el) { return el; }

 if ($.isFunction(conf)) {
 conf = {onBeforeClick: conf};
 }
 
 // setup options
 var globals = $.extend({}, $.tools.tabs.conf), len = this.length;
 conf = $.extend(globals, conf); 

 
 // install tabs for each items in jQuery 
 this.each(function(i) { 
 var root = $(this); 
 
 // find tabs
 var els = root.find(conf.tabs);
 
 if (!els.length) {
 els = root.children(); 
 }
 
 // find panes
 var panes = query.jquery ? query : root.children(query);
 
 if (!panes.length) {
 panes = len == 1 ? $(query) : root.parent().find(query);
 } 
 
 el = new Tabs(els, panes, conf);
 root.data("tabs", el);
 
 }); 
 
 return conf.api ? el: this; 
 }; 
 
}) (jQuery); 



/**
 * jQuery TOOLS plugin :: tabs.slideshow 1.0.1
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/tabs.html#slideshow
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * Launch : September 2009
 * Date: ${date}
 * Revision: ${revision} 
 */
(function($) {
 
 var t = $.tools.tabs; 
 t.plugins = t.plugins || {}; 
 t.plugins.slideshow = { 
 version: '1.0.1',
 
 // CALLBACKS: onBeforePlay, onPlay, onBeforePause, onPause, 
 conf: {
 next: '.forward',
 prev: '.backward',
 disabledClass: 'disabled',
 autoplay: false,
 autopause: true,
 interval: 3000, 
 clickable: true,
 api: false
 }
 };


 // jQuery plugin implementation
 $.prototype.slideshow = function(conf) {
 
 var globals = $.extend({}, t.plugins.slideshow.conf),
 len = this.length, 
 ret;
 
 conf = $.extend(globals, conf); 
 
 this.each(function() {
 
 var tabs = $(this), api = tabs.tabs(), $api = $(api), ret = api; 
 
 // bind all callbacks from configuration
 $.each(conf, function(name, fn) {
 if ($.isFunction(fn)) { api.bind(name, fn); }
 });
 
 
 function find(query) {
 return len == 1 ? $(query) : tabs.parent().find(query); 
 } 
 
 var nextButton = find(conf.next).click(function() {
 api.next(); 
 });
 
 var prevButton = find(conf.prev).click(function() {
 api.prev(); 
 });
 
 // interval stuff
 var timer, hoverTimer, startTimer, stopped = false;
 

 // extend the Tabs API with slideshow methods 
 $.extend(api, {
 
 play: function() {
 
 // do not start additional timer if already exists
 if (timer) { return; }
 
 // onBeforePlay
 var e = $.Event("onBeforePlay");
 $api.trigger(e);
 
 if (e.isDefaultPrevented()) { return api; } 
 
 stopped = false;
 
 // construct new timer
 timer = setInterval(api.next, conf.interval);
 
 // onPlay
 $api.trigger("onPlay"); 
 
 api.next();
 },
 
 pause: function() {
 
 if (!timer) { return api; }
 
 // onBeforePause
 var e = $.Event("onBeforePause");
 $api.trigger(e); 
 if (e.isDefaultPrevented()) { return api; } 
 
 timer = clearInterval(timer);
 startTimer = clearInterval(startTimer);
 
 // onPause
 $api.trigger("onPause"); 
 },
 
 // when stopped - mouseover won't restart 
 stop: function() { 
 api.pause();
 stopped = true; 
 },
 
 onBeforePlay: function(fn) {
 return api.bind("onBeforePlay", fn);
 },
 
 onPlay: function(fn) {
 return api.bind("onPlay", fn);
 },

 onBeforePause: function(fn) {
 return api.bind("onBeforePause", fn);
 },
 
 onPause: function(fn) {
 return api.bind("onPause", fn);
 }
 
 });
 
 
 
 /* when mouse enters, slideshow stops */
 if (conf.autopause) {
 var els = api.getTabs().add(nextButton).add(prevButton).add(api.getPanes());
 
 els.hover(function() { 
 api.pause(); 
 hoverTimer = clearInterval(hoverTimer);
 
 }, function() {
 if (!stopped) { 
 hoverTimer = setTimeout(api.play, conf.interval); 
 }
 });
 } 
 
 if (conf.autoplay) {
 startTimer = setTimeout(api.play, conf.interval); 
 } else {
 api.stop(); 
 }
 
 if (conf.clickable) {
 api.getPanes().click(function() {
 api.next();
 });
 } 
 
 // manage disabling of next/prev buttons
 if (!api.getConf().rotate) {
 
 var cls = conf.disabledClass;
 if (!api.getIndex()) {
 prevButton.addClass(cls);
 }
 api.onBeforeClick(function(i) {
 if (!i) {
 prevButton.addClass(cls);
 } else {
 prevButton.removeClass(cls); 
 
 if (i == api.getTabs().length -1) {
 nextButton.addClass(cls);
 } else {
 nextButton.removeClass(cls); 
 }
 }
 });
 }
 
 });
 
 return conf.api ? ret : this;
 };
 
})(jQuery); 


/**
 * jQuery TOOLS plugin :: tabs.history 1.0.1
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/tabs.html#history
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * Launch : September 2009
 * Date: ${date}
 * Revision: ${revision} 
 */
(function($) {
 
 var t = $.tools.tabs; 
 t.plugins = t.plugins || {};
 
 t.plugins.history = { 
 version: '1.0.1', 
 conf: {
 api: false
 } 
 };
 
 var hash, iframe; 

 function setIframe(h) {
 if (h) {
 var doc = iframe.contentWindow.document;
 doc.open().close(); 
 doc.location.hash = h;
 }
 }
 
 // jQuery plugin implementation
 $.fn.onHash = function(fn) {
 
 var el = this;
 
 // IE
 if ($.browser.msie && $.browser.version < '8') {
 
 // create iframe that is constantly checked for hash changes
 if (!iframe) {
 iframe = $("<iframe/>").attr("src", "javascript:false;").hide().get(0);
 $("body").append(iframe);
 
 setInterval(function() {
 var idoc = iframe.contentWindow.document, 
 h = idoc.location.hash;
 
 if (hash !== h) { 
 $.event.trigger("hash", h);
 hash = h;
 }
 }, 100);
 
 setIframe(location.hash || '#');
 }
 
 // when link is clicked the iframe hash updated
 el.bind("click.hash", function(e) {
 setIframe($(this).attr("href"));
 }); 

 
 // other browsers scans for location.hash changes directly withou iframe hack
 } else { 
 setInterval(function() {
 var h = location.hash;
 var els = el.filter("[href$=" + h + "]");
 
 if (!els.length) { 
 h = h.replace("#", "");
 els = el.filter("[href$=" + h + "]");
 }
 
 if (els.length && h !== hash) {
 hash = h;
 $.event.trigger("hash", h);
 } 
 }, 100);
 }
 
 // bind a history listener
 $(window).bind("hash", fn);
 
 // return jQuery
 return this; 
 }; 
 

 $.fn.history = function(conf) {
 
 var globals = $.extend({}, t.plugins.history.conf), ret;
 conf = $.extend(globals, conf);
 
 this.each(function() {
 
 var api = $(this).tabs(), 
 tabs = api.getTabs(),
 ret = api;
 
 // enable history support
 tabs.onHash(function(evt, hash) {
 if (!hash || hash == '#') { hash = api.getConf().initialIndex; }
 api.click(hash); 
 }); 
 
 // tab clicks perform their original action
 tabs.click(function(e) {
 location.hash = $(this).attr("href").replace("#", ""); 
 }); 

 });
 
 return conf.api ? ret : this;
 
 };
 
})(jQuery); 


/**
 * tools.tooltip 1.1.1 - Tooltips done right.
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/tooltip.html
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * Launch : November 2008
 * Date: ${date}
 * Revision: ${revision} 
 */
(function($) { 

 // static constructs
 $.tools = $.tools || {};
 
 $.tools.tooltip = {
 version: '1.1.1',
 
 conf: { 
 
 // default effect variables
 effect: 'toggle', 
 fadeOutSpeed: "fast",
 tip: null,
 
 predelay: 0,
 delay: 30,
 opacity: 1, 
 lazy: undefined,
 
 // 'top', 'bottom', 'right', 'left', 'center'
 position: ['top', 'center'], 
 offset: [0, 0], 
 cancelDefault: true,
 relative: false,
 
 // type to event mapping 
 events: {
 def: "mouseover,mouseout",
 input: "focus,blur",
 widget: "focus mouseover,blur mouseout"
 },
 
 api: false
 },
 
 addEffect: function(name, loadFn, hideFn) {
 effects[name] = [loadFn, hideFn]; 
 } 
 };
 
 
 var effects = { 
 toggle: [ 
 function(done) { 
 var conf = this.getConf();
 this.getTip().css({opacity: conf.opacity}).show();
 done.call();
 },
 
 function(done) { 
 this.getTip().hide();
 done.call();
 } 
 ],
 
 fade: [
 function(done) { this.getTip().fadeIn(this.getConf().fadeInSpeed, done); }, 
 function(done) { this.getTip().fadeOut(this.getConf().fadeOutSpeed, done); } 
 ] 
 }; 

 function Tooltip(trigger, conf) {
 
 var self = this, $self = $(this);
 
 trigger.data("tooltip", self);
 
 // find the tip
 var tip = trigger.next();
 
 if (conf.tip) {
 
 tip = $(conf.tip);
 
 // multiple tip elements
 if (tip.length > 1) {
 
 // find sibling
 tip = trigger.nextAll(conf.tip).eq(0); 
 
 // find sibling from the parent element
 if (!tip.length) {
 tip = trigger.parent().nextAll(conf.tip).eq(0);
 }
 } 
 } 
 
 /* calculate tip position relative to the trigger */ 
 function getPosition(e) { 
 
 // get origin top/left position 
 var top = conf.relative ? trigger.position().top : trigger.offset().top, 
 left = conf.relative ? trigger.position().left : trigger.offset().left,
 pos = conf.position[0];

 top -= tip.outerHeight() - conf.offset[0];
 left += trigger.outerWidth() + conf.offset[1];
 
 // adjust Y 
 var height = tip.outerHeight() + trigger.outerHeight();
 if (pos == 'center') { top += height / 2; }
 if (pos == 'bottom') { top += height; }
 
 // adjust X
 pos = conf.position[1]; 
 var width = tip.outerWidth() + trigger.outerWidth();
 if (pos == 'center') { left -= width / 2; }
 if (pos == 'left') { left -= width; } 
 
 return {top: top, left: left};
 } 

 
 // event management
 var isInput = trigger.is(":input"), 
 isWidget = isInput && trigger.is(":checkbox, :radio, select, :button"), 
 type = trigger.attr("type"),
 evt = conf.events[type] || conf.events[isInput ? (isWidget ? 'widget' : 'input') : 'def']; 
 
 evt = evt.split(/,\s*/); 
 
 trigger.bind(evt[0], function(e) {
 
 // see if the tip was launched by this trigger
 var t = tip.data("trigger"); 
 if (t && t[0] != this) { tip.hide(); }
 
 e.target = this;
 self.show(e);
 tip.hover(self.show, function() { self.hide(e); });
 
 });
 
 trigger.bind(evt[1], function(e) {
 self.hide(e); 
 });
 
 // ensure that the tip really shows up. IE cannot catch up with this.
 if (!$.browser.msie && !isInput) {
 trigger.mousemove(function() { 
 if (!self.isShown()) {
 trigger.triggerHandler("mouseover"); 
 }
 });
 }

 // for PNG backgrounds opacity changes will generate a black border for IE
 if (conf.opacity < 1) {
 tip.css("opacity", conf.opacity); 
 }
 
 var pretimer = 0, title = trigger.attr("title");
 
 if (title && conf.cancelDefault) { 
 trigger.removeAttr("title");
 trigger.data("title", title); 
 } 
 
 $.extend(self, {
 
 show: function(e) {
 
 if (e) { trigger = $(e.target); } 

 clearTimeout(tip.data("timer")); 
 
 if (tip.is(":animated") || tip.is(":visible")) { return self; }
 
 function show() {
 
 // remember the trigger element for this tip
 tip.data("trigger", trigger);
 
 // get position
 var pos = getPosition(e); 
 
 // title attribute 
 if (conf.tip && title) {
 tip.html(trigger.data("title"));
 } 
 
 // onBeforeShow
 var evt = $.Event("onBeforeShow");
 $self.trigger(evt, [pos]); 
 if (evt.isDefaultPrevented()) { return self; }
 
 
 // onBeforeShow may have altered the configuration
 pos = getPosition(e);
 
 // set position
 tip.css({position:'absolute', top: pos.top, left: pos.left}); 
 
 // invoke effect
 effects[conf.effect][0].call(self, function() {
 $self.trigger("onShow"); 
 }); 
 
 }
 
 if (conf.predelay) {
 clearTimeout(pretimer);
 pretimer = setTimeout(show, conf.predelay); 
 
 } else {
 show(); 
 }
 
 return self;
 },
 
 hide: function(ev) {

 clearTimeout(tip.data("timer"));
 clearTimeout(pretimer);
 
 if (!tip.is(":visible")) { return; }
 
 function hide() {
 
 // onBeforeHide
 var e = $.Event("onBeforeHide");
 $self.trigger(e); 
 if (e.isDefaultPrevented()) { return; }
 
 effects[conf.effect][1].call(self, function() {
 $self.trigger("onHide"); 
 });
 }
 
 if (conf.delay && ev) {
 tip.data("timer", setTimeout(hide, conf.delay));
 
 } else {
 hide(); 
 } 
 
 return self;
 },
 
 isShown: function() {
 return tip.is(":visible, :animated"); 
 },
 
 getConf: function() {
 return conf; 
 },
 
 getTip: function() {
 return tip; 
 },
 
 getTrigger: function() {
 return trigger; 
 },
 
 // callback functions 
 bind: function(name, fn) {
 $self.bind(name, fn);
 return self; 
 },
 
 onHide: function(fn) {
 return this.bind("onHide", fn);
 },

 onBeforeShow: function(fn) {
 return this.bind("onBeforeShow", fn);
 },
 
 onShow: function(fn) {
 return this.bind("onShow", fn);
 },
 
 onBeforeHide: function(fn) {
 return this.bind("onBeforeHide", fn);
 },

 unbind: function(name) {
 $self.unbind(name);
 return self; 
 } 

 }); 

 // bind all callbacks from configuration
 $.each(conf, function(name, fn) {
 if ($.isFunction(fn)) { self.bind(name, fn); }
 }); 
 
 }
 
 
 // jQuery plugin implementation
 $.prototype.tooltip = function(conf) {
 
 // return existing instance
 var api = this.eq(typeof conf == 'number' ? conf : 0).data("tooltip");
 if (api) { return api; }
 
 // setup options
 var globals = $.extend(true, {}, $.tools.tooltip.conf); 
 
 if ($.isFunction(conf)) {
 conf = {onBeforeShow: conf};
 
 } else if (typeof conf == 'string') {
 conf = {tip: conf}; 
 }

 conf = $.extend(true, globals, conf);
 
 // can also be given as string
 if (typeof conf.position == 'string') {
 conf.position = conf.position.split(/,?\s/); 
 }
 
 // assign tip's only when apiement is being mouseovered 
 if (conf.lazy !== false && (conf.lazy === true || this.length > 20)) { 
 
 this.one("mouseover", function(e) { 
 api = new Tooltip($(this), conf);
 api.show(e);
 }); 
 
 } else {
 
 // install tooltip for each entry in jQuery object
 this.each(function() {
 api = new Tooltip($(this), conf); 
 });
 } 

 return conf.api ? api: this; 
 
 };
 
}) (jQuery);

 


/**
 * tools.tooltip "Slide Effect" 1.0.0
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/tooltip.html#slide
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * Since : September 2009
 * Date: ${date}
 * Revision: ${revision} 
 */
(function($) { 

 // version number
 var t = $.tools.tooltip;
 t.effects = t.effects || {};
 t.effects.slide = {version: '1.0.0'}; 
 
 // extend global configuragion with effect specific defaults
 $.extend(t.conf, { 
 direction: 'up', // down, left, right 
 bounce: false,
 slideOffset: 10,
 slideInSpeed: 200,
 slideOutSpeed: 200, 
 slideFade: !$.browser.msie
 }); 
 
 // directions for slide effect
 var dirs = {
 up: ['-', 'top'],
 down: ['+', 'top'],
 left: ['-', 'left'],
 right: ['+', 'left']
 };
 
 /* default effect: "slide" */
 $.tools.tooltip.addEffect("slide", 
 
 // show effect
 function(done) { 
 
 // variables
 var conf = this.getConf(), 
 tip = this.getTip(),
 params = conf.slideFade ? {opacity: conf.opacity} : {}, 
 dir = dirs[conf.direction] || dirs.up;

 // direction 
 params[dir[1]] = dir[0] +'='+ conf.slideOffset;
 
 // perform animation
 if (conf.slideFade) { tip.css({opacity:0}); }
 tip.show().animate(params, conf.slideInSpeed, done); 
 }, 
 
 // hide effect
 function(done) {
 
 // variables
 var conf = this.getConf(), 
 offset = conf.slideOffset,
 params = conf.slideFade ? {opacity: 0} : {}, 
 dir = dirs[conf.direction] || dirs.up;
 
 // direction
 var sign = "" + dir[0];
 if (conf.bounce) { sign = sign == '+' ? '-' : '+'; } 
 params[dir[1]] = sign +'='+ offset; 
 
 // perform animation
 this.getTip().animate(params, conf.slideOutSpeed, function() {
 $(this).hide();
 done.call(); 
 });
 }
 ); 
 
})(jQuery); 
 

/**
 * tools.tooltip "Dynamic Plugin" 1.0.1
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/tooltip.html#dynamic
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * Since : July 2009
 * Date: ${date}
 * Revision: ${revision} 
 */
(function($) { 

 // version number
 var t = $.tools.tooltip;
 t.plugins = t.plugins || {};
 
 t.plugins.dynamic = {
 version: '1.0.1',
 
 conf: {
 api: false,
 classNames: "top right bottom left"
 }
 };
 
 /* 
 * See if element is on the viewport. Returns an boolean array specifying which
 * edges are hidden. Edges are in following order:
 * 
 * [top, right, bottom, left]
 * 
 * For example following return value means that top and right edges are hidden
 * 
 * [true, true, false, false]
 * 
 */
 function getCropping(el) {
 
 var w = $(window); 
 var right = w.width() + w.scrollLeft();
 var bottom = w.height() + w.scrollTop(); 
 
 return [
 el.offset().top <= w.scrollTop(), // top
 right <= el.offset().left + el.width(), // right
 bottom <= el.offset().top + el.height(), // bottom
 w.scrollLeft() >= el.offset().left // left
 ]; 
 }
 
 /*
 Returns true if all edges of an element are on viewport. false if not
 
 @param crop the cropping array returned by getCropping function
 */
 function isVisible(crop) {
 var i = crop.length;
 while (i--) {
 if (crop[i]) { return false; } 
 }
 return true;
 }
 
 // scrollable mousewheel implementation
 $.fn.dynamic = function(conf) {
 
 var globals = $.extend({}, t.plugins.dynamic.conf), ret;
 if (typeof conf == 'number') { conf = {speed: conf}; }
 conf = $.extend(globals, conf);
 
 var cls = conf.classNames.split(/\s/), orig; 
 
 this.each(function() { 
 
 if ($(this).tooltip().jquery) {
 throw "Lazy feature not supported by dynamic plugin. set lazy: false for tooltip"; 
 }
 
 var api = $(this).tooltip().onBeforeShow(function(e, pos) { 

 // get nessessary variables
 var tip = this.getTip(), conf = this.getConf(); 

 /*
 We store the original configuration and use it to restore back to the original state.
 */ 
 if (!orig) {
 orig = [
 conf.position[0], 
 conf.position[1], 
 conf.offset[0], 
 conf.offset[1], 
 $.extend({}, conf)
 ];
 }
 
 /*
 display tip in it's default position and by setting visibility to hidden.
 this way we can check whether it will be on the viewport
 */
 $.extend(conf, orig[4]);
 conf.position = [orig[0], orig[1]];
 conf.offset = [orig[2], orig[3]];
 
 tip.css({
 visibility: 'hidden',
 position: 'absolute',
 top: pos.top,
 left: pos.left
 
 }).show(); 
 
 // now let's see for hidden edges
 var crop = getCropping(tip); 
 
 // possibly alter the configuration
 if (!isVisible(crop)) {
 
 // change the position and add class
 if (crop[2]) { $.extend(conf, conf.top); conf.position[0] = 'top'; tip.addClass(cls[0]); }
 if (crop[3]) { $.extend(conf, conf.right); conf.position[1] = 'right'; tip.addClass(cls[1]); } 
 if (crop[0]) { $.extend(conf, conf.bottom); conf.position[0] = 'bottom'; tip.addClass(cls[2]); } 
 if (crop[1]) { $.extend(conf, conf.left); conf.position[1] = 'left'; tip.addClass(cls[3]); } 
 
 
 // vertical offset
 if (crop[0] || crop[2]) { conf.offset[0] *= -1; }
 
 // horizontal offset
 if (crop[1] || crop[3]) { conf.offset[1] *= -1; }
 } 
 
 tip.css({visibility: 'visible'}).hide();
 
 });
 
 // restore positioning
 api.onShow(function() {
 var c = this.getConf(), tip = this.getTip(); 
 c.position = [orig[0], orig[1]];
 c.offset = [orig[2], orig[3]]; 
 });
 
 // remove custom class names and restore original effect
 api.onHide(function() {
 var tip = this.getTip(); 
 tip.removeClass(conf.classNames);
 $.extend(conf, orig[4]);
 });
 
 ret = api;
 
 });
 
 return conf.api ? ret : this;
 }; 
 
}) (jQuery);

/**
 * tools.scrollable 1.1.1 - Scroll your HTML with eye candy.
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/scrollable.html
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * Launch : March 2008
 * Date: ${date}
 * Revision: ${revision} 
 */
(function($) { 
 
 // static constructs
 $.tools = $.tools || {};
 
 $.tools.scrollable = {
 version: '1.1.1',
 
 conf: {
 
 // basics
 size: 5,
 vertical: false,
 speed: 400,
 keyboard: true, 
 
 // by default this is the same as size
 keyboardSteps: null, 
 
 // other
 disabledClass: 'disabled',
 hoverClass: null, 
 clickable: true,
 activeClass: 'active', 
 easing: 'swing',
 loop: false,
 
 items: '.items',
 item: null,
 
 // navigational elements 
 prev: '.prev',
 next: '.next',
 prevPage: '.prevPage',
 nextPage: '.nextPage', 
 api: false
 
 // CALLBACKS: onBeforeSeek, onSeek, onReload
 } 
 };
 
 // len = amount of instances
 var current, len = 0; 
 
 // constructor
 function Scrollable(root, conf, len) { 
 
 // current instance
 var self = this, $self = $(this),
 horizontal = !conf.vertical,
 wrap = root.children(),
 index = 0,
 forward; 
 
 
 if (!current) { current = self; }
 
 // bind all callbacks from configuration
 $.each(conf, function(name, fn) {
 if ($.isFunction(fn)) { $self.bind(name, fn); }
 });

 
 if (wrap.length > 1) { wrap = $(conf.items, root); }
 
 // navi can be anywhere when: single scrollable or single navi element or globalNav = true
 function find(query) {
 var els = $(query);
 return len == 1 || els.length == 1 || conf.globalNav ? els : root.parent().find(query); 
 }

 // to be used by plugins
 root.data("finder", find);
 
 // get handle to navigational elements
 var prev = find(conf.prev),
 next = find(conf.next),
 prevPage = find(conf.prevPage),
 nextPage = find(conf.nextPage);

 
 // methods
 $.extend(self, {
 
 getIndex: function() {
 return index; 
 },
 
 getClickIndex: function() {
 var items = self.getItems(); 
 return items.index(items.filter("." + conf.activeClass)); 
 },
 
 getConf: function() {
 return conf; 
 },
 
 getSize: function() {
 return self.getItems().size(); 
 },
 
 getPageAmount: function() {
 return Math.ceil(this.getSize() / conf.size); 
 },
 
 getPageIndex: function() {
 return Math.ceil(index / conf.size); 
 },

 getNaviButtons: function() {
 return prev.add(next).add(prevPage).add(nextPage); 
 },
 
 getRoot: function() {
 return root; 
 },
 
 getItemWrap: function() {
 return wrap; 
 },
 
 getItems: function() {
 return wrap.children(conf.item); 
 },
 
 getVisibleItems: function() {
 return self.getItems().slice(index, index + conf.size); 
 },
 
 /* all seeking functions depend on this */ 
 seekTo: function(i, time, fn) {

 if (i < 0) { i = 0; } 
 
 // nothing happens
 if (index === i) { return self; } 
 
 // default speed
 if (time === undefined) { time = conf.speed; }
 
 // function given as second argument
 if ($.isFunction(time)) {
 fn = time;
 time = conf.speed;
 } 

 // seeking exceeds the end 
 if (i > self.getSize() - conf.size) { 
 return conf.loop ? self.begin() : this.end(); 
 } 

 var item = self.getItems().eq(i); 
 if (!item.length) { return self; } 
 
 // onBeforeSeek
 var e = $.Event("onBeforeSeek");

 $self.trigger(e, [i]); 
 if (e.isDefaultPrevented()) { return self; }
 
 function callback() {
 if (fn) { fn.call(self); }
 $self.trigger("onSeek", [i]);
 }
 
 if (horizontal) {
 wrap.animate({left: -item.position().left}, time, conf.easing, callback); 
 } else {
 wrap.animate({top: -item.position().top}, time, conf.easing, callback); 
 }
 
 current = self;
 index = i; 
 return self; 
 }, 
 
 
 move: function(offset, time, fn) {
 forward = offset > 0;
 return this.seekTo(index + offset, time, fn);
 },
 
 next: function(time, fn) {
 return this.move(1, time, fn); 
 },
 
 prev: function(time, fn) {
 return this.move(-1, time, fn); 
 },
 
 movePage: function(offset, time, fn) {
 forward = offset > 0;
 var steps = conf.size * offset;
 
 var i = index % conf.size;
 if (i > 0) {
 steps += (offset > 0 ? -i : conf.size - i);
 }
 
 return this.move(steps, time, fn); 
 },
 
 prevPage: function(time, fn) {
 return this.movePage(-1, time, fn);
 }, 
 
 nextPage: function(time, fn) {
 return this.movePage(1, time, fn);
 }, 
 
 setPage: function(page, time, fn) {
 return this.seekTo(page * conf.size, time, fn);
 }, 
 
 begin: function(time, fn) {
 forward = false;
 return this.seekTo(0, time, fn); 
 },
 
 end: function(time, fn) {
 forward = true;
 var to = this.getSize() - conf.size;
 return to > 0 ? this.seekTo(to, time, fn) : self; 
 },
 
 reload: function() { 
 $self.trigger("onReload");
 return self;
 },

 // callback functions
 bind: function(name, fn) {
 $self.bind(name, fn);
 return self; 
 }, 
 
 onBeforeSeek: function(fn) {
 return this.bind("onBeforeSeek", fn);
 },
 
 onSeek: function(fn) {
 return this.bind("onSeek", fn);
 },
 
 onReload: function(fn) {
 return this.bind("onReload", fn);
 },
 
 unbind: function(name) {
 $self.unbind(name);
 return self; 
 }, 
 
 focus: function() {
 current = self;
 return self;
 },
 
 click: function(i) {
 
 var item = self.getItems().eq(i), 
 klass = conf.activeClass,
 size = conf.size; 
 
 // check that i is sane
 if (i < 0 || i >= self.getSize()) { return self; }
 
 // size == 1 
 if (size == 1) {
 if (conf.loop) { return self.next(); }
 
 if (i === 0 || i == self.getSize() -1) { 
 forward = (forward === undefined) ? true : !forward; 
 }
 return forward === false ? self.prev() : self.next(); 
 } 
 
 // size == 2
 if (size == 2) {
 if (i == index) { i--; }
 self.getItems().removeClass(klass);
 item.addClass(klass); 
 return self.seekTo(i, time, fn);
 } 
 
 if (!item.hasClass(klass)) { 
 self.getItems().removeClass(klass);
 item.addClass(klass);
 var delta = Math.floor(size / 2);
 var to = i - delta;
 
 // next to last item must work
 if (to > self.getSize() - size) { 
 to = self.getSize() - size; 
 }
 
 if (to !== i) {
 return self.seekTo(to); 
 }
 }
 
 return self;
 } 
 
 });
 
 // prev button 
 prev.addClass(conf.disabledClass).click(function() {
 self.prev(); 
 });
 

 // next button
 next.click(function() { 
 self.next(); 
 });
 
 // prev page button
 nextPage.click(function() { 
 self.nextPage(); 
 });
 

 // next page button
 prevPage.addClass(conf.disabledClass).click(function() { 
 self.prevPage(); 
 }); 

 
 self.onSeek(function(e, i) { 
 
 // prev buttons disabled flag
 if (i === 0) {
 prev.add(prevPage).addClass(conf.disabledClass); 
 } else {
 prev.add(prevPage).removeClass(conf.disabledClass);
 }
 
 // next buttons disabled flag
 if (i >= self.getSize() - conf.size) {
 next.add(nextPage).addClass(conf.disabledClass);
 } else {
 next.add(nextPage).removeClass(conf.disabledClass);
 } 
 });
 
 
 // hover
 var hc = conf.hoverClass, keyId = "keydown." + Math.random().toString().substring(10); 
 
 self.onReload(function() { 

 // hovering
 if (hc) {
 self.getItems().hover(function() {
 $(this).addClass(hc); 
 }, function() {
 $(this).removeClass(hc); 
 }); 
 }
 
 // clickable
 if (conf.clickable) {
 self.getItems().each(function(i) {
 $(this).unbind("click.scrollable").bind("click.scrollable", function(e) {
 if ($(e.target).is("a")) { return; } 
 return self.click(i);
 });
 });
 } 
 
 // keyboard 
 if (conf.keyboard) { 
 
 // keyboard works on one instance at the time. thus we need to unbind first
 $(document).unbind(keyId).bind(keyId, function(evt) {

 // do nothing with CTRL / ALT buttons
 if (evt.altKey || evt.ctrlKey) { return; }
 
 // do nothing for unstatic and unfocused instances
 if (conf.keyboard != 'static' && current != self) { return; }
 
 var s = conf.keyboardSteps; 
 
 if (horizontal && (evt.keyCode == 37 || evt.keyCode == 39)) { 
 self.move(evt.keyCode == 37 ? -s : s);
 return evt.preventDefault();
 } 
 
 if (!horizontal && (evt.keyCode == 38 || evt.keyCode == 40)) {
 self.move(evt.keyCode == 38 ? -s : s);
 return evt.preventDefault();
 }
 
 return true;
 
 });
 
 } else {
 $(document).unbind(keyId); 
 } 

 });
 
 self.reload(); 
 
 } 

 
 // jQuery plugin implementation
 $.fn.scrollable = function(conf) { 
 
 // already constructed --> return API
 var el = this.eq(typeof conf == 'number' ? conf : 0).data("scrollable");
 if (el) { return el; } 
 
 var globals = $.extend({}, $.tools.scrollable.conf);
 conf = $.extend(globals, conf);
 
 conf.keyboardSteps = conf.keyboardSteps || conf.size;
 
 len += this.length;
 
 this.each(function() { 
 el = new Scrollable($(this), conf);
 $(this).data("scrollable", el); 
 });
 
 return conf.api ? el: this; 
 
 };
 
 
})(jQuery);

/**
 * tools.overlay 1.1.1 - Overlay HTML with eye candy.
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/overlay.html
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * Launch : March 2008
 * Date: ${date}
 * Revision: ${revision} 
 */
(function($) { 

 // static constructs
 $.tools = $.tools || {};
 
 $.tools.overlay = {
 
 version: '1.1.1',
 
 addEffect: function(name, loadFn, closeFn) {
 effects[name] = [loadFn, closeFn]; 
 },
 
 conf: { 
 top: '10%', 
 left: 'center',
 absolute: false,
 
 speed: 'normal',
 closeSpeed: 'fast',
 effect: 'default',
 
 close: null, 
 oneInstance: true,
 closeOnClick: true,
 closeOnEsc: true, 
 api: false,
 expose: null,
 
 // target element to be overlayed. by default taken from [rel]
 target: null 
 }
 };

 
 var effects = {};
 
 // the default effect. nice and easy!
 $.tools.overlay.addEffect('default', 
 
 /* 
 onLoad/onClose functions must be called otherwise none of the 
 user supplied callback methods won't be called
 */
 function(onLoad) { 
 this.getOverlay().fadeIn(this.getConf().speed, onLoad); 
 
 }, function(onClose) {
 this.getOverlay().fadeOut(this.getConf().closeSpeed, onClose); 
 } 
 );
 
 
 var instances = []; 

 
 function Overlay(trigger, conf) { 
 
 // private variables
 var self = this, 
 $self = $(this),
 w = $(window), 
 closers,
 overlay,
 opened,
 expose = conf.expose && $.tools.expose.version;
 
 // get overlay and triggerr
 var jq = conf.target || trigger.attr("rel");
 overlay = jq ? $(jq) : null || trigger; 
 
 
 // if trigger is given - assign it's click event
 if (trigger && trigger.index(overlay) == -1) {
 trigger.click(function(e) { 
 self.load();
 return e.preventDefault();
 });
 } 
 
 // bind all callbacks from configuration
 $.each(conf, function(name, fn) {
 if ($.isFunction(fn)) { $self.bind(name, fn); }
 }); 
 
 
 // API methods 
 $.extend(self, {

 load: function() {
 
 // can be opened only once
 if (self.isOpened()) { return self; } 

 // close other instances?
 if (conf.oneInstance) {
 $.each(instances, function() {
 this.close();
 });
 }
 
 // onBeforeLoad
 var e = $.Event("onBeforeLoad");
 $self.trigger(e); 
 if (e.isDefaultPrevented()) { return self; } 

 // opened
 opened = true;
 
 // possible expose effect
 if (expose) { overlay.expose().load(); } 
 
 // calculate end position 
 var top = conf.top; 
 var left = conf.left;

 // get overlay dimensions
 var oWidth = overlay.outerWidth({margin:true});
 var oHeight = overlay.outerHeight({margin:true}); 
 
 if (typeof top == 'string') {
 top = top == 'center' ? Math.max((w.height() - oHeight) / 2, 0) : 
 parseInt(top, 10) / 100 * w.height(); 
 } 
 
 if (left == 'center') { left = Math.max((w.width() - oWidth) / 2, 0); }
 
 if (!conf.absolute) {
 top += w.scrollTop();
 left += w.scrollLeft();
 } 
 
 // position overlay
 overlay.css({top: top, left: left, position: 'absolute'}); 
 
 // load effect 
 effects[conf.effect][0].call(self, function() { 
 if (opened) {
 $self.trigger("onLoad");
 }
 }); 
 
 // when window is clicked outside overlay, we close
 if (conf.closeOnClick) { 
 $(document).bind("click.overlay", function(evt) { 
 if (!self.isOpened()) { return; }
 var et = $(evt.target); 
 if (et.parents(overlay).length > 1) { return; }
 $.each(instances, function() {
 this.close();
 }); 
 }); 
 } 
 
 // keyboard::escape
 if (conf.closeOnEsc) {
 
 // one callback is enough if multiple instances are loaded simultaneously
 $(document).unbind("keydown.overlay").bind("keydown.overlay", function(evt) {
 if (evt.keyCode == 27) {
 $.each(instances, function() {
 this.close(); 
 }); 
 }
 }); 
 }

 return self; 
 }, 
 
 close: function() {

 if (!self.isOpened()) { return self; }
 
 var e = $.Event("onBeforeClose");
 $self.trigger(e); 
 if (e.isDefaultPrevented()) { return; } 
 
 opened = false;
 
 // close effect
 effects[conf.effect][1].call(self, function() { 
 $self.trigger("onClose"); 
 });
 
 // if all instances are closed then we unbind the keyboard / clicking actions
 var allClosed = true;
 $.each(instances, function() {
 if (this.isOpened()) { allClosed = false; }
 }); 
 
 if (allClosed) {
 $(document).unbind("click.overlay").unbind("keydown.overlay"); 
 }
 
 
 return self;
 }, 
 
 // @deprecated
 getContent: function() {
 return overlay; 
 }, 
 
 getOverlay: function() {
 return overlay; 
 },
 
 getTrigger: function() {
 return trigger; 
 },
 
 getClosers: function() {
 return closers; 
 }, 

 isOpened: function() {
 return opened;
 },
 
 // manipulate start, finish and speeds
 getConf: function() {
 return conf; 
 },

 // callback functions
 bind: function(name, fn) {
 $self.bind(name, fn);
 return self; 
 }, 
 
 onBeforeLoad: function(fn) {
 return this.bind("onBeforeLoad", fn);
 },
 
 onLoad: function(fn) {
 return this.bind("onLoad", fn);
 },
 
 onBeforeClose: function(fn) {
 return this.bind("onBeforeClose", fn);
 },
 
 onClose: function(fn) {
 return this.bind("onClose", fn);
 },
 
 unbind: function(name) {
 $self.unbind(name);
 return self; 
 } 
 
 }); 
 

 // exposing effect
 if (expose) {
 
 // expose configuration
 if (typeof conf.expose == 'string') { conf.expose = {color: conf.expose}; }
 
 $.extend(conf.expose, {
 api: true,
 closeOnClick: conf.closeOnClick,
 
 // only overlay control's the esc button
 closeOnEsc: false
 });
 
 // initialize expose api
 var e = overlay.expose(conf.expose);
 
 e.onBeforeClose(function() { 
 self.close(); 
 });
 
 self.onClose(function() {
 e.close(); 
 });
 } 
 
 // close button
 closers = overlay.find(conf.close || ".close"); 
 
 if (!closers.length && !conf.close) {
 closers = $('<div class="close"></div>');
 overlay.prepend(closers); 
 } 
 
 closers.click(function() { 
 self.close(); 
 }); 
 }
 
 // jQuery plugin initialization
 $.fn.overlay = function(conf) { 
 
 // already constructed --> return API
 var el = this.eq(typeof conf == 'number' ? conf : 0).data("overlay");
 if (el) { return el; } 
 
 if ($.isFunction(conf)) {
 conf = {onBeforeLoad: conf}; 
 }
 
 var globals = $.extend({}, $.tools.overlay.conf); 
 conf = $.extend(true, globals, conf);
 
 this.each(function() { 
 el = new Overlay($(this), conf);
 instances.push(el);
 $(this).data("overlay", el); 
 });
 
 return conf.api ? el: this; 
 }; 
 
})(jQuery);


/**
 * tools.expose 1.0.5 - Make HTML elements stand out
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/expose.html
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * Launch : June 2008
 * Date: ${date}
 * Revision: ${revision} 
 */
(function($) { 

 // static constructs
 $.tools = $.tools || {};
 
 $.tools.expose = {
 version: '1.0.5', 
 conf: { 

 // mask settings
 maskId: null,
 loadSpeed: 'slow',
 closeSpeed: 'fast',
 closeOnClick: true,
 closeOnEsc: true,
 
 // css settings
 zIndex: 9998,
 opacity: 0.8,
 color: '#456',
 api: false
 }
 };

 /* one of the greatest headaches in the tool. finally made it */
 function viewport() {
 
 // the horror case
 if ($.browser.msie) {
 
 // if there are no scrollbars then use window.height
 var d = $(document).height(), w = $(window).height();
 
 return [
 window.innerWidth || // ie7+
 document.documentElement.clientWidth || // ie6 
 document.body.clientWidth, // ie6 quirks mode
 d - w < 20 ? w : d
 ];
 } 
 
 // other well behaving browsers
 return [$(window).width(), $(document).height()];
 
 } 
 
 function Expose(els, conf) { 
 
 // private variables
 var self = this, $self = $(this), mask = null, loaded = false, origIndex = 0; 
 
 // bind all callbacks from configuration
 $.each(conf, function(name, fn) {
 if ($.isFunction(fn)) { $self.bind(name, fn); }
 }); 

 // adjust mask size when window is resized (or firebug is toggled)
 $(window).resize(function() {
 self.fit();
 }); 
 
 
 // public methods
 $.extend(this, {
 
 getMask: function() {
 return mask; 
 },
 
 getExposed: function() {
 return els; 
 },
 
 getConf: function() {
 return conf; 
 }, 
 
 isLoaded: function() {
 return loaded; 
 },
 
 load: function() { 
 
 // already loaded ?
 if (loaded) { return self; }
 
 origIndex = els.eq(0).css("zIndex"); 
 
 // find existing mask
 if (conf.maskId) { mask = $("#" + conf.maskId); }
 
 if (!mask || !mask.length) {
 
 var size = viewport();
 
 mask = $('<div/>').css({ 
 position:'absolute', 
 top:0, 
 left:0,
 width: size[0],
 height: size[1],
 display:'none',
 opacity: 0, 
 zIndex:conf.zIndex 
 }); 
 
 // id
 if (conf.maskId) { mask.attr("id", conf.maskId); } 
 
 $("body").append(mask); 
 
 
 // background color 
 var bg = mask.css("backgroundColor");
 
 if (!bg || bg == 'transparent' || bg == 'rgba(0, 0, 0, 0)') {
 mask.css("backgroundColor", conf.color); 
 } 
 
 // esc button
 if (conf.closeOnEsc) { 
 $(document).bind("keydown.unexpose", function(evt) { 
 if (evt.keyCode == 27) {
 self.close(); 
 } 
 }); 
 }
 
 // mask click closes
 if (conf.closeOnClick) {
 mask.bind("click.unexpose", function() {
 self.close(); 
 }); 
 } 
 } 
 
 // possibility to cancel click action
 var e = $.Event("onBeforeLoad");
 $self.trigger(e); 
 if (e.isDefaultPrevented()) { return self; }
 
 
 // make sure element is positioned absolutely or relatively
 $.each(els, function() {
 var el = $(this);
 if (!/relative|absolute|fixed/i.test(el.css("position"))) {
 el.css("position", "relative"); 
 } 
 });
 
 // make elements sit on top of the mask 
 els.css({zIndex:Math.max(conf.zIndex + 1, origIndex == 'auto' ? 0 : origIndex)}); 

 
 // reveal mask
 var h = mask.height();
 
 if (!this.isLoaded()) { 
 mask.css({opacity: 0, display: 'block'}).fadeTo(conf.loadSpeed, conf.opacity, function() {

 // sometimes IE6 misses the height property on fadeTo method
 if (mask.height() != h) { mask.css("height", h); } 
 $self.trigger("onLoad"); 
 
 }); 
 }
 
 loaded = true; 
 return self;
 }, 
 
 
 close: function() {
 
 if (!loaded) { return self; } 

 var e = $.Event("onBeforeClose");
 $self.trigger(e); 
 if (e.isDefaultPrevented()) { return self; }
 
 mask.fadeOut(conf.closeSpeed, function() {
 $self.trigger("onClose");
 els.css({zIndex: $.browser.msie ? origIndex : null});
 }); 
 
 loaded = false;
 return self; 
 },
 
 fit: function() {
 if (mask) {
 var size = viewport(); 
 mask.css({ width: size[0], height: size[1]});
 } 
 },
 
 bind: function(name, fn) {
 $self.bind(name, fn);
 return self; 
 }, 
 
 onBeforeLoad: function(fn) {
 return this.bind("onBeforeLoad", fn);
 },
 
 onLoad: function(fn) {
 return this.bind("onLoad", fn);
 },
 
 onBeforeClose: function(fn) {
 return this.bind("onBeforeClose", fn);
 },
 
 onClose: function(fn) {
 return this.bind("onClose", fn);
 },
 
 unbind: function(name) {
 $self.unbind(name);
 return self; 
 } 
 
 });

 }
 
 
 // jQuery plugin implementation
 $.fn.expose = function(conf) {
 
 var el = this.eq(typeof conf == 'number' ? conf : 0).data("expose");
 if (el) { return el; }
 
 if (typeof conf == 'string') {
 conf = {color: conf};
 }
 
 var globals = $.extend({}, $.tools.expose.conf);
 conf = $.extend(globals, conf); 

 // construct exposes
 this.each(function() {
 el = new Expose($(this), conf);
 $(this).data("expose", el); 
 }); 
 
 return conf.api ? el: this; 
 }; 


})(jQuery);

/** 
 * flowplayer.js 3.1.1. The Flowplayer API
 * 
 * Copyright 2009 Flowplayer Oy
 * 
 * This file is part of Flowplayer.
 * 
 * Flowplayer is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Flowplayer is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Flowplayer. If not, see <http://www.gnu.org/licenses/>.
 * 
 * Date: 2009-02-25 16:24:29 -0500 (Wed, 25 Feb 2009)
 * Revision: 166 
 */
(function() {
 
/* 
 FEATURES 
 --------
 - $f() and flowplayer() functions 
 - handling multiple instances 
 - Flowplayer programming API 
 - Flowplayer event model 
 - player loading / unloading 
 - jQuery support
*/ 
 

/*jslint glovar: true, browser: true */
/*global flowplayer, $f */

// {{{ private utility methods
 
 function log(args) {
 console.log("$f.fireEvent", [].slice.call(args)); 
 }

 
 // thanks: http://keithdevens.com/weblog/archive/2007/Jun/07/javascript.clone
 function clone(obj) { 
 if (!obj || typeof obj != 'object') { return obj; } 
 var temp = new obj.constructor(); 
 for (var key in obj) { 
 if (obj.hasOwnProperty(key)) {
 temp[key] = clone(obj[key]);
 }
 } 
 return temp;
 }

 // stripped from jQuery, thanks John Resig 
 function each(obj, fn) {
 if (!obj) { return; }
 
 var name, i = 0, length = obj.length;
 
 // object
 if (length === undefined) {
 for (name in obj) {
 if (fn.call(obj[name], name, obj[name]) === false) { break; }
 }
 
 // array
 } else {
 for (var value = obj[0];
 i < length && fn.call( value, i, value ) !== false; value = obj[++i]) { 
 }
 }
 
 return obj;
 }

 
 // convenience
 function el(id) {
 return document.getElementById(id); 
 } 

 
 // used extensively. a very simple implementation. 
 function extend(to, from, skipFuncs) {
 if (typeof from != 'object') { return to; }
 
 if (to && from) { 
 each(from, function(name, value) {
 if (!skipFuncs || typeof value != 'function') {
 to[name] = value; 
 }
 });
 }
 
 return to;
 }
 
 // var arr = select("elem.className"); 
 function select(query) {
 var index = query.indexOf("."); 
 if (index != -1) {
 var tag = query.substring(0, index) || "*";
 var klass = query.substring(index + 1, query.length);
 var els = [];
 each(document.getElementsByTagName(tag), function() {
 if (this.className && this.className.indexOf(klass) != -1) {
 els.push(this); 
 }
 });
 return els;
 }
 }
 
 // fix event inconsistencies across browsers
 function stopEvent(e) {
 e = e || window.event;
 
 if (e.preventDefault) {
 e.stopPropagation();
 e.preventDefault();
 
 } else {
 e.returnValue = false; 
 e.cancelBubble = true;
 } 
 return false;
 }

 // push an event listener into existing array of listeners
 function bind(to, evt, fn) {
 to[evt] = to[evt] || [];
 to[evt].push(fn); 
 }
 
 
 // generates an unique id
 function makeId() {
 return "_" + ("" + Math.random()).substring(2, 10); 
 }
 
//}}} 
 

// {{{ Clip

 var Clip = function(json, index, player) {
 
 // private variables
 var self = this;
 var cuepoints = {};
 var listeners = {}; 
 self.index = index;
 
 // instance variables
 if (typeof json == 'string') {
 json = {url:json}; 
 }
 
 extend(this, json, true); 
 
 // event handling 
 each(("Begin*,Start,Pause*,Resume*,Seek*,Stop*,Finish*,LastSecond,Update,BufferFull,BufferEmpty,BufferStop").split(","),
 function() {
 
 var evt = "on" + this;
 
 // before event
 if (evt.indexOf("*") != -1) {
 evt = evt.substring(0, evt.length -1); 
 var before = "onBefore" + evt.substring(2); 
 
 self[before] = function(fn) {
 bind(listeners, before, fn);
 return self;
 }; 
 } 
 
 self[evt] = function(fn) {
 bind(listeners, evt, fn);
 return self;
 };
 
 
 // set common clip event listeners to player level
 if (index == -1) {
 if (self[before]) {
 player[before] = self[before]; 
 } 
 if (self[evt]) {
 player[evt] = self[evt]; 
 }
 }
 
 }); 
 
 extend(this, { 
 
 onCuepoint: function(points, fn) { 
 
 // embedded cuepoints
 if (arguments.length == 1) {
 cuepoints.embedded = [null, points];
 return self;
 }
 
 if (typeof points == 'number') {
 points = [points]; 
 }
 
 var fnId = makeId(); 
 cuepoints[fnId] = [points, fn]; 
 
 if (player.isLoaded()) {
 player._api().fp_addCuepoints(points, index, fnId); 
 } 
 
 return self;
 },
 
 update: function(json) {
 extend(self, json);

 if (player.isLoaded()) {
 player._api().fp_updateClip(json, index); 
 }
 var conf = player.getConfig(); 
 var clip = (index == -1) ? conf.clip : conf.playlist[index];
 extend(clip, json, true);
 },
 
 
 // internal event for performing clip tasks. should be made private someday
 _fireEvent: function(evt, arg1, arg2, target) { 
 
 if (evt == 'onLoad') { 
 each(cuepoints, function(key, val) {
 if (val[0]) {
 player._api().fp_addCuepoints(val[0], index, key); 
 }
 }); 
 return false;
 }
 
 // target clip we are working against
 target = target || self; 
 
 if (evt == 'onCuepoint') {
 var fn = cuepoints[arg1];
 if (fn) {
 return fn[1].call(player, target, arg2);
 }
 } 
 
 if (evt == 'onStart' || evt == 'onUpdate' || evt == 'onResume') {
 
 extend(target, arg1); 
 
 if (!target.duration) {
 target.duration = arg1.metaData.duration; 
 } else {
 target.fullDuration = arg1.metaData.duration; 
 } 
 } 
 
 var ret = true;
 each(listeners[evt], function() {
 ret = this.call(player, target, arg1, arg2); 
 }); 
 return ret; 
 } 
 
 });
 
 
 // get cuepoints from config
 if (json.onCuepoint) {
 var arg = json.onCuepoint;
 self.onCuepoint.apply(self, typeof arg == 'function' ? [arg] : arg);
 delete json.onCuepoint;
 } 
 
 // get other events
 each(json, function(key, val) {
 if (typeof val == 'function') {
 bind(listeners, key, val);
 delete json[key]; 
 }
 });

 
 // setup common clip event callbacks for Player object too (shortcuts)
 if (index == -1) {
 player.onCuepoint = this.onCuepoint; 
 }
 
 };

//}}}


// {{{ Plugin
 
 var Plugin = function(name, json, player, fn) {
 
 var listeners = {};
 var self = this; 
 var hasMethods = false;
 
 if (fn) {
 extend(listeners, fn); 
 } 
 
 // custom callback functions in configuration
 each(json, function(key, val) {
 if (typeof val == 'function') {
 listeners[key] = val;
 delete json[key]; 
 }
 }); 
 
 // core plugin methods 
 extend(this, {
 
 // speed and fn are optional
 animate: function(props, speed, fn) { 
 if (!props) {
 return self; 
 }
 
 if (typeof speed == 'function') { 
 fn = speed; 
 speed = 500;
 }
 
 if (typeof props == 'string') {
 var key = props;
 props = {};
 props[key] = speed;
 speed = 500; 
 }
 
 if (fn) {
 var fnId = makeId();
 listeners[fnId] = fn;
 }
 
 if (speed === undefined) { speed = 500; }
 json = player._api().fp_animate(name, props, speed, fnId); 
 return self;
 },
 
 css: function(props, val) {
 if (val !== undefined) {
 var css = {};
 css[props] = val;
 props = css; 
 }
 json = player._api().fp_css(name, props);
 extend(self, json);
 return self;
 },
 
 show: function() {
 this.display = 'block';
 player._api().fp_showPlugin(name);
 return self;
 },
 
 hide: function() {
 this.display = 'none';
 player._api().fp_hidePlugin(name);
 return self;
 },
 
 // toggle between visible / hidden state
 toggle: function() {
 this.display = player._api().fp_togglePlugin(name);
 return self;
 }, 
 
 fadeTo: function(o, speed, fn) {
 
 if (typeof speed == 'function') { 
 fn = speed; 
 speed = 500;
 }
 
 if (fn) {
 var fnId = makeId();
 listeners[fnId] = fn;
 } 
 this.display = player._api().fp_fadeTo(name, o, speed, fnId);
 this.opacity = o;
 return self;
 },
 
 fadeIn: function(speed, fn) { 
 return self.fadeTo(1, speed, fn); 
 },
 
 fadeOut: function(speed, fn) {
 return self.fadeTo(0, speed, fn); 
 },
 
 getName: function() {
 return name; 
 },
 
 getPlayer: function() {
 return player; 
 },
 
 // internal method. should be made private some day
 _fireEvent: function(evt, arg, arg2) {
 
 // update plugins properties & methods
 if (evt == 'onUpdate') {
 var json = player._api().fp_getPlugin(name); 
 if (!json) { return; } 
 
 extend(self, json);
 delete self.methods;
 
 if (!hasMethods) {
 each(json.methods, function() {
 var method = "" + this; 
 
 self[method] = function() {
 var a = [].slice.call(arguments);
 var ret = player._api().fp_invoke(name, method, a); 
 return ret == 'undefined' ? self : ret;
 };
 });
 hasMethods = true; 
 }
 }
 
 // plugin callbacks
 var fn = listeners[evt];

 if (fn) {
 fn.apply(self, arg);
 
 // "one-shot" callback
 if (evt.substring(0, 1) == "_") {
 delete listeners[evt]; 
 } 
 } 
 } 
 
 });

 };


//}}}


function Player(wrapper, params, conf) { 
 
 // private variables (+ arguments)
 var 
 self = this, 
 api = null, 
 html, 
 commonClip, 
 playlist = [], 
 plugins = {},
 listeners = {},
 playerId,
 apiId,
 
 // n'th player on the page
 playerIndex,
 
 // active clip's index number
 activeIndex,
 
 swfHeight,
 wrapperHeight; 

 
// {{{ public methods 
 
 extend(self, {
 
 id: function() {
 return playerId; 
 }, 
 
 isLoaded: function() {
 return (api !== null); 
 },
 
 getParent: function() {
 return wrapper; 
 },
 
 hide: function(all) {
 if (all) { wrapper.style.height = "0px"; }
 if (api) { api.style.height = "0px"; } 
 return self;
 },

 show: function() {
 wrapper.style.height = wrapperHeight + "px";
 if (api) { api.style.height = swfHeight + "px"; }
 return self;
 }, 
 
 isHidden: function() {
 return api && parseInt(api.style.height, 10) === 0;
 },
 
 
 load: function(fn) { 
 
 if (!api && self._fireEvent("onBeforeLoad") !== false) {
 
 // unload all instances
 each(players, function() {
 this.unload(); 
 });
 
 html = wrapper.innerHTML; 
 
 // do not use splash as alternate content for flashembed
 if (html && !flashembed.isSupported(params.version)) {
 wrapper.innerHTML = ""; 
 } 
 
 // install Flash object inside given container
 flashembed(wrapper, params, {config: conf});
 
 // onLoad listener given as argument
 if (fn) {
 fn.cached = true;
 bind(listeners, "onLoad", fn); 
 }
 }
 
 return self; 
 },
 
 unload: function() {
 
 // check that API is sane
 try {
 if (!api || api.fp_isFullscreen()) { return self; } 
 } catch (error) {
 return self;
 }
 
 // unload only if in splash state
 if (html.replace(/\s/g,'') !== '') {
 
 if (self._fireEvent("onBeforeUnload") === false) {
 return self;
 } 
 api.fp_close();
 api = null; 
 wrapper.innerHTML = html; 
 self._fireEvent("onUnload");
 } 
 
 return self;
 
 },
 
 getClip: function(index) {
 if (index === undefined) {
 index = activeIndex; 
 }
 return playlist[index];
 },
 
 
 getCommonClip: function() {
 return commonClip; 
 }, 
 
 getPlaylist: function() {
 return playlist; 
 },
 
 getPlugin: function(name) { 
 var plugin = plugins[name];
 
 // create plugin if nessessary
 if (!plugin && self.isLoaded()) {
 var json = self._api().fp_getPlugin(name);
 if (json) {
 plugin = new Plugin(name, json, self);
 plugins[name] = plugin; 
 } 
 } 
 return plugin; 
 },
 
 getScreen: function() { 
 return self.getPlugin("screen");
 }, 
 
 getControls: function() { 
 return self.getPlugin("controls");
 }, 

 getConfig: function(copy) { 
 return copy ? clone(conf) : conf;
 },
 
 getFlashParams: function() { 
 return params;
 }, 
 
 loadPlugin: function(name, url, props, fn) { 

 // properties not supplied 
 if (typeof props == 'function') { 
 fn = props; 
 props = {};
 } 
 
 // if fn not given, make a fake id so that plugin's onUpdate get's fired
 var fnId = fn ? makeId() : "_"; 
 self._api().fp_loadPlugin(name, url, props, fnId); 
 
 // create new plugin
 var arg = {};
 arg[fnId] = fn;
 var p = new Plugin(name, null, self, arg);
 plugins[name] = p;
 return p; 
 },
 
 
 getState: function() {
 return api ? api.fp_getState() : -1;
 },
 
 // "lazy" play
 play: function(clip, instream) {
 
 function play() {
 if (clip !== undefined) {
 self._api().fp_play(clip, instream);
 } else {
 self._api().fp_play(); 
 }
 }
 
 if (api) {
 play();
 
 } else {
 self.load(function() { 
 play();
 });
 }
 
 return self;
 },
 
 getVersion: function() {
 var js = "flowplayer.js 3.1.1";
 if (api) {
 var ver = api.fp_getVersion();
 ver.push(js);
 return ver;
 }
 return js; 
 },
 
 _api: function() {
 if (!api) {
 throw "Flowplayer " +self.id()+ " not loaded when calling an API method";
 }
 return api; 
 },
 
 setClip: function(clip) {
 self.setPlaylist([clip]);
 return self;
 },
 
 getIndex: function() {
 return playerIndex; 
 }
 
 }); 
 
 
 // event handlers
 each(("Click*,Load*,Unload*,Keypress*,Volume*,Mute*,Unmute*,PlaylistReplace,ClipAdd,Fullscreen*,FullscreenExit,Error").split(","),
 function() { 
 var name = "on" + this;
 
 // before event
 if (name.indexOf("*") != -1) {
 name = name.substring(0, name.length -1); 
 var name2 = "onBefore" + name.substring(2);
 self[name2] = function(fn) {
 bind(listeners, name2, fn); 
 return self;
 }; 
 }
 
 // normal event
 self[name] = function(fn) {
 bind(listeners, name, fn); 
 return self;
 }; 
 }
 ); 
 
 
 // core API methods
 each(("pause,resume,mute,unmute,stop,toggle,seek,getStatus,getVolume,setVolume,getTime,isPaused,isPlaying,startBuffering,stopBuffering,isFullscreen,toggleFullscreen,reset,close,setPlaylist,addClip").split(","), 
 function() { 
 var name = this;
 
 self[name] = function(a1, a2) {
 if (!api) { return self; }
 var ret = null;
 
 // two arguments
 if (a1 !== undefined && a2 !== undefined) { 
 ret = api["fp_" + name](a1, a2);
 
 } else { 
 ret = (a1 === undefined) ? api["fp_" + name]() : api["fp_" + name](a1);
 }
 
 return ret == 'undefined' ? self : ret;
 }; 
 }
 ); 
 
//}}}


// {{{ public method: _fireEvent
 
 self._fireEvent = function(a) { 
 
 if (typeof a == 'string') { a = [a]; }
 
 var evt = a[0], arg0 = a[1], arg1 = a[2], arg2 = a[3], i = 0; 
 
 if (conf.debug) { log(a); } 
 
 // internal onLoad
 if (!api && evt == 'onLoad' && arg0 == 'player') { 
 
 api = api || el(apiId); 
 swfHeight = api.clientHeight;
 
 each(playlist, function() {
 this._fireEvent("onLoad"); 
 });
 
 each(plugins, function(name, p) {
 p._fireEvent("onUpdate"); 
 }); 
 
 commonClip._fireEvent("onLoad"); 
 }
 
 // other onLoad events are skipped
 if (evt == 'onLoad' && arg0 != 'player') { return; }
 
 
 // "normalize" error handling
 if (evt == 'onError') { 
 if (typeof arg0 == 'string' || (typeof arg0 == 'number' && typeof arg1 == 'number')) {
 arg0 = arg1;
 arg1 = arg2;
 } 
 }
 
 
 if (evt == 'onContextMenu') {
 each(conf.contextMenu[arg0], function(key, fn) {
 fn.call(self);
 });
 return;
 }

 if (evt == 'onPluginEvent') { 
 var name = arg0.name || arg0;
 var p = plugins[name];

 if (p) {
 p._fireEvent("onUpdate", arg0);
 p._fireEvent(arg1, a.slice(3)); 
 }
 return;
 } 

 // replace whole playlist
 if (evt == 'onPlaylistReplace') {
 playlist = [];
 var index = 0;
 each(arg0, function() {
 playlist.push(new Clip(this, index++, self));
 }); 
 }
 
 // insert new clip to the playlist. arg0 = clip, arg1 = index 
 if (evt == 'onClipAdd') {
 
 // instream clip additions are ignored at this point
 if (arg0.isInStream) { return; }
 
 // add new clip into playlist 
 arg0 = new Clip(arg0, arg1, self);
 playlist.splice(arg1, 0, arg0);
 
 // increment index variable for the rest of the clips on playlist 
 for (i = arg1 + 1; i < playlist.length; i++) {
 playlist[i].index++; 
 }
 }
 
 
 var ret = true;
 
 // clip event
 if (typeof arg0 == 'number' && arg0 < playlist.length) {
 
 activeIndex = arg0;
 var clip = playlist[arg0]; 

 if (clip) {
 ret = clip._fireEvent(evt, arg1, arg2); 
 } 
 
 if (!clip || ret !== false) {

 // clip argument is given for common clip, because it behaves as the target
 ret = commonClip._fireEvent(evt, arg1, arg2, clip); 
 } 
 } 
 
 // trigger player event
 each(listeners[evt], function() {
 ret = this.call(self, arg0, arg1); 
 
 // remove cached entry
 if (this.cached) {
 listeners[evt].splice(i, 1); 
 }
 
 // break loop
 if (ret === false) { return false; }
 i++;
 
 }); 

 return ret;
 };

//}}}
 

// {{{ init
 
 function init() {
 
 // replace previous installation 
 if ($f(wrapper)) {
 $f(wrapper).getParent().innerHTML = ""; 
 playerIndex = $f(wrapper).getIndex();
 players[playerIndex] = self;
 
 // register this player into global array of instances
 } else {
 players.push(self);
 playerIndex = players.length -1;
 }
 
 wrapperHeight = parseInt(wrapper.style.height, 10) || wrapper.clientHeight; 
 
 // flashembed parameters
 if (typeof params == 'string') {
 params = {src: params}; 
 } 
 
 // playerId 
 playerId = wrapper.id || "fp" + makeId();
 apiId = params.id || playerId + "_api"; 
 params.id = apiId;
 conf.playerId = playerId;
 

 // plain url is given as config
 if (typeof conf == 'string') {
 conf = {clip:{url:conf}}; 
 } 
 
 if (typeof conf.clip == 'string') {
 conf.clip = {url: conf.clip}; 
 }
 
 // common clip is always there
 conf.clip = conf.clip || {}; 
 
 
 // wrapper href as common clip's url
 if (wrapper.getAttribute("href", 2) && !conf.clip.url) { 
 conf.clip.url = wrapper.getAttribute("href", 2); 
 } 
 
 commonClip = new Clip(conf.clip, -1, self); 
 
 // playlist
 conf.playlist = conf.playlist || [conf.clip]; 
 
 var index = 0;
 
 each(conf.playlist, function() {
 
 var clip = this; 
 
 /* sometimes clip is given as array. this is not accepted. */
 if (typeof clip == 'object' && clip.length) {
 clip = {url: "" + clip}; 
 } 
 
 // populate common clip properties to each clip
 each(conf.clip, function(key, val) {
 if (val !== undefined && clip[key] === undefined && typeof val != 'function') {
 clip[key] = val; 
 }
 }); 
 
 // modify playlist in configuration
 conf.playlist[index] = clip; 
 
 // populate playlist array
 clip = new Clip(clip, index, self);
 playlist.push(clip); 
 index++; 
 }); 
 
 // event listeners
 each(conf, function(key, val) {
 if (typeof val == 'function') {
 bind(listeners, key, val);
 delete conf[key]; 
 }
 }); 
 
 
 // plugins
 each(conf.plugins, function(name, val) {
 if (val) {
 plugins[name] = new Plugin(name, val, self);
 }
 });
 
 
 // setup controlbar plugin if not explicitly defined
 if (!conf.plugins || conf.plugins.controls === undefined) {
 plugins.controls = new Plugin("controls", null, self); 
 }
 
 // setup canvas as plugin
 plugins.canvas = new Plugin("canvas", null, self);
 
 
 // Flowplayer uses black background by default
 params.bgcolor = params.bgcolor || "#000000";
 
 
 // setup default settings for express install
 params.version = params.version || [9, 0]; 
 params.expressInstall = 'http://www.flowplayer.org/swf/expressinstall.swf';
 
 
 // click function
 function doClick(e) { 
 if (!self.isLoaded() && self._fireEvent("onBeforeClick") !== false) {
 self.load(); 
 } 
 return stopEvent(e); 
 }
 
 // defer loading upon click
 html = wrapper.innerHTML;
 if (html.replace(/\s/g, '') !== '') { 
 
 if (wrapper.addEventListener) {
 wrapper.addEventListener("click", doClick, false); 
 
 } else if (wrapper.attachEvent) {
 wrapper.attachEvent("onclick", doClick); 
 }
 
 // player is loaded upon page load 
 } else {
 
 // prevent default action from wrapper. (fixes safari problems)
 if (wrapper.addEventListener) {
 wrapper.addEventListener("click", stopEvent, false); 
 }
 
 // load player
 self.load();
 }
 }

 // possibly defer initialization until DOM get's loaded
 if (typeof wrapper == 'string') { 
 flashembed.domReady(function() {
 var node = el(wrapper); 
 
 if (!node) {
 throw "Flowplayer cannot access element: " + wrapper; 
 } else {
 wrapper = node; 
 init(); 
 } 
 });
 
 // we have a DOM element so page is already loaded
 } else { 
 init();
 }
 
 
//}}}


}


// {{{ flowplayer() & statics 

// container for player instances
var players = [];


// this object is returned when multiple player's are requested 
function Iterator(arr) {
 
 this.length = arr.length;
 
 this.each = function(fn) {
 each(arr, fn); 
 };
 
 this.size = function() {
 return arr.length; 
 }; 
}

// these two variables are the only global variables
window.flowplayer = window.$f = function() {

 var instance = null;
 var arg = arguments[0]; 
 
 // $f()
 if (!arguments.length) {
 each(players, function() {
 if (this.isLoaded()) {
 instance = this; 
 return false;
 }
 });
 
 return instance || players[0];
 } 
 
 if (arguments.length == 1) {
 
 // $f(index);
 if (typeof arg == 'number') { 
 return players[arg]; 
 
 
 // $f(wrapper || 'containerId' || '*');
 } else {
 
 // $f("*");
 if (arg == '*') {
 return new Iterator(players); 
 }
 
 // $f(wrapper || 'containerId');
 each(players, function() {
 if (this.id() == arg.id || this.id() == arg || this.getParent() == arg) {
 instance = this; 
 return false;
 }
 });
 
 return instance; 
 }
 } 

 // instance builder 
 if (arguments.length > 1) { 

 var swf = arguments[1];
 var conf = (arguments.length == 3) ? arguments[2] : {};
 
 if (typeof arg == 'string') {
 
 // select arg by classname
 if (arg.indexOf(".") != -1) {
 var instances = [];
 
 each(select(arg), function() { 
 instances.push(new Player(this, clone(swf), clone(conf))); 
 }); 
 
 return new Iterator(instances);
 
 // select node by id
 } else { 
 var node = el(arg);
 return new Player(node !== null ? node : arg, swf, conf); 
 } 
 
 
 // arg is a DOM element
 } else if (arg) {
 return new Player(arg, swf, conf); 
 }
 
 } 
 
 return null; 
};
 
extend(window.$f, {

 // called by Flash External Interface 
 fireEvent: function() {
 var a = [].slice.call(arguments);
 var p = $f(a[0]); 
 return p ? p._fireEvent(a.slice(1)) : null;
 },
 
 
 // create plugins by modifying Player's prototype
 addPlugin: function(name, fn) {
 Player.prototype[name] = fn;
 return $f;
 },
 
 // utility methods for plugin developers
 each: each,
 
 extend: extend
 
});


/* sometimes IE leaves sockets open (href="javascript:..." links break this)
if (document.all) {
 window.onbeforeunload = function(e) { 
 $f("*").each(function() {
 if (this.isLoaded()) {
 this.close(); 
 }
 });
 }; 
}
*/

 
//}}}


//{{{ jQuery support

if (typeof jQuery == 'function') {
 
 jQuery.prototype.flowplayer = function(params, conf) { 
 
 // select instances
 if (!arguments.length || typeof arguments[0] == 'number') {
 var arr = [];
 this.each(function() {
 var p = $f(this);
 if (p) {
 arr.push(p); 
 }
 });
 return arguments.length ? arr[arguments[0]] : new Iterator(arr);
 }
 
 // create flowplayer instances
 return this.each(function() { 
 $f(this, clone(params), conf ? clone(conf) : {}); 
 }); 
 
 };
 
}

//}}}


})();
/**
 * tools.flashembed 1.0.2 - The future of Flash embedding.
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/flash-embed.html
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * Launch : March 2008
 * Date: 2009-01-14 00:41:14 -0500 (Wed, 14 Jan 2009)
 * Revision: 1314 
 */ 
(function() { 
 
//{{{ utility functions 
 
var jQ = typeof jQuery == 'function';

// from "Pro JavaScript techniques" by John Resig
function isDomReady() {
 
 if (domReady.done) { return false; }
 
 var d = document;
 if (d && d.getElementsByTagName && d.getElementById && d.body) {
 clearInterval(domReady.timer);
 domReady.timer = null;
 
 for (var i = 0; i < domReady.ready.length; i++) {
 domReady.ready[i].call(); 
 }
 
 domReady.ready = null;
 domReady.done = true;
 } 
}

// if jQuery is present, use it's more effective domReady method
var domReady = jQ ? jQuery : function(f) {
 
 if (domReady.done) {
 return f(); 
 }
 
 if (domReady.timer) {
 domReady.ready.push(f); 
 
 } else {
 domReady.ready = [f];
 domReady.timer = setInterval(isDomReady, 13);
 } 
}; 


// override extend opts function 
function extend(to, from) {
 if (from) {
 for (key in from) {
 if (from.hasOwnProperty(key)) {
 to[key] = from[key];
 }
 }
 }
 
 return to;
} 


// JSON.asString() function
function asString(obj) {
 
 switch (typeOf(obj)){
 case 'string':
 obj = obj.replace(new RegExp('(["\\\\])', 'g'), '\\$1');
 
 // flash does not handle %- characters well. transforms "50%" to "50pct" (a dirty hack, I admit)
 obj = obj.replace(/^\s?(\d+)%/, "$1pct");
 return '"' +obj+ '"';
 
 case 'array':
 return '['+ map(obj, function(el) {
 return asString(el);
 }).join(',') +']'; 
 
 case 'function':
 return '"function()"';
 
 case 'object':
 var str = [];
 for (var prop in obj) {
 if (obj.hasOwnProperty(prop)) {
 str.push('"'+prop+'":'+ asString(obj[prop]));
 }
 }
 return '{'+str.join(',')+'}';
 }
 
 // replace ' --> " and remove spaces
 return String(obj).replace(/\s/g, " ").replace(/\'/g, "\"");
}


// private functions
function typeOf(obj) {
 if (obj === null || obj === undefined) { return false; }
 var type = typeof obj;
 return (type == 'object' && obj.push) ? 'array' : type;
}


// version 9 bugfix: (http://blog.deconcept.com/2006/07/28/swfobject-143-released/)
if (window.attachEvent) {
 window.attachEvent("onbeforeunload", function() {
 __flash_unloadHandler = function() {};
 __flash_savedUnloadHandler = function() {};
 });
}

function map(arr, func) {
 var newArr = []; 
 for (var i in arr) {
 if (arr.hasOwnProperty(i)) {
 newArr[i] = func(arr[i]);
 }
 }
 return newArr;
}
 
function getHTML(p, c) {

 
 var e = extend({}, p); 
 
 var ie = document.all; 
 var html = '<object width="' +e.width+ '" height="' +e.height+ '"';
 
 // force id for IE or Flash API cannot be returned
 if (ie && !e.id) {
 e.id = "_" + ("" + Math.random()).substring(9);
 }
 
 if (e.id) { 
 html += ' id="' + e.id + '"'; 
 }
 
 // prevent possible caching problems
 e.src += ((e.src.indexOf("?") != -1 ? "&" : "?") + Math.random()); 
 
 if (e.w3c || !ie) {
 html += ' data="' +e.src+ '" type="application/x-shockwave-flash"'; 
 } else {
 html += ' classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'; 
 }
 
 html += '>'; 
 
 if (e.w3c || ie) {
 html += '<param name="movie" value="' +e.src+ '" />'; 
 }

 // parameters
 e.width = e.height = e.id = e.w3c = e.src = null;
 
 for (var k in e) {
 if (e[k] !== null) {
 html += '<param name="'+ k +'" value="'+ e[k] +'" />';
 }
 } 

 // flashvars
 var vars = "";
 
 if (c) {
 for (var key in c) {
 if (c[key] !== null) {
 vars += key +'='+ (typeof c[key] == 'object' ? asString(c[key]) : c[key]) + '&';
 }
 }
 vars = vars.substring(0, vars.length -1);
 html += '<param name="flashvars" value=\'' + vars + '\' />';
 }
 
 html += "</object>"; 
 
 return html;

}

//}}}


function Flash(root, opts, flashvars) {
 
 var version = flashembed.getVersion(); 
 
 // API methods for callback
 extend(this, {
 
 getContainer: function() {
 return root; 
 },
 
 getConf: function() {
 return opts; 
 },
 
 getVersion: function() {
 return version; 
 }, 
 
 getFlashvars: function() {
 return flashvars; 
 }, 
 
 getApi: function() {
 return root.firstChild; 
 }, 
 
 getHTML: function() {
 return getHTML(opts, flashvars); 
 }
 
 });

 // variables 
 var required = opts.version; 
 var express = opts.expressInstall;
 
 
 // everything ok -> generate OBJECT tag 
 var ok = !required || flashembed.isSupported(required);
 
 if (ok) {
 opts.onFail = opts.version = opts.expressInstall = null;
 root.innerHTML = getHTML(opts, flashvars);
 
 // fail #1. express install
 } else if (required && express && flashembed.isSupported([6,65])) {
 
 extend(opts, {src: express});
 
 flashvars = {
 MMredirectURL: location.href,
 MMplayerType: 'PlugIn',
 MMdoctitle: document.title
 };
 
 root.innerHTML = getHTML(opts, flashvars); 
 
 // fail #2. 
 } else { 
 
 // fail #2.1 custom content inside container
 if (root.innerHTML.replace(/\s/g, '') !== '') {
 // minor bug fixed here 08.04.2008 (thanks JRodman) 
 
 // fail #2.2 default content
 } else { 
 root.innerHTML = 
 "<h2>Flash version " + required + " or greater is required</h2>" + 
 "<h3>" + 
 (version[0] > 0 ? "Your version is " + version : "You have no flash plugin installed") +
 "</h3>" + 
 
 (root.tagName == 'A' ? "<p>Click here to download latest version</p>" : 
 "<p>Download latest version from <a href='http://www.adobe.com/go/getflashplayer'>here</a></p>");
 
 if (root.tagName == 'A') { 
 root.onclick = function() {
 location.href= 'http://www.adobe.com/go/getflashplayer';
 };
 } 
 }
 }
 
 // onFail
 if (!ok && opts.onFail) {
 var ret = opts.onFail.call(this);
 if (typeof ret == 'string') { root.innerHTML = ret; } 
 }
 
 // http://flowplayer.org/forum/8/18186#post-18593
 if (document.all) {
 window[opts.id] = document.getElementById(opts.id);
 } 
 
}

window.flashembed = function(root, conf, flashvars) { 
 
//{{{ construction
 
 // root must be found / loaded 
 if (typeof root == 'string') {
 var el = document.getElementById(root);
 if (el) {
 root = el; 
 } else {
 domReady(function() {
 flashembed(root, conf, flashvars);
 });
 return; 
 } 
 }
 
 // not found
 if (!root) { return; }


 // setup opts
 var opts = {
 
 // very common opts
 width: '100%',
 height: '100%', 
 
 // flashembed defaults
 allowfullscreen: true,
 allowscriptaccess: 'always',
 quality: 'high', 
 
 
 // flashembed specific options
 version: null,
 onFail: null,
 expressInstall: null, 
 w3c: false
 };
 
 
 if (typeof conf == 'string') {
 conf = {src: conf}; 
 }
 
 extend(opts, conf); 
 
 return new Flash(root, opts, flashvars);
 
//}}}
 
 
};


//{{{ static methods

extend(window.flashembed, {

 // returns arr[major, fix]
 getVersion: function() {
 
 var version = [0, 0];
 
 if (navigator.plugins && typeof navigator.plugins["Shockwave Flash"] == "object") {
 var _d = navigator.plugins["Shockwave Flash"].description;
 if (typeof _d != "undefined") {
 _d = _d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
 var _m = parseInt(_d.replace(/^(.*)\..*$/, "$1"), 10);
 var _r = /r/.test(_d) ? parseInt(_d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
 version = [_m, _r];
 }
 
 } else if (window.ActiveXObject) {

 try { // avoid fp 6 crashes
 var _a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
 
 } catch(e) {
 
 try { 
 _a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
 version = [6, 0];
 _a.AllowScriptAccess = "always"; // throws if fp < 6.47 
 
 } catch(ee) {
 if (version[0] == 6) { return; }
 }
 try {
 _a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
 } catch(eee) {
 
 }
 
 }
 
 if (typeof _a == "object") {
 _d = _a.GetVariable("$version"); // bugs in fp 6.21 / 6.23
 if (typeof _d != "undefined") {
 _d = _d.replace(/^\S+\s+(.*)$/, "$1").split(",");
 version = [parseInt(_d[0], 10), parseInt(_d[2], 10)];
 }
 }
 } 
 
 return version;
 },
 
 isSupported: function(version) {
 var now = flashembed.getVersion();
 var ret = (now[0] > version[0]) || (now[0] == version[0] && now[1] >= version[1]); 
 return ret;
 },
 
 domReady: domReady,
 
 // returns a String representation from JSON object 
 asString: asString,
 
 
 getHTML: getHTML
 
});

//}}}


// setup jquery support
if (jQ) {
 
 // tools version number
 jQuery.tools = jQuery.tools || {version: {}}; 
 jQuery.tools.version.flashembed = '1.0.2'; 

 
 jQuery.fn.flashembed = function(conf, flashvars) {
 
 var el = null;
 
 this.each(function() { 
 el = flashembed(this, conf, flashvars);
 });
 
 return conf.api === false ? this : el; 
 };

}

})();

