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


/* Copyright (c) 2009 Brandon Aaron (http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
 * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
 *
 * Version: 3.0.2
 * 
 * Requires: 1.2.2+
 */
(function(c){var a=["DOMMouseScroll","mousewheel"];c.event.special.mousewheel={setup:function(){if(this.addEventListener){for(var d=a.length;d;){this.addEventListener(a[--d],b,false)}}else{this.onmousewheel=b}},teardown:function(){if(this.removeEventListener){for(var d=a.length;d;){this.removeEventListener(a[--d],b,false)}}else{this.onmousewheel=null}}};c.fn.extend({mousewheel:function(d){return d?this.bind("mousewheel",d):this.trigger("mousewheel")},unmousewheel:function(d){return this.unbind("mousewheel",d)}});function b(f){var d=[].slice.call(arguments,1),g=0,e=true;f=c.event.fix(f||window.event);f.type="mousewheel";if(f.wheelDelta){g=f.wheelDelta/120}if(f.detail){g=-f.detail/3}d.unshift(f,g);return c.event.handle.apply(this,d)}})(jQuery);


/*!
 * jQuery corner plugin: simple corner rounding
 * Examples and documentation at: http://jquery.malsup.com/corner/
 * version 1.99 (28-JUL-2009)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 */

/**
 *  corner() takes a single string argument:  $('#myDiv').corner("effect corners width")
 *
 *  effect:  name of the effect to apply, such as round, bevel, notch, bite, etc (default is round). 
 *  corners: one or more of: top, bottom, tr, tl, br, or bl. 
 *           by default, all four corners are adorned. 
 *  width:   width of the effect; in the case of rounded corners this is the radius. 
 *           specify this value using the px suffix such as 10px (and yes, it must be pixels).
 *
 * @name corner
 * @type jQuery
 * @param String options Options which control the corner style
 * @cat Plugins/Corner
 * @return jQuery
 * @author Dave Methvin (http://methvin.com/jquery/jq-corner.html)
 * @author Mike Alsup   (http://jquery.malsup.com/corner/)
 */
;(function($) { 

var expr = (function() {
	if (! $.browser.msie) return false;
    var div = document.createElement('div');
    try { div.style.setExpression('width','0+0'); }
    catch(e) { return false; }
    return true;
})();
    
function sz(el, p) { 
    return parseInt($.css(el,p))||0; 
};
function hex2(s) {
    var s = parseInt(s).toString(16);
    return ( s.length < 2 ) ? '0'+s : s;
};
function gpc(node) {
    for ( ; node && node.nodeName.toLowerCase() != 'html'; node = node.parentNode ) {
        var v = $.css(node,'backgroundColor');
        if (v == 'rgba(0, 0, 0, 0)')
            continue; // webkit
        if (v.indexOf('rgb') >= 0) { 
            var rgb = v.match(/\d+/g); 
            return '#'+ hex2(rgb[0]) + hex2(rgb[1]) + hex2(rgb[2]);
        }
        if ( v && v != 'transparent' )
            return v;
    }
    return '#ffffff';
};

function getWidth(fx, i, width) {
    switch(fx) {
    case 'round':  return Math.round(width*(1-Math.cos(Math.asin(i/width))));
    case 'cool':   return Math.round(width*(1+Math.cos(Math.asin(i/width))));
    case 'sharp':  return Math.round(width*(1-Math.cos(Math.acos(i/width))));
    case 'bite':   return Math.round(width*(Math.cos(Math.asin((width-i-1)/width))));
    case 'slide':  return Math.round(width*(Math.atan2(i,width/i)));
    case 'jut':    return Math.round(width*(Math.atan2(width,(width-i-1))));
    case 'curl':   return Math.round(width*(Math.atan(i)));
    case 'tear':   return Math.round(width*(Math.cos(i)));
    case 'wicked': return Math.round(width*(Math.tan(i)));
    case 'long':   return Math.round(width*(Math.sqrt(i)));
    case 'sculpt': return Math.round(width*(Math.log((width-i-1),width)));
    case 'dog':    return (i&1) ? (i+1) : width;
    case 'dog2':   return (i&2) ? (i+1) : width;
    case 'dog3':   return (i&3) ? (i+1) : width;
    case 'fray':   return (i%2)*width;
    case 'notch':  return width; 
    case 'bevel':  return i+1;
    }
};

$.fn.corner = function(o) {
    // in 1.3+ we can fix mistakes with the ready state
	if (this.length == 0) {
        if (!$.isReady && this.selector) {
            var s = this.selector, c = this.context;
            $(function() {
                $(s,c).corner(o);
            });
        }
        return this;
	}

    o = (o||"").toLowerCase();
    var keep = /keep/.test(o);                       // keep borders?
    var cc = ((o.match(/cc:(#[0-9a-f]+)/)||[])[1]);  // corner color
    var sc = ((o.match(/sc:(#[0-9a-f]+)/)||[])[1]);  // strip color
    var width = parseInt((o.match(/(\d+)px/)||[])[1]) || 10; // corner width
    var re = /round|bevel|notch|bite|cool|sharp|slide|jut|curl|tear|fray|wicked|sculpt|long|dog3|dog2|dog/;
    var fx = ((o.match(re)||['round'])[0]);
    var edges = { T:0, B:1 };
    var opts = {
        TL:  /top|tl/.test(o),       TR:  /top|tr/.test(o),
        BL:  /bottom|bl/.test(o),    BR:  /bottom|br/.test(o)
    };
    if ( !opts.TL && !opts.TR && !opts.BL && !opts.BR )
        opts = { TL:1, TR:1, BL:1, BR:1 };
    var strip = document.createElement('div');
    strip.style.overflow = 'hidden';
    strip.style.height = '1px';
    strip.style.backgroundColor = sc || 'transparent';
    strip.style.borderStyle = 'solid';
    return this.each(function(index){
        var pad = {
            T: parseInt($.css(this,'paddingTop'))||0,     R: parseInt($.css(this,'paddingRight'))||0,
            B: parseInt($.css(this,'paddingBottom'))||0,  L: parseInt($.css(this,'paddingLeft'))||0
        };

        if (typeof this.style.zoom != undefined) this.style.zoom = 1; // force 'hasLayout' in IE
        if (!keep) this.style.border = 'none';
        strip.style.borderColor = cc || gpc(this.parentNode);
        var cssHeight = $.curCSS(this, 'height');

        for (var j in edges) {
            var bot = edges[j];
            // only add stips if needed
            if ((bot && (opts.BL || opts.BR)) || (!bot && (opts.TL || opts.TR))) {
                strip.style.borderStyle = 'none '+(opts[j+'R']?'solid':'none')+' none '+(opts[j+'L']?'solid':'none');
                var d = document.createElement('div');
                $(d).addClass('jquery-corner');
                var ds = d.style;

                bot ? this.appendChild(d) : this.insertBefore(d, this.firstChild);

                if (bot && cssHeight != 'auto') {
                    if ($.css(this,'position') == 'static')
                        this.style.position = 'relative';
                    ds.position = 'absolute';
                    ds.bottom = ds.left = ds.padding = ds.margin = '0';
                    if (expr)
                        ds.setExpression('width', 'this.parentNode.offsetWidth');
                    else
                        ds.width = '100%';
                }
                else if (!bot && $.browser.msie) {
                    if ($.css(this,'position') == 'static')
                        this.style.position = 'relative';
                    ds.position = 'absolute';
                    ds.top = ds.left = ds.right = ds.padding = ds.margin = '0';
                    
                    // fix ie6 problem when blocked element has a border width
                    if (expr) {
                        var bw = sz(this,'borderLeftWidth') + sz(this,'borderRightWidth');
                        ds.setExpression('width', 'this.parentNode.offsetWidth - '+bw+'+ "px"');
                    }
                    else
                        ds.width = '100%';
                }
                else {
                	ds.position = 'relative';
                    ds.margin = !bot ? '-'+pad.T+'px -'+pad.R+'px '+(pad.T-width)+'px -'+pad.L+'px' : 
                                        (pad.B-width)+'px -'+pad.R+'px -'+pad.B+'px -'+pad.L+'px';                
                }

                for (var i=0; i < width; i++) {
                    var w = Math.max(0,getWidth(fx,i, width));
                    var e = strip.cloneNode(false);
                    e.style.borderWidth = '0 '+(opts[j+'R']?w:0)+'px 0 '+(opts[j+'L']?w:0)+'px';
                    bot ? d.appendChild(e) : d.insertBefore(e, d.firstChild);
                }
            }
        }
    });
};

$.fn.uncorner = function() { 
	$('div.jquery-corner', this).remove();
	return this;
};
    
})(jQuery);


$.extend({ URLEncode: function(c) {
    var o = ''; var x = 0; c = c.toString(); var r = /(^[a-zA-Z0-9_.]*)/;
    while (x < c.length) {
        var m = r.exec(c.substr(x));
        if (m != null && m.length > 1 && m[1] != '') {
            o += m[1]; x += m[1].length;
        } else {
            if (c[x] == ' ') o += '+'; else {
                var d = c.charCodeAt(x); var h = d.toString(16);
                o += '%' + (h.length < 2 ? '0' : '') + h.toUpperCase();
            } x++;
        } 
    } return o;
},
    URLDecode: function(s) {
        var o = s; var binVal, t; var r = /(%[^%]{2})/;
        while ((m = r.exec(o)) != null && m.length > 1 && m[1] != '') {
            b = parseInt(m[1].substr(1), 16);
            t = String.fromCharCode(b); o = o.replace(m[1], t);
        } return o;
    }
});


/**
* jQuery BASE64 functions
* 
* 	<code>
* 		Encodes the given data with base64. 
* 		String $.base64Encode ( String str )
*		<br />
* 		Decodes a base64 encoded data.
* 		String $.base64Decode ( String str )
* 	</code>
* 
* Encodes and Decodes the given data in base64.
* This encoding is designed to make binary data survive transport through transport layers that are not 8-bit clean, such as mail bodies.
* Base64-encoded data takes about 33% more space than the original data. 
* This javascript code is used to encode / decode data using base64 (this encoding is designed to make binary data survive transport through transport layers that are not 8-bit clean). Script is fully compatible with UTF-8 encoding. You can use base64 encoded data as simple encryption mechanism.
* If you plan using UTF-8 encoding in your project don't forget to set the page encoding to UTF-8 (Content-Type meta tag). 
* This function orginally get from the WebToolkit and rewrite for using as the jQuery plugin.
* 
* Example
* 	Code
* 		<code>
* 			$.base64Encode("I'm Persian."); 
* 		</code>
* 	Result
* 		<code>
* 			"SSdtIFBlcnNpYW4u"
* 		</code>
* 	Code
* 		<code>
* 			$.base64Decode("SSdtIFBlcnNpYW4u");
* 		</code>
* 	Result
* 		<code>
* 			"I'm Persian."
* 		</code>
* 
* @alias Muhammad Hussein Fattahizadeh < muhammad [AT] semnanweb [DOT] com >
* @link http://www.semnanweb.com/jquery-plugin/base64.html
* @see http://www.webtoolkit.info/
* @license http://www.gnu.org/licenses/gpl.html [GNU General Public License]
* @param {jQuery} {base64Encode:function(input))
* @param {jQuery} {base64Decode:function(input))
* @return string
*/

(function($) {

    var keyString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    var uTF8Encode = function(string) {
        string = string.replace(/\x0d\x0a/g, "\x0a");
        var output = "";
        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);
            if (c < 128) {
                output += String.fromCharCode(c);
            } else if ((c > 127) && (c < 2048)) {
                output += String.fromCharCode((c >> 6) | 192);
                output += String.fromCharCode((c & 63) | 128);
            } else {
                output += String.fromCharCode((c >> 12) | 224);
                output += String.fromCharCode(((c >> 6) & 63) | 128);
                output += String.fromCharCode((c & 63) | 128);
            }
        }
        return output;
    };

    var uTF8Decode = function(input) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;
        while (i < input.length) {
            c = input.charCodeAt(i);
            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            } else if ((c > 191) && (c < 224)) {
                c2 = input.charCodeAt(i + 1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            } else {
                c2 = input.charCodeAt(i + 1);
                c3 = input.charCodeAt(i + 2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }
        }
        return string;
    }

    $.extend({
        base64Encode: function(input) {
            var output = "";
            var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
            var i = 0;
            input = uTF8Encode(input);
            while (i < input.length) {
                chr1 = input.charCodeAt(i++);
                chr2 = input.charCodeAt(i++);
                chr3 = input.charCodeAt(i++);
                enc1 = chr1 >> 2;
                enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                enc4 = chr3 & 63;
                if (isNaN(chr2)) {
                    enc3 = enc4 = 64;
                } else if (isNaN(chr3)) {
                    enc4 = 64;
                }
                output = output + keyString.charAt(enc1) + keyString.charAt(enc2) + keyString.charAt(enc3) + keyString.charAt(enc4);
            }
            return output;
        },
        base64Decode: function(input) {
            var output = "";
            var chr1, chr2, chr3;
            var enc1, enc2, enc3, enc4;
            var i = 0;
            input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
            while (i < input.length) {
                enc1 = keyString.indexOf(input.charAt(i++));
                enc2 = keyString.indexOf(input.charAt(i++));
                enc3 = keyString.indexOf(input.charAt(i++));
                enc4 = keyString.indexOf(input.charAt(i++));
                chr1 = (enc1 << 2) | (enc2 >> 4);
                chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                chr3 = ((enc3 & 3) << 6) | enc4;
                output = output + String.fromCharCode(chr1);
                if (enc3 != 64) {
                    output = output + String.fromCharCode(chr2);
                }
                if (enc4 != 64) {
                    output = output + String.fromCharCode(chr3);
                }
            }
            output = uTF8Decode(output);
            return output;
        }
    });
})(jQuery);


$.fn.scrollTo = function() {
    var x = this.eq(0).offset().top - 100; // 100 provides buffer in viewport
    $('html,body').animate({ scrollTop: x }, 500);
}


function ModalPopup(link) {
    $("#popup a[rel=popup]").attr("href", link).trigger("click");
}

$.fn.popup = function(options, callback) {
    var options = $.extend({
        duration: 250
    }, options);

    if ($("#overlay").size() < 1) {
        $("<div></div>").attr("id", "overlay").appendTo("body")
    }
    var tags = $(this);
    if ($("#popup").size() < 1) {
        $("<div id=\"popup\" class=\"popup\"><div class=\"close\"><div><span>" + Texts.Popup.Close + "</span></div></div><a href=\"\" style=\"display: none;\" rel=\"popup\"></a><div id=\"popup-container\"></div></div>").appendTo("body");
        tags = tags.add($("#popup a[rel=popup]"));
    }

    $('#popup > div.close, #overlay').bind('click', function() {
        $('#popup').fadeOut(options.duration, function() {
            $('#overlay').eq(0).fadeOut(options.duration, function() {
                $('#popup > div').eq(1).empty();
            });
        });
    });

    return tags.each(function() {
        $(this).click(function(event) {
            var anchor = $(this);
            var url = anchor.attr('href');
            var cls = anchor.attr('rev');
            if (anchor.attr("tracking")) {
                gaTracker._trackEvent('Modal popup', anchor.attr("tracking"), url);
            }
            
            $('#overlay').css({ 'opacity': 0, 'display': 'block' }).fadeTo(options.duration, 0.8, function() {
                $.get(url, function(content) {
                    var popup = $('#popup');
                    var container = $("#popup > div").eq(1);
                    popup.attr("class", cls).addClass("popup");

                    var centerVertical = anchor.hasClass("center-vertical");

                    var reposition = function(e) {
                        if (--imageCount <= 0) {
                            popup.css("opacity", "0.0000001").show();
                            container.html(content);
                            popup.css("opacity", "").hide();

                            var head = $("head");
                            $("style", container).each(function() {
                                head.append($(this).clone());
                                $(this).remove();
                            });

                            //if (e && !$.browser.msie) {
                            //  container.find('img[src=' + e.currentTarget.src + ']').width(e.currentTarget.width).height(e.currentTarget.height);
                            //}
                            var offset = document.body.scrollTop || document.documentElement.scrollTop;
                            popup.css({ position: 'absolute', left: ($(window).width() / 2 - popup.width() / 2) + 'px' })
                            if ($.browser.msie) {
                                var body = $("body");
                                popup.css('left', body.width() / 2 - popup.width() / 2 - popup.position().left / 2);
                                if (popup.height() + offset > body.height()) {
                                    body.css("height", popup.height() + offset + 15);
                                }
                            }

                            if (centerVertical)
                                popup.css("top", (offset + $(window).height() / 2 - popup.height() / 2) + 'px');
                            else
                                popup.css("top", offset + 30 + 'px');

                            popup.css("opacity", "0.0000001").show();
                            Initiate(container);
                            popup.css("opacity", "").hide();

                            popup.fadeIn(options.duration, function() {
                                if (callback != null)
                                    callback();
                            });
                        }
                    }
                    sReg = /\b(src)\s*=\s*"([^"]*)"/g;
                    matchArr = content.match(sReg);

                    var imageCount = 0;
                    if (matchArr != null) {
                        var imagesToLoad = new Array();
                        for (i = 0; i < matchArr.length; i++) {
                            imagesToLoad.push(matchArr[i].replace(/src\s*=\s*"/g, "").replace(/"$/, ""));
                        }

                        imageCount = imagesToLoad.length;
                        for (i = 0; i < imagesToLoad.length; i++) {
                            var img = new Image();
                            img.onload = reposition;
                            img.onerror = reposition;
                            img.onabort = reposition;
                            img.src = imagesToLoad[i];
                        }
                    } else {
                        reposition();
                    }
                }, "xml");
            });
            event.preventDefault();
        });
    });
}


$.fn.carousel = function(options) {
    var options = $.extend({
        duration: 500,
        pagination: true
    }, options);

    return this.each(function() {
        var container = $(this),
            carousel = container.children("div.items"),
            carouselWidth = carousel.outerWidth(),
            carouselHeight = carousel.outerHeight(),
            itemsPerPage = Math.floor((carouselHeight * carouselWidth) / (carousel.children("ul").children("li").outerHeight() * carousel.children("ul").children("li").outerWidth())),
            vertical = container.hasClass("vertical"),
            nextBtn = $('<span></span>').addClass('next'),
            prevBtn = $('<span></span>').addClass('previous');

        var counter = 0;
        var needNew = true;
        var ul = null;
        carousel.children("ul").children("li").each(function() {
            if (needNew) {
                ul = $("<ul></ul>");
                carousel.append(ul);
                needNew = false;
            }

            var li = $(this);
            var liClone = li.clone();
            liClone.addClass(counter % 2 == 0 ? "odd" : "even").addClass("n" + (counter + 1));
            ul.append(liClone);
            li.remove();

            if (++counter % itemsPerPage == 0) {
                needNew = true;
            }
        });
        carousel.children("ul:eq(0)").remove();

        var lists = carousel.children("ul"),
            pages = lists.size(),
            page = 0;

        if (lists.size() <= 1)
            return true;
        
        var pagination = null;
        if (options.pagination) {
            pagination = $('<ol class="pagination"></ol>');
            for (i = 0; i < lists.size(); i++) {
                pagination.append('<li' + (i == 0 ? ' class="active"' : "") + '>' + i + '</li>');
            }
            var title = $("h6", container);
            if (title.size() > 0) {
                title.append(pagination);
            } else {
                container.append(pagination);
            }
        }

        nextBtn.add(prevBtn).appendTo(container);
        if (vertical) {

        } else {
            carousel.wrapInner($("<div></div>").height(carouselHeight).width(carouselWidth * 2).css("overflow", "hidden"));
            lists.width(carouselWidth);
        }

        $("div.items ul:first li", container).each(function() {
            var anchor = $("a:first", this);
            if (anchor.attr("rel")) {
                anchor.children("img").attr("src", anchor.attr("rel"));
                anchor.removeAttr("rel");
            }
        });

        nextBtn.click(function() {
            gaTracker._trackEvent('Carousel', 'Navigate Next', container.attr("tracking"));

            if (page == (pages - 1)) {
                page = 0;
                lists.animate(vertical ? { marginTop: 0} : { marginLeft: 0 }, {
                    duration: options.duration,
                    queue: false
                });
            } else {
                page++;
                lists.eq(page).prev().animate(vertical ? { marginTop: -carouselHeight} : { marginLeft: -carouselWidth }, {
                    duration: options.duration,
                    queue: false
                });
            }

            if (pagination != null)
                $("li", pagination).eq(page).addClass("active").siblings().removeClass("active");


            $("div.items ul:eq(" + page + ") li", container).each(function() {
                var anchor = $("a:first", this);
                if (anchor.attr("rel")) {
                    anchor.children("img").attr("src", anchor.attr("rel"));
                    anchor.removeAttr("rel");
                }
            });
        });

        prevBtn.click(function() {
            gaTracker._trackEvent('Carousel', 'Navigate Previous', container.attr("tracking"));
            if (page == 0) {
                page = pages - 1;
                lists.filter(":not(:last)").animate(vertical ? { marginTop: -carouselHeight} : { marginLeft: -carouselWidth }, {
                    duration: options.duration,
                    queue: false
                });
            } else {
                page--;
                lists.eq(page).animate(vertical ? { marginTop: 0} : { marginLeft: 0 }, {
                    duration: options.duration,
                    queue: false
                });
            }

            if (pagination != null)
                $("li", pagination).eq(page).addClass("active").siblings().removeClass("active");


            $("div.items ul:eq(" + page + ") li", container).each(function() {
                var anchor = $("a:first", this);
                if (anchor.attr("rel")) {
                    anchor.children("img").attr("src", anchor.attr("rel"));
                    anchor.removeAttr("rel");
                }
            });
        });
    });
}


/*
 * jQuery Form Plugin
 * version: 2.28 (10-MAY-2009)
 * @requires jQuery v1.2.2 or later
 *
 * Examples and documentation at: http://malsup.com/jquery/form/
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */
;(function($) {

    /*
    Usage Note:
    -----------
    Do not use both ajaxSubmit and ajaxForm on the same form.  These
    functions are intended to be exclusive.  Use ajaxSubmit if you want
    to bind your own submit handler to the form.  For example,

    $(document).ready(function() {
    $('#myForm').bind('submit', function() {
    $(this).ajaxSubmit({
    target: '#output'
    });
    return false; // <-- important!
    });
    });

    Use ajaxForm when you want the plugin to manage all the event binding
    for you.  For example,

    $(document).ready(function() {
    $('#myForm').ajaxForm({
    target: '#output'
    });
    });

    When using ajaxForm, the ajaxSubmit function will be invoked for you
    at the appropriate time.
    */

    /**
    * ajaxSubmit() provides a mechanism for immediately submitting
    * an HTML form using AJAX.
    */
    $.fn.ajaxSubmit = function(options) {
        // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
        if (!this.length) {
            log('ajaxSubmit: skipping submit process - no element selected');
            return this;
        }

        if (typeof options == 'function')
            options = { success: options };

        var url = $.trim(this.attr('action'));
        if (url) {
            // clean url (don't include hash vaue)
            url = (url.match(/^([^#]+)/) || [])[1];
        }
        url = url || window.location.href || ''

        options = $.extend({
            url: url,
            type: this.attr('method') || 'GET'
        }, options || {});

        // hook for manipulating the form data before it is extracted;
        // convenient for use with rich editors like tinyMCE or FCKEditor
        var veto = {};
        this.trigger('form-pre-serialize', [this, options, veto]);
        if (veto.veto) {
            log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
            return this;
        }

        // provide opportunity to alter form data before it is serialized
        if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
            log('ajaxSubmit: submit aborted via beforeSerialize callback');
            return this;
        }

        var a = this.formToArray(options.semantic);
        if (options.data) {
            options.extraData = options.data;
            for (var n in options.data) {
                if (options.data[n] instanceof Array) {
                    for (var k in options.data[n])
                        a.push({ name: n, value: options.data[n][k] });
                }
                else
                    a.push({ name: n, value: options.data[n] });
            }
        }

        // give pre-submit callback an opportunity to abort the submit
        if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
            log('ajaxSubmit: submit aborted via beforeSubmit callback');
            return this;
        }

        // fire vetoable 'validate' event
        this.trigger('form-submit-validate', [a, this, options, veto]);
        if (veto.veto) {
            log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
            return this;
        }

        var q = $.param(a);

        if (options.type.toUpperCase() == 'GET') {
            options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
            options.data = null;  // data is null for 'get'
        }
        else
            options.data = q; // data is the query string for 'post'

        var $form = this, callbacks = [];
        if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
        if (options.clearForm) callbacks.push(function() { $form.clearForm(); });

        // perform a load on the target only if dataType is not provided
        if (!options.dataType && options.target) {
            var oldSuccess = options.success || function() { };
            callbacks.push(function(data) {
                if (options.replaceTarget)
                    $(options.target).replaceWith(data).each(oldSuccess, arguments);
                else
                    $(options.target).html(data).each(oldSuccess, arguments);
            });
        }
        else if (options.success)
            callbacks.push(options.success);

        options.success = function(data, status) {
            for (var i = 0, max = callbacks.length; i < max; i++)
                callbacks[i].apply(options, [data, status, $form]);
        };

        // are there files to upload?
        var files = $('input:file', this).fieldValue();
        var found = false;
        for (var j = 0; j < files.length; j++)
            if (files[j])
            found = true;

        var multipart = false;
        //	var mp = 'multipart/form-data';
        //	multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);

        // options.iframe allows user to force iframe mode
        if (options.iframe || found || multipart) {
            // hack to fix Safari hang (thanks to Tim Molendijk for this)
            // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
            if (options.closeKeepAlive)
                $.get(options.closeKeepAlive, fileUpload);
            else
                fileUpload();
        }
        else
            $.ajax(options);

        // fire 'notify' event
        this.trigger('form-submit-notify', [this, options]);
        return this;


        // private function for handling file uploads (hat tip to YAHOO!)
        function fileUpload() {
            var form = $form[0];

            if ($(':input[name=submit]', form).length) {
                alert('Error: Form elements must not be named "submit".');
                return;
            }

            var opts = $.extend({}, $.ajaxSettings, options);
            var s = $.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts);

            var id = 'jqFormIO' + (new Date().getTime());
            var $io = $('<iframe id="' + id + '" name="' + id + '" src="about:blank" />');
            var io = $io[0];

            $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });

            var xhr = { // mock object
                aborted: 0,
                responseText: null,
                responseXML: null,
                status: 0,
                statusText: 'n/a',
                getAllResponseHeaders: function() { },
                getResponseHeader: function() { },
                setRequestHeader: function() { },
                abort: function() {
                    this.aborted = 1;
                    $io.attr('src', 'about:blank'); // abort op in progress
                }
            };

            var g = opts.global;
            // trigger ajax global events so that activity/block indicators work like normal
            if (g && !$.active++) $.event.trigger("ajaxStart");
            if (g) $.event.trigger("ajaxSend", [xhr, opts]);

            if (s.beforeSend && s.beforeSend(xhr, s) === false) {
                s.global && $.active--;
                return;
            }
            if (xhr.aborted)
                return;

            var cbInvoked = 0;
            var timedOut = 0;

            // add submitting element to data if we know it
            var sub = form.clk;
            if (sub) {
                var n = sub.name;
                if (n && !sub.disabled) {
                    options.extraData = options.extraData || {};
                    options.extraData[n] = sub.value;
                    if (sub.type == "image") {
                        options.extraData[name + '.x'] = form.clk_x;
                        options.extraData[name + '.y'] = form.clk_y;
                    }
                }
            }

            // take a breath so that pending repaints get some cpu time before the upload starts
            setTimeout(function() {
                // make sure form attrs are set
                var t = $form.attr('target'), a = $form.attr('action');

                // update form attrs in IE friendly way
                form.setAttribute('target', id);
                if (form.getAttribute('method') != 'POST')
                    form.setAttribute('method', 'POST');
                if (form.getAttribute('action') != opts.url)
                    form.setAttribute('action', opts.url);

                // ie borks in some cases when setting encoding
                if (!options.skipEncodingOverride) {
                    $form.attr({
                        encoding: 'multipart/form-data',
                        enctype: 'multipart/form-data'
                    });
                }

                // support timout
                if (opts.timeout)
                    setTimeout(function() { timedOut = true; cb(); }, opts.timeout);

                // add "extra" data to form if provided in options
                var extraInputs = [];
                try {
                    if (options.extraData)
                        for (var n in options.extraData)
                        extraInputs.push(
                            $('<input type="hidden" name="' + n + '" value="' + options.extraData[n] + '" />')
                                .appendTo(form)[0]);

                    // add iframe to doc and submit the form
                    $io.appendTo('body');
                    io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
                    form.submit();
                }
                finally {
                    // reset attrs and remove "extra" input elements
                    form.setAttribute('action', a);
                    t ? form.setAttribute('target', t) : $form.removeAttr('target');
                    $(extraInputs).remove();
                }
            }, 10);

            var nullCheckFlag = 0;

            function cb() {
                if (cbInvoked++) return;

                io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);

                var ok = true;
                try {
                    if (timedOut) throw 'timeout';
                    // extract the server response from the iframe
                    var data, doc;

                    doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;

                    if ((doc.body == null || doc.body.innerHTML == '') && !nullCheckFlag) {
                        // in some browsers (cough, Opera 9.2.x) the iframe DOM is not always traversable when
                        // the onload callback fires, so we give them a 2nd chance
                        nullCheckFlag = 1;
                        cbInvoked--;
                        setTimeout(cb, 100);
                        return;
                    }

                    xhr.responseText = doc.body ? doc.body.innerHTML : null;
                    xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
                    xhr.getResponseHeader = function(header) {
                        var headers = { 'content-type': opts.dataType };
                        return headers[header];
                    };

                    if (opts.dataType == 'json' || opts.dataType == 'script') {
                        var ta = doc.getElementsByTagName('textarea')[0];
                        xhr.responseText = ta ? ta.value : xhr.responseText;
                    }
                    else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
                        xhr.responseXML = toXml(xhr.responseText);
                    }
                    data = $.httpData(xhr, opts.dataType);
                }
                catch (e) {
                    ok = false;
                    $.handleError(opts, xhr, 'error', e);
                }

                // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
                if (ok) {
                    opts.success(data, 'success');
                    if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
                }
                if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
                if (g && ! --$.active) $.event.trigger("ajaxStop");
                if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');

                // clean up
                setTimeout(function() {
                    $io.remove();
                    xhr.responseXML = null;
                }, 100);
            };

            function toXml(s, doc) {
                if (window.ActiveXObject) {
                    doc = new ActiveXObject('Microsoft.XMLDOM');
                    doc.async = 'false';
                    doc.loadXML(s);
                }
                else
                    doc = (new DOMParser()).parseFromString(s, 'text/xml');
                return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
            };
        };
    };

    /**
    * ajaxForm() provides a mechanism for fully automating form submission.
    *
    * The advantages of using this method instead of ajaxSubmit() are:
    *
    * 1: This method will include coordinates for <input type="image" /> elements (if the element
    *    is used to submit the form).
    * 2. This method will include the submit element's name/value data (for the element that was
    *    used to submit the form).
    * 3. This method binds the submit() method to the form for you.
    *
    * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
    * passes the options argument along after properly binding events for submit elements and
    * the form itself.
    */
    $.fn.ajaxForm = function(options) {
        return this.ajaxFormUnbind().bind('submit.form-plugin', function() {
            $(this).ajaxSubmit(options);
            return false;
        }).each(function() {
            // store options in hash
            $(":submit,input:image", this).bind('click.form-plugin', function(e) {
                var form = this.form;
                form.clk = this;
                if (this.type == 'image') {
                    if (e.offsetX != undefined) {
                        form.clk_x = e.offsetX;
                        form.clk_y = e.offsetY;
                    } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
                        var offset = $(this).offset();
                        form.clk_x = e.pageX - offset.left;
                        form.clk_y = e.pageY - offset.top;
                    } else {
                        form.clk_x = e.pageX - this.offsetLeft;
                        form.clk_y = e.pageY - this.offsetTop;
                    }
                }
                // clear form vars
                setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 10);
            });
        });
    };

    // ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
    $.fn.ajaxFormUnbind = function() {
        this.unbind('submit.form-plugin');
        return this.each(function() {
            $(":submit,input:image", this).unbind('click.form-plugin');
        });

    };

    /**
    * formToArray() gathers form element data into an array of objects that can
    * be passed to any of the following ajax functions: $.get, $.post, or load.
    * Each object in the array has both a 'name' and 'value' property.  An example of
    * an array for a simple login form might be:
    *
    * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
    *
    * It is this array that is passed to pre-submit callback functions provided to the
    * ajaxSubmit() and ajaxForm() methods.
    */
    $.fn.formToArray = function(semantic) {
        var a = [];
        if (this.length == 0) return a;

        var form = this[0];
        var els = semantic ? form.getElementsByTagName('*') : form.elements;
        if (!els) return a;
        for (var i = 0, max = els.length; i < max; i++) {
            var el = els[i];
            var n = el.name;
            if (!n) continue;

            if (semantic && form.clk && el.type == "image") {
                // handle image inputs on the fly when semantic == true
                if (!el.disabled && form.clk == el) {
                    a.push({ name: n, value: $(el).val() });
                    a.push({ name: n + '.x', value: form.clk_x }, { name: n + '.y', value: form.clk_y });
                }
                continue;
            }

            var v = $.fieldValue(el, true);
            if (v && v.constructor == Array) {
                for (var j = 0, jmax = v.length; j < jmax; j++)
                    a.push({ name: n, value: v[j] });
            }
            else if (v !== null && typeof v != 'undefined')
                a.push({ name: n, value: v });
        }

        if (!semantic && form.clk) {
            // input type=='image' are not found in elements array! handle it here
            var $input = $(form.clk), input = $input[0], n = input.name;
            if (n && !input.disabled && input.type == 'image') {
                a.push({ name: n, value: $input.val() });
                a.push({ name: n + '.x', value: form.clk_x }, { name: n + '.y', value: form.clk_y });
            }
        }
        return a;
    };

    /**
    * Serializes form data into a 'submittable' string. This method will return a string
    * in the format: name1=value1&amp;name2=value2
    */
    $.fn.formSerialize = function(semantic) {
        //hand off to jQuery.param for proper encoding
        return $.param(this.formToArray(semantic));
    };

    /**
    * Serializes all field elements in the jQuery object into a query string.
    * This method will return a string in the format: name1=value1&amp;name2=value2
    */
    $.fn.fieldSerialize = function(successful) {
        var a = [];
        this.each(function() {
            var n = this.name;
            if (!n) return;
            var v = $.fieldValue(this, successful);
            if (v && v.constructor == Array) {
                for (var i = 0, max = v.length; i < max; i++)
                    a.push({ name: n, value: v[i] });
            }
            else if (v !== null && typeof v != 'undefined')
                a.push({ name: this.name, value: v });
        });
        //hand off to jQuery.param for proper encoding
        return $.param(a);
    };

    /**
    * Returns the value(s) of the element in the matched set.  For example, consider the following form:
    *
    *  <form><fieldset>
    *      <input name="A" type="text" />
    *      <input name="A" type="text" />
    *      <input name="B" type="checkbox" value="B1" />
    *      <input name="B" type="checkbox" value="B2"/>
    *      <input name="C" type="radio" value="C1" />
    *      <input name="C" type="radio" value="C2" />
    *  </fieldset></form>
    *
    *  var v = $(':text').fieldValue();
    *  // if no values are entered into the text inputs
    *  v == ['','']
    *  // if values entered into the text inputs are 'foo' and 'bar'
    *  v == ['foo','bar']
    *
    *  var v = $(':checkbox').fieldValue();
    *  // if neither checkbox is checked
    *  v === undefined
    *  // if both checkboxes are checked
    *  v == ['B1', 'B2']
    *
    *  var v = $(':radio').fieldValue();
    *  // if neither radio is checked
    *  v === undefined
    *  // if first radio is checked
    *  v == ['C1']
    *
    * The successful argument controls whether or not the field element must be 'successful'
    * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
    * The default value of the successful argument is true.  If this value is false the value(s)
    * for each element is returned.
    *
    * Note: This method *always* returns an array.  If no valid value can be determined the
    *       array will be empty, otherwise it will contain one or more values.
    */
    $.fn.fieldValue = function(successful) {
        for (var val = [], i = 0, max = this.length; i < max; i++) {
            var el = this[i];
            var v = $.fieldValue(el, successful);
            if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
                continue;
            v.constructor == Array ? $.merge(val, v) : val.push(v);
        }
        return val;
    };

    /**
    * Returns the value of the field element.
    */
    $.fieldValue = function(el, successful) {
        var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
        if (typeof successful == 'undefined') successful = true;

        if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
        (t == 'checkbox' || t == 'radio') && !el.checked ||
        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
        tag == 'select' && el.selectedIndex == -1))
            return null;

        if (tag == 'select') {
            var index = el.selectedIndex;
            if (index < 0) return null;
            var a = [], ops = el.options;
            var one = (t == 'select-one');
            var max = (one ? index + 1 : ops.length);
            for (var i = (one ? index : 0); i < max; i++) {
                var op = ops[i];
                if (op.selected) {
                    var v = op.value;
                    if (!v) // extra pain for IE...
                        v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
                    if (one) return v;
                    a.push(v);
                }
            }
            return a;
        }

        if ($.browser.msie && tag == 'button') {
            return el.getAttributeNode('value').value;
        }

        return el.value;
    };

    /**
    * Clears the form data.  Takes the following actions on the form's input fields:
    *  - input text fields will have their 'value' property set to the empty string
    *  - select elements will have their 'selectedIndex' property set to -1
    *  - checkbox and radio inputs will have their 'checked' property set to false
    *  - inputs of type submit, button, reset, and hidden will *not* be effected
    *  - button elements will *not* be effected
    */
    $.fn.clearForm = function() {
        return this.each(function() {
            $('input,select,textarea', this).clearFields();
        });
    };

    /**
    * Clears the selected form elements.
    */
    $.fn.clearFields = $.fn.clearInputs = function() {
        return this.each(function() {
            var t = this.type, tag = this.tagName.toLowerCase();
            if (t == 'text' || t == 'password' || tag == 'textarea')
                this.value = '';
            else if (t == 'checkbox' || t == 'radio')
                this.checked = false;
            else if (tag == 'select')
                this.selectedIndex = -1;
        });
    };

    /**
    * Resets the form data.  Causes all form elements to be reset to their original value.
    */
    $.fn.resetForm = function() {
        return this.each(function() {
            // guard against an input with the name of 'reset'
            // note that IE reports the reset function as an 'object'
            if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
                this.reset();
        });
    };

    /**
    * Enables or disables any matching elements.
    */
    $.fn.enable = function(b) {
        if (b == undefined) b = true;
        return this.each(function() {
            this.disabled = !b;
        });
    };

    /**
    * Checks/unchecks any matching checkboxes or radio buttons and
    * selects/deselects and matching option elements.
    */
    $.fn.selected = function(select) {
        if (select == undefined) select = true;
        return this.each(function() {
            var t = this.type;
            if (t == 'checkbox' || t == 'radio')
                this.checked = select;
            else if (this.tagName.toLowerCase() == 'option') {
                var $sel = $(this).parent('select');
                if (select && $sel[0] && $sel[0].type == 'select-one') {
                    // deselect all other options
                    $sel.find('option').selected(false);
                }
                this.selected = select;
            }
        });
    };

    // helper fn for console logging
    // set $.fn.ajaxSubmit.debug to true to enable debug logging
    function log() {
        if ($.fn.ajaxSubmit.debug && window.console && window.console.log)
            window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments, ''));
    };

})(jQuery);


$.fn.customStyle = function() {
    this.each(function() {
        var element = $(this);

        if (element.attr("tagName").toLowerCase() == "select") {
            var selectedOption = $("option:selected", element);
            var spanId = "select_" + Math.ceil(Math.random() * 1000000);

            var div = element.wrap("<div></div>").parent();
            div.addClass("select custom-style");
            var span = $("<span></span>").text(selectedOption.text());
            div.append(span);

            element.width(div.width() + 24);

            element.change(function() {
                var selectBox = $(this);
                var selectedOption = $("option:selected", selectBox);
                selectBox.siblings("span").text(selectedOption.text());
            });
        }
    });
}


//(function($) {
$.fn.zoom = function(options) {
    var options = $.extend({
        high: null,
        maxWidth: 0,
        zoom: { plus: null, minus: null, loader: null, steps: 3 },
        help: { text: null }
    }, options);

    this.each(function() {
        var moveInsideBoundaries = function(easing) {
            var dim = unzoomed.data("dim");
            var minX = -dim.width + viewport.width();
            var minY = -dim.height + viewport.height();
            if (dim.x > 0) { dim.x = 0; } else if (dim.x < minX) { dim.x = minX; }
            if (dim.y > 0) { dim.y = 0; } else if (dim.y < minY) { dim.y = minY; }
        }

        var startPan = function(mouseDownEvent) {
            var dim = unzoomed.data("dim");
            var viewport = $(this);
            mouseDownEvent.preventDefault();
            dim.origoX = mouseDownEvent.clientX;
            dim.origoY = mouseDownEvent.clientY;

            help.css({ opacity: 0.5 });

            viewport
            .bind("mousemove.pan", paning)
            .bind("mouseout.pan", stopPan)
            .bind("mouseup.pan", stopPan);
        }

        var paning = function(mouseMoveEvent) {
            var dim = unzoomed.data("dim");
            panned = true;
            mouseMoveEvent.preventDefault();
            var deltaX = dim.origoX - mouseMoveEvent.clientX;
            var deltaY = dim.origoY - mouseMoveEvent.clientY;
            dim.origoX = mouseMoveEvent.clientX;
            dim.origoY = mouseMoveEvent.clientY;
            dim.x = dim.x - deltaX;
            dim.y = dim.y - deltaY;
            moveInsideBoundaries();
            zoomed.css({ left: dim.x + "px", top: dim.y + "px" });
        }

        var stopPan = function() {
            viewport.unbind(".pan");
            help.css({ opacity: 1 });
            if ($.browser.msie)
                help.get(0).style.removeAttribute('filter');
        }

        var resize = function(mouseWheelEvent, easing) {
            var dim = unzoomed.data("dim");
            var wasResized = true;
            if (dim.width < viewport.width()) {
                dim.height = parseInt(dim.actualHeight * (viewport.width() / dim.actualWidth));
                dim.width = viewport.width();
                wasResized = false;
            }

            if (dim.height < viewport.height()) {
                dim.width = parseInt(dim.actualWidth * (viewport.height() / dim.actualHeight));
                dim.height = viewport.height();
                wasResized = false;
            }

            if (dim.width > viewport.data("options").maxWidth) {
                dim.height = parseInt(dim.height * (viewport.data("options").maxWidth / dim.width));
                dim.width = viewport.data("options").maxWidth;
                wasResized = false;
            }

            var x = mouseWheelEvent.faked ? mouseWheelEvent.clientX : mouseWheelEvent.pageX - viewport.offset().left;
            var y = mouseWheelEvent.faked ? mouseWheelEvent.clientY : mouseWheelEvent.pageY - viewport.offset().top;

            var xFactor = (Math.abs(dim.x) + x) / dim.oldWidth;
            dim.x = 0 - dim.width * xFactor + x;
            var yFactor = (Math.abs(dim.y) + y) / dim.oldHeight;
            dim.y = 0 - dim.height * yFactor + y;

            moveInsideBoundaries();

            var callback = function() {
                if (dim.width == dim.actualWidth) {
                    dim.factor = 0;
                    unzoomed.show();
                    zoomed.hide();
                    if (help) help.fadeOut(250);
                } else {
                    if (help && !help.data("disable")) help.fadeIn(250);
                }
            }

            if (easing) {
                zoomed.animate({ width: dim.width + "px", height: dim.height + "px", left: dim.x + "px", top: dim.y + "px" }, 250, callback);
            } else {
                zoomed.css({ width: dim.width + "px", height: dim.height + "px", left: dim.x + "px", top: dim.y + "px" });
                callback();
            }

            return wasResized;
        }

        var preload = function(mouseWheelEvent, delta) {
            mouseWheelEvent.preventDefault();
            var dim = unzoomed.data("dim");

            if (dim.factor == 0 && delta < 0)
                return;

            if (!viewport.data("loaded")) {
                loader.show();
                var image = new Image();
                image.onload = function() {
                    viewport.data("loaded", true);
                    loader.hide();
                    zoomed.attr("src", viewport.data("options").high);
                    zoom(mouseWheelEvent, delta);
                }
                image.src = viewport.data("options").high;
                gaTracker._trackEvent('Zoom', unzoomed.attr("tracking"));
            } else {
                zoom(mouseWheelEvent, delta);
            }
        }

        var zoom = function(mouseWheelEvent, delta) {
            var dim = unzoomed.data("dim");
            var options = viewport.data("options");
            var maxFactor = (options.maxWidth - dim.actualWidth) / dim.actualWidth * 100;
            if (!mouseWheelEvent.solid) {
                delta = delta * 10;
            } else {
                delta = delta * (maxFactor / options.zoom.steps);
            }
            var originalFactor = dim.factor;
            dim.factor = dim.factor + delta;

            if (dim.factor < 0 || Math.floor(dim.factor) <= 0) {
                dim.factor = 0;
            } else if (dim.factor > maxFactor) {
                dim.factor = maxFactor;
            }

            if (originalFactor == 0 && dim.factor > 0) {
                unzoomed.hide();
                zoomed.show();
            }
            dim.oldWidth = dim.width;
            dim.oldHeight = dim.height;
            dim.width = dim.factor / 100 * dim.actualWidth + dim.actualWidth;
            dim.height = dim.factor / 100 * dim.actualHeight + dim.actualHeight;

            if (!mouseWheelEvent.clientX) {
                mouseWheelEvent.clientX = viewport.width() / 2;
            }

            if (!mouseWheelEvent.clientY) {
                mouseWheelEvent.clientY = viewport.height() / 2;
            }

            resize(mouseWheelEvent, mouseWheelEvent.easing);
        }

        var unzoomed = $(this);
        var viewport = null;
        var zoomed = null;
        var help = null;
        var loader = null;
        var panned = false;

        // Check if reinitialize the viewport
        if (unzoomed.parent().hasClass("viewport")) {
            viewport = unzoomed.parent();
            zoomed = unzoomed.siblings("img.zoomed");
            help = unzoomed.siblings(".help");
            loader = unzoomed.siblings("img.loader");
            if (help) help.hide();
        } else {
            viewport = unzoomed.wrap("<div class=\"viewport\"></div>").parent();
            viewport.css({ position: "relative", overflow: "hidden" });
            zoomed = $("<img class=\"zoomed\" src=\"\" />");
            zoomed.css("position", "absolute");
            viewport.append(zoomed);

            if (options.zoom.loader != null) {
                loader = $("<div class=\"loader\"><img src=\"" + options.zoom.loader + "\" /></div>");
                loader.hide();
                viewport.append(loader);
            }

            if (options.help.text != null) {
                help = $("<div class=\"help\"><span>" + options.help.text + "</span></div>");
                help.css("display", "none");
                viewport.append(help);
            }

            if (options.zoom.plus) {
                options.zoom.plus.click(function() {
                    preload({ preventDefault: function() { }, faked: true, solid: true, easing: true }, 1);
                });
            }

            if (options.zoom.minus) {
                options.zoom.minus.click(function() {
                    preload({ preventDefault: function() { }, faked: true, solid: true, easing: true }, -1);
                });
            }

            if(!($.browser.name == "firefox" && $.browser.versionX == 2))
                viewport.bind("mousewheel", preload);

            viewport.bind("click", function(e) {
                if (!panned) {
                    e.easing = true;
                    e.solid = true;
                    preload(e, 1);
                } else {
                    if (help) {
                        help.data("disable", true).fadeOut(250);
                    }
                }
                panned = false;
            })
            .bind("mousedown", startPan);
        }

        viewport.data("loaded", false);
        viewport.data("options", options);
        viewport.css({ width: unzoomed.width(), height: unzoomed.height() });
        unzoomed.data("dim", { x: 0, y: 0, actualWidth: unzoomed.width(), actualHeight: unzoomed.height(), width: unzoomed.width(), height: unzoomed.height(), factor: 0 }).show();
        zoomed.hide().css({ width: unzoomed.data("dim").width, height: unzoomed.data("dim").height, left: '0px', top: '0px' });
    });
}
//})(jQuery);


$.fn.collapsiblePanel = function() {
    this.each(function() {
        var container = $(this);
        var target = container.children().eq(0);
        var panel = container.children().eq(1);

        target.click(function() {
            if (!container.hasClass("expanded")) {
                panel.slideDown(250, function() {
                container.removeClass("collapsed").addClass("expanded")
                });
            } else {
                panel.slideUp(250, function() {
                container.removeClass("expanded").addClass("collapsed");
                });
            }
        });
    });
};


$.fn.buttonGroup = function() {
    $(this).each(function() {
        var group = $(this);
        var field = $("input.button-group", group);
        $(".button", group).click(function(e) {
            e.preventDefault();
            if ($(this).hasClass("disabled"))
                return;
            field.val($(this).children().get(0).attributes['value'].value);
            $(this).addClass("active").siblings(".button").removeClass("active");
            FixIe6Buttons(group);
        });
    });
}


$.fn.clearForm = function() {
    return this.each(function() {
        var type = this.type, tag = this.tagName.toLowerCase();
        if (tag == 'form')
            return $(':input', this).clearForm();
        if (type == 'text' || type == 'password' || tag == 'textarea')
            this.value = '';
        else if (type == 'checkbox' || type == 'radio')
            this.checked = false;
        else if (tag == 'select')
            this.selectedIndex = -1;
    });
};


(function($){$.browserTest=function(a,z){var u='unknown',x='X',m=function(r,h){for(var i=0;i<h.length;i=i+1){r=r.replace(h[i][0],h[i][1]);}return r;},c=function(i,a,b,c){var r={name:m((a.exec(i)||[u,u])[1],b)};r[r.name]=true;r.version=(c.exec(i)||[x,x,x,x])[3];if(r.name.match(/safari/)&&r.version>400){r.version='2.0';}if(r.name==='presto'){r.version=($.browser.version>9.27)?'futhark':'linear_b';}r.versionNumber=parseFloat(r.version,10)||0;r.versionX=(r.version!==x)?(r.version+'').substr(0,1):x;r.className=r.name+r.versionX;return r;};a=(a.match(/Opera|Navigator|Minefield|KHTML|Chrome/)?m(a,[[/(Firefox|MSIE|KHTML,\slike\sGecko|Konqueror)/,''],['Chrome Safari','Chrome'],['KHTML','Konqueror'],['Minefield','Firefox'],['Navigator','Netscape']]):a).toLowerCase();$.browser=$.extend((!z)?$.browser:{},c(a,/(camino|chrome|firefox|netscape|konqueror|lynx|msie|opera|safari)/,[],/(camino|chrome|firefox|netscape|netscape6|opera|version|konqueror|lynx|msie|safari)(\/|\s)([a-z0-9\.\+]*?)(\;|dev|rel|\s|$)/));$.layout=c(a,/(gecko|konqueror|msie|opera|webkit)/,[['konqueror','khtml'],['msie','trident'],['opera','presto']],/(applewebkit|rv|konqueror|msie)(\:|\/|\s)([a-z0-9\.]*?)(\;|\)|\s)/);$.os={name:(/(win|mac|linux|sunos|solaris|iphone)/.exec(navigator.platform.toLowerCase())||[u])[0].replace('sunos','solaris')};if(!z){$('html').addClass([$.os.name,$.browser.name,$.browser.className,$.layout.name,$.layout.className].join(' '));}};$.browserTest(navigator.userAgent);})(jQuery);





/*
http://www.JSON.org/json2.js
2009-08-17

Public Domain.

NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.

See http://www.JSON.org/js.html

This file creates a global JSON object containing two methods: stringify
and parse.

JSON.stringify(value, replacer, space)
value       any JavaScript value, usually an object or array.

replacer    an optional parameter that determines how object
values are stringified for objects. It can be a
function or an array of strings.

space       an optional parameter that specifies the indentation
of nested structures. If it is omitted, the text will
be packed without extra whitespace. If it is a number,
it will specify the number of spaces to indent at each
level. If it is a string (such as '\t' or '&nbsp;'),
it contains the characters used to indent at each level.

This method produces a JSON text from a JavaScript value.

When an object value is found, if the object contains a toJSON
method, its toJSON method will be called and the result will be
stringified. A toJSON method does not serialize: it returns the
value represented by the name/value pair that should be serialized,
or undefined if nothing should be serialized. The toJSON method
will be passed the key associated with the value, and this will be
bound to the value

For example, this would serialize Dates as ISO strings.

Date.prototype.toJSON = function (key) {
function f(n) {
// Format integers to have at least two digits.
return n < 10 ? '0' + n : n;
}

return this.getUTCFullYear()   + '-' +
f(this.getUTCMonth() + 1) + '-' +
f(this.getUTCDate())      + 'T' +
f(this.getUTCHours())     + ':' +
f(this.getUTCMinutes())   + ':' +
f(this.getUTCSeconds())   + 'Z';
};

You can provide an optional replacer method. It will be passed the
key and value of each member, with this bound to the containing
object. The value that is returned from your method will be
serialized. If your method returns undefined, then the member will
be excluded from the serialization.

If the replacer parameter is an array of strings, then it will be
used to select the members to be serialized. It filters the results
such that only members with keys listed in the replacer array are
stringified.

Values that do not have JSON representations, such as undefined or
functions, will not be serialized. Such values in objects will be
dropped; in arrays they will be replaced with null. You can use
a replacer function to replace those with JSON values.
JSON.stringify(undefined) returns undefined.

The optional space parameter produces a stringification of the
value that is filled with line breaks and indentation to make it
easier to read.

If the space parameter is a non-empty string, then that string will
be used for indentation. If the space parameter is a number, then
the indentation will be that many spaces.

Example:

text = JSON.stringify(['e', {pluribus: 'unum'}]);
// text is '["e",{"pluribus":"unum"}]'


text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'

text = JSON.stringify([new Date()], function (key, value) {
return this[key] instanceof Date ?
'Date(' + this[key] + ')' : value;
});
// text is '["Date(---current time---)"]'


JSON.parse(text, reviver)
This method parses a JSON text to produce an object or array.
It can throw a SyntaxError exception.

The optional reviver parameter is a function that can filter and
transform the results. It receives each of the keys and values,
and its return value is used instead of the original value.
If it returns what it received, then the structure is not modified.
If it returns undefined then the member is deleted.

Example:

// Parse the text. Values that look like ISO date strings will
// be converted to Date objects.

myData = JSON.parse(text, function (key, value) {
var a;
if (typeof value === 'string') {
a =
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+a[5], +a[6]));
}
}
return value;
});

myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
var d;
if (typeof value === 'string' &&
value.slice(0, 5) === 'Date(' &&
value.slice(-1) === ')') {
d = new Date(value.slice(5, -1));
if (d) {
return d;
}
}
return value;
});


This is a reference implementation. You are free to copy, modify, or
redistribute.

This code should be minified before deployment.
See http://javascript.crockford.com/jsmin.html

USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
NOT CONTROL.
*/

/*jslint evil: true */

/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
lastIndex, length, parse, prototype, push, replace, slice, stringify,
test, toJSON, toString, valueOf
*/

"use strict";

// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.

if (!this.JSON) {
    this.JSON = {};
}

(function() {

    function f(n) {
        // Format integers to have at least two digits.
        return n < 10 ? '0' + n : n;
    }

    if (typeof Date.prototype.toJSON !== 'function') {

        Date.prototype.toJSON = function(key) {

            return isFinite(this.valueOf()) ?
                   this.getUTCFullYear() + '-' +
                 f(this.getUTCMonth() + 1) + '-' +
                 f(this.getUTCDate()) + 'T' +
                 f(this.getUTCHours()) + ':' +
                 f(this.getUTCMinutes()) + ':' +
                 f(this.getUTCSeconds()) + 'Z' : null;
        };

        String.prototype.toJSON =
        Number.prototype.toJSON =
        Boolean.prototype.toJSON = function(key) {
            return this.valueOf();
        };
    }

    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        gap,
        indent,
        meta = {    // table of character substitutions
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"': '\\"',
            '\\': '\\\\'
        },
        rep;


    function quote(string) {

        // If the string contains no control characters, no quote characters, and no
        // backslash characters, then we can safely slap some quotes around it.
        // Otherwise we must also replace the offending characters with safe escape
        // sequences.

        escapable.lastIndex = 0;
        return escapable.test(string) ?
            '"' + string.replace(escapable, function(a) {
                var c = meta[a];
                return typeof c === 'string' ? c :
                    '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
            }) + '"' :
            '"' + string + '"';
    }


    function str(key, holder) {

        // Produce a string from holder[key].

        var i,          // The loop counter.
            k,          // The member key.
            v,          // The member value.
            length,
            mind = gap,
            partial,
            value = holder[key];

        // If the value has a toJSON method, call it to obtain a replacement value.

        if (value && typeof value === 'object' &&
                typeof value.toJSON === 'function') {
            value = value.toJSON(key);
        }

        // If we were called with a replacer function, then call the replacer to
        // obtain a replacement value.

        if (typeof rep === 'function') {
            value = rep.call(holder, key, value);
        }

        // What happens next depends on the value's type.

        switch (typeof value) {
            case 'string':
                return quote(value);

            case 'number':

                // JSON numbers must be finite. Encode non-finite numbers as null.

                return isFinite(value) ? String(value) : 'null';

            case 'boolean':
            case 'null':

                // If the value is a boolean or null, convert it to a string. Note:
                // typeof null does not produce 'null'. The case is included here in
                // the remote chance that this gets fixed someday.

                return String(value);

                // If the type is 'object', we might be dealing with an object or an array or
                // null.

            case 'object':

                // Due to a specification blunder in ECMAScript, typeof null is 'object',
                // so watch out for that case.

                if (!value) {
                    return 'null';
                }

                // Make an array to hold the partial results of stringifying this object value.

                gap += indent;
                partial = [];

                // Is the value an array?

                if (Object.prototype.toString.apply(value) === '[object Array]') {

                    // The value is an array. Stringify every element. Use null as a placeholder
                    // for non-JSON values.

                    length = value.length;
                    for (i = 0; i < length; i += 1) {
                        partial[i] = str(i, value) || 'null';
                    }

                    // Join all of the elements together, separated with commas, and wrap them in
                    // brackets.

                    v = partial.length === 0 ? '[]' :
                    gap ? '[\n' + gap +
                            partial.join(',\n' + gap) + '\n' +
                                mind + ']' :
                          '[' + partial.join(',') + ']';
                    gap = mind;
                    return v;
                }

                // If the replacer is an array, use it to select the members to be stringified.

                if (rep && typeof rep === 'object') {
                    length = rep.length;
                    for (i = 0; i < length; i += 1) {
                        k = rep[i];
                        if (typeof k === 'string') {
                            v = str(k, value);
                            if (v) {
                                partial.push(quote(k) + (gap ? ': ' : ':') + v);
                            }
                        }
                    }
                } else {

                    // Otherwise, iterate through all of the keys in the object.

                    for (k in value) {
                        if (Object.hasOwnProperty.call(value, k)) {
                            v = str(k, value);
                            if (v) {
                                partial.push(quote(k) + (gap ? ': ' : ':') + v);
                            }
                        }
                    }
                }

                // Join all of the member texts together, separated with commas,
                // and wrap them in braces.

                v = partial.length === 0 ? '{}' :
                gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
                        mind + '}' : '{' + partial.join(',') + '}';
                gap = mind;
                return v;
        }
    }

    // If the JSON object does not yet have a stringify method, give it one.

    if (typeof JSON.stringify !== 'function') {
        JSON.stringify = function(value, replacer, space) {

            // The stringify method takes a value and an optional replacer, and an optional
            // space parameter, and returns a JSON text. The replacer can be a function
            // that can replace values, or an array of strings that will select the keys.
            // A default replacer method can be provided. Use of the space parameter can
            // produce text that is more easily readable.

            var i;
            gap = '';
            indent = '';

            // If the space parameter is a number, make an indent string containing that
            // many spaces.

            if (typeof space === 'number') {
                for (i = 0; i < space; i += 1) {
                    indent += ' ';
                }

                // If the space parameter is a string, it will be used as the indent string.

            } else if (typeof space === 'string') {
                indent = space;
            }

            // If there is a replacer, it must be a function or an array.
            // Otherwise, throw an error.

            rep = replacer;
            if (replacer && typeof replacer !== 'function' &&
                    (typeof replacer !== 'object' ||
                     typeof replacer.length !== 'number')) {
                throw new Error('JSON.stringify');
            }

            // Make a fake root object containing our value under the key of ''.
            // Return the result of stringifying the value.

            return str('', { '': value });
        };
    }


    // If the JSON object does not yet have a parse method, give it one.

    if (typeof JSON.parse !== 'function') {
        JSON.parse = function(text, reviver) {

            // The parse method takes a text and an optional reviver function, and returns
            // a JavaScript value if the text is a valid JSON text.

            var j;

            function walk(holder, key) {

                // The walk method is used to recursively walk the resulting structure so
                // that modifications can be made.

                var k, v, value = holder[key];
                if (value && typeof value === 'object') {
                    for (k in value) {
                        if (Object.hasOwnProperty.call(value, k)) {
                            v = walk(value, k);
                            if (v !== undefined) {
                                value[k] = v;
                            } else {
                                delete value[k];
                            }
                        }
                    }
                }
                return reviver.call(holder, key, value);
            }


            // Parsing happens in four stages. In the first stage, we replace certain
            // Unicode characters with escape sequences. JavaScript handles many characters
            // incorrectly, either silently deleting them, or treating them as line endings.

            cx.lastIndex = 0;
            if (cx.test(text)) {
                text = text.replace(cx, function(a) {
                    return '\\u' +
                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
                });
            }

            // In the second stage, we run the text against regular expressions that look
            // for non-JSON patterns. We are especially concerned with '()' and 'new'
            // because they can cause invocation, and '=' because it can cause mutation.
            // But just to be safe, we want to reject all unexpected forms.

            // We split the second stage into 4 regexp operations in order to work around
            // crippling inefficiencies in IE's and Safari's regexp engines. First we
            // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
            // replace all simple value tokens with ']' characters. Third, we delete all
            // open brackets that follow a colon or comma or that begin the text. Finally,
            // we look to see that the remaining characters are only whitespace or ']' or
            // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.

            if (/^[\],:{}\s]*$/.
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {

                // In the third stage we use the eval function to compile the text into a
                // JavaScript structure. The '{' operator is subject to a syntactic ambiguity
                // in JavaScript: it can begin a block or an object literal. We wrap the text
                // in parens to eliminate the ambiguity.

                j = eval('(' + text + ')');

                // In the optional fourth stage, we recursively walk the new structure, passing
                // each name/value pair to a reviver function for possible transformation.

                return typeof reviver === 'function' ?
                    walk({ '': j }, '') : j;
            }

            // If the text is not JSON parseable, then a SyntaxError is thrown.

            throw new SyntaxError('JSON.parse');
        };
    }
} ());


//http://blog.stevenlevithan.com/archives/parseuri
/*
parseUri 1.2.1
(c) 2007 Steven Levithan <stevenlevithan.com>
MIT License
*/

function parseUri(str) {
    var o = parseUri.options,
    m = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
    uri = {},
    i = 14;

    while (i--) uri[o.key[i]] = m[i] || "";

    uri[o.q.name] = {};
    uri[o.key[12]].replace(o.q.parser, function($0, $1, $2) {
        if ($1) uri[o.q.name][$1] = $2;
    });

    return uri;
};

parseUri.options = {
    strictMode: false,
    key: ["source", "protocol", "authority", "userInfo", "user", "password", "host", "port", "relative", "path", "directory", "file", "query", "anchor"],
    q: {
        name: "queryKey",
        parser: /(?:^|&)([^&=]*)=?([^&]*)/g
    },
    parser: {
        strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
        loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
    }
};


var Cookies = {
    getCookie: function(cookieId) {
        var start = document.cookie.indexOf(cookieId + "=");
        if (start > -1) {
            var end = document.cookie.indexOf(";", start);
            if (end == -1)
                end = document.cookie.length;
            return document.cookie.substring(start + cookieId.length + 1, end);
        }
        else
            return null;
    },
    setCookie: function(cookieId, value) {
        document.cookie = cookieId + "=" + value + ";Path=/";
    }
};


$(function() {
    Initiate($("html"));
});

function FixIe6Buttons(container) {
    if ($.browser.msie && $.browser.version.substr(0, 1) < 7) {
        $("button", container).each(function() {
            var button = $(this);
            var parent = button.parent();
            if (button.is(":visible") && parent.hasClass("button") && button.css("width") == "0px") {
                parent.replaceWith(button);
                button.css("width", button.width() + 15);
                button.wrap("<span></span>").parent().attr("class", parent.attr("class"));
            }
        });

        var states = ['black', 'grey', 'red', 'yellow', 'disabled'];
        var height = 24;
        $(".button", container).each(function() {
            var element = $(this);
            var classes = element.attr("class").split(" ");
            for (cls in classes) {
                var i = -1;
                if ((i = $.inArray(classes[cls], states)) >= 0) {
                    var option = (element.hasClass("option") ? -48 : 0) + (element.hasClass("active") ? -24 : 0);
                    element.css("background-position-y", -i * height * 2 + (element.hasClass("active") ? -24 : 0));
                    element.children().css("background-position-y", option + -i * height * 4);
                }
            }

            if (element.hasClass("option")) {
                element.children().css({ paddingRight: "30px", paddingLeft: "10px" });
            }
        });
    }
}

function Initiate(container) {
    FixIe6Buttons(container);

    var all = $("p.error, div.error, p.information, div.information", container).click(function(e) {
        e.stopPropagation();
        $(this).fadeOut(125);
    });

    all.filter("p.information, div.information").each(function() {
        var tag = $(this);
        tag.wrapInner("<div class=\"container\"></div>");

        if (tag.hasClass("auto-hide")) {
            setTimeout(function() {
                tag.fadeOut(250);
            }, 2000);
        }
    });

    all.each(function() {
        var tag = $(this);
        if (tag.css("position") == "absolute") {
            if (tag.parent().hasClass(":not(.error-summary)")) {
                tag.parent().css("position", "relative");
                tag.css("margin-top", "-" + tag.outerHeight() + "px");
            } else {
                tag.css("position", "static");
            }
            tag.show();
        }
    })

    $(":reset").click(function(e) {
        e.preventDefault();
        var form = $(this).parents("form:eq(0)");
        $(".error, .information", form).hide();
        form.clearForm();
    });

    $("a[rel=popup]", container).popup();
    $(".collapsible-panel").collapsiblePanel();
    $(".button-group").buttonGroup();

    $("input[type=text].watermark").each(function() {
        var input = $(this);
        input.data("default", input.val());
    }).focus(function() {
        var input = $(this);

        if ($(this).val() == input.data("default"))
            $(this).val("");
    }).blur(function() {
        var input = $(this);
        if (input.val() == '')
            input.val(input.data("default"));
    });
}

function Browser() {
    if (document.getElementById && document.createElement) {
        if (document.cookie.indexOf("chkcookie", 0) < 0) {
            document.cookie = "chkcookie=" + (new Date()).getTime() + "; path=/";
            if (document.cookie.indexOf("chkcookie", 0) < 0) {
                window.location = "/Home/BrowserSupport";
            }
         }
    } else {
        window.location = "/Home/BrowserSupport";
    }
}

var Utilities = {
    randomId: function(prefix) {
        return prefix + "_" + Math.ceil(Math.random() * 1000000);
    }
};


var Cart = {
value: Cookies.getCookie("cart") != null && Cookies.getCookie("cart") != "" ? JSON.parse($.base64Decode(Cookies.getCookie("cart"))) : null,
    oc: parseUri(window.location.href).queryKey.oc,

    // Events
    events: $("<events />"),

    // Render the mini-cart
    render: function() {
        var container = $(".cart-mini");
        $(".items span", container).html(Cart.value.ItemCountFormatted);
        $(".total span", container).html(Cart.value.Total);
    },

    updateFromCookie: function() {
        Cart.value = JSON.parse($.base64Decode(Cookies.getCookie("cart")));
        Cart.events.trigger("modified");
    },

    // If the request is successfull.
    success: function(response) {
        if (response.Status == "success") {
            Cart.updateFromCookie();
            Cart.events.trigger(response.Action + "Success");
        } else {
            Cart.events.trigger(response.Action + "Error", response.Message);
            Cart.events.trigger("error", response.Message);
        }
    },

    // If we have a timeout or an error
    error: function(xhp, status, response) {
        Cart.events.trigger("error", Texts.TemporaryError);
    },

    // Generic ajax request
    call: function(action, message) {
        Cart.events.trigger(action);
        $.ajax({
            url: '/Cart/' + action, type: 'POST', timeout: 30000,
            data: message,
            dataType: 'json',
            error: this.error, success: this.success
        });
    },

    // Add a new item
    add: function(mediaId, variantId, sizeId, quantity, phrase, department, brand, origin) {
        var data = { mediaId: mediaId, variantId: variantId, sizeId: sizeId, origin: origin ? origin : (this.oc ? this.oc : 0), quantity: quantity }

        if (phrase != null) {
            data.phrase = phrase;
        }

        if (department != null) {
            data.department = department;
        }

        if (brand != null) {
            data.brand = brand;
        }

        Cart.call("add", data);
        return false;
    },

    // Request to update an item
    update: function(variantId, sizeId, quantity) {
        Cart.call("update", { variantId: variantId, sizeId: sizeId, quantity: quantity });
        return false;
    },

    // Request to remove an item
    remove: function(variantId, sizeId, origin, quantity) {
        Cart.call("remove", { variantId: variantId, sizeId: sizeId, origin: (origin ? origin : 1) });
        return false;
    }
};

Cart.events.bind("modified", Cart.render);


$(function() {
    $("#header .search-product").submit(function(e) {
        var input = $("input", $(this));
        if (input.data("default") != input.val()) {
            document.location = "/Search/Product/" + $.base64Encode(input.val()) + "?criteria=" + input.val();
        } else {
            input.parent().prepend("<div class=\"error\">" + Texts.Search.EnterCriteria + "</div>").siblings("div").remove();
            Initiate(input.parent());
        }

        e.preventDefault();
    });
});


$(function() {
});


$(function() {
    $("#header #department-menu li").hover(
        function() {
            $(this).addClass("active").next("li").addClass("active-sibling");
        },
        function() {
            $(this).removeClass("active").next("li").removeClass("active-sibling");
        }
    );
});


$(function() {
    $("#context-menu .has-children").click(function(event) {
        var clicked = $(this);
        var children = clicked.next(".children");
        var noLink = clicked.hasClass("no-link");

        if (clicked.hasClass("resolved") && noLink) {
            event.preventDefault();
        } else if (children.size() > 0 && noLink) {
            clicked.add(children).toggleClass("active");
            event.preventDefault();
        }

        if (noLink) {
            event.preventDefault();
        }
    });
});


$(function() {
    $(".promotion-productblurb-1.carousel").carousel();
    $(".toplist.carousel").carousel({ pagination: false });

    $(".toplist.carousel").each(function() {
        var container = $(this);
        var departments = $(".departments", container);
        var anchors = $("a", departments);
        var items = $(".items", container);
        anchors.click(function(e) {
            e.preventDefault();
            var anchor = $(this);

            anchor.addClass("active").siblings().removeClass("active");
            var temp = anchor.attr("href");
            var mid = temp.lastIndexOf("/") == -1 ? temp : temp.substring(temp.lastIndexOf("/") + 1);

            items.children("ul").animate({ opacity: 0 }, 250, function() {
                $.get("/Promotion/ToplistContent?menuId=" + mid, function(response) {
                    items.empty();
                    items.html(response);
                    $("span.next, span.previous", container).remove();
                    container.carousel({ pagination: false });
                });
            });
        });
    });
});


function ProductBlurb2(options) {
    this.options = $.extend({ data: null, adapter: null, localization: null, container: null, origin: 0 }, options);
    this.container = options.container;
    this.productData = this.options.data;
    this.attributeAdapter = this.options.adapter;
    this.attributeRenderer = new AttributeRenderer({
        target: $(".attributes", this.container),
        data: this.productData,
        adapter: this.attributeAdapter,
        creator: this
    });
    this.attributeRenderer.Selected = this.ItemSelected;
    this.attributeRenderer.Deselected = this.ItemDeselected;
    this.attributeRenderer.Changed = this.Changed;
    this.Initialize();
}

ProductBlurb2.prototype.Initialize = function() {
    // Render the selection boxes for size, color, etc.
    this.attributeRenderer.run();
    this.InitializeBuyButton();
}

ProductBlurb2.prototype.ItemSelected = function(variant, item) {
    var blurb = this;
    var price = $(".price", blurb.container);
    price.data("default", price.html());
    if (item.Price.CurrentPrice < item.Price.RegularPrice) {
        price.html("<del>" + item.Price.RegularPriceFormatted + "</del> <span>" + item.Price.CurrentPriceFormatted + "</span>");
    } else {
        price.html(item.Price.FormattedCurrentPrice);
    }
}

ProductBlurb2.prototype.ItemDeselected = function() {
    var blurb = this;
    var price = $(".price", blurb.container);
    price.html(price.data("default"));
}

ProductBlurb2.prototype.Changed = function() {
    var blurb = this;
    $(".buy.button div.error", blurb.container).remove();
}

ProductBlurb2.prototype.InitializeBuyButton = function() {
    var blurb = this;
    $(".buy.button button", blurb.container).click(function(e) {
        e.preventDefault();
        var button = $(this);
        var span = button.parent();
        var selected = blurb.attributeRenderer.selected;

        if (blurb.attributeRenderer.missing.length > 0) {
            span.prepend($("<div class=\"error\">" + blurb.options.localization.choose + " " + blurb.attributeRenderer.missing[0].toLowerCase() + "</div>"));
            Initiate(span);
        } else {
            Cart.events.bind("add.productBlurb2", this, function(e) {
                button.data("original", button.html());
                button.css("width", button.outerWidth()).html("<img src=\"/Content/Images/Global/Button.AjaxLoader.gif\" />");
            });

            Cart.events.bind("addSuccess.productBlurb2", this, function(e) {
                Cart.events.unbind(".productBlurb2");
                button.html(button.data("original"));
                Initiate(span);
            });

            Cart.events.bind("addError.productBlurb2", this, function(e) {
                Cart.events.unbind(".productBlurb2");
            });

            //add: function(mediaId, variantId, sizeId, quantity, phrase, category, brand) {
            Cart.add(selected.mediaId, selected.id, selected.size, 1, null, null, null, blurb.options.origin);
        }
    });
}


$(function() {
/*
    $(".catalog.order-catalog .customer-type input").click(function() {
        var container = $(".catalog.order-catalog");
        var value = $(this).val().toLowerCase();
        var active = $("." + value + "-customer", container).show();
        var siblings = active.siblings(".form").hide();
        $(":input", siblings).attr("disabled", "disabled");
        $(":input", active).removeAttr("disabled", "disabled");
    });

    $(function() {
        $(".catalog.order-catalog .customer-type input[name='CustomerType']:checked").trigger("click");
    });
    */
    
    
});


$(function() {
    var updateReviews = function(container, replaceWith, callback) {
        var newContainer = $(replaceWith).css({ opacity: 0, display: 'block' })
        container.replaceWith(newContainer);
        newContainer.stop().animate({ opacity: 1 }, 250, function() {
            if ($.browser.msie)
                newContainer.get(0).style.removeAttribute('filter');

            if (typeof (callback) == "function")
                callback(newContainer);
        });
    }

    $(".customer-interaction.review-form span.rating").live("mousemove", function(e) {
        var ratingTag = $(this);
        var currentRating = Math.ceil((e.pageX - ratingTag.offset().left) / (ratingTag.outerWidth() / 5));
        var cls = ratingTag.hasClass("small") ? "small" : "medium";
        ratingTag.removeClass().addClass("rating").addClass(cls).addClass("r" + currentRating);
    }).live("click", function(e) {
        var ratingTag = $(this);
        var container = ratingTag.parents(".customer-interaction.review-form:eq(0)");
        var currentRating = Math.ceil((e.pageX - ratingTag.offset().left) / (ratingTag.outerWidth() / 5));
        ratingTag.data("rate", currentRating);
        $("input:hidden", container).val(currentRating);
        $("text-area", container).focus();
    }).live("mouseout", function() {
        var ratingTag = $(this);
        var container = ratingTag.parents(".customer-interaction.review-form:eq(0)");
        var cls = container.hasClass("small") ? "small" : "medium";
        ratingTag.removeClass().addClass("rating").addClass(cls).addClass("r" + (ratingTag.data("rate") != null ? ratingTag.data("rate") : 0));
    });

    $(".customer-interaction.reviews .pagination a").live("click", function(e) {
        e.preventDefault();
        var anchor = $(this);
        var container = anchor.parents(".customer-interaction.reviews:eq(0)");
        var productId = $("input:hidden", anchor.parents(".pagination:eq(0)")).val();
        var temp = anchor.attr("href");

        var page = temp.lastIndexOf("/") == -1 ? temp : temp.substring(temp.lastIndexOf("/") + 1);
        if (isNaN(page))
            return;

        container.animate({ opacity: 0 }, 250, function() {
            $.get("/CustomerInteraction/Reviews/" + productId + "/" + page + "?" + Math.ceil(Math.random() * 1000000), function(response) {
                updateReviews(container, response, function(newContainer) {
                    newContainer.scrollTo();
                });
            });
        });
    });

    CustomerInteraction.events.bind("addSuccess", function(e, response) {
        var reviewContainers = $(".customer-interaction.reviews");
        $.get("/CustomerInteraction/Reviews/" + $(".pagination input:hidden, reviewContainers").val(), function(response) {
            updateReviews(reviewContainers, response, function(newContainer) {
                //$.scrollTo(newContainer, 800, { offset: (newContainer.height() > $(window).height() ? ($(window).height() + "px") : (newContainer.height() + "px")) })
                newContainer.scrollTo();
            });
        });
    });

    $(".customer-interaction.reviews .complaint").live("click", function(e) {
        var anchor = $(this);
        var reviewId = $(this).closest("li").attr("id").substr("review-".length);
        CustomerInteraction.events.one("addReviewComplaintSuccess", function(e, response) {
            anchor.parent().children(".information").remove();
            var message = anchor.closest(".customer-interaction.reviews").children("input.complaint-message").val();
            anchor.prepend($("<div class=\"information auto-hide\">" + message + "</div>"));
            Initiate(anchor);
        });
        CustomerInteraction.addReviewComplaint(reviewId);
        e.preventDefault();
    });

    $(".customer-interaction.reviews .feedback span").live("click", function(e) {
        e.preventDefault();
        var span = $(this);
        var reviewId = span.closest("li").attr("id").substr("review-".length);
        var positive = span.hasClass("positive");
        var reviewContainer = span.closest(".customer-interaction.reviews");
        var paginationAnchor = $(".pagination a.current", reviewContainer);
        var temp = paginationAnchor.size() == 0 ? "1" : paginationAnchor.attr("href");
        var page = temp.lastIndexOf("/") == -1 ? temp : temp.substring(temp.lastIndexOf("/") + 1);
        if (isNaN(page))
            return;

        CustomerInteraction.events.one("addReviewFeedbackSuccess", function(e, response) {
            $.get("/CustomerInteraction/Reviews/" + reviewContainer.find("input.product-id:hidden").val() + "/" + page, function(response) {
                updateReviews(reviewContainer, response);
            });
        });

        CustomerInteraction.addReviewFeedback(reviewId, positive);
    });
});

var CustomerInteraction = {
    events: $("<events />"),

    // If the request is successfull.
    success: function(response) {
        response = JSON.parse(response);
        if (response.Status == "success") {
            CustomerInteraction.events.trigger(response.Action + "Success", response);
        } else {
            CustomerInteraction.events.trigger(response.Action + "Error", response.Message);
            CustomerInteraction.events.trigger("error", response.Message);
        }
    },

    // If we have a timeout or an error
    error: function(xhp, status, response) {
        CustomerInteraction.events.trigger("error", Texts.TemporaryError);
    },

    addReview: function(productId, rating, text) {
        $.ajax({
            url: '/CustomerInteraction/AddReview', type: 'POST', timeout: 30000,
            data: { productId: productId, rating: rating, text: text },
            dataType: 'text',
            error: this.error, success: this.success
        });
    },

    addReviewComplaint: function(reviewId) {
        $.get("/CustomerInteraction/AddReviewComplaint/" + reviewId, this.success, this.error);
    },

    addReviewFeedback: function(reviewId, positive) {
        $.get("/CustomerInteraction/AddReviewFeedback/" + reviewId + "/" + positive, this.success, this.error);
    }
}


/*
<items>
    <item item-no="121095">
        <logistics freight-charge="" freight="" />
        <attribute attribute-group="10" value="128">Svart</attribute>
        <size id="036" media-id="99">
            <name>36/38</name>
            <price regular-price="399.0000" formatted-regular-price="399 kr" />
        </size>
        <size id="044" media-id="99">
            <name>44/46</name>
            <price regular-price="399.0000" formatted-regular-price="399 kr" /></size></item><item item-no="121096"><logistics freight-charge="" freight="" /><attribute attribute-group="10" value="128">Vit</attribute><size id="036" media-id="99"><name>36/38</name><price regular-price="399.0000" formatted-regular-price="399 kr" /></size><size id="040" media-id="99"><name>40/42</name><price regular-price="399.0000" formatted-regular-price="399 kr" /></size><size id="044" media-id="99"><name>44/46</name><price regular-price="399.0000" formatted-regular-price="399 kr" /></size></item><item item-no="121099"><logistics freight-charge="" freight="" /><attribute attribute-group="10" value="128">Grön</attribute><size id="036" media-id="99"><name>36/38</name><price regular-price="399.0000" formatted-regular-price="399 kr" /></size><size id="040" media-id="99"><name>40/42</name><price regular-price="399.0000" formatted-regular-price="399 kr" /></size><size id="044" media-id="99"><name>44/46</name><price regular-price="399.0000" formatted-regular-price="399 kr" />
        </size>
    </item>
</items>

{"Variants":[{"Id":497420,"Logistics":{"Type":0,"Charge":55},"Attributes":[{"Attribute":{"Id":1,"Name":"Färg"},"Id":52,"Name":"Svart/vit"}],"Items":[{"MediaId":99,"Price":{"RegularPrice":179,"RegularPriceFormatted":"179,00 kr"},"Size":{"Id":{"Id":34},"Name":"34/36"}},{"MediaId":99,"Price":{"RegularPrice":179,"RegularPriceFormatted":"179,00 kr"},"Size":{"Id":{"Id":38},"Name":"38/40"}},{"MediaId":99,"Price":{"RegularPrice":189,"RegularPriceFormatted":"189,00 kr"},"Size":{"Id":{"Id":42},"Name":"42/44"}},{"MediaId":99,"Price":{"RegularPrice":189,"RegularPriceFormatted":"189,00 kr"},"Size":{"Id":{"Id":46},"Name":"46/48"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":50},"Name":"50/52"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":54},"Name":"54/56"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":58},"Name":"58/60"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":62},"Name":"62/64"}}]},{"Id":497438,"Logistics":{"Type":0,"Charge":55},"Attributes":[{"Attribute":{"Id":1,"Name":"Färg"},"Id":82,"Name":"Röd/Vit"}],"Items":[{"MediaId":99,"Price":{"RegularPrice":179,"RegularPriceFormatted":"179,00 kr"},"Size":{"Id":{"Id":34},"Name":"34/36"}},{"MediaId":99,"Price":{"RegularPrice":179,"RegularPriceFormatted":"179,00 kr"},"Size":{"Id":{"Id":38},"Name":"38/40"}},{"MediaId":99,"Price":{"RegularPrice":189,"RegularPriceFormatted":"189,00 kr"},"Size":{"Id":{"Id":42},"Name":"42/44"}},{"MediaId":99,"Price":{"RegularPrice":189,"RegularPriceFormatted":"189,00 kr"},"Size":{"Id":{"Id":46},"Name":"46/48"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":50},"Name":"50/52"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":54},"Name":"54/56"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":58},"Name":"58/60"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":62},"Name":"62/64"}}]},{"Id":497446,"Logistics":{"Type":0,"Charge":55},"Attributes":[{"Attribute":{"Id":1,"Name":"Färg"},"Id":60,"Name":"Blå/Vit"}],"Items":[{"MediaId":99,"Price":{"RegularPrice":189,"RegularPriceFormatted":"189,00 kr"},"Size":{"Id":{"Id":42},"Name":"42/44"}},{"MediaId":99,"Price":{"RegularPrice":189,"RegularPriceFormatted":"189,00 kr"},"Size":{"Id":{"Id":46},"Name":"46/48"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":50},"Name":"50/52"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":54},"Name":"54/56"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":58},"Name":"58/60"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":62},"Name":"62/64"}}]},{"Id":497453,"Logistics":{"Type":0,"Charge":55},"Attributes":[{"Attribute":{"Id":1,"Name":"Färg"},"Id":364,"Name":"Grön/vit"}],"Items":[{"MediaId":99,"Price":{"RegularPrice":179,"RegularPriceFormatted":"179,00 kr"},"Size":{"Id":{"Id":34},"Name":"34/36"}},{"MediaId":99,"Price":{"RegularPrice":179,"RegularPriceFormatted":"179,00 kr"},"Size":{"Id":{"Id":38},"Name":"38/40"}},{"MediaId":99,"Price":{"RegularPrice":189,"RegularPriceFormatted":"189,00 kr"},"Size":{"Id":{"Id":42},"Name":"42/44"}},{"MediaId":99,"Price":{"RegularPrice":189,"RegularPriceFormatted":"189,00 kr"},"Size":{"Id":{"Id":46},"Name":"46/48"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":50},"Name":"50/52"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":54},"Name":"54/56"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":58},"Name":"58/60"}},{"MediaId":99,"Price":{"RegularPrice":199,"RegularPriceFormatted":"199,00 kr"},"Size":{"Id":{"Id":62},"Name":"62/64"}}]}]}
*/
function ProductData(options) {
    this.options = $.extend({ data: null, localization: null }, options);
    this.localization = this.options.localization;
    this.data = this.options.data;
}

ProductData.prototype.GetAttributeGroups = function() {
    var groups = new Array();

    for (attributeIndex in this.data.Variants[0].Attributes) {
        groups.push({ id: this.data.Variants[0].Attributes[attributeIndex].Attribute.Id, name: this.data.Variants[0].Attributes[attributeIndex].Attribute.Name });
    }

    if (this.data.Variants[0].Items[0].Size) {
        groups.push({ id: 'size', name: this.localization.size });
    }

    return groups;
}

ProductData.prototype.GetAttributeGroupValues = function(attributeGroup) {
    var values = new Array();

    if (attributeGroup != "size") {
        for (variantIndex in this.data.Variants) {
            var variant = this.data.Variants[variantIndex];
            for (attributeIndex in variant.Attributes) {
                var attribute = variant.Attributes[attributeIndex];
                if (attribute.Attribute.Id == attributeGroup) {
                    values.push({ id: attribute.Id, text: attribute.Name });
                }
            }
        }
    } else {
        for (variantIndex in this.data.Variants) {
            var variant = this.data.Variants[variantIndex];
            for (itemIndex in variant.Items) {
                var item = variant.Items[itemIndex];
                values.push({ id: item.Size.Id, text: item.Size.Name });
            }
        }
    }

    return this.DistinctAttributeGroupValues(values);
}

ProductData.prototype.DistinctAttributeGroupValues = function(values) {
    var result = new Array();
    for (i = 0; i < values.length; i++) {
        var found = false;
        for (y = 0; y < result.length; y++) {
            if (result[y].id == values[i].id) {
                found = true;
                break;
            }
        }
        if (!found) {
            result.push(values[i]);
        }
    }
    return result;
}

ProductData.prototype.VariantMatches = function(variant, attributeFilters, sizeFilter) {
    for (filterIndex in attributeFilters) {
        var filter = attributeFilters[filterIndex];
        for (attributeIndex in variant.Attributes) {
            var attribute = variant.Attributes[attributeIndex];
            if (attribute.Attribute.Id == filter.id && attribute.Id != filter.value) {
                return false;
            }
        }
    }

    if (sizeFilter) {
        var found = false;
        for (itemIndex in variant.Items) {
            var item = variant.Items[itemIndex];
            if (item.Size.Id == sizeFilter.id) {
                found = true;
                break;
            }
        }

        if (!found) {
            return false;
        }
    }

    return true;
}

ProductData.prototype.FilterAttributeGroupValues = function(group, attributeFilters, sizeFilter) {
    var values = new Array();
    var productData = this;
    var count = 0;

    for (variantIndex in this.data.Variants) {
        var variant = this.data.Variants[variantIndex];
        var add = this.VariantMatches(variant, attributeFilters, sizeFilter);

        if (add) {
            if (group != "size") {
                for(attributeIndex in variant.Attributes) {
                    var attribute = variant.Attributes[attributeIndex];
                    if(attribute.Attribute.Id == group) {
                        values.push({ id: attribute.Id, text: attribute.Name });
                    }
                }
            } else {
                for(itemIndex in variant.Items) {
                    var item = variant.Items[itemIndex];
                    values.push({ id: item.Size.Id, text: item.Size.Name });
                }
            }
         }
    }
    
    return this.DistinctAttributeGroupValues(values);
}


ProductData.prototype.FilterVariant = function(attributeFilters, sizeFilter) {
    var values = new Array();
    var productData = this;
    
    for (variantIndex in this.data.Variants) {
        var variant = this.data.Variants[variantIndex];
        var add = this.VariantMatches(variant, attributeFilters, sizeFilter);

        if (add) {
            values.push(variant);
        }
    }
    
    return values;
}


function AttributeRenderer(options) {
    this.options = $.extend({ target: null, data: null, adapter: null, creator: null }, options);
    this.target = this.options.target;
    this.data = this.options.data;
    this.adapter = this.options.adapter;
    this.creator = this.options.creator;
    this.adapter.Notify = this.Notify;
    this.adapter.renderer = this;

    this.selected = null;
    this.missing = new Array();
}

AttributeRenderer.prototype.run = function() {
    var renderer = this;

    if (this.adapter.CreateAttributeGroup != null) {
        $(this.data.GetAttributeGroups()).each(function(index) {
            renderer.adapter.CreateAttributeGroup(renderer.target, this.id, this.name, index, renderer.data.GetAttributeGroupValues(this.id));
        });
    }
    this.NotifyChange();
}

AttributeRenderer.prototype.Notify = function(group, index) {
    var renderer = this;
    $(renderer.data.GetAttributeGroups()).each(function(aindex) {
        var renderGroup = this;
        if (group != renderGroup.id) {
            var attributefilter = new Array();
            var sizefilter = null;
            $(renderer.data.GetAttributeGroups()).each(function(findex) {
                if (this.id != renderGroup.id) {
                    var selectedvalue = renderer.adapter.GetAttributeGroupValue(renderer.target, findex);
                    if (selectedvalue) {
                        if (this.id == "size") {
                            sizefilter = { id: selectedvalue };
                        } else {
                            attributefilter.push({ id: this.id, value: selectedvalue });
                        }
                    }
                }
            });

            renderer.adapter.CreateAttributeGroup(
                renderer.target,
                renderGroup.id,
                renderGroup.name,
                aindex,
                renderer.data.FilterAttributeGroupValues.call(renderer.data, renderGroup.id, attributefilter, sizefilter)
            );
        }
    });
    this.NotifyChange();
}

AttributeRenderer.prototype.NotifyChange = function() {
    var renderer = this;
    var allSelected = true;
    var attributeFilters = new Array();
    var sizeFilter = null;
    renderer.missing.length = 0;

    $(renderer.data.GetAttributeGroups()).each(function(index) {
        var selectedvalue = renderer.adapter.GetAttributeGroupValue(renderer.target, index);
        if (selectedvalue) {
            if (this.id == "size") {
                sizeFilter = { id: selectedvalue };
            } else {
                attributeFilters.push({ id: this.id, value: selectedvalue });
            }
        } else {
            renderer.missing.push(this.name);
            allSelected = false;
        }
    });

    this.Changed();

    if (!allSelected) {
        this.selected = null;
        this.Deselected();
        return;
    }

    var variants = this.data.FilterVariant.call(this.data, attributeFilters, sizeFilter);
    if (variants.length != 1) {
        this.selected = null;
        this.Deselected();
    } else {
        var variant = variants[0];
        var model;
        var item;
        if (sizeFilter != null) {
            for (itemIndex in variant.Items) {
                var currentItem = variant.Items[itemIndex];
                if (currentItem.Size.Id == sizeFilter.id) {
                    this.selected = { variant: variant, item: currentItem, mediaId: currentItem.MediaId, id: variant.Id, size: currentItem.Size.Id }
                    break;
                }
            }
        } else {
            this.selected = { variant: variant, item: variant.Items[0], mediaId: variant.Items[0].MediaId, id: variant.Id, size: "000" }
        }

        this.Selected.call(
            this.creator,
            this.selected.variant,
            this.selected.item
        );
    }
}

AttributeRenderer.prototype.Selected = function(variant, model) {
}

AttributeRenderer.prototype.Deselected = function() {
}

AttributeRenderer.prototype.Changed = function() {
}


function AttributeAdapter1(options) {
    this.options = $.extend({ selectbox: null, localization: null }, options);
    this.renderer = null;
    this.index = -1;
    this.idPrefix = Utilities.randomId("AttributeAdapter1");
}

AttributeAdapter1.prototype.CreateAttributeGroup = function(target, groupId, group, index, options) {
    var groupTarget = $("#" + this.idPrefix + index, target);
    var newGroup = groupTarget.size() == 0;
    var selectbox = $.inArray(groupId, this.options.selectbox) >= 0;

    if (this.index < index)
        this.index = index;

    // If new
    if (newGroup) {
        if (index > 0) {
            target.append("<br class=\"clear\"/>");
        }
        target.append($("<label></label>").html(group));
        $(this.options.append).each(function() {
            if (this.id == groupId) {
                target.append(this.tag);
            }
        });
        var temp = null;
        if (selectbox) {
            groupTarget = $("<select class=\"styled\"></select");
        } else {
            groupTarget = $("<dl></dl>");
        }
        groupTarget.attr("id", this.idPrefix + index)
            .data("group", group)
            .data("groupId", groupId)
            .data("index", index)
            .data("adapter", this)
        target.append(groupTarget);
    }

    var selectedId = this.GetAttributeGroupValue(target, index);
    groupTarget.children().remove();

    // Render options
    var select = groupTarget.get(0);
    for (i = 0; i < options.length; i++) {
        var option = options[i];
        if (selectbox) {
            if (i == 0) {
                groupTarget.unbind("change", this.SelectboxGroupChanged);
                select.options[0] = new Option(this.options.localization.choose, "---", true);
            }
            select.options[select.options.length] = new Option(option.text, option.id, false, option.id == selectedId);
        } else {
            var alternative = $("<dd></dd>");
            var anchor = $("<a></a>").attr("href", "#").attr("rel", option.id).attr("tracking", "measure-table").html(option.text);
            //var pos = option.text.indexOf("(");
            //if (pos > 0) {
              //  option.text = option.substring(0, pos - 1);
                //anchor.append($("<span class=\"translated\"></span>").html(option.text.substring(pos + 1, option.length - 1)))
            //}
            if (option.id == selectedId)
                alternative.addClass("active");

            alternative.append(anchor);
            groupTarget.append(alternative);
        }
    }

    if (selectbox && newGroup) {
        groupTarget.customStyle();
    }

    if (selectbox) {
        groupTarget.change(this.SelectboxGroupChanged);
    } else {
        $("a", groupTarget).click(this.ButtonGroupChanged);
    }
}

AttributeAdapter1.prototype.GetAttributeGroupValue = function(target, index) {
    var groupTarget = $("#" + this.idPrefix + index, target);

    if (groupTarget.attr("tagName").toLowerCase() == "select") {
        var alternative = $("option:selected", groupTarget);
        if (alternative.size() == 0)
            return null;

        if (alternative.val() == "---")
            return null;

        return alternative.val();
    } else {
        var alternative = $("dd.active a", groupTarget);
        return alternative.length == 0 ? null : alternative.attr("rel");
    }

    return null;
}

AttributeAdapter1.prototype.SelectboxGroupChanged = function() {
    var groupTarget = $(this);
    var adapter = groupTarget.data("adapter");
    adapter.Notify.call(adapter.renderer, groupTarget.data("groupId"), groupTarget.data("index"));
}

AttributeAdapter1.prototype.ButtonGroupChanged = function(sender) {
    var anchor = $(this);
    anchor.parent().toggleClass("active").siblings().removeClass("active");
    var groupTarget = anchor.parents("dl:eq(0)");
    var adapter = groupTarget.data("adapter");
    adapter.Notify.call(adapter.renderer, groupTarget.data("groupId"), groupTarget.data("index"));
    return false;
}

AttributeAdapter1.prototype.Notify = function(group, index) {
}


function AttributeAdapter2(options) {
    this.options = $.extend({ localization: null }, options);
    this.renderer = null;
    this.index = -1;
    this.idPrefix = Utilities.randomId("AttributeAdapter1");
}

AttributeAdapter2.prototype.CreateAttributeGroup = function(target, groupId, group, index, options) {
    var groupTarget = $("#" + this.idPrefix + index, target);
    var newGroup = groupTarget.size() == 0;

    if (this.index < index)
        this.index = index;

    // If new
    if (newGroup) {
        var temp = null;
        groupTarget = $("<select class=\"styled\"></select");
        groupTarget.attr("id", this.idPrefix + index)
            .data("group", group)
            .data("groupId", groupId)
            .data("index", index)
            .data("adapter", this)
        target.append(groupTarget);
    }

    var selectedId = this.GetAttributeGroupValue(target, index);
    groupTarget.children().remove();

    // Render options
    var select = groupTarget.get(0);
    for (i = 0; i < options.length; i++) {
        var option = options[i];
        if (i == 0) {
            groupTarget.unbind("change", this.SelectboxGroupChanged);
            select.options[0] = new Option(group, "---", true);
        }

        select.options[select.options.length] = new Option(option.text, option.id, false, option.id == selectedId);
    }

    if (newGroup) {
        groupTarget.customStyle();
    }

    groupTarget.change(this.SelectboxGroupChanged);
}

AttributeAdapter2.prototype.GetAttributeGroupValue = function(target, index) {
    var groupTarget = $("#" + this.idPrefix + index, target);

    var alternative = $("option:selected", groupTarget);
    if (alternative.size() == 0)
        return null;

    if (alternative.val() == "---")
        return null;

    return alternative.val();
}

AttributeAdapter2.prototype.SelectboxGroupChanged = function() {
    var groupTarget = $(this);
    var adapter = groupTarget.data("adapter");
    adapter.Notify.call(adapter.renderer, groupTarget.data("groupId"), groupTarget.data("index"));
}

AttributeAdapter2.prototype.Notify = function(group, index) {
}


function ProductPage1(options) {
    this.options = $.extend({ data: null, adapter: null, localization: null, sso: null }, options);
    this.container = $(".product-index");
    this.productData = this.options.data;
    this.attributeAdapter = this.options.adapter;
    this.attributeRenderer = new AttributeRenderer({
        target: $(".order-form .attributes", this.container),
        data: this.productData,
        adapter: this.attributeAdapter,
        creator: this
    });
    this.attributeRenderer.Selected = this.ItemSelected;
    this.attributeRenderer.Deselected = this.ItemDeselected;
    this.attributeRenderer.Changed = this.Changed;
    this.imageIdentifier = this.options.mainImage;
    this.productId = this.options.productId;
    this.Initialize();
}

ProductPage1.prototype.Initialize = function() {
    // Render the selection boxes for size, color, etc.
    this.attributeRenderer.run();

    var productPage = this;
    $(function() {
        // Hook up the buy button and its cart logic
        productPage.InitializeBuyButton.call(productPage);

        productPage.InitiateImages.call(productPage);
        productPage.InitiateCi.call(productPage);
    });
}

ProductPage1.prototype.InitiateImages = function() {
    var productPage = this;
    //Change display image
    $(".media ul a", productPage.container).click(function(e) {
        e.preventDefault();
        var anchor = $(this);
        var image = $(".main-image", productPage.container);
        var viewport = image.parent();
        viewport.stop().animate({ opacity: 0 }, 200, function() {
            $(".controllers .magnify a", productPage.container).attr("href", "/Product/ImagePopup/" + productPage.productId + "?index=" + anchor.parent().prevAll().size());
            var img = new Image();
            img.onload = function() {
                image.attr("src", anchor.attr("href"));
                image.zoom({ high: anchor.attr("rel"), maxWidth: 1280 });
                viewport.animate({ opacity: 1 }, 200);
            }
            img.src = anchor.attr("href");
        });
    });

    $(".main-image", productPage.container).zoom({ help: { text: productPage.options.localization.zoomHelp }, high: productPage.options.mainImageZoom, maxWidth: 1280, zoom: { steps: 3, plus: $(".controllers .plus", productPage.container), minus: $(".controllers .minus", productPage.container), loader: "/Content/Images/Global/AjaxLoader.gif" } });
}

ProductPage1.prototype.InitiateCi = function() {
    var productPage = this;
    productPage.InitiateCiReviewOverview();
}

ProductPage1.prototype.InitiateCiReviewOverview = function() {
    var productPage = this;
    $(".review-overview .add-review, .add-comment-link", productPage.container).click(function() {
        var container = $(".review-form", productPage.container);
        container.slideDown(200);
        container.scrollTo();
    });

    $(".review-overview .read-reviews, .read-comments-link", productPage.container).click(function() {
        var container = $(".reviews", productPage.container);
        container.slideDown(200);
        container.scrollTo();
    });

    CustomerInteraction.events.one("addSuccess", function() {
        $.get("/Product/ReviewOverview/" + productPage.productId, function(response) {
            $(".review-overview", productPage.container).replaceWith(response);
            productPage.InitiateCiReviewOverview();
        });
    });
}

ProductPage1.prototype.ItemSelected = function(variant, item) {
    var productPage = this;
    var price = $(".info .price", productPage.container);
    if (item.Price.CurrentPrice < item.Price.RegularPrice) {
        price.html("<del>" + item.Price.RegularPriceFormatted + "</del> <span>" + item.Price.CurrentPriceFormatted + "</span>");
    } else {
        price.html(item.Price.CurrentPriceFormatted);
    }
}

ProductPage1.prototype.ItemDeselected = function() {
    var productPage = this;

    var price = $(".info .price", productPage.container);
    if (!price.data("default"))
        price.data("default", price.html());
    price.html(price.data("default"));
}

ProductPage1.prototype.Changed = function() {
    var productPage = this;
    $(".order-form .buy.button div.error", productPage.container).remove();
}

ProductPage1.prototype.InitializeBuyButton = function() {
    var productPage = this;
    $(".order-form .buy.button button", productPage.container).click(function(e) {
        var button = $(this);
        var span = button.parent();
        e.preventDefault();
        var selected = productPage.attributeRenderer.selected;
        var quantity = $(".order-form .quantity", productPage.container).val().replace(/\s/g, "");

        if (productPage.attributeRenderer.missing.length > 0) {
            span.prepend($("<div class=\"error\">" + productPage.options.localization.choose + " " + productPage.attributeRenderer.missing[0].toLowerCase() + "</div>"));
            Initiate(span);
        } else if (isNaN(quantity.replace(',', '.')) || quantity == '') {
            span.prepend($("<div class=\"error\">" + productPage.options.localization.quantityInvalid + "</div>"));
            Initiate(span);
        } else {
            Cart.events.bind("add.productPage1", this, function(e) {
                button.data("original", button.html());
                button.css("width", button.outerWidth()).html("<img src=\"/Content/Images/Global/Button.AjaxLoader.gif\" alt=\"\" />");
            });

            Cart.events.bind("addSuccess.productPage1", this, function(e) {
                Cart.events.unbind(".productPage1");
                button.html(button.data("original"));
                span.children("div.information, div.error").remove();
                span.prepend($("<div class=\"information auto-hide\">" + productPage.options.localization.added + "<div class=\"wrapper\"><span class=\"button red\"><a href=\"/Checkout\">" + productPage.options.localization.toCheckout + "</a></span></div></div>"));
                Initiate(span);
            });

            Cart.events.bind("error.productPage1", this, function(e) {
                Cart.events.unbind(".productPage1");
                button.html(button.data("original"));
                span.children("div.information, div.error").remove();
                span.prepend($("<div class=\"error\">" + Texts.TemporaryError + "</div>"));
                Initiate(span);
            });

            //add: function(mediaId, variantId, sizeId, quantity, phrase, category, brand) {

            Cart.add(selected.mediaId, selected.id, selected.size, quantity, productPage.options.sso.phrase, null, null);
        }
    });
}


$(function() {
    $(".finance-loan-calculation").each(function() {
        var container = $(this);
        var period = $("select.period", container);
        var amount = $("select.amount", container);
        var result = $(".result", container);
        var resultSpan = $(".result span", container);

        $("select", container).change(function() {
            var costValue = costs[period.val() + ':' + amount.val()];
            if (costValue) {
                result.show();
                resultSpan.html(costValue);
            } else if ((period != null && period.val() != "") && (amount != null && amount.val() != "")) {
                result.show();
                resultSpan.html("-");
            }
            else {
                result.hide();
            }
        });
    });

    $(".finance-loan-application").each(function() {
        var container = $(this);
        var employmentYear = $(".employment-year", container);
        var employmentMonth = $(".employment-month", container);
        var employedSince = $(".employed-since", container);

        employmentYear.add(employmentMonth).change(function() {
            employedSince.val(employmentYear.val() + "-" + employmentMonth.val());
        });
    });
});


$(function() {
    $(".customer-type button").click(function() {
        var button = $(this);
        var value = button.get(0).attributes['value'].value;
        button.parents(".customer-type:eq(0)").children("input").val(value);
        button.parents("form:eq(0)").removeClass("lookup").removeClass("application").addClass(value);
    });

    var pdContainer = $(".checkout-plan-delivery");
    if (pdContainer.size() > 0) {
        $(".actions :submit", pdContainer).click(function() {
            var button = $(this);
            var actions = button.parents(".actions:eq(0)");
            var policy = $(":checkbox", actions);
            $("input.accept-policy", pdContainer).val(policy.is(":checked") ? policy.val() : null);
            $("form.checkout", pdContainer).submit();
        });

        Cart.events.bind("modified", function() {
            $("span.total", pdContainer).html(Cart.value.Total);
            var formContainer = pdContainer.children(":not(.margin)");
            if (Cart.value.ItemCount == 0)
                formContainer.addClass("no-items");
            else
                formContainer.removeClass("no-items");
        });
    }

    var oContainer = $(".checkout-offline");
    if (oContainer.size() > 0) {
        $(".actions :submit", oContainer).click(function() {
            $("form.checkout", oContainer).submit();
        });

        Cart.events.bind("modified", function() {
            $("span.total", oContainer).html(Cart.value.Total);
            var formContainer = oContainer.children(":not(.margin)");
            if (Cart.value.ItemCount == 0)
                formContainer.addClass("no-items");
            else
                formContainer.removeClass("no-items");
        });
    }
});


