
/* lib.1 *//*
 * 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")}})})();
/* Lista adresów dostawy klienta (div outline) (client-addresses - client_addresses_list) [55654]*/

function client_addresses_list_confirmdelete() {
    return confirm('Czy na pewno usunąć wybrany adres dostawy?');
}
/* <b style="font-size:13px;color:blue; text-decoration:blink;")">[ S ]</b>  TOP 4.0 (kopia) (layout_top - menu_top) [57187]*/

//////////////////////////////////////////////////////////////////////////////////////////////
/////// THUMBNAILS_SWITCH

function StarRotate(click, num, nama)
{

var elems = document.getElementsByName(nama);
if(num ==1)
{
for(i=0; i < elems.length; i++)
     {
      elems[i].className="star_inactive";
     }
click.className="star_active";
}


var j = 1;
if(num==2)
{
for(i=0; i < elems.length; i++)
     {
      if(elems[i].className && elems[i].className == "star_active")
            {
              elems[i].className="star_inactive";
              if(i+1< elems.length){
              i++;
               elems[i].className="star_active";
              i++;
              }
            }
     else
            {
             elems[i].className="star_inactive";
             if(j+1 == elems.length) elems[0].className="star_active";
             }
j++;
     }
}

j = elems.length;
if(num==3)
{
for(i=elems.length -1; i > 0; i--)
     {
      if(elems[i].className && elems[i].className == "star_active")
            {
              elems[i].className="star_inactive";
              if(i-1< elems.length){
              i--;
               elems[i].className="star_active";
              i--;
              }
            }
     else
            {
             elems[i].className="star_inactive";
             if(j == elems.length - 1) {elems[elems.length-1].className="star_active";elems[0].className="star_inactive";}
             }
j--;
     }
}

}function StarRotate(click, num, nama)
{

var elems = document.getElementsByName(nama);
if(num ==1)
{
for(i=0; i < elems.length; i++)
     {
      elems[i].className="star_inactive";
     }
click.className="star_active";
}


var j = 1;
if(num==2)
{
for(i=0; i < elems.length; i++)
     {
      if(elems[i].className && elems[i].className == "star_active")
            {
              elems[i].className="star_inactive";
              if(i+1< elems.length){
              i++;
               elems[i].className="star_active";
              i++;
              }
            }
     else
            {
             elems[i].className="star_inactive";
             if(j+1 == elems.length) elems[0].className="star_active";
             }
j++;
     }
}

j = 1;
if(num==3)
{
for(i=elems.length -1; i > 0; i--)
     {
      if(elems[i].className && elems[i].className == "star_active")
            {
              elems[i].className="star_inactive";
              if(i-1< elems.length){
              i--;
               elems[i].className="star_active";
              i--;
              }
            }
     else
            {
             elems[i].className="star_inactive";
             if(j == elems.length - 1) {elems[0].className="star_inactive";elems[elems.length-1].className="star_active";}
             }
j++;
     }
}

}


var Prototype = {
  Version: '1.5.1',

  Browser: {
    IE:     !!(window.attachEvent && !window.opera),
    Opera:  !!window.opera,
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1
  },

  BrowserFeatures: {
    XPath: !!document.evaluate,
    ElementExtensions: !!window.HTMLElement,
    SpecificElementExtensions:
      (document.createElement('div').__proto__ !==
       document.createElement('form').__proto__)
  },

  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,

  emptyFunction: function() { },
  K: function(x) { return x }
}

var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}

var Abstract = new Object();

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

Object.extend(Object, {
  inspect: function(object) {
    try {
      if (object === undefined) return 'undefined';
      if (object === null) return 'null';
      return object.inspect ? object.inspect() : object.toString();
    } catch (e) {
      if (e instanceof RangeError) return '...';
      throw e;
    }
  },

  toJSON: function(object) {
    var type = typeof object;
    switch(type) {
      case 'undefined':
      case 'function':
      case 'unknown': return;
      case 'boolean': return object.toString();
    }
    if (object === null) return 'null';
    if (object.toJSON) return object.toJSON();
    if (object.ownerDocument === document) return;
    var results = [];
    for (var property in object) {
      var value = Object.toJSON(object[property]);
      if (value !== undefined)
        results.push(property.toJSON() + ': ' + value);
    }
    return '{' + results.join(', ') + '}';
  },

  keys: function(object) {
    var keys = [];
    for (var property in object)
      keys.push(property);
    return keys;
  },

  values: function(object) {
    var values = [];
    for (var property in object)
      values.push(object[property]);
    return values;
  },

  clone: function(object) {
    return Object.extend({}, object);
  }
});

Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [event || window.event].concat(args));
  }
}

Object.extend(Number.prototype, {
  toColorPart: function() {
    return this.toPaddedString(2, 16);
  },

  succ: function() {
    return this + 1;
  },

  times: function(iterator) {
    $R(0, this, true).each(iterator);
    return this;
  },

  toPaddedString: function(length, radix) {
    var string = this.toString(radix || 10);
    return '0'.times(length - string.length) + string;
  },

  toJSON: function() {
    return isFinite(this) ? this.toString() : 'null';
  }
});

Date.prototype.toJSON = function() {
  return '"' + this.getFullYear() + '-' +
    (this.getMonth() + 1).toPaddedString(2) + '-' +
    this.getDate().toPaddedString(2) + 'T' +
    this.getHours().toPaddedString(2) + ':' +
    this.getMinutes().toPaddedString(2) + ':' +
    this.getSeconds().toPaddedString(2) + '"';
};

var Try = {
  these: function() {
    var returnValue;

    for (var i = 0, length = arguments.length; i < length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) {}
    }

    return returnValue;
  }
}

/*--------------------------------------------------------------------------*/

var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.frequency = frequency;
    this.currentlyExecuting = false;

    this.registerCallback();
  },

  registerCallback: function() {
    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  stop: function() {
    if (!this.timer) return;
    clearInterval(this.timer);
    this.timer = null;
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.callback(this);
      } finally {
        this.currentlyExecuting = false;
      }
    }
  }
}
Object.extend(String, {
  interpret: function(value) {
    return value == null ? '' : String(value);
  },
  specialChar: {
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '\\': '\\\\'
  }
});

Object.extend(String.prototype, {
  gsub: function(pattern, replacement) {
    var result = '', source = this, match;
    replacement = arguments.callee.prepareReplacement(replacement);

    while (source.length > 0) {
      if (match = source.match(pattern)) {
        result += source.slice(0, match.index);
        result += String.interpret(replacement(match));
        source  = source.slice(match.index + match[0].length);
      } else {
        result += source, source = '';
      }
    }
    return result;
  },

  sub: function(pattern, replacement, count) {
    replacement = this.gsub.prepareReplacement(replacement);
    count = count === undefined ? 1 : count;

    return this.gsub(pattern, function(match) {
      if (--count < 0) return match[0];
      return replacement(match);
    });
  },

  scan: function(pattern, iterator) {
    this.gsub(pattern, iterator);
    return this;
  },

  truncate: function(length, truncation) {
    length = length || 30;
    truncation = truncation === undefined ? '...' : truncation;
    return this.length > length ?
      this.slice(0, length - truncation.length) + truncation : this;
  },

  strip: function() {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
  },

  stripTags: function() {
    return this.replace(/<\/?[^>]+>/gi, '');
  },

  stripScripts: function() {
    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
  },

  extractScripts: function() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  },

  evalScripts: function() {
    return this.extractScripts().map(function(script) { return eval(script) });
  },

  escapeHTML: function() {
    var self = arguments.callee;
    self.text.data = this;
    return self.div.innerHTML;
  },

  unescapeHTML: function() {
    var div = document.createElement('div');
    div.innerHTML = this.stripTags();
    return div.childNodes[0] ? (div.childNodes.length > 1 ?
      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
      div.childNodes[0].nodeValue) : '';
  },

  toQueryParams: function(separator) {
    var match = this.strip().match(/([^?#]*)(#.*)?$/);
    if (!match) return {};

    return match[1].split(separator || '&').inject({}, function(hash, pair) {
      if ((pair = pair.split('='))[0]) {
        var key = decodeURIComponent(pair.shift());
        var value = pair.length > 1 ? pair.join('=') : pair[0];
        if (value != undefined) value = decodeURIComponent(value);

        if (key in hash) {
          if (hash[key].constructor != Array) hash[key] = [hash[key]];
          hash[key].push(value);
        }
        else hash[key] = value;
      }
      return hash;
    });
  },

  toArray: function() {
    return this.split('');
  },

  succ: function() {
    return this.slice(0, this.length - 1) +
      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
  },

  times: function(count) {
    var result = '';
    for (var i = 0; i < count; i++) result += this;
    return result;
  },

  camelize: function() {
    var parts = this.split('-'), len = parts.length;
    if (len == 1) return parts[0];

    var camelized = this.charAt(0) == '-'
      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
      : parts[0];

    for (var i = 1; i < len; i++)
      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);

    return camelized;
  },

  capitalize: function() {
    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
  },

  underscore: function() {
    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
  },

  dasherize: function() {
    return this.gsub(/_/,'-');
  },

  inspect: function(useDoubleQuotes) {
    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
      var character = String.specialChar[match[0]];
      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
    });
    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
  },

  toJSON: function() {
    return this.inspect(true);
  },

  unfilterJSON: function(filter) {
    return this.sub(filter || Prototype.JSONFilter, '#{1}');
  },

  evalJSON: function(sanitize) {
    var json = this.unfilterJSON();
    try {
      if (!sanitize || (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(json)))
        return eval('(' + json + ')');
    } catch (e) { }
    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
  },

  include: function(pattern) {
    return this.indexOf(pattern) > -1;
  },

  startsWith: function(pattern) {
    return this.indexOf(pattern) === 0;
  },

  endsWith: function(pattern) {
    var d = this.length - pattern.length;
    return d >= 0 && this.lastIndexOf(pattern) === d;
  },

  empty: function() {
    return this == '';
  },

  blank: function() {
    return /^\s*$/.test(this);
  }
});

if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
  escapeHTML: function() {
    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
  },
  unescapeHTML: function() {
    return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
  }
});

String.prototype.gsub.prepareReplacement = function(replacement) {
  if (typeof replacement == 'function') return replacement;
  var template = new Template(replacement);
  return function(match) { return template.evaluate(match) };
}

String.prototype.parseQuery = String.prototype.toQueryParams;

Object.extend(String.prototype.escapeHTML, {
  div:  document.createElement('div'),
  text: document.createTextNode('')
});

with (String.prototype.escapeHTML) div.appendChild(text);

var Template = Class.create();
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
Template.prototype = {
  initialize: function(template, pattern) {
    this.template = template.toString();
    this.pattern  = pattern || Template.Pattern;
  },

  evaluate: function(object) {
    return this.template.gsub(this.pattern, function(match) {
      var before = match[1];
      if (before == '\\') return match[2];
      return before + String.interpret(object[match[3]]);
    });
  }
}

var $break = {}, $continue = new Error('"throw $continue" is deprecated, use "return" instead');

var Enumerable = {
  each: function(iterator) {
    var index = 0;
    try {
      this._each(function(value) {
        iterator(value, index++);
      });
    } catch (e) {
      if (e != $break) throw e;
    }
    return this;
  },

  eachSlice: function(number, iterator) {
    var index = -number, slices = [], array = this.toArray();
    while ((index += number) < array.length)
      slices.push(array.slice(index, index+number));
    return slices.map(iterator);
  },

  all: function(iterator) {
    var result = true;
    this.each(function(value, index) {
      result = result && !!(iterator || Prototype.K)(value, index);
      if (!result) throw $break;
    });
    return result;
  },

  any: function(iterator) {
    var result = false;
    this.each(function(value, index) {
      if (result = !!(iterator || Prototype.K)(value, index))
        throw $break;
    });
    return result;
  },

  collect: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      results.push((iterator || Prototype.K)(value, index));
    });
    return results;
  },

  detect: function(iterator) {
    var result;
    this.each(function(value, index) {
      if (iterator(value, index)) {
        result = value;
        throw $break;
      }
    });
    return result;
  },

  findAll: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      if (iterator(value, index))
        results.push(value);
    });
    return results;
  },

  grep: function(pattern, iterator) {
    var results = [];
    this.each(function(value, index) {
      var stringValue = value.toString();
      if (stringValue.match(pattern))
        results.push((iterator || Prototype.K)(value, index));
    })
    return results;
  },

  include: function(object) {
    var found = false;
    this.each(function(value) {
      if (value == object) {
        found = true;
        throw $break;
      }
    });
    return found;
  },

  inGroupsOf: function(number, fillWith) {
    fillWith = fillWith === undefined ? null : fillWith;
    return this.eachSlice(number, function(slice) {
      while(slice.length < number) slice.push(fillWith);
      return slice;
    });
  },

  inject: function(memo, iterator) {
    this.each(function(value, index) {
      memo = iterator(memo, value, index);
    });
    return memo;
  },

  invoke: function(method) {
    var args = $A(arguments).slice(1);
    return this.map(function(value) {
      return value[method].apply(value, args);
    });
  },

  max: function(iterator) {
    var result;
    this.each(function(value, index) {
      value = (iterator || Prototype.K)(value, index);
      if (result == undefined || value >= result)
        result = value;
    });
    return result;
  },

  min: function(iterator) {
    var result;
    this.each(function(value, index) {
      value = (iterator || Prototype.K)(value, index);
      if (result == undefined || value < result)
        result = value;
    });
    return result;
  },

  partition: function(iterator) {
    var trues = [], falses = [];
    this.each(function(value, index) {
      ((iterator || Prototype.K)(value, index) ?
        trues : falses).push(value);
    });
    return [trues, falses];
  },

  pluck: function(property) {
    var results = [];
    this.each(function(value, index) {
      results.push(value[property]);
    });
    return results;
  },

  reject: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      if (!iterator(value, index))
        results.push(value);
    });
    return results;
  },

  sortBy: function(iterator) {
    return this.map(function(value, index) {
      return {value: value, criteria: iterator(value, index)};
    }).sort(function(left, right) {
      var a = left.criteria, b = right.criteria;
      return a < b ? -1 : a > b ? 1 : 0;
    }).pluck('value');
  },

  toArray: function() {
    return this.map();
  },

  zip: function() {
    var iterator = Prototype.K, args = $A(arguments);
    if (typeof args.last() == 'function')
      iterator = args.pop();

    var collections = [this].concat(args).map($A);
    return this.map(function(value, index) {
      return iterator(collections.pluck(index));
    });
  },

  size: function() {
    return this.toArray().length;
  },

  inspect: function() {
    return '#<Enumerable:' + this.toArray().inspect() + '>';
  }
}

Object.extend(Enumerable, {
  map:     Enumerable.collect,
  find:    Enumerable.detect,
  select:  Enumerable.findAll,
  member:  Enumerable.include,
  entries: Enumerable.toArray
});
var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0, length = iterable.length; i < length; i++)
      results.push(iterable[i]);
    return results;
  }
}

if (Prototype.Browser.WebKit) {
  $A = Array.from = function(iterable) {
    if (!iterable) return [];
    if (!(typeof iterable == 'function' && iterable == '[object NodeList]') &&
      iterable.toArray) {
      return iterable.toArray();
    } else {
      var results = [];
      for (var i = 0, length = iterable.length; i < length; i++)
        results.push(iterable[i]);
      return results;
    }
  }
}

Object.extend(Array.prototype, Enumerable);

if (!Array.prototype._reverse)
  Array.prototype._reverse = Array.prototype.reverse;

Object.extend(Array.prototype, {
  _each: function(iterator) {
    for (var i = 0, length = this.length; i < length; i++)
      iterator(this[i]);
  },

  clear: function() {
    this.length = 0;
    return this;
  },

  first: function() {
    return this[0];
  },

  last: function() {
    return this[this.length - 1];
  },

  compact: function() {
    return this.select(function(value) {
      return value != null;
    });
  },

  flatten: function() {
    return this.inject([], function(array, value) {
      return array.concat(value && value.constructor == Array ?
        value.flatten() : [value]);
    });
  },

  without: function() {
    var values = $A(arguments);
    return this.select(function(value) {
      return !values.include(value);
    });
  },

  indexOf: function(object) {
    for (var i = 0, length = this.length; i < length; i++)
      if (this[i] == object) return i;
    return -1;
  },

  reverse: function(inline) {
    return (inline !== false ? this : this.toArray())._reverse();
  },

  reduce: function() {
    return this.length > 1 ? this : this[0];
  },

  uniq: function(sorted) {
    return this.inject([], function(array, value, index) {
      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
        array.push(value);
      return array;
    });
  },

  clone: function() {
    return [].concat(this);
  },

  size: function() {
    return this.length;
  },

  inspect: function() {
    return '[' + this.map(Object.inspect).join(', ') + ']';
  },

  toJSON: function() {
    var results = [];
    this.each(function(object) {
      var value = Object.toJSON(object);
      if (value !== undefined) results.push(value);
    });
    return '[' + results.join(', ') + ']';
  }
});

Array.prototype.toArray = Array.prototype.clone;

function $w(string) {
  string = string.strip();
  return string ? string.split(/\s+/) : [];
}

if (Prototype.Browser.Opera){
  Array.prototype.concat = function() {
    var array = [];
    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
    for (var i = 0, length = arguments.length; i < length; i++) {
      if (arguments[i].constructor == Array) {
        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
          array.push(arguments[i][j]);
      } else {
        array.push(arguments[i]);
      }
    }
    return array;
  }
}
var Hash = function(object) {
  if (object instanceof Hash) this.merge(object);
  else Object.extend(this, object || {});
};

Object.extend(Hash, {
  toQueryString: function(obj) {
    var parts = [];
    parts.add = arguments.callee.addPair;

    this.prototype._each.call(obj, function(pair) {
      if (!pair.key) return;
      var value = pair.value;

      if (value && typeof value == 'object') {
        if (value.constructor == Array) value.each(function(value) {
          parts.add(pair.key, value);
        });
        return;
      }
      parts.add(pair.key, value);
    });

    return parts.join('&');
  },

  toJSON: function(object) {
    var results = [];
    this.prototype._each.call(object, function(pair) {
      var value = Object.toJSON(pair.value);
      if (value !== undefined) results.push(pair.key.toJSON() + ': ' + value);
    });
    return '{' + results.join(', ') + '}';
  }
});

Hash.toQueryString.addPair = function(key, value, prefix) {
  key = encodeURIComponent(key);
  if (value === undefined) this.push(key);
  else this.push(key + '=' + (value == null ? '' : encodeURIComponent(value)));
}

Object.extend(Hash.prototype, Enumerable);
Object.extend(Hash.prototype, {
  _each: function(iterator) {
    for (var key in this) {
      var value = this[key];
      if (value && value == Hash.prototype[key]) continue;

      var pair = [key, value];
      pair.key = key;
      pair.value = value;
      iterator(pair);
    }
  },

  keys: function() {
    return this.pluck('key');
  },

  values: function() {
    return this.pluck('value');
  },

  merge: function(hash) {
    return $H(hash).inject(this, function(mergedHash, pair) {
      mergedHash[pair.key] = pair.value;
      return mergedHash;
    });
  },

  remove: function() {
    var result;
    for(var i = 0, length = arguments.length; i < length; i++) {
      var value = this[arguments[i]];
      if (value !== undefined){
        if (result === undefined) result = value;
        else {
          if (result.constructor != Array) result = [result];
          result.push(value)
        }
      }
      delete this[arguments[i]];
    }
    return result;
  },

  toQueryString: function() {
    return Hash.toQueryString(this);
  },

  inspect: function() {
    return '#<Hash:{' + this.map(function(pair) {
      return pair.map(Object.inspect).join(': ');
    }).join(', ') + '}>';
  },

  toJSON: function() {
    return Hash.toJSON(this);
  }
});

function $H(object) {
  if (object instanceof Hash) return object;
  return new Hash(object);
};

// Safari iterates over shadowed properties
if (function() {
  var i = 0, Test = function(value) { this.key = value };
  Test.prototype.key = 'foo';
  for (var property in new Test('bar')) i++;
  return i > 1;
}()) Hash.prototype._each = function(iterator) {
  var cache = [];
  for (var key in this) {
    var value = this[key];
    if ((value && value == Hash.prototype[key]) || cache.include(key)) continue;
    cache.push(key);
    var pair = [key, value];
    pair.key = key;
    pair.value = value;
    iterator(pair);
  }
};
ObjectRange = Class.create();
Object.extend(ObjectRange.prototype, Enumerable);
Object.extend(ObjectRange.prototype, {
  initialize: function(start, end, exclusive) {
    this.start = start;
    this.end = end;
    this.exclusive = exclusive;
  },

  _each: function(iterator) {
    var value = this.start;
    while (this.include(value)) {
      iterator(value);
      value = value.succ();
    }
  },

  include: function(value) {
    if (value < this.start)
      return false;
    if (this.exclusive)
      return value < this.end;
    return value <= this.end;
  }
});

var $R = function(start, end, exclusive) {
  return new ObjectRange(start, end, exclusive);
}

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  },

  activeRequestCount: 0
}

Ajax.Responders = {
  responders: [],

  _each: function(iterator) {
    this.responders._each(iterator);
  },

  register: function(responder) {
    if (!this.include(responder))
      this.responders.push(responder);
  },

  unregister: function(responder) {
    this.responders = this.responders.without(responder);
  },

  dispatch: function(callback, request, transport, json) {
    this.each(function(responder) {
      if (typeof responder[callback] == 'function') {
        try {
          responder[callback].apply(responder, [request, transport, json]);
        } catch (e) {}
      }
    });
  }
};

Object.extend(Ajax.Responders, Enumerable);

Ajax.Responders.register({
  onCreate: function() {
    Ajax.activeRequestCount++;
  },
  onComplete: function() {
    Ajax.activeRequestCount--;
  }
});

Ajax.Base = function() {};
Ajax.Base.prototype = {
  setOptions: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   ''
    }
    Object.extend(this.options, options || {});

    this.options.method = this.options.method.toLowerCase();
    if (typeof this.options.parameters == 'string')
      this.options.parameters = this.options.parameters.toQueryParams();
  }
}

Ajax.Request = Class.create();
Ajax.Request.Events =
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
  _complete: false,

  initialize: function(url, options) {
    this.transport = Ajax.getTransport();
    this.setOptions(options);
    this.request(url);
  },

  request: function(url) {
    this.url = url;
    this.method = this.options.method;
    var params = Object.clone(this.options.parameters);

    if (!['get', 'post'].include(this.method)) {
      // simulate other verbs over post
      params['_method'] = this.method;
      this.method = 'post';
    }

    this.parameters = params;

    if (params = Hash.toQueryString(params)) {
      // when GET, append parameters to URL
      if (this.method == 'get')
        this.url += (this.url.include('?') ? '&' : '?') + params;
      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
        params += '&_=';
    }

    try {
      if (this.options.onCreate) this.options.onCreate(this.transport);
      Ajax.Responders.dispatch('onCreate', this, this.transport);

      this.transport.open(this.method.toUpperCase(), this.url,
        this.options.asynchronous);

      if (this.options.asynchronous)
        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);

      this.transport.onreadystatechange = this.onStateChange.bind(this);
      this.setRequestHeaders();

      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
      this.transport.send(this.body);

      /* Force Firefox to handle ready state 4 for synchronous requests */
      if (!this.options.asynchronous && this.transport.overrideMimeType)
        this.onStateChange();

    }
    catch (e) {
      this.dispatchException(e);
    }
  },

  onStateChange: function() {
    var readyState = this.transport.readyState;
    if (readyState > 1 && !((readyState == 4) && this._complete))
      this.respondToReadyState(this.transport.readyState);
  },

  setRequestHeaders: function() {
    var headers = {
      'X-Requested-With': 'XMLHttpRequest',
      'X-Prototype-Version': Prototype.Version,
      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
    };

    if (this.method == 'post') {
      headers['Content-type'] = this.options.contentType +
        (this.options.encoding ? '; charset=' + this.options.encoding : '');

      /* Force "Connection: close" for older Mozilla browsers to work
       * around a bug where XMLHttpRequest sends an incorrect
       * Content-length header. See Mozilla Bugzilla #246651.
       */
      if (this.transport.overrideMimeType &&
          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
            headers['Connection'] = 'close';
    }

    // user-defined headers
    if (typeof this.options.requestHeaders == 'object') {
      var extras = this.options.requestHeaders;

      if (typeof extras.push == 'function')
        for (var i = 0, length = extras.length; i < length; i += 2)
          headers[extras[i]] = extras[i+1];
      else
        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
    }

    for (var name in headers)
      this.transport.setRequestHeader(name, headers[name]);
  },

  success: function() {
    return !this.transport.status
        || (this.transport.status >= 200 && this.transport.status < 300);
  },

  respondToReadyState: function(readyState) {
    var state = Ajax.Request.Events[readyState];
    var transport = this.transport, json = this.evalJSON();

    if (state == 'Complete') {
      try {
        this._complete = true;
        (this.options['on' + this.transport.status]
         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
         || Prototype.emptyFunction)(transport, json);
      } catch (e) {
        this.dispatchException(e);
      }

      var contentType = this.getHeader('Content-type');
      if (contentType && contentType.strip().
        match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
          this.evalResponse();
    }

    try {
      (this.options['on' + state] || Prototype.emptyFunction)(transport, json);
      Ajax.Responders.dispatch('on' + state, this, transport, json);
    } catch (e) {
      this.dispatchException(e);
    }

    if (state == 'Complete') {
      // avoid memory leak in MSIE: clean up
      this.transport.onreadystatechange = Prototype.emptyFunction;
    }
  },

  getHeader: function(name) {
    try {
      return this.transport.getResponseHeader(name);
    } catch (e) { return null }
  },

  evalJSON: function() {
    try {
      var json = this.getHeader('X-JSON');
      return json ? json.evalJSON() : null;
    } catch (e) { return null }
  },

  evalResponse: function() {
    try {
      return eval((this.transport.responseText || '').unfilterJSON());
    } catch (e) {
      this.dispatchException(e);
    }
  },

  dispatchException: function(exception) {
    (this.options.onException || Prototype.emptyFunction)(this, exception);
    Ajax.Responders.dispatch('onException', this, exception);
  }
});

Ajax.Updater = Class.create();

Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
  initialize: function(container, url, options) {
    this.container = {
      success: (container.success || container),
      failure: (container.failure || (container.success ? null : container))
    }

    this.transport = Ajax.getTransport();
    this.setOptions(options);

    var onComplete = this.options.onComplete || Prototype.emptyFunction;
    this.options.onComplete = (function(transport, param) {
      this.updateContent();
      onComplete(transport, param);
    }).bind(this);

    this.request(url);
  },

  updateContent: function() {
    var receiver = this.container[this.success() ? 'success' : 'failure'];
    var response = this.transport.responseText;

    if (!this.options.evalScripts) response = response.stripScripts();

    if (receiver = $(receiver)) {
      if (this.options.insertion)
        new this.options.insertion(receiver, response);
      else
        receiver.update(response);
    }

    if (this.success()) {
      if (this.onComplete)
        setTimeout(this.onComplete.bind(this), 10);
    }
  }
});

Ajax.PeriodicalUpdater = Class.create();
Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
  initialize: function(container, url, options) {
    this.setOptions(options);
    this.onComplete = this.options.onComplete;

    this.frequency = (this.options.frequency || 2);
    this.decay = (this.options.decay || 1);

    this.updater = {};
    this.container = container;
    this.url = url;

    this.start();
  },

  start: function() {
    this.options.onComplete = this.updateComplete.bind(this);
    this.onTimerEvent();
  },

  stop: function() {
    this.updater.options.onComplete = undefined;
    clearTimeout(this.timer);
    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
  },

  updateComplete: function(request) {
    if (this.options.decay) {
      this.decay = (request.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

      this.lastText = request.responseText;
    }
    this.timer = setTimeout(this.onTimerEvent.bind(this),
      this.decay * this.frequency * 1000);
  },

  onTimerEvent: function() {
    this.updater = new Ajax.Updater(this.container, this.url, this.options);
  }
});
function $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (typeof element == 'string')
    element = document.getElementById(element);
  return Element.extend(element);
}

if (Prototype.BrowserFeatures.XPath) {
  document._getElementsByXPath = function(expression, parentElement) {
    var results = [];
    var query = document.evaluate(expression, $(parentElement) || document,
      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0, length = query.snapshotLength; i < length; i++)
      results.push(query.snapshotItem(i));
    return results;
  };

  document.getElementsByClassName = function(className, parentElement) {
    var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
    return document._getElementsByXPath(q, parentElement);
  }

} else document.getElementsByClassName = function(className, parentElement) {
  var children = ($(parentElement) || document.body).getElementsByTagName('*');
  var elements = [], child;
  for (var i = 0, length = children.length; i < length; i++) {
    child = children[i];
    if (Element.hasClassName(child, className))
      elements.push(Element.extend(child));
  }
  return elements;
};

/*--------------------------------------------------------------------------*/

if (!window.Element) var Element = {};

Element.extend = function(element) {
  var F = Prototype.BrowserFeatures;
  if (!element || !element.tagName || element.nodeType == 3 ||
   element._extended || F.SpecificElementExtensions || element == window)
    return element;

  var methods = {}, tagName = element.tagName, cache = Element.extend.cache,
   T = Element.Methods.ByTag;

  // extend methods for all tags (Safari doesn't need this)
  if (!F.ElementExtensions) {
    Object.extend(methods, Element.Methods),
    Object.extend(methods, Element.Methods.Simulated);
  }

  // extend methods for specific tags
  if (T[tagName]) Object.extend(methods, T[tagName]);

  for (var property in methods) {
    var value = methods[property];
    if (typeof value == 'function' && !(property in element))
      element[property] = cache.findOrStore(value);
  }

  element._extended = Prototype.emptyFunction;
  return element;
};

Element.extend.cache = {
  findOrStore: function(value) {
    return this[value] = this[value] || function() {
      return value.apply(null, [this].concat($A(arguments)));
    }
  }
};

Element.Methods = {
  visible: function(element) {
    return $(element).style.display != 'none';
  },

  toggle: function(element) {
    element = $(element);
    Element[Element.visible(element) ? 'hide' : 'show'](element);
    return element;
  },

  hide: function(element) {
    $(element).style.display = 'none';
    return element;
  },

  show: function(element) {
    $(element).style.display = '';
    return element;
  },

  remove: function(element) {
    element = $(element);
    element.parentNode.removeChild(element);
    return element;
  },

  update: function(element, html) {
    html = typeof html == 'undefined' ? '' : html.toString();
    $(element).innerHTML = html.stripScripts();
    setTimeout(function() {html.evalScripts()}, 10);
    return element;
  },

  replace: function(element, html) {
    element = $(element);
    html = typeof html == 'undefined' ? '' : html.toString();
    if (element.outerHTML) {
      element.outerHTML = html.stripScripts();
    } else {
      var range = element.ownerDocument.createRange();
      range.selectNodeContents(element);
      element.parentNode.replaceChild(
        range.createContextualFragment(html.stripScripts()), element);
    }
    setTimeout(function() {html.evalScripts()}, 10);
    return element;
  },

  inspect: function(element) {
    element = $(element);
    var result = '<' + element.tagName.toLowerCase();
    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
      var property = pair.first(), attribute = pair.last();
      var value = (element[property] || '').toString();
      if (value) result += ' ' + attribute + '=' + value.inspect(true);
    });
    return result + '>';
  },

  recursivelyCollect: function(element, property) {
    element = $(element);
    var elements = [];
    while (element = element[property])
      if (element.nodeType == 1)
        elements.push(Element.extend(element));
    return elements;
  },

  ancestors: function(element) {
    return $(element).recursivelyCollect('parentNode');
  },

  descendants: function(element) {
    return $A($(element).getElementsByTagName('*')).each(Element.extend);
  },

  firstDescendant: function(element) {
    element = $(element).firstChild;
    while (element && element.nodeType != 1) element = element.nextSibling;
    return $(element);
  },

  immediateDescendants: function(element) {
    if (!(element = $(element).firstChild)) return [];
    while (element && element.nodeType != 1) element = element.nextSibling;
    if (element) return [element].concat($(element).nextSiblings());
    return [];
  },

  previousSiblings: function(element) {
    return $(element).recursivelyCollect('previousSibling');
  },

  nextSiblings: function(element) {
    return $(element).recursivelyCollect('nextSibling');
  },

  siblings: function(element) {
    element = $(element);
    return element.previousSiblings().reverse().concat(element.nextSiblings());
  },

  match: function(element, selector) {
    if (typeof selector == 'string')
      selector = new Selector(selector);
    return selector.match($(element));
  },

  up: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(element.parentNode);
    var ancestors = element.ancestors();
    return expression ? Selector.findElement(ancestors, expression, index) :
      ancestors[index || 0];
  },

  down: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return element.firstDescendant();
    var descendants = element.descendants();
    return expression ? Selector.findElement(descendants, expression, index) :
      descendants[index || 0];
  },

  previous: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
    var previousSiblings = element.previousSiblings();
    return expression ? Selector.findElement(previousSiblings, expression, index) :
      previousSiblings[index || 0];
  },

  next: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
    var nextSiblings = element.nextSiblings();
    return expression ? Selector.findElement(nextSiblings, expression, index) :
      nextSiblings[index || 0];
  },

  getElementsBySelector: function() {
    var args = $A(arguments), element = $(args.shift());
    return Selector.findChildElements(element, args);
  },

  getElementsByClassName: function(element, className) {
    return document.getElementsByClassName(className, element);
  },

  readAttribute: function(element, name) {
    element = $(element);
    if (Prototype.Browser.IE) {
      if (!element.attributes) return null;
      var t = Element._attributeTranslations;
      if (t.values[name]) return t.values[name](element, name);
      if (t.names[name])  name = t.names[name];
      var attribute = element.attributes[name];
      return attribute ? attribute.nodeValue : null;
    }
    return element.getAttribute(name);
  },

  getHeight: function(element) {
    return $(element).getDimensions().height;
  },

  getWidth: function(element) {
    return $(element).getDimensions().width;
  },

  classNames: function(element) {
    return new Element.ClassNames(element);
  },

  hasClassName: function(element, className) {
    if (!(element = $(element))) return;
    var elementClassName = element.className;
    if (elementClassName.length == 0) return false;
    if (elementClassName == className ||
        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
      return true;
    return false;
  },

  addClassName: function(element, className) {
    if (!(element = $(element))) return;
    Element.classNames(element).add(className);
    return element;
  },

  removeClassName: function(element, className) {
    if (!(element = $(element))) return;
    Element.classNames(element).remove(className);
    return element;
  },

  toggleClassName: function(element, className) {
    if (!(element = $(element))) return;
    Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
    return element;
  },

  observe: function() {
    Event.observe.apply(Event, arguments);
    return $A(arguments).first();
  },

  stopObserving: function() {
    Event.stopObserving.apply(Event, arguments);
    return $A(arguments).first();
  },

  // removes whitespace-only text node children
  cleanWhitespace: function(element) {
    element = $(element);
    var node = element.firstChild;
    while (node) {
      var nextNode = node.nextSibling;
      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
        element.removeChild(node);
      node = nextNode;
    }
    return element;
  },

  empty: function(element) {
    return $(element).innerHTML.blank();
  },

  descendantOf: function(element, ancestor) {
    element = $(element), ancestor = $(ancestor);
    while (element = element.parentNode)
      if (element == ancestor) return true;
    return false;
  },

  scrollTo: function(element) {
    element = $(element);
    var pos = Position.cumulativeOffset(element);
    window.scrollTo(pos[0], pos[1]);
    return element;
  },

  getStyle: function(element, style) {
    element = $(element);
    style = style == 'float' ? 'cssFloat' : style.camelize();
    var value = element.style[style];
    if (!value) {
      var css = document.defaultView.getComputedStyle(element, null);
      value = css ? css[style] : null;
    }
    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
    return value == 'auto' ? null : value;
  },

  getOpacity: function(element) {
    return $(element).getStyle('opacity');
  },

  setStyle: function(element, styles, camelized) {
    element = $(element);
    var elementStyle = element.style;

    for (var property in styles)
      if (property == 'opacity') element.setOpacity(styles[property])
      else
        elementStyle[(property == 'float' || property == 'cssFloat') ?
          (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :
          (camelized ? property : property.camelize())] = styles[property];

    return element;
  },

  setOpacity: function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1 || value === '') ? '' :
      (value < 0.00001) ? 0 : value;
    return element;
  },

  getDimensions: function(element) {
    element = $(element);
    var display = $(element).getStyle('display');
    if (display != 'none' && display != null) // Safari bug
      return {width: element.offsetWidth, height: element.offsetHeight};

    // All *Width and *Height properties give 0 on elements with display none,
    // so enable the element temporarily
    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    var originalDisplay = els.display;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = 'block';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = originalDisplay;
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
  },

  makePositioned: function(element) {
    element = $(element);
    var pos = Element.getStyle(element, 'position');
    if (pos == 'static' || !pos) {
      element._madePositioned = true;
      element.style.position = 'relative';
      // Opera returns the offset relative to the positioning context, when an
      // element is position relative but top and left have not been defined
      if (window.opera) {
        element.style.top = 0;
        element.style.left = 0;
      }
    }
    return element;
  },

  undoPositioned: function(element) {
    element = $(element);
    if (element._madePositioned) {
      element._madePositioned = undefined;
      element.style.position =
        element.style.top =
        element.style.left =
        element.style.bottom =
        element.style.right = '';
    }
    return element;
  },

  makeClipping: function(element) {
    element = $(element);
    if (element._overflow) return element;
    element._overflow = element.style.overflow || 'auto';
    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
      element.style.overflow = 'hidden';
    return element;
  },

  undoClipping: function(element) {
    element = $(element);
    if (!element._overflow) return element;
    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
    element._overflow = null;
    return element;
  }
};

Object.extend(Element.Methods, {
  childOf: Element.Methods.descendantOf,
  childElements: Element.Methods.immediateDescendants
});

if (Prototype.Browser.Opera) {
  Element.Methods._getStyle = Element.Methods.getStyle;
  Element.Methods.getStyle = function(element, style) {
    switch(style) {
      case 'left':
      case 'top':
      case 'right':
      case 'bottom':
        if (Element._getStyle(element, 'position') == 'static') return null;
      default: return Element._getStyle(element, style);
    }
  };
}
else if (Prototype.Browser.IE) {
  Element.Methods.getStyle = function(element, style) {
    element = $(element);
    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
    var value = element.style[style];
    if (!value && element.currentStyle) value = element.currentStyle[style];

    if (style == 'opacity') {
      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
        if (value[1]) return parseFloat(value[1]) / 100;
      return 1.0;
    }

    if (value == 'auto') {
      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
        return element['offset'+style.capitalize()] + 'px';
      return null;
    }
    return value;
  };

  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    var filter = element.getStyle('filter'), style = element.style;
    if (value == 1 || value === '') {
      style.filter = filter.replace(/alpha\([^\)]*\)/gi,'');
      return element;
    } else if (value < 0.00001) value = 0;
    style.filter = filter.replace(/alpha\([^\)]*\)/gi, '') +
      'alpha(opacity=' + (value * 100) + ')';
    return element;
  };

  // IE is missing .innerHTML support for TABLE-related elements
  Element.Methods.update = function(element, html) {
    element = $(element);
    html = typeof html == 'undefined' ? '' : html.toString();
    var tagName = element.tagName.toUpperCase();
    if (['THEAD','TBODY','TR','TD'].include(tagName)) {
      var div = document.createElement('div');
      switch (tagName) {
        case 'THEAD':
        case 'TBODY':
          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
          depth = 2;
          break;
        case 'TR':
          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
          depth = 3;
          break;
        case 'TD':
          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
          depth = 4;
      }
      $A(element.childNodes).each(function(node) { element.removeChild(node) });
      depth.times(function() { div = div.firstChild });
      $A(div.childNodes).each(function(node) { element.appendChild(node) });
    } else {
      element.innerHTML = html.stripScripts();
    }
    setTimeout(function() { html.evalScripts() }, 10);
    return element;
  }
}
else if (Prototype.Browser.Gecko) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1) ? 0.999999 :
      (value === '') ? '' : (value < 0.00001) ? 0 : value;
    return element;
  };
}

Element._attributeTranslations = {
  names: {
    colspan:   "colSpan",
    rowspan:   "rowSpan",
    valign:    "vAlign",
    datetime:  "dateTime",
    accesskey: "accessKey",
    tabindex:  "tabIndex",
    enctype:   "encType",
    maxlength: "maxLength",
    readonly:  "readOnly",
    longdesc:  "longDesc"
  },
  values: {
    _getAttr: function(element, attribute) {
      return element.getAttribute(attribute, 2);
    },
    _flag: function(element, attribute) {
      return $(element).hasAttribute(attribute) ? attribute : null;
    },
    style: function(element) {
      return element.style.cssText.toLowerCase();
    },
    title: function(element) {
      var node = element.getAttributeNode('title');
      return node.specified ? node.nodeValue : null;
    }
  }
};

(function() {
  Object.extend(this, {
    href: this._getAttr,
    src:  this._getAttr,
    type: this._getAttr,
    disabled: this._flag,
    checked:  this._flag,
    readonly: this._flag,
    multiple: this._flag
  });
}).call(Element._attributeTranslations.values);

Element.Methods.Simulated = {
  hasAttribute: function(element, attribute) {
    var t = Element._attributeTranslations, node;
    attribute = t.names[attribute] || attribute;
    node = $(element).getAttributeNode(attribute);
    return node && node.specified;
  }
};

Element.Methods.ByTag = {};

Object.extend(Element, Element.Methods);

if (!Prototype.BrowserFeatures.ElementExtensions &&
 document.createElement('div').__proto__) {
  window.HTMLElement = {};
  window.HTMLElement.prototype = document.createElement('div').__proto__;
  Prototype.BrowserFeatures.ElementExtensions = true;
}

Element.hasAttribute = function(element, attribute) {
  if (element.hasAttribute) return element.hasAttribute(attribute);
  return Element.Methods.Simulated.hasAttribute(element, attribute);
};

Element.addMethods = function(methods) {
  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;

  if (!methods) {
    Object.extend(Form, Form.Methods);
    Object.extend(Form.Element, Form.Element.Methods);
    Object.extend(Element.Methods.ByTag, {
      "FORM":     Object.clone(Form.Methods),
      "INPUT":    Object.clone(Form.Element.Methods),
      "SELECT":   Object.clone(Form.Element.Methods),
      "TEXTAREA": Object.clone(Form.Element.Methods)
    });
  }

  if (arguments.length == 2) {
    var tagName = methods;
    methods = arguments[1];
  }

  if (!tagName) Object.extend(Element.Methods, methods || {});
  else {
    if (tagName.constructor == Array) tagName.each(extend);
    else extend(tagName);
  }

  function extend(tagName) {
    tagName = tagName.toUpperCase();
    if (!Element.Methods.ByTag[tagName])
      Element.Methods.ByTag[tagName] = {};
    Object.extend(Element.Methods.ByTag[tagName], methods);
  }

  function copy(methods, destination, onlyIfAbsent) {
    onlyIfAbsent = onlyIfAbsent || false;
    var cache = Element.extend.cache;
    for (var property in methods) {
      var value = methods[property];
      if (!onlyIfAbsent || !(property in destination))
        destination[property] = cache.findOrStore(value);
    }
  }

  function findDOMClass(tagName) {
    var klass;
    var trans = {
      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
      "FrameSet", "IFRAME": "IFrame"
    };
    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName.capitalize() + 'Element';
    if (window[klass]) return window[klass];

    window[klass] = {};
    window[klass].prototype = document.createElement(tagName).__proto__;
    return window[klass];
  }

  if (F.ElementExtensions) {
    copy(Element.Methods, HTMLElement.prototype);
    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
  }

  if (F.SpecificElementExtensions) {
    for (var tag in Element.Methods.ByTag) {
      var klass = findDOMClass(tag);
      if (typeof klass == "undefined") continue;
      copy(T[tag], klass.prototype);
    }
  }

  Object.extend(Element, Element.Methods);
  delete Element.ByTag;
};

var Toggle = { display: Element.toggle };

/*--------------------------------------------------------------------------*/

Abstract.Insertion = function(adjacency) {
  this.adjacency = adjacency;
}

Abstract.Insertion.prototype = {
  initialize: function(element, content) {
    this.element = $(element);
    this.content = content.stripScripts();

    if (this.adjacency && this.element.insertAdjacentHTML) {
      try {
        this.element.insertAdjacentHTML(this.adjacency, this.content);
      } catch (e) {
        var tagName = this.element.tagName.toUpperCase();
        if (['TBODY', 'TR'].include(tagName)) {
          this.insertContent(this.contentFromAnonymousTable());
        } else {
          throw e;
        }
      }
    } else {
      this.range = this.element.ownerDocument.createRange();
      if (this.initializeRange) this.initializeRange();
      this.insertContent([this.range.createContextualFragment(this.content)]);
    }

    setTimeout(function() {content.evalScripts()}, 10);
  },

  contentFromAnonymousTable: function() {
    var div = document.createElement('div');
    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
    return $A(div.childNodes[0].childNodes[0].childNodes);
  }
}

var Insertion = new Object();

Insertion.Before = Class.create();
Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
  initializeRange: function() {
    this.range.setStartBefore(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.parentNode.insertBefore(fragment, this.element);
    }).bind(this));
  }
});

Insertion.Top = Class.create();
Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
  initializeRange: function() {
    this.range.selectNodeContents(this.element);
    this.range.collapse(true);
  },

  insertContent: function(fragments) {
    fragments.reverse(false).each((function(fragment) {
      this.element.insertBefore(fragment, this.element.firstChild);
    }).bind(this));
  }
});

Insertion.Bottom = Class.create();
Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
  initializeRange: function() {
    this.range.selectNodeContents(this.element);
    this.range.collapse(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.appendChild(fragment);
    }).bind(this));
  }
});

Insertion.After = Class.create();
Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
  initializeRange: function() {
    this.range.setStartAfter(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.parentNode.insertBefore(fragment,
        this.element.nextSibling);
    }).bind(this));
  }
});

/*--------------------------------------------------------------------------*/

Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
  initialize: function(element) {
    this.element = $(element);
  },

  _each: function(iterator) {
    this.element.className.split(/\s+/).select(function(name) {
      return name.length > 0;
    })._each(iterator);
  },

  set: function(className) {
    this.element.className = className;
  },

  add: function(classNameToAdd) {
    if (this.include(classNameToAdd)) return;
    this.set($A(this).concat(classNameToAdd).join(' '));
  },

  remove: function(classNameToRemove) {
    if (!this.include(classNameToRemove)) return;
    this.set($A(this).without(classNameToRemove).join(' '));
  },

  toString: function() {
    return $A(this).join(' ');
  }
};

Object.extend(Element.ClassNames.prototype, Enumerable);

var Selector = Class.create();

Selector.prototype = {
  initialize: function(expression) {
    this.expression = expression.strip();
    this.compileMatcher();
  },

  compileMatcher: function() {
    // Selectors with namespaced attributes can't use the XPath version
    if (Prototype.BrowserFeatures.XPath && !(/\[[\w-]*?:/).test(this.expression))
      return this.compileXPathMatcher();

    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
        c = Selector.criteria, le, p, m;

    if (Selector._cache[e]) {
      this.matcher = Selector._cache[e]; return;
    }
    this.matcher = ["this.matcher = function(root) {",
                    "var r = root, h = Selector.handlers, c = false, n;"];

    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        p = ps[i];
        if (m = e.match(p)) {
          this.matcher.push(typeof c[i] == 'function' ? c[i](m) :
    	      new Template(c[i]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.matcher.push("return h.unique(n);\n}");
    eval(this.matcher.join('\n'));
    Selector._cache[this.expression] = this.matcher;
  },

  compileXPathMatcher: function() {
    var e = this.expression, ps = Selector.patterns,
        x = Selector.xpath, le,  m;

    if (Selector._cache[e]) {
      this.xpath = Selector._cache[e]; return;
    }

    this.matcher = ['.//*'];
    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        if (m = e.match(ps[i])) {
          this.matcher.push(typeof x[i] == 'function' ? x[i](m) :
            new Template(x[i]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.xpath = this.matcher.join('');
    Selector._cache[this.expression] = this.xpath;
  },

  findElements: function(root) {
    root = root || document;
    if (this.xpath) return document._getElementsByXPath(this.xpath, root);
    return this.matcher(root);
  },

  match: function(element) {
    return this.findElements(document).include(element);
  },

  toString: function() {
    return this.expression;
  },

  inspect: function() {
    return "#<Selector:" + this.expression.inspect() + ">";
  }
};

Object.extend(Selector, {
  _cache: {},

  xpath: {
    descendant:   "//*",
    child:        "/*",
    adjacent:     "/following-sibling::*[1]",
    laterSibling: '/following-sibling::*',
    tagName:      function(m) {
      if (m[1] == '*') return '';
      return "[local-name()='" + m[1].toLowerCase() +
             "' or local-name()='" + m[1].toUpperCase() + "']";
    },
    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
    id:           "[@id='#{1}']",
    attrPresence: "[@#{1}]",
    attr: function(m) {
      m[3] = m[5] || m[6];
      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
    },
    pseudo: function(m) {
      var h = Selector.xpath.pseudos[m[1]];
      if (!h) return '';
      if (typeof h === 'function') return h(m);
      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
    },
    operators: {
      '=':  "[@#{1}='#{3}']",
      '!=': "[@#{1}!='#{3}']",
      '^=': "[starts-with(@#{1}, '#{3}')]",
      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
      '*=': "[contains(@#{1}, '#{3}')]",
      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
    },
    pseudos: {
      'first-child': '[not(preceding-sibling::*)]',
      'last-child':  '[not(following-sibling::*)]',
      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
      'empty':       "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
      'checked':     "[@checked]",
      'disabled':    "[@disabled]",
      'enabled':     "[not(@disabled)]",
      'not': function(m) {
        var e = m[6], p = Selector.patterns,
            x = Selector.xpath, le, m, v;

        var exclusion = [];
        while (e && le != e && (/\S/).test(e)) {
          le = e;
          for (var i in p) {
            if (m = e.match(p[i])) {
              v = typeof x[i] == 'function' ? x[i](m) : new Template(x[i]).evaluate(m);
              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
              e = e.replace(m[0], '');
              break;
            }
          }
        }
        return "[not(" + exclusion.join(" and ") + ")]";
      },
      'nth-child':      function(m) {
        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
      },
      'nth-last-child': function(m) {
        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
      },
      'nth-of-type':    function(m) {
        return Selector.xpath.pseudos.nth("position() ", m);
      },
      'nth-last-of-type': function(m) {
        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
      },
      'first-of-type':  function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
      },
      'last-of-type':   function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
      },
      'only-of-type':   function(m) {
        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
      },
      nth: function(fragment, m) {
        var mm, formula = m[6], predicate;
        if (formula == 'even') formula = '2n+0';
        if (formula == 'odd')  formula = '2n+1';
        if (mm = formula.match(/^(\d+)$/)) // digit only
          return '[' + fragment + "= " + mm[1] + ']';
        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
          if (mm[1] == "-") mm[1] = -1;
          var a = mm[1] ? Number(mm[1]) : 1;
          var b = mm[2] ? Number(mm[2]) : 0;
          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
          "((#{fragment} - #{b}) div #{a} >= 0)]";
          return new Template(predicate).evaluate({
            fragment: fragment, a: a, b: b });
        }
      }
    }
  },

  criteria: {
    tagName:      'n = h.tagName(n, r, "#{1}", c);   c = false;',
    className:    'n = h.className(n, r, "#{1}", c); c = false;',
    id:           'n = h.id(n, r, "#{1}", c);        c = false;',
    attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
    attr: function(m) {
      m[3] = (m[5] || m[6]);
      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);
    },
    pseudo:       function(m) {
      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
    },
    descendant:   'c = "descendant";',
    child:        'c = "child";',
    adjacent:     'c = "adjacent";',
    laterSibling: 'c = "laterSibling";'
  },

  patterns: {
    // combinators must be listed first
    // (and descendant needs to be last combinator)
    laterSibling: /^\s*~\s*/,
    child:        /^\s*>\s*/,
    adjacent:     /^\s*\+\s*/,
    descendant:   /^\s/,

    // selectors follow
    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
    id:           /^#([\w\-\*]+)(\b|$)/,
    className:    /^\.([\w\-\*]+)(\b|$)/,
    pseudo:       /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|\s|(?=:))/,
    attrPresence: /^\[([\w]+)\]/,
    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\]]*?)\4|([^'"][^\]]*?)))?\]/
  },

  handlers: {
    // UTILITY FUNCTIONS
    // joins two collections
    concat: function(a, b) {
      for (var i = 0, node; node = b[i]; i++)
        a.push(node);
      return a;
    },

    // marks an array of nodes for counting
    mark: function(nodes) {
      for (var i = 0, node; node = nodes[i]; i++)
        node._counted = true;
      return nodes;
    },

    unmark: function(nodes) {
      for (var i = 0, node; node = nodes[i]; i++)
        node._counted = undefined;
      return nodes;
    },

    // mark each child node with its position (for nth calls)
    // "ofType" flag indicates whether we're indexing for nth-of-type
    // rather than nth-child
    index: function(parentNode, reverse, ofType) {
      parentNode._counted = true;
      if (reverse) {
        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
          node = nodes[i];
          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
        }
      } else {
        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
      }
    },

    // filters out duplicates and extends all nodes
    unique: function(nodes) {
      if (nodes.length == 0) return nodes;
      var results = [], n;
      for (var i = 0, l = nodes.length; i < l; i++)
        if (!(n = nodes[i])._counted) {
          n._counted = true;
          results.push(Element.extend(n));
        }
      return Selector.handlers.unmark(results);
    },

    // COMBINATOR FUNCTIONS
    descendant: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, node.getElementsByTagName('*'));
      return results;
    },

    child: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        for (var j = 0, children = [], child; child = node.childNodes[j]; j++)
          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
      }
      return results;
    },

    adjacent: function(nodes) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        var next = this.nextElementSibling(node);
        if (next) results.push(next);
      }
      return results;
    },

    laterSibling: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, Element.nextSiblings(node));
      return results;
    },

    nextElementSibling: function(node) {
      while (node = node.nextSibling)
	      if (node.nodeType == 1) return node;
      return null;
    },

    previousElementSibling: function(node) {
      while (node = node.previousSibling)
        if (node.nodeType == 1) return node;
      return null;
    },

    // TOKEN FUNCTIONS
    tagName: function(nodes, root, tagName, combinator) {
      tagName = tagName.toUpperCase();
      var results = [], h = Selector.handlers;
      if (nodes) {
        if (combinator) {
          // fastlane for ordinary descendant combinators
          if (combinator == "descendant") {
            for (var i = 0, node; node = nodes[i]; i++)
              h.concat(results, node.getElementsByTagName(tagName));
            return results;
          } else nodes = this[combinator](nodes);
          if (tagName == "*") return nodes;
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.tagName.toUpperCase() == tagName) results.push(node);
        return results;
      } else return root.getElementsByTagName(tagName);
    },

    id: function(nodes, root, id, combinator) {
      var targetNode = $(id), h = Selector.handlers;
      if (!nodes && root == document) return targetNode ? [targetNode] : [];
      if (nodes) {
        if (combinator) {
          if (combinator == 'child') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (targetNode.parentNode == node) return [targetNode];
          } else if (combinator == 'descendant') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Element.descendantOf(targetNode, node)) return [targetNode];
          } else if (combinator == 'adjacent') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Selector.handlers.previousElementSibling(targetNode) == node)
                return [targetNode];
          } else nodes = h[combinator](nodes);
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node == targetNode) return [targetNode];
        return [];
      }
      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
    },

    className: function(nodes, root, className, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      return Selector.handlers.byClassName(nodes, root, className);
    },

    byClassName: function(nodes, root, className) {
      if (!nodes) nodes = Selector.handlers.descendant([root]);
      var needle = ' ' + className + ' ';
      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
        nodeClassName = node.className;
        if (nodeClassName.length == 0) continue;
        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
          results.push(node);
      }
      return results;
    },

    attrPresence: function(nodes, root, attr) {
      var results = [];
      for (var i = 0, node; node = nodes[i]; i++)
        if (Element.hasAttribute(node, attr)) results.push(node);
      return results;
    },

    attr: function(nodes, root, attr, value, operator) {
      if (!nodes) nodes = root.getElementsByTagName("*");
      var handler = Selector.operators[operator], results = [];
      for (var i = 0, node; node = nodes[i]; i++) {
        var nodeValue = Element.readAttribute(node, attr);
        if (nodeValue === null) continue;
        if (handler(nodeValue, value)) results.push(node);
      }
      return results;
    },

    pseudo: function(nodes, name, value, root, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      if (!nodes) nodes = root.getElementsByTagName("*");
      return Selector.pseudos[name](nodes, value, root);
    }
  },

  pseudos: {
    'first-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.previousElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'last-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.nextElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'only-child': function(nodes, value, root) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
          results.push(node);
      return results;
    },
    'nth-child':        function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root);
    },
    'nth-last-child':   function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true);
    },
    'nth-of-type':      function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, false, true);
    },
    'nth-last-of-type': function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true, true);
    },
    'first-of-type':    function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, false, true);
    },
    'last-of-type':     function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, true, true);
    },
    'only-of-type':     function(nodes, formula, root) {
      var p = Selector.pseudos;
      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
    },

    // handles the an+b logic
    getIndices: function(a, b, total) {
      if (a == 0) return b > 0 ? [b] : [];
      return $R(1, total).inject([], function(memo, i) {
        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
        return memo;
      });
    },

    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
    nth: function(nodes, formula, root, reverse, ofType) {
      if (nodes.length == 0) return [];
      if (formula == 'even') formula = '2n+0';
      if (formula == 'odd')  formula = '2n+1';
      var h = Selector.handlers, results = [], indexed = [], m;
      h.mark(nodes);
      for (var i = 0, node; node = nodes[i]; i++) {
        if (!node.parentNode._counted) {
          h.index(node.parentNode, reverse, ofType);
          indexed.push(node.parentNode);
        }
      }
      if (formula.match(/^\d+$/)) { // just a number
        formula = Number(formula);
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.nodeIndex == formula) results.push(node);
      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
        if (m[1] == "-") m[1] = -1;
        var a = m[1] ? Number(m[1]) : 1;
        var b = m[2] ? Number(m[2]) : 0;
        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
          for (var j = 0; j < l; j++)
            if (node.nodeIndex == indices[j]) results.push(node);
        }
      }
      h.unmark(nodes);
      h.unmark(indexed);
      return results;
    },

    'empty': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        // IE treats comments as element nodes
        if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
        results.push(node);
      }
      return results;
    },

    'not': function(nodes, selector, root) {
      var h = Selector.handlers, selectorType, m;
      var exclusions = new Selector(selector).findElements(root);
      h.mark(exclusions);
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node._counted) results.push(node);
      h.unmark(exclusions);
      return results;
    },

    'enabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node.disabled) results.push(node);
      return results;
    },

    'disabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.disabled) results.push(node);
      return results;
    },

    'checked': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.checked) results.push(node);
      return results;
    }
  },

  operators: {
    '=':  function(nv, v) { return nv == v; },
    '!=': function(nv, v) { return nv != v; },
    '^=': function(nv, v) { return nv.startsWith(v); },
    '$=': function(nv, v) { return nv.endsWith(v); },
    '*=': function(nv, v) { return nv.include(v); },
    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
  },

  matchElements: function(elements, expression) {
    var matches = new Selector(expression).findElements(), h = Selector.handlers;
    h.mark(matches);
    for (var i = 0, results = [], element; element = elements[i]; i++)
      if (element._counted) results.push(element);
    h.unmark(matches);
    return results;
  },

  findElement: function(elements, expression, index) {
    if (typeof expression == 'number') {
      index = expression; expression = false;
    }
    return Selector.matchElements(elements, expression || '*')[index || 0];
  },

  findChildElements: function(element, expressions) {
    var exprs = expressions.join(','), expressions = [];
    exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
      expressions.push(m[1].strip());
    });
    var results = [], h = Selector.handlers;
    for (var i = 0, l = expressions.length, selector; i < l; i++) {
      selector = new Selector(expressions[i].strip());
      h.concat(results, selector.findElements(element));
    }
    return (l > 1) ? h.unique(results) : results;
  }
});

function $$() {
  return Selector.findChildElements(document, $A(arguments));
}
var Form = {
  reset: function(form) {
    $(form).reset();
    return form;
  },

  serializeElements: function(elements, getHash) {
    var data = elements.inject({}, function(result, element) {
      if (!element.disabled && element.name) {
        var key = element.name, value = $(element).getValue();
        if (value != null) {
         	if (key in result) {
            if (result[key].constructor != Array) result[key] = [result[key]];
            result[key].push(value);
          }
          else result[key] = value;
        }
      }
      return result;
    });

    return getHash ? data : Hash.toQueryString(data);
  }
};

Form.Methods = {
  serialize: function(form, getHash) {
    return Form.serializeElements(Form.getElements(form), getHash);
  },

  getElements: function(form) {
    return $A($(form).getElementsByTagName('*')).inject([],
      function(elements, child) {
        if (Form.Element.Serializers[child.tagName.toLowerCase()])
          elements.push(Element.extend(child));
        return elements;
      }
    );
  },

  getInputs: function(form, typeName, name) {
    form = $(form);
    var inputs = form.getElementsByTagName('input');

    if (!typeName && !name) return $A(inputs).map(Element.extend);

    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
      var input = inputs[i];
      if ((typeName && input.type != typeName) || (name && input.name != name))
        continue;
      matchingInputs.push(Element.extend(input));
    }

    return matchingInputs;
  },

  disable: function(form) {
    form = $(form);
    Form.getElements(form).invoke('disable');
    return form;
  },

  enable: function(form) {
    form = $(form);
    Form.getElements(form).invoke('enable');
    return form;
  },

  findFirstElement: function(form) {
    return $(form).getElements().find(function(element) {
      return element.type != 'hidden' && !element.disabled &&
        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
    });
  },

  focusFirstElement: function(form) {
    form = $(form);
    form.findFirstElement().activate();
    return form;
  },

  request: function(form, options) {
    form = $(form), options = Object.clone(options || {});

    var params = options.parameters;
    options.parameters = form.serialize(true);

    if (params) {
      if (typeof params == 'string') params = params.toQueryParams();
      Object.extend(options.parameters, params);
    }

    if (form.hasAttribute('method') && !options.method)
      options.method = form.method;

    return new Ajax.Request(form.readAttribute('action'), options);
  }
}

/*--------------------------------------------------------------------------*/

Form.Element = {
  focus: function(element) {
    $(element).focus();
    return element;
  },

  select: function(element) {
    $(element).select();
    return element;
  }
}

Form.Element.Methods = {
  serialize: function(element) {
    element = $(element);
    if (!element.disabled && element.name) {
      var value = element.getValue();
      if (value != undefined) {
        var pair = {};
        pair[element.name] = value;
        return Hash.toQueryString(pair);
      }
    }
    return '';
  },

  getValue: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    return Form.Element.Serializers[method](element);
  },

  clear: function(element) {
    $(element).value = '';
    return element;
  },

  present: function(element) {
    return $(element).value != '';
  },

  activate: function(element) {
    element = $(element);
    try {
      element.focus();
      if (element.select && (element.tagName.toLowerCase() != 'input' ||
        !['button', 'reset', 'submit'].include(element.type)))
        element.select();
    } catch (e) {}
    return element;
  },

  disable: function(element) {
    element = $(element);
    element.blur();
    element.disabled = true;
    return element;
  },

  enable: function(element) {
    element = $(element);
    element.disabled = false;
    return element;
  }
}

/*--------------------------------------------------------------------------*/

var Field = Form.Element;
var $F = Form.Element.Methods.getValue;

/*--------------------------------------------------------------------------*/

Form.Element.Serializers = {
  input: function(element) {
    switch (element.type.toLowerCase()) {
      case 'checkbox':
      case 'radio':
        return Form.Element.Serializers.inputSelector(element);
      default:
        return Form.Element.Serializers.textarea(element);
    }
  },

  inputSelector: function(element) {
    return element.checked ? element.value : null;
  },

  textarea: function(element) {
    return element.value;
  },

  select: function(element) {
    return this[element.type == 'select-one' ?
      'selectOne' : 'selectMany'](element);
  },

  selectOne: function(element) {
    var index = element.selectedIndex;
    return index >= 0 ? this.optionValue(element.options[index]) : null;
  },

  selectMany: function(element) {
    var values, length = element.length;
    if (!length) return null;

    for (var i = 0, values = []; i < length; i++) {
      var opt = element.options[i];
      if (opt.selected) values.push(this.optionValue(opt));
    }
    return values;
  },

  optionValue: function(opt) {
    // extend element because hasAttribute may not be native
    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
  }
}

/*--------------------------------------------------------------------------*/

Abstract.TimedObserver = function() {}
Abstract.TimedObserver.prototype = {
  initialize: function(element, frequency, callback) {
    this.frequency = frequency;
    this.element   = $(element);
    this.callback  = callback;

    this.lastValue = this.getValue();
    this.registerCallback();
  },

  registerCallback: function() {
    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  onTimerEvent: function() {
    var value = this.getValue();
    var changed = ('string' == typeof this.lastValue && 'string' == typeof value
      ? this.lastValue != value : String(this.lastValue) != String(value));
    if (changed) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  }
}

Form.Element.Observer = Class.create();
Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.Observer = Class.create();
Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
  getValue: function() {
    return Form.serialize(this.element);
  }
});

/*--------------------------------------------------------------------------*/

Abstract.EventObserver = function() {}
Abstract.EventObserver.prototype = {
  initialize: function(element, callback) {
    this.element  = $(element);
    this.callback = callback;

    this.lastValue = this.getValue();
    if (this.element.tagName.toLowerCase() == 'form')
      this.registerFormCallbacks();
    else
      this.registerCallback(this.element);
  },

  onElementEvent: function() {
    var value = this.getValue();
    if (this.lastValue != value) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  },

  registerFormCallbacks: function() {
    Form.getElements(this.element).each(this.registerCallback.bind(this));
  },

  registerCallback: function(element) {
    if (element.type) {
      switch (element.type.toLowerCase()) {
        case 'checkbox':
        case 'radio':
          Event.observe(element, 'click', this.onElementEvent.bind(this));
          break;
        default:
          Event.observe(element, 'change', this.onElementEvent.bind(this));
          break;
      }
    }
  }
}

Form.Element.EventObserver = Class.create();
Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.EventObserver = Class.create();
Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  getValue: function() {
    return Form.serialize(this.element);
  }
});
if (!window.Event) {
  var Event = new Object();
}

Object.extend(Event, {
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,
  KEY_HOME:     36,
  KEY_END:      35,
  KEY_PAGEUP:   33,
  KEY_PAGEDOWN: 34,

  element: function(event) {
    return $(event.target || event.srcElement);
  },

  isLeftClick: function(event) {
    return (((event.which) && (event.which == 1)) ||
            ((event.button) && (event.button == 1)));
  },

  pointerX: function(event) {
    return event.pageX || (event.clientX +
      (document.documentElement.scrollLeft || document.body.scrollLeft));
  },

  pointerY: function(event) {
    return event.pageY || (event.clientY +
      (document.documentElement.scrollTop || document.body.scrollTop));
  },

  stop: function(event) {
    if (event.preventDefault) {
      event.preventDefault();
      event.stopPropagation();
    } else {
      event.returnValue = false;
      event.cancelBubble = true;
    }
  },

  // find the first node with the given tagName, starting from the
  // node the event was triggered on; traverses the DOM upwards
  findElement: function(event, tagName) {
    var element = Event.element(event);
    while (element.parentNode && (!element.tagName ||
        (element.tagName.toUpperCase() != tagName.toUpperCase())))
      element = element.parentNode;
    return element;
  },

  observers: false,

  _observeAndCache: function(element, name, observer, useCapture) {
    if (!this.observers) this.observers = [];
    if (element.addEventListener) {
      this.observers.push([element, name, observer, useCapture]);
      element.addEventListener(name, observer, useCapture);
    } else if (element.attachEvent) {
      this.observers.push([element, name, observer, useCapture]);
      element.attachEvent('on' + name, observer);
    }
  },

  unloadCache: function() {
    if (!Event.observers) return;
    for (var i = 0, length = Event.observers.length; i < length; i++) {
      Event.stopObserving.apply(this, Event.observers[i]);
      Event.observers[i][0] = null;
    }
    Event.observers = false;
  },

  observe: function(element, name, observer, useCapture) {
    element = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
      (Prototype.Browser.WebKit || element.attachEvent))
      name = 'keydown';

    Event._observeAndCache(element, name, observer, useCapture);
  },

  stopObserving: function(element, name, observer, useCapture) {
    element = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (Prototype.Browser.WebKit || element.attachEvent))
      name = 'keydown';

    if (element.removeEventListener) {
      element.removeEventListener(name, observer, useCapture);
    } else if (element.detachEvent) {
      try {
        element.detachEvent('on' + name, observer);
      } catch (e) {}
    }
  }
});

/* prevent memory leaks in IE */
if (Prototype.Browser.IE)
  Event.observe(window, 'unload', Event.unloadCache, false);
var Position = {
  // set to true if needed, warning: firefox performance problems
  // NOT neeeded for page scrolling, only if draggable contained in
  // scrollable elements
  includeScrollOffsets: false,

  // must be called before calling withinIncludingScrolloffset, every time the
  // page is scrolled
  prepare: function() {
    this.deltaX =  window.pageXOffset
                || document.documentElement.scrollLeft
                || document.body.scrollLeft
                || 0;
    this.deltaY =  window.pageYOffset
                || document.documentElement.scrollTop
                || document.body.scrollTop
                || 0;
  },

  realOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0;
      element = element.parentNode;
    } while (element);
    return [valueL, valueT];
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return [valueL, valueT];
  },

  positionedOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
      if (element) {
        if(element.tagName=='BODY') break;
        var p = Element.getStyle(element, 'position');
        if (p == 'relative' || p == 'absolute') break;
      }
    } while (element);
    return [valueL, valueT];
  },

  offsetParent: function(element) {
    if (element.offsetParent) return element.offsetParent;
    if (element == document.body) return element;

    while ((element = element.parentNode) && element != document.body)
      if (Element.getStyle(element, 'position') != 'static')
        return element;

    return document.body;
  },

  // caches x/y coordinate pair to use with overlap
  within: function(element, x, y) {
    if (this.includeScrollOffsets)
      return this.withinIncludingScrolloffsets(element, x, y);
    this.xcomp = x;
    this.ycomp = y;
    this.offset = this.cumulativeOffset(element);

    return (y >= this.offset[1] &&
            y <  this.offset[1] + element.offsetHeight &&
            x >= this.offset[0] &&
            x <  this.offset[0] + element.offsetWidth);
  },

  withinIncludingScrolloffsets: function(element, x, y) {
    var offsetcache = this.realOffset(element);

    this.xcomp = x + offsetcache[0] - this.deltaX;
    this.ycomp = y + offsetcache[1] - this.deltaY;
    this.offset = this.cumulativeOffset(element);

    return (this.ycomp >= this.offset[1] &&
            this.ycomp <  this.offset[1] + element.offsetHeight &&
            this.xcomp >= this.offset[0] &&
            this.xcomp <  this.offset[0] + element.offsetWidth);
  },

  // within must be called directly before
  overlap: function(mode, element) {
    if (!mode) return 0;
    if (mode == 'vertical')
      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
        element.offsetHeight;
    if (mode == 'horizontal')
      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
        element.offsetWidth;
  },

  page: function(forElement) {
    var valueT = 0, valueL = 0;

    var element = forElement;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;

      // Safari fix
      if (element.offsetParent == document.body)
        if (Element.getStyle(element,'position')=='absolute') break;

    } while (element = element.offsetParent);

    element = forElement;
    do {
      if (!window.opera || element.tagName=='BODY') {
        valueT -= element.scrollTop  || 0;
        valueL -= element.scrollLeft || 0;
      }
    } while (element = element.parentNode);

    return [valueL, valueT];
  },

  clone: function(source, target) {
    var options = Object.extend({
      setLeft:    true,
      setTop:     true,
      setWidth:   true,
      setHeight:  true,
      offsetTop:  0,
      offsetLeft: 0
    }, arguments[2] || {})

    // find page position of source
    source = $(source);
    var p = Position.page(source);

    // find coordinate system to use
    target = $(target);
    var delta = [0, 0];
    var parent = null;
    // delta [0,0] will do fine with position: fixed elements,
    // position:absolute needs offsetParent deltas
    if (Element.getStyle(target,'position') == 'absolute') {
      parent = Position.offsetParent(target);
      delta = Position.page(parent);
    }

    // correct by body offsets (fixes Safari)
    if (parent == document.body) {
      delta[0] -= document.body.offsetLeft;
      delta[1] -= document.body.offsetTop;
    }

    // set position
    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
  },

  absolutize: function(element) {
    element = $(element);
    if (element.style.position == 'absolute') return;
    Position.prepare();

    var offsets = Position.positionedOffset(element);
    var top     = offsets[1];
    var left    = offsets[0];
    var width   = element.clientWidth;
    var height  = element.clientHeight;

    element._originalLeft   = left - parseFloat(element.style.left  || 0);
    element._originalTop    = top  - parseFloat(element.style.top || 0);
    element._originalWidth  = element.style.width;
    element._originalHeight = element.style.height;

    element.style.position = 'absolute';
    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.width  = width + 'px';
    element.style.height = height + 'px';
  },

  relativize: function(element) {
    element = $(element);
    if (element.style.position == 'relative') return;
    Position.prepare();

    element.style.position = 'relative';
    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.height = element._originalHeight;
    element.style.width  = element._originalWidth;
  }
}

// Safari returns margins on body which is incorrect if the child is absolutely
// positioned.  For performance reasons, redefine Position.cumulativeOffset for
// KHTML/WebKit only.
if (Prototype.Browser.WebKit) {
  Position.cumulativeOffset = function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      if (element.offsetParent == document.body)
        if (Element.getStyle(element, 'position') == 'absolute') break;

      element = element.offsetParent;
    } while (element);

    return [valueL, valueT];
  }
}

Element.addMethods();

// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// Contributors:
//  Justin Palmer (http://encytemedia.com/)
//  Mark Pilgrim (http://diveintomark.org/)
//  Martin Bialasinki
// 
// See scriptaculous.js for full license.  

// converts rgb() and #xxx to #xxxxxx format,  
// returns self (or first argument) if not convertable  
String.prototype.parseColor = function() {  
  var color = '#';  
  if(this.slice(0,4) == 'rgb(') {  
    var cols = this.slice(4,this.length-1).split(',');  
    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
  } else {  
    if(this.slice(0,1) == '#') {  
      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
      if(this.length==7) color = this.toLowerCase();  
    }  
  }  
  return(color.length==7 ? color : (arguments[0] || this));  
}

/*--------------------------------------------------------------------------*/

Element.collectTextNodes = function(element) {  
  return $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue : 
      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
  }).flatten().join('');
}

Element.collectTextNodesIgnoreClass = function(element, className) {  
  return $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue : 
      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
        Element.collectTextNodesIgnoreClass(node, className) : ''));
  }).flatten().join('');
}

Element.setContentZoom = function(element, percent) {
  element = $(element);  
  Element.setStyle(element, {fontSize: (percent/100) + 'em'});   
  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
}

Element.getOpacity = function(element){  
  var opacity;
  if (opacity = Element.getStyle(element, 'opacity'))  
    return parseFloat(opacity);  
  if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))  
    if(opacity[1]) return parseFloat(opacity[1]) / 100;  
  return 1.0;  
}

Element.setOpacity = function(element, value){  
  element= $(element);  
  if (value == 1){
    Element.setStyle(element, { opacity: 
      (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 
      0.999999 : 1.0 });
    if(/MSIE/.test(navigator.userAgent) && !window.opera)  
      Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});  
  } else {  
    if(value < 0.00001) value = 0;  
    Element.setStyle(element, {opacity: value});
    if(/MSIE/.test(navigator.userAgent) && !window.opera)  
     Element.setStyle(element, 
       { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
                 'alpha(opacity='+value*100+')' });  
  }
}  
 
Element.getInlineOpacity = function(element){  
  return $(element).style.opacity || '';
}  

Element.childrenWithClassName = function(element, className, findFirst) {
  var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");
  var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) { 
    return (c.className && c.className.match(classNameRegExp));
  });
  if(!results) results = [];
  return results;
}

Element.forceRerendering = function(element) {
  try {
    element = $(element);
    var n = document.createTextNode(' ');
    element.appendChild(n);
    element.removeChild(n);
  } catch(e) { }
};

/*--------------------------------------------------------------------------*/

Array.prototype.call = function() {
  var args = arguments;
  this.each(function(f){ f.apply(this, args) });
}

/*--------------------------------------------------------------------------*/

var Effect = {
  _elementDoesNotExistError: {
    name: 'ElementDoesNotExistError',
    message: 'The specified DOM element does not exist, but is required for this effect to operate'
  },
  tagifyText: function(element) {
    if(typeof Builder == 'undefined')
      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
      
    var tagifyStyle = 'position:relative';
    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
    element = $(element);
    $A(element.childNodes).each( function(child) {
      if(child.nodeType==3) {
        child.nodeValue.toArray().each( function(character) {
          element.insertBefore(
            Builder.node('span',{style: tagifyStyle},
              character == ' ' ? String.fromCharCode(160) : character), 
              child);
        });
        Element.remove(child);
      }
    });
  },
  multiple: function(element, effect) {
    var elements;
    if(((typeof element == 'object') || 
        (typeof element == 'function')) && 
       (element.length))
      elements = element;
    else
      elements = $(element).childNodes;
      
    var options = Object.extend({
      speed: 0.1,
      delay: 0.0
    }, arguments[2] || {});
    var masterDelay = options.delay;

    $A(elements).each( function(element, index) {
      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
    });
  },
  PAIRS: {
    'slide':  ['SlideDown','SlideUp'],
    'blind':  ['BlindDown','BlindUp'],
    'appear': ['Appear','Fade']
  },
  toggle: function(element, effect) {
    element = $(element);
    effect = (effect || 'appear').toLowerCase();
    var options = Object.extend({
      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
    }, arguments[2] || {});
    Effect[element.visible() ? 
      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
  }
};

var Effect2 = Effect; // deprecated

/* ------------- transitions ------------- */

Effect.Transitions = {}

Effect.Transitions.linear = Prototype.K;

Effect.Transitions.sinoidal = function(pos) {
  return (-Math.cos(pos*Math.PI)/2) + 0.5;
}
Effect.Transitions.reverse  = function(pos) {
  return 1-pos;
}
Effect.Transitions.flicker = function(pos) {
  return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
}
Effect.Transitions.wobble = function(pos) {
  return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
}
Effect.Transitions.pulse = function(pos) {
  return (Math.floor(pos*10) % 2 == 0 ? 
    (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
}
Effect.Transitions.none = function(pos) {
  return 0;
}
Effect.Transitions.full = function(pos) {
  return 1;
}

/* ------------- core effects ------------- */

Effect.ScopedQueue = Class.create();
Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
  initialize: function() {
    this.effects  = [];
    this.interval = null;
  },
  _each: function(iterator) {
    this.effects._each(iterator);
  },
  add: function(effect) {
    var timestamp = new Date().getTime();
    
    var position = (typeof effect.options.queue == 'string') ? 
      effect.options.queue : effect.options.queue.position;
    
    switch(position) {
      case 'front':
        // move unstarted effects after this effect  
        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
            e.startOn  += effect.finishOn;
            e.finishOn += effect.finishOn;
          });
        break;
      case 'end':
        // start effect after last queued effect has finished
        timestamp = this.effects.pluck('finishOn').max() || timestamp;
        break;
    }
    
    effect.startOn  += timestamp;
    effect.finishOn += timestamp;

    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
      this.effects.push(effect);
    
    if(!this.interval) 
      this.interval = setInterval(this.loop.bind(this), 40);
  },
  remove: function(effect) {
    this.effects = this.effects.reject(function(e) { return e==effect });
    if(this.effects.length == 0) {
      clearInterval(this.interval);
      this.interval = null;
    }
  },
  loop: function() {
    var timePos = new Date().getTime();
    this.effects.invoke('loop', timePos);
  }
});

Effect.Queues = {
  instances: $H(),
  get: function(queueName) {
    if(typeof queueName != 'string') return queueName;
    
    if(!this.instances[queueName])
      this.instances[queueName] = new Effect.ScopedQueue();
      
    return this.instances[queueName];
  }
}
Effect.Queue = Effect.Queues.get('global');

Effect.DefaultOptions = {
  transition: Effect.Transitions.sinoidal,
  duration:   1.0,   // seconds
  fps:        25.0,  // max. 25fps due to Effect.Queue implementation
  sync:       false, // true for combining
  from:       0.0,
  to:         1.0,
  delay:      0.0,
  queue:      'parallel'
}

Effect.Base = function() {};
Effect.Base.prototype = {
  position: null,
  start: function(options) {
    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
    this.currentFrame = 0;
    this.state        = 'idle';
    this.startOn      = this.options.delay*1000;
    this.finishOn     = this.startOn + (this.options.duration*1000);
    this.event('beforeStart');
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        'global' : this.options.queue.scope).add(this);
  },
  loop: function(timePos) {
    if(timePos >= this.startOn) {
      if(timePos >= this.finishOn) {
        this.render(1.0);
        this.cancel();
        this.event('beforeFinish');
        if(this.finish) this.finish(); 
        this.event('afterFinish');
        return;  
      }
      var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
      var frame = Math.round(pos * this.options.fps * this.options.duration);
      if(frame > this.currentFrame) {
        this.render(pos);
        this.currentFrame = frame;
      }
    }
  },
  render: function(pos) {
    if(this.state == 'idle') {
      this.state = 'running';
      this.event('beforeSetup');
      if(this.setup) this.setup();
      this.event('afterSetup');
    }
    if(this.state == 'running') {
      if(this.options.transition) pos = this.options.transition(pos);
      pos *= (this.options.to-this.options.from);
      pos += this.options.from;
      this.position = pos;
      this.event('beforeUpdate');
      if(this.update) this.update(pos);
      this.event('afterUpdate');
    }
  },
  cancel: function() {
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        'global' : this.options.queue.scope).remove(this);
    this.state = 'finished';
  },
  event: function(eventName) {
    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
    if(this.options[eventName]) this.options[eventName](this);
  },
  inspect: function() {
    return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
  }
}

Effect.Parallel = Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
  initialize: function(effects) {
    this.effects = effects || [];
    this.start(arguments[1]);
  },
  update: function(position) {
    this.effects.invoke('render', position);
  },
  finish: function(position) {
    this.effects.each( function(effect) {
      effect.render(1.0);
      effect.cancel();
      effect.event('beforeFinish');
      if(effect.finish) effect.finish(position);
      effect.event('afterFinish');
    });
  }
});

Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    // make this work on IE on elements without 'layout'
    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
      this.element.setStyle({zoom: 1});
    var options = Object.extend({
      from: this.element.getOpacity() || 0.0,
      to:   1.0
    }, arguments[1] || {});
    this.start(options);
  },
  update: function(position) {
    this.element.setOpacity(position);
  }
});

Effect.Move = Class.create();
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'relative'
    }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
    // Bug in Opera: Opera returns the "real" position of a static element or
    // relative element that does not have top/left explicitly set.
    // ==> Always set top and left for position relative elements in your stylesheets 
    // (to 0 if you do not need them) 
    this.element.makePositioned();
    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
    if(this.options.mode == 'absolute') {
      // absolute movement, so we need to calc deltaX and deltaY
      this.options.x = this.options.x - this.originalLeft;
      this.options.y = this.options.y - this.originalTop;
    }
  },
  update: function(position) {
    this.element.setStyle({
      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
    });
  }
});

// for backwards compatibility
Effect.MoveBy = function(element, toTop, toLeft) {
  return new Effect.Move(element, 
    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
};

Effect.Scale = Class.create();
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
  initialize: function(element, percent) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      scaleX: true,
      scaleY: true,
      scaleContent: true,
      scaleFromCenter: false,
      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
      scaleFrom: 100.0,
      scaleTo:   percent
    }, arguments[2] || {});
    this.start(options);
  },
  setup: function() {
    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
    this.elementPositioning = this.element.getStyle('position');
    
    this.originalStyle = {};
    ['top','left','width','height','fontSize'].each( function(k) {
      this.originalStyle[k] = this.element.style[k];
    }.bind(this));
      
    this.originalTop  = this.element.offsetTop;
    this.originalLeft = this.element.offsetLeft;
    
    var fontSize = this.element.getStyle('font-size') || '100%';
    ['em','px','%','pt'].each( function(fontSizeType) {
      if(fontSize.indexOf(fontSizeType)>0) {
        this.fontSize     = parseFloat(fontSize);
        this.fontSizeType = fontSizeType;
      }
    }.bind(this));
    
    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
    
    this.dims = null;
    if(this.options.scaleMode=='box')
      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
    if(/^content/.test(this.options.scaleMode))
      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
    if(!this.dims)
      this.dims = [this.options.scaleMode.originalHeight,
                   this.options.scaleMode.originalWidth];
  },
  update: function(position) {
    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
    if(this.options.scaleContent && this.fontSize)
      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
  },
  finish: function(position) {
    if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
  },
  setDimensions: function(height, width) {
    var d = {};
    if(this.options.scaleX) d.width = Math.round(width) + 'px';
    if(this.options.scaleY) d.height = Math.round(height) + 'px';
    if(this.options.scaleFromCenter) {
      var topd  = (height - this.dims[0])/2;
      var leftd = (width  - this.dims[1])/2;
      if(this.elementPositioning == 'absolute') {
        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
      } else {
        if(this.options.scaleY) d.top = -topd + 'px';
        if(this.options.scaleX) d.left = -leftd + 'px';
      }
    }
    this.element.setStyle(d);
  }
});

Effect.Highlight = Class.create();
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
    // Prevent executing on elements not in the layout flow
    if(this.element.getStyle('display')=='none') { this.cancel(); return; }
    // Disable background image during the effect
    this.oldStyle = {
      backgroundImage: this.element.getStyle('background-image') };
    this.element.setStyle({backgroundImage: 'none'});
    if(!this.options.endcolor)
      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
    if(!this.options.restorecolor)
      this.options.restorecolor = this.element.getStyle('background-color');
    // init color calculations
    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
  },
  update: function(position) {
    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
  },
  finish: function() {
    this.element.setStyle(Object.extend(this.oldStyle, {
      backgroundColor: this.options.restorecolor
    }));
  }
});

Effect.ScrollTo = Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    this.start(arguments[1] || {});
  },
  setup: function() {
    Position.prepare();
    var offsets = Position.cumulativeOffset(this.element);
    if(this.options.offset) offsets[1] += this.options.offset;
    var max = window.innerHeight ? 
      window.height - window.innerHeight :
      document.body.scrollHeight - 
        (document.documentElement.clientHeight ? 
          document.documentElement.clientHeight : document.body.clientHeight);
    this.scrollStart = Position.deltaY;
    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
  },
  update: function(position) {
    Position.prepare();
    window.scrollTo(Position.deltaX, 
      this.scrollStart + (position*this.delta));
  }
});

/* ------------- combination effects ------------- */

Effect.Fade = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  var options = Object.extend({
  from: element.getOpacity() || 1.0,
  to:   0.0,
  afterFinishInternal: function(effect) { 
    if(effect.options.to!=0) return;
    effect.element.hide();
    effect.element.setStyle({opacity: oldOpacity}); 
  }}, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Effect.Appear = function(element) {
  element = $(element);
  var options = Object.extend({
  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
  to:   1.0,
  // force Safari to render floated elements properly
  afterFinishInternal: function(effect) {
    effect.element.forceRerendering();
  },
  beforeSetup: function(effect) {
    effect.element.setOpacity(effect.options.from);
    effect.element.show(); 
  }}, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Effect.Puff = function(element) {
  element = $(element);
  var oldStyle = { 
    opacity: element.getInlineOpacity(), 
    position: element.getStyle('position'),
    top:  element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height
  };
  return new Effect.Parallel(
   [ new Effect.Scale(element, 200, 
      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
     Object.extend({ duration: 1.0, 
      beforeSetupInternal: function(effect) {
        Position.absolutize(effect.effects[0].element)
      },
      afterFinishInternal: function(effect) {
         effect.effects[0].element.hide();
         effect.effects[0].element.setStyle(oldStyle); }
     }, arguments[1] || {})
   );
}

Effect.BlindUp = function(element) {
  element = $(element);
  element.makeClipping();
  return new Effect.Scale(element, 0,
    Object.extend({ scaleContent: false, 
      scaleX: false, 
      restoreAfterFinish: true,
      afterFinishInternal: function(effect) {
        effect.element.hide();
        effect.element.undoClipping();
      } 
    }, arguments[1] || {})
  );
}

Effect.BlindDown = function(element) {
  element = $(element);
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({ 
    scaleContent: false, 
    scaleX: false,
    scaleFrom: 0,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makeClipping();
      effect.element.setStyle({height: '0px'});
      effect.element.show(); 
    },  
    afterFinishInternal: function(effect) {
      effect.element.undoClipping();
    }
  }, arguments[1] || {}));
}

Effect.SwitchOff = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  return new Effect.Appear(element, Object.extend({
    duration: 0.4,
    from: 0,
    transition: Effect.Transitions.flicker,
    afterFinishInternal: function(effect) {
      new Effect.Scale(effect.element, 1, { 
        duration: 0.3, scaleFromCenter: true,
        scaleX: false, scaleContent: false, restoreAfterFinish: true,
        beforeSetup: function(effect) { 
          effect.element.makePositioned();
          effect.element.makeClipping();
        },
        afterFinishInternal: function(effect) {
          effect.element.hide();
          effect.element.undoClipping();
          effect.element.undoPositioned();
          effect.element.setStyle({opacity: oldOpacity});
        }
      })
    }
  }, arguments[1] || {}));
}

Effect.DropOut = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left'),
    opacity: element.getInlineOpacity() };
  return new Effect.Parallel(
    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
    Object.extend(
      { duration: 0.5,
        beforeSetup: function(effect) {
          effect.effects[0].element.makePositioned(); 
        },
        afterFinishInternal: function(effect) {
          effect.effects[0].element.hide();
          effect.effects[0].element.undoPositioned();
          effect.effects[0].element.setStyle(oldStyle);
        } 
      }, arguments[1] || {}));
}

Effect.Shake = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left') };
    return new Effect.Move(element, 
      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
        effect.element.undoPositioned();
        effect.element.setStyle(oldStyle);
  }}) }}) }}) }}) }}) }});
}

Effect.SlideDown = function(element) {
  element = $(element);
  element.cleanWhitespace();
  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
  var oldInnerBottom = $(element.firstChild).getStyle('bottom');
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({ 
    scaleContent: false, 
    scaleX: false, 
    scaleFrom: window.opera ? 0 : 1,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makePositioned();
      effect.element.firstChild.makePositioned();
      if(window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping();
      effect.element.setStyle({height: '0px'});
      effect.element.show(); },
    afterUpdateInternal: function(effect) {
      effect.element.firstChild.setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping(); 
      // IE will crash if child is undoPositioned first
      if(/MSIE/.test(navigator.userAgent) && !window.opera){
        effect.element.undoPositioned();
        effect.element.firstChild.undoPositioned();
      }else{
        effect.element.firstChild.undoPositioned();
        effect.element.undoPositioned();
      }
      effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }
    }, arguments[1] || {})
  );
}

Effect.SlideUp = function(element) {
  element = $(element);
  element.cleanWhitespace();
  var oldInnerBottom = $(element.firstChild).getStyle('bottom');
  return new Effect.Scale(element, window.opera ? 0 : 1,
   Object.extend({ scaleContent: false, 
    scaleX: false, 
    scaleMode: 'box',
    scaleFrom: 100,
    restoreAfterFinish: true,
    beforeStartInternal: function(effect) {
      effect.element.makePositioned();
      effect.element.firstChild.makePositioned();
      if(window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping();
      effect.element.show(); },  
    afterUpdateInternal: function(effect) {
      effect.element.firstChild.setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' }); },
    afterFinishInternal: function(effect) {
      effect.element.hide();
      effect.element.undoClipping();
      effect.element.firstChild.undoPositioned();
      effect.element.undoPositioned();
      effect.element.setStyle({bottom: oldInnerBottom}); }
   }, arguments[1] || {})
  );
}

// Bug in opera makes the TD containing this element expand for a instance after finish 
Effect.Squish = function(element) {
  return new Effect.Scale(element, window.opera ? 1 : 0, 
    { restoreAfterFinish: true,
      beforeSetup: function(effect) {
        effect.element.makeClipping(effect.element); },  
      afterFinishInternal: function(effect) {
        effect.element.hide(effect.element); 
        effect.element.undoClipping(effect.element); }
  });
}

Effect.Grow = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.full
  }, arguments[1] || {});
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: element.getInlineOpacity() };

  var dims = element.getDimensions();    
  var initialMoveX, initialMoveY;
  var moveX, moveY;
  
  switch (options.direction) {
    case 'top-left':
      initialMoveX = initialMoveY = moveX = moveY = 0; 
      break;
    case 'top-right':
      initialMoveX = dims.width;
      initialMoveY = moveY = 0;
      moveX = -dims.width;
      break;
    case 'bottom-left':
      initialMoveX = moveX = 0;
      initialMoveY = dims.height;
      moveY = -dims.height;
      break;
    case 'bottom-right':
      initialMoveX = dims.width;
      initialMoveY = dims.height;
      moveX = -dims.width;
      moveY = -dims.height;
      break;
    case 'center':
      initialMoveX = dims.width / 2;
      initialMoveY = dims.height / 2;
      moveX = -dims.width / 2;
      moveY = -dims.height / 2;
      break;
  }
  
  return new Effect.Move(element, {
    x: initialMoveX,
    y: initialMoveY,
    duration: 0.01, 
    beforeSetup: function(effect) {
      effect.element.hide();
      effect.element.makeClipping();
      effect.element.makePositioned();
    },
    afterFinishInternal: function(effect) {
      new Effect.Parallel(
        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
          new Effect.Scale(effect.element, 100, {
            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
        ], Object.extend({
             beforeSetup: function(effect) {
               effect.effects[0].element.setStyle({height: '0px'});
               effect.effects[0].element.show(); 
             },
             afterFinishInternal: function(effect) {
               effect.effects[0].element.undoClipping();
               effect.effects[0].element.undoPositioned();
               effect.effects[0].element.setStyle(oldStyle); 
             }
           }, options)
      )
    }
  });
}

Effect.Shrink = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.none
  }, arguments[1] || {});
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: element.getInlineOpacity() };

  var dims = element.getDimensions();
  var moveX, moveY;
  
  switch (options.direction) {
    case 'top-left':
      moveX = moveY = 0;
      break;
    case 'top-right':
      moveX = dims.width;
      moveY = 0;
      break;
    case 'bottom-left':
      moveX = 0;
      moveY = dims.height;
      break;
    case 'bottom-right':
      moveX = dims.width;
      moveY = dims.height;
      break;
    case 'center':  
      moveX = dims.width / 2;
      moveY = dims.height / 2;
      break;
  }
  
  return new Effect.Parallel(
    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
    ], Object.extend({            
         beforeStartInternal: function(effect) {
           effect.effects[0].element.makePositioned();
           effect.effects[0].element.makeClipping(); },
         afterFinishInternal: function(effect) {
           effect.effects[0].element.hide();
           effect.effects[0].element.undoClipping();
           effect.effects[0].element.undoPositioned();
           effect.effects[0].element.setStyle(oldStyle); }
       }, options)
  );
}

Effect.Pulsate = function(element) {
  element = $(element);
  var options    = arguments[1] || {};
  var oldOpacity = element.getInlineOpacity();
  var transition = options.transition || Effect.Transitions.sinoidal;
  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
  reverser.bind(transition);
  return new Effect.Opacity(element, 
    Object.extend(Object.extend({  duration: 3.0, from: 0,
      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
    }, options), {transition: reverser}));
}

Effect.Fold = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height };
  Element.makeClipping(element);
  return new Effect.Scale(element, 5, Object.extend({   
    scaleContent: false,
    scaleX: false,
    afterFinishInternal: function(effect) {
    new Effect.Scale(element, 1, { 
      scaleContent: false, 
      scaleY: false,
      afterFinishInternal: function(effect) {
        effect.element.hide();
        effect.element.undoClipping(); 
        effect.element.setStyle(oldStyle);
      } });
  }}, arguments[1] || {}));
};

['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each( 
  function(f) { Element.Methods[f] = Element[f]; }
);

Element.Methods.visualEffect = function(element, effect, options) {
  s = effect.gsub(/_/, '-').camelize();
  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
  new Effect[effect_class](element, options);
  return $(element);
};

Element.addMethods();


/**
 * @author Bruno Bornsztein <bruno@missingmethod.com>
 * @copyright 2007 Curbly LLC
 * @package Glider
 * @license MIT
 * @url http://www.missingmethod.com/projects/glider/
 * @version 0.0.3
 * @dependencies prototype.js 1.5.1+, effects.js
 */

/*  Thanks to Andrew Dupont for refactoring help and code cleanup - http://andrewdupont.net/  */

Glider = Class.create();
Object.extend(Object.extend(Glider.prototype, Abstract.prototype), {
	initialize: function(wrapper, options){
	    this.scrolling  = false;
	    this.wrapper    = $(wrapper);
	    this.scroller   = this.wrapper.down('div.scroller');
	    this.sections   = this.wrapper.getElementsBySelector('div.section');
	    this.options    = Object.extend({ duration: 1.0, frequency: 3 }, options || {});

	    this.sections.each( function(section, index) {
	      section._index = index;
	    });    

	    this.events = {
	      click: this.click.bind(this)
	    };

	    this.addObservers();
			if(this.options.initialSection) this.moveTo(this.options.initialSection, this.scroller, { duration:this.options.duration });  // initialSection should be the id of the section you want to show up on load
			if(this.options.autoGlide) this.start();
	  },
	
  addObservers: function() {
    var controls = this.wrapper.getElementsBySelector('div.controls a');
    controls.invoke('observe', 'click', this.events.click);
  },	

  click: function(event) {
		this.stop();
    var element = Event.findElement(event, 'a');
    if (this.scrolling) this.scrolling.cancel();
    
    this.moveTo(element.href.split("#")[1], this.scroller, { duration:this.options.duration });     
    Event.stop(event);
  },

	moveTo: function(element, container, options){
			this.current = $(element);

			Position.prepare();
	    var containerOffset = Position.cumulativeOffset(container),
	     elementOffset = Position.cumulativeOffset($(element));

		  this.scrolling 	= new Effect.SmoothScroll(container, 
				{duration:options.duration, x:(elementOffset[0]-containerOffset[0]), y:(elementOffset[1]-containerOffset[1])});
		  return false;
		},
		
  next: function(){
    if (this.current) {
      var currentIndex = this.current._index;
      var nextIndex = (this.sections.length - 1 == currentIndex) ? 0 : currentIndex + 1;      
    } else var nextIndex = 1;

    this.moveTo(this.sections[nextIndex], this.scroller, { 
      duration: this.options.duration
    });
  },
	
  previous: function(){
    if (this.current) {
      var currentIndex = this.current._index;
      var prevIndex = (currentIndex == 0) ? this.sections.length - 1 : 
       currentIndex - 1;
    } else var prevIndex = this.sections.length - 1;
    
    this.moveTo(this.sections[prevIndex], this.scroller, { 
      duration: this.options.duration
    });
  },

	stop: function()
	{
		clearTimeout(this.timer);
	},
	
	start: function()
	{
		this.periodicallyUpdate();
	},
		
	periodicallyUpdate: function()
	{ 
		if (this.timer != null) {
			clearTimeout(this.timer);
			this.next();
		}
		this.timer = setTimeout(this.periodicallyUpdate.bind(this), this.options.frequency*1000);
	}

});






Effect.SmoothScroll = Class.create();
Object.extend(Object.extend(Effect.SmoothScroll.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'absolute'
    } , arguments[1] || {}  );
    this.start(options);
  },
  setup: function() {
    if (this.options.continuous && !this.element._ext ) {
      this.element.cleanWhitespace();
      this.element._ext=true;
      this.element.appendChild(this.element.firstChild);
    }
   
    this.originalLeft=this.element.scrollLeft;
    this.originalTop=this.element.scrollTop;
   
    if(this.options.mode == 'absolute') {
      this.options.x -= this.originalLeft;
      this.options.y -= this.originalTop;
    } 
  },
  update: function(position) {   
    this.element.scrollLeft = this.options.x * position + this.originalLeft;
    this.element.scrollTop  = this.options.y * position + this.originalTop;
  }
});


/////////////////////////

function getXY_gix(e,id){
                    var element = document.getElementById(id);
             element.style.display = 'block';
             element.style.left = e.clientX+document.body.scrollLeft+'px';
             element.style.top = e.clientY+document.body.scrollTop+10+'px';
                          }
    function hidde_gix(id){
         document.getElementById(id).style.display = 'none';
      }
/* <b style="font-size:13px;color:blue; text-decoration:blink;")">[ S ]</b> Menu kategorii 3.5 UNIW A [poprawiony] 4 poziomy (kopia) (layout_left - menu_categories) [56823]*/

function menu_categories_toggle(id) {

     if (document.getElementById(id).style.display == 'block') {
           document.getElementById(id).style.display='none';
     } else {
           document.getElementById(id).style.display='block';
     }

}
/* <span style="color:blue;font-weight:bold;">ZALECANY</span> Wybór płatność  - Formularz (order-newpayment - newpayment_form) [53474]*/

function orderpayment(id) {

document.getElementById('idle_payment').style.display = 'none';
    allDivs = document.getElementsByTagName("div");

    for (i = 0; i < allDivs.length; i++) {
        if ((/^newpayment_form_/).test(allDivs[i].id) == true) {
            allDivs[i].style.display = 'none';
        }
    }

    if (document.getElementById('newpayment_form_'+id) ) {
        document.getElementById('newpayment_form_'+id).style.display = 'block';
    }
}
/* <b style="font-size:12px;color:red; text-decoration:blink">&gt;</b>  Order 1 NEW z wyborem płatności ver 5.1 - radiobutton!!! (ukrywanie pustych form) + inputy dla kalendarza dostaw (order1 - order1) [54726]*/

function order1_shop_payformdiv(show)
{
    if (show) {
        document.getElementById('payform_div').style.display = 'block';
    } else {
        document.getElementById('payform_div').style.display = 'none';
        document.getElementById('payform_id').selectedIndex = 0;

        allDivs = document.getElementsByTagName("div");
        for (i = 0; i < allDivs.length; i++) {
            if ((/^newpayment_form_/).test(allDivs[i].id) == true) {
                allDivs[i].style.display = 'none';
            }
        }
    }
}

function order1_changepayform()
{
    selVal = document.getElementById('payform_id').value;
    allDivs = document.getElementsByTagName("div");

    for (i = 0; i < allDivs.length; i++) {
        if ((/^newpayment_form_/).test(allDivs[i].id) == true) {
            allDivs[i].style.display = 'none';
        }
    }

    if (document.getElementById('newpayment_form_'+selVal) ) {
        document.getElementById('newpayment_form_'+selVal).style.display = 'block';
    }
}
var Prepaid = {
    changeDelivery: function(time) {
        // zmiana czasu w kalendarzu
        if (window['orderCalendarActive'] == true) {
            OrderCalendar.changeDeliveryTime(time);
        }
    }
};
/* <span style="color:blue;font-weight:bold;">ZALECANY</span> Rejestracja klienta - Formularz (client-new - client_new_form) [56203]*/
var client_new_txt1 = 'Wysyłka na adres zamawiającego';
var client_new_txt1b = 'Wysyłka na adres z faktury';

var client_new_txt2 = 'Adres zamawiającego';
var client_new_txt2b = 'Dane do faktury';

var client_new_txt3 = 'Dane kontaktowe';
var client_new_txt3b = 'Dane kontaktowe';
var client_new_texts;


var ClientNew_status = true;
var ClientNew_firma = false;
var ClientNew_adres = true;
var ClientNewMandatoryMail = false; 
var ClientNewMandatoryPhone = false;

var ClientSender = new Array();

var RemoveAddresLink;

var ClientNew = {
    switchDiVDeliveryAddres: function()
    {
        document.getElementById("selectDeliveryAddress").style.display = "none";
        document.getElementById("selectDeliveryAddress2").style.display = "block";
    },

    switchDeliveryAddres: function(id, obj)
    {
        var IdAddress = id;
        if (IdAddress) {
           document.getElementById('delivery_id').value = IdAddress;
            document.getElementById("selectDeliveryAddress").innerHTML = obj.firstChild.innerHTML;

           document.getElementById("selectDeliveryAddress2").style.display = "none";
           document.getElementById("selectDeliveryAddress").style.display = "block";

            document.getElementById('additional_firstname').value = document.getElementById('cda_'+IdAddress+'_firstname').innerHTML;
            document.getElementById('additional_lastname').value = document.getElementById('cda_'+IdAddress+'_lastname').innerHTML; 
            document.getElementById('additional_city').value = document.getElementById('cda_'+IdAddress+'_city').innerHTML;
            document.getElementById('additional_additional').value = document.getElementById('cda_'+IdAddress+'_additional').innerHTML; 
            document.getElementById('additional_street').value = document.getElementById('cda_'+IdAddress+'_street').innerHTML;
            document.getElementById('additional_zipcode').value = document.getElementById('cda_'+IdAddress+'_zipcode').innerHTML;
            document.getElementById('additional_phone').value = document.getElementById('cda_'+IdAddress+'_phone').innerHTML; 

            if (document.getElementById('additional_region') && document.getElementById('additional_region').options) {
                for (i=0; i < document.getElementById('additional_region').options.length; i++) {
                    if (document.getElementById('additional_region').options[i].value == document.getElementById('cda_'+IdAddress+'_region_id').innerHTML) {      
                        document.getElementById('additional_region').selectedIndex  = i;
                        break;
                    }
                }
            }
  
            if (document.getElementById('cda_'+IdAddress+'_removable').innerHTML == 'yes') {
                document.getElementById('delete_delivery_address').style.display = '';
                RemoveAddresLink = document.getElementById('cda_'+IdAddress+'_removelink').innerHTML;
            } else {
                document.getElementById('delete_delivery_address').style.display = 'none';
                RemoveAddresLink = '';
            }
        } else {
            document.getElementById('delete_delivery_address').style.display = 'none';
            RemoveAddresLink = '';
            document.getElementById('additional_firstname').value = '';
            document.getElementById('additional_lastname').value = '';
            document.getElementById('additional_city').value = '';
            document.getElementById('additional_additional').value = '';
            document.getElementById('additional_street').value = '';
            document.getElementById('additional_zipcode').value = '';
            document.getElementById('additional_phone').value = '';
        }

        if (document.getElementById('cda_'+IdAddress+'_editable').innerHTML  == 'no') {
            document.getElementById('additional_firstname').disabled = 'disabled';
            document.getElementById('additional_lastname').disabled = 'disabled';
            document.getElementById('additional_city').disabled = 'disabled';
            document.getElementById('additional_additional').disabled = 'disabled';
            document.getElementById('additional_street').disabled = 'disabled';
            document.getElementById('additional_zipcode').disabled = 'disabled';
            document.getElementById('additional_phone').disabled = 'disabled';
            document.getElementById('additional_region').disabled = 'disabled';
        } else {
            document.getElementById('additional_firstname').disabled = '';
            document.getElementById('additional_lastname').disabled = '';
            document.getElementById('additional_city').disabled = '';
            document.getElementById('additional_additional').disabled = '';
            document.getElementById('additional_street').disabled = '';
            document.getElementById('additional_zipcode').disabled = '';
            document.getElementById('additional_phone').disabled = '';
            document.getElementById('additional_region').disabled = '';
        }
    },

    removeDeliveryAddress: function() 
    {
        if (RemoveAddresLink) {
            if (confirm("Czy na pewno chcesz usunąć ten adres dostawy?")) {
                IAI_Ajax.Request('ajax/client-new.php?removeAddres=true', 'address='+document.getElementById('delivery_id').value, {onSuccess: 'ClientNew.deleteAddress'});
            }
        }
    },

    newDeliveryAddress: function() 
    {
        document.getElementById('delivery_id').value = '';
        document.getElementById('selectDeliveryAddress').style.display = 'none';
        document.getElementById('selectDeliveryAddress2').style.display = 'none';
        document.getElementById('additional_address_list_txt').style.display = 'none';
        document.getElementById('delete_delivery_address').style.display = 'none';
        document.getElementById('newDeliveryAddress').style.display = 'none';
        document.getElementById('saveDeliveryAddress').style.display = 'block';
        RemoveAddresLink = '';
        document.getElementById('additional_firstname').value = '';
        document.getElementById('additional_lastname').value = '';
        document.getElementById('additional_city').value = '';
        document.getElementById('additional_additional').value = '';
        document.getElementById('additional_street').value = '';
        document.getElementById('additional_zipcode').value = '';
        document.getElementById('additional_phone').value = '';

        document.getElementById('additional_firstname').disabled = '';
        document.getElementById('additional_lastname').disabled = '';
        document.getElementById('additional_city').disabled = '';
        document.getElementById('additional_additional').disabled = '';
        document.getElementById('additional_street').disabled = '';
        document.getElementById('additional_zipcode').disabled = '';
        document.getElementById('additional_phone').disabled = '';
        document.getElementById('additional_region').disabled = '';
    },

    deleteAddress: function(x)
    {
        try {
            var response = eval('(' + x + ')');
        } catch (e) {
            return false;
        }
        xr = response;
        
       document.getElementById('delivery_list_id_'+response.remove).style.display = "none";

        ClientNew.switchDeliveryAddres(response.selected, document.getElementById('delivery_list_id_'+response.selected));
    },

    copyDeliveryAddres: function() 
    {
        if (document.getElementById('deliver_to_billingaddr').checked) {
            document.getElementById('delivery_additional').value = ClientNew_firma  ? document.getElementById('client_firm').value : '';
            document.getElementById('delivery_firstname').value  = document.getElementById('client_firstname').value;
            document.getElementById('delivery_lastname').value   = document.getElementById('client_lastname').value;
            document.getElementById('delivery_zipcode').value    = document.getElementById('client_zipcode').value;
            document.getElementById('delivery_street').value     = document.getElementById('client_street').value;
            document.getElementById('delivery_city').value       = document.getElementById('client_city').value;
            document.getElementById('delivery_phone').value    = document.getElementById('client_phone').value;
                
            document.getElementById('box_4').className = 'n56203_box_idle';
            document.getElementById('delivery_additional').disabled = 'disabled';
            document.getElementById('delivery_firstname').disabled = 'disabled';
            document.getElementById('delivery_lastname').disabled = 'disabled';
            document.getElementById('delivery_zipcode').disabled = 'disabled';
            document.getElementById('delivery_street').disabled = 'disabled';
            document.getElementById('delivery_city').disabled = 'disabled';
            if (document.getElementById('delivery_region')) {
                document.getElementById('delivery_region').value     = document.getElementById('client_region').value;
                document.getElementById('delivery_region').disabled = 'disabled';
            } 
        } else {
            document.getElementById('box_4').className = 'n56203_box';
            document.getElementById('delivery_additional').disabled = '';
            document.getElementById('delivery_firstname').disabled = '';
            document.getElementById('delivery_lastname').disabled = '';
            document.getElementById('delivery_zipcode').disabled = '';
            document.getElementById('delivery_street').disabled = '';
            document.getElementById('delivery_city').disabled = '';
            document.getElementById('delivery_phone').disabled = '';

            document.getElementById('delivery_additional_img_off').style.display = document.getElementById('client_firm_img_off').style.display;
	    document.getElementById('delivery_additional_img_on').style.display = document.getElementById('client_firm_img_on').style.display;
            document.getElementById('delivery_firstname_img_off').style.display = document.getElementById('client_firstname_img_off').style.display;
	    document.getElementById('delivery_firstname_img_on').style.display = document.getElementById('client_firstname_img_on').style.display;
            document.getElementById('delivery_lastname_img_off').style.display = document.getElementById('client_lastname_img_off').style.display;
	    document.getElementById('delivery_lastname_img_on').style.display = document.getElementById('client_lastname_img_on').style.display;
            document.getElementById('delivery_zipcode_img_off').style.display = document.getElementById('client_zipcode_img_off').style.display;
	    document.getElementById('delivery_zipcode_img_on').style.display = document.getElementById('client_zipcode_img_on').style.display;
            document.getElementById('delivery_street_img_off').style.display = document.getElementById('client_street_img_off').style.display;
	    document.getElementById('delivery_street_img_on').style.display = document.getElementById('client_street_img_on').style.display;
            document.getElementById('delivery_city_img_off').style.display = document.getElementById('client_city_img_off').style.display;
	    document.getElementById('delivery_city_img_on').style.display = document.getElementById('client_city_img_on').style.display;
            document.getElementById('delivery_phone_img_off').style.display = document.getElementById('client_phone_img_off').style.display;
	    document.getElementById('delivery_phone_img_on').style.display = document.getElementById('client_phone_img_on').style.display;

            if (document.getElementById('delivery_region')) {
                document.getElementById('delivery_region').disabled = '';
            } 
        }
    },

    check_inp: function (idd, name, delay) {
        if (document.getElementById(idd)) {
            idd = document.getElementById(idd);
        }
        var value = idd.value;
        if (ClientSender[name] > 5) {
            ClientSender[name] = 1;
            if (name == 'client_zipcode') { 
                // kod pocztowy przeslany wraz z regionem
                IAI_Ajax.Request('ajax/client-new.php?validAjax=true', 'client_zipcode='+value+'&client_region='+document.getElementById('client_region').value, {onSuccess: 'ClientNew.info', arg: idd.id});
            } else if (name == 'delivery_zipcode') {
                // kod pocztowy dostawy przeslany wraz z regionem
                IAI_Ajax.Request('ajax/client-new.php?validAjax=true', 'delivery_zipcode='+value+'&delivery_region='+document.getElementById('delivery_region').value, {onSuccess: 'ClientNew.info', arg: idd.id});
            } else if (name == 'additional_zipcode') {
                // kod pocztowy dostawy przeslany wraz z regionem
                IAI_Ajax.Request('ajax/client-new.php?validAjax=true', 'additional_zipcode='+value+'&additional_region='+document.getElementById('additional_region').value, {onSuccess: 'ClientNew.info', arg: idd.id});
            } else if (name == 'client_region') { 
                // przy zmianie rogionu konieczne sprawdzenie kodu pocztowego
                ClientNew.check_inp(document.getElementById('client_zipcode'), 'client_zipcode');
             } else if (name == 'delivery_region') {
                // przy zmianie rogionu konieczne sprawdzenie kodu pocztowego dostawy
                ClientNew.check_inp(document.getElementById('delivery_zipcode'), 'delivery_zipcode');
            } else if (name == 'additional_region') {
                // przy zmianie rogionu konieczne sprawdzenie kodu pocztowego dostawy
                ClientNew.check_inp(document.getElementById('additional_zipcode'), 'additional_zipcode');
            } else if (name == 'client_password') {
                // haslo musi byc rozne od loginu
                IAI_Ajax.Request('ajax/client-new.php?validAjax=true', 'client_password='+value+'&client_login='+document.getElementById('client_login').value, {onSuccess: 'ClientNew.info', arg: idd.id});
            } else if (name == 'repeat_password') {
                // hasla musza byc identyczne
                IAI_Ajax.Request('ajax/client-new.php?validAjax=true', 'repeat_password='+value+'&client_password='+document.getElementById('client_password').value, {onSuccess: 'ClientNew.info', arg: idd.id});
            } else {
                // pozostałe wartości wysyłamy pojedynczo
                if (value) {
                    IAI_Ajax.Request('ajax/client-new.php?validAjax=true', name+'='+value, {onSuccess: 'ClientNew.info', arg: idd.id});
                } else {
                    ClientNew.error(idd.id, 0);
                    document.getElementById(idd.id + '_img_off').style.display = "none";
                    document.getElementById(idd.id + '_img_on').style.display = "none";	
                }
            }
        } else {
            if (delay) {
                if (ClientSender[name] > 1) { 
                    ClientSender[name]++;
                    delay++;
                } else {
                    return false;
                }
            } else {
                if (ClientSender[name] > 2) {
                    ClientSender[name]=2;
                    return false;
                } else {
                    ClientSender[name]=2;
                    delay = 1;
                }
                
            }
            setTimeout('ClientNew.check_inp("'+idd.id+'", "'+name+'", "'+delay+'")', 100); 
        }
        if (name == 'client_login') {
            // login
            document.getElementById('client_login').value = document.getElementById('client_login').value.toLowerCase();
        }
        if (document.getElementById('deliver_to_billingaddr')) {
            if (document.getElementById('deliver_to_billingaddr').checked) { 
                ClientNew.copyDeliveryAddres();
            }
        }
    },
    info: function (x, obj) {
        try {
            var response = eval('(' + x + ')');
        } catch (e) {
            return false;
        }
        xr = response;
        if (response.errno == 0) {
            // stawiamy poprawny znaczek
            new ClientNew.error(obj, 0);
        } else {
            // bledy
            if (response.message.val[0]) {
                document.getElementById(obj+ '_help').innerHTML = '<div>'+response.message.val[0]+'</div>';
            }
            new ClientNew.error(obj, 1);
        }
    },
    
    button: function (num) {
		if(num == 0 && document.getElementById('terms_agree').checked) {
			document.getElementById('submit_register').className = 'act';
		} else {
			document.getElementById('submit_register').className = 'idle';
		}
		
    }, 
    
    submitform: function () {
                ClientNew_status = true;
                if (!document.getElementById("client_firstname").value) {
                    ClientNew_status = false;
                }
                if (!document.getElementById("client_lastname").value) {
                    ClientNew_status = false;
                }
                if (!document.getElementById("client_city").value) {
                    ClientNew_status = false;
                }
                if (!document.getElementById("client_zipcode").value) {
                    ClientNew_status = false;
                }
                if (!document.getElementById("client_street").value) {
                    ClientNew_status = false;
                }
                if (document.getElementById("firm_data2")) {
                    if (document.getElementById("firm_data2").checked && !document.getElementById("client_firm").value && !document.getElementById("client_nip").value) {
                        ClientNew_status = false;
                    }
                }
               if (document.getElementById("client_login")) {
                   if (!document.getElementById("client_login").value) {
                       ClientNew_status = false;
                   }
               }
               if (document.getElementById("client_password")) {
                   if (!document.getElementById("client_password").value || !document.getElementById("repeat_password").value) {
                       ClientNew_status = false;
                   }
               }
               if (document.getElementById("deliver_to_billingaddr")) {
                   if (!document.getElementById("deliver_to_billingaddr").checked) {
                       if ((!document.getElementById("delivery_firstname").value || !document.getElementById("delivery_lastname").value) && !document.getElementById("delivery_additional").value) {
                           ClientNew_status = false;
                       }
                       if (!document.getElementById("delivery_zipcode").value) {
                           ClientNew_status = false;
                       }
                       if (!document.getElementById("delivery_street").value) {
                           ClientNew_status = false;
                       }
                       if (!document.getElementById("delivery_city").value) {
                           ClientNew_status = false;
                       }
                   }
               }
               if (ClientNewMandatoryPhone) {
                   if (! document.getElementById('client_phone').value) {
                       ClientNew_status = false;
                   }
                   if (document.getElementById('additional_phone')) {
                       if ((! document.getElementById('additional_phone').value) && !document.getElementById('additional_phone').disabled ) {
                           ClientNew_status = false;
                        }
                   } else if (document.getElementById('delivery_phone')) {
                       if ((! document.getElementById('delivery_phone').value) && !document.getElementById('delivery_phone').disabled) {
                           ClientNew_status = false;
                        }
                   }
               }
               if (ClientNewMandatoryMail) {
                   if (! document.getElementById('client_email').value) {
                       ClientNew_status = false;
                   }
               }
               if (document.getElementById('terms_agree') ) {
                   if ((!document.getElementById('terms_agree').checked) && document.getElementById('terms_agree').type != 'hidden') {
                       ClientNew_status = false;
                   }
               }
		if(ClientNew_status == true ) {
if (document.getElementById("button_alert")) {
                        document.getElementById("button_alert").style.display = "none";
}
			return true;
		} else {
if (document.getElementById("button_alert")) {
                       document.getElementById("button_alert").style.display = "block";
                        setTimeout('ClientNew.AlertOff()', 5000);
}
			return false;		
		}
    }, 
    
    ramka: function () {
        if (!document.getElementById('terms_agree').checked) {
            document.getElementById('terms_agree_box').className = 'ramka_ON';
        } else {
            document.getElementById('terms_agree_box').className = 'ramka_OFF';	
        }
    },

    AlertOff: function() {
        document.getElementById("button_alert").style.display = "none";
    },
    
    copy_adres: function (type) {
        var CopyData = false;
        if (document.getElementById("firm_data")) {
            CopyData = document.getElementById("firm_data").checked;
        }
        
        if(CopyData && type == 1) {
            document.getElementById('client_firstname').value = document.getElementById('client_firstname_copy').value;
            document.getElementById('client_firstname_img_off').style.display = document.getElementById('client_firstname_copy_img_off').style.display;
	    document.getElementById('client_firstname_img_on').style.display = document.getElementById('client_firstname_copy_img_on').style.display;
            document.getElementById('client_lastname').value = document.getElementById('client_lastname_copy').value;
            document.getElementById('client_lastname_img_off').style.display = document.getElementById('client_lastname_copy_img_off').style.display;
	    document.getElementById('client_lastname_img_on').style.display = document.getElementById('client_lastname_copy_img_on').style.display;
         } else if (type ==2) {
            document.getElementById('client_firstname_copy').value = document.getElementById('client_firstname').value;
            document.getElementById('client_firstname_copy_img_off').style.display = document.getElementById('client_firstname_img_off').style.display;
	    document.getElementById('client_firstname_copy_img_on').style.display = document.getElementById('client_firstname_img_on').style.display;
            document.getElementById('client_lastname_copy').value = document.getElementById('client_lastname').value;
            document.getElementById('client_lastname_copy_img_off').style.display = document.getElementById('client_lastname_img_off').style.display;
	    document.getElementById('client_lastname_copy_img_on').style.display = document.getElementById('client_lastname_img_on').style.display;
         }
    },
    
    error: function (idd, err) {
            if(err == 1) {
			document.getElementById(idd + '_img_off').style.display = "block";
			document.getElementById(idd + '_img_on').style.display = "none";
            if (document.getElementById(idd + '_help')) {
			    document.getElementById(idd + '_help').style.display = "block";
                ClientNew.hide_info_help(idd, 10);
            }
			return false;
		} else {
			document.getElementById(idd + '_img_off').style.display = "none";
			document.getElementById(idd + '_img_on').style.display = "block";
            if (document.getElementById(idd + '_help')) {
                document.getElementById(idd + '_help').style.display = "none";
                ClientNew.hide_info_help(idd, 10);
            }
			return false;		
            }
    }, 

    hide_info_help: function(idd, licznik) {
        if (licznik > 1) {
            setTimeout("ClientNew.hide_info_help('"+idd+"', '"+(licznik-1)+"');", 1000);
        } else if (document.getElementById(idd + '_help')) {
			    document.getElementById(idd + '_help').style.display = "none";
        }
    }
}
var xr;

function agree() {
    if (document.getElementById('terms_agree').checked && ClientNew_status == true) {
        document.getElementById('submit_register').className = 'act';
    } else {
        document.getElementById('submit_register').className = 'idle';

    }
}

function clientnew_firm() {
    if (document.getElementById('firm_data').checked) {
	    ClientNew_firma = false;
        document.getElementById('client_firm_div').style.display = 'none';
        document.getElementById('box_3_header').innerHTML = client_new_txt2;
        document.getElementById('box_1_header').innerHTML = client_new_txt3;
        if (document.getElementById('send_to')) {
             document.getElementById('send_to').innerHTML = client_new_txt1;
        }
        document.getElementById('client_firstname_copy_txt').className = '';
        document.getElementById('client_firstname_copy').className = '';
        document.getElementById('client_lastname_copy_txt').className = '';
        document.getElementById('client_lastname_copy').className = '';
    } else {
	    ClientNew_firma = true;	
        document.getElementById('client_firm_div').style.display = 'block';
        document.getElementById('box_3_header').innerHTML = client_new_txt2b;
        document.getElementById('box_1_header').innerHTML = client_new_txt3b;
        if (document.getElementById('send_to')) {


            document.getElementById('send_to').innerHTML = client_new_txt1b;
        }
        document.getElementById('client_firstname_copy_txt').className = 'hidden';
        document.getElementById('client_firstname_copy').className = 'hidden';
        document.getElementById('client_lastname_copy_txt').className = 'hidden';
        document.getElementById('client_lastname_copy').className = 'hidden';
    }
}
/* <span style="color:blue;font-weight:bold;">ZALECANY</span> Wyszukiwarka zaawansowana (searching - searching) [56189]*/
// ID div'ow od SELECTA (po przecinku) do ukrycia np('cont_series','cont_sizes','cont_1213701896'):

var Searching_hideselectsArray = new Array();
var ChangeDivPosition = {};
var ns = document.getElementById && !document.all;

function positiontip(e) {
   
    ChangeDivPosition.pageX =(ns)?e.pageX : event.clientX+document.documentElement.scrollLeft;
    ChangeDivPosition.pageY  =(ns)?e.pageY : event.clientY+document.documentElement.scrollTop;

    var obj = document.getElementById(ChangeDivPosition.id);
    if (obj) {
         var x = ChangeDivPosition.marginLeft + (ChangeDivPosition.pageX - parseInt(ChangeDivPosition.startX));
         var y = ChangeDivPosition.marginTop + (ChangeDivPosition.pageY - parseInt(ChangeDivPosition.startY));
         if (x > ChangeDivPosition.maxX) {
             x = ChangeDivPosition.maxX;
         } else if (x < 0) {
            x = 0;
         }
 
        if (y > ChangeDivPosition.maxY) {
             y = ChangeDivPosition.maxY;
         } else if (y < 0) {
              y = 0;
         }

         var r = ChangeDivPosition.maxX; // przedział
         var PriceMax = document.getElementById('max_price_start').value;
         var PriceMin = document.getElementById('min_price_start').value;

         var price = parseInt(PriceMin) + parseInt((PriceMax - PriceMin)*x/r);

         if  (obj.id == 's1') {
             var obj2 = document.getElementById('s2');
         } else {
             var obj2 = document.getElementById('s1');
         }
         if (parseInt(obj2.style.marginLeft.replace('px', '')) > x) {
             // cena minimalna
             if (PriceMin >= price) {
                 document.getElementById('pricelimitmin').value = '';
             } else {
                 document.getElementById('pricelimitmin').value = price;
             }
             document.getElementById('min_price_text').innerHTML = price + '.00';
         } else { 
             // cena maksymalna
             if (PriceMax <= price) {
                 document.getElementById('pricelimitmax').value = '';
             } else {
                 document.getElementById('pricelimitmax').value = price;
             }
             document.getElementById('max_price_text').innerHTML = price + '.00';
         }
 

         obj.style.marginLeft = x + 'px';
  
         var left1 = parseInt(obj2.style.marginLeft.replace('px', ''));
         var left2 = x;
         
        if (left2 > left1) {
             document.getElementById('s3').style.marginLeft = (left1+10) + 'px';
             if ((left2 - left1-10) > 0) {
                 document.getElementById('s3').style.width = (left2 - left1-10) + 'px';
             } else {
                 document.getElementById('s3').style.width = '0px';
             }
         } else {
             document.getElementById('s3').style.marginLeft = (left2+10) + 'px';
             if ((left1 - left2-10) > 0) {
                 document.getElementById('s3').style.width = (left1 - left2-10) + 'px'; 
             } else {
                 document.getElementById('s3').style.width = '0px';
             }
         }
    }
}

function StartDrag(obj, contenerId)  {
    ChangeDivPosition.id = obj.id
    ChangeDivPosition.startX = ChangeDivPosition.pageX;
    ChangeDivPosition.startY = ChangeDivPosition.pageY;
    ChangeDivPosition.wait = 3;

    if (! obj.style.marginLeft) {
        if (obj.offsetLeft) {
            obj.style.marginLeft= obj.offsetLeft + 'px';
        } else {
            obj.style.marginLeft= '0px';
        }
    }
    if (! obj.style.marginTop) {
        if (obj.offsetTop) {
            obj.style.marginTop= obj.offsetTop+ 'px';
        } else {
            obj.style.marginTop= '0px';
        }
    }
    if (! obj.style.width) {
        if (obj.offsetWidth) {
            obj.style.width = obj.offsetWidth + 'px';
        } else {
            obj.style.width= '0px';
        }
    }
    ChangeDivPosition.marginLeft  = parseInt(obj.style.marginLeft.replace('px', ''));
    ChangeDivPosition.marginTop =  parseInt(obj.style.marginTop.replace('px', ''));

    var contener = document.getElementById(contenerId);

    if (! contener.style.width) {
        if (contener.offsetWidth) {
            contener.style.width= contener.offsetWidth + 'px';
        } else {
            contener.style.width= '0px';
        }
    }
    if (! contener.style.height) {
        if (contener.offsetHeight) {
            contener.style.height= contener.offsetHeight + 'px';
        } else {
            contener.style.height = '0px';
        }
    }

    ChangeDivPosition.maxX = parseInt(contener.style.width.replace('px', '')) - parseInt(obj.style.width.replace('px', ''));;
    ChangeDivPosition.maxY = parseInt(contener.style.height.replace('px', '')) - parseInt(obj.style.height.replace('px', ''));

}

function StartDrag2(obj) {
    if (ChangeDivPosition.id) {
        ChangeDivPosition.wait = 3;
    }
}

function StopDrag(obj, wait) {
     if (ChangeDivPosition.wait == 3 && wait ==2) {
         ChangeDivPosition.wait =2;
     }
     if (wait < 1) {
         ChangeDivPosition.id = '';
         Searching.send('price');
     } else if (ChangeDivPosition.id && ChangeDivPosition.wait != 3) {
         setTimeout("StopDrag ('', '"+(wait-1)+"')", 200);
     }
}

var Searching = {
    selectFields: {},
    highlightTextSelect: '',
    
    startPricePosition: function(contenerId)
    {
        var contener = document.getElementById(contenerId);
        if (! contener.style.width) {
            if (contener.offsetWidth) {
                contener.style.width= contener.offsetWidth + 'px';
            } else {
                contener.style.width= contener.currentStyle['width'];
            }
        }
        if (! contener.style.height) {
            if (contener.offsetHeight) {
                contener.style.height= contener.offsetHeight + 'px';
            } else {
                contener.style.height = contener.currentStyle['height'];
            }
        }
        if (! document.getElementById('s2').style.width) {
            if (document.getElementById('s2').offsetWidth) {
                document.getElementById('s2').style.width= document.getElementById('s2').offsetWidth + 'px';
            } else {
                document.getElementById('s2').style.width= document.getElementById('s2').currentStyle['width'];
            }
        }
        var r = parseInt(contener.style.width.replace('px', '')) - parseInt(document.getElementById('s2').style.width.replace('px', ''));;

        var PriceMax = document.getElementById('max_price_start').value;
        var PriceMin = document.getElementById('min_price_start').value;

        var price = document.getElementById('pricelimitmin').value;
        document.getElementById('s1').style.marginLeft = '0px';
        document.getElementById('s2').style.marginLeft = r + 'px';

        document.getElementById('s3').style.marginLeft = 10 + 'px';
        document.getElementById('s3').style.width = r + 'px'; 
    },

    send: function()
    {
        var name = arguments[0];
        if (name == 'traits' && arguments[1]) {
            name = name +'[' + arguments[1] + ']';
        }
        if (name == 'text') {
            setTimeout("document.getElementById('find-text').style.display = 'none';", 500) ;
        }

        Searching.selectFields[name] = 1;
        
        document.getElementById('searchingPreloader2').style.display = '';
        var txt = '';
        
        var active = true;
        for(nameTmp in Searching.selectFields) {
            var form = document.getElementsByName(nameTmp);
            if (nameTmp == 'price') {
                if (active) {
                    txt = txt + '&pricelimitmin=' + document.getElementById('pricelimitmin').value;
                    txt = txt + '&pricelimitmax=' + document.getElementById('pricelimitmax').value;
                } 
            } else if (nameTmp == 'date') {
                if (active) {
                    txt = txt + '&day=' + document.getElementById('date_d').value;
                    txt = txt + '&month=' + document.getElementById('date_m').value;
                    txt = txt + '&year=' + document.getElementById('date_y').value;
                }
            } else if (form[0].type == 'select-one' && form[0].name) {
                if (active) {
                    if (form[0].value) {
                        txt = txt + '&' + form[0].name + '=' + form[0].value;
                    }
                } else {
                    form[0].selectedIndex = 0;
                }
            } else if (form[0].type == 'checkbox') {
                if (active) {
                    if (form[0].checked) {
                        txt = txt + '&' + form[0].name + '=' + form[0].value;
                    }
                } else {
                    form[0].checked = false;
                }
            } else if (nameTmp == 'text') {
                if (active) {
                    txt = txt + '&text=' + document.getElementById('searching_text').value;
                } else {
                    form[0].value = '';
                }
            } else if (form[0].name && form[0].value) {
                if (active) {
                    txt = txt + '&' + form[0].name + '=' + form[0].value;
                } else {
                    form[0].value = '';
                }
            }
            
            if (name == nameTmp) {
               active = false;
            }
        }
        IAI_Ajax.Request('ajax/search.php?ajax=true&selectAll=t&change_name='+ name + txt , '', {onSuccess:'Searching.prepareForms'});
    },
    
    prepareForms: function(x)
    {
        document.getElementById('searchingPreloader2').style.display = 'none';
        try {
            var response = eval('(' + x + ')');
        } catch (e) {
            return false;
        }
        Searching.highlightTextSelect = 0;
        var form = document.getElementById('searching_form').elements;
        if (response['countProducts'] >0) {
            document.getElementById('select_products_info').style.display = 'none';
        } else {
            document.getElementById('select_products_info').style.display = 'block';
        }
        for (i=0; i<form.length; i++) {
           var display = false; 
           if (! form[i].name) {
                display = 'hidden';
                if (form[i].id == 'searching_category_1' && !form[i].value) {
                   display = false;
                    // kategorie traktujemy inaczej 
                    SearchingCategory2 = {};
                    if (response['category']) {
                            display = true;
                            for (j in response['category']) { 
                                 SearchingCategory2[j] = SearchingCategory[j];
                                 for (k in SearchingCategoryParents[j]) {
                                     if (SearchingCategoryParents[j][k]) {
                                         SearchingCategory2[SearchingCategoryParents[j][k]] = SearchingCategory[SearchingCategoryParents[j][k]];
                                    }
                                }
                            }

                            
                            for(j=1; j<form[i].options.length; j++) {
                                // zaczynamy od 1 gdyz "wszystkie" zawsze ma pozostac
                                if (form[i].options[j].value && !SearchingCategory2[form[i].options[j].value]) {
                                    form[i].options[j].style.display = 'none';
                                } else if (form[i].options[j].value) {
                                    form[i].options[j].style.display = '';
                                }
                            }
 
                    }
                }
                
            } else if (form[i].type == 'select-one') {
                if (form[i].value) {
                    display = true;
                } else if (!response[form[i].name] || response[form[i].name].length <= 2) {
                    display = false;
                } else if (response[form[i].name]) {
                    var tmpI = 1;
                    var copySelectId = 'copy_'+form[i].name;
                    if (document.getElementById(copySelectId)) {
                        // kopia selecta
                        var countTmpOptions = form[i].options.length;
                        for(j=1; j<countTmpOptions; j++) {
                            // usuwanie wszystkiego
                            form[i].removeChild(form[i].options[1]);
                        }
                       
                        for(j=1; j<document.getElementById(copySelectId).options.length; j++) {
                            var optionTmp = document.getElementById(copySelectId).options[j];
                            if (response[form[i].name][optionTmp.value]) {
                                // wstawiamy opcje 
                                display = true;
                                var t = Searching.addOption(form[i]);
                                t.id = optionTmp.id;
                                t.value = optionTmp.value;
                                t.textContent = optionTmp.textContent;
                                t.text = optionTmp.text;
                                tmpI++
                            }
                        }
                    }
                    if (tmpI <= 2)  {
                         display = false;
                    }
                }
            } else if (form[i].type == 'checkbox') {
                display = true;
                if (!form[i].checked) {
                    if (!response[form[i].name]) {
                        display = false;
                    } else if(response[form[i].name].length < 2) {
                        display = false;
                    }
                }
            } else {
                display = true;
            }
            if (display == 'hidden') {
                //
            } else if (display == true) {
                form[i].disabled = '';
            } else {
                form[i].disabled = 'disabled';
            }
        }
        if (response['day'] && response['month'] && response['year'] && response['change_name'] != 'date' ) {
            document.getElementById('date_d').value = response['day'];
            document.getElementById('date_m').value = response['month'];
            document.getElementById('date_y').value = response['year'];
            
            //Calendar('DatePicker_begin', document.getElementById('date'));
            document.getElementById('date').value = response['year'] +  '-' + response['month'] + '-' +response['day'];
        }
        if (response['pricemin'] && response['pricemax']  && response['change_name'] != 'price' ) {
            var errorprice = 0;
            for(nameTmp in Searching.selectFields) {
                if (nameTmp ==  'price' ) {
                    // cena byla juz zawezona wczesniej
                    errorprice = 1;
                } else if (response['change_name'] == nameTmp && errorprice == 1) {
                     // zawezanie elementu bylo po zawezeniu ceny
                     errorprice = 2;
                }
            }
            if (response['pricemin'] == response['pricemax']) {
                errorprice = 2;
            }
            if (errorprice != 2 || (document.getElementById('pricelimitmax').value ==document.getElementById('max_price_start').value && document.getElementById('pricelimitmin').value == document.getElementById('min_price_start').value)) {
             if (response['pricemin'] != response['pricemax'] ) {
                 document.getElementById('contener3').style.display = 'block';
                 document.getElementById('contener4').style.display = 'none';
                 document.getElementById('pricelimitmin').value = response['pricemin'];
                 document.getElementById('pricelimitmax').value = response['pricemax'];
                 document.getElementById('min_price_text').innerHTML = response['pricemin'];
                 document.getElementById('max_price_text').innerHTML = response['pricemax'];
                 document.getElementById('min_price_start').value = response['pricemin'];
                 document.getElementById('max_price_start').value = response['pricemax'];
                 Searching.startPricePosition('contener');
            } else {
                 document.getElementById('contener3').style.display = 'none';
                 document.getElementById('min_price_text_2').innerHTML = response['pricemax'];
                 document.getElementById('contener4').style.display = 'block';
            }
          }
        }
    },

    findText: function(e) 
    {
        var txt = document.getElementById('searching_text').value;
        if (!e) e = window.event;
        var key = e.keyCode || e.which; 
        if (key == 38 || key == 40) {
            // wcisnieto klawisz
            if (document.getElementById('find-text-1-div')) {
                if (! Searching.highlightTextSelect) {
                    Searching.highlightText(1);
                } else if (key == 38 && document.getElementById('find-text-'+(Searching.highlightTextSelect-1)+'-div')) {
                    Searching.highlightText(Searching.highlightTextSelect-1);
                } else if (key == 40 && document.getElementById('find-text-'+parseInt(Searching.highlightTextSelect+1)+'-div')) {
                    Searching.highlightText(Searching.highlightTextSelect+1);
                }
            }
        } else if (key == 13 && Searching.highlightTextSelect) {
            Searching.selectText(Searching.highlightTextSelect);
        } else {
            if (txt.length > 1) {
                IAI_Ajax.Request('ajax/search-name.php?ajax=true&text=' + txt , '', {onSuccess:'Searching.prepareFindText'});
            }
        }
    },
    
    checkEnter: function()
    {
        if (Searching.highlightTextSelect) {
            Searching.selectText(Searching.highlightTextSelect);
            return false;
        } else {
            return true;
        }
    },
    
    highlightText: function(i) 
    {
        if (Searching.highlightTextSelect) {
            document.getElementById('find-text-'+Searching.highlightTextSelect+'-div').style.backgroundColor = '';
        }
        Searching.highlightTextSelect = i;
        document.getElementById('find-text-'+i+'-div').style.backgroundColor = '#FFEEAA';
    },
    
    sendSubmit: function()
    {
        Searching.highlightTextSelect = '';
        document.getElementById('searching_form').submit();
    },
    
    prepareFindText: function(x) 
    {
        try {
            var response = eval('(' + x + ')');
        } catch (e) {
            return false;
        }
        Searching.highlightTextSelect = 0;
        var text = '';
        var re = new RegExp(response.text.toLowerCase(), "gi");
        if (response.products_name.length > 0) {
            document.getElementById('select_products_info').style.display = 'none';
            document.getElementById('find-text').style.display = 'block';
            var j = response.products_name.length;
            for(var i=1; i<=j; i++) {
                var tmpTxt = response.products_name[i-1];   
                if (! response.products_name[i-1]) {
                    i--; j--;
                    continue;
                }
                text = text + '<div id="find-text-'+i+'-div" style="cursor: pointer;" onmouseover="Searching.highlightText(\''+i+'\');" onclick="Searching.selectText(\''+i+'\');"><input type="hidden" value="'+tmpTxt+'" id="find-text-'+i+'">'+tmpTxt.replace(re, '<b>$&</b>')+'</div>';
            }
        } else {
            document.getElementById('find-text').style.display = 'none';
            document.getElementById('select_products_info').style.display = 'block';
        }
        document.getElementById("find-text").innerHTML = text;
    },
    
    selectText: function (id)
    {
        document.getElementById('searching_text').value = document.getElementById('find-text-'+id).value;
        document.getElementById('find-text').style.display = 'none';
        Searching.highlightTextSelect = '';
        document.getElementById('searching_form').submit();
    },

    changeSelectCategory: function(obj, number) 
    {
        var selectId = obj.value;
        if (selectId) {
            document.getElementById('category').value = selectId;
        } else {
            if (number == 1) {
                document.getElementById('category').value = '';
            } else if (number == 2) {
                document.getElementById('category').value = document.getElementById("searching_category_1").value;
            } else if (number == 3) {
                document.getElementById('category').value = document.getElementById("searching_category_2").value;
            } else {
                document.getElementById('category').value = document.getElementById("searching_category_3").value;
            }
        } 
        if (number < 4) {
            document.getElementById("searching_category_4").style.display = "none";
             if (number < 3) {
                  document.getElementById("searching_category_3").style.display = "none";
                  if (number < 2) {
                      document.getElementById("searching_category_2").style.display = "none";
                  }
            }
        }
        var idtmp = "searching_category_"+(1+number);
        if (selectId) {
             document.getElementById(idtmp).selectedIndex = 0;
             var j = document.getElementById(idtmp).options.length;
             while (j>1) {
                  j--;
                  document.getElementById(idtmp).removeChild(document.getElementById(idtmp).options[j]);
             }

            var ile = 0;

            for (k in SearchingCategory2[selectId]) {
                   k = parseInt(k);
                   if (k > 0) {
                       var t = Searching.addOption(document.getElementById(idtmp));
                       t.id = SearchingCategory2[selectId][k]["id"];
                       t.value = SearchingCategory2[selectId][k]["id"];
                       t.textContent = SearchingCategory2[selectId][k]["name"];
                       t.text = SearchingCategory2[selectId][k]["name"];
                       ile++;
                   }
            }
            if (ile) {
                document.getElementById("searching_category_2").style.display = "";
                if (number < 2) {
                     document.getElementById("searching_category_3").style.display = "none";
                 } else {
                     document.getElementById("searching_category_3").style.display = "";
                }
                if (number < 3) {
                     document.getElementById("searching_category_4").style.display = "none";
                } else {
                    document.getElementById("searching_category_4").style.display = "";
                }   
            } else {
                 document.getElementById(idtmp).style.display = "none";
             }
        }
        Searching.send('category');
    }, 

    addOption: function (p) 
    { 
        var t;
        p.appendChild(t = document.createElement('option'));
        return t;
    },
    
    hideCalendar: function()
    {
        document.getElementById('calendar').innerHTML = '';
        if (document.getElementById('calendar_frame')) {
            document.getElementById('calendar_frame').parentNode.removeChild(document.getElementById('calendar_frame')); 
        }
        document.getElementById('calendar').style.display='none';
    },

	hideselects: function ()
	{
		for (i = 0; i<Searching_hideselectsArray.length; i++) 
		{
			document.getElementById(Searching_hideselectsArray[i]).style.display = 'none';
		}
	
	}
};


function validateDate(obj)
{
}


function Calendar(E, T) {
	var i, j, tBody, Row, od, Do, d, dt, z=0, zeroAllowed=false;
    
	function cEl(t, p, h, cl) {
		p.appendChild(t = document.createElement(t));
		if (h) {
			t.innerHTML = h;
		}
                if (cl) {
                    t.className = cl;
                }
		return t;
	}

	function cB(x, E, T) {
with (IaiCld) {
            if (x == 0) {
                R--;
            } else if (x == 1) {
                R++;
            } else if (x == 2) {
                M--;
                if (M < 0) {
                    M = 11;
                    R--;
                }
            } else if (x == 3) {
                M++;
                if (M > 11) {
                    M = 0;
                    R++;
                }
            }
            od = Date.UTC(R, M, 1);
            Do = Date.UTC(R, M+1, 1);
}
           draw(E, T);
	}

    function draw(E, T)
    {
        while (E.childNodes.length) {
            E.removeChild(E.firstChild); 
        }
        table = cEl('table', E, '', 'calendar_table_header');
        table.cellSpacing = "4";
        table.cellPadding = "0";
        var tBody = cEl('tbody', table);
        tBody.onmouseup = function() {draw(E, T);}
        tBody.onmousemove = function() { 
            if (window.getSelection) {
                window.getSelection().removeAllRanges(); /* FF */
            }
            if (document.selection) {
                document.selection.empty(); /* IE */
            }
        }
                // wiersz z przwijaniem lat
                Row = cEl('tr', tBody);
                var tmp = cEl('td', Row, '', 'calendar_select_year_left').onmousedown = function () {cB(0, E, T);}
                tmp.id = 'calendar_select_year_left';
		cEl('th', Row, IaiCld.R, 'calendar_year');
		var tmp = cEl('td', Row, '', 'calendar_select_year_right').onmousedown = function () {cB(1, E, T);}  
                tmp.id = 'calendar_select_year_right';

                // wiersz z przewijaniem miesiecy
		Row = cEl('tr', tBody);
		var tmp = cEl('td', Row, '', 'calendar_select_month_left').onmousedown= function () {cB(2, E, T);} 
                tmp.id = 'calendar_select_month_left';
		cEl('th', Row, IaiCld.month[IaiCld.M], 'calendar_month');
		var tmp = cEl('td', Row, '', 'calendar_select_month_right').onmousedown = function () {cB(3, E, T);}
                tmp.id = 'calendar_select_month_right';

                var R = IaiCld.R;
                var M = IaiCld.M;
                var selectY = document.getElementById(T.id + "_y").value;
                var selectM = document.getElementById(T.id  + "_m").value-1;
                var selectD = document.getElementById(T.id  + "_d").value;			

                var table2 = cEl('table', E, '', 'calendar_table');
                table2.cellSpacing = "4";
                table2.cellPadding = "0";
		tBody = cEl('tbody', table2);
		Row = cEl('tr', tBody);
		for (i = 0 ; i < 7 ; i++) { 
                    cEl('th', Row, IaiCld.day[i], i==6 ? 'calendar_days_sunday' : 'calendar_days');
                }

		for (i = od ; i < Do ; i += 86400000) {
			with (new Date(i)) {
				d = getUTCDate();
				dt = getUTCDay();
			}
			if (dt == 1 || i == od) {
				Row = cEl('tr',tBody);
			}
			if (dt != 1 && d == 1) {
				for (j = 1 ; j < (dt ? dt : 7); j++) {
					cEl('th',Row);
				}
			}
			dt = cEl('td', Row, d);
			dt.onmousedown = function(x) {

				x=+this.innerHTML;
				with (IaiCld) {
				    a = x;
                                    document.getElementById(T.id + "_y").value = R;
                                    document.getElementById(T.id  + "_m").value =  (x = M + 1) < 10 ? '0' + x : x;
                                    document.getElementById(T.id  + "_d").value = a < 10 ? '0' + a : a;				
                                    document.getElementById(T.id).value = R +  '-' + ((x = M + 1) < 10 ? '0' + x : x) + '-' + (a < 10 ? '0' + a : a)  ;
                                    document.getElementById('calendar').innerHTML = '';
                                    if (document.getElementById('calendar_frame')) {
                                        document.getElementById('calendar_frame').parentNode.removeChild(document.getElementById('calendar_frame'));
                                    }
                                    document.getElementById('calendar').style.display = 'none';
                                    Searching.send(T.id);
			      }
			}

			if (d == selectD && M == selectM && R == selectY) {
			    dt.id="calendar_checked_day";
			} else {
                             dt.className="calendar_normal_day";
                        }
			
		}

		IaiCld.B = 1;
        var valueT = 0, valueL = 0, cont = T;
        do {
            valueT += cont.offsetTop  || 0;
            valueL += cont.offsetLeft || 0;
            cont = cont.offsetParent;
        } while (cont);
        valueL += T.offsetWidth + 2;
        var mh = !!(window.attachEvent && !window.opera) ? 172 : 151; // max height: IE / rest
        if ((valueT + mh) > document.body.offsetHeight) {
            valueT = document.body.offsetHeight - mh;
        }
        //E.style.top = valueT + 'px';
        //E.style.left = valueL + 'px';
	E.style.display = 'block';
    }

   if ((arguments.length >= 3) && arguments[2]) { 
        zeroAllowed = true;
    }
	with (IaiCld) {
    core = T.id;

    R = document.getElementById(core + "_y").value;
    M = document.getElementById(core + "_m").value - 1; 
    D.setFullYear(R, M, document.getElementById(core + "_d").value);
    if ((R <= 0) && (M <= -1)) {
      M = new Date().getMonth();
      R = new Date().getFullYear();
    }
    od = Date.UTC(R, M, 1);
		Do = Date.UTC(R, M + 1, 1);
        var frame;
        document.getElementById("calendar").parentNode.appendChild(frame = document.createElement('iframe'));
        frame.id = 'calendar_frame';
	}
    
    draw(document.getElementById("calendar"), T);
    document.getElementById('calendar').style.display = 'block';
}
IaiCld={
	day: new Array('pn', 'wt', 'śr', 'cz', 'pt', 's', 'n'),
	month: new Array('Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'),
	D:new Date(),
	M:new Date().getMonth(),
	R:new Date().getFullYear()
}
/* nowy koszyk - listopad - dodana jednostka miary i link na nazwie (poprawiony) (basketedit - basketedit_productslist) [54540]*/

function viewGroupEdit(group_id, item_id)
{
    element = document.getElementById('div_group_edit');
    element.style.display='block';
    //element.style.display='none';
    //Effect.SlideDown('div_product_edit');
   document.getElementById('group_' + group_id).style.display = 'block';
   document.getElementById('item_' + item_id).style.display = 'block';
}

var product_id    = 0;
var size_id         = 0;
var price            = 0;

function baskQuantity()
{
    sel_sz = document.getElementById('select_sizes_'+product_id);
    div_nr_n = document.getElementById('div_num_'+product_id+'_'+size_id);
    div_nr_b = document.getElementById('div_num_'+product_id+'_'+sel_sz.value);
    sel_nr_n = document.getElementById('select_num_'+product_id+'_'+size_id);
    sel_nr_b = document.getElementById('select_num_'+product_id+'_'+sel_sz.value);
    div_nr_n.style.display = 'none';
    div_nr_b.style.display = 'block';
    sel_nr_n.disabled = true;
    sel_nr_b.disabled = false;
    size_id = sel_sz.value;

    // cena
    div_pr = document.getElementById('div_price');
    inp_pr = document.getElementById('price_'+product_id+'_'+sel_sz.value);
    inp_cr = document.getElementById('cur_sign');
    if (inp_pr.value != '') {
        div_pr.innerHTML = inp_pr.value+inp_cr.value;
    } else {
        div_pr.innerHTML = inp_pr.value;
    }
}


function hideGroupEdit()
{
    element = document.getElementById('div_group_edit');
    element.style.display='none';
}

function basket_isNumeric(id, precision){
	
		var elem = document.getElementById(id);
	
		if (precision > 0){
			if(elem.value.match("^[0-9]{1,9}[.,]{0,1}[0-9]{0,"+precision+"}$") || elem.value ==''){
				elem.value = elem.value.replace(',', '.'); 
				return true;
			}else{
				elem.value = elem.value.substring(0, elem.value.length-1 );
				return false;
			}
	
		}
		if (precision == 0){
			if(elem.value.match("^[1-9]{1}[0-9]{0,9}$") || elem.value ==''){
				
				return true;
			}else{
				elem.value = elem.value.substring(0, elem.value.length-1 );
				return false;
			}
		}	
	
	


	
}
/* <span style="color:blue;font-weight:bold;">ZALECANY</span> Strona główna - Nowe produkty (main - main_new_products) [57433]*/

var HliderClass = function(){

	var obj = this;
	this.Hlider_mainID = 0;
	this.Hlider_naviID = 0;
	this.Hlider_naviclass = 0;
	this.Hlider_speed = 3;

	this.Hlider_jump = 0;
	this.lilist = 0;
	this.mainwidth = 0;
	this.mainID = '';
	this.width_pasek = 0;
	this.elements_count = 0;
	this.navi_count = 0;
	this.element_width = 0;
	this.scroll_width = 0;
	this.scroll_width_tmp = 0;	
	this.Time = 0;
	this.Scroll = 0;
	this.SI = 0;

	
	this.Navi = function(num, id, id2, clas, nullek)
	{
	this.Hlider_jump = num;
	this.Hlider_mainID = id;
	this.Hlider_naviID = id2;
	this.Hlider_naviclass = clas;
	
	////////////////	
	
	this.mainID = document.getElementById(this.Hlider_mainID);
	this.mainwidth = this.mainID.clientWidth;
	this.lilist = document.getElementById(this.Hlider_mainID).firstChild;

	this.mainwidth = this.mainID.clientWidth;		

	var elements = this.lilist.getElementsByTagName('li');
	this.elements_count = elements.length;
	
	this.navi_count = Math.ceil(this.elements_count / this.Hlider_jump);
	var naviID = document.getElementById(this.Hlider_naviID);
	if(nullek != 'NULL')
	{
		this.width_pasek = 0;	
		naviID.innerHTML = '';
	
		for(i=1; i <= this.navi_count; i++)
		{	
			var newDiv =  document.createElement('div');
			newDiv.className = this.Hlider_naviclass;
			if(i==1) newDiv.className = this.Hlider_naviclass + "_on";	
			newDiv.id = this.Hlider_mainID +"|"+this.Hlider_naviclass;				
			newDiv.onclick = this.Start;	
			newDiv.innerHTML = '<span>' + i + '</span>';
			naviID.appendChild(newDiv);
		}	
		this.mainID.scrollLeft = 0;
	
		var elements = this.lilist.getElementsByTagName('li');	
		this.elements_count = elements.length;
	
		for(n=0; n < this.elements_count;n++)
        {
			this.width_pasek += elements[n].clientWidth;
			this.element_width = elements[n].clientWidth;
		}	
		
		if(this.element_width == 0)
		{
			setTimeout(function(){obj.Navi(num,id,id2,clas)}, 500);
			return false;
		}
	}
	
	}
	
	this.Clear = function(num)
	{
		var naviID = document.getElementById(this.Hlider_naviID);
		var elements = naviID.getElementsByTagName('div');	
		for(i=0; i < elements.length; i++)
		{	
			if(elements[i].firstChild.innerHTML == num)
			{
				elements[i].className = this.Hlider_naviclass + "_on";			
			}
			else
			{
				elements[i].className = this.Hlider_naviclass;
			}
		}		
	}
	
	this.Start = function(num)
	{
	var num = parseInt(this.firstChild.innerHTML);
	var table_id = this.id.split("|");
	this.Hlider_naviID = this.parentNode.id;
	this.Hlider_mainID = table_id[0];
	this.Hlider_naviclass = table_id[1];
	this.mainID = document.getElementById(this.Hlider_mainID);	
	obj.Move(num);	
	}
	

	this.Move = function(num)
	{
		obj.Clear(num);	
		clearInterval(obj.Time);
		this.scroll_width=0;
		for(n=1;n <= num; n++)
		{
				this.scroll_width += (this.element_width * this.Hlider_jump);
		}
		this.scroll_width = this.scroll_width_tmp = this.scroll_width - (this.element_width * this.Hlider_jump);
		this.Time = setInterval(function(){obj.Anim()}, 40);
	}

	this.Anim = function()
	{
	
		this.scroll_width = Math.abs(this.mainID.scrollLeft - this.scroll_width_tmp);
		if(this.mainID.scrollLeft < this.scroll_width_tmp)
		{
		
			this.Scroll = Math.ceil((this.mainID.scrollLeft) + (this.scroll_width/ this.Hlider_speed));

		}
		else
		{
			this.Scroll = Math.floor((this.mainID.scrollLeft) - (this.scroll_width/ this.Hlider_speed));		
			this.Scroll = Math.floor((this.mainID.scrollLeft) - (this.scroll_width/ this.Hlider_speed));		
		}
		this.scroll_width = Math.round(this.scroll_width/ this.Hlider_speed);
		if(Math.round(this.Scroll) == this.scroll_width_tmp) 
		{
			clearInterval(this.Time);
		}
		this.mainID.scrollLeft = this.Scroll;

	}
	
    this.Left = function(num, id, id2, clas, nullek) 
    {
	this.Navi(num,id,id2,clas,nullek);	
	
		clearInterval(this.Time);
		this.scroll_width=0;
		var number = Math.round((this.mainID.scrollLeft / this.element_width) / this.Hlider_jump);
		if(number == 0)
		{
			number = this.navi_count;
		}
		obj.Move(number);
	}
	
    this.Right = function(num, id, id2, clas, nullek) 
    {

	obj.Navi(num,id,id2,clas, nullek);
	
		clearInterval(this.Time);
		this.scroll_width=0;
		var number = Math.round((this.mainID.scrollLeft / this.element_width) / this.Hlider_jump);
		number++;
		number++;		
		if(number > this.navi_count)
		{
			number = 1;
		}
		obj.Move(number);
	}	
}

var Hlider = new HliderClass();
/* <b style="font-size:12px;color:red; text-decoration:blink">&gt;</b>Nowy Formularz zapamiętania klienta 4.0 (ratownik24) (client-save - client-save-form) [54677]*/

var ClientSave = {
    validateLogin: function(obj)
    {
        obj.value = obj.value.toLowerCase();
    }
}
/* <span style="color:blue;font-weight:bold;">ZALECANY</span> Karta produktu - Detale produktu (projector - projector_details) [57563]*/
// START Z ROZMIAREM CZY NIE (0 - start bez rozmiaru, 1 - z rozmiarem)
var rozmiar_start = 1;

// JEDNOSTKI MIAR PRZY CENIE (0 - tak, 1 -nie)
var unit_start = 0;

// KOSZTY DOSTAWY (0 - tak, 1 -nie)
var delivery_start = 0;


// PODAJ ILOSC (0 - tak, 1 -nie)
var number_start = 0;

// POKAZ ILOSC (0 - tak, 1 -nie)
var amount_start = 0;

// POKAZ CENE NETTO (0 - tak, 1 -nie)
var pricenetto_start = 1;

var txt_niemastanu = 'Produkt niedostępny';
var txt_status_24 = 'w ciągu 24h';
var txt_status_natychmiast = 'dzisiaj';
var txt_days = ' dni'
var txt_za = ' za ';
var txt_taniej = '<span style="font-weight:normal;">Taniej o </span> ';
var txt_oszczedzasz = '<span style="font-weight:normal;">oszczędzasz</span>  ';
var txt_wybrany_rozmiar = 'Rozmiar:  ';
var txt_wysylka = '';
var txt_wysylka_za = 'w ciągu ';
var txt_dostepny = 'Dostawa  ';
var txt_dostepny_za = 'Dostawa za ';
var txt_pkt = ' pkt.';
var txt_tylkotel = 'Skontaktuj się ze sprzedawcą';
var txt_niedostepny = 'Produkt niedostępny';
var txt_status_amount_full = 'większa ilość';
var txt_status_amount_null = 'brak w magazynie';
var txt_forpointsonly ='Produkt możesz kupić za punkty';
var txt_forpoints_txt = 'Zaznacz jak chcesz kupić za punkty';
var txt_disable_desc = '<a href=\"contact.php\">Skontaktuj się z nami</a>';
/**
Alert
*/

var Alertek = {

	alert_cover   : '',
	
	getScrollXY : function () {
		  var scrOfX = 0, scrOfY = 0;
		  if( typeof( window.pageYOffset ) == 'number' ) {
		    //Netscape compliant
		    scrOfY = window.pageYOffset;
		    scrOfX = window.pageXOffset;
		  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
		    //DOM compliant
		    scrOfY = document.body.scrollTop;
		    scrOfX = document.body.scrollLeft;
		  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
		    //IE6 standards compliant mode
		    scrOfY = document.documentElement.scrollTop;
		    scrOfX = document.documentElement.scrollLeft;
		  }
		  return scrOfY;
	},	

	pageHeight : function () {
	var heighter = window.innerHeight != null? window.innerHeight: document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight:document.body != null? document.body.clientHeight:null;
	return heighter =  heighter + Alertek.getScrollXY();
	},
	

	
	show_alert : function (txt) {
		Alertek.alert_cover = document.getElementById('alert_cover');
		Alertek.alert_cover.innerHTML = txt;	
		Alertek.alert_cover.style.display='block';

		Alertek.alert_cover.style.top = Alertek.pageHeight() / 2 + 'px';
		Alertek.alert_cover.style.left = ns6? ((Popup.pageSizes()[2] / 2) - (Alertek.alert_cover.clientWidth / 2)) + "px" : ((Popup.pageSizes()[2] / 2) - (Alertek.alert_cover.clientWidth / 2)) + "px";
	
	if (navigator.appVersion.indexOf("MSIE")!=-1){
		temp=navigator.appVersion.split("MSIE");
		ver_brow=parseFloat(temp[1]);

				if (ver_brow<7.0) {
				 Alertek.alert_cover.style.left = (document.body.clientWidth / 2) - (Alertek.alert_cover.clientWidth /2 ) + 'px';
				 }
				if (ver_brow==7.0)
				 {
				 Alertek.alert_cover.style.top = (document.body.clientHeight / 2) - (Alertek.alert_cover.clientHeight) + 'px';
				 Alertek.alert_cover.style.left = (document.body.clientWidth / 2) - (Alertek.alert_cover.clientWidth /2 ) + 'px';
				 }
		 }	
		 
	setTimeout('Alertek.hide_alert()', 3000);		 
	
	},
	
	hide_alert : function () {	
		Alertek.alert_cover = document.getElementById('alert_cover');
		Alertek.alert_cover.style.display='none';
	} 	

}


/**
  Projector
*/


var Projector = {
	displayed   : '',
	price_cont  : '',
	phoneprice_cont   :  '',
	sizes_cont  : '',	
	sizes_cont_onesize  : '',		
	price_cont_yousave  : '',	
	proj_btn    : '',
	proj_img_cover_sub    : '',		
	proj_status_gfx    : '',	
	proj_status_desc    : '',	
	forpoints_check	   : '',
	status_amount    : '',
	msg_alert : '',
	temp  : '',
	
	//START  ZEROWY
	start_zero : function () {

	if(zm1 == '1') 
	{
		if(zm2 == 'onesize')
		{
			Projector.start('onesize','onesize');
		}
		else
		{
			Projector.start(zm2);
			//Projector.menus('sizes_menu_list',0,zm3);			
		}

	}
	else
	{
		if(rozmiar_start == 0 && zm1 != '1')
		{
			Projector.start();
		}
		else
		{
			Projector.start(zm2);
			//Projector.menus('sizes_menu_list',0,zm3);
			
			//var boldlist = document.getElementById('sizes_menu_list_cont');
		//boldlist = boldlist.getElementsByTagName('div');
			i=0;
			
		/*	while(i < boldlist.length){
				if(boldlist[i].firstChild.innerHTML == zm3)
				{
					boldlist[i].className = "projector_sizes_onesize_55916_on";
				}
			i++ ;
			}	*/

		}
	}


	},
		
	
	start : function (rozm, onesize) {
	
	// CHECKING IF XML TRUE
	var itnum=0;
	for(n in selectSizes)
	{
			itnum++;
	}
	if(itnum == 0) 
	{
		document.getElementById('projector_ALL_component').style.display = 'none';
		Alertek.show_alert('XML ERROR ' + itnum);
		return false;
		
	}
	
	// DEFINICJA WSZYTSKICH ELEMENTOW DO UZYTKU POZNIEJ
	Projector.sizes_cont_onesize = document.getElementById('projector_sizes_cont_onesize');
	Projector.sizes_cont = document.getElementById('projector_sizes_cont');
	Projector.proj_status_cont = document.getElementById('projector_status_cont');
	Projector.proj_status_gfx = document.getElementById('projector_status_gfx');
	Projector.proj_status_gfx_cont = document.getElementById('projector_status_gfx_cont');
	Projector.proj_status_desc = document.getElementById('projector_status_description');
	Projector.proj_status_desc_title = document.getElementById('projector_status_description_title');
	Projector.proj_status_desc2 = document.getElementById('projector_status_description2');	
	Projector.price_cont = document.getElementById('projector_price_cont');
	Projector.price_maxprice = document.getElementById('projector_status_maxprice');
	Projector.price_cont_yousave = document.getElementById('projector_price_cont_yousave');		
	Projector.phoneprice_cont = document.getElementById('projector_phoneprice_cont');
	Projector.forpoints_cont = document.getElementById('projector_forpoints');
	Projector.forpoints_check = document.getElementById('forpoints_check');	
	Projector.pricepoints_sub = document.getElementById('projector_pricepoints_cont');	
	Projector.pricepoints_value = document.getElementById('projector_pricepoints_cont_value');	
	Projector.delivery_sub = document.getElementById('projector_delivery_cont');	
	Projector.delivery_value = document.getElementById('projector_delivery_cont_value');	
	Projector.deliveryfree = document.getElementById('projector_deliveryfree_cont');
	Projector.number_sub = document.getElementById('projector_number_cont');	
	Projector.number_value = document.getElementById('projector_number_value');		
	Projector.amount_sub = document.getElementById('projector_amount_cont');	
	Projector.amount_value = document.getElementById('projector_amount_cont_value');	
	Projector.pricenetto_sub = document.getElementById('projector_pricenetto_cont');	
	Projector.pricenetto_value = document.getElementById('projector_pricenetto_cont_value');	
	
	
		// UZUPELNIENIE FORMUALRZA 
		document.getElementById('form_projector').size.value = rozm;
	
		// ZMIANA OSZCZEDZASZ NA STARCIE
		if(projector_first_price[4] != '' && projector_first_price[5] != '')
		{
			Projector.price_cont_yousave.innerHTML = txt_taniej + projector_first_price[5] + '%, '+ txt_oszczedzasz + projector_first_price[4] + projector_currency;	
		}	
	
	
		// ZMIANA PROMOCJI NA STARCIE
		if(projector_first_price[2] != '') 
		{
			Projector.price_maxprice.innerHTML = projector_first_price[2] + projector_currency;
		}
		
		// ZMIANA CENY NA STARCIE	
		if(projector_first_price[0] == projector_first_price[1] && projector_first_price[0] != 0)
		{
		
				// ZMIANA CENA NETTO NA STARCIE
				if(pricenetto_start == '0' && projector_pricenetto != '') 
				{
					Projector.pricenetto_sub.style.display = "block";
					Projector.pricenetto_value.innerHTML = projector_pricenetto + projector_currency;
				}	
				else
				{
					Projector.pricenetto_sub.style.display = "none";		
				}
				
			Projector.phoneprice_cont.style.display = 'none';		
			Projector.price_cont.innerHTML = projector_first_price[0] + "<span class='projector_currency'>" + projector_currency + "</span>";				

		}
		else
		{
			if(projector_first_price[0] != projector_first_price[1] && projector_first_price[0] != 0)
			{
			
				Projector.price_cont.innerHTML = projector_first_price[0] + '-' + projector_first_price[1] + "<span class='projector_currency'>" + projector_currency + "</span>";	
			}		
			if(projector_first_price[0] == 0)
			{
				Projector.price_cont.style.display = 'none';
				Projector.phoneprice_cont.style.display = 'block';
			}
		}
		
		//JEDNOSTKA MIARY
		if(projector_unit != '' && unit_start == '0')
		{
			Projector.price_cont.innerHTML += "<span class='unit_slash'> / </span>" + projector_unit;
		}		
	
		if(rozm) Projector.status_change(rozm, onesize);

		
	},		
	
	
	status_change : function (rozm, onesize) {
	
	// ZMIENNE
	var status_price = selectSizes[rozm][0];
	var status_price_netto = selectSizes[rozm][1];
	var status_price_yousavepercent = selectSizes[rozm][2];
	var status_price_yousave = selectSizes[rozm][3];
	var status_price_maxprice = selectSizes[rozm][4];	
	var status_status = selectSizes[rozm][5];	
	var status_devilery_days = selectSizes[rozm][6];
	var status_desc = selectSizes[rozm][7];
	var status_desc_tel = selectSizes[rozm][8];
	var status_gfx_src = selectSizes[rozm][9];	
	var status_name = selectSizes[rozm][10];	
	var status_phoneprice = selectSizes[rozm][11];	
	var status_forpoints = selectSizes[rozm][12];	
	var status_points = selectSizes[rozm][13];	
	var status_delivery = selectSizes[rozm][14];	
	
	Projector.status_amount = selectSizes[rozm][15];	
	var status_gfx_tel = selectSizes[rozm][16];		
	
	//PODMIANA GRAFIKI  ORAZ TXT CENA NA TEL IF EXIST
	if(status_gfx_tel != '' || status_desc_tel != '')
	{
		if(status_gfx_tel != '')
		{
			Projector.phoneprice_cont.innerHTML = '<img id=\"projector_gfx_phoneprice\" src=\"blank.gif\" alt=\"' + status_desc_tel + '\"/>';
			document.getElementById('projector_gfx_phoneprice').src = status_gfx_tel;
		}
		else if(status_desc_tel != '')
		{
			Projector.phoneprice_cont.innerHTML = status_desc_tel;
		}		
	}

	
	//PUNKTY JEZELI ZALOGWANY
	if(status_forpoints == 'true' && status_status != 'disabled')
	{
		Projector.forpoints_cont.style.display = "block";
	}
	else
	{
		Projector.forpoints_cont.style.display = "none";	
	}
	
	//PUNKTY - WYSWEILERNIE
	if(status_points != '')
	{
		Projector.pricepoints_sub.style.display = "block";
		Projector.pricepoints_value.innerHTML = status_points + txt_pkt;
	}
	else
	{
		Projector.pricepoints_sub.style.display = "none";	
	}
	
	//ILOSC - WYSWIETLENIE
	if(Projector.status_amount != '' && amount_start == '0')
	{
		Projector.amount_sub.style.display = "block";
		if(Projector.status_amount == '0')
		{
			Projector.amount_value.innerHTML = txt_status_amount_null;
		}
		if(Projector.status_amount == '-1')
		{
			Projector.amount_value.innerHTML = txt_status_amount_full;
		}	
		if(parseInt(Projector.status_amount) > 0)
		{
			Projector.amount_value.innerHTML = Projector.status_amount;
		}
	}
	else
	{
		Projector.amount_sub.style.display = "none";	
	}		
	
	//KOSZTY DOSTAWY
	if(status_delivery != '' && delivery_start == '0')
	{
		if(parseInt(status_delivery) > 0)
		{
			Projector.deliveryfree.style.display = "none";		
			Projector.delivery_sub.style.display = "block";
			Projector.delivery_value.innerHTML = status_delivery + projector_currency;
		}
		else
		{
			Projector.delivery_sub.style.display = "none";
			Projector.deliveryfree.style.display = "block";	
		}
	}
	else
	{
		Projector.pricepoints_sub.style.display = "none";	
	}	
	
	//PODAWANIE ILOSCI - WIDOCZNOSC
	if(number_start == '0' && status_status != 'disable')
	{
		Projector.number_sub.style.display = "block";
		Projector.number_value.value = 1;
	}
	else
	{
		Projector.number_sub.style.display = "none";	
	}		


	// UKRYCIE WIDOCZNOSCI SELECTA IF ONESIZE ORAZ WYPISANIE JEDNEGO ROZMIARU JEZELI ROZNY OD ONESIZE
	if(onesize == 'onesize')	
	{	
		if(rozm != 'onesize')
		{
			Projector.sizes_cont_onesize.style.display='block';	
			Projector.sizes_cont_onesize.firstChild.innerHTML = txt_wybrany_rozmiar + status_name;		
		}
		Projector.sizes_cont.style.display='none';
	}
	else
	{
		Projector.sizes_cont.style.display='block';	
	}	
	
	// WLACZENIE WIDOCZNOSCI CONTENERA STATUSU
	Projector.proj_status_cont.style.display = 'block';
	
	
	// ZMIANA CENY
	if(status_price_maxprice != '') 
	{
		Projector.price_maxprice.innerHTML = status_price_maxprice + projector_currency;
	}
	
	if(status_phoneprice == 'true')
	{

		Projector.price_cont.style.display = 'none';		
		Projector.phoneprice_cont.style.display = 'block';	
	}
	else
	{
		Projector.price_cont.style.display = 'block';		
		Projector.phoneprice_cont.style.display = 'none';

		Projector.price_cont.innerHTML = status_price + "<span class='projector_currency'>" + projector_currency + "</span>";				


	}
	
	// ZMIANA CENA NETTO
	if(pricenetto_start == '0' && status_price_netto != '' && status_phoneprice != 'true') 
	{
		Projector.pricenetto_sub.style.display = "block";
		Projector.pricenetto_value.innerHTML = status_price_netto + projector_currency;
	}	
	else
	{
		Projector.pricenetto_sub.style.display = "none";		
	}	

	//JEDNOSTKA MIARY
	if(projector_unit != '' && unit_start == '0')
	{
		Projector.price_cont.innerHTML += "<span class='unit_slash'> / </span>" + projector_unit;
	}
	
	// ZMIANA OSZCZEDZASZ
	if(status_price_yousavepercent != '' && status_price_yousave != '')
	{
		Projector.price_cont_yousave.innerHTML = txt_taniej + status_price_yousavepercent + '%, '+ txt_oszczedzasz + status_price_yousave + projector_currency;	
	}
		
	// ZMIANA GRAFIKI STATUSU
	if(status_gfx_src != '')
	{
		Projector.proj_status_gfx_cont.style.display = "block";
		Projector.proj_status_gfx.innerHTML = '<img src=\"blank.gif\" />';
		status_imageObj = new Image();
		status_imageObj.src = status_gfx_src;
		Projector.proj_status_gfx.firstChild.src = status_gfx_src;
	}
	else
	{
		Projector.proj_status_gfx_cont.style.display = "none";	
	}

	// ZMIANA TXT STATUSU I DNI
	Projector.proj_status_desc.innerHTML ='';
	Projector.proj_status_desc_title.style.display = "block";	
	
	if(status_status == 'enable' || status_status == 'order')
	{
		if(status_desc != '')
		{	
			Projector.proj_status_desc.innerHTML = status_desc;	
		}		
	}
	
	if(status_status == 'disable')
	{
		if(status_desc != '')
		{	
			Projector.proj_status_desc.innerHTML = status_desc;	
			if(status_devilery_days != '')
			{
			
				if(status_devilery_days == '0')
				{
					Projector.proj_status_desc.innerHTML += txt_status_natychmiast;
				}
				if(status_devilery_days == '1')
				{
					Projector.proj_status_desc.innerHTML += txt_za + txt_status_24;
				}	
				if(status_devilery_days > '1')
				{
					Projector.proj_status_desc.innerHTML += txt_za + status_devilery_days + txt_days;
				}				
			}
		}	
		else
		{
			Projector.proj_status_desc.innerHTML += txt_disable_desc;			
		}
		Projector.proj_status_desc_title.style.display = "none";
	
		
	}
	
	//TXT DOSTAWY np. DOSTAWA ZA 2 DNI
	if(status_status == 'enable' || status_status == 'order' && status_devilery_days != '')
	{	
		Projector.proj_status_desc2.innerHTML = Projector.fun_delivery_days(status_devilery_days, status_status);
	}
	
	// AKTYWACJA LUB NIE BUTTONA DODAJ DO KOSZYKA  i ULUBIONYCH
	Projector.button_act(status_status, status_phoneprice, status_forpoints);
	
	
	},	
	
	// FUNKCJA ZWRACAJACA TXT WYSYLKI X DNI
	fun_delivery_days : function (days,status) {
		var rezult;
		
		if(status == 'disable' && days != '' && parseInt(days) > 1)
		{
			rezult = txt_dostepny_za;
		}
		else if(status == 'disable' && days != '' && parseInt(days) <= 1)
		{
			rezult = txt_dostepny;
		}
		else
		{
			rezult = '';
		}
		
		if(status == 'enable' || status == 'order')
		{
			if(days != '' && parseInt(days) > 1)
			{
				rezult = txt_wysylka_za;
			}
			if(days != '' && parseInt(days) <= 1)
			{
				rezult = txt_wysylka;
			}			
		}		
	
			
			if(days == '0')
			{
				rezult += txt_status_natychmiast;
			}
			if(days == '1')
			{
				rezult += txt_status_24;
			}	
			if(days > '1')
			{
				rezult += days + txt_days;
			}	
		
		return rezult;
	},
	
	imagerotate : function (id) {
		if (Projector.displayed == '') {
			document.getElementById('img_1').style.display = 'none';
		} 
	   else {
	       document.getElementById(Projector.displayed).style.display = 'none';
	   }
	   document.getElementById(id).style.display = '';
	   Projector.displayed = id;
	},
	
	button_act : function (status, phone, points) {

		Projector.forpoints_cont.removeAttribute("onclick");	

		if(status == 'disable' || phone == 'true')
		{		

			Projector.button_deact(txt_niedostepny);
			
			if(phone != '' && phone == 'true')
			{
				Projector.button_deact(txt_tylkotel);
			}
			if(points != '')
			{
				
				if(points == 'true' && phone == 'true') 
				{
					Projector.forpoints_check.disabled = 'disabled';	
					Projector.forpoints_check.checked = true;
					msg_alert = txt_forpointsonly;
					Projector.forpoints_cont.onclick = Projector.onclicker_3;	
					
					Projector.proj_btn = document.getElementById('projector_button_basket');
					Projector.proj_btn.style.cursor ='pointer';
					Projector.proj_btn.onclick = Projector.onclicker_1;						

				}
				else
				{
					Projector.button_deact(txt_tylkotel);
				}
			}
		}
		else
		{
			Projector.forpoints_check.disabled = '';
			Projector.forpoints_check.checked = false;	
			msg_alert = txt_forpoints_txt;
			Projector.forpoints_cont.removeAttribute("onclick");
			
			Projector.proj_btn = document.getElementById('projector_button_basket');
			Projector.proj_btn.style.cursor ='pointer';
			Projector.proj_btn.onclick = Projector.onclicker_1;
		
		}
			// DLA OBSERVE
			var zo = "document.getElementById('iemode').value=2;document.getElementById('form_projector').submit();";
			Projector.proj_btn_observe = document.getElementById('projector_button_observe');	
			Projector.proj_btn_observe.style.cursor ='pointer';		
			Projector.proj_btn_observe.onclick = Projector.onclicker_2;			

		
	},
	
	onclicker_false : function()
	{
		return false;
	},	
	
	onclicker_1 : function()
	{
		document.getElementById('iemode').value=1;
		document.getElementById('form_projector').submit();
	},
	
	onclicker_2 : function()
	{
		document.getElementById('iemode').value=2;
		document.getElementById('form_projector').submit();
	},	
	
	onclicker_3 : function()
	{
		Alertek.show_alert(msg_alert);
		return false;
	},		
	
	button_deact : function (msg) {
		
		msg_alert = msg;
		Projector.proj_btn = document.getElementById('projector_button_basket');
		Projector.proj_btn.style.cursor ='not-allowed';
		Projector.proj_btn.onclick = Projector.onclicker_3;	
	},	
	
	if_isanumber  : function(test)
	{
			if(test.match("^[1-9]{1}[0-9]{0,9}$") || test ==''){
				return test;
			}else
			{
				test = test.substring(0, test.length-1);
				return test;
			}	
	
	},
	
  roundNumber  : function(number, flag) {
      var rnum = number;
      if (flag == 0)var rlength = 0;
      if (flag != 0)var rlength = flag;
      if (rnum > 8191 && rnum < 10485) {
      rnum = rnum-5000;
      var newnumber = Math.round(rnum*Math.pow(10,rlength))/Math.pow(10,rlength);
      newnumber = newnumber+5000;
  } else {
      var newnumber = Math.round(rnum*Math.pow(10,rlength))/Math.pow(10,rlength);
  }
      return newnumber;
  },


	number_check  : function()
	{
	
		Projector.number_value.value = Projector.if_isanumber(Projector.number_value.value);
		
		if(Projector.number_value.value >= parseInt(Projector.status_amount) && isFinite(Projector.status_amount) && Projector.status_amount != '-1')
		{
			Projector.number_value.value = parseInt(Projector.status_amount);
			Projector.price_cont.innerHTML = Projector.roundNumber((parseInt(Projector.status_amount) * projector_first_price[0]),2) + "<span class='projector_currency'>" + projector_currency + "</span>";			
		}
		else
		{
			if(Projector.if_isanumber(Projector.number_value.value))
			{
				if(projector_first_price[2] != '') Projector.price_maxprice.innerHTML = Projector.roundNumber((parseInt(Projector.number_value.value) * projector_first_price[2]),2) + projector_currency;
				Projector.price_cont.innerHTML = Projector.roundNumber((parseInt(Projector.number_value.value) * projector_first_price[0]),2) + "<span class='projector_currency'>" + projector_currency + "</span>";			
			}
			else
			{
				Projector.number_value.value = '1';
				if(projector_first_price[2] != '') Projector.price_maxprice.innerHTML = projector_first_price[2] + projector_currency;				
				Projector.price_cont.innerHTML = projector_first_price[0] + "<span class='projector_currency'>" + projector_currency + "</span>";
				return false;	
			}
		}
	},
	
	number_up  : function()
	{
		if(isNaN(parseInt(Projector.number_value.value))) Projector.number_value.value = 1;
		if(Projector.number_value.value >= parseInt(Projector.status_amount) && isFinite(Projector.status_amount) && Projector.status_amount != '-1')
		{
			return false;
		}
		else
		{
			Projector.number_value.value = parseInt(Projector.number_value.value) + 1;		
					
		}
	},
	
	number_down  : function()
	{
		if(isNaN(parseInt(Projector.number_value.value))) Projector.number_value.value = 1;
		if(Projector.number_value.value > 1)
		{
			Projector.number_value.value = parseInt(Projector.number_value.value) - 1;
						
		}
	},	
	
	onmouseover_img : function()
	{
		this.style.display = 'none';
	},	

	img_cover : function (id) {
	
		/*Projector.proj_img_cover_sub = document.getElementById('projector_img_cover_sub');		
		if(Projector.proj_img_cover_sub.style.display == 'block')
		{
			Projector.proj_img_cover_sub.style.display = 'none';	
		}
		else
		{
			Projector.proj_img_cover_sub.style.display = 'block';	
		}
		if(id != 'null')
		{
			temp = id.getAttribute("onclick");		
			Projector.proj_img_cover_sub.onmouseover = Projector.onmouseover_img;
			Projector.proj_img_cover_sub.style.top = id.firstChild.clientHeight / 2 - 10 + 'px';
			//alert(id.firstChild.clientWidth + ' ---- ' +Projector.proj_img_cover_sub.clientWidth);
			Projector.proj_img_cover_sub.style.left = (id.firstChild.clientWidth  / 2) - (Projector.proj_img_cover_sub.clientWidth / 2) + 'px';		
		} */
	},
	
	menus : function (menu,switc, name) { 

		if(switc==1)
		{
			if(document.getElementById(menu))document.getElementById(menu).style.display='block';
		}
		else
		{
			if(document.getElementById(menu))document.getElementById(menu).style.display='none';	
			
			if (name != 0)
			{

					if(document.getElementById('results_size_lista'))document.getElementById('results_size_lista').innerHTML=name;	
					if(document.getElementById('bok_results_size'))document.getElementById('bok_results_size').innerHTML=name;	
			}
		}
	},
	
	boldclick : function (idek)  {
	
		//var boldlist = document.getElementById('sizes_menu_list_cont');
		//boldlist = boldlist.getElementsByTagName('div');
		i=0;


		
	/*	while(i < boldlist.length){
		boldlist[i].className = "projector_sizes_onesize_55916";
		i++ ;
		}	*/
		idek.className = "projector_sizes_onesize_55916_on";
	
	
	},
	
	forpoints : function () { 
		if(Projector.forpoints_cont)
		{
			if(Projector.forpoints_cont.className == 'n53486_points')
			{
				Projector.forpoints_cont.className = 'n53486_points_active'
			}
			else
			{
				Projector.forpoints_cont.className = 'n53486_points'
			}			
		
		
		}
		
	}
		
}


/**
  Popup _ NOWA GALERIA
*/

var ns6=document.getElementById&&!document.all;
var ie=document.all;
var html = document.getElementsByTagName("html");
var Popup = {
        url :'http://' + location.host,
	link   : '',
	width  : 0,
	height : 0,
        loaded : 0,
	show : function (link,x,y) {
		Popup.link = link;
		Popup.width = x;
		Popup.height = y;
        Popup.loaded = 1;
		if (document.getElementById('big_photo')) {
			document.getElementById('big_photo').style.display = "none";
			document.getElementById('big_photo').src = Popup.link;
		}
		if (basecount < 2 || !basecount) {
			document.getElementById('popup_next_prev').style.visibility = "hidden";
		}
		var edit = document.getElementById('show_popup_photo_sub');		
        edit.style.width = parseInt(x) + "px";
        edit.style.height = parseInt(y) + "px";			
		
		if (!ns6) {Popup.hideSelects(1);}
		Popup.creatLayers();
	},
    reload : function () {
              if (Popup.loaded) {
                     Popup.resize(Popup.link,Popup.width,Popup.height);
              }
        },
    next_img : function () {
		Popup.link = document.getElementById('big_photo').src;
                if(Popup.link.indexOf(Popup.url) != '-1') Popup.link= Popup.link.substr(Popup.url.length+1,Popup.link.length);
	        for(n=1; n <= basecount; n++)
			{
				if(Popup_enclosures[n][0] == Popup.link) {
				    n++;
					if(n <= basecount){
						Popup.resize(Popup_enclosures[n][0], Popup_enclosures[n][1],Popup_enclosures[n][2]);
						Popup.link = Popup_enclosures[n][0];
						return false;
					}
					else
					{
						Popup.resize(Popup_enclosures[1][0], Popup_enclosures[1][1],Popup_enclosures[1][2]);
						Popup.link = Popup_enclosures[1][0];
						return false;
					}
				}
			} 

           
        },		
    prev_img : function () {
		Popup.link = document.getElementById('big_photo').src;	
                if(Popup.link.indexOf(Popup.url) != '-1') Popup.link= Popup.link.substr(Popup.url.length+1,Popup.link.length);
	        for(n=basecount; n <= basecount; n--)
			{

				if(Popup_enclosures[n][0] == Popup.link) {
					n--;
					if(n >= 1){
						Popup.resize(Popup_enclosures[n][0], Popup_enclosures[n][1],Popup_enclosures[n][2]);
						Popup.link = Popup_enclosures[n][0];
						return false;
					}
					else
					{
						Popup.resize(Popup_enclosures[basecount][0], Popup_enclosures[basecount][1],Popup_enclosures[basecount][2]);
						Popup.link = Popup_enclosures[basecount][0];
						return false;
					}					
				}
			}
            
        },			
	resize : function (sciezka, width, height) {
		document.getElementById('big_photo').style.display='none';		
		var edit = document.getElementById('show_popup_photo_sub');
		var edit2 = document.getElementById('show_popup_photo');		
        document.getElementById('big_photo').src = sciezka;
        edit.style.width = parseInt(width) + "px";
        edit2.style.width = parseInt(width) + "px";		
        edit.style.height = parseInt(height) + "px";		
		edit2.style.left = ns6? (Popup.pageSizes()[2] - (edit2.clientWidth + 10))/2 + html[0].scrollLeft +"px" : (Popup.pageSizes()[2] - (edit2.clientWidth + 10))/2 + "px";		

	},
	hide : function () {
		var edit = document.getElementById('show_popup_photo');
        var edit_close = document.getElementById('show_popup_photo_close');
		var cover = document.getElementById('cover');
		edit.style.display = "none";
        edit_close.style.display = "none";
		cover.style.display = "none";
        Popup.loaded = 0;
		if (!ns6) {Popup.hideSelects(0);}
	},
	cover : function (wartosc) {
		var cover = document.getElementById('cover');
	    ns6? cover.style.opacity = '.' + wartosc  :  cover.style.filter = "alpha(Opacity=" +wartosc+")";
	    if (window.opera) {
			cover.style.opacity = '.' + wartosc;
		}
	},	
	creatLayers : function () {


var edit = document.getElementById('show_popup_photo');
var edit_close = document.getElementById('show_popup_photo_close');
		edit.style.position = 'absolute';
	    edit.style.display = "block";
	    edit_close.style.display = "block";
		edit.style.width = (Popup.width) + "px";
	    edit.style.left = ns6? (Popup.pageSizes()[2] - (Popup.width + 10))/2 + html[0].scrollLeft +"px" : (Popup.pageSizes()[2] - (Popup.width + 10))/2 + "px";

var ver_brow=0;
if (navigator.appVersion.indexOf("MSIE")!=-1){
temp=navigator.appVersion.split("MSIE");
ver_brow=parseFloat(temp[1]);

if (ver_brow<7.0)
 {
edit.style.top = ((((Popup.pageSizes()[3] - (Popup.height + 10))/2) - 100  + document.body.scrollTop) < 0) ? "50px" : (((Popup.pageSizes()[3] - (Popup.height + 10))/2) - 100  + document.body.scrollTop + 50) + "px";
          }
else
{
edit.style.top = ((((Popup.pageSizes()[3] - (Popup.height + 10))/2) - 100  + html[0].scrollTop) < 0) ? "50px" : (((Popup.pageSizes()[3] - (Popup.height + 10))/2) - 100  + html[0].scrollTop + 50) + "px";
}
}
            else
{
edit.style.top = ((((Popup.pageSizes()[3] - (Popup.height + 10))/2) - 100  + html[0].scrollTop) < 0) ? "50px" : (((Popup.pageSizes()[3] - (Popup.height + 10))/2) - 100  + html[0].scrollTop + 50) + "px";
}



        edit.style.zIndex = 1000;
		edit.style.Background = '#FFFFFF';

	    //'cover'- div do blokowania elementow innych niz edit
	    var cover = document.getElementById('cover');
	    cover.style.display = "block";
        cover.style.position = "absolute";
	    cover.style.zIndex = 900;
	    ns6? cover.style.opacity = .5 :  cover.style.filter = "alpha(Opacity=50)";
	    if (window.opera) {
			cover.style.opacity = .5;
		}
		cover.style.left = "0px";
	    cover.style.top = "0px";
            offsetX = 0;
            if (!ns6 && !window.opera) {
                  offsetX = 20;
            }
	    cover.style.width = ns6? (Popup.pageSizes()[0] - 16) + "px" : Popup.pageSizes()[0] - offsetX + "px"; //ns6? html[0].offsetWidth +"px" : document.body.offsetWidth + "px";
	    cover.style.height = Popup.pageSizes()[1] + "px" //ns6? html[0].offsetHeight +"px" : document.body.offsetHeight + "px";
	},
	pageSizes : function () {
		var xScroll, yScroll;
		if (window.innerHeight && window.scrollMaxY) {	
			xScroll = document.body.scrollWidth;
			yScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		} else {
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}
		var windowWidth, windowHeight;
		if (self.innerHeight) {
			windowWidth = self.innerWidth;
			windowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) {
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}	
		if(yScroll < windowHeight){
			pageHeight = windowHeight;
		} else { 
			pageHeight = yScroll;
		}
		if(xScroll < windowWidth){	
			pageWidth = windowWidth;
		} else {
			pageWidth = xScroll;
		}
		arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
		return arrayPageSize;
	},
	hideSelects : function (flag) {
		var selects = document.getElementsByTagName('SELECT');
		if (flag == 1) {
			for (i = 0; i < selects.length; i++) {
				selects[i].style.display = 'none';
			}
		} else {
			for (i = 0; i < selects.length; i++) {
				selects[i].style.display = '';
			}
		}
	}
}
window.onresize = function() {if (Popup.loaded == 1) {Popup.reload();}}
/* <b style="font-size:12px;color:red; text-decoration:blink">&gt;</b> Wyniki wyszukiwania STANDARD/BASIC (search - search) [56317]*/

// SEARCH - PREVIEWBOX
//////////////////////////////////////////////////////////////////////

function hideprev(id){	
id.style.display='none';
}

function showprev(id, pos){
	

	img_id = document.getElementById('preview');
	img_id.innerHTML = document.getElementById(id).innerHTML;
       document.getElementById(id).style.display = "block";	
	var width_parent = document.getElementById(id).parentNode.clientWidth;
	document.getElementById(id).style.display = "none";
	var height_parent = document.getElementById(id).parentNode.clientHeight;	
	//document.getElementById(id).style.width = document.getElementById(id).parentNode.clientWidth + "px";
	var height_mother = document.getElementById(id).clientHeight;


	coors = findPos (document.getElementById(id).parentNode);
	img_id.style.top = coors[1] + 'px';
	img_id.style.left = coors[0] + 4 + 'px';

	img_id.style.width = width_parent - 19 +'px';
	img_id.style.display="block";
	
	if(height_mother < (height_parent/2))
	{
		img_id.style.height = height_parent - 16 - (height_parent/2) + 'px';
		img_id.style.marginTop= (height_parent/2) + "px";	  
	}
	else
	{

		img_id.style.height = height_mother + 10 + 'px';
		img_id.style.marginTop= (height_parent/2) + "px";	  	
	}
	
	img_id.style.padding="5px";

	
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}
/* <span style="color:blue;font-weight:bold;">ZALECANY</span> Javascript (layout_top - menu_javascript) [56297]*/

var IAI_Ajax={
    cO: function()
    {
        var r;
        try {
            r=new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            try {
                r=new ActiveXObject("Microsoft.XMLHTTP");
            } catch(oc) {
                r=null;
            }
        }
        if (!r&&typeof XMLHttpRequest!="undefined") {
            r=new XMLHttpRequest();
        }
        return r;
    },

    Request: function(url, pd, fun)
    {
        var x;
        x=IAI_Ajax.cO();

        x.open("POST",url,true);
        x.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        x.setRequestHeader("Accept","text/javascript, text/html, application/xml, text/xml, */*");
        x.setRequestHeader("X-IAI-Version", "1.0");
        
        x.onreadystatechange=function()
        {
            if (x.readyState == 4) {
                if (x.status >= 200 && x.status < 300) {
                    if (fun) {
                        if (fun.onSuccess) {
                            if (fun.arg) {
                                eval(fun.onSuccess+'(\'' +x.responseText+ '\', \''+fun.arg+'\');');
                            } else {
                                eval(fun.onSuccess+'(\'' +x.responseText+ '\');');
                            }
                        }
                    }
                } else {
                    // narazie brak
                }
            }
        }
        x.send(pd);
        delete x;
    }
}
/* <b style="font-size:12px;color:red; text-decoration:blink">&gt;</b>Formularz newslettera 3.5 (kopia) (layout_right - menu_newsletter) [56719]*/

function newsletter_blur(x) {
         if (x.value == '') {
                 x.value = newstxt;
         }
}
function newsletter_focus(x) {
         if (x.value != '') {
                 x.value = '';
         }
}
/* Podsumowanie koszyka (kopia) (basketedit - basketedit_summary) [55536]*/

function countAnnuityZagiel(account, amount)
{ 
window.open('http://www.zagiel.com.pl/kalkulator/index_smart.php?action=getklientdet_si_rata&shopNo=' + account + '&goodsValue=' + amount, 'count_zagiel', 'width=630,height=500,directories=no,location=no,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no');
}
function validate_Zagiel()
{
var zagielconfirm = document.getElementById('zagiel_confirm');
  if (zagielconfirm.checked) {
    return true;
  } else {
    alert(zagielnotconfirmed)
    return false;
  }
}
/* <span style="color:blue;font-weight:bold;">ZALECANY</span> Kontakt - Formularz z tematem (contact - contact_mailform) [54544]*/

function checkOnSubmit()
{
    if ((/^[0-9a-zA-Z._-]+@[0-9a-zA-Z._-]+.[0-9a-zA-Z]+$/).test(document.getElementById("from").value) == false || document.getElementById("from").value.length == 0){
        alert('Nie podano żadnego adresu e-mail.');
        return false;
    }
    return true;
}
/* <span style="color:blue;font-weight:bold;">ZALECANY</span> Kontakt - Newsletter (contact - contact_newsletter) [54691]*/
var newstxt = 'twój e-mail';
function newsletter_blur(x) {
         if (x.value == '') {
                 x.value = news_txt;
         }
}
function newsletter_focus(x) {
         if (x.value != '') {
                 x.value = '';
         }
}
/* <span style="color:blue;font-weight:bold;">ZALECANY</span> Karta produktu - Ukrywacz menu zakładek <b style="color:red; font-weight:bold;">MATKA</b>  (projector - projector_components_hiding) [56163]*/
var HOVER_classname_start = 'tab';
var HOVER_classname_stat = 0;

// Włączenie opini jako pierwszych, jeżeli są:
var HOVER_opinions = true;

var HOVER_choosenone = '2'; // TU MUSI BYC COS CO JEST ZAWSZE np. ZADAJ PRODUKT - PODAJ JEGO L.P.
var Hover_Array_Disable = new Array();
var Hover_Array = new Array();
var Hover_Array2 = new Array();


//////////////////////////////////////////////////////////////////////////////////////////////////////

Hover_Array2[6] = new Array('component_projector_sizes','0');
Hover_Array2[3] = new Array('component_projector_opinions','0', '2');
Hover_Array2[5] = new Array('component_projector_associated_zones','0', '1');
Hover_Array2[4] = new Array('component_projector_suggestproduct','0');
Hover_Array2[2] = new Array('component_projector_askforproduct','0');
Hover_Array2[8] = new Array('component_projector_warranty','0');
Hover_Array2[7] = new Array('component_projector_enclosures','0');
Hover_Array2[1] = new Array('component_projector_longdescription','1');
Hover_Array2[9] = new Array('component_projector_dictionary','0');

//////////////////////////////////////////////////////////////////////////////////////////////////////

var Hover_Array_ZONES = new Array();
Hover_Array_ZONES[1] = new Array('component_projector_associated_zone1');
Hover_Array_ZONES[2] = new Array('component_projector_associated_zone2');
Hover_Array_ZONES[3] = new Array('component_projector_associated_zone3');
Hover_Array_ZONES[4] = new Array('component_projector_associated_zone4');

var Hover_Array_OPINIONS = new Array();
Hover_Array_OPINIONS[1] = new Array('component_projector_opinions');
Hover_Array_OPINIONS[2] = new Array('component_projector_addopinions');
//////// Funkcje ukrywacza /////////

function HOVER_sort()
{
	for (i = 1; i<Hover_Array2.length; i++) {
		Hover_Array[i] = Hover_Array2[i];
	}
}


function HOVER(start)
{



//SORTOWANIE TABLICY
HOVER_sort();



var Hover_Elements = new Array();



	for(n in Hover_Array)
	{


		if(start != 1)
		{

		//COPY
if(document.getElementById('btn_' + Hover_Array[n][0]))
{
		Hover_Elements[n] = document.getElementById('btn_' + Hover_Array[n][0]).innerHTML;
		
		//REMOVE CHILD
		document.getElementById('Hover_blanks').removeChild(document.getElementById('btn_' + Hover_Array[n][0]));
		
		//PASTE
		var ni = document.getElementById('Hover_NewMENU');
		var newDiv =  document.createElement('div');
		newDiv.id = 'btn_' + Hover_Array[n][0];
		if(HOVER_classname_stat == 1)
		{
			newDiv.className = Hover_Array[n][0];	
		}
		else
		{
			newDiv.className = HOVER_classname_start;		
		}
		newDiv.style.display = 'none';	
		newDiv.onclick = function(){HOVER_change(this.id)};			
		newDiv.innerHTML = Hover_Elements[n];
		ni.appendChild(newDiv);
}

		}

	
	}



//CHECK IF EXIST
HOVER_disable();

	if(start != 1) HOVER_addhover();	
	
	if(start != 1) HOVER_opinions_show();		
	
	//POKAZYWANIE 
	HOVER_visible();

}

function HOVER_addhover()
{

	for(n in Hover_Array)
	{
		if(Hover_Array_Disable[n] == 'true')
		{
			document.getElementById('btn_' + Hover_Array[n][0]).onmouseover = HOVER_BUTTOn_onmouseover;
			document.getElementById('btn_' + Hover_Array[n][0]).onmouseout = HOVER_BUTTOn_onmouseout;			
		}
	}

}

function HOVER_BUTTOn_onmouseover()
{

	if(this.className.indexOf('_on') == -1)
	{
		HOVER_className = this.className;	
		this.className = HOVER_className + '_hover';
	}
}

function HOVER_BUTTOn_onmouseout()
{
	if(this.className.indexOf('_on') == -1)
	{
		this.className = HOVER_className;
	}
}

function HOVER_visible()
{

	for(n in Hover_Array)
	{
		if(Hover_Array_Disable[n] == 'true')
		{
			document.getElementById('btn_' + Hover_Array[n][0]).style.display = "block";	
			if(Hover_Array[n][1] == '1')
			{
				if(HOVER_classname_stat == 1)
				{
					document.getElementById('btn_' + Hover_Array[n][0]).className = Hover_Array[n][0] + '_on';		
				}
				else
				{
					document.getElementById('btn_' + Hover_Array[n][0]).className = HOVER_classname_start + '_on';					
				}
			}
		}
	}

}

function HOVER_opinions_show()
{
	for(n in Hover_Array)
	{
		//IF OPINIONS TRUE TO JE WLACZ
		if(parseInt(HOVER_opinions_counter) > 0 && HOVER_opinions == true)
		{
			Hover_Array[n][1] = '0';
			if(Hover_Array[n][0] == 'component_projector_opinions')
			{
				Hover_Array[n][1] = '1';
				HOVER_disable();		
			}
		
		}
	}

}


function HOVER_disable()
{
	// ZONES CLEAR
	for(n in Hover_Array_ZONES)
	{
		if(document.getElementById(Hover_Array_ZONES[n][0])) document.getElementById(Hover_Array_ZONES[n][0]).style.display = "none";
	}
	
	// OPINIONS CLEAR
	for(n in Hover_Array_OPINIONS)
	{	
		if(document.getElementById(Hover_Array_OPINIONS[n][0])) document.getElementById(Hover_Array_OPINIONS[n][0]).style.display = "none";
	}
	
	for(n = 1; n < Hover_Array.length; n++)
	{

		Hover_Array_Disable[n] = 'false';

				//ZEROWANIE
				if(HOVER_classname_stat == 1)
				{
					if(document.getElementById('btn_' + Hover_Array[n][0]))document.getElementById('btn_' + Hover_Array[n][0]).className = Hover_Array[n][0];	
				}
				else
				{
					if(document.getElementById('btn_' + Hover_Array[n][0]))document.getElementById('btn_' + Hover_Array[n][0]).className = HOVER_classname_start;			
				}
				
	
				
				// JEZELI ISTENIEJE i ROZNY OD ZONES i OPINIONS
				if(document.getElementById(Hover_Array[n][0]) && Hover_Array[n][2] != '1' && Hover_Array[n][2] != '2')
				{
					Hover_Array_Disable[n] = 'true';
					
					//DISPLAY  DLA KOMPONENTOW			
					if(Hover_Array[n][1] == '1')
					{
						if(document.getElementById(Hover_Array[n][0]))document.getElementById(Hover_Array[n][0]).style.display = "block";	
					}
					else
					{
						if(document.getElementById(Hover_Array[n][0]))document.getElementById(Hover_Array[n][0]).style.display = "none";
					}
				}
				
		
	
				// JEZELI ZONES TO
				if(Hover_Array[n][2] == '1')
				{
					// ZONES EXIST
					for(k=1; k<Hover_Array_ZONES.length;k++)
					{
						
						if(document.getElementById(Hover_Array_ZONES[k][0])) 
						{
							Hover_Array_Disable[n] = 'true';
						}

					}

					
					//DISPLAY  DLA KOMPONENTOW			
					if(Hover_Array[n][1] == '1')
					{
						// ZONES SHOW
						for(k=1; k<Hover_Array_ZONES.length;k++)
						{
							if(document.getElementById(Hover_Array_ZONES[k][0])) document.getElementById(Hover_Array_ZONES[k][0]).style.display = "block";
						}
					}
					
				}		
	
		
				// JEZELI OPINIONS TO
				if(Hover_Array[n][2] == '2')
				{
					// OPNIONS EXIST
					for(k=1; k<Hover_Array_OPINIONS.length;k++)
					{			
						if(document.getElementById(Hover_Array_OPINIONS[k][0])) Hover_Array_Disable[n] = 'true';
					}
					//DISPLAY  DLA KOMPONENTOW			
					if(Hover_Array[n][1] == '1')
					{
						for(k=1; k<Hover_Array_OPINIONS.length;k++)
						{
							if(document.getElementById(Hover_Array_OPINIONS[k][0])) document.getElementById(Hover_Array_OPINIONS[k][0]).style.display = "block";
						}
					}
				}			



		
				//PRZESKOK DO NEXT IF PRIOR 1 I NIE MA KOMPONENTU
				if(Hover_Array_Disable[n] == 'false' && Hover_Array[n][1] == '1')
				{
					Hover_Array[n][1] = '0';
					Hover_Array[HOVER_choosenone][1] = '1';
					HOVER_disable();
				}
		
	
	}

}

function HOVER_clear_prior()
{
	for(n in Hover_Array)
	{
		Hover_Array[n][1] = '0';
	}

}

function HOVER_change(idek)
{
HOVER_clear_prior();

	for(n in Hover_Array)
	{

		if('btn_' + Hover_Array[n][0] == idek)
		{
			Hover_Array[n][1] = '1';
		}
	}
HOVER(1);
}
/* <b style="font-size:13px;color:blue; text-decoration:blink;")">[ S ]</b> Długi opis produktu  5.0 Osesek (projector - projector_longdescription) [56834]*/

// SEARCH - DIALOGBOX
//////////////////////////////////////////////////////////////////////


var offsetfrommouse=[10,15]; //image x,y offsets from cursor position in pixels. Enter 0,0 for no offset
var timer;
var idek;


function truebody(){
return (!window.opera && document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
}


function hidetrail(){	
	document.getElementById(idek).style.display= "none";
	document.onmousemove="";
	document.getElementById(idek).style.left="-2000px";
	clearTimeout(timer);
}

function showtrail(id){
	idek = id;
	if (isNaN(timer)){show();}
	timer = setTimeout("show();",100);
}
function show(){
	
    var docwidth=document.all? truebody().scrollLeft+truebody().clientWidth : pageXOffset+window.innerWidth - offsetfrommouse[0]
	var docheight=document.all? Math.min(truebody().scrollHeight, truebody().clientHeight) : Math.min(window.innerHeight)
	document.onmousemove=followmouse; 
	document.getElementById(idek).style.display="block";

}

function followmouse(e){

	var xcoord=offsetfrommouse[0]
	var ycoord=offsetfrommouse[1]
	
	var docwidth=document.all? truebody().scrollLeft+truebody().clientWidth : pageXOffset+window.innerWidth-15
	var docheight=document.all? Math.min(truebody().scrollHeight, truebody().clientHeight) : Math.min(window.innerHeight)

	if (typeof e != "undefined"){
		if (docwidth - e.pageX <  2*offsetfrommouse[0]){
			xcoord = e.pageX - xcoord; // Move to the left side of the cursor
		} else {
			xcoord += e.pageX;
		}
		if (docheight - e.pageY < 2*offsetfrommouse[1]){
			ycoord += e.pageY - Math.max(0,(2*offsetfrommouse[1] + e.pageY - docheight - truebody().scrollTop));
		} else {
			ycoord += e.pageY;
		}

	} else if (typeof window.event != "undefined"){
		if (docwidth - event.clientX < 2*offsetfrommouse[0]){
			xcoord = event.clientX + truebody().scrollLeft - xcoord; // Move to the left side of the cursor
		} else {
			xcoord += truebody().scrollLeft+event.clientX
		}
		if (docheight - event.clientY < (2*offsetfrommouse[1])){
			ycoord += event.clientY + truebody().scrollTop - Math.max(0,(2*offsetfrommouse[1] + event.clientY - docheight));
		} else {
			ycoord += truebody().scrollTop + event.clientY;
		}
	}

	
	document.getElementById(idek).style.left=xcoord+"px"
	document.getElementById(idek).style.top=ycoord+"px"

}
/* <b style="font-size:12px;color:red; text-decoration:blink">&gt;</b>Opinie BEZ FORMULARZA 3.6, z foto (kopia) (projector - projector_opinions) [56197]*/

var x;

function showOpinion(id)
{
    element = document.getElementById(id);
    element.style.display='block';
}

function hideOpinion(id)
{
    element = document.getElementById(id);
    element.style.display='none';
}
/* <b style="font-size:13px;color:blue; text-decoration:blink;")">[ S ]</b>  Dodawanie opini do produktu 5.0 (projector - projector_opinions_add) [56194]*/

function drop_down(id) 
{
     document.getElementById(id).style.height = '150px';
}

function roll_back(id)

{
     document.getElementById(id).style.height = '';
}
/* <span style="color:blue;font-weight:bold;">ZALECANY</span> Karta produktu - Poleć znajomemu (projector - projector_suggestproduct) [56183]*/

function drop_down(id)
{
document.getElementById(id).style.height = '150px';
}

function roll_back(id)

{
 document.getElementById(id).style.height = '';
}
/* <span style="color:blue;font-weight:bold;">ZALECANY</span> Karta produktu - Zadaj pytanie (projector - projector_askforproduct) [56188]*/

function drop_down(id)
{
document.getElementById(id).style.height = '150px';
}

function roll_back(id)

{
 document.getElementById(id).style.height = '';
}
/*  Karta produktu - słownik opisu standard + cms (projector - projector_dictionary) [56513]*/

// SEARCH - DIALOGBOX
//////////////////////////////////////////////////////////////////////


var offsetfrommouse=[10,15]; //image x,y offsets from cursor position in pixels. Enter 0,0 for no offset
var timer;
var idek;


function truebody(){
return (!window.opera && document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
}


function hidetrail(){	
	document.getElementById(idek).style.display= "none";
	document.onmousemove="";
	document.getElementById(idek).style.left="-2000px";
	clearTimeout(timer);
}

function showtrail(id){
	idek = id;
	if (isNaN(timer)){show();}
	timer = setTimeout("show();",100);
}
function show(){
	
    var docwidth=document.all? truebody().scrollLeft+truebody().clientWidth : pageXOffset+window.innerWidth - offsetfrommouse[0]
	var docheight=document.all? Math.min(truebody().scrollHeight, truebody().clientHeight) : Math.min(window.innerHeight)
	document.onmousemove=followmouse; 
	document.getElementById(idek).style.display="block";

}

function followmouse(e){

	var xcoord=offsetfrommouse[0]
	var ycoord=offsetfrommouse[1]
	
	var docwidth=document.all? truebody().scrollLeft+truebody().clientWidth : pageXOffset+window.innerWidth-15
	var docheight=document.all? Math.min(truebody().scrollHeight, truebody().clientHeight) : Math.min(window.innerHeight)

	if (typeof e != "undefined"){
		if (docwidth - e.pageX <  2*offsetfrommouse[0]){
			xcoord = e.pageX - xcoord; // Move to the left side of the cursor
		} else {
			xcoord += e.pageX;
		}
		if (docheight - e.pageY < 2*offsetfrommouse[1]){
			ycoord += e.pageY - Math.max(0,(2*offsetfrommouse[1] + e.pageY - docheight - truebody().scrollTop));
		} else {
			ycoord += e.pageY;
		}

	} else if (typeof window.event != "undefined"){
		if (docwidth - event.clientX < 2*offsetfrommouse[0]){
			xcoord = event.clientX + truebody().scrollLeft - xcoord; // Move to the left side of the cursor
		} else {
			xcoord += truebody().scrollLeft+event.clientX
		}
		if (docheight - event.clientY < (2*offsetfrommouse[1])){
			ycoord += event.clientY + truebody().scrollTop - Math.max(0,(2*offsetfrommouse[1] + event.clientY - docheight));
		} else {
			ycoord += truebody().scrollTop + event.clientY;
		}
	}

	
	document.getElementById(idek).style.left=xcoord+"px"
	document.getElementById(idek).style.top=ycoord+"px"

}
