

/* =================================================== */

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

/* =================================================== */

/**
 * icValidator - Form validation with jQuery
 * 
 * @author 		Egor Stremousov
 * @copyright	ICsoft Company (http://www.icsoft.ru)
 * @version		0.6
 */

/*
//	For correct operation of this extension 
// 	is necessary to declare validation rules as
// 	the following property of window object:

	window.vData = {
    
		// Form element name 

		firstName: [

							[0] : {
								type	 : 'expression',
								errorMsg : 'This field is empty',
								regExpr	 : '/.../...'
								
							},
							
							[1] : {
								type	 : 'function',								
								funcName : 'MyFuncName'
							
							},
							
							[2] : {
								type	 : 'query',								
								url 	 : '/check.php?value='
							}
							
					[,
		lastName: [ 
					... 
					[,
		...
					
		
 	}
 
*/


(function(){
	
	
	var icRegExp = new RegExp();
	
	
	$.extend({
	
		// Init forms
		icInitValidationForms: function(context){
		
			var $this = this;
		
			$('FORM', context).each(function(){				

				$(this).bind('submit', $this._icOnSubmit);				
				$(this).bind('validate', $this._icOnSubmit);
					
				for(var i=0; i<this.elements.length; i++) {
					$(this.elements[ i ]).bind('blur', $this._icOnElementBlur);	
				}
				
			});
			
		},
		
		
		// Deinit forms
		icDeinitValidationForms: function(context){
			
			var $this = this;
			
			$('FORM', context).each(function(){
				
				$(this).unbind('submit', $this._icOnSubmit);
				$(this).unbind('validate', $this._icOnSubmit);
				
				for(var i=0; i<this.elements.length; i++) {
					$(this.elements[ i ]).unbind('blur', $this._icOnElementBlur);	
				}
				
			});
			
		},
		
		
		_icOnSubmit: function(e){
			
			var isValidForm = true;
			
			for(var i=0; i<this.elements.length; i++)
			{
				var isValidElement = $(this.elements[ i ]).trigger('blur').attr('isValid');
				
				if ( isValidElement == 'no' )
				{
					isValidForm = false;
				}	
			}
			
			$(this).attr('isValid', (isValidForm) ? 'yes' : 'no' );
			
			return isValidForm;
		},
		
		
		_icOnElementBlur: function(e){
				
			var $this = this;
									
			// Object 'window' must have property 'vData'
			// with data & rules for form elements validation
			// (see example in header of this file) 
			
			if (vData)
			{			
				var formName = (this.form) ? this.form.name : null;
				
				if (formName) {
				
					var rules = vData[ formName ];
					
					if (rules) {
					
						rules = rules[this.name];
						
						// If validation rules for this element is found
						if (rules) {
						
							for (var i in rules) {
								var rule = rules[i];
								if (rule && rule.type) {
								
									switch (rule.type) {
										case 'expression':
											
											// Property 'regExpr' should be as '/reg_expr/param'
											
											icRegExp.compile('^\/(.*)\/([^\/]*)$');
											
											var expr = icRegExp.exec(rule.regExpr);
											
											if (expr && expr[1]) {
												icRegExp.compile(expr[1], expr[2]);
												
												if (!icRegExp.test($(this).icGetSpecialValue())) {
													$(this).icShowValidationError(rule.errorMsg);
													return true;
												}
											}
											
											break;
											
										case 'function':
											
											// Function should be defined as property of 'window' object
											// and should return an NULL or error message
											
											var func = window[rule.funcName];
											if (func) {
												$(this).icHideValidationError();
												
												var result = func(this);
												
												if (result) {
													$(this).icShowValidationError(result);
												}
												
												return true;
											}
											
											break;
											
										case 'query':
											
											// Server script should be return follow structure:
											// json = { result : (true|false), message: (text) }
											
											$('#' + $(this).attr('id') + '_wait').show();
											
											var url = rule.url.toString() + $(this).val();
											
											$.getJSON(url, function(json){
											
												$('#' + $($this).attr('id') + '_wait').hide();
												
												if (json) {
													if (!json.result) {
														$($this).icShowValidationError(json.errorMsg);
													}
													else {
														$($this).icHideValidationError();
													}
												}
												
											});
											
											return true;
											
											break;
									}
									
								}
							}
							
						}
						
					}
					
				}	
					
			}
			
			// This is valid element
			$(this).icHideValidationError();
			
			return true;			
		}
		
	});
	
	
	
	
	$.fn.extend({
		
		icShowValidationError: function( errorMsg ){
			
			$(this).attr('isValid', 'no');
			
			var div = $('#' + $(this).attr('id') + '_error');
			
			div.text( errorMsg );
						
			div.show();
			
		},
		
		icHideValidationError: function(){
			
			$(this).attr('isValid', 'yes');
			
			var div = $('#' + $(this).attr('id') + '_error');
						
			div.hide();
			
		},
		
		icGetSpecialValue: function(){
			
			var value = this.val();
		
			if ( this.attr('type') == 'checkbox' && !this[0].checked)
			{
				value = '';
			}
			
			return value;
			
		}
		
	});
	
})(jQuery);

/* =================================================== */

 function ApplyRolloverAndSelected(context){
 	
	if (!context) context = window.document;
	
	var aPreLoadBase   = new Array();
 	var aPreLoadHover  = new Array();
 	var aPreLoadSelect = new Array();
 	
	var sTempSrc;
	
	$('IMG', context).each(function(index){
		
		if ($(this).hasClass('selectImage'))
		{	
			var src 	= $(this).attr('src');			
			var ftype 	= src.substring(src.lastIndexOf('.'), src.length);
			
			// Define image sources			
			var baseSrc	 	= src.replace('_selected', '');
			var hoverSrc 	= baseSrc.replace(ftype, '_over' + ftype);
			var selectSrc 	= baseSrc.replace(ftype, '_selected' + ftype);
			
   			// Remember sources
   			$(this).attr('baseSrc', baseSrc);
			$(this).attr('hoverSrc', hoverSrc );
			$(this).attr('selectSrc', selectSrc); 
   
   			// Preload images
   			aPreLoadBase[ index ] 		= new Image();
   			aPreLoadBase[ index ].src 	= baseSrc;
			
   			aPreLoadHover[ index ] 		= new Image();
   			aPreLoadHover[ index ].src 	= hoverSrc;
						
			aPreLoadSelect[ index ] 	= new Image();
			aPreLoadSelect[ index ].src = selectSrc;
						
			// Define event handlers
   			$(this).bind('mouseover', function() { 
			
				if ( $(this).attr('src') == $(this).attr('selectSrc') )
					return true;
					
			   	$(this).attr( 'src', $(this).attr('hoverSrc') );    
   			});
   
   			$(this).bind('mouseout', function() {
				
				if ( $(this).attr('src') == $(this).attr('selectSrc') )
					return true;
				
				$(this).attr( 'src', $(this).attr('baseSrc') );
   			});   		
		}
		
	});
	
 }
 
 
 function ApplyOnlyRollover(context){
 	
	if (!context) context = window.document;
	
 	var aPreLoadHover  = new Array(); 	
 	
	var sTempSrc;
	
	$('IMG', context).each(function(index){
		
		if ($(this).hasClass('hoverImage'))
		{	
			var src 		= $(this).attr('src1');			
			var ftype 		= src.substring(src.lastIndexOf('.'), src.length);
			var hoverSrc	= src.replace(ftype, '_over' + ftype);
			
   			// Remember sources
   			$(this).attr('baseSrc', src);
			$(this).attr('hoverSrc', hoverSrc );
		   
   			// Preload images
   			aPreLoadHover[ index ] 		= new Image();
   			aPreLoadHover[ index ].src 	= hoverSrc;
						
			// Define event handlers
   			$(this).bind('mouseover', function() { 
			   	$(this).attr( 'src', $(this).attr('hoverSrc') );
				
				if ($.browser.msie && parseInt($.browser.version) < 7 && $(this).attr('fix'))
					fixPNG(this);   
   			});
   
   			$(this).bind('mouseout', function() {
				$(this).attr( 'src', $(this).attr('baseSrc') );
				
				if ($.browser.msie && parseInt($.browser.version) < 7 && $(this).attr('fix'))
					fixPNG(this);
   			});   		
		}
		
	});
	
	
 }
 
$(function(){ 
 	ApplyOnlyRollover();
	ApplyRolloverAndSelected();
});

/* =================================================== */

/**
 * Utils
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author Egor Stremousov
 * @version 1.0, 2009-04-10
 * 
 */

/**
 * Add simbols to end of string
 * 
 * @param {String}
 *            text
 */
function appendForQuery(text)
{

	var s = "^(.*)?([\?])(.*)?$";
	var re = RegExp(s, "");
	var r = re.exec(text);
	if (!r)
	{
		text = text + '?';
	}
	else
	{
		if (r[3])
		{
			text = text + '&';
		};
	};

	return text;
}

/**
 * Remove first slash from string
 * 
 * @param {String}
 *            text
 */
function removeFirstSlash(text)
{
	if (text.substring(0, 1) == '/')
	{
		text = text.substring(1);
	}
	return text;
}

/**
 * Add slash simbol to begin of string
 * 
 * @param {String}
 *            text
 */
function addFirstSlash(text)
{
	if (text.substring(0, 1) != '/')
	{
		text = '/' + text
	}
	return text;
}

/**
 * Returns URI part for given full URL (if can't be loated, then empty string
 * being returned)
 * 
 * @param {String}
 *            text
 */
function getURI(fullURL)
{

	// Create regular expression object
	var s = "^((.*)://([^#^/]*)(/))(.*)?$";
	var re = RegExp(s, "");
	var rer = re.exec(fullURL);
	var text = '';

	// If param found
	if ((rer) && (rer[1])) text = rer[1];

	return text;
}

/**
 * LOCKERS ========================== ==========================
 */
window.lockers = [];
$(window).unload(function()
		{
			window.lockers = [];
		});

/**
 * Lock area
 */
function lock(link)
{

	// Get lockarea
	if (link)
	{
		var lockId = (link.lock) ? link.lock : $(link).attr('lock');
		var area = $('#lock' + lockId)[0];
	}

	if (!area)
	{
		area = $('#lock')[0];
		var left = 0;
		var top = 0;
		var size = getPageSize();
		var width = size[0];
		var height = size[1];
	}
	else
	{
		var parent = $(area).parent();
		var left = parent.offset().left;
		var top = parent.offset().top;
		var width = parent.width();
		var height = parent.height();
	}

	showLock(area, left, top, width, height);

	window.lockers.push(area);

	return area;
}

/**
 * Shww lock layout
 * 
 * @param {Object}
 *            lock
 * @param {Object}
 *            left
 * @param {Object}
 *            top
 * @param {Object}
 *            width
 * @param {Object}
 *            height
 */
function showLock(lock, left, top, width, height)
{
	$(lock).css('left', left);
	$(lock).css('top', top);
	$(lock).width(width);
	$(lock).height(height);

	// Hack for IE
	if ($.browser.msie)
	{
		var lockId = $(lock).attr('id');
		var frame = $('#frame-' + lockId)[0];
		if (frame)
		{
			$(frame).css('left', left);
			$(frame).css('top', top);
			$(frame).width(width);
			$(frame).height(height);

			$(frame).show();
		}
	}

	$(lock).show();
}

/**
 * Unlock area
 * 
 * @param {Object}
 *            area
 */
function unlock(link)
{

	var area = $('#lock' + $(link).attr('lock'))[0];

	if (!area)
	{

		// Hide all
		for (var i = window.lockers.length - 1; i >= 0; i--)
		{
			hideLock(window.lockers[i]);
			delete window.lockers[i];
		}
		window.lockers = [];

	}
	else
	{
		hideLock(area);
	}

	return area;
}

/**
 * Hide specified locker
 * 
 * @param {Object}
 *            lock
 */
function hideLock(lock)
{
	// Hack for IE
	if ($.browser.msie)
	{
		var lockId = $(lock).attr('id');
		var frame = $('#frame-' + lockId)[0];
		if (frame)
		{
			$(frame).hide();
		}
	}

	$(lock).hide();
}

/**
 * Define current page size
 */
function getPageSize()
{

	var xScroll, yScroll;

	if (window.innerHeight && window.scrollMaxY)
	{
		xScroll = window.innerWidth + window.scrollMaxX;
		yScroll = window.innerHeight + window.scrollMaxY;
	}
	else
		if (document.body.scrollHeight > document.body.offsetHeight)
		{ // all but Explorer Mac
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		}
		else
		{ // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and
			// Safari
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}

	var windowWidth, windowHeight;

	if (self.innerHeight)
	{ // all except Explorer
		if (document.documentElement.clientWidth)
		{
			windowWidth = document.documentElement.clientWidth;
		}
		else
		{
			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)
			{ // other Explorers
				windowWidth = document.body.clientWidth;
				windowHeight = document.body.clientHeight;
			}

	// for small pages with total height less then height of the viewport
	if (yScroll < windowHeight)
	{
		pageHeight = windowHeight;
	}
	else
	{
		pageHeight = yScroll;
	}

	// for small pages with total width less then width of the viewport
	if (xScroll < windowWidth)
	{
		pageWidth = xScroll;
	}
	else
	{
		pageWidth = windowWidth;
	}

	return [pageWidth, pageHeight];
}

/**
 * Cancel standard browser action
 * 
 * @param {Object}
 *            event
 */
function cancelStandardAction(event)
{
	event.returnValue = false;

	if (event.preventDefault) event.preventDefault();

	return false;
}

/**
 * Check variable on existing
 * 
 * @param {Object}
 *            variable
 */
function exist(variable)
{
	if (typeof variable == undefined) return false;
	else
		return true;
}

/**
 * Show dialog
 * 
 * @param {String}
 *            TITLE
 * @param {Object}
 *            BUTTONS
 */
function showDialog(TITLE, BUTTONS)
{
	var dialog = $('#dialog');

	if (dialog[0].isVisible) hideDialog();

	var okButton = $('#ok', dialog).hide();
	var cancelButton = $('#cancel', dialog).hide();

	// Set title
	$('#title', dialog).html(TITLE);

	// Set callback functions
	if (BUTTONS && BUTTONS.OK)
	{
		if (BUTTONS.OK.constructor == Function) okButton.click(BUTTONS.OK);
		okButton.show();
	}

	if (BUTTONS && BUTTONS.CANCEL)
	{
		if (BUTTONS.CANCEL.constructor == Function) cancelButton
				.click(BUTTONS.CANCEL);
		cancelButton.show();
	}

	// Set close action
	okButton.click(hideDialog);
	cancelButton.click(hideDialog);

	// Lock document
	lock();

	// Attach event
	$(window).bind('scroll', function()
	{

		// Algorithm of dialog position
		if (dialog[0].isVisible)
		{
			if (dialog.height() < $(window).height()) setCenterPositionByY(dialog);
		}

	});

	// Show dialog
	dialog.show();
	dialog[0].isVisible = true;

	setCenterPositionByY(dialog);

	$.icInitValidationForms(dialog);

	var input = $('input.text', dialog).eq(0);
	if (input[0])
	{
		selectAllTextInEdit(input[0]);
		input.focus();
	}

}

/**
 * St lement on center of screen
 * 
 * @param {Object}
 *            element
 */
function setCenterPositionByY(element)
{
	var wSize = $(window).height();
	var sSize = scrollTop();
	var eSize = element.height();
	var bSize = document.body.scrollHeight;

	var top = (wSize / 2) - (eSize / 2) + (sSize) - 15;

	// Rules
	if ((top + eSize) > bSize) top = bSize - eSize - 15;

	if (top < 0) top = 1;

	element.css('top', top);
}

/**
 * Return scroll value of document by Y
 */
function scrollTop()
{

	if (window.pageYOffset)
	{
		return window.pageYOffset;
	}
	else
	{
		if (document.documentElement)
		{
			return document.documentElement.scrollTop;
		}
		else
		{
			return document.body.scrollTop;
		}
	}

}

/**
 * Hide dialog
 */
function hideDialog()
{
	// Dettach event
	$(window).unbind('scroll');

	var dialog = $('#dialog');

	$.icDeinitValidationForms(dialog);

	$('#title', dialog).empty();
	$('#ok', dialog).hide().unbind();
	$('#cancel', dialog).hide().unbind();

	// Unlock document
	unlock();

	// Hide dialog
	dialog.hide();
	dialog[0].isVisible = null;
}

/**
 * Return form's field values as array
 * 
 * @param {DOM
 *            element} form
 */
function getFormData(form)
{
	var data = {};

	for (var i = 0; i < form.elements.length; i++)
	{
		if (form.elements[i].type == 'checkbox' && !form.elements[i].checked) continue;

		data[form.elements[i].name] = form.elements[i].value;
	}

	return data;
}

/**
 * Return parent element by tagName attribute
 * 
 * @param {DOM
 *            element} element
 * @param {String}
 *            parentTagName
 */
function getParentTag(element, parentTagName)
{
	var parent = element;
	while (parent != document)
	{
		parent = parent.parentNode;

		if (parent.tagName == parentTagName) return parent;
	}

	return window.document;

}

/**
 * Return parent element by ID
 * 
 * @param {Object}
 *            element
 * @param {Object}
 *            id
 */
function getParentId(element, id)
{
	var parent = element;
	while (parent != document)
	{
		parent = parent.parentNode;

		if (!parent) break;

		if (parent.id == id) return parent;
	}

	return null;
}

/**
 * Move caret to end of input element
 * 
 * @param {Object}
 *            inputObject
 */
function moveCaretToEnd(inputObject)
{
	if (inputObject.createTextRange)
	{
		var r = inputObject.createTextRange();
		r.collapse(false);
		r.select();
	}
	else
		if (inputObject.selectionStart)
		{
			var end = inputObject.value.length;
			inputObject.setSelectionRange(end, end);
			inputObject.focus();
		}
}

/*******************************************************************************
 * Select all text in edit field
 * 
 * @param {Object}
 *            inputObject
 */
function selectAllTextInEdit(inputObject)
{
	if (inputObject.createTextRange)
	{
		var r = inputObject.createTextRange();
		r.select();
	}
	else
	{
		var end = inputObject.value.length;
		inputObject.setSelectionRange(0, end);
	}
}

/**
 * Toggle image source
 * 
 * @param {Object}
 *            image
 */
function toggleImage(image)
{
	var temp = image.attr('src2');
	image.attr('src2', image.attr('src1'));
	image.attr('src1', temp);

	image.attr('src', temp);

	if ($.browser.msie && parseInt($.browser.version) < 7) fixPNG(image[0]);
}

/**
 * GetAbsoluteTop() - Function calculate absolute top position of element
 * 
 * Params: element : object Returns: integer - absolute top position of element
 */
function GetAbsoluteTop(element)
{

	/** * Used consecutive rise on DOM-structure and incrementing top value ** */

	// Set counter
	var t = 0;
	while (element)
	{
		// Increment counter ...
		t += parseInt(element.offsetTop);
		// ... and rise on DOM-structure up
		element = element.offsetParent;
	}
	return t;

}

/**
 * GetAbsoluteLeft() - Function calculate absolute left position of element
 * 
 * Params: element : object Returns: integer - absolute left position of element
 */
function GetAbsoluteLeft(element)
{

	/** * Used consecutive rise on DOM-structure and incrementing top value ** */

	// Set counter
	var l = 0;
	while (element)
	{
		// Increment counter ...
		l += parseInt(element.offsetLeft);
		// ... and rise on DOM-structure up
		element = element.offsetParent;
	}
	return l;

}

/**
 * Scroll document to top
 */
function scrollDocumentToTop()
{
	if (document.documentElement && document.documentElement.scrollTop)
	{
		document.documentElement.scrollTop = 0;
	}
	else
		if (document.body && document.body.scrollTop)
		{
			document.body.scrollTop = 0;
		}
}

/**
 * Save caret position
 * 
 * @param {Element}
 *            element
 */
function storeCaret(element)
{
	if (document.selection && document.selection.createRange)
	{
		element.caretPos = document.selection.createRange().duplicate();
	}
};

function getCaretPos(obj)
{
  obj.focus();
  
  if(obj.selectionStart) return obj.selectionStart;//Gecko
  else if (document.selection)//IE
  {
    var sel = document.selection.createRange();
    var clone = sel.duplicate();
    sel.collapse(true);
    clone.moveToElementText(obj);
    clone.setEndPoint('EndToEnd', sel);
    return clone.text.length;
  }
  
  return 0;
}

/**
 * Add tag-text to element content
 * 
 * @param {Element}
 *            element
 * @param {String}
 *            tagName
 * @param {String}
 *            tagAttributes
 * @param {Boolean}
 *            shortMode
 */
function wrapTextInTag(element, tagName, tagAttributes, shortMode)
{	
	element.focus();
	
	var scrollTop = element.scrollTop;

	if (tagAttributes)
	{
		var first = '<' + tagName + ' ' + tagAttributes + '>';
	}
	else
	{
		var first = '<' + tagName + '>';
	}

	var last = '</' + tagName + '>';
	if (shortMode)
	{
		var last = '';
	}

	if (element && element.caretPos)
	{	
		element.caretPos.text = first + element.caretPos.text + last;
	}
	else
		if (element && element.selectionStart + 1 && element.selectionEnd + 1)
		{	
							
			var selectText  = element.value.substring(element.selectionStart, element.selectionEnd);
			var text 		= first + selectText + last;
			var pos  		= getCaretPos(element) + (text ? text.length : 0);
			
			element.value = element.value.substring(0, element.selectionStart)
					+ text
					+ element.value.substring(element.selectionEnd,	element.value.length);							
			
			element.setSelectionRange(pos, pos);
			  			
		}
		else
			if (element)
			{
				element.value += text;
			}

	element.scrollTop = scrollTop;
}

/**
 * Add search engine
 */
function addSearchEngine()
{
	if ((typeof window.external == "object")
			&& ((typeof window.external.AddSearchProvider == "unknown") || (typeof window.external.AddSearchProvider == "function")))
	{		
		window.external.AddSearchProvider("http://smartzplace.com/opensearch.xml");		
	}
	else
	{
		alert("You will need a browser which supports OpenSearch to install this plugin.");
	}
}

/**
 * Print Add Search Engine Button in HTML
 */ 
function showAddSEButton()
{
	if ($.browser.msie && parseInt($.browser.version) > 6)
	{
		var version = 'IE ' + parseInt($.browser.version);
	}
	
	if ($.browser.mozilla)
	{		
		var version = 'Firefox';
	}
	
	if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1)
	{
		var version = 'Chrome';
	}
	
	if (version)
		$('span', $('#add-search-engine').show()).html( version );
}



/* =================================================== */

/*
unFocus.EventManager, version 1.0 (2007/09/11)
Copyright: 2005-2007, Kevin Newman (http://www.unfocus.com/Projects/)

This file is part of unFocus.History Keeper.

unFocus.History Keeper is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

unFocus.History Keeper is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
// Package: unFocus.Utilities
// make sure faux-namespace is available before adding to it
if (!window.unFocus) var unFocus = {};

/** Class: EventManager
 * Provides the interface and functionality to a Subscriber/Subscriber Pattern.
 * 
 **/
/*
Constructor: EventManager
   The Constructor (Prototype) function.

Parameters:
   [type1 [, type2 [, etc.]]] - Optionally sets up an empty array for each named event.
*/
unFocus.EventManager = function() {
   this._listeners = {};
   for (var i = 0; i < arguments.length; i++) {
      this._listeners[arguments[i]] = [];
   }
};

unFocus.EventManager.prototype = {
   /*
   Method: addEventListener
      Adds an event listener to the specified type.

   Parameters:
      $name    - The event name.
      $listener   - The function to be called when the event fires.
   */
   addEventListener: function($name, $listener) {
      // check that listener is not in list
      for (var i = 0; i < this._listeners[$name].length; i++)
         if (this._listeners[$name][i] == $listener) return;
      // add listener to appropriate list
      this._listeners[$name].push($listener);
   },
   /*
   Method: removeEventListener
      Removes an event listener.
   
   Parameters:
      $name    - The event name.
      $listener   - The function to be removed.
   */
   removeEventListener: function($name, $listener) {
      // search for the listener method
      for (var i = 0; i < this._listeners[$name].length; i++) {
         if (this._listeners[$name][i] == $listener) {
            this._listeners.splice(i,1);
            return;
         }
      }
   },
   /* Method: notifyListeners
      Notifies the listeners of an event.
   
   Parameters:
      $name - The name of event to fire.
      $data - The object to pass to the subscribed method (the Event Object).
   */
   notifyListeners: function($name, $data) {
      for (var i = 0; i < this._listeners[$name].length; i++)
         this._listeners[$name][i]($data);
   }
};




/*
unFocus.History, version 2.0 (beta 1) (2007/09/11)
Copyright: 2005-2007, Kevin Newman (http://www.unfocus.com/Projects/)

This file is part of unFocus.History Keeper.

unFocus.History Keeper is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

unFocus.History Keeper is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/*
	Class: unFocus.History
		A singleton with subscriber interface (<unFocus.EventManager>) 
		that keeps a history and provides deep links for Flash and AJAX apps
*/
unFocus.History = (function() {

// use a closure to avoid poluting the global scope, and to discourage reinstantiation (like a singleton)
function Keeper() {
	// bool: initialize - whether or not the class has been initialized
	var _this = this,
		// set the poll interval here.
		_pollInterval = 3000, _intervalID,
		// get the initial Hash state
		_currentHash;

	/*
	method: _getHash
		A private method that gets the Hash from the location.hash property.
	 
	returns:
		a string containing the current hash from the url
	*/
	var _getHash = function() {
		
      var ua = navigator.userAgent;
      
      if (/MSIE/.test(ua)) 
      {
         var index = ua.indexOf('MSIE');
         var MSIE  = parseFloat( ua.substring(index + 5) );         
      }
      
      if ( (MSIE && MSIE<7) || (window.opera && parseInt(window.opera.version())<10)) 
      {
		var result = /\?([^\?\#]*)$/.exec( location.href );
      	var search = (result && result[0]) ? result[0] : '';		
			
		return location.hash.substring(1) + search;
	  }
		
		return location.hash.substring(1);
	};
	// get initial hash
	_currentHash = _getHash();
	
	/*
	method: _setHash
		A private method that sets the Hash on the location string (the current url).
	*/
	var _setHash = function($newHash) {
		window.location.hash = $newHash;
	};
	
	/*
	method: _watchHash
		A private method that is called every n miliseconds (<_pollInterval>) to check if the hash has changed.
		This is the primary Hash change detection method for most browsers. It doesn't work to detect the hash
		change in IE 5.5+ or various other browsers. Workarounds like the iframe method are used for those 
		browsers (IE 5.0 will use an anchor creation hack).
	*/
	function _watchHash() {
		var $newHash = _getHash();
		if (_currentHash != $newHash) {
			_currentHash = $newHash;
			_this.notifyListeners("historyChange", $newHash);
		}
	}
	// set the interval
	if (setInterval) _intervalID = setInterval(_watchHash, _pollInterval);
	
	/* 
	Method: _createAnchor
		Various browsers may need an achor to be present in the dom for the hash to actually be set,
		so we add one every time a history entry is made. This has a side effect in many browsers, 
		where if the scroll position of the page is changed, in between history states, this causes
		most browsers to remember the position! It's a bonus.
	*/
	function _createAnchor($newHash) {
		if (!_checkAnchorExists($newHash)) {
			var $anchor;
			if (/MSIE/.test(navigator.userAgent) && !window.opera)
				$anchor = document.createElement('<a name="'+$newHash+'">'+$newHash+"</a>");
			else
				$anchor = document.createElement("a");
			$anchor.setAttribute("name", $newHash);
			with ($anchor.style) {
				position = "absolute";
				display = "block";
				top = getScrollY()+"px";
				left = getScrollX()+"px";
			}
			//$anchor.style.display = 'none';
			//$anchor.innerHTML = $newHash;
			document.body.insertBefore($anchor,document.body.firstChild);
			//document.body.appendChild($anchor);
		}
	}
	// simplified function contributed by Micah Goulart
	function _checkAnchorExists($name) {
		if (document.getElementsByName($name).length > 0)
			return true;
	}
	// Keeps IE 5.0 from scrolling to the top every time a new history is entered.
	// Also retains the scroll position in the history (doesn't seem to work on IE 5.5+).
	if (typeof self.pageYOffset == "number") {
		function getScrollY() {
			return self.pageYOffset;
		}
	} else if (document.documentElement && document.documentElement.scrollTop) {
		function getScrollY() {
			return document.documentElement.scrollTop;
		}
	} else if (document.body) {
		function getScrollY() {
			return document.body.scrollTop;
		}
	}
	// clone getScrollY to getScrollX
	eval(String(getScrollY).toString().replace(/Top/g,"Left").replace(/Y/g,"X"));
	
	/*
	method: getCurrentBookmark
		A public method to retrieve the current history string
	
	returns:
		The current History Hash
	*/
	_this.getCurrent = function() {
		return _currentHash;
	};
	
	/*
	method: addHistory
		A public method to add a new history, and set the deep link. This method should be given a string.
		It does no serialization.
	
	returns:
		Boolean - true if supported and set, false if not
	*/
	function addHistory($newHash) {      
		if (_currentHash != $newHash) {
			_createAnchor($newHash);
			_currentHash = $newHash;
			_setHash($newHash);
			_this.notifyListeners("historyChange",$newHash);
		}
		return true;
	}
	_this.addHistory = function($newHash) { // adds history and bookmark hash	  
		_createAnchor(_currentHash);
		// replace with slimmer versions...
		_this.addHistory = addHistory;
		// ...do first call
		return _this.addHistory($newHash);
	};

	/**
	 * These are the platform specific override methods. Since some platforms (IE 5.5+, Safari)
	 * require almost completely different techniques to create history entries, browser detection is
	 * used and the appropriate method is created. The bugs these fixes address are very tied to the
	 * specific implementations of these browsers, and not necessarily the underlying html engines.
	 * Sometimes, bugs related to history management can be tied even to a specific skin in browsers
	 * like Opera.
	 */
	// Safari 2.04 and less (and WebKit less than 420 - these hacks are not needed by the most recent nightlies)
	// :TODO: consider whether this aught to check for Safari or WebKit - is this a safar problem, or a does it
	// happen in other WebKit based software? OmniWeb (WebKit 420+) seems to work, though there's a sync issue.
	if (/WebKit\/\d+/.test(navigator.appVersion) && navigator.appVersion.match(/WebKit\/(\d+)/)[1] < 420) {
		// this will hold the old history states, since they can't be reliably taken from the location object
		var _unFocusHistoryLength = history.length,
			_historyStates = {}, _form,
			_recentlyAdded = false;
		
		// Setting the hash directly in Safari seems to cause odd content refresh behavior.
		// We'll use a form to submit to a #hash location instead. I'm assuming this works,
		// since I saw it done this way in SwfAddress (gotta give credit where credit it due ;-) ).
		function _createSafariSetHashForm() {
			_form = document.createElement("form");
			_form.id = "unFocusHistoryForm";
			_form.method = "get";
			document.body.insertBefore(_form,document.body.firstChild);
		}
		
		// override the old _setHash method to use the new form
		_setHash = function($newHash) {
			_historyStates[_unFocusHistoryLength] = $newHash;
			_form.action = "#" + _getHash();
			_form.submit();
		};
		
		// override the old _getHash method, since Safari doesn't update location.hash (fixed in nightlies)
		_getHash = function() {
			return _historyStates[_unFocusHistoryLength];
		};
		
		// set initial history entry
		_historyStates[_unFocusHistoryLength] = _currentHash;
		
		function addHistorySafari($newHash) {
			if (_currentHash != $newHash) {
				_createAnchor($newHash);
				_currentHash = $newHash;
				_unFocusHistoryLength = history.length+1;
				_recentlyAdded = true;
				_setHash($newHash);
				_this.notifyListeners("historyChange",$newHash);
				_recentlyAdded = false;
			}
			return true;
		}
		
		// provide alternative addHistory
		_this.addHistory = function($newHash) { // adds history and bookmark hash
			// on first call, make an anchor for the root history entry
			_createAnchor(_currentHash);
			// setup the form fix
			_createSafariSetHashForm();
			
			// replace with slimmer version...
			// :TODO: rethink this - it's adding an extra scope to the chain, which might
			// actually cost more at runtime than a simple if statement. Can this be done
			// without adding to the scope chain? The replaced scope holds no values. Does
			// it keep it's place in the scope chain?
			_this.addHistory = addHistorySafari;
			
			// ...do first call
			return _this.addHistory($newHash);
		};
		function _watchHistoryLength() {
			if (!_recentlyAdded) {
				var _historyLength = history.length;
				if (_historyLength != _unFocusHistoryLength) {
					_unFocusHistoryLength = _historyLength;
					
					var $newHash = _getHash();
					if (_currentHash != $newHash) {
						_currentHash = $newHash;
						_this.notifyListeners("historyChange", $newHash);
					}
				}
			}
		};
		
		// since it doesn't work, might as well cancel the location.hash check
		clearInterval(_intervalID);
		// watch the history.length prop for changes instead
		_intervalID = setInterval(_watchHistoryLength, _pollInterval);
		
	// IE 5.5+ Windows
	} else if (typeof ActiveXObject != "undefined" && window.print && 
			   !window.opera && navigator.userAgent.match(/MSIE (\d\.\d)/)[1] >= 5.5) {
		/* iframe references */
		var _historyFrameObj, _historyFrameRef;
		
		/*
		method: _createHistoryFrame
			
			This is for IE only for now.
		*/
		function _createHistoryFrame() {
			var $historyFrameName = "unFocusHistoryFrame";
			_historyFrameObj = document.createElement("iframe");
			_historyFrameObj.setAttribute("name", $historyFrameName);
			_historyFrameObj.setAttribute("id", $historyFrameName);
			// :NOTE: _Very_ experimental
			_historyFrameObj.setAttribute("src", 'javascript:;');
			_historyFrameObj.style.position = "absolute";
			_historyFrameObj.style.top = "-900px";
			document.body.insertBefore(_historyFrameObj,document.body.firstChild);
			// get reference to the frame from frames array (needed for document.open)
			// :NOTE: there might be an issue with this according to quirksmode.org
			// http://www.quirksmode.org/js/iframe.html
			_historyFrameRef = frames[$historyFrameName];
			
			// add base history entry         
			_createHistoryHTML(_currentHash, true);
		}
		
		/*
		method: _createHistoryHTML
			This is an alternative to <_setHistoryHTML> that is used by IE (and others if I can get it to work).
			This method will create the history page completely in memory, with no need to download a new file
			from the server.
		*/
		function _createHistoryHTML($newHash) {         
			with (_historyFrameRef.document) {
				open("text/html");
				write("<html><head></head><body onl",
					'oad="parent.unFocus.History._updateFromHistory(\''+$newHash+'\');">',
					$newHash+"</body></html>");
				close();
			}
		}
		
		/*
		method: _updateFromHistory
			A private method that is meant to be called only from HistoryFrame.html.
			It is not meant to be used by an end user even though it is accessable as public.
		*/
			// hides the first call to the method, and sets up the real method for the rest of the calls
		function updateFromHistory($hash) {
			_currentHash = $hash;
			_this.notifyListeners("historyChange", $hash);
		}
		_this._updateFromHistory = function() {
			_this._updateFromHistory = updateFromHistory;
		};
		//if (navigator.userAgent.match(/MSIE (\d\.\d)/)[1] < 5.5) {
			function addHistoryIE($newHash) { // adds history and bookmark hash
				if (_currentHash != $newHash) {
					// IE will create an entry if there is an achor on the page, but it
					// does not allow you to detect the state change, so we skip inserting an Anchor
					_currentHash = $newHash;
					// sets hash and notifies listeners
					_createHistoryHTML($newHash);
				}
				return true;
			};
			_this.addHistory = function($newHash) {            
				// do initialization stuff on first call
				_createHistoryFrame();
				
				// replace this function with a slimmer one on first call
				_this.addHistory = addHistoryIE;
				// call the first call
				return _this.addHistory($newHash);
			};
			// anonymouse method - subscribe to self to update the hash when the history is updated
			_this.addEventListener("historyChange", function($hash) { _setHash($hash) });
		//} else { /* IE 5.0 */ }
	
	}
}
Keeper.prototype = new unFocus.EventManager("historyChange");

return new Keeper();

})();

/* =================================================== */

// Simple Set Clipboard System
// Author: Joseph Huckaby

var ZeroClipboard = {

	version : "1.0.4",
	clients : {}, // registered upload clients on page, indexed by id
	moviePath : 'Public/js/lib/ZeroClipboard.swf', // URL to movie
	nextId : 1, // ID of next movie

	$ : function(thingy)
	{
		// simple DOM lookup utility function
		if (typeof(thingy) == 'string')
			thingy = document.getElementById(thingy);
		if (!thingy.addClass)
		{
			// extend element with a few useful methods
			thingy.hide = function()
			{
				this.style.display = 'none';
			};
			thingy.show = function()
			{
				this.style.display = '';
			};
			thingy.addClass = function(name)
			{
				this.removeClass(name);
				this.className += ' ' + name;
			};
			thingy.removeClass = function(name)
			{
				this.className = this.className.replace(
						new RegExp("\\s*" + name + "\\s*"), " ").replace(
						/^\s+/, '').replace(/\s+$/, '');
			};
			thingy.hasClass = function(name)
			{
				return !!this.className
						.match(new RegExp("\\s*" + name + "\\s*"));
			}
		}
		return thingy;
	},

	setMoviePath : function(path)
	{
		// set path to ZeroClipboard.swf
		this.moviePath = path;
	},

	dispatch : function(id, eventName, args)
	{
		// receive event from flash movie, send to client
		var client = this.clients[id];
		if (client)
		{
			client.receiveEvent(eventName, args);
		}
	},

	register : function(id, client)
	{
		// register new client to receive events
		this.clients[id] = client;
	},

	getDOMObjectPosition : function(obj)
	{
		// get absolute coordinates for dom element
		var info = {
			left : 0,
			top : 0,
			width : obj.width ? obj.width : obj.offsetWidth,
			height : obj.height ? obj.height : obj.offsetHeight
		};

		while (obj)
		{
			info.left += obj.offsetLeft;
			info.top += obj.offsetTop;
			obj = obj.offsetParent;
		}

		return info;
	},

	Client : function(elem)
	{
		// constructor for new simple upload client
		this.handlers = {};

		// unique ID
		this.id = ZeroClipboard.nextId++;
		this.movieId = 'ZeroClipboardMovie_' + this.id;

		// register client with singleton to receive flash events
		ZeroClipboard.register(this.id, this);

		// create movie
		if (elem)
			this.glue(elem);
	}
};

ZeroClipboard.Client.prototype = {

	id : 0, // unique ID for us
	ready : false, // whether movie is ready to receive events or not
	movie : null, // reference to movie object
	clipText : '', // text to copy to clipboard
	handCursorEnabled : true, // whether to show hand cursor, or default
	// pointer cursor
	cssEffects : true, // enable CSS mouse effects on dom container
	handlers : null, // user event handlers

	glue : function(elem)
	{
		// glue to DOM element
		// elem can be ID or actual DOM element object
		this.domElement = ZeroClipboard.$(elem);

		// float just above object, or zIndex 99 if dom element isn't set
		var zIndex = 99;
		if (this.domElement.style.zIndex)
		{
			zIndex = parseInt(this.domElement.style.zIndex) + 1;
		}

		// find X/Y position of domElement
		var box = ZeroClipboard.getDOMObjectPosition(this.domElement);

		// create floating DIV above element
		this.div = document.createElement('div');
		var style = this.div.style;
		style.position = 'absolute';
		style.left = '' + box.left + 'px';
		style.top = '' + box.top + 'px';
		style.width = '' + box.width + 'px';
		style.height = '' + box.height + 'px';
		style.zIndex = zIndex;

		// style.backgroundColor = '#f00'; // debug

		var body = document.getElementsByTagName('body')[0];
		body.appendChild(this.div);

		this.div.innerHTML = this.getHTML(box.width, box.height);
	},

	getHTML : function(width, height)
	{
		// return HTML for movie
		var html = '';
		var flashvars = 'id=' + this.id + '&width=' + width + '&height='
				+ height;

		if (navigator.userAgent.match(/MSIE/))
		{
			// IE gets an OBJECT tag
			var protocol = location.href.match(/^https/i)
					? 'https://'
					: 'http://';
			html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'
					+ protocol
					+ 'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'
					+ width
					+ '" height="'
					+ height
					+ '" id="'
					+ this.movieId
					+ '" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'
					+ ZeroClipboard.moviePath
					+ '" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'
					+ flashvars
					+ '"/><param name="wmode" value="transparent"/></object>';
		}
		else
		{
			// all other browsers get an EMBED tag
			html += '<embed id="'
					+ this.movieId
					+ '" src="'
					+ ZeroClipboard.moviePath
					+ '" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'
					+ width
					+ '" height="'
					+ height
					+ '" name="'
					+ this.movieId
					+ '" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'
					+ flashvars + '" wmode="transparent" />';
		}
		return html;
	},

	hide : function()
	{
		// temporarily hide floater offscreen
		if (this.div)
		{
			this.div.style.left = '-2000px';
		}
	},

	show : function()
	{
		// show ourselves after a call to hide()
		this.reposition();
	},

	destroy : function()
	{
		// destroy control and floater
		if (this.domElement && this.div)
		{
			this.hide();
			this.div.innerHTML = '';

			var body = document.getElementsByTagName('body')[0];
			try
			{
				body.removeChild(this.div);
			}
			catch (e)
			{
				;
			}

			this.domElement = null;
			this.div = null;
		}
	},

	reposition : function(elem)
	{
		// reposition our floating div, optionally to new container
		// warning: container CANNOT change size, only position
		if (elem)
		{
			this.domElement = ZeroClipboard.$(elem);
			if (!this.domElement)
				this.hide();
		}

		if (this.domElement && this.div)
		{
			var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
			var style = this.div.style;
			style.left = '' + box.left + 'px';
			style.top = '' + box.top + 'px';
			
			style.width = '' + box.width + 'px';
			style.height = '' + box.height + 'px';
			
			$('#'+this.movieId, this.div)
				.attr('height', box.height)
				.attr('width', box.width);
		}
	},

	setText : function(newText)
	{
		// set text to be copied to clipboard
		this.clipText = newText;
		if (this.ready)
			this.movie.setText(newText);
	},

	addEventListener : function(eventName, func)
	{
		// add user event listener for event
		// event types: load, queueStart, fileStart, fileComplete,
		// queueComplete, progress, error, cancel
		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
		if (!this.handlers[eventName])
			this.handlers[eventName] = [];
		this.handlers[eventName].push(func);
	},

	setHandCursor : function(enabled)
	{
		// enable hand cursor (true), or default arrow cursor (false)
		this.handCursorEnabled = enabled;
		if (this.ready)
			this.movie.setHandCursor(enabled);
	},

	setCSSEffects : function(enabled)
	{
		// enable or disable CSS effects on DOM container
		this.cssEffects = !!enabled;
	},

	receiveEvent : function(eventName, args)
	{
		// receive event from flash
		eventName = eventName.toString().toLowerCase().replace(/^on/, '');

		// special behavior for certain events
		switch (eventName) {
			case 'load' :
				// movie claims it is ready, but in IE this isn't always the
				// case...
				// bug fix: Cannot extend EMBED DOM elements in Firefox, must
				// use traditional function
				this.movie = document.getElementById(this.movieId);
				if (!this.movie)
				{
					var self = this;
					setTimeout(function()
							{
								self.receiveEvent('load', null);
							}, 1);
					return;
				}

				// firefox on pc needs a "kick" in order to set these in certain
				// cases
				if (!this.ready && navigator.userAgent.match(/Firefox/)
						&& navigator.userAgent.match(/Windows/))
				{
					var self = this;
					setTimeout(function()
							{
								self.receiveEvent('load', null);
							}, 100);
					this.ready = true;
					return;
				}

				this.ready = true;
				this.movie.setText(this.clipText);
				this.movie.setHandCursor(this.handCursorEnabled);
				break;

			case 'mouseover' :
				if (this.domElement && this.cssEffects)
				{
					this.domElement.addClass('hover');
					if (this.recoverActive)
						this.domElement.addClass('active');
				}
				break;

			case 'mouseout' :
				if (this.domElement && this.cssEffects)
				{
					this.recoverActive = false;
					if (this.domElement.hasClass('active'))
					{
						this.domElement.removeClass('active');
						this.recoverActive = true;
					}
					this.domElement.removeClass('hover');
				}
				break;

			case 'mousedown' :
				if (this.domElement && this.cssEffects)
				{
					this.domElement.addClass('active');
				}
				break;

			case 'mouseup' :
				if (this.domElement && this.cssEffects)
				{
					this.domElement.removeClass('active');
					this.recoverActive = false;
				}
				break;
		} // switch eventName

		if (this.handlers[eventName])
		{
			for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++)
			{
				var func = this.handlers[eventName][idx];

				if (typeof(func) == 'function')
				{
					// actual function reference
					func(this, args);
				}
				else if ((typeof(func) == 'object') && (func.length == 2))
				{
					// PHP style object + method, i.e. [myObject,
					// 'myMethod']
					func[0][func[1]](this, args);
				}
				else if (typeof(func) == 'string')
				{
					// name of function
					window[func](this, args);
				}
			} // foreach event handler defined
		} // user defined handler for event
	}

};

var clip = null;

/**
 * Initialize HTML element as Copy Button
 * 
 * @param {String} buttonId
 */
function initCopyButtons()
{
    // setup single ZeroClipboard object for all our elements
	clip = new ZeroClipboard.Client();
	clip.setHandCursor( true );
	
	// assign a common mouseover function for all elements using jQuery
	$('div.copy-link').mouseover( function() {
		
		// set the clip text to our innerHTML
		clip.setText( $(this).attr('clipboard') );
		
		// reposition the movie over our element
		// or create it if this is the first time
		if (clip.div) {
			clip.receiveEvent('mouseout', null);
			clip.reposition(this);
		}
		else clip.glue(this);
		
		// gotta force these events due to the Flash movie
		// moving all around.  This insures the CSS effects
		// are properly updated.
		clip.receiveEvent('mouseover', null);
		
	} );
}


/* =================================================== */

var vData = {"registration":{"firstName":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{0,255}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"lastName":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{0,255}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"organization":[{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{2,})?$\/","errorMsg":"Too few"}],"city":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"stateProvince":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{2,})|(N\\\/A)$\/i","errorMsg":"Too few"}],"zipPostalCode":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{4,})|(N\\\/A)$\/i","errorMsg":"Too few"}],"homePhone":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{0,50}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^\\+?[\\d\\-. ()]{6,}$\/","errorMsg":"Incorrect phone syntax"}],"workPhone":[{"type":"expression","regExpr":"\/^.{0,50}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(\\+?[\\d\\-. ()]{6,})?$\/","errorMsg":"Incorrect phone syntax"}],"mobilePhone":[{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(\\+?[\\d\\-. ()]{6,})?$\/","errorMsg":"Incorrect phone syntax"}],"fax":[{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(\\+?[\\d\\-. ()]{6,})?$\/","errorMsg":"Incorrect phone syntax"}],"url":[{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^((http:\\\/\\\/)?[\\w\\-]+(\\.[\\w\\-]+)*)?$\/","errorMsg":"Incorrect URL syntax"}],"addressUSA":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,180}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.*box.*)|(0*[1-9]+.{2,})$\/","errorMsg":"Incorrect USA address"}],"address":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,180}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}],"streetAddress":[{"type":"function","funcName":"CheckAddressByCountry"}],"addressLine2":[{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"}],"whereHeard":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"readTerms":[{"type":"expression","regExpr":"\/^(.{1,})?$\/","errorMsg":"Must be checked"}],"binAddressUSA":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,180}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.*box.*)|(0*[1-9]+.{2,})$\/","errorMsg":"Incorrect USA address"}],"binAddress":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,180}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}],"binStreetAddress":[{"type":"function","funcName":"CheckBinAddressByCountry"}],"binCity":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"binStateProvince":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{2,})|(N\\\/A)$\/i","errorMsg":"Too few"}],"binZipPostalCode":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,50}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{4,})|(N\\\/A)$\/i","errorMsg":"Too few"}],"cardHolderName":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.+( .+){1,}$\/","errorMsg":"Too few words"}],"cardBank":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"cardNumber":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{1,}$\/","errorMsg":"Too few"}],"cardCVV2":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}],"loginSyntax":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,255}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^[\\w\\-]+(\\.[\\w\\-]+)*@[\\w\\-]+(\\.[\\w\\-]+)*$\/","errorMsg":"Incorrect e-mail syntax"}],"login":[{"type":"query","url":"https:\/\/www.smartzplace.com:443\/validation\/registration\/login?value="}],"nickname":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{0,50}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"password":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}],"passwordRepeat":[{"type":"function","funcName":"CheckPasswordRepeat"}],"code":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{0,32}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{32,}$\/","errorMsg":"Too few"}],"email":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,255}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^[\\w\\-]+(\\.[\\w\\-]+)*@[\\w\\-]+(\\.[\\w\\-]+)*$\/","errorMsg":"Incorrect e-mail syntax"}]},"passwordRecovery":{"login":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,255}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^[\\w\\-]+(\\.[\\w\\-]+)*@[\\w\\-]+(\\.[\\w\\-]+)*$\/","errorMsg":"Incorrect e-mail syntax"}],"password":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}],"passwordRepeat":[{"type":"function","funcName":"CheckPasswordRepeat"}]},"login":{"login":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,255}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^[\\w\\-]+(\\.[\\w\\-]+)*@[\\w\\-]+(\\.[\\w\\-]+)*$\/","errorMsg":"Incorrect e-mail syntax"}]},"billingInfo":{"addressUSA":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,180}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.*box.*)|(0*[1-9]+.{2,})$\/","errorMsg":"Incorrect USA address"}],"address":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,180}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}],"streetAddress":[{"type":"function","funcName":"CheckAddressByCountry"}],"city":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"stateProvince":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{2,})|(N\\\/A)$\/i","errorMsg":"Too few"}],"zipPostalCode":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,50}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{4,})|(N\\\/A)$\/i","errorMsg":"Too few"}],"cardHolderName":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.+( .+){1,}$\/","errorMsg":"Too few words"}],"cardBank":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"cardNumber":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{1,}$\/","errorMsg":"Too few"}],"cardCVV2":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}]},"shippingInfo":{"addressUSA":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,250}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.*box.*)|(0*[1-9]+.{2,})$\/","errorMsg":"Incorrect USA address"}],"address":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,250}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}],"streetAddress":[{"type":"function","funcName":"CheckAddressByCountry"}],"addressLine2":[{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,250}$\/","errorMsg":"Too long"}],"city":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,200}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"stateProvince":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{2,})|(N\\\/A)$\/i","errorMsg":"Too few"}],"zipPostalCode":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{4,})|(N\\\/A)$\/i","errorMsg":"Too few"}],"fullName":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,250}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.+( .+){1,}$\/","errorMsg":"Too few words"}],"organization":[{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,80}$\/","errorMsg":"Too long"}]},"contactInfo":{"firstName":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{0,255}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"lastName":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{0,255}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"organization":[{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{2,})?$\/","errorMsg":"Too few"}],"city":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"stateProvince":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{2,})|(N\\\/A)$\/i","errorMsg":"Too few"}],"zipPostalCode":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{4,})|(N\\\/A)$\/i","errorMsg":"Too few"}],"homePhone":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{0,50}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^\\+?[\\d\\-. ()]{6,}$\/","errorMsg":"Incorrect phone syntax"}],"workPhone":[{"type":"expression","regExpr":"\/^.{0,50}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(\\+?[\\d\\-. ()]{6,})?$\/","errorMsg":"Incorrect phone syntax"}],"mobilePhone":[{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(\\+?[\\d\\-. ()]{6,})?$\/","errorMsg":"Incorrect phone syntax"}],"fax":[{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(\\+?[\\d\\-. ()]{6,})?$\/","errorMsg":"Incorrect phone syntax"}],"url":[{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^((http:\\\/\\\/)?[\\w\\-]+(\\.[\\w\\-]+)*)?$\/","errorMsg":"Incorrect URL syntax"}],"addressUSA":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,180}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.*box.*)|(0*[1-9]+.{2,})$\/","errorMsg":"Incorrect USA address"}],"address":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,180}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}],"streetAddress":[{"type":"function","funcName":"CheckAddressByCountry"}],"addressLine2":[{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"}],"whereHeard":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{0,100}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"readTerms":[{"type":"expression","regExpr":"\/^(.{1,})?$\/","errorMsg":"Must be checked"}],"binAddressUSA":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,180}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.*box.*)|(0*[1-9]+.{2,})$\/","errorMsg":"Incorrect USA address"}],"binAddress":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,180}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}],"binStreetAddress":[{"type":"function","funcName":"CheckBinAddressByCountry"}],"binCity":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"binStateProvince":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{2,})|(N\\\/A)$\/i","errorMsg":"Too few"}],"binZipPostalCode":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,50}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^(.{4,})|(N\\\/A)$\/i","errorMsg":"Too few"}],"cardHolderName":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.+( .+){1,}$\/","errorMsg":"Too few words"}],"cardBank":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,150}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"cardNumber":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{1,}$\/","errorMsg":"Too few"}],"cardCVV2":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}],"loginSyntax":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,255}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^[\\w\\-]+(\\.[\\w\\-]+)*@[\\w\\-]+(\\.[\\w\\-]+)*$\/","errorMsg":"Incorrect e-mail syntax"}],"login":[{"type":"query","url":"https:\/\/www.smartzplace.com:443\/validation\/registration\/login?value="}],"nickname":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{0,50}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{2,}$\/","errorMsg":"Too few"}],"password":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}],"passwordRepeat":[{"type":"function","funcName":"CheckPasswordRepeat"}],"code":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{0,32}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^.{32,}$\/","errorMsg":"Too few"}],"email":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\x00-\\x7F]*$\/","errorMsg":"Inadmissible characters"},{"type":"expression","regExpr":"\/^.{0,255}$\/","errorMsg":"Too long"},{"type":"expression","regExpr":"\/^[\\w\\-]+(\\.[\\w\\-]+)*@[\\w\\-]+(\\.[\\w\\-]+)*$\/","errorMsg":"Incorrect e-mail syntax"}]},"changePassword":{"passwordCurrent":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."}],"password":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^.{3,}$\/","errorMsg":"Too few"}],"passwordRepeat":[{"type":"function","funcName":"CheckPasswordRepeat"}]},"checkout":{"count":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\d]*$\/","errorMsg":"Incorrect number syntax"},{"type":"function","funcName":"CheckIntegerValue"}]},"order":{"newQty":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\d]*$\/","errorMsg":"Incorrect number syntax"},{"type":"function","funcName":"CheckIntegerValue"}]},"cart":{"count":[{"type":"expression","regExpr":"\/^.+$\/","errorMsg":"This field is required and can not be blank."},{"type":"expression","regExpr":"\/^[\\d]*$\/","errorMsg":"Incorrect number syntax"},{"type":"function","funcName":"CheckIntegerValue"}]}};

/* =================================================== */



function CheckAddressByCountry( field )
{
	if (!vData)
		return null;
	
	var data = vData[ field.form.name ][ field.name ];
	
	if ( $('#country').val() == 'United States' )
	{		
		vData[ field.form.name ][ field.name ] = vData[ field.form.name ]['addressUSA'];
		$(field).trigger('blur');
	}
	else
	{		
		vData[ field.form.name ][ field.name ] = vData[ field.form.name ]['address'];
		$(field).trigger('blur');
	}
	
	vData[ field.form.name ][ field.name ] = data;
	return null;
}

function CheckBinAddressByCountry( field )
{
	if (!vData)
		return null;
	
	var data = vData[ field.form.name ][ field.name ];
	
	if ( $('#binCountry').val() == 'United States' )
	{		
		vData[ field.form.name ][ field.name ] = vData[ field.form.name ]['binAddressUSA'];		
		$(field).trigger('blur');
	}
	else
	{
		vData[ field.form.name ][ field.name ] = vData[ field.form.name ]['binAddress'];		
		$(field).trigger('blur');
	}
	
	vData[ field.form.name ][ field.name ] = data;
	return null;
}

function CheckPasswordRepeat( field )
{
	if (field.value != $('#password').val() )
		return 'The second password is not equal to the first';
	else	
		return null;
}

function CheckIntegerValue( field )
{	
	var value = parseInt( field.value );
	var max	  = parseInt( $(field).attr('maxValue') );
	var min	  = parseInt( $(field).attr('minValue') );
	
	if (value < min)
	{
		return 'Too small value (might be not less than ' + min + ')';
	}
	else if (value > max)
	{
		return 'Too big value (might be not greater than ' + max + ')';
	}
	else
		return null;
}


/* =================================================== */

/**
 * Billing info editor
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function BillingEditor(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
BillingEditor.prototype.create = function(){
		
};
 
/**
 * Class destructor
 */
BillingEditor.prototype.destroy = function(){	
	
	BillingEditor = null;	
}; 

/** 
 * Open the editor for adding
 * @param {DOM element} button
 */
BillingEditor.prototype.showAddDialog = function(button){
	
	// Lock document
	lock( button );
	
	// Load editor form
	var URL  = button.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		BillingEditor.showAddDialog(button);
	});
	
	var request = $.post( URL, function( data ){
		
		if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request, '_myacc'))
		{
			// Add record to table	
			var table 		= $('#my-account-content TABLE.data');		
			var columnCount = table.attr('columns');
			var beforeRow 	= $('TR:last', table).prev();
			
			$('<tr id="addBillingFormRow"></tr>')
				.insertBefore( beforeRow )
				.append('<td class="first"></td>')
				.append('<td id="addBillingForm" colspan="'+ columnCount +'"></td>')		
				.append('<td class="last"></td>');
				
			// Hide "Add new" button
			beforeRow.hide();	
	
	
			var container = $('#addBillingForm');
		
			// Before content change
			$.icDeinitValidationForms( container );
			
			// Set content to container
			container.html( data );
			
			// After content change
			$.icInitValidationForms( container );
			
			// Unlock document
			unlock( button );
		}		
	});	
	
}

/**
 * Cancel and close "Add" form
 * @param {DOM element} button
 */
BillingEditor.prototype.cancelAdding = function(button){
	
	// Lock document
	lock( button );
	
	// Remove row with "Add" form
	var row = $('#addBillingFormRow'); 	
	$.icDeinitValidationForms( row );	
	row.remove();
	
	// Show "Add new" button
	var table = $('#my-account-content TABLE.data');
	$('TR:last', table).prev().show();
		
	// Unlock document
	unlock( button );
}

/**
 * Try add new billing info
 * @param {DOM element} button
 */
BillingEditor.prototype.tryAdd = function(button){
	
	var form		= $('#addBillingForm form');
	var isValidForm = ( form.trigger('validate').attr('isValid') == 'yes' ) ? true : false;
	
	if (isValidForm)
	{
		// Get form data
		var formData = getFormData( form[0] );
			
		// Do adding
		var URL  = form.attr('action');
			URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
		// Lock document
		lock( button );
		
		// Add request to tracing of ajax error
		ErrorManager.traceAjaxError(function(){			
			BillingEditor.tryAdd(button);	
		});
		
		var request = $.post( URL, formData, function( data ){
			
			if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request, '_myacc'))
			{		
				// Unlock document
				unlock( button );
				
				var container = $('#addBillingForm');
	
				// Before content change
				$.icDeinitValidationForms( container );
		
				// Set content to container
				container.html( data );
		
				// After content change
				$.icInitValidationForms( container );
						
			}		
		});
		
	}
	
}

/** 
 * Open the editor for editing
 * @param {DOM element} button
 */
BillingEditor.prototype.showEditDialog = function(button){
		
	// Load editor form
	var URL  = button.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
	
	// Lock document
	lock( button );
	
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		BillingEditor.showEditDialog(button);	
	});
	
	var request = $.post( URL, function( data ){
		
		if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request, '_myacc'))
		{		
		
			// Add record to table	
			var table 		= $('#my-account-content TABLE.data');		
			var columnCount = table.attr('columns');
			var beforeRow 	= $(getParentTag( button, 'TR'));	
			
			$('<tr id="editBillingFormRow"></tr>')
				.insertBefore( beforeRow )
				.append('<td class="first"></td>')
				.append('<td id="editBillingForm" colspan="'+ columnCount +'"></td>')		
				.append('<td class="last"></td>');
				
			// Hide "Add new" button
			beforeRow.hide();	
				
			
			var container = $('#editBillingForm');
		
			// Before content change
			$.icDeinitValidationForms( container );
			
			// Set content to container
			container.html( data );
			
			// After content change
			$.icInitValidationForms( container );
			
			// Unlock document
			unlock( button );	
		}		
	});	
}

/**
 * Cancel and close "Edit" form
 * @param {DOM element} button
 */
BillingEditor.prototype.cancelEditing = function(button){
	
	// Lock document
	lock( button );
	
	// Remove row with "Edit" form
	var row  = $('#editBillingFormRow');
	var next = row.next(); 	
	$.icDeinitValidationForms( row );	
	row.remove();
	
	// Show next hiden row
	next.show();
		
	// Unlock document
	unlock( button );
}

/**
 * Try save billing info
 * @param {DOM element} button
 */
BillingEditor.prototype.tryEdit = function(button){
	
	var form		= $('#editBillingForm form');
	var isValidForm = ( form.trigger('validate').attr('isValid') == 'yes' ) ? true : false;
	
	if (isValidForm)
	{
		// Get form data
		var formData = getFormData( form[0] );
			
		// Do adding
		var URL  = form.attr('action');
			URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
		// Lock document
		lock( button );
		
		// Add request to tracing of ajax error
		ErrorManager.traceAjaxError(function(){			
			BillingEditor.tryEdit(button);	
		});
		
		var request = $.post( URL, formData, function( data ){
			
			if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request, '_myacc'))
			{			
				// Unlock document
				unlock( button );
						
				var container = $('#editBillingForm');
	
				// Before content change
				$.icDeinitValidationForms( container );
		
				// Set content to container
				container.html( data );
		
				// After content change
				$.icInitValidationForms( container );
			
			}		
		});
		
	}
	
}

/**
 * Show comfirm dialog
 * @param {DOM element} button
 */
BillingEditor.prototype.showDeleteDialog = function(button){
	
	// Lock document
	lock(button);
	
	// Get dialog data and show
	var URL  = button.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		BillingEditor.showDeleteDialog(button);	
	});
	
	var request = $.post( URL, function( data ){
		
		if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request, '_myacc')) {
		
			// Unlock document
			unlock(button);
							
			var TITLE = data;
			showDialog(TITLE);
		}
		
	});	
}

/**
 * Try remove billing info
 * @param {DOM element} button
 */
BillingEditor.prototype.tryDelete = function(button){
	
	// Send 'Delete' request
	var URL  = $(button.form).attr('action');
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
	
	var formData = getFormData( button.form );
	
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		BillingEditor.tryDelete(button);	
	});
	
	var request = $.post( URL, formData, function( data ){
		
		if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request, '_myacc')) {
			
			// Close dialog
			hideDialog();			
			
		}
		
	});
	
}

/**
 * Single instance of BillingEditor class 
 */
BillingEditor = new BillingEditor();

/* =================================================== */

/**
 * Shipping info editor
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function ShippingEditor(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
ShippingEditor.prototype.create = function(){
	
};
 
/**
 * Class destructor
 */
ShippingEditor.prototype.destroy = function(){	
	
	ShippingEditor = null;
}; 

/** 
 * Open the editor for adding
 * @param {DOM element} button
 */
ShippingEditor.prototype.showAddDialog = function(button){
	
	// Lock document
	lock( button );
		
	// Load editor form
	var URL  = button.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		ShippingEditor.showAddDialog(button);	
	});
	
	var request = $.post( URL, function( data ){
		
		if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request, '_myacc'))
		{	
		
			// Add record to table	
			var table 		= $('#my-account-content TABLE.data');		
			var columnCount = table.attr('columns');
			var beforeRow 	= $('TR:last', table).prev();
			
			$('<tr id="addShippingFormRow"></tr>')
				.insertBefore( beforeRow )
				.append('<td class="first"></td>')
				.append('<td id="addShippingForm" colspan="'+ columnCount +'"></td>')		
				.append('<td class="last"></td>');
				
			// Hide "Add new" button
			beforeRow.hide();	
				
			var container = $('#addShippingForm');
		
			// Before content change
			$.icDeinitValidationForms( container );
			
			// Set content to container
			container.html( data );
			
			// After content change
			$.icInitValidationForms( container );
			
			// Unlock document
			unlock( button );
		}		
	});	
}


/**
 * Cancel and close "Add" form
 * @param {DOM element} button
 */
ShippingEditor.prototype.cancelAdding = function( button ){
	
	// Lock document
	lock( button );
	
	// Remove row with "Add" form
	var row = $('#addShippingFormRow'); 	
	$.icDeinitValidationForms( row );	
	row.remove();
	
	// Show "Add new" button
	var table = $('#my-account-content TABLE.data');
	$('TR:last', table).prev().show();
		
	// Unlock document
	unlock( button );
}

/**
 * Try add new shipping info
 * @param {DOM element} button
 */
ShippingEditor.prototype.tryAdd = function(button){
	
	var form		= $('#addShippingForm form');
	var isValidForm = ( form.trigger('validate').attr('isValid') == 'yes' ) ? true : false;
	
	if (isValidForm)
	{
		// Get form data
		var formData = getFormData( form[0] );
			
		// Do adding
		var URL  = form.attr('action');
			URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
		// Lock document
		lock( button );
		
		// Add request to tracing of ajax error
		ErrorManager.traceAjaxError(function(){			
			ShippingEditor.tryAdd(button);	
		});
		
		var request = $.post( URL, formData, function( data ){
			
			if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request, '_myacc'))
			{	
				var container = $('#addShippingForm');
	
				// Before content change
				$.icDeinitValidationForms( container );
		
				// Set content to container
				container.html( data );
		
				// After content change
				$.icInitValidationForms( container );
								
				// Unlock document
				unlock( button );
			}		
		});
		
	}
	
}

/** 
 * Open the editor for editing
 * @param {DOM element} button
 */
ShippingEditor.prototype.showEditDialog = function(button){
	
	// Lock document
	lock( button );
	
	// Load editor form
	var URL  = button.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		ShippingEditor.showEditDialog(button);	
	});
	
	var request = $.post( URL, function( data ){
		
		if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request, '_myacc'))
		{							
			// Add record to table	
			var table 		= $('#my-account-content TABLE.data');		
			var columnCount = table.attr('columns');
			var beforeRow 	= $(getParentTag( button, 'TR'));	
			
			$('<tr id="editShippingFormRow"></tr>')
				.insertBefore( beforeRow )
				.append('<td class="first"></td>')
				.append('<td id="editShippingForm" colspan="'+ columnCount +'"></td>')		
				.append('<td class="last"></td>');
				
			// Hide "Add new" button
			beforeRow.hide();
				
			var container = $('#editShippingForm');
		
			// Before content change
			$.icDeinitValidationForms( container );
			
			// Set content to container
			container.html( data );
			
			// After content change
			$.icInitValidationForms( container );
			
			// Unlock document
			unlock( button );	
		}		
	});	
}

/**
 * Cancel and close "Edit" form
 * @param {DOM element} button
 */
ShippingEditor.prototype.cancelEditing = function(button){
	
	// Lock document
	lock( button );
	
	// Remove row with "Edit" form
	var row  = $('#editShippingFormRow');
	var next = row.next(); 	
	$.icDeinitValidationForms( row );	
	row.remove();
	
	// Show next hiden row
	next.show();
		
	// Unlock document
	unlock( button );
}

/**
 * Try save shipping info
 * @param {DOM element} button
 */
ShippingEditor.prototype.tryEdit = function(button){
	
	var form		= $('#editShippingForm form');
	var isValidForm = ( form.trigger('validate').attr('isValid') == 'yes' ) ? true : false;
	
	if (isValidForm)
	{
		// Get form data
		var formData = getFormData( form[0] );
			
		// Do adding
		var URL  = form.attr('action');
			URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
		// Lock document
		lock( button );
		
		// Add request to tracing of ajax error
		ErrorManager.traceAjaxError(function(){			
			ShippingEditor.tryEdit(button);	
		});
		
		var request = $.post( URL, formData, function( data ){
			
			if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request, '_myacc'))
			{	
				var container = $('#editShippingForm');
	
				// Before content change
				$.icDeinitValidationForms( container );
		
				// Set content to container
				container.html( data );
		
				// After content change
				$.icInitValidationForms( container );
				
				// Unlock document
				unlock( button );	
			}		
		});
		
	}
	
}


/**
 * Show comfirm dialog
 * @param {DOM element} button
 */
ShippingEditor.prototype.showDeleteDialog = function(button){
	
	// Get dialog data and show
	var URL  = button.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		ShippingEditor.showDeleteDialog(button);	
	});
	
	lock( button );
	
	var request = $.post( URL, function( data ){
		
		if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request, '_myacc')) {
				
			unlock( button );
							
			var TITLE = data;
			showDialog(TITLE);
		}
		
	});	
}

/**
 * Try remove shipping info
 * @param {DOM element} button
 */
ShippingEditor.prototype.tryDelete = function(button){
	
	// Send 'Delete' request
	var URL  = $(button.form).attr('action');
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
	
	var formData = getFormData( button.form );
	
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		ShippingEditor.tryDelete(button);	
	});
	
	var request = $.post( URL, formData, function( data ){
		
		if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request, '_myacc')) {
			
			// Close dialog
			hideDialog();
			
		}
		
	});
	
}


/**
 * Single instance of ShippingEditor class 
 */
ShippingEditor = new ShippingEditor();

/* =================================================== */

/**
 * Contact info editor
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function ContactEditor(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
ContactEditor.prototype.create = function(){
	
};
 
/**
 * Class destructor
 */
ContactEditor.prototype.destroy = function(){	
	
	ContactEditor = null;
}; 

/**
 * Save contact information
 */
ContactEditor.prototype.trySaveData = function(button){
	
	var form		= $('#form form');
	var isValidForm = ( form.trigger('validate').attr('isValid') == 'yes' ) ? true : false;
	
	if (isValidForm)
	{
		// Get form data
		var formData = getFormData( form[0] );
			
		// Do adding
		var URL  = form.attr('action');
			URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
		// Lock document
		lock( button );
		
		// Add request to tracing of ajax error
		ErrorManager.traceAjaxError(function(){			
			ContactEditor.trySaveData(button);	
		});
		
		var request = $.post( URL, formData, function( data ){
			
			if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request, '_myacc'))
			{		
				// Unlock document
				unlock( button );
				
				var container = $('#form');
	
				// Before content change
				$.icDeinitValidationForms( container );
		
				// Set content to container
				container.html( data );
		
				// After content change
				$.icInitValidationForms( container );
			}		
		});
		
	}
}

/**
 * Single instance of ContactEditor class 
 */
ContactEditor = new ContactEditor();

/* =================================================== */

/**
 * Change password editor
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function PasswordEditor(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
PasswordEditor.prototype.create = function(){
		
};
 
/**
 * Class destructor
 */
PasswordEditor.prototype.destroy = function(){	
	
	PasswordEditor = null;	
}; 


/**
 * Save contact information
 */
PasswordEditor.prototype.trySaveData = function( button ){
	
	var form		= $('#form form');
	var isValidForm = ( form.trigger('validate').attr('isValid') == 'yes' ) ? true : false;
	
	if (isValidForm)
	{
		// Get form data
		var formData = getFormData( form[0] );
			
		// Do adding
		var URL  = form.attr('action');
			URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
		// Lock document
		lock( button );
		
		// Add request to tracing of ajax error
		ErrorManager.traceAjaxError(function(){			
			PasswordEditor.trySaveData(button);	
		});
		
		var request = $.post( URL, formData, function( data ){
			
			if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request, '_myacc'))
			{		
				// Unlock document
				unlock( button );
				
				var container = $('#form');
	
				// Before content change
				$.icDeinitValidationForms( container );
		
				// Set content to container
				container.html( data );
		
				// After content change
				$.icInitValidationForms( container );
			}		
		});
		
	}	
	
}


/**
 * Single instance of PasswordEditor class 
 */
PasswordEditor = new PasswordEditor();

/* =================================================== */

/**
 * Checkout editor
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function CheckoutEditor(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
CheckoutEditor.prototype.create = function(){
		
};
 
/**
 * Class destructor
 */
CheckoutEditor.prototype.destroy = function(){	
	
	CheckoutEditor = null;
}; 

/**
 * Show add/edit/delete dialog
 * @param {DOM element} button
 */
CheckoutEditor.prototype.showDialog = function(button){
	
	var URL  = button.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
	
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		CheckoutEditor.showDialog(button);	
	});
	
	lock( button );
	
	var request = $.post( URL, function( data ){
		
		if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request, '_check')) {
			
			unlock( button );
							
			var TITLE = data;
			showDialog(TITLE);
		}
		
	});
	
}

/**
 * Send form width add/edit/delete data
 * @param {DOM element} button
 */
CheckoutEditor.prototype.applyDialogForm = function(button){
	
	var isValidForm = ( $(button.form).trigger('validate').attr('isValid') == 'yes' ) ? true : false;
	
	if (isValidForm) {
	
		var URL  = $(button.form).attr('action');
			URL += (/\?/.test(URL)) ? '&ajax=1' : '?ajax=1';
		
		var formData = getFormData(button.form);
		
		// Add request to tracing of ajax error
		ErrorManager.traceAjaxError(function(){			
			CheckoutEditor.applyDialogForm(button);	
		});
		
		hideDialog();
		
		lock( button );
		
		var request = $.post(URL, formData, function(data){
		
			if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request, '_check')) {
							
				unlock( button );
													
				var TITLE = data;
				showDialog(TITLE);
								
			}
			
		});
		
	}
	
}

/**
 * Show panel with delivery details
 */
CheckoutEditor.prototype.showDeliveryForm = function( selectedDeliveryType ){
	
	// Show rows in item table with delivery and total costs 
	$('#delivery-cost').show();
	$('#total-cost').show();
	
	// Change content of "delivery block"
	$('#returnButton').hide();
	
	$('#delivery-page-1').hide();
	$('#delivery-page-2').show();
	
	// Move the combo box to new place
	$('#delivery-type-holder').empty();
	$('#delivery-type-holder').append( $('#delivery-select') );
	
	// Set item index in combo if needed
	if (selectedDeliveryType)
	{
		$('#delivery-select').val( selectedDeliveryType );
	} 
	
	// Emulate on change event of delivery combo box
	this.changeDeliveryType(); 
	
}


/**
 * Change content of delivery form
 */
CheckoutEditor.prototype.changeDeliveryType = function(){
		
	var selectedOption = $('#delivery-select option:selected');
	
	window.selectedDeliveryType = selectedOption.val();
	
	// Show costs	
	$('.d-cost').html( selectedOption.attr('cost') ); 
	$('.t-cost').html( selectedOption.attr('total-cost') );
	
	// Show blocks with delivery params
	(selectedOption.attr('hold-and-mix') == 1) ? $('#hold-and-mix').show() : $('#hold-and-mix').hide();
	(selectedOption.attr('only-hold') == 1) ? $('#only-hold').show() : $('#only-hold').hide();
	(selectedOption.attr('only-mix') == 1) ? $('#only-mix').show() : $('#only-mix').hide();
	(selectedOption.attr('no-hold-and-no-mix') == 1) ? $('#no-hold-and-no-mix').show() : $('#no-hold-and-no-mix').hide();
	
	// Select param by default	
	if ($('#d-type-' + selectedOption.attr('default-hm') )[0])
		$('#d-type-' + selectedOption.attr('default-hm') )[0].checked = true;
	
}

/**
 * Send order info
 * @param {Object} event
 * @param {Object} button
 */
CheckoutEditor.prototype.processOrder = function(event, button){
		
	var URL  = $(button.form).attr('action');
		URL += (/\?/.test(URL)) ? '&ajax=1' : '?ajax=1';
	
	var formData 		= getFormData(button.form);
	formData.holdMix 	= $('input[name=holdMix]:checked').val();
	formData.final		= true;
	
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		CheckoutEditor.processOrder(event, button);	
	});
	
	lock( button );
	
	var request = $.post(URL, formData, function(data){
	
		if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request, '_check')) {
			
		}
		
	});
		
		
	cancelStandardAction( event );
}


/**
 * Single instance of CheckoutEditor class 
 */
CheckoutEditor = new CheckoutEditor();

/* =================================================== */

/**
 * Currency Editor
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-05-08
 */

function CurrencyEditor(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
CurrencyEditor.prototype.create = function(){
	
	this.backURL = '/';
		
};
 
/**
 * Class destructor
 */
CurrencyEditor.prototype.destroy = function(){	
		
	CurrencyManager = null;	
}; 

/**
 * Open change currency dialog
 * @param {DOM element} link
 */
CurrencyEditor.prototype.openDialog = function(link){	
	
	// Remember current location
	this.backURL = NavigationManager.params;

	// Get link of html-resource
	var URL  = link.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
	
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		CurrencyEditor.openDialog(link);	
	});
	
	// Get content
	var request = $.post( URL, function( data ){
		
		if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request, '_myacc')) {
					
			// Show dialog with getted content
			var TITLE = data;
			showDialog(TITLE);
		}
		
	});
	
};
	
/**
 * Apply choosed currency
 * @param {DOM element} button
 */
CurrencyEditor.prototype.applyCurrency = function(button){	

	var $this = this;

	// Compose destination URL
	var URL  = $(button.form).attr('action');
		URL += (/\?/.test(URL)) ? '&ajax=1' : '?ajax=1';
	
	// Get value from list of radio buttons
	var selectedValue = $('input[name=currencyType]:checked').val();
	
	var formData = { currencyType : selectedValue };
	
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		CurrencyEditor.applyCurrency(button);	
	});
	
	// Send request	
	var request = $.post(URL, formData, function(data){
	
		// Process possible error
		if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request)) {
						
			// Go to speciefed URL...
			var currency = request.getResponseHeader('new-currency');
			if (currency) {
				
				$('#currency-value').html( currency );
				
				hideDialog();
				
				NavigationManager.changeLocation({ href: $this.backURL, lock: '_mini' });
				
			}
			else {
			
				// ... or show dialog again
			
				var TITLE = data;
				showDialog(TITLE);
			}
			
		}
		
	});
	
};
	
/**
 * Single instance of CurrencyEditor class
 */
var CurrencyEditor = new CurrencyEditor();

/* =================================================== */

/**
 * Order info editor
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function OrderEditor(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
OrderEditor.prototype.create = function(){
		
};
 
/**
 * Class destructor
 */
OrderEditor.prototype.destroy = function(){	
	
	OrderEditor = null;	
}; 

/**
 * Show add/edit/delete dialog
 * @param {DOM element} button
 */
OrderEditor.prototype.showDialog = function(button){
	
	var URL  = button.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
	
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		OrderEditor.showDialog(button);	
	});
	
	lock(button);
	
	var request = $.post( URL, function( data ){
		
		if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request, '_myacc')) {
				
			unlock(button);
							
			var TITLE = data;
			showDialog(TITLE);
		}
		
	});
	
}

/**
 * Send form width add/edit/delete data
 * @param {DOM element} button
 */
OrderEditor.prototype.applyDialogForm = function(button){
	
	var isValidForm = ( $(button.form).trigger('validate').attr('isValid') == 'yes' ) ? true : false;
	
	if (isValidForm) {
	
		var URL  = $(button.form).attr('action');
			URL += (/\?/.test(URL)) ? '&ajax=1' : '?ajax=1';
		
		var formData = getFormData(button.form);
		
		// Add request to tracing of ajax error
		ErrorManager.traceAjaxError(function(){			
			OrderEditor.applyDialogForm(button);	
		});
		
		var request = $.post(URL, formData, function(data){
		
			if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request, '_myacc')) {
				
				var TITLE = data;
				showDialog(TITLE);
								
			}
			
		});
		
	}	
}

/**
 * Single instance of OrderEditor class 
 */
OrderEditor = new OrderEditor();

/* =================================================== */

/**
 * Cart editor
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function CartEditor(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
CartEditor.prototype.create = function(){
		
};
 
/**
 * Class destructor
 */
CartEditor.prototype.destroy = function(){	
	
	CartEditor = null;
}; 

/**
 * Show add/edit/delete dialog
 * @param {DOM element} button
 */
CartEditor.prototype.showDialog = function(button){
	
	var URL  = button.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
	
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		CartEditor.showDialog(button);	
	});
	
	lock(button);
	
	var request = $.post( URL, function( data ){
		
		if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request, '_cart')) {
	
			unlock(button);
							
			var TITLE = data;
			showDialog(TITLE);
		}
		
	});
	
}

/**
 * Send form width add/edit/delete data
 * @param {DOM element} button
 */
CartEditor.prototype.applyDialogForm = function(button){
	
	var isValidForm = ( $(button.form).trigger('validate').attr('isValid') == 'yes' ) ? true : false;
	
	if (isValidForm) {
	
		var URL  = $(button.form).attr('action');
			URL += (/\?/.test(URL)) ? '&ajax=1' : '?ajax=1';
		
		var formData = getFormData(button.form);
		
		// Add request to tracing of ajax error
		ErrorManager.traceAjaxError(function(){			
			CartEditor.applyDialogForm(button);	
		});
		
		var request = $.post(URL, formData, function(data){
		
			if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request, '_cart')) {
							
				var TITLE = data;
				showDialog(TITLE);
				
			}
			
		});
		
	}
	
}


/**
 * Single instance of CartEditor class 
 */
CartEditor = new CartEditor();

/* =================================================== */

/**
 * Wishlist editor
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function WishlistEditor(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
WishlistEditor.prototype.create = function(){
		
};
 
/**
 * Class destructor
 */
WishlistEditor.prototype.destroy = function(){	
	
	CartEditor = null;
}; 

/**
 * Show add/edit/delete dialog
 * @param {DOM element} button
 */
WishlistEditor.prototype.showDialog = function(button){
	
	var URL  = button.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		WishlistEditor.showDialog(button);	
	});
	
	var request = $.post( URL, function( data ){
		
		if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request)) {
							
			var TITLE = data;
			showDialog(TITLE);
		}
		
	});
	
}

/**
 * Send form width add/edit/delete data
 * @param {DOM element} button
 */
WishlistEditor.prototype.applyDialogForm = function(button){
	
	var isValidForm = ( $(button.form).trigger('validate').attr('isValid') == 'yes' ) ? true : false;
	
	if (isValidForm) {
	
		var URL  = $(button.form).attr('action');
			URL += (/\?/.test(URL)) ? '&ajax=1' : '?ajax=1';
		
		var formData = getFormData(button.form);
		
		// Add request to tracing of ajax error
		ErrorManager.traceAjaxError(function(){			
			WishlistEditor.applyDialogForm(button);	
		});
		
		var request = $.post(URL, formData, function(data){
		
			if (ErrorManager.processRequest(request) && NavigationManager.checkRedirect(request)) {
				
				var TITLE = data;
				showDialog(TITLE);
				
			}
			
		});
		
	}
	
}


/**
 * Single instance of WishlistEditor class 
 */
WishlistEditor = new WishlistEditor();

/* =================================================== */

/**
 * Help editor
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function HelpEditor(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
HelpEditor.prototype.create = function(){
		
};
 
/**
 * Class destructor
 */
HelpEditor.prototype.destroy = function(){	
	
	HelpEditor = null;
}; 


/**
 * Change delivery cost value by country
 * @param {DOM element} button
 */
HelpEditor.prototype.changeCountryCost = function(){
	
	var selectedOption = $('#country-select option:selected');
	
	var countryName = selectedOption.val();  
	var countryBase = selectedOption.attr('baseCost');
	var countryPer	= selectedOption.attr('perCost');
	
	$('#country-name').html( countryName );
	
	if (countryBase != 'N/A') {
		$('#country-cost').html( '<span class="price">' + countryBase + '</span> Base + <span class="price">' + countryPer + '</span> Per Item' );
	} else {
		$('#country-cost').html( 'Delivery cost is not available.' );
	}
	
}


/**
 * Single instance of HelpEditor class 
 */
HelpEditor = new HelpEditor();

/* =================================================== */

/**
 * User Settings editor
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function UserSettingsEditor(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
UserSettingsEditor.prototype.create = function(){
	
};
 
/**
 * Class destructor
 */
UserSettingsEditor.prototype.destroy = function(){	
	
	UserSettings = null;
}; 

/**
 * Save settings
 */
UserSettingsEditor.prototype.trySaveData = function(button){
	
	var form		= $('#form form');
	var isValidForm = ( form.trigger('validate').attr('isValid') == 'yes' ) ? true : false;
	
	if (isValidForm)
	{
		// Get form data
		var formData = getFormData( form[0] );
			
		// Do adding
		var URL  = form.attr('action');
			URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
		
		// Lock document
		lock( button );
		
		// Add request to tracing of ajax error
		ErrorManager.traceAjaxError(function(){			
			UserSettingsEditor.trySaveData(button);	
		});
		
		var request = $.post( URL, formData, function( data ){
			
			if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request, '_myacc'))
			{		
				// Unlock document
				unlock( button );
								
				var container = $('#form');
	
				// Before content change
				$.icDeinitValidationForms( container );
		
				// Set content to container
				container.html( data );
		
				// After content change
				$.icInitValidationForms( container );
			}		
		});
		
	}
}

/**
 * Single instance of UserSettingsEditor class 
 */
UserSettingsEditor = new UserSettingsEditor();

/* =================================================== */

/**
 * Error manager
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function ErrorManager(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
ErrorManager.prototype.create = function(){
		
	if ( $('#fatal-error')[0] )
	{
		this.inError = true;
	}
};
 
/**
 * Class destructor
 */
ErrorManager.prototype.destroy = function(){	
		
	NavigationManager = null;	
}; 

/**
 * Check request on error
 * @param {Object} request
 */
ErrorManager.prototype.processRequest = function(request){	

	var error  = request.getResponseHeader('smartz-error');
	var debug  = request.getResponseHeader('smartz-debug');
	var dialog = $('#dialog')[0];
	var $this  = this; 
	
	if (error)
	{
		if (!this.inError) {
		
			var TITLE = request.responseText;
			var URL = request.getResponseHeader('ajax-location');
			var BUTTONS = {
			
				OK: function(event) {
				
					$this.inError = false;
					
					$(dialog).removeClass('dialog-debug');
					
					NavigationManager.changeLocation({
						href: URL
					});
				}
				
			};
			
			this.inError = true;
			
			if (debug)
				$(dialog).addClass('dialog-debug');
			
			showDialog(TITLE, BUTTONS);
			
		}
		
		return false;
	}
		
	return true;
}; 
	
	
/**
 * Check request on error
 * @param {Object} request
 */
ErrorManager.prototype.closeFatalError = function(button){	
	
	// Hide block and lock
	unlock();
	
	// Change error state
	ErrorManager.inError = false;
	// and change location
	NavigationManager.changeLocation( button );

	// Remove message
	$('#fatal-error').remove();
	
}

/**
 * Process standart js error
 * @param {Object} request
 */
ErrorManager.prototype.processError = function(error){	
	
	var TITLE 	= error.message;
	var BUTTONS = {	OK: {} };			
	showDialog(TITLE, BUTTONS);	
}


ErrorManager.prototype.traceAjaxError = function(repeatFunc)
{
	// Unbind old handler
	$(document).unbind('ajaxError');
	
	// Create link to manager
	var $this = this;
		
	// Remember
	this.repeatFunc = repeatFunc;
	
	// Create new
	var onError = function(){
			
		if ($this.repeatFunc) {
			$this.repeatFunc();
			$this.repeatFunc = null;
		}
		else {
			unlock();
			var TITLE 	= 'Communication error occurred.<br>Make sure your connection is active and retry the action.';
			var BUTTONS = {	OK: {} };
			showDialog(TITLE, BUTTONS);
		}
	};
	
	// ... and set him
	$(document).bind('ajaxError', onError);
		
}
	
/**
 * Single instance of ErrorManager class
 */
var ErrorManager = new ErrorManager();

/* =================================================== */

/**
 * Navigation manager
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function NavigationManager(){
	
	this.create();
	
	return this;
};
	
/**
 * Class constructor
 * @constructor
 */
NavigationManager.prototype.create = function(){
	
	this.requestId = 0;
		
	var $this 	 = this;
		           
  	var location = document.location.href.toString();
	
  	this.params  = this.getStaticParamsFromURL( location ); 
    
 	this.timer   = setTimeout( function(){ $this.checkUpdate(); }, 300);
	
};
 
/**
 * Class destructor
 */
NavigationManager.prototype.destroy = function(){	 
		
	this.params	= null;
	
	if (this.timer)
	{
		clearTimeout( this.timer );
		this.timer = null;
	}		
	
	NavigationManager = null;
}; 
	
/**
 * Check URL address on update
 */	
NavigationManager.prototype.checkUpdate = function(){
	
	var $this = this;
	
  	var location = document.location.href.toString();
	var hash 	 = this.getParamsFromURL( location );               
           
  	// Check updates
  	if (hash != removeFirstSlash( this.params )) {
				
    	// Go to link new address
    	this.go( hash, { lock: '_mini' } );
  	}
  
  	if (this.timer) {
    	clearTimeout( this.timer );
    	this.timer = null;
  	}
  	this.timer = setTimeout( function(){ $this.checkUpdate(); }, 400);
	
};

/**
 * Go to URL
 * @param {String} URL
 */	
NavigationManager.prototype.go = function( params, link, addHistoryStep ){
	
	// No change location in error state
	if (ErrorManager.inError)
		return;
			
	var $this = this;
		
	// Set params
	if (!addHistoryStep)
		this.params = params;
		
	// Prepare request
	var URL  = params;
		URL += ( /\?/.test( params ) ) ? '&ajax=1' : '?ajax=1';
	
	if (this.template) {
		URL += '&template=' + this.template;
	} 
			
	// Lock area
	lock( link );	
			
	// Get request ID
	var requestId = ++this.requestId;
	
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		NavigationManager.go(params, link, addHistoryStep);		
	});
	
	
	// Do request
	var request = $.post( URL, function( data ){
		
		// Process answer			
		if ($this.requestId != requestId) return;
				
		if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect( request ))
		{					
			// Add step to browser history			  	
			if (addHistoryStep) {
				$this.params = params;
				$this.createHistoryStep(params);
			}
			
			// Unlock document
			unlock( link );
					
			// Change main menu state		
			var section = request.getResponseHeader('Smartz-Section-0');
			$this.changeMainMenu(section);
			
			// Change default search type
			var defaultSearchType = parseInt(request.getResponseHeader('default-search-type'));
			if (defaultSearchType)
				SearchManager.setSearchType( defaultSearchType );		
				
			// Change content
			var template = request.getResponseHeader('Template');			
			$this.changeContent(template, data);
						
			// Change navigation bar
			$this.changeNavigationBar();
			
			// Change left side environment
			$this.changeEnvironment();
			
			// Change window title
			$this.changeWindowTitle();			
			
		}
						
	});
};

/**
 * Check request response on redirect
 * @param {Object} request
 */
NavigationManager.prototype.checkRedirect = function(request, lock){
	
	// Correct lock
	if (!lock) {
		var lock = (this.template == 'mini') ? '_mini' : '_main';	
	}

	// Check redirect
	var redirectURL = request.getResponseHeader('ajax-location');
	if (redirectURL && this.checkOnLoginPage(redirectURL)) {
		
		// Hide opened dialogs
		hideDialog();
		
		// Clear flag
		window.selectedDeliveryType = null;
	
		// Change protocol?
		if ( this.isChangeProtocol(redirectURL) ) {
			document.location = redirectURL;
		}
		else
		{
			// Simply change location
			this.changeLocation({
				href: redirectURL,
				lock: lock
			});	
		}
		
		return false;
	}
	
	return true;
}

/**
 * Check URL on login page
 * @param {Object} URL
 */
NavigationManager.prototype.checkOnLoginPage = function(URL)
{
	if (/\/login/i.test(URL))
	{
		document.location = '/login';
		return false;
	}
	
	return true;
}

/**
 * Check on protocol changing
 * @param {Object} URL
 */
NavigationManager.prototype.isChangeProtocol = function(URL){

	if ( (/^https:/i.test(URL) && !/^https:/i.test(document.location)) ||
		(/^http:/i.test(URL) && !/^http:/i.test(document.location)) )
	{		
		return true;
	}
	else
		return false;
}


/**
 * Change location
 * @param {DOM element} link
 */
NavigationManager.prototype.changeLocation = function( link ){
					
	// Define new URL
	if (!link) return; 
	
	var newURL = link.href;	
				
	if (newURL == undefined) return;
	
	// Extract params from URL
	var params = '/' + this.getParamsFromURL( newURL );
	
	// Check on Login
	this.checkOnLoginPage( params );
							
	// Load new HTML content	
	this.go( params, link, true );
};

	
/**
 * Create step in browser history
 * @param {String} params
 */
NavigationManager.prototype.createHistoryStep = function( params ){
	
	// Use History Keeper from third-party library
  	unFocus.History.addHistory( params );
	
};

/**
 * Extract params from URL
 * @param {String} URL
 * @return {String}
 */
NavigationManager.prototype.getParamsFromURL = function( URL ){
	
	// To lower case
	URL = URL.toLowerCase();
	
	// Create regular expression object          
	var s  = "^(((.*)://)([^#^/]*)(/)?)?(([^#]*)?(#))?(.*)$";  
	var re = RegExp( s, "" );
	var result = re.exec( URL );
	
	// If param found
	if ((result) && (result[9]))
		return removeFirstSlash( result[9] );
	else  
		return '';
	
};

/**
 * Extract static params from URL
 * @param {String} URL
 * @return {String}
 */
NavigationManager.prototype.getStaticParamsFromURL = function( URL ){
	
	// To lower case
	URL = URL.toLowerCase();
	
	// Create regular expression object          
	var s  = "^(((.*)://)([^#^/]*)(/)?)?([^#]*)?(#)?(.*)?$";  
	var re = RegExp( s, "" );
	var result = re.exec( URL );
	
	// If param found
	if ((result) && (result[6]))
		return removeFirstSlash( result[6] );
	else  
		return '';
	
};

/**
 * Change main menu buttons state
 * @param {String} section
 */
NavigationManager.prototype.changeMainMenu = function(section){
			
	// Reset all buttons
	$( 'IMG.selectImage', $('#main-menu') ).each(function(){
	
		$(this).attr('src', $(this).attr('baseSrc') );	
		
		var buttonId = $(this).parent().parent().attr('id'); 
		if ( buttonId == 'main-menu-'+section )
		{
			$(this).attr('src', $(this).attr('selectSrc') );				
		}	
		
	});
	
};

/**
 * Change page content
 * @param {String} template
 * @param {String} data
 */
NavigationManager.prototype.changeContent = function( template, data ){
		
	// Choose destination container	
	var destination = '#columns';
	if (this.template == template && template == 'main')
	{
		var destination = '#content';
	}
	
	// Before change
	$.icDeinitValidationForms( $('#columns') );
		
	// Change content
	$(destination).html( data );
			
	// Scroll document to top
	scrollDocumentToTop();
	
	// After change
	$.icInitValidationForms( $('#columns') );
	
	// Apply rollover
	ApplyOnlyRollover( $(destination) );
		
	// Remember current template
	this.template = template;
};

/**
 * Change navigation bar content
 */
NavigationManager.prototype.changeNavigationBar = function(){
	
	if (!window.vNavigationBarData) {
		return;
	}
	
	// Clear navigator container
	var cont = $('#path-container').empty(); 
	
	
	// Construct new elements:
	// all elements as link, 
	// last element as simple bolder string
	
	var last = window.vNavigationBarData.length-1;
	
	$(window.vNavigationBarData).each(function(index){
		
		if (index < last) 
		{			
			cont.append('<div class="link"><a href="' + this.url + '" onclick="go(event, this);" lock="_main">' + this.caption + '</a></div><div><img class="separator" src="Public/img/navigator/separator.png" /></div>');						
		}
		else
		{
			cont.append('<div class="link"><b>' + this.caption + '</b></div>');
		}
		
		
	});
		
};


/**
 * Change left side composition
 */
NavigationManager.prototype.changeEnvironment = function(){
	
	// Products by genre
	this.refreshGenreSection();
	
	// Banner managment
	this.refreshBannerSection();	
	
	// Products by weeks
	this.refreshWeeksSection();
	
};


/**
 * Refresh section with "by genre" links
 */
NavigationManager.prototype.refreshGenreSection = function(){
	
	var section = $('#by-genre')[0];
	var caption = $('#by-genre-caption')[0];
	
	if (!section || !caption) 
		return;
	
	// Clear all
	$(section).empty();
	
	// Data and containers is exist?
	if (!window.vGenres || !window.vGenres.visible) {
		$(section).hide();
		$(caption).hide();
		return;
	}
		
	// Change block caption	
	$('IMG', caption)
		.attr('alt', window.vGenres.caption + ' by genre')
		.attr('src', 'Public/img/links/' + window.vGenres.caption + '-by-genre.png');
	
	// Change block links
	for (var i in window.vGenres.list)
	{
		$(section).append('<DIV onmouseover="hover(this);" onmouseout="unhover(this);"><A href="' 
			+ window.vGenres.list[ i ].url + '" class="" onclick="go(event, this);" lock="_main">' 
			+ window.vGenres.list[ i ].Genre + '</A></DIV>');
	}
		
	// We must show block with list of links
	$(caption).show();
	$(section).show();
	
};

/**
 * Refresh left side section with banners
 */
NavigationManager.prototype.refreshBannerSection = function(){
	
	// Check that section is exist
	var section = $('#left-banners')[0];	
	if (!section) return;
	
	// Clear all
	$(section).empty();
	
	// Check that global variable is defined
	if (!window.vBannersLeft || window.vBannersLeft.length==0) {
		// else hide section
		$(section).hide();
		return;
	}
		
	// Add banners
	for (var i in window.vBannersLeft)
	{
		$(section).append('<DIV class="bm"><a href="' 
			+ window.vBannersLeft[i].href + '" onclick="go(event, this);" lock="_main"><img src="' 
			+ window.vBannersLeft[i].src + '" alt="' 
			+ window.vBannersLeft[i].alt + '"/></a></DIV>');
	}
	
	// Show section
	$(section).show();
	
};


/**
 * Refresh section with "by weeks" links
 */
NavigationManager.prototype.refreshWeeksSection = function(){
	
	// Check tath section with caption is exist	
	var section = $('#weeks')[0];
	var caption = $('#weeks-caption')[0];
	var footer	= $("#weeks-footer")[0];
	
	if (!section || !caption) 
		return;
		
	// Clear container
	$(section).empty();
	
	// Hide section if needed
	if (!window.vWeeks || !window.vWeeks.visible) {
		$(section).hide();
		$(caption).hide();
		$(footer).hide();
		return;
	}
		
	// Change section caption and content	
	$('IMG', caption)
		.attr('alt', window.vWeeks.caption + ' by weeks')
		.attr('src', 'Public/img/links/' + window.vWeeks.caption + '-by-weeks.png');
	 
	// Change block links
	for (var i in window.vWeeks.list)
	{
		var week = window.vWeeks.list[ i ];
		
		if (week.isCurrent)
		{
			$(section).append('<DIV class="week" onmouseover="hover(this);" onmouseout="unhover(this);"><A class="current" href="' 
				+ week.url 
				+ '" onclick="go(event, this);" lock="_main">Releases of this Week</A></DIV>');	
		}
		else
		{
			$(section).append('<DIV class="week" onmouseover="hover(this);" onmouseout="unhover(this);"><A href="'
				+ week.url + '" onclick="go(event, this);" lock="_main">'
				+ week.weekBegin + ' Week</A></DIV>');
		}
	
	}
	
	// Show section
	$(section).show();
	$(caption).show();
	$(footer).show();
	
};



/**
 * Change window title
 */
NavigationManager.prototype.changeWindowTitle = function(){
	
	// Change window title
	if (!window.vPageTitle) return;
	
	document.title = window.vPageTitle;
	
};

/**
 * Single instance of NavigatorManager class
 */
var NavigationManager = new NavigationManager();
  

/* =================================================== */

/**
 * Search manager
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function SearchManager(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
SearchManager.prototype.create = function(){
	
	this.shortInput	= $('#search-input');
	
	this.bar		= $('#search');
	this.input		= $('#sinput');
	this.type		= $('#stype');
	this.current	= $('#stype span');
	this.list 		= $('#slist');	
	
	// Search by "Video > Title"
	this.defaultValue = 11;
	
	// Set handlers
	this.setHandlers();
};
 
/**
 * Class destructor
 */
SearchManager.prototype.destroy = function(){	
	
	this.unsetHandlers();
	
	this.shortInput	= 
	this.type		= 		
	this.bar		= 
	this.input		= 
	this.current	= 
	this.list 		= 
				
	SearchManager 	= null;
}; 

/**
 * Set event handlers
 */
SearchManager.prototype.setHandlers = function(){
	
	var $this = this;
	
	// Set on document click event
	$(document).bind('click', function(event){
		
		if (event.target && !getParentId(event.target, 'search')){
			$this.hideBar();
		}
		
	});
	
	
	// Set on image click event
	this.type.bind('click', function(event){
		
		($this.isListOpen) ? $this.closeList() : $this.openList();		
		$this.input.focus();
		
	});
	
	
	// Set on image click event
	this.input.bind('click', function(event){
		
		$this.closeList();
		
	});
	
	
	// Set on image click event
	$("#search .subitem").each(function(){
	
		$(this).bind('click', function(){
			
			$this.setType( this );
			
			$this.closeList();
			
			$this.returnFocusToInput();
			
		});
		
		$(this).bind('mouseover', function(){
			
			$(this).addClass('hover');
			
		});
		
		$(this).bind('mouseout', function(){
			
			$(this).removeClass('hover');
			
		});
		
	});
	
	
	// On header
	$("#search .header").each(function(){
	
		$(this).bind('click', function(){
		
			$this.hideAllSubItems( this );
			$this.showSubItems( this );
			$this.setType( $('.subitem' , $(this).next()).eq(0) );
									
		});
		
	});
	
	
	// On input key press ENTER
	this.input.bind('keypress', function(event){
		
		if (event.keyCode == 13)
		{
			$this.hideBar();
			
			var URL = '/search/?search-text=' + encodeURIComponent( this.value ) 
				+ '&search-type=' + $this.getTypeValue();
			
			NavigationManager.changeLocation( { href : URL, lock: '_mini' } );
		}
		
	});
	
};


/**
 * Unset event handlers
 */
SearchManager.prototype.unsetHandlers = function(){
	
	$("#search .header").each(function(){	
		$(this).unbind();
	});
	
	$("#search .subitem").each(function(){
		$(this).unbind();
	});
	
	this.type.unbind();
	
	this.input.unbind();
	
	$(document).unbind();
};

/**
 * Hide all groups of items
 * @param {DOM element} header
 */
SearchManager.prototype.hideAllSubItems = function(header){
	
	var $this = this;
	
	$("#search .header").each(function(){
		
		if (this != header)
			$this.hideSubItems( this );
		
	});
	
};

/**
 * Hide group by header element
 * @param {DOM element} header
 */
SearchManager.prototype.hideSubItems = function(header){
	
	$(header).next().hide();
	
};

/**
 * Show group by header
 * @param {DOM element} header
 */
SearchManager.prototype.showSubItems = function(header){
	
	var $this = this;
	
	if ($.browser.msie || $.browser.opera)
	{		
		$(header).next().show();
				
		this.returnFocusToInput();		
	}
	else
	{		
		$(header).next().slideDown(100, function(){
		
			$this.returnFocusToInput();
			
		});		
	}
	
};

/**
 * Stretch search bar
 */
SearchManager.prototype.showBar = function(){	

	var $this = this;
	
	this.bar.show();

	this.input.val(  this.shortInput.val() );

	this.returnFocusToInput();
	
	this.openList();
	
}; 
	
	
/**
 * Hide search bar
 */
SearchManager.prototype.hideBar = function(){
	
	this.closeList();
		
	this.bar.hide();
	
	this.shortInput.val(  this.input.val() );
}	
	
/**
 * Open list of search types
 */
SearchManager.prototype.openList = function(){
	
	// Show list
	if ($.browser.msie || $.browser.opera)
	{
		this.list.show();	
	}
	else
	{
		this.list.slideDown('fast');
	}	
	
	var value 	= this.getTypeValue();
		
	var item	= $('#subitem_'+value);
	var header 	= item.parent().prev(); 
	
	//header.trigger('click');
	this.hideAllSubItems( header );
	this.showSubItems( header );
	
	this.setType( item );
		
	this.isListOpen = true;
	
};

/**
 * Close list of search types
 */
SearchManager.prototype.closeList = function(){
	
	if ($.browser.msie || $.browser.opera) 
	{
		this.list.hide();
	}
	else
	{
		this.list.slideUp('fast');	
	}	
	
	this.isListOpen = false;
	
};

/**
 * Set current search type (private method)
 * @param {DOM element} subitem
 */
SearchManager.prototype.setType = function( subitem ){
	
	$('#subitem_' + this.currentValue).removeClass('selected');
	
	var header = $(subitem).parent().prev();
	var text = header.text() + ' > ' + $(subitem).text();
	var value = $(subitem).attr('value');
	
	$(subitem).addClass('selected');
	
	this.current.text(text);
	
	this.currentValue = value;
	
};

/**
 * Return current search type value
 */
SearchManager.prototype.getTypeValue = function(){
	
	if (!this.currentValue)
	{
		this.currentValue = this.defaultValue;
	}
			
	return this.currentValue;
	
};

/**
 * Set current search type 
 * @param {DOM element} subitem
 */
SearchManager.prototype.setSearchType = function(value){
	
	$('#subitem_' + this.currentValue).removeClass('selected');
	
	value = (value < 11) ? 11 : value;
	
	this.currentValue = value;
	
};

/**
 * Return focus to search input element
 */
SearchManager.prototype.returnFocusToInput = function(){
	
	//moveCaretToEnd( this.input[0] );
	selectAllTextInEdit( this.input[0] );
			
	this.input.focus();
	
};


/**
 * Start search from Search Page
 * @param {Object} button
 */
SearchManager.prototype.startSearch = function(button){
	
	// Check search field on text exist
	var field = $('#form-search-text'); 
	var text  = field.val();
	
	if ( !text ) {
		field.focus();
		return;
	}
	
	// Get params
	var type = $('input[name=search-type]:checked').val();
		type = type ? type : 11; 
	
	// Get url
	var url = $(button.form).attr('action') + '?search-text=' + text + '&search-type=' + type;
	
	// Do request
	var link = {
		href:	url,
		lock:	'_main'
	};
	NavigationManager.changeLocation( link );
	
};

	
/**
 * Single instance of SearchManager class
 */
var SearchManager = new SearchManager();

/* =================================================== */

/**
 * Product manager
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */

function ProductManager(){
	return this;
};


/**
 * Class constructor
 * @constructor
 */
ProductManager.prototype.create = function(){
	
};
 
 
/**
 * Class destructor
 */
ProductManager.prototype.destroy = function(){	
					
	ProductManager = null;
}; 


/**
 * Add item to cart by link
 * @param {Object} link
 */
ProductManager.prototype.addToCart = function(link){
	
	var $this = this;
	
	// Prepare request
	var URL  = link.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
	
	// Get images
	var imgs	= $('IMG', link);
	var button 	= imgs[0];
	var wait 	= imgs[1];
	
	// Start animation	
	this.startAddToCartAnimation( link, button, wait );
	
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		ProductManager.addToCart(link);	
	});
		
	// Do request
	var request = $.post( URL, function( data ){
	
		if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request))
		{			
			$this.stopAddToCartAnimation( link, button, wait );
		}
		
	});
		
};

/**
 * Start animation for add to cart action
 * @param {Object} link
 * @param {Object} button
 * @param {Object} wait
 */
ProductManager.prototype.startAddToCartAnimation = function(link, button, wait){
	
	// In first time
	if (!link.clickCount) {
		
		// Disable rollover
		$(button).unbind();
		
		// Set counter
		link.clickCount = 0;
		
		// Calc position
		var top  = GetAbsoluteTop(button) + parseInt($(wait).attr('topOffest'));
		var left = GetAbsoluteLeft(button) + parseInt($(wait).attr('leftOffest'));
							
		$(wait).css('top', top);		
		$(wait).css('left', left);	
	}
	
	// Increment click counter
	link.clickCount++;
		
	// Change button state
	if (link.clickCount == 1)
		toggleImage( $(button) );
	
	// Show wait image
	//$('.now-shipping .container').css('position', 'static');
	$(wait).show();
	//$('.now-shipping .container').css('position', 'relative');
};

/**
 * Stop animation for add to cart action
 * @param {Object} link
 * @param {Object} button
 * @param {Object} wait
 */
ProductManager.prototype.stopAddToCartAnimation = function(link, button, wait){
	
	// Decrement click counter
	link.clickCount--;
	
	if (link.clickCount == 0)
	{		
		// Return button state
		toggleImage( $(button) );
		
		// Hide wait image
		$(wait).hide();
	}
	
	// Show "+1" animation	
	if (!$.browser.opera)
		this.animateAddOne( $(button) );
	
};


/**
 * Start animation of "+1" label
 * @param {Object} button
 */
ProductManager.prototype.animateAddOne = function(button){
	
	var label = $('<DIV class="one">+1</DIV>');
	
	button.before(label);
		
	var top  = GetAbsoluteTop(button[0]) + button.height() / 2 - label.height() / 2 - 3;
	var left = GetAbsoluteLeft(button[0]);
	
	label.css('top', top);
	label.css('left', left);
	
	label.show();
	
	var params = { "left": "-=50px" };
		
	label.animate( params, "slow", function(){
		label.hide();
		label.remove();
	});
		
	
};


/**
 * Add product item to wishlist
 * @param {Object} link
 */
ProductManager.prototype.addToWishlist = function(link){
	
	var $this = this;
	
	// Prepare request
	var URL  = link.href;
		URL += ( /\?/.test( URL ) ) ? '&ajax=1' : '?ajax=1';
	
	// Get images
	var imgs	= $('IMG', link);
	var button 	= imgs[0];
	var wait 	= imgs[1];
	
	// Start animation
	this.startAddToWishlistAnimation( link, button, wait );
	
	// Add request to tracing of ajax error
	ErrorManager.traceAjaxError(function(){			
		ProductManager.addToWishlist(link);	
	});
	
	// Do request	
	var request = $.post( URL, function( data ){
						
		if (ErrorManager.processRequest( request ) && NavigationManager.checkRedirect(request))
		{
			$this.stopAddToWishlistAnimation(link, button, wait);
		}
	});
	
};


/**
 * Start add to wishlist animation
 * @param {Object} link
 * @param {Object} button
 * @param {Object} wait
 */
ProductManager.prototype.startAddToWishlistAnimation = function(link, button, wait){
	
	// In first time
	if (!link.clicked) {
		
		// Disable rollover
		$(button).unbind();
		
		// Set counter
		link.clicked = true;
		link.onclick = null;
		
		// Calc position
		var top  = GetAbsoluteTop(button) + parseInt($(wait).attr('topOffest'));
		var left = GetAbsoluteLeft(button) + parseInt($(wait).attr('leftOffest'));
							
		$(wait).css('top', top);
		$(wait).css('left', left);
	
		// Change button state
		toggleImage( $(button) );
		
		// Show wait image
		$(wait).show();
				
	}
	
};


/**
 * Stop add to wishlist animation
 * @param {Object} link
 * @param {Object} button
 * @param {Object} wait
 */
ProductManager.prototype.stopAddToWishlistAnimation = function(link, button, wait){
			
	// Return button state
	$(button).attr('src', $(button).attr('src3'));
	
	if ($.browser.msie && parseInt($.browser.version) < 7) {
		fixPNG(button);
	}
			
	// Hide wait image
	$(wait).hide();
	
	// Change link location
	$(link).attr('href', 'my-wishlist/?select=' + $(link).attr('productID') );
	$(button).attr('alt', 'In your wishlist' );
	$(button).attr('title', 'In your wishlist' );
	
	link.onclick = function(event){
		event = event || window.event;
		go(event, this);
	};

};

	
/**
 * Single instance of ProductManager class
 */
var ProductManager = new ProductManager();

/* =================================================== */

/**
 * Section manager
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-06-22
 */

function SectionManager(){
	return this;
};

/**
 * Class constructor
 * @constructor
 */
SectionManager.prototype.create = function(){

};
 
/**
 * Class destructor
 */
SectionManager.prototype.destroy = function(){	
		
	SectionManager = null;	
}; 

/**
 * Scroll left "now shipping" section
 * @param {Object} button
 */
SectionManager.prototype.nowShipping_scrollLeft = function(button){	
	
	if (this.inProgress) 
		return;
	this.inProgress = true;
	
	var $this	= this;	
	var $lenta 	= $('#now_lenta'); 
	var $row 	= $('#now_row'); 
		
	// Show last
	$('TD:last', $lenta).show();
		
	$lenta.animate( { "left": "-=88px" }, "fast", function(){
		
		// Get current item
		var item = $('TD:first', $lenta);
		
		// Show product details
		$this.nowShipping_showDetails( item.attr('number') );
		
		// Correct lenta
		$lenta.css('left', 0);
		item.hide().appendTo( $row );
		
		// Up
		$('IMG', button).css('left', 0);
		
		$this.inProgress = false;
	});
	
};

/**
 * Scroll right "now shipping" section
 * @param {Object} button
 */
SectionManager.prototype.nowShipping_scrollRight = function(button){
	
	if (this.inProgress) 
		return;
	this.inProgress = true;
	
	var $this	= this;
	var $lenta 	= $('#now_lenta'); 
	var $row 	= $('#now_row');  

	// Move last to begin & show
	$('TD:last', $lenta).prependTo( $row ).show();
	$lenta.css('left', -88);

	// Animate right scroll
	$lenta.animate( { "left": "+=88px" }, "fast", function(){
		
		// Get current item
		var item = $('TD:last', $lenta); 
		
		// Show product details
		$this.nowShipping_showDetails( item.attr('number') );
		
		// Correct lenta
		$lenta.css('left', 0);
		item.hide();
		
		// Up button
		$('IMG', button).css('left', 0);
		
		$this.inProgress = false;
	});
	
};


/**
 * Show product detail in "Now shipping case"
 * @param {Object} number
 */
SectionManager.prototype.nowShipping_showDetails = function(number)
{
	$('.in-zoom .tc').hide();
	$('#info_' + number).fadeIn();
}


/**
 * Scroll left "suggested items" section
 * @param {Object} button
 */
SectionManager.prototype.suggested_scrollLeft = function(button){	
	
	if (this.inProgress) 
		return;
	this.inProgress = true;
	
	var $this	= this;	
	var $lenta 	= $('#sugg_lenta'); 
	var $row 	= $('#sugg_row'); 
		
	$lenta.animate( { "left": "-=83px" }, "fast", function(){
		
		// Get current item
		var item = $('TD:first', $lenta);
		
		// Correct lenta
		$lenta.css('left', 0);
		item.appendTo( $row );
		
		// Up
		$('IMG', button).css('left', 0);
		
		$this.inProgress = false;
	});
	
};

/**
 * Scroll right "suggested items" section
 * @param {Object} button
 */
SectionManager.prototype.suggested_scrollRight = function(button){
	
	if (this.inProgress) 
		return;
	this.inProgress = true;
	
	var $this	= this;
	var $lenta 	= $('#sugg_lenta'); 
	var $row 	= $('#sugg_row');   

	// Move last to begin & show
	$('TD:last', $lenta).prependTo( $row );
	$lenta.css('left', -83);

	// Animate right scroll
	$lenta.animate( { "left": "+=83px" }, "fast", function(){

		// Correct lenta
		$lenta.css('left', 0);
		
		// Up button
		$('IMG', button).css('left', 0);
		
		$this.inProgress = false;
	});
	
};
	
/**
 * Single instance of SectionManager class
 */
var SectionManager = new SectionManager();

/* =================================================== */

/**
 * Client application (with jQuery)
 * 
 * @copyright (C) ICSoft, http://www.icsoft.ru
 * @author    Egor Stremousov
 * @version   1.0, 2009-04-10
 */


/**
 * Initialize client application
 * =============================
 */
$(function(){
	
	// Enable form validation
	$.icInitValidationForms();
	
	// Create managers
	ErrorManager.create();
	//NavigationManager.create();
	SearchManager.create();
	ProductManager.create();
	SectionManager.create();
		
		
	// Create editors
	UserSettingsEditor.create();
	HelpEditor.create();
	WishlistEditor.create();
	CartEditor.create();
	OrderEditor.create();
	CurrencyEditor.create();
	BillingEditor.create();
	ShippingEditor.create();
	ContactEditor.create();
	PasswordEditor.create();
	CheckoutEditor.create();	
});


/**
 * Finalize client application
 * ===========================
 */ 
$(window).unload(function(){
	
	// Destroy editors and free memory
	CheckoutEditor.destroy();
	PasswordEditor.destroy();
	ContactEditor.destroy();
	ShippingEditor.destroy();
	BillingEditor.destroy();
	CurrencyEditor.destroy();		
	OrderEditor.destroy();		
	CartEditor.destroy();		
	WishlistEditor.destroy();		
	HelpEditor.destroy();		
	UserSettingsEditor.destroy();		
	
	// Destroy managers and free memory
	SectionManager.destroy();
	ProductManager.destroy();
	SearchManager.destroy();
	NavigationManager.destroy();
	ErrorManager.destroy();
		
	// Disable form validation
	$.icDeinitValidationForms();
});



/**
 * GLOBAL FUNCTIONS (called from HTML-code)
 * ======================================
 * Access to the real object (managers) method 
 * is carried out through these functions comes.
 * =============================================
 */


/**
 * Navigate by AJAX-requests
 * @param {Object} event
 * @param {DOM element} link
 */
function go(event, link)
{
	// Unfocus element
	link.blur();
	
	// Process change location
	if (exist(NavigationManager)) 
	{
		if (NavigationManager.isChangeProtocol( link.href )) {
			document.location = link.href;
			return;
		}
		
		NavigationManager.changeLocation(link);
	}
		
	// Cancel standard browser action 
    cancelStandardAction( event );
}


/**
 * Search Panel Functions
 * ===============================
 * =============================== 
 */


/**
 * Show wide search panel
 * @param {Object} event
 * @param {DOM element} input
 */
function showSearchPanel(event, input)
{
	// Release input focus
	input.blur();
	
	// Show wide panel
	if ( exist(SearchManager) )
		SearchManager.showBar();
		
	if (typeof(event.stopPropagation) == 'function') 
		event.stopPropagation();
	if (typeof(event.cancelBubble) == 'boolean') 
		event.cancelBubble = true;
	
	return false;
}


/**
 * Tabs Functions
 * ===============================
 * 
 * ===============================
 */

function showTabContent(event, link)
{
	// Unfocus tab
	link.blur();
	
	var tabs = $('#' + $(link).attr('tabs'));
	var contents = $('#' + $(link).attr('tabCont'));
	var tab  = $('#' + $(link).attr('tabId'));
	
	// Show/Hide content
	$('.tab-container', contents).hide();
	tab.show();	
	
	// Switch images
	$('.tab .selected', tabs).hide();
	$('.tab A', tabs).show();
	
	$(link).hide();
	$(link).next().show();
			
	// Cancel standard action
	cancelStandardAction( event );
}


/**
 * Billing Editor Outer Functions
 * ===============================
 * Billing editor interface
 * ===============================
 */

/**
 * Initiates the supplement of billing information
 * @param {Object} event
 * @param {DOM element} button
 */
function startAddBilling(event, button)
{
	// Unfocus button
	button.blur();
	
	// Add billing info
	if (exist(BillingEditor)) {
		
		BillingEditor.cancelEditing(button);
		BillingEditor.cancelAdding(button);
		
		BillingEditor.showAddDialog(button);
	}
	
	// Cancel standard browser action	
	cancelStandardAction( event );
}

function cancelAddBilling(event, button)
{
	// Unfocus button
	button.blur();
	
	// Close "Add" form
	if ( exist(BillingEditor) && $('#addBillingForm')[0] )
	{
		BillingEditor.cancelAdding(button);	
	}
	else 
	{
		hideDialog();
	}
	
	// Cancel standard browser action	
	cancelStandardAction( event );
} 

function finishAddBilling(event, button)
{
	// Unfocus button
	button.blur();
	
	// Add new billing info
	if (exist(BillingEditor) && $('#addBillingForm')[0]) 
	{		
		BillingEditor.tryAdd(button);
	}
	else
	{
		finishCheckoutAction(event, button);
	}
	
	// Cancel standard browser action	
	cancelStandardAction( event );
} 

/**
 * Initiates the editing of billing information
 * @param {Object} event
 * @param {DOM element} button
 */
function startEditBilling(event, button)
{
	// Unfocus button
	button.blur();
	
	// Add billing info
	if ( exist(BillingEditor) )
	{		
		BillingEditor.cancelAdding(button);
		BillingEditor.cancelEditing(button);
		
		BillingEditor.showEditDialog(button);
	}
	
	// Cancel standard browser action	
	cancelStandardAction( event );
}

function cancelEditBilling(event, button)
{
	// Unfocus button
	button.blur();
	
	// Close "Add" form
	if ( exist(BillingEditor) && $('#editBillingForm')[0] ) 
	{
		BillingEditor.cancelEditing(button);
	}
	else 
	{
		hideDialog();
	}
	
	// Cancel standard browser action	
	cancelStandardAction( event );
} 

function finishEditBilling(event, button)
{
	// Unfocus button
	button.blur();
	
	// Edit billing info
	if (exist(BillingEditor) && $('#editBillingForm')[0]) 
	{
		BillingEditor.tryEdit(button);
	}
	else 
	{
		finishCheckoutAction(event, button);
	}
	
	// Cancel standard browser action	
	cancelStandardAction( event );
} 

/**
 * Initiates the removing of billing information
 * @param {Object} event
 * @param {DOM element} button
 */
function startDeleteBilling(event, button)
{
	// Unfocus button
	button.blur();
	
	// Confirm deleting
	if (exist(BillingEditor)) {
		
		BillingEditor.cancelEditing(button);
		BillingEditor.cancelAdding(button);
		
		BillingEditor.showDeleteDialog(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );	
}

function cancelDeleteBilling(event, button)
{
	// Unfocus button
	button.blur();
	
	// Cancel deleting - close dialog
	hideDialog();
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

function finishDeleteBilling(event, button)
{
	// Unfocus button
	button.blur();
	
	// Confirm deleting
	if ( exist(BillingEditor) )
		BillingEditor.tryDelete( button );
	
	// Cancel standard browser action
	cancelStandardAction( event );
}


/**
 * Shipping Editor Outer Functions
 * ===============================
 * Shipping editor interface
 * ===============================
 */

/**
 * Initiates the supplement of shipping information
 * @param {Object} event
 * @param {DOM element} button
 */
function startAddShipping(event, button)
{
	// Unfocus button
	button.blur();
	
	// Show editor for adding
	if (exist(ShippingEditor)) {
		
		ShippingEditor.cancelEditing(button);		
		ShippingEditor.cancelAdding(button);
		
		ShippingEditor.showAddDialog(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

function cancelAddShipping(event, button)
{
	// Unfocus button
	button.blur();
	
	// Close "Add" form
	if (exist(ShippingEditor) && $('#addShippingForm')[0]) 
	{				
		ShippingEditor.cancelAdding(button);
	}
	else
	{
		hideDialog();
	}
	
	// Cancel standard browser action	
	cancelStandardAction( event );
}

function finishAddShipping(event, button)
{
	// Unfocus button
	button.blur();
	
	// Add new shipping info
	if (exist(ShippingEditor) && $('#addShippingForm')[0]) 
	{		
		ShippingEditor.tryAdd(button);
	}
	else
	{
		finishCheckoutAction(event, button);
	}
	
	// Cancel standard browser action	
	cancelStandardAction( event );
} 

/**
 * Initiates the editing of shipping information
 * @param {Object} event
 * @param {DOM element} button
 */
function startEditShipping(event, button)
{
	// Unfocus button
	button.blur();
	
	// Add shipping info
	if (exist(ShippingEditor)) {
		
		ShippingEditor.cancelAdding(button);
		ShippingEditor.cancelEditing(button);
		
		ShippingEditor.showEditDialog(button);
	}
	
	// Cancel standard browser action	
	cancelStandardAction( event );
}

function cancelEditShipping(event, button)
{
	// Unfocus button
	button.blur();
	
	// Close "Add" form
	if (exist(ShippingEditor) && $('#editShippingForm')[0]) 
	{
		ShippingEditor.cancelEditing(button);
	}
	else
	{
		hideDialog();
	}
		
	
	// Cancel standard browser action	
	cancelStandardAction( event );
} 

function finishEditShipping(event, button)
{
	// Unfocus button
	button.blur();
	
	// Edit shipping info
	if (exist(ShippingEditor) && $('#editShippingForm')[0]) 
	{
		ShippingEditor.tryEdit(button);
	}
	else
	{
		finishCheckoutAction(event, button);
	}
	
	// Cancel standard browser action	
	cancelStandardAction( event );
} 

/**
 * Initiates the removing of shipping information
 * @param {Object} event
 * @param {DOM element} button
 */
function startDeleteShipping(event, button)
{
	// Unfocus button
	button.blur();
	
	// Confirm deleting
	if (exist(ShippingEditor)) 
	{
		ShippingEditor.cancelEditing(button);		
		ShippingEditor.cancelAdding(button);
		
		ShippingEditor.showDeleteDialog(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );	
}

function cancelDeleteShipping(event, button)
{
	// Unfocus button
	button.blur();
	
	// Cancel deleting - close dialog
	hideDialog();
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

function finishDeleteShipping(event, button)
{
	// Unfocus button
	button.blur();
	
	// Confirm deleting
	if (exist(ShippingEditor)){		
		ShippingEditor.tryDelete(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}


/**
 * Contact Editor Outer Functions
 * ===============================
 * Contact editor interface
 * ===============================
 */

/**
 * Initiates the editing of contact information
 * @param {Object} event
 * @param {DOM element} button
 */
function finishEditContact(event, button)
{
	// Unfocus button
	button.blur();
	
	// Save data
	if (exist(ContactEditor)){		
		ContactEditor.trySaveData(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}


/**
 * Settings Editor Functions
 * ===============================
 * Settings Editor interface
 * ===============================
 */

/**
 * Initiates the editing of user profile settings
 * @param {Object} event
 * @param {DOM element} button
 */
function finishEditSettings(event, button)
{
	// Unfocus button
	button.blur();
	
	// Save data
	if (exist(UserSettingsEditor)){		
		UserSettingsEditor.trySaveData(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}


/**
 * Password Change Editor Outer Functions
 * ===============================
 * Password editor interface
 * ===============================
 */

/**
 * Initiates the editing of password
 * @param {Object} event
 * @param {DOM element} button
 */
function finishEditPassword(event, button)
{
	// Unfocus button
	button.blur();
	
	// Save data
	if (exist(PasswordEditor)){		
		PasswordEditor.trySaveData(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}


/**
 * Checkout Editor Outer Functions
 * ===============================
 * Checkout editor interface
 * ===============================
 */


/**
 * Initiates the actions of checkout
 * @param {Object} event
 * @param {DOM element} button
 */
function startCheckoutAction(event, button)
{
	// Unfocus button
	button.blur();
	
	// Open edit form in dialog window
	if (exist(CheckoutEditor)){		
		CheckoutEditor.showDialog(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

function cancelCheckoutAction(event, button)
{
	// Unfocus button
	button.blur();
	
	// Close dialog
	hideDialog();
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

function finishCheckoutAction(event, button)
{
	// Unfocus button
	button.blur();
	
	// Send form and close dialog
	if (exist(CheckoutEditor)){		
		CheckoutEditor.applyDialogForm(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}


/**
 * Change content of delivery form
 * @param {Object} event
 * @param {Object} button
 */
function onChangeDeliveryType(event, select)
{
	// Unfocus button
	select.blur();
		
	if (exist(CheckoutEditor)){		
		CheckoutEditor.changeDeliveryType();
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

/**
 * Send form data by AJAX-request
 * @param {Object} event
 * @param {Object} button
 */
function processOrder(event, button)
{
	// Unfocus button
	button.blur();
		
	if (exist(CheckoutEditor)){		
		CheckoutEditor.processOrder(event, button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

/**
 * Error process functions
 * ===============================
 * 
 * ===============================
 */


/**
 * Close fatal error message
 * @param {Object} event
 * @param {Object} button
 */
function closeFatal(event, button)
{
	// Unfocus button
	button.blur();
			
	// Close message and go to URL
	if (exist(ErrorManager)) {	
		ErrorManager.closeFatalError( button );
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}


/**
 * Currency Editor Functions
 * ===============================
 * Adjust currency interface
 * ===============================
 */

/**
 * Open change currency dialog
 * @param {Object} event
 * @param {Object} link
 */
function startChangeCurrency(event, link)
{
	// Unfocus link
	link.blur();
			
	// Close message and go to URL
	if (exist(CurrencyEditor)) {	
		CurrencyEditor.openDialog( link );
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

/**
 * Apply choosed currency
 * @param {Object} event
 * @param {Object} link
 */
function finishChangeCurrency(event, button)
{
	// Unfocus button
	button.blur();
			
	// Close message and go to URL
	if (exist(CurrencyEditor)) {			
		CurrencyEditor.applyCurrency( button );
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

/**
 * Cancel changing of currency
 * @param {Object} event
 * @param {Object} button
 */
function cancelChangeCurrency(event, button)
{
	// Unfocus button
	button.blur();
	
	// Close dialog
	hideDialog();
	
	// Cancel standard browser action
	cancelStandardAction( event );
}


/**
 * Order Editor Outer Functions
 * ===============================
 * Order editor interface
 * ===============================
 */


/**
 * Initiates the actions of Orders
 * @param {Object} event
 * @param {DOM element} button
 */
function startOrderAction(event, button)
{
	// Unfocus button
	button.blur();
	
	// Open edit form in dialog window
	if (exist(OrderEditor)){		
		OrderEditor.showDialog(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

function cancelOrderAction(event, button)
{
	// Unfocus button
	button.blur();
	
	// Close dialog
	hideDialog();
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

function finishOrderAction(event, button)
{
	// Unfocus button
	button.blur();
	
	// Send form and close dialog
	if (exist(OrderEditor)){		
		OrderEditor.applyDialogForm(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}


/**
 * Cart Editor Outer Functions
 * ===============================
 * Cart editor interface
 * ===============================
 */


/**
 * Initiates the actions of cart
 * @param {Object} event
 * @param {DOM element} button
 */
function startCartAction(event, button)
{
	// Unfocus button
	button.blur();
	
	// Open edit form in dialog window
	if (exist(CartEditor)){		
		CartEditor.showDialog(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

function cancelCartAction(event, button)
{
	// Unfocus button
	button.blur();
	
	// Close dialog
	hideDialog();
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

function finishCartAction(event, button)
{
	// Unfocus button
	button.blur();
	
	// Send form and close dialog
	if (exist(CartEditor)){
		CartEditor.applyDialogForm(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}


/**
 * Wishlist Editor Outer Functions
 * ===============================
 * Wishlist editor interface
 * ===============================
 */


/**
 * Initiates the actions of Wishlist
 * @param {Object} event
 * @param {DOM element} button
 */
function startWishlistAction(event, button)
{
	// Unfocus button
	button.blur();
	
	// Open edit form in dialog window
	if (exist(WishlistEditor)){		
		WishlistEditor.showDialog(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

function cancelWishlistAction(event, button)
{
	// Unfocus button
	button.blur();
	
	// Close dialog
	hideDialog();
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

function finishWishlistAction(event, button)
{
	// Unfocus button
	button.blur();
	
	// Send form and close dialog
	if (exist(WishlistEditor)){
		WishlistEditor.applyDialogForm(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );
}

/**
 * Help Editor Outer Functions
 * ===============================
 * Help editor interface
 * ===============================
 */

/**
 * Change delivery country
 * @param {Object} event
 * @param {Object} button
 */
function onChangeDeliveryCountry()
{		
	if (exist(HelpEditor)){		
		HelpEditor.changeCountryCost();
	}
}


/**
 * Product managment
 * ================================
 * ()
 * ===============================
 */

/**
 * Add product item to cart
 * @param {Object} event
 * @param {Object} button
 */
function addToCart(event, link){
	
	// Unfocus link
	link.blur();
	
	// Try add item to cart
	if (exist(ProductManager)){
		ProductManager.addToCart(link);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );	
}

/**
 * Add product item to wishlist
 * @param {Object} event
 * @param {Object} button
 */
function addToWishlist(event, link){
	
	// Unfocus link
	link.blur();
	
	// Try add item to wishlist
	if (exist(ProductManager)){
		ProductManager.addToWishlist(link);
	}
	
	// Cancel standard browser action
	cancelStandardAction( event );	
}


/**
 * Product managment
 * ================================
 * ()
 * ===============================
 */
function hover(element)
{
	$(element).addClass('hover');
}

function unhover(element)
{
	$(element).removeClass('hover');
}


/**
 * Now shipping section managment
 * ==============================
 */
function nowShipping_scrollLeft(event, button)
{
	// Unfocus link
	button.blur();
	
	// Down
	$('IMG', button).css('left', -2);
	
	// Scroll lenta to left
	if (exist(SectionManager)){
		SectionManager.nowShipping_scrollLeft(button);
	}
		
	// Cancel standard browser action
	cancelStandardAction(event);
}

function nowShipping_scrollRight(event, button)
{
	// Unfocus link
	button.blur();
	
	// Down
	$('IMG', button).css('left', 2);
	
	// Scroll lenta to left
	if (exist(SectionManager)){
		SectionManager.nowShipping_scrollRight(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction(event);
}

/**
 * Suggested items managment
 * ==============================
 */
function suggested_scrollLeft(event, button)
{
	// Unfocus link
	button.blur();
	
	// Down
	$('IMG', button).css('left', -2);
	
	// Scroll lenta to left
	if (exist(SectionManager)){
		SectionManager.suggested_scrollLeft(button);
	}
		
	// Cancel standard browser action
	cancelStandardAction(event);
}

function suggested_scrollRight(event, button)
{
	// Unfocus link
	button.blur();
	
	// Down
	$('IMG', button).css('left', 2);
	
	// Scroll lenta to left
	if (exist(SectionManager)){
		SectionManager.suggested_scrollRight(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction(event);
}

/**
 * Search page functionality
 * ==============================
 */

/**
 * Start search from Search Page
 * @param {Object} event
 * @param {Object} button
 */
function startSearch(event, button)
{
	// Unfocus button
	button.blur();
	
	if (exist(SearchManager)){
		SearchManager.startSearch(button);
	}
	
	// Cancel standard browser action
	cancelStandardAction(event);
}


/**
 * On country change in shipping editor
 * =======================
 */
function onChangeCountry(button){
	
	var value = $(button).val();
	
	$('#deliveryType').appendTo( $('#option-container') );
	$('#deliveryType-onlyUSA').appendTo( $('#option-container') );
	$('#deliveryType-onlyOther').appendTo( $('#option-container') );
	
	if (value=='United States')
	{		
		$('#deliveryType-onlyUSA').appendTo( $('#dtype-container') );
	}
	else
	{
		$('#deliveryType-onlyOther').appendTo( $('#dtype-container') );
	}
}

/* =================================================== */

