

/** File: jquery.pack.js **/

/*
 * jQuery JavaScript Library v1.3.1
 * http://jquery.com/
 *
 * Copyright (c) 2009 John Resig
 * Dual licensed under the MIT and GPL licenses.
 * http://docs.jquery.com/License
 *
 * Date: 2009-01-21 20:42:16 -0500 (Wed, 21 Jan 2009)
 * Revision: 6158
 */
(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.makeArray(E))},selector:"",jquery:"1.3.1",size:function(){return this.length},get:function(E){return E===g?o.makeArray(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,find:function(E){if(this.length===1&&!/,/.test(E)){var G=this.pushStack([],"find",E);G.length=0;o.find(E,this[0],G);return G}else{var F=o.map(this,function(H){return o.find(E,H)});return this.pushStack(/[^+>] [^+>]/.test(E)?o.unique(F):F,"find",E)}},clone:function(F){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.cloneNode(true),H=document.createElement("div");H.appendChild(I);return o.clean([H.innerHTML])[0]}else{return this.cloneNode(true)}});var G=E.find("*").andSelf().each(function(){if(this[h]!==g){this[h]=null}});if(F===true){this.find("*").andSelf().each(function(I){if(this.nodeType==3){return}var H=o.data(this,"events");for(var K in H){for(var J in H[K]){o.event.add(G[I],K,H[K][J],H[K][J].data)}}})}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 F=o.expr.match.POS.test(E)?o(E):null;return this.map(function(){var G=this;while(G&&G.ownerDocument){if(F?F.index(G)>-1:o(G).is(E)){return G}G=G.parentNode}})},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: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(K,N,M){if(this[0]){var J=(this[0].ownerDocument||this[0]).createDocumentFragment(),G=o.clean(K,(this[0].ownerDocument||this[0]),J),I=J.firstChild,E=this.length>1?J.cloneNode(true):J;if(I){for(var H=0,F=this.length;H<F;H++){M.call(L(this[H],I),H>0?E.cloneNode(true):J)}}if(G){o.each(G,z)}}return this;function L(O,P){return N&&o.nodeName(O,"table")&&o.nodeName(P,"tr")?(O.getElementsByTagName("tbody")[0]||O.appendChild(O.ownerDocument.createElement("tbody"))):O}}};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){G=o.trim(G);if(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(G,E,I){if(E=="width"||E=="height"){var K,F={position:"absolute",visibility:"hidden",display:"block"},J=E=="width"?["Left","Right"]:["Top","Bottom"];function H(){K=E=="width"?G.offsetWidth:G.offsetHeight;var M=0,L=0;o.each(J,function(){M+=parseFloat(o.curCSS(G,"padding"+this,true))||0;L+=parseFloat(o.curCSS(G,"border"+this+"Width",true))||0});K-=Math.round(M+L)}if(o(G).is(":visible")){H()}else{o.swap(G,F,H)}return Math.max(0,K)}return o.curCSS(G,E,I)},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,R){if(typeof R==="number"){R+=""}if(!R){return}if(typeof R==="string"){R=R.replace(/(<(\w+)[^>]*?)\/>/g,function(T,U,S){return S.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?T:U+"></"+S+">"});var O=o.trim(R).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]+R+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var N=!O.indexOf("<table")&&O.indexOf("<tbody")<0?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&O.indexOf("<tbody")<0?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(R)){L.insertBefore(K.createTextNode(R.match(/^\s*/)[0]),L.firstChild)}R=o.makeArray(L.childNodes)}if(R.nodeType){G.push(R)}else{G=o.merge(G,R)}});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(){var G=arguments;return this.each(function(){for(var H=0,I=G.length;H<I;H++){o(G[H])[F](this)}})}});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).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 Q=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]+['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,K=0,G=Object.prototype.toString;var F=function(X,T,aa,ab){aa=aa||[];T=T||document;if(T.nodeType!==1&&T.nodeType!==9){return[]}if(!X||typeof X!=="string"){return aa}var Y=[],V,ae,ah,S,ac,U,W=true;Q.lastIndex=0;while((V=Q.exec(X))!==null){Y.push(V[1]);if(V[2]){U=RegExp.rightContext;break}}if(Y.length>1&&L.exec(X)){if(Y.length===2&&H.relative[Y[0]]){ae=I(Y[0]+Y[1],T)}else{ae=H.relative[Y[0]]?[T]:F(Y.shift(),T);while(Y.length){X=Y.shift();if(H.relative[X]){X+=Y.shift()}ae=I(X,ae)}}}else{var ad=ab?{expr:Y.pop(),set:E(ab)}:F.find(Y.pop(),Y.length===1&&T.parentNode?T.parentNode:T,P(T));ae=F.filter(ad.expr,ad.set);if(Y.length>0){ah=E(ae)}else{W=false}while(Y.length){var ag=Y.pop(),af=ag;if(!H.relative[ag]){ag=""}else{af=Y.pop()}if(af==null){af=T}H.relative[ag](ah,af,P(T))}}if(!ah){ah=ae}if(!ah){throw"Syntax error, unrecognized expression: "+(ag||X)}if(G.call(ah)==="[object Array]"){if(!W){aa.push.apply(aa,ah)}else{if(T.nodeType===1){for(var Z=0;ah[Z]!=null;Z++){if(ah[Z]&&(ah[Z]===true||ah[Z].nodeType===1&&J(T,ah[Z]))){aa.push(ae[Z])}}}else{for(var Z=0;ah[Z]!=null;Z++){if(ah[Z]&&ah[Z].nodeType===1){aa.push(ae[Z])}}}}}else{E(ah,aa)}if(U){F(U,T,aa,ab)}return aa};F.matches=function(S,T){return F(S,null,null,T)};F.find=function(Z,S,aa){var Y,W;if(!Z){return[]}for(var V=0,U=H.order.length;V<U;V++){var X=H.order[V],W;if((W=H.match[X].exec(Z))){var T=RegExp.leftContext;if(T.substr(T.length-1)!=="\\"){W[1]=(W[1]||"").replace(/\\/g,"");Y=H.find[X](W,S,aa);if(Y!=null){Z=Z.replace(H.match[X],"");break}}}}if(!Y){Y=S.getElementsByTagName("*")}return{set:Y,expr:Z}};F.filter=function(ab,aa,ae,V){var U=ab,ag=[],Y=aa,X,S;while(ab&&aa.length){for(var Z in H.filter){if((X=H.match[Z].exec(ab))!=null){var T=H.filter[Z],af,ad;S=false;if(Y==ag){ag=[]}if(H.preFilter[Z]){X=H.preFilter[Z](X,Y,ae,ag,V);if(!X){S=af=true}else{if(X===true){continue}}}if(X){for(var W=0;(ad=Y[W])!=null;W++){if(ad){af=T(ad,X,W,Y);var ac=V^!!af;if(ae&&af!=null){if(ac){S=true}else{Y[W]=false}}else{if(ac){ag.push(ad);S=true}}}}}if(af!==g){if(!ae){Y=ag}ab=ab.replace(H.match[Z],"");if(!S){return[]}break}}}ab=ab.replace(/\s*,\s*/,"");if(ab==U){if(S==null){throw"Syntax error, unrecognized expression: "+ab}else{break}}U=ab}return Y};var H=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(S){return S.getAttribute("href")}},relative:{"+":function(W,T){for(var U=0,S=W.length;U<S;U++){var V=W[U];if(V){var X=V.previousSibling;while(X&&X.nodeType!==1){X=X.previousSibling}W[U]=typeof T==="string"?X||false:X===T}}if(typeof T==="string"){F.filter(T,W,true)}},">":function(X,T,Y){if(typeof T==="string"&&!/\W/.test(T)){T=Y?T:T.toUpperCase();for(var U=0,S=X.length;U<S;U++){var W=X[U];if(W){var V=W.parentNode;X[U]=V.nodeName===T?V:false}}}else{for(var U=0,S=X.length;U<S;U++){var W=X[U];if(W){X[U]=typeof T==="string"?W.parentNode:W.parentNode===T}}if(typeof T==="string"){F.filter(T,X,true)}}},"":function(V,T,X){var U="done"+(K++),S=R;if(!T.match(/\W/)){var W=T=X?T:T.toUpperCase();S=O}S("parentNode",T,U,V,W,X)},"~":function(V,T,X){var U="done"+(K++),S=R;if(typeof T==="string"&&!T.match(/\W/)){var W=T=X?T:T.toUpperCase();S=O}S("previousSibling",T,U,V,W,X)}},find:{ID:function(T,U,V){if(typeof U.getElementById!=="undefined"&&!V){var S=U.getElementById(T[1]);return S?[S]:[]}},NAME:function(S,T,U){if(typeof T.getElementsByName!=="undefined"&&!U){return T.getElementsByName(S[1])}},TAG:function(S,T){return T.getElementsByTagName(S[1])}},preFilter:{CLASS:function(V,T,U,S,Y){V=" "+V[1].replace(/\\/g,"")+" ";var X;for(var W=0;(X=T[W])!=null;W++){if(X){if(Y^(" "+X.className+" ").indexOf(V)>=0){if(!U){S.push(X)}}else{if(U){T[W]=false}}}}return false},ID:function(S){return S[1].replace(/\\/g,"")},TAG:function(T,S){for(var U=0;S[U]===false;U++){}return S[U]&&P(S[U])?T[1]:T[1].toUpperCase()},CHILD:function(S){if(S[1]=="nth"){var T=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(S[2]=="even"&&"2n"||S[2]=="odd"&&"2n+1"||!/\D/.test(S[2])&&"0n+"+S[2]||S[2]);S[2]=(T[1]+(T[2]||1))-0;S[3]=T[3]-0}S[0]="done"+(K++);return S},ATTR:function(T){var S=T[1].replace(/\\/g,"");if(H.attrMap[S]){T[1]=H.attrMap[S]}if(T[2]==="~="){T[4]=" "+T[4]+" "}return T},PSEUDO:function(W,T,U,S,X){if(W[1]==="not"){if(W[3].match(Q).length>1){W[3]=F(W[3],null,null,T)}else{var V=F.filter(W[3],T,U,true^X);if(!U){S.push.apply(S,V)}return false}}else{if(H.match.POS.test(W[0])){return true}}return W},POS:function(S){S.unshift(true);return S}},filters:{enabled:function(S){return S.disabled===false&&S.type!=="hidden"},disabled:function(S){return S.disabled===true},checked:function(S){return S.checked===true},selected:function(S){S.parentNode.selectedIndex;return S.selected===true},parent:function(S){return !!S.firstChild},empty:function(S){return !S.firstChild},has:function(U,T,S){return !!F(S[3],U).length},header:function(S){return/h\d/i.test(S.nodeName)},text:function(S){return"text"===S.type},radio:function(S){return"radio"===S.type},checkbox:function(S){return"checkbox"===S.type},file:function(S){return"file"===S.type},password:function(S){return"password"===S.type},submit:function(S){return"submit"===S.type},image:function(S){return"image"===S.type},reset:function(S){return"reset"===S.type},button:function(S){return"button"===S.type||S.nodeName.toUpperCase()==="BUTTON"},input:function(S){return/input|select|textarea|button/i.test(S.nodeName)}},setFilters:{first:function(T,S){return S===0},last:function(U,T,S,V){return T===V.length-1},even:function(T,S){return S%2===0},odd:function(T,S){return S%2===1},lt:function(U,T,S){return T<S[3]-0},gt:function(U,T,S){return T>S[3]-0},nth:function(U,T,S){return S[3]-0==T},eq:function(U,T,S){return S[3]-0==T}},filter:{CHILD:function(S,V){var Y=V[1],Z=S.parentNode;var X=V[0];if(Z&&(!Z[X]||!S.nodeIndex)){var W=1;for(var T=Z.firstChild;T;T=T.nextSibling){if(T.nodeType==1){T.nodeIndex=W++}}Z[X]=W-1}if(Y=="first"){return S.nodeIndex==1}else{if(Y=="last"){return S.nodeIndex==Z[X]}else{if(Y=="only"){return Z[X]==1}else{if(Y=="nth"){var ab=false,U=V[2],aa=V[3];if(U==1&&aa==0){return true}if(U==0){if(S.nodeIndex==aa){ab=true}}else{if((S.nodeIndex-aa)%U==0&&(S.nodeIndex-aa)/U>=0){ab=true}}return ab}}}}},PSEUDO:function(Y,U,V,Z){var T=U[1],W=H.filters[T];if(W){return W(Y,V,U,Z)}else{if(T==="contains"){return(Y.textContent||Y.innerText||"").indexOf(U[3])>=0}else{if(T==="not"){var X=U[3];for(var V=0,S=X.length;V<S;V++){if(X[V]===Y){return false}}return true}}}},ID:function(T,S){return T.nodeType===1&&T.getAttribute("id")===S},TAG:function(T,S){return(S==="*"&&T.nodeType===1)||T.nodeName===S},CLASS:function(T,S){return S.test(T.className)},ATTR:function(W,U){var S=H.attrHandle[U[1]]?H.attrHandle[U[1]](W):W[U[1]]||W.getAttribute(U[1]),X=S+"",V=U[2],T=U[4];return S==null?V==="!=":V==="="?X===T:V==="*="?X.indexOf(T)>=0:V==="~="?(" "+X+" ").indexOf(T)>=0:!U[4]?S:V==="!="?X!=T:V==="^="?X.indexOf(T)===0:V==="$="?X.substr(X.length-T.length)===T:V==="|="?X===T||X.substr(0,T.length+1)===T+"-":false},POS:function(W,T,U,X){var S=T[2],V=H.setFilters[S];if(V){return V(W,U,T,X)}}}};var L=H.match.POS;for(var N in H.match){H.match[N]=RegExp(H.match[N].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(T,S){T=Array.prototype.slice.call(T);if(S){S.push.apply(S,T);return S}return T};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(M){E=function(W,V){var T=V||[];if(G.call(W)==="[object Array]"){Array.prototype.push.apply(T,W)}else{if(typeof W.length==="number"){for(var U=0,S=W.length;U<S;U++){T.push(W[U])}}else{for(var U=0;W[U];U++){T.push(W[U])}}}return T}}(function(){var T=document.createElement("form"),U="script"+(new Date).getTime();T.innerHTML="<input name='"+U+"'/>";var S=document.documentElement;S.insertBefore(T,S.firstChild);if(!!document.getElementById(U)){H.find.ID=function(W,X,Y){if(typeof X.getElementById!=="undefined"&&!Y){var V=X.getElementById(W[1]);return V?V.id===W[1]||typeof V.getAttributeNode!=="undefined"&&V.getAttributeNode("id").nodeValue===W[1]?[V]:g:[]}};H.filter.ID=function(X,V){var W=typeof X.getAttributeNode!=="undefined"&&X.getAttributeNode("id");return X.nodeType===1&&W&&W.nodeValue===V}}S.removeChild(T)})();(function(){var S=document.createElement("div");S.appendChild(document.createComment(""));if(S.getElementsByTagName("*").length>0){H.find.TAG=function(T,X){var W=X.getElementsByTagName(T[1]);if(T[1]==="*"){var V=[];for(var U=0;W[U];U++){if(W[U].nodeType===1){V.push(W[U])}}W=V}return W}}S.innerHTML="<a href='#'></a>";if(S.firstChild&&S.firstChild.getAttribute("href")!=="#"){H.attrHandle.href=function(T){return T.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var S=F,T=document.createElement("div");T.innerHTML="<p class='TEST'></p>";if(T.querySelectorAll&&T.querySelectorAll(".TEST").length===0){return}F=function(X,W,U,V){W=W||document;if(!V&&W.nodeType===9&&!P(W)){try{return E(W.querySelectorAll(X),U)}catch(Y){}}return S(X,W,U,V)};F.find=S.find;F.filter=S.filter;F.selectors=S.selectors;F.matches=S.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){H.order.splice(1,0,"CLASS");H.find.CLASS=function(S,T){return T.getElementsByClassName(S[1])}}function O(T,Z,Y,ac,aa,ab){for(var W=0,U=ac.length;W<U;W++){var S=ac[W];if(S){S=S[T];var X=false;while(S&&S.nodeType){var V=S[Y];if(V){X=ac[V];break}if(S.nodeType===1&&!ab){S[Y]=W}if(S.nodeName===Z){X=S;break}S=S[T]}ac[W]=X}}}function R(T,Y,X,ab,Z,aa){for(var V=0,U=ab.length;V<U;V++){var S=ab[V];if(S){S=S[T];var W=false;while(S&&S.nodeType){if(S[X]){W=ab[S[X]];break}if(S.nodeType===1){if(!aa){S[X]=V}if(typeof Y!=="string"){if(S===Y){W=true;break}}else{if(F.filter(Y,[S]).length>0){W=S;break}}}S=S[T]}ab[V]=W}}}var J=document.compareDocumentPosition?function(T,S){return T.compareDocumentPosition(S)&16}:function(T,S){return T!==S&&(T.contains?T.contains(S):true)};var P=function(S){return S.nodeType===9&&S.documentElement.nodeName!=="HTML"||!!S.ownerDocument&&P(S.ownerDocument)};var I=function(S,Z){var V=[],W="",X,U=Z.nodeType?[Z]:Z;while((X=H.match.PSEUDO.exec(S))){W+=X[0];S=S.replace(H.match.PSEUDO,"")}S=H.relative[S]?S+"*":S;for(var Y=0,T=U.length;Y<T;Y++){F(S,U[Y],V)}return F.filter(W,V)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(S){return"hidden"===S.type||o.css(S,"display")==="none"||o.css(S,"visibility")==="hidden"};F.selectors.filters.visible=function(S){return"hidden"!==S.type&&o.css(S,"display")!=="none"&&o.css(S,"visibility")!=="hidden"};F.selectors.filters.animated=function(S){return o.grep(o.timers,function(T){return S===T.elem}).length};o.multiFilter=function(U,S,T){if(T){U=":not("+U+")"}return F.matches(U,S)};o.dir=function(U,T){var S=[],V=U[T];while(V&&V!=document){if(V.nodeType==1){S.push(V)}V=V[T]}return S};o.nth=function(W,S,U,V){S=S||1;var T=0;for(;W;W=W[U]){if(W.nodeType==1&&++T==S){break}}return W};o.sibling=function(U,T){var S=[];for(;U;U=U.nextSibling){if(U.nodeType==1&&U!=T){S.push(U)}}return S};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);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})}}});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){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&&typeof l.frameElement==="undefined"){(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="1px";L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L)})})();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/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();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}this[H].style.display=o.data(this[H],"olddisplay",K)}}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"))}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)==1){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)}},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(H,F){var E=H?"Left":"Top",G=H?"Right":"Bottom";o.fn["inner"+F]=function(){return this[F.toLowerCase()]()+j(this,"padding"+E)+j(this,"padding"+G)};o.fn["outer"+F]=function(J){return this["inner"+F]()+j(this,"border"+E+"Width")+j(this,"border"+G+"Width")+(J?j(this,"margin"+E)+j(this,"margin"+G):0)};var I=F.toLowerCase();o.fn[I]=function(J){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+F]||document.body["client"+F]:this[0]==document?Math.max(document.documentElement["client"+F],document.body["scroll"+F],document.documentElement["scroll"+F],document.body["offset"+F],document.documentElement["offset"+F]):J===g?(this.length?o.css(this[0],I):null):this.css(I,typeof J==="string"?J:J+"px")}})})();


/** File: jquery.tools.min.js **/

/*
 * jquery.tools 1.0.2 - The missing UI library
 *
 * [tools.tooltip-1.0.2, tools.overlay-1.0.4, tools.expose-1.0.3]
 *
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * -----
 *
 * Build: Fri Jun 12 13:06:01 GMT+00:00 2009
 */
(function(c){c.tools=c.tools||{version:{}};c.tools.version.tooltip="1.0.2";var b={toggle:[function(){this.getTip().show()},function(){this.getTip().hide()}],fade:[function(){this.getTip().fadeIn(this.getConf().fadeInSpeed)},function(){this.getTip().fadeOut(this.getConf().fadeOutSpeed)}]};c.tools.addTipEffect=function(d,f,e){b[d]=[f,e]};c.tools.addTipEffect("slideup",function(){var d=this.getConf();var e=d.slideOffset||10;this.getTip().css({opacity:0}).animate({top:"-="+e,opacity:d.opacity},d.slideInSpeed||200).show()},function(){var d=this.getConf();var e=d.slideOffset||10;this.getTip().animate({top:"-="+e,opacity:0},d.slideOutSpeed||200,function(){c(this).hide().animate({top:"+="+(e*2)},0)})});function a(f,e){var d=this;var h=f.next();if(e.tip){if(e.tip.indexOf("#")!=-1){h=c(e.tip)}else{h=f.nextAll(e.tip).eq(0);if(!h.length){h=f.parent().nextAll(e.tip).eq(0)}}}function j(k,l){c(d).bind(k,function(n,m){if(l&&l.call(this)===false&&m){m.proceed=false}});return d}c.each(e,function(k,l){if(c.isFunction(l)){j(k,l)}});var g=f.is("input, textarea");f.bind(g?"focus":"mouseover",function(k){k.target=this;d.show(k);h.hover(function(){d.show()},function(){d.hide()})});f.bind(g?"blur":"mouseout",function(){d.hide()});h.css("opacity",e.opacity);var i=0;c.extend(d,{show:function(q){if(q){f=c(q.target)}clearTimeout(i);if(h.is(":animated")||h.is(":visible")){return d}var o={proceed:true};c(d).trigger("onBeforeShow",o);if(!o.proceed){return d}var n=f.position().top-h.outerHeight();var k=h.outerHeight()+f.outerHeight();var r=e.position[0];if(r=="center"){n+=k/2}if(r=="bottom"){n+=k}var l=f.outerWidth()+h.outerWidth();var m=f.position().left+f.outerWidth();r=e.position[1];if(r=="center"){m-=l/2}if(r=="left"){m-=l}n+=e.offset[0];m+=e.offset[1];h.css({position:"absolute",top:n,left:m});b[e.effect][0].call(d);c(d).trigger("onShow");return d},hide:function(){clearTimeout(i);i=setTimeout(function(){if(!h.is(":visible")){return d}var k={proceed:true};c(d).trigger("onBeforeHide",k);if(!k.proceed){return d}b[e.effect][1].call(d);c(d).trigger("onHide")},e.delay||1);return d},isShown:function(){return h.is(":visible, :animated")},getConf:function(){return e},getTip:function(){return h},getTrigger:function(){return f},onBeforeShow:function(k){return j("onBeforeShow",k)},onShow:function(k){return j("onShow",k)},onBeforeHide:function(k){return j("onBeforeHide",k)},onHide:function(k){return j("onHide",k)}})}c.prototype.tooltip=function(d){var e=this.eq(typeof d=="number"?d:0).data("tooltip");if(e){return e}var f={tip:null,effect:"slideup",delay:30,opacity:1,position:["top","center"],offset:[0,0],api:false};if(c.isFunction(d)){d={onBeforeShow:d}}c.extend(f,d);this.each(function(){e=new a(c(this),f);c(this).data("tooltip",e)});return f.api?e:this}})(jQuery);
(function(b){b.tools=b.tools||{version:{}};b.tools.version.overlay="1.0.4";var c=[];function a(h,d){var r=this,q=b(window),f,n,s,i,k,m,l;var e=d.expose&&b.tools.version.expose;function p(o,t){b(r).bind(o,function(v,u){if(t&&t.call(this)===false&&u){u.proceed=false}});return r}b.each(d,function(o,t){if(b.isFunction(t)){p(o,t)}});var j=d.target||h.attr("rel");var g=j?b(j):null;if(!g){g=h}else{k=h}q.load(function(){m=g.attr("overlay");if(!m){m=g.css("backgroundImage");if(!m){throw"background-image CSS property not set for overlay element: "+j}m=m.substring(m.indexOf("(")+1,m.indexOf(")")).replace(/\"/g,"");g.css("backgroundImage","none");g.attr("overlay",m)}s=g.outerWidth({margin:true});i=g.outerHeight({margin:true});n=b('<img src="'+m+'"/>');n.css({border:0,position:"absolute",display:"none"}).width(s).attr("overlay",true);b("body").append(n);if(k){k.bind("click.overlay",function(o){r.load(o.pageY-q.scrollTop(),o.pageX-q.scrollLeft());return o.preventDefault()})}d.close=d.close||".close";if(!g.find(d.close).length){g.prepend('<div class="close"></div>')}f=g.find(d.close);f.bind("click.overlay",function(){r.close()});if(d.preload){setTimeout(function(){var o=new Image();o.src=m},2000)}});b.extend(r,{load:function(w,v){if(!n){q.load(function(){r.load(w,v)});return r}if(r.isOpened()){return r}if(d.oneInstance){b.each(c,function(){this.close()})}var u={proceed:true};b(r).trigger("onBeforeLoad",u);if(!u.proceed){return r}if(e){n.expose(d.expose);l=n.expose().load()}w=w||d.start.top;v=v||d.start.left;var o=d.finish.top;var t=d.finish.left;if(o=="center"){o=Math.max((q.height()-i)/2,0)}if(t=="center"){t=Math.max((q.width()-s)/2,0)}if(!d.start.absolute){w+=q.scrollTop();v+=q.scrollLeft()}if(!d.finish.absolute){o+=q.scrollTop();t+=q.scrollLeft()}n.css({top:w,left:v,width:d.start.width,zIndex:d.zIndex}).show();n.animate({top:o,left:t,width:s},d.speed,function(){g.css({position:"absolute",top:o,left:t});var x=n.css("zIndex");f.add(g).css("zIndex",++x);g.fadeIn(d.fadeInSpeed,function(){b(r).trigger("onLoad")})});return r},close:function(){if(!r.isOpened()){return r}var u={proceed:true};b(r).trigger("onBeforeClose",u);if(!u.proceed){return r}if(l){l.close()}if(n.is(":visible")){g.hide();var t=d.start.top;var o=d.start.left;if(k){u=k.offset();t=u.top+k.height()/2;o=u.left+k.width()/2}n.animate({top:t,left:o,width:0},d.closeSpeed,function(){b(r).trigger("onClose",u)})}return r},getBackgroundImage:function(){return n},getContent:function(){return g},getTrigger:function(){return k},isOpened:function(){return g.is(":visible")},getConf:function(){return d},onBeforeLoad:function(o){return p("onBeforeLoad",o)},onLoad:function(o){return p("onLoad",o)},onBeforeClose:function(o){return p("onBeforeClose",o)},onClose:function(o){return p("onClose",o)}});b(document).keydown(function(o){if(o.keyCode==27){r.close()}});if(d.closeOnClick){b(document).bind("click.overlay",function(o){if(!g.is(":visible, :animated")){return}var t=b(o.target);if(t.attr("overlay")){return}if(t.parents("[overlay]").length){return}r.close()})}}b.fn.overlay=function(e){var f=this.eq(typeof e=="number"?e:0).data("overlay");if(f){return f}var d=b(window);var g={start:{top:Math.round(d.height()/2),left:Math.round(d.width()/2),width:0,absolute:false},finish:{top:80,left:"center",absolute:false},speed:"normal",fadeInSpeed:"fast",closeSpeed:"fast",close:null,oneInstance:true,closeOnClick:true,preload:true,zIndex:9999,api:false,expose:null,target:null};if(b.isFunction(e)){e={onBeforeLoad:e}}b.extend(true,g,e);this.each(function(){f=new a(b(this),g);c.push(f);b(this).data("overlay",f)});return g.api?f:this}})(jQuery);
(function(b){b.tools=b.tools||{version:{}};b.tools.version.expose="1.0.3";function a(){var e=b(window).width();if(b.browser.mozilla){return e}var d;if(window.innerHeight&&window.scrollMaxY){d=window.innerWidth+window.scrollMaxX}else{if(document.body.scrollHeight>document.body.offsetHeight){d=document.body.scrollWidth}else{d=document.body.offsetWidth}}return d<e?d+20:e}function c(g,h){var e=this,d=null,f=false,i=0;function j(k,l){b(e).bind(k,function(n,m){if(l&&l.call(this)===false&&m){m.proceed=false}});return e}b.each(h,function(k,l){if(b.isFunction(l)){j(k,l)}});b(window).bind("resize.expose",function(){if(d){d.css({width:a(),height:b(document).height()})}});b.extend(this,{getMask:function(){return d},getExposed:function(){return g},getConf:function(){return h},isLoaded:function(){return f},load:function(){if(f){return e}i=g.eq(0).css("zIndex");if(h.maskId){d=b("#"+h.maskId)}if(!d||!d.length){d=b("<div/>").css({position:"absolute",top:0,left:0,width:a(),height:b(document).height(),display:"none",opacity:0,zIndex:h.zIndex});if(h.maskId){d.attr("id",h.maskId)}b("body").append(d);var k=d.css("backgroundColor");if(!k||k=="transparent"||k=="rgba(0, 0, 0, 0)"){d.css("backgroundColor",h.color)}if(h.closeOnEsc){b(document).bind("keydown.unexpose",function(n){if(n.keyCode==27){e.close()}})}if(h.closeOnClick){d.bind("click.unexpose",function(){e.close()})}}var m={proceed:true};b(e).trigger("onBeforeLoad",m);if(!m.proceed){return e}b.each(g,function(){var n=b(this);if(!/relative|absolute|fixed/i.test(n.css("position"))){n.css("position","relative")}});g.css({zIndex:h.zIndex+1});var l=d.height();if(!this.isLoaded()){d.css({opacity:0,display:"block"}).fadeTo(h.loadSpeed,h.opacity,function(){if(d.height()!=l){d.css("height",l)}b(e).trigger("onLoad")})}f=true;return e},close:function(){if(!f){return e}var k={proceed:true};b(e).trigger("onBeforeClose",k);if(k.proceed===false){return e}d.fadeOut(h.closeSpeed,function(){b(e).trigger("onClose");g.css({zIndex:b.browser.msie?i:null})});f=false;return e},onBeforeLoad:function(k){return j("onBeforeLoad",k)},onLoad:function(k){return j("onLoad",k)},onBeforeClose:function(k){return j("onBeforeClose",k)},onClose:function(k){return j("onClose",k)}})}b.fn.expose=function(d){var e=this.eq(typeof d=="number"?d:0).data("expose");if(e){return e}var f={maskId:null,loadSpeed:"slow",closeSpeed:"fast",closeOnClick:true,closeOnEsc:true,zIndex:9998,opacity:0.8,color:"#456",api:false};if(typeof d=="string"){d={color:d}}b.extend(f,d);this.each(function(){e=new c(b(this),f);b(this).data("expose",e)});return f.api?e:this}})(jQuery);



/** File: AjaxHandler.class.js **/

/**
 * AjaxHandler.class.js file
 *
 * @author Aaron <aaron@doc-net.com>
 * @copyright Doctor Net Ltd &copy; 2008
 * @package SprintToolv3.default
 */
/**
 * AjaxHandler class
 *
 * Processes AJAX requests using jQuery
 *
 * @static
 */
function AjaxHandler() {}
AjaxHandler.str_url = '';
AjaxHandler.arr_data = new Array();
AjaxHandler.str_custom_xml = false;
AjaxHandler.bol_busy = false;
AjaxHandler.bol_async = false;

/**
 * Reset
 */
AjaxHandler.reset = function(str_url) {
   AjaxHandler.str_url = '';
   if(str_url) {
      AjaxHandler.str_url = str_url;
   }
   AjaxHandler.arr_data = new Array();
   AjaxHandler.str_custom_xml = false;
   AjaxHandler.bol_async = false;
};
/**
 * Set the URL
 *
 * @param String str_url
 */
AjaxHandler.set_url = function(str_url) {
   AjaxHandler.str_url = str_url;
};

/**
 * Add some data
 *
 * @param String str_field Field name
 * @param Mix mix_val Field value
 */
AjaxHandler.add_data = function(str_field, mix_val) {
   // See if we need to encode it first
   if (String(mix_val).match(/[^a-zA-Z0-9\.\-_]/) && !String(mix_val).match(/%[A-Z0-9]{2}/)) {
      mix_val = encodeURIComponent(mix_val);
   }
   AjaxHandler.arr_data[str_field] = mix_val;
};

/**
 * Set the custom XML
 *
 * To be used instead of add_data to specify
 * bespoke XML
 */
AjaxHandler.set_custom_xml = function(str_xml) {
   AjaxHandler.str_custom_xml = str_xml;
};

/**
 * Build up the XML document to send over AJAX
 *
 * @return String
 */
AjaxHandler.build_xml = function() {
   // Allow use of custom XML if set
   if (AjaxHandler.str_custom_xml) {
      return AjaxHandler.str_custom_xml;
   }
   var str_xml = '<'+'?xml version="1.0"?><root><fields>';
   for (str_field in AjaxHandler.arr_data) {
      // This will try to include the functions attached to AjaxHandler.arr_data
      if ((typeof AjaxHandler.arr_data[str_field]) != 'function') {
         str_xml += '<'+str_field+'><![CDATA['+AjaxHandler.arr_data[str_field]+']]></'+str_field+'>';
      }
   }
   str_xml += '</fields></root>';
   return str_xml;
}

/**
 * Set up a "busy" icon before dispatching the AjaxRequest
 *
 * Refer to do_dispatch() for parameters
 */
AjaxHandler.dispatch = function(fnc_success, fnc_failure) {
   $('#busy-wait-icon').show();
   if (AjaxHandler.bol_busy) {
      var int_timeout = 1000;
   } else {
      var int_timeout = 1;
   }
   setTimeout(function() {AjaxHandler.do_dispatch(fnc_success, fnc_failure)}, int_timeout);
}

/**
 * Perform the AJAX request
 *
 * Pass in the response object from the ajax call as a parameter to the callback(s).
 *
 * @param Function fnc_success (Optional) Function to be called on success
 * @param Function fnc_failure (Optional) Function to be called on failure
 */
AjaxHandler.do_dispatch = function(fnc_success, fnc_failure) {
   AjaxHandler.bol_busy = true;
   $.ajax({
      async: AjaxHandler.bol_async,
      type: "POST",
      url: AjaxHandler.str_url,
      data: 'str_xml='+escape(AjaxHandler.build_xml()),
      // If the AJAX call completed successfully
      success: function(obj_response) {
         AjaxHandler.bol_busy = false;
         // if the server-side script returned success
         if($('response', obj_response).attr('success') == 'true') {
             // If we've passed in an anonymous function into do_dispatch(), call it,
             // passing in the response object as a parameter.
            if (fnc_success) {
               fnc_success(obj_response);
            }
         } else if($('response', obj_response).attr('success') == 'logged_out') {
            // user has been logged out, so tell them this is the case, wait for them to hit OK and then forward to the login screen
            AjaxHandler.ajax_failure('You have been logged out, possibly due to a period of inactivity.  Please click OK to be forwarded to the login screen.');
            window.location = '/auth/login';
         // server-side didn't return success
         } else {
            // If we've passed in an anonymous function into do_dispatch(), call it,
            // passing in the response object as a parameter.
            if (fnc_failure) {
               fnc_failure(obj_response);
            } else {
               AjaxHandler.ajax_failure($('message', obj_response).text());
            }
         }
         $('#busy-wait-icon').hide();
      },
      // AJAX call didn't complete successfully
      error: function(obj_xmlhttp, str_error) {
         AjaxHandler.bol_busy = false;
         $('#busy-wait-icon').hide();
         // If the request was interrupted by page navigation there will be no response
         if (obj_xmlhttp.responseText) {
            AjaxHandler.ajax_failure('Sorry, there was a problem\n\n(Error code: AJAX-002)');
         }
      }
   });


};

/**
 * Alert user that the AJAX request failed
 *
 * @param String str_msg (Optional) Error message to display
 */
AjaxHandler.ajax_failure = function(str_msg) {
   if (!str_msg) {
      str_msg = 'Sorry, there was a problem';
   }
   alert(str_msg);
};

/**
 * Process the fields of a form ready for AJAX submission
 *
 * @param DOMElement|jQuery The form to process
 */
AjaxHandler.process_form = function(obj_form) {
   // Determine the parameter type
   if (obj_form instanceof jQuery) {
      obj_form = obj_form.get(0);
   }
   // Set the URL if appropriate
   if ($(obj_form).attr('action') && !AjaxHandler.str_url) {
      AjaxHandler.set_url($(obj_form).attr('action'));
   }
   // Process the form's data
   var arr_data = $(obj_form).formToArray();
   for (int_count in arr_data) {
      if (typeof(arr_data[int_count]) != 'function') {
         AjaxHandler.add_data(arr_data[int_count]['name'], arr_data[int_count]['value']);
      }
   }
};

/**
 * The following code is taken directly from the jQuery form plugin from http://malsup.com/jquery/form/
 */

/**
 * jQuery Form Plugin
 * version: 2.25 (08-APR-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
 *
 * 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+'.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 them here
        var inputs = form.getElementsByTagName("input");
        for(var i=0, max=inputs.length; i < max; i++) {
            var input = inputs[i];
            var n = input.name;
            if(n && !input.disabled && input.type == "image" && form.clk == input)
                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
        }
    }
    return a;
};
/**
 * 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;
    }
    return el.value;
};


/** File: global.js **/

/**
 * SprintEcommerce - Global
 *
 * @copyright Copyright &copy; 2010, Doctor Net Limited
 * @package SprintEcommerce Website
 */

// Global namespace
var Sprint = {};

// Module stack
Sprint.modules = (function () {
   // Queued modules
	var arr_modules = [];

	// Public methods
	return {
	   // Add module
		add: function (obj_module_initialise) {
			arr_modules[arr_modules.length] = obj_module_initialise;
		},

		// Run modules
		run: function () {
			for (var int_index in arr_modules) {
            arr_modules[int_index]();
         }
		}
	};
}());

// JQuery DOM ready
$(document).ready(function() {
   // Run modules
   Sprint.modules.run();
});


/** File: overlay.js **/

/**
 * SprintEcommerce - Overlay

 * Display content in a styled popup

 * Usage:
 * 1. Ensure the html has the correct elements str_overlay_div and str_content_source (see *** for an example)
 * 2. In js call Sprint.overlay.show('foo') where 'str_content_source #foo_content' is to be shown in the popup
 *
 * @copyright Copyright &copy; 2010, Doctor Net Limited
 * @package SprintEcommerce Website
 */

Sprint.overlay = (function () {
   // overlay id - hidden by default
   var str_overlay_div = '#sprint_overlay',
   // parent id of overlay source
   str_content_source = '#overlay_source',
   // id of (selected) overlay content
   str_content_id = '',
   // jQueryTOOLS Overlay
   obj_overlay,
   obj_overlay_options = {
      color: '#999',
      loadSpeed: 'fast',
      closeSpeed: 'fast',
      onBeforeClose: function(){ on_before_close(); },
      onLoad: function(){ on_load(); }
   },
   // Construct
   initialise = function() {
      // Is the overlay div (skeleton html) in the page?
      if($(str_overlay_div).length) {
         obj_overlay = $(str_overlay_div).expose(obj_overlay_options);
         $(str_overlay_div + ' .close').click(close);
      }
   },
   //  jQueryTOOLS Overlay Event Handler
   on_load = function() {
      $(str_overlay_div).show();
   },
   // jQueryTOOLS Overlay Event Handler
   on_before_close = function () {
      unload_content();
      $(str_overlay_div).hide();
   },
   // Show Overlay
   render = function() {
      load_content();
      position_window();

      if (obj_overlay) {
         obj_overlay.expose().load();
      }
   },
   // Load content into Overlay
   load_content = function() {
      if ($(str_content_id).length) {
         $(str_overlay_div + ' .body .inner').empty();
         $(str_overlay_div + ' .body .inner').append($(str_content_id));
         // Add class to main overlay div with the same name as the id of the loaded content. Useful for theming.
         $(str_overlay_div).addClass(str_content_id.substring(1));
      } else {
         // Silently Fail - Show an empty overlay
      }
   },
   // Unload content from Overlay
   unload_content = function() {
      if($(str_content_id).length) {
         $(str_content_source).append($(str_content_id));
      } else {
         $(str_content_id).empty();
      }

      $(str_overlay_div).removeClass(str_content_id.substring(1));

      str_content_id = '';
   },
   // Position Overlay window in the center of the screen
   position_window = function() {
      var int_top = $(window).scrollTop() + (($(window).height() - $(str_overlay_div).outerHeight()) / 2);
      var int_left = $(window).scrollLeft() + (($(window).width() - $(str_overlay_div).outerWidth()) / 2);
      $(str_overlay_div).css('top', int_top).css('left', int_left);
   },
   // Close overlay
   close = function () {
      obj_overlay.expose().close();
   };

   // Go
   Sprint.modules.add(initialise);

   // Public Methods
   var obj_public = {
      // Show overlay
	   show: function(str_id) {
	      str_content_id = '#' + str_id;
	      render();
		},
		// Hide overlay
		hide: function() {
		   close();
		},
		// Resizes the window via animation
		resize: function(int_width, int_height, int_speed) {
         var int_chosen_speed = 750;
         if (int_speed && int_speed > 0) {
            int_chosen_speed = int_speed;
         }

         $('#Sprint_overlay').animate({
            height: (int_height + 40) + "px",
            width: (int_width + 20) + "px"
         }, int_chosen_speed, 'linear', function () {
            var int_top = $(window).scrollTop() + (($(window).height() - $(str_overlay_div).outerHeight()) / 2);
            var int_left = $(window).scrollLeft() + (($(window).width() - $(str_overlay_div).outerWidth()) / 2);
            $(str_overlay_div).animate({
               top: int_top,
               left: int_left
            }, int_chosen_speed);
         });
		},
		// Set overlay options
		set_options: function(obj_options) {
         $.extend(obj_overlay_options, obj_options);
		},
		// Add class to main overlay div. Useful for theming.
		add_class: function(str_class) {
         $(str_overlay_div).addClass(str_class);
		}
   };
	return obj_public;
}());

/**
 * Sprint Modal Window
 *
 * Extension for Sprint overlay that links anchor tags to overlay content.
 *
 * Usage:
 *  <a href="#" id="foo" class="modal_window">foo</a> will display an overlay containing content from
 *  a div with id="foo_content"
 *  Adding a class resize will transition the overlay
 *
 */
Sprint.modal_window = (function () {
   // anchor for overlay - auto overlay
   var str_trigger_selector = 'a.modal_window',
   // Construct
   initialise = function () {
      $(str_trigger_selector).click(open);
   },
   // Overlay requested by link click
   open = function () {
      str_content_id = $(this).attr('id') + '_content';
      Sprint.overlay.show(str_content_id);

      if($(this).hasClass('resize')) {
         Sprint.overlay.resize(600, 200);
      }
      return false;
   };

   // Go
   Sprint.modules.add(initialise);

   return {};
})();


/** File: slik_form.js **/

/**
 * SprintEcommerce - Slik Form
 *
 * Slik form enhancement
 *
 * @copyright Copyright &copy; 2010, Doctor Net Limited
 * @package SprintEcommerce Website
 */

/**
 * Slik form namespace
 */
Sprint.slik_form = Sprint.slik_form ? Sprint.slik_form : {};

/**
 * Setup slik form
 */
Sprint.slik_form.initialise = function() {
   Sprint.slik_form.icon_hover();
   Sprint.slik_form.show_help_icon();
};

/**
 * Help & Exclamation hover
 */
Sprint.slik_form.icon_hover = function() {
   $('span.form_icon a').hover(function(){
      var obj_input = $(this).parent().prevAll('input, select, textarea, checkbox');

      // Adrian - 2011-07-18 - changing this to get the offset relative the the closest parent element
      // 'with positon'. Don't understand why this was done relative to the document previously - it
      // breaks the positioning if you have a position:relative div higher up the DOM.
      // If you don't, then both methods should work.
      var offset = obj_input.position();
      //var offset = obj_input.offsetParent(); // relative to document

      var int_top = offset.top;
      var int_left = offset.left;
      var int_width = obj_input.width()+6;

      if (int_width < 150) {
         int_width = 150;
      }

      // There are a couple of special cases
      switch (obj_input.attr('id')) {
         case 'issue_number':
            int_left += 130;
            int_width = 140;
            break;
         case 'cv2':
            int_top  = $('#expiry_year').position().top;
            int_left += 130;
            int_width = 150;
            break;
      }

      $('#form_help_floater').css({'top' : int_top, 'left' : int_left, 'width' : int_width}).show();

      if($(this).parent().hasClass('error')) {
         $('#form_help_floater').html('<p align="center">'+obj_input.attr('err')+'</p>');
      } else {
         $('#form_help_floater').html('<p align="center">'+obj_input.attr('help')+'</p>');
      }
   }, function (){
      $('#form_help_floater').hide();
   });
};

/**
 * Show any field help
 */
Sprint.slik_form.show_help_icon = function() {
   $('form input.has_help').each(function(){
      obj_input = $(this);
      if(obj_input.attr('help') != '') {
         obj_input.nextAll('span.form_icon.help').show();
      }
   });
};

/**
 * Show a field error
 *
 * @param jQuery obj_input
 * @param String str_message
 */
Sprint.slik_form.field_error = function (obj_input, str_message) {
   obj_input.parents('p').addClass('err');
   obj_input.attr('err', str_message);
};

/**
 * Clear a field error
 *
 * @param jQuery obj_input
 */
Sprint.slik_form.field_ok = function (obj_input) {
   obj_input.parents('p').removeClass('err');
};

/**
 * Validate required fields of a form
 *
 * @param jQuery obj_form
 * @return Bool All fields valid?
 */
Sprint.slik_form.validate_required_fields = function (obj_form) {
   var bol_success = true;
   $('input.required, textarea.required', obj_form).each(function(){
      obj_input = $(this);
      if(obj_input.val() == '') {
         Sprint.slik_form.field_error(obj_input, 'This is a required field and cannot be blank - please fill it in.');
         bol_success = false;
      } else {
         Sprint.slik_form.field_ok(obj_input);
      }
   });

   return bol_success;
};

/**
 * Validate postcode
 *
 * str_postcode_id - id of the postcode input
 * str_country_id - id of the country select
 *
 * returns false if postcode is invalid (respective to the country), true otherwise
 */
Sprint.slik_form.validate_postcode = function(str_postcode_id, str_country_id) {
   var bol_valid_postcode = true;
   var str_error_message = '';

   var str_postcode = $(str_postcode_id).val();

   var int_selected_country_id = $(str_country_id).val();
   // :assume: arr_fips_country_map is in global scope
   var str_selected_country_fips_code = arr_fips_country_map[int_selected_country_id];

   if (str_postcode.match(/(GIR 0AA)|((([A-Z^Q^V^X][0-9][0-9]?)|(([A-Z^Q^V^X][A-Z^I^J^Z][0-9][0-9]?)|(([A-Z^Q^V^X][0-9][A-HJKSTUW])|([A-Z^Q^V^X][A-Z^I^J^Z][0-9][ABEHMNPRVWXY]))))?[0-9][A-Z]{2})/i)) {
      if(str_postcode.match(/^\s*(JE|GY)/i)) {
         // Matched a UK postcode
         if(str_postcode.match(/^\s*JE/i) && str_selected_country_fips_code != 'JE') {
            str_error_message = "You've entered a Jersey Postcode but not selected it as your Country";
            bol_valid_postcode = false;
         } else if(str_postcode.match(/^\s*GY/i) && str_selected_country_fips_code != 'GK') {
            str_error_message = "You've entered a Guernsey Postcode but not selected it as your Country";
            bol_valid_postcode = false;
         }
      } else {
         if(str_selected_country_fips_code != 'UK') {
            str_error_message = "You've entered a valid United Kingdom postcode but not selected it as your Country";
            bol_valid_postcode = false;
         }
      }
   } else if(str_selected_country_fips_code == 'UK' || str_selected_country_fips_code == 'JE' || str_selected_country_fips_code == 'GK') {
      str_error_message = "Please enter a valid postcode";
      bol_valid_postcode = false;
   }

   if(!bol_valid_postcode) {
      Sprint.slik_form.field_error($(str_postcode_id), str_error_message);
   }

   return bol_valid_postcode;
};

/**
 * Basic check for email address format correctness.
 *
 * string str_email
 *
 * return boolean
 */
Sprint.slik_form.validate_email = function(str_email) {
   var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
   return reg.test(str_email);
}


/** File: web_menu_page.js **/

/**
 * SprintEcommerce - Web Menu
 *
 * @copyright Copyright &copy; 2010, Doctor Net Limited
 * @package SprintEcommerce Website
 */

/**
 * Highlight web menu node
 */
Sprint.wmp = (function () {
   var int_current_wmn,
   initialise = function () {},
   _highligh_active_wmn = function () {
      $('#wmn_' + int_current_wmn).addClass('wmn_active');
   };

   Sprint.modules.add(initialise);

   var obj_public = {
	   select_wmn: function(int_wmn_id) {
	      int_current_wmn = int_wmn_id;
	      _highligh_active_wmn();
		}
   };

	return obj_public;
})();

/**
 * Inventory filtering
 */
Sprint.inventory_filtering = (function () {
   arr_filters_active = [],
   arr_filter_types = [], //= ['brand','life-stage','price-range', 'page-number','order-by', 'colour'],
   arr_filter_types_multi = [], //= ['price-range', 'page-number','order-by'],
   initialise = function () {

      // don't run all this stuff if there is no filtering on the page
      if ($('#wmp_filter_price').length == 0 &&
         $('.listing_filter').length == 0 &&
         $('.filter_dropdown').length == 0) {
         return false;
      }

      // filter types passed via controller to template to here
      arr_filter_types = available_filters;
      arr_filter_types_multi = available_multi_filters;
      detect_active_filters();
      replace_filtering_links();
      replace_pagination_links();
      initialise_sort_dropdown();
      initialise_slider();
      add_dropdown_event_handling();
      $('.close').click(function() {
         var str_id = $(this).attr('id');
         if (str_id.substr(0,14)=='remove_filter_') {
            arr_filters_active[str_id.substr(14)] = null;
            refresh_results();
         }
      });
      $('.clearall').click(function() {
         arr_filters_active = [];
         refresh_results();
         return false;
      });

      return {};
   },
   initialise_slider = function() {

      if ($('#wmp_filter_price').length == 0) {
         return false;
      }

      // choose the 'step' value of slider based on precision of flt min value passed
      var str_price_filter_min = $('#flt_price_filter_min').html();
      var flt_step = 1;
      if (str_price_filter_min.indexOf('.') > -1 ) {
         int_decimal_places = str_price_filter_min.length - (str_price_filter_min.indexOf('.') + 1);
         if (int_decimal_places == 1){
            flt_step = 0.1;
         } else {
            flt_step = 0.01;
         }
      } else if (eval(str_price_filter_min) != 0) {
         var int_loop_count = 0;
         while (str_price_filter_min.substring(eval(str_price_filter_min.length) - int_loop_count , eval(str_price_filter_min.length) - (1+int_loop_count)) == 0) {
            flt_step = flt_step*10;
            int_loop_count ++;
         }
      }
      var flt_price_filter_min = eval(str_price_filter_min);
      var flt_price_filter_max = eval($('#flt_price_filter_max').html());
      var flt_price_filter_min_inital = eval($('#flt_price_filter_min_initial').html());
      var flt_price_filter_max_inital = eval($('#flt_price_filter_max_initial').html());

      $('#wmp_filter_price').slider({
         animate: true,
         min: flt_price_filter_min,
         max: flt_price_filter_max,
         range: true,
         step: flt_step,
         values: [flt_price_filter_min_inital, flt_price_filter_max_inital],
         change: function (obj_event, obj_ui) {
            var arr_values = obj_ui.values;
            update_price_filter(arr_values);
            update_price_filter_array(arr_values);
            refresh_results();
         },
         slide: function (obj_event, obj_ui) {
            var arr_values = obj_ui.values;
            update_price_filter(arr_values);
         }
      });
      return {};
   },
   initialise_sort_dropdown = function() {
      $('#inventory_listing_orderer').change(function() {
         if (add_filter_to_array('order-by',$(this).val())) {
            refresh_results();
         }
      });
   },
   update_price_filter = function (arr_values) {
      $('#flt_price_filter_min').html(+arr_values[0]);
      $('#flt_price_filter_max').html(arr_values[1]);
      $('#str_price_filter_min').html('&pound;'+arr_values[0].toFixed(2));
      $('#str_price_filter_max').html('&pound;'+arr_values[1].toFixed(2));
   },
   update_price_filter_array = function (arr_values) {
      if (arr_filters_active['price-range'] == undefined) {
         arr_filters_active['price-range'] = [];
         arr_filters_active['price-range'].push(arr_values[0]+':'+arr_values[1]);
      } else {
         arr_filters_active['price-range'][0]=arr_values[0]+':'+arr_values[1];
      }
   },
   detect_active_filters = function () {
      var arr_filter_strings = window.location.search.substring(1).split('&');
      for(int_i=0;int_i<arr_filter_strings.length;int_i++) {
         arr_filter_elements = arr_filter_strings[int_i].split('=',2);
         arr_filter_elements[0] = arr_filter_elements[0].replace('[]','');
         add_filter_to_array(arr_filter_elements[0],arr_filter_elements[1]);
      }
   },
   replace_filtering_links = function() {
      $('#sidebar .listing_filter').each(function() {
         var str_href = $(this).attr('href');
         str_href = str_href.substring(str_href.indexOf('?')+1);
         var arr_new_filter_elements = str_href.split('=');
         if(arr_new_filter_elements && 2 == arr_new_filter_elements.length) {
            $(this).click(function(){
               return filter_click(arr_new_filter_elements)
            })
            $(this).attr('href', '#');
         }
      })
      return false;
   },
   // if a dropdown filter control is found, add event handler
   add_dropdown_event_handling = function() {
      $('.filter_dropdown').change(function() {
         //console.log($(this).attr('id').substring(16)+' '+$(this).val());
         //console.log('before '.arr_filters_active);
         if ($(this).val() != -1) {
            add_filter_to_array($(this).attr('id').substring(16), $(this).val());
         } else {
            arr_filters_active[$(this).attr('id').substring(16)] = null;
         }
         refresh_results();
      })
      return false;
   },
   // replace the href attribute on the links controlling filtering and add event handlers in replacement.
   replace_pagination_links = function() {
      $('.page_links > a').each(function() {
         var str_href = $(this).attr('href');
         str_href = str_href.substring(str_href.indexOf('page-number'));
         if (str_href.indexOf('&') != -1) {
            str_href = str_href.substring(0,str_href.indexOf('&'));
         }
         var arr_new_filter_elements = str_href.split('=');
         if(arr_new_filter_elements && 2 == arr_new_filter_elements.length) {
            $(this).click(function(){
               return filter_click(arr_new_filter_elements)
            })
            $(this).attr('href', '/#');
         }
      })
      return false;
   },
   filter_click = function (arr_filter_elements) {
      if (add_filter_to_array(arr_filter_elements[0],arr_filter_elements[1])) {
         refresh_results();
      }
      return false;
   },
   // add another filter to the stores array (taking into account whether multiple values are set up for each filter type)
   add_filter_to_array = function(str_filter_type,str_filter_value) {
      if (arr_filters_active[str_filter_type] == undefined) {
         arr_filters_active[str_filter_type] = [];
         arr_filters_active[str_filter_type].push(str_filter_value);
         return true;
      } else {
         if (multiple_values_allowed(str_filter_type)) {
            if (arr_filters_active[str_filter_type].indexOf(str_filter_value)==-1){
               arr_filters_active[str_filter_type].push(str_filter_value);
               return true;
            } else {
               return false;
            }
         } else {
            if (arr_filters_active[str_filter_type][0]==str_filter_value){
               return false;
            } else {
               arr_filters_active[str_filter_type][0]=str_filter_value;
               return true;
            }
         }
      }
   },
   // form a url based on the filter values we have stored and refresh the browser window
   refresh_results = function () {
      var str_url = '';
      for (var int_i=0;int_i<arr_filter_types.length;int_i++) {
         if (arr_filters_active[arr_filter_types[int_i]] != undefined) {
            for (var int_j=0;int_j<arr_filters_active[arr_filter_types[int_i]].length;int_j++) {
               if (str_url == '') {
                  str_url = '?';
               } else {
                  str_url = str_url + '&';
               }
               str_url = str_url+arr_filter_types[int_i];
               if (arr_filters_active[arr_filter_types[int_i]].length > 1) {
                  str_url = str_url+'[]';
               }
               str_url = str_url+'='+arr_filters_active[arr_filter_types[int_i]][int_j];
            }
         }
      }
      window.location = 'http://'+window.location.host+window.location.pathname+str_url;
   },
   multiple_values_allowed = function (str_filter_type) {
      var bol_return = false;
      for(var int_i=0;int_i<arr_filter_types_multi.length;int_i++) {
         if (arr_filter_types_multi[int_i] == str_filter_type) {
            bol_return = true;
            break;
         }
      }
      return bol_return;
   };
   Sprint.modules.add(initialise);
   return {};
}());


/** File: newsletter.js **/

/**
 * SprintEcommerce - Newsletter Signup
 *
 * SprintEMC signup widgets
 *
 * @copyright Copyright &copy; 2010, Doctor Net Limited
 * @package SprintEcommerce Website
 */

/**
 * Newsletter namespace
 */
Sprint.newsletter = Sprint.newsletter ? Sprint.newsletter : {};

/**
 * Single List
 */
Sprint.emc_single = (function () {
   // Ajax Signup URL
   var str_url = '/ajax-newsletter/subscribe',
   // Widget ID
   str_widget_id = '#emc_signup_single',
   // Widget Form Element
   str_form_selector = str_widget_id + ' form',
   // ID of subscriber email
   str_email_id  = '#emc_signup_single_email',
   // ID of subscribe button
   str_submit_id  = '#emc_signup_single_submit',
   // In Widget messaging area
   str_messaging_area_selector = str_widget_id + ' .messaging',
   // Map of SprintEMC error codes
   obj_error_codes = {
      'already_subscribed' : -11,
      'unknown' : -100
   },
   // List description - Can be overridden for Sprint installations
   str_emc_list_description = 'the Sprint Newsletter',
   // Error messages - Can be overridden for Sprint installations
   obj_messages = {
      str_success_message: 'You have successfully been signed up to %%EMC_LIST_DESCRIPTION%%.',
      str_unknown_error_message: 'You could not be signed up to %%EMC_LIST_DESCRIPTION%% at this time.  Please try again.',
      str_already_subscribed_message: 'You are already signed up to %%EMC_LIST_DESCRIPTION%%.'
   },
   // Construct
   initialise = function() {
      // Sanity check
      if($(str_widget_id).length === 0) {
         return;
      }

      // Message setup
      set_list_description_in_messages();

      // Event Handlers
      $(str_submit_id).click(subscribe);
   },
   // Set list name in error messages
   set_list_description_in_messages = function() {
      obj_messages.str_success_message = replace_list_description(obj_messages.str_success_message );
      obj_messages.str_unknown_error_message = replace_list_description(obj_messages.str_unknown_error_message);
      obj_messages.str_already_subscribed_message = replace_list_description(obj_messages.str_already_subscribed_message);
   },
   // List text replacement
   replace_list_description = function(str_message) {
      return str_message.replace(/%%EMC_LIST_DESCRIPTION%%/gi, str_emc_list_description);
   },
   // Subscribe
   subscribe = function() {
      var str_email = $(str_email_id).val();
      // :todo: email validation

      AjaxHandler.set_url(str_url);
      AjaxHandler.process_form($(str_form_selector).get(0));

      AjaxHandler.dispatch(
         function (obj_response) { success(obj_response); },
         function (obj_response) { failure(obj_response); }
      );
      return false;
   },
   // Success handler
   success = function(obj_response) {
      if(is_form_messaging_enabled()) {
         $(str_messaging_area_selector).empty().html('<p>' + obj_messages.str_success_message + '</p>').show();
         $(str_form_selector).hide();
      } else {
         alert(obj_messages.str_success_message);
      }
   },
   // Failure handler
   failure = function(obj_response) {
      var str_code_field = 'code';

      var int_response_code = obj_error_codes.unknown;
      if($(str_code_field, obj_response).length) {
         int_response_code =  parseInt($(str_code_field, obj_response).text());
      }

      var str_message = obj_messages.str_unknown_error_message;
      if(int_response_code === obj_error_codes.already_subscribed) {
         str_message = obj_messages.str_already_subscribed_message;
      }

      if(is_form_messaging_enabled()) {
         $(str_messaging_area_selector).empty().html('<p class="error">' + str_message + '</p>').show();
      } else {
         alert(str_message);
      }
   },
   // Is in form message enabled ?
   is_form_messaging_enabled = function() {
      return $(str_messaging_area_selector).length;
   };

   // Go
   Sprint.modules.add(initialise);

   // Public methods
	var obj_public = {
	   // Set custom EMC codes
	   set_error_codes: function(int_already_subscribed, int_unknown) {
	      obj_error_codes.already_subscribed = int_already_subscribed;
	      obj_error_codes.unknown = int_unknown;
		},
		// Set list description
		set_emc_list_description: function(str) {
         str_emc_list_description = str;
		},
		// Set messages
		set_messages: function(obj) {
         $.extend(obj_messages, obj);
		}
   };

	return obj_public;
}());

/**
 * Multiple Lists
 */
Sprint.emc_signup_multi = (function () {
   // Ajax Signup URL
   var str_url = '/ajax-newsletter/subscribe',
   // Widget ID
   str_widget_id = '#emc_signup_multi',
   // Widget Form Element
   str_form_selector = str_widget_id + ' form',
   // ID of subscriber email
   str_email_id  = '',
   // ID of subscriber firstname
   str_firstname_id = '',
   // ID of subscriber lastname
   str_lastname_id = '',
   // ID of submit button (radio)
   str_radio_submit_id  = '#emc_signup_multi_submit',
   // Class of submit buttons (input)
   str_input_submit_class  = '.emc_signup_multi_submit',
   // List definitions.  List hash and list description (for messaging). The key here is important as it corresponds to the form controls.
   obj_lists = {
      men: {hash:'Sprint_demo_mens', description: 'the Sprint Mens Newsletter'},
      women: {hash:'Sprint_demo_womens', description: 'the Sprint Womens Newsletter'}
   },
   // Requests Queue.
   arr_request_queue = [],
   // User messages
   arr_messages = [],
   // Class of messaging area
   str_messaging_area_selector = str_widget_id + ' .messaging',
   // Key of list being currently dealt with (subscribed to)
   str_current_key = '',
   // Map of SprintEMC error codes
   obj_error_codes = {
      'already_subscribed' : -11,
      'unknown' : -100
   },
   // Error messages
   obj_messages = {
      str_success_message: 'You have successfully been signed up to %%EMC_LIST_DESCRIPTION%%.',
      str_unknown_error_message: 'You could not be signed up to %%EMC_LIST_DESCRIPTION%% at this time.  Please try again.',
      str_already_subscribed_message: 'You are already signed up to %%EMC_LIST_DESCRIPTION%%.'
   },
   // Subscriber details. Email is mandatory, others optional
   obj_subscriber = {
      str_email: '',
      str_firstname: '',
      str_lastname: ''
   },
   // Construct
   initialise = function() {
      // Sanity check
      if($(str_widget_id).length === 0) {
         return;
      }

      // If there are hash definitions in the form use them. These have the highest priority.
      for(str_key in obj_lists) {
         var str_selector = str_widget_id + ' input[name="hash[' +  str_key + ']"]';
         if($(str_selector).length) {
            obj_lists[str_key].hash = $(str_selector).val();
         }
      }

      // Event Handlers
      $(str_radio_submit_id).click(radio_submit);
      $(str_input_submit_class).click(input_submit);
   },
   // Handle list radio control subscribe request
   radio_submit = function() {
      var str_list_keys = $(str_widget_id + ' :radio[name=multi]:checked').val();
      if(str_list_keys == undefined) {
         // :todo: Error Message
      } else {
         queue_requests(str_list_keys);
         set_subscriber();
         subscribe();
      }

      return false;
   },
   // Handle list input control subscribe request
   input_submit = function() {
      var str_list_keys = $(this).attr('name');
      queue_requests(str_list_keys);
      set_subscriber();
      subscribe();
      return false;
   },
   // Setup request queue
   queue_requests = function(str_list_keys) {
      arr_request_queue = [];

      var str_delimiter = '-';
      if(str_list_keys.indexOf(str_delimiter) == -1) {
         arr_request_queue.push(str_list_keys);
      } else {
         var arr_list_keys = str_list_keys.split(str_delimiter);
         for(int_index in arr_list_keys) {
            arr_request_queue.push(arr_list_keys[int_index]);
         }
      }
   },
   // Set subscriber details
   set_subscriber = function() {
      obj_subscriber.str_email = $('#emc_signup_multi_email').val();
      // :todo: email validation

      if($('#emc_signup_multi_firstname').length) {
         obj_subscriber.str_firstname = $('#emc_signup_multi_firstname').val();
      }

      if($('#emc_signup_multi_lastname').length) {
         obj_subscriber.str_lastname = $('#emc_signup_multi_lastname').val();
      }
   },
   // Subscribe to list
   subscribe = function() {
      str_current_key = arr_request_queue.pop();

      AjaxHandler.set_url(str_url);

      // Personal Details
      AjaxHandler.add_data('email', obj_subscriber.str_email);

      if(obj_subscriber.str_firstname != '') {
         AjaxHandler.add_data('firstname', obj_subscriber.str_firstname);
      }

      if(obj_subscriber.str_lastname != '') {
         AjaxHandler.add_data('lastname', obj_subscriber.str_lastname);
      }

      AjaxHandler.add_data('mailing_list_hash', obj_lists[str_current_key].hash);

      AjaxHandler.dispatch(
         function (obj_response) { success(obj_response); },
         function (obj_response) { failure(obj_response); }
      );
      return false;
   },
   // Success response handler
   success = function(obj_response) {
      var str_list_description = obj_lists[str_current_key].description;
      var str_message = replace_list_description(obj_messages.str_success_message, str_list_description);
      var obj_message = {text: str_message, css_class: 'success'};
      arr_messages.push(obj_message);

      // More requests?
      if(arr_request_queue.length) {
         subscribe();
      } else {
         display_messages();
      }
   },
   // Failure response handler
   failure = function(obj_response) {
      var str_code_field = 'code';

      var int_response_code = obj_error_codes.unknown;
      if($(str_code_field, obj_response).length) {
         int_response_code =  parseInt($(str_code_field, obj_response).text());
      }

      var str_message = obj_messages.str_unknown_error_message;
      if(int_response_code === obj_error_codes.already_subscribed) {
         str_message = obj_messages.str_already_subscribed_message;
      }

      var str_list_description = obj_lists[str_current_key].description;
      str_message = replace_list_description(str_message, str_list_description);
      var obj_message = {text: str_message, css_class: 'error'};
      arr_messages.push(obj_message);

      // More requests?
      if(arr_request_queue.length) {
         subscribe();
      } else {
         display_messages();
      }
   },
   // Allow a custom list name to be used.
   replace_list_description = function(str_message, str_list_description) {
      return str_message.replace(/%%EMC_LIST_DESCRIPTION%%/gi, str_list_description);
   },
   // Display message to user
   display_messages = function() {
      if(is_form_messaging_enabled()) {
         var str_lis = '';
         while(arr_messages.length){
            var obj_message = arr_messages.pop();
            str_lis += '<li class="' + obj_message.css_class + '">' + obj_message.text + '</li>';
         }

         $(str_widget_id + ' .messaging').empty();
         $(str_widget_id + ' .messaging').html('<ul>' + str_lis + '</ul>');
      } else {
         var str_message = '';
         while(arr_messages.length){
            str_message += arr_messages.pop().text + "\n";
         }
         alert(str_message);
      }
   },
   // Is there facility for embedding messages in this widget?
   is_form_messaging_enabled = function() {
      return $(str_messaging_area_selector).length;
   };

   // Go
   Sprint.modules.add(initialise);

   // Public Methods
	var obj_public = {
	   // Set error message codes
	   set_error_codes: function(int_already_subscribed, int_unknown) {
	      obj_error_codes.already_subscribed = int_already_subscribed;
	      obj_error_codes.unknown = int_unknown;
		},
		// Set List details. Allow customisation (hash and description) of default lists, or addition of new ones.
		set_list_details: function(str_key, obj_details) {
		   if(obj_lists[str_key] == undefined) {
		      obj_lists[str_key] = obj_details;
		   } else {
            $.extend(obj_lists[str_key], obj_details);
		   }
		}
   };

	return obj_public;
}());


/** File: customer.js **/

/**
 * SprintEcommerce - Customer
 *
 * Script for customer related pages.  Login, register, my account.
 *
 * @copyright Copyright &copy; 2011, Doctor Net Limited
 * @package SprintEcommerce Website
 */

/**
 * Customer namespace
 */
Sprint.customer = Sprint.customer ? Sprint.customer : {};

/**
 * Specify which form is showing on the login register page
 */
Sprint.customer.login_register = {
   str_active_form: '',
   set_active_form: function(str) {
      Sprint.customer.login_register.str_active_form = str;
   }
};

/**
 * Initialise customer script
 */
Sprint.customer.login_register.initialise = function() {
   Sprint.slik_form.initialise();
   Sprint.customer.login_register.reset_focus();
   Sprint.customer.login_register.form_toggle();
   Sprint.customer.login_register.delivery_address_toggle();
   Sprint.customer.login_register.login_submit();
   Sprint.customer.login_register.registration_submit();
};

/**
 * Reset focus to the first element of the visible form
 */
Sprint.customer.login_register.reset_focus = function() {
   var obj_form_handle_id_map = {
      'LOGIN': '#login_form',
      'REGISTER': '#register_form'
   };

   var str_handle = Sprint.customer.login_register.str_active_form;

   var str_form_id = obj_form_handle_id_map[str_handle];
   var str_elements_selector = str_form_id + ' select:visible, ' + str_form_id + ' input:visible';

   $(str_elements_selector).eq(0).focus();
};

/**
 * Customer form switcher
 * Swaps between login/register forms
 */
Sprint.customer.login_register.form_toggle = function() {
   $('#jq_registration_login_prompt').click(function(){
      $('#registration_form').hide();
      $('#login_register_prompts').show();
      Sprint.customer.login_register.set_active_form('LOGIN');
      Sprint.customer.login_register.reset_focus();
      return false;
   });
   $('#register_proceed').click(function(){
      $('#login_register_prompts').hide();
      $('#registration_form').show();
      Sprint.customer.login_register.set_active_form('REGISTER');
      Sprint.customer.login_register.reset_focus();
      return false;
   });
};

/**
 * Toggle the delivery address section on the registration form
 */
Sprint.customer.login_register.delivery_address_toggle = function() {
  $('#alt_del_address').click(function(){
      if($(this).attr('checked') == true) {
         $('#del_address').show();
      } else {
         $('#del_address').hide();
      }
   });
};

/**
 * Validate login form
 */
Sprint.customer.login_register.login_submit = function() {
   /** Logn submission **/
   $('#login_form').submit(function(){
      // Validate
      var bol_success = true;

      if($('#login_email').val() == '') {
         Sprint.slik_form.field_error($('#login_email'), 'This is a required field and cannot be blank - please fill it in.');
         bol_success = false;
      } else {
         Sprint.slik_form.field_ok($('#login_email'));
      }

      if($('#login_password').val() == '') {
         Sprint.slik_form.field_error($('#login_password'), 'This is a required field and cannot be blank - please fill it in.');
         bol_success = false;
      } else {
         Sprint.slik_form.field_ok($('#login_password'));
      }

      return bol_success;
   });
};

/**
 * Validate registration form
 */
Sprint.customer.login_register.registration_submit = function() {
   var int_minimum_password_length = 6;

   /** Register Form submission */
   // Note: dont listen to submit() as we need to call it at the end and we'd get stuck in an infinite loop
   $('#form_proceed').click(function() {
   	var bol_success = true;

   	// Required field checks
   	if($('#alt_del_address').attr('checked') == true) {
      	arr_inputs = $('#register_form input.required');
   	} else {
      	arr_inputs = $('#register_form input.required:not(#del_address input)');
   	}
      arr_inputs.each(function(){
         obj_input = $(this);
         if(obj_input.val() == '') {
            Sprint.slik_form.field_error(obj_input, 'This is a required field and cannot be blank - please fill it in.');
            bol_success = false;
         } else {
            Sprint.slik_form.field_ok(obj_input);
         }
      });

      // Gender
      str_gender_field = '#gender';
      if($(str_gender_field).length) {
         var $obj_gender = $(str_gender_field);
         if ($obj_gender.val() == -1) {
            Sprint.slik_form.field_error($obj_gender, 'Please choose a gender');
            bol_success = false;
         } else {
            Sprint.slik_form.field_ok($obj_gender);
         }
      }

      // Password length
      var int_password_length = String($('#password').val()).length;
      var bol_password_required = Boolean($('#password').hasClass('required'));
      // If its not required and empty then ignore, else validate it
      if((bol_password_required || int_password_length > 0) && int_password_length < int_minimum_password_length) {
         Sprint.slik_form.field_error($('#password'), 'Password must be at least ' + int_minimum_password_length + ' characters long');
         bol_success = false;
      } else {
         Sprint.slik_form.field_ok($('#password'));
      }

      // Password comparison
      if($('#password').val() != $('#confirm_password').val()) {
         Sprint.slik_form.field_error($('#confirm_password'), 'Passwords must match - please make sure they are the same');
         bol_success = false;
      } else {
         Sprint.slik_form.field_ok($('#confirm_password'));
      }

      // Email comparison
      if($('#email').val() != $('#confirm_email').val()) {
         Sprint.slik_form.field_error($('#confirm_email'), 'Email addresses must match - please make sure they are the same');
         bol_success = false;
      }

      // Telephone format
      // Leave for now

      // Postcode format
      if(!Sprint.slik_form.validate_postcode('#postcode', '#country')) {
         bol_success = false;
      }

      if($('#alt_del_address').attr('checked') == true) {
         if(!Sprint.slik_form.validate_postcode('#delivery_postcode', '#delivery_country')) {
            bol_success = false;
         }
      }

      // Allow for client-specific validation.
      if ($.isFunction(Sprint.customer.login_register.custom_validation)) {
         bol_success = Sprint.customer.login_register.custom_validation(bol_success);
      }

      if (bol_success) {
         // AJAX email address check
         AjaxHandler.reset();
         AjaxHandler.set_url('/ajax-customer/search-email-address');
         AjaxHandler.add_data('email', $('#email').val());
         AjaxHandler.dispatch(function(obj_response) {
            // If we already have this email tell them to login
            if (parseInt($('customers_found', obj_response).text()) !== 0) {
               bol_success = false;
               $('#returning_customer').click();
               $('#login_failure_message').text('That email address has already been used to register an account. Please login using the form below.');
               // Fill in the email address and reset the rest of the form
               $('#login_email').val($('#email').val());
               $('#login_password').val('');
               Sprint.slik_form.field_ok($('#login_email'));
               Sprint.slik_form.field_ok($('#login_password'));
               $('#login_password').focus();
            }

            // Actually register the customer & continue
            if(bol_success) {
            	$('#register_form').submit();
            }
         });
      }
      return false;
   });
};

/**
 * Allow for client-specific validation of registration form.
 */
Sprint.customer.login_register.custom_validation = function(bol_success) {
   // do nothing.
   return bol_success;
};

/**
 * Password request functionality
 */
Sprint.customer.password_request = {};
Sprint.customer.password_request.initialise = function() {
   Sprint.slik_form.initialise();
   $('#password_request_form_id').focus();
   Sprint.customer.password_request.submit();
};
Sprint.customer.password_request.submit = function() {
   /** Password request **/
   $('#password_request_form').submit(function() {
      // Validate
      var bol_success = true;

      if($('#password_request_acct_code_or_email').val() == '') {
         Sprint.slik_form.field_error($('#password_request_acct_code_or_email'), 'This is a required field and cannot be blank - please fill it in.');
         bol_success = false;
      } else {
         Sprint.slik_form.field_ok($('#password_request_acct_code_or_email'));
      }

      return bol_success;
   });
};

/**
 * Change Password functionality - My account
 */
Sprint.customer.change_password = {};
Sprint.customer.change_password.initialise = function() {
   Sprint.slik_form.initialise();
   $('#str_current_password').focus();
   Sprint.customer.change_password.submit();
};
Sprint.customer.change_password.submit = function() {
   $('#change_password_form').submit(function() {
      var bol_success = Sprint.slik_form.validate_required_fields($('#change_password_form'));

      // Password comparison
      if($('#password').val() != $('#change_password').val()) {
         Sprint.slik_form.field_error($('#change_password'), 'Passwords must match - please make sure they are the same');
         bol_success = false;
      }

      return bol_success;
   });
};

/**
 * Change Email Address
 */
Sprint.customer.change_email_address = {};
Sprint.customer.change_email_address.initialise = function() {
   Sprint.slik_form.initialise();
   $('#new_email_address').focus();
   $('#change_email_address_submit').click(function() {
      var bol_success = Sprint.slik_form.validate_required_fields($('#change_email_address_form'));

      // check email addresses match
      if (bol_success) {
         if ($('#new_email_address').val() != $('#new_email_address_confirm').val()) {
            bol_success = false;
            Sprint.slik_form.field_error($("#new_email_address"), "Email addresses must match - please make sure they are the same");
         }
      }

      if (bol_success) {
         // check email format
         if (!Sprint.slik_form.validate_email($("#new_email_address").val())) {
            bol_success = false;
            Sprint.slik_form.field_error($("#new_email_address"), "Invalid format - please check you typed your email address correctly");
         }
      }

      if (bol_success) {
         // check email is not in use already.
         AjaxHandler.reset();
         AjaxHandler.set_url('/ajax-my-account/search-email-address');
         AjaxHandler.add_data('email', $('#new_email_address').val());
         AjaxHandler.dispatch(function(obj_response) {
            // If we already have this email tell them to login
            if (parseInt($('customers_found', obj_response).text()) !== 0) {
               Sprint.slik_form.field_error($("#new_email_address"), "This email address is not available for use.");
            } else {
               $('#change_email_address_form').submit();
            }
         });
      }
   });
};

/**
 * Update personal details
 */
Sprint.customer.update_details = {};
Sprint.customer.update_details.initialise = function() {
   Sprint.slik_form.initialise();
   Sprint.customer.update_details.submit();
};
Sprint.customer.update_details.submit = function() {
   $('#update_personal_details_form').submit(function() {
      var bol_success = Sprint.slik_form.validate_required_fields($('#update_personal_details_form'));

      if(!Sprint.slik_form.validate_postcode('#str_postal_code', '#int_country_id')) {
         bol_success = false;
      }

      return bol_success;
   });
};

/**
 * Update delivery address
 */
Sprint.customer.update_delivery_address = {};
Sprint.customer.update_delivery_address.initialise = function() {
   Sprint.slik_form.initialise();
   Sprint.customer.update_delivery_address.submit();
};
Sprint.customer.update_delivery_address.submit  = function () {
   var str_form_id = '#update_delivery_address_form';

   $(str_form_id).submit(function() {
      var bol_success = Sprint.slik_form.validate_required_fields($(str_form_id));

      if(!Sprint.slik_form.validate_postcode('#str_postal_code', '#int_country_id')) {
         bol_success = false;
      }

      return bol_success;
   });
};


/** File: basket.js **/

/**
 * SprintEcommerce - Basket
 *
 * @copyright Copyright &copy; 2010, Doctor Net Limited
 * @package Website
 */
Sprint.basket = Sprint.basket ? Sprint.basket : {};

// Configure overlay
Sprint.overlay.set_options({loadSpeed: 0, closeSpeed: 0});

/**
 *
 */
Sprint.basket.initialise = function() {
   Sprint.basket.change_delivery();
   Sprint.basket.update_quantity();
};

/**
 * Change Delivery
 *
 * If this user changes the delivery option, update the basket
 */
Sprint.basket.change_delivery = function () {
   // Dropdown id
   var str_select = '#int_service_category_id',
   // url the updated date will be sent to
   str_ajax_url = '/basket/set-service-category/',
   // flag to stop multiple updates
   bol_updating = false,
   // Init
   initialise = function () {
      $(str_select).change(change_delivery);
   },
   // Handle select change event
   change_delivery = function() {
      // Guard against multiple updates
      // :future: do this once for the whole basket
      if(bol_updating === true) {
         return false;
      }
      bol_updating = true;

      Sprint.overlay.show('update_basket_overlay_content');

      // Update
      var str_service_category_parameter = 'int_service_category_id/' + $(this).val();
      window.location =  str_ajax_url + str_service_category_parameter;
   };

   initialise();
	return {};
};

/**
 * Update Quantity
 *
 * If the user updates the basket line quantity, update the basket
 */
Sprint.basket.update_quantity = function () {
   // Basket Line Row
   var str_basket_row_selector = '.basket_line_row',
   // Quantity Input
   str_quantity_selector = 'input.quantity',
   // Each row has an id, this is the length of the text before the id
   int_basket_row_id_prefix_length = '16',
   // flag to stop multiple updates
   bol_updating = false,
   // Init
   initialise = function () {
       // Add event handlers to the quantity box in each row
      $(str_basket_row_selector).each(function() {
         var str_basket_line_id = $(this).attr('id').substr(int_basket_row_id_prefix_length);

         var $obj_quantity_input = $(str_quantity_selector, this);
         var obj_line_data = {
            "str_basket_line_id": str_basket_line_id,
            "int_original_quantity": $obj_quantity_input.val()
         };
         $obj_quantity_input.bind('blur', obj_line_data, update_line);
      });
   },
   // Handle quantity blur event
   update_line = function(obj_event) {
      var int_quantity = $(this).val();

      // If there's no change, do nothing
      if(int_quantity == obj_event.data.int_original_quantity) {
         return false;
      }

      // Guard against multiple updates
      if(bol_updating === true) {
         return false;
      }
      bol_updating = true;

      Sprint.overlay.show('update_basket_overlay_content');

      // Send quantity change ajax event
      AjaxHandler.reset('/ajax-basket/update-line');
      AjaxHandler.add_data('str_basket_line_id', obj_event.data.str_basket_line_id);
      AjaxHandler.add_data('int_quantity', int_quantity);

      AjaxHandler.dispatch(function(obj_response) {
         bol_updating = false;
         window.location.href = '/basket/view';
      }, function(obj_response) {
         bol_updating = false;
         alert($('message', obj_response).text());
         window.location.href = '/basket/view';
      });
   };

   initialise();
	return {};
};

// If user has requested change in display currency, fire off ajax request update pricing context.
Sprint.basket.context = (function () {
   var bol_updating = false,
   initialise = function () {},
   success = function(obj_response) {
      bol_updating = false;
      location.reload();
   },
   failure = function(obj_response) {
      bol_updating = false;
   },
   set_context = function(str_context) {
      // Guard against multiple updates
      if(bol_updating === true) {
         return false;
      }
      bol_updating = true;

	   AjaxHandler.reset('/ajax-basket/set-context');
      AjaxHandler.add_data('str_pricing_context', str_context);

      AjaxHandler.dispatch(
         function (obj_response) { success(obj_response); },
         function (obj_response) { failure(obj_response); }
      );
      return false;
   };

   Sprint.modules.add(initialise);

   var obj_public = {
      // Default is GBP
      set_gbp: function() {
         return set_context('DefaultPricingContext');
      },
      set_eur: function() {
         return set_context('EuroPricingContext');
      },
      set_usd: function() {
         return set_context('USAPricingContext');
      }
   };
   return obj_public;
}());


/** File: checkout.js **/

/**
 * SprintEcommerce - Checkout
 *
 * Checkout page functionality
 *
 * @copyright Copyright &copy; 2010, Doctor Net Limited
 * @package SprintEcommerce Website
 */

/**
 * Checkout namespace
 */
Sprint.checkout = Sprint.checkout ? Sprint.checkout : {};

/**
 * Initialise checkout script
 */
Sprint.checkout.initialise = function() {
   Sprint.slik_form.initialise();
   Sprint.checkout.reset_focus();
   Sprint.checkout.delivery_address.overlay();
   Sprint.checkout.delivery_address.change();
   Sprint.checkout.delivery_address.save();
   Sprint.checkout.change_service_category();
   Sprint.checkout.validation.attach();
};

/**
 * Reset form focus
 */
Sprint.checkout.reset_focus = function() {
   $('#card_number').focus();
};

/**
 * Checkout - Payment Page - Enable Add Delivery Address Popup
 */
Sprint.checkout.delivery_address = Sprint.checkout.delivery_address ? Sprint.checkout.delivery_address : {};
Sprint.checkout.delivery_address.overlay = function () {
   var initialise = function () {
      if($('#add_delivery_address').length == 0) {
         return;
      };

      $('#add_delivery_address').click(function(){
         Sprint.overlay.show('add_delivery_address_content');
         return false;
      });
   };

   initialise();
	return {};
};

/**
 * Change delivery address
 */
Sprint.checkout.delivery_address.change = function () {
    $('input[name="int_delivery_address_id"]').click(function() {
      var int_del_addr_id = $(this).val();
      AjaxHandler.reset();
      AjaxHandler.set_url('/ajax-basket/change-delivery-address');
      AjaxHandler.add_data('int_delivery_address_id', int_del_addr_id);
      AjaxHandler.dispatch(function(obj_response) {
         // Update ServiceCategories
         if ($('service_categories service_category', obj_response).length > 0) {
            $('#service_category_select').empty();
            $('service_categories service_category', obj_response).each(function() {
               $('#service_category_select').append('<option value="'+$('id', this).text()+'">'+$('description', this).text()+'</option>');
            });
         }

         // If the Basket details were sent back assume something's changed
         if ($('basket', obj_response).length > 0) {
            // Update ServiceCategory
            $('#service_category_select').val($('basket int_service_category_id', obj_response).text());

            // Update prices
            $('#delivery_total_price').html($('basket str_delivery', obj_response).text());
            $('#basket_total_price').html($('basket str_display_price', obj_response).text());
         }
      });
   });
};

/**
 * Save delivery address
 */
Sprint.checkout.delivery_address.save  = function () {
   $('#update_delivery_address_form').submit(function() {
      var bol_success = Sprint.slik_form.validate_required_fields($('#update_delivery_address_form'));

      if(!Sprint.slik_form.validate_postcode('#str_postal_code', '#int_country_id')) {
         bol_success = false;
      }

      // If the form's good, submit it and reload the page
      if(bol_success) {
         AjaxHandler.reset();

         AjaxHandler.process_form($('#update_delivery_address_form'));
         AjaxHandler.set_url('/ajax-my-account/add-delivery-address');
         AjaxHandler.dispatch(function(obj_response) {
            window.location.reload();
            return false;
         });
         return false;
      } else {
         return bol_success;
      }
   });
};

/**
 * Change service category
 */
Sprint.checkout.change_service_category = function() {
   /**
    * Change ServiceCategory
    */
   $('#service_category_select').change(function() {
      Sprint.overlay.show('update_basket_overlay_content');

      var int_sc_id = $(this).val();
      AjaxHandler.reset();
      AjaxHandler.set_url('/ajax-basket/change-service-category');
      AjaxHandler.add_data('int_service_category_id', int_sc_id);
      AjaxHandler.dispatch(function(obj_response) {
         // Update prices
         $('#delivery_total_price').html($('str_delivery', obj_response).text());
         $('#basket_total_price').html($('str_display_price', obj_response).text());

         Sprint.overlay.hide();
      });
   });
};

/**
 * Payment Validation
 */
Sprint.checkout.validation = {
   obj_payment_types: {},
   /**
    * Add payment type, to enable validation
    */
   add_payment_type: function(str_payment_type_id, str_payment_type_handle) {
      Sprint.checkout.validation.obj_payment_types[str_payment_type_id] = str_payment_type_handle;
   }
};

/**
 * Hook up payment validation to the proceed button
 */
Sprint.checkout.validation.attach = function() {
   var obj_payment_type_validation_function_map,
   initialise = function() {
      // Map payment type to validation function
      obj_payment_type_validation_function_map = {
         'WEB_CARD': validate_web_card,
         'PAYPAL': validate_paypal,
         'PURCHASE_ORDER': validate_purchase_order
      };

      $('#payment_form').submit(validate);
   },
   // Validate payment form
   validate = function() {
      var int_payment_type_id = get_payment_type_id();
      if(int_payment_type_id == -1) {
         alert('Please select a payment type');
         return false;
      }

      var str_handle = Sprint.checkout.validation.obj_payment_types[int_payment_type_id];

      return obj_payment_type_validation_function_map[str_handle]();
   },
   // Get payment type id.  Either from hidden input or selected radio choice
   get_payment_type_id = function() {
      var int_payment_type_id = -1;
      var obj_payment_choice = $('#payment_form .payment_choice');
      if(obj_payment_choice.length == 1) {
         // There's only one valid payment method
         int_payment_type_id = obj_payment_choice.val();
      } else {
         // More than one choice, get selected radio
         var obj_selected_radio = $('#payment_form input[name="int_payment_type_id"]:checked');
         if(obj_selected_radio.length) {
            int_payment_type_id = obj_selected_radio.val();
         }
      }
      return int_payment_type_id;
   },
   //
   validate_web_card = function() {
     var bol_success = Sprint.slik_form.validate_required_fields($('#payment_form'));

      // Terms and Conditions agreement
      var str_terms_and_conditions_id = '#terms_and_conditions';
      if($(str_terms_and_conditions_id).length && $(str_terms_and_conditions_id).attr('type') == 'checkbox') {
         if($(str_terms_and_conditions_id).is(':checked') == false) {
            Sprint.slik_form.field_error($(str_terms_and_conditions_id), 'Please tick this box to agree to our terms and conditions.');
            bol_success = false;
         }
      }

      return bol_success;
   },
   //
   validate_paypal = function() {
      return true;
   },
   //
   validate_purchase_order = function() {
      return true;
   };

   initialise();
};



/** File: site.js **/

/**
 * Kennelpak site enhancement
 *
 * @author docnet
 * @copyright Copyright &copy; 2011, Doctor Net Limited
 * @package Kennelpak
 */

function initPage()
{
	clearFormFields({
		clearInputs: true,
		clearTextareas: true,
		passwordFieldText: false,
		addClassFocus: "focus",
		filterClass: "default"
	});
}
function clearFormFields(o)
{
	if (o.clearInputs == null) o.clearInputs = true;
	if (o.clearTextareas == null) o.clearTextareas = true;
	if (o.passwordFieldText == null) o.passwordFieldText = false;
	if (o.addClassFocus == null) o.addClassFocus = false;
	if (!o.filter) o.filter = "default";
	if(o.clearInputs) {
		var inputs = document.getElementsByTagName("input");
		for (var i = 0; i < inputs.length; i++ ) {
			if((inputs[i].type == "text" || inputs[i].type == "password") && inputs[i].className.indexOf(o.filterClass)) {
				inputs[i].valueHtml = inputs[i].value;
				inputs[i].onfocus = function ()	{
					if(this.valueHtml == this.value) this.value = "";
					if(this.fake) {
						inputsSwap(this, this.previousSibling);
						this.previousSibling.focus();
					}
					if(o.addClassFocus && !this.fake) {
						this.className += " " + o.addClassFocus;
						this.parentNode.className += " parent-" + o.addClassFocus;
					}
				}
				inputs[i].onblur = function () {
					if(this.value == "") {
						this.value = this.valueHtml;
						if(o.passwordFieldText && this.type == "password") inputsSwap(this, this.nextSibling);
					}
					if(o.addClassFocus) {
						this.className = this.className.replace(o.addClassFocus, "");
						this.parentNode.className = this.parentNode.className.replace("parent-"+o.addClassFocus, "");
					}
				}
				if(o.passwordFieldText && inputs[i].type == "password") {
					var fakeInput = document.createElement("input");
					fakeInput.type = "text";
					fakeInput.value = inputs[i].value;
					fakeInput.className = inputs[i].className;
					fakeInput.fake = true;
					inputs[i].parentNode.insertBefore(fakeInput, inputs[i].nextSibling);
					inputsSwap(inputs[i], null);
				}
			}
		}
	}
	if(o.clearTextareas) {
		var textareas = document.getElementsByTagName("textarea");
		for(var i=0; i<textareas.length; i++) {
			if(textareas[i].className.indexOf(o.filterClass)) {
				textareas[i].valueHtml = textareas[i].value;
				textareas[i].onfocus = function() {
					if(this.value == this.valueHtml) this.value = "";
					if(o.addClassFocus) {
						this.className += " " + o.addClassFocus;
						this.parentNode.className += " parent-" + o.addClassFocus;
					}
				}
				textareas[i].onblur = function() {
					if(this.value == "") this.value = this.valueHtml;
					if(o.addClassFocus) {
						this.className = this.className.replace(o.addClassFocus, "");
						this.parentNode.className = this.parentNode.className.replace("parent-"+o.addClassFocus, "");
					}
				}
			}
		}
	}
	function inputsSwap(el, el2) {
		if(el) el.style.display = "none";
		if(el2) el2.style.display = "inline";
	}
}
if (window.addEventListener)
	window.addEventListener("load", initPage, false);
else if (window.attachEvent)
	window.attachEvent("onload", initPage);

// Global namespace
var Kennelpak = {};

// Homepage slider - jquery cycle
Kennelpak.home_slider = (function () {
   var str_slideshow = '#slideshow',
   str_slideshow_item = str_slideshow + ' li',
   str_shortcut = '#slideshow-shortcut li a',
   initialise = function () {
      if($(str_slideshow).length == 0 || $(str_slideshow_item).length < 2) {
         return false;
      }

      start_transition();
      shortcut_click_handler();
   },
   start_transition = function() {
      var bol_first = true;
      $(str_slideshow).cycle({
         fx: 'scrollLeft',
         // handle before (change) event
         before: function(currSlideElement, nextSlideElement, options, forwardFlag) {
            // Determine which button to highlight. Force to the 0 index button on init, as the first value returned isn't what we need.
            var int_index;
            if(bol_first) {
               bol_first = false;
               int_index = 0;
            } else {
               int_index = options.nextSlide;
            }

            $(str_shortcut).removeClass().eq(int_index).addClass('active');
         },
         //speed: 2000, // speed of the transition (any valid fx speed value)
         timeout: 8000, // milliseconds between slide transitions (0 to disable auto advance)
         pause: 1, // true to enable "pause on hover"
         pauseOnPagerHover: 1, // true to pause when hovering over pager link,
         next: '#slideshow-next',
         prev: '#slideshow-prev'
      });
   },
   shortcut_click_handler = function() {
      $(str_shortcut).click(function() {
         var int_index = $(str_shortcut).index(this);
         $(str_slideshow).cycle(int_index);
         return false;
      });
   };

   Sprint.modules.add(initialise);

   return {};
}());

// JS to handle add to basket inventory via Ajax (product-detail-page)
Kennelpak.inventory = (function () {
   var arr_variation_data = new Array(),
   int_first_inventory_id = -1,

   initialise = function () {
      // Variation Change Selector
      if ($('#inventory_id').length == 1 && $('#inventory_id').is('select')) {
         // Activate on change
         $('#inventory_id').change(update_display_price);

         // Fire now also for good luck
         update_display_price();
      }

      // Buy Now Validation and Ajax
      if ($('#buy_items').length == 1) {
         // Buy Now form on the page
         $('#buy_items_submit_link').attr('href', '#');
         $('#buy_items_submit_link').click(validate_buy_now_form);
      }
   },
   update_display_price = function () {
      int_inventory_id = $('#inventory_id').val();
      if (int_inventory_id > 0) {
         $('#jq_inventory_price_prompt').html('Price:');
         $('#jq_inventory_price').html(arr_variation_data[int_inventory_id][0]);
         $('#jq_inventory_delivery_message').html(arr_variation_data[int_inventory_id][1]);
         $('#tab-1').html($('#jq-tab-content-1-' + int_inventory_id).html());
         $('#tab-2').html($('#jq-tab-content-2-' + int_inventory_id).html());
      } else {
         $('#jq_inventory_price_prompt').html('Price from:');
         $('#jq_inventory_price').html(arr_variation_data[int_first_inventory_id][0]);
         $('#jq_inventory_delivery_message').html(arr_variation_data[int_first_inventory_id][1]);
         $('#tab-1').html($('#jq-tab-content-1-' + int_first_inventory_id).html());
         $('#tab-2').html($('#jq-tab-content-2-' + int_first_inventory_id).html());
      }
   },
   validate_buy_now_form = function (obj_event) {
      obj_event.preventDefault();

      var obj_input = $('#inventory_id');
      if (obj_input.is('select')) {
         var int_inventory_id = obj_input.val();
      } else {
         var int_inventory_id = obj_input.val();
      }

      if (int_inventory_id == undefined || int_inventory_id == "" || parseInt(int_inventory_id) < 1) {
         alert('Please choose the product size first');
         return false;
      }

      if ($('#qty').val() < 1) {
         $('#qty').val(1);
      }

      AjaxHandler.reset();
      AjaxHandler.process_form($('#buy_items'));
      AjaxHandler.set_url('/ajax-basket/add');
      AjaxHandler.dispatch(function (obj_response) {
         // Basket success
         var int_item_count = $('int_item_count', obj_response).text();
         var str_item_text = $('int_item_count', obj_response).text() + ' item';
         if (parseInt(int_item_count) > 1) {
            str_item_text = str_item_text + 's';
         }
         var str_display_price = $('str_display_price', obj_response).text();
         var str_mini_basket_summary = '<a href="/basket/view" title="View Basket">' + str_item_text + ' <strong>' + str_display_price + '</strong></a>';
         var str_continue_shopping_link = $('#jq_continue_shopping_link').attr('href');
         var str_basket_message_html = 'Item added to your basket!<br /><a href="' + str_continue_shopping_link + '">Continue shopping</a> or <a href="/checkout">Checkout Now</a>';
         $('#jq_mini_basket_summary').html(str_mini_basket_summary);
         $('#jq_inventory_basket_message').html(str_basket_message_html);
         $('#jq_inventory_basket_message').show();
      }, function () {
         alert("Sorry... Something went wrong. Please reload the page and try again.");
      });
   };

   Sprint.modules.add(initialise);

   // Public methods
   var obj_public = {
      // Set custom EMC codes
      add_variation: function(int_inventory_id, str_price, str_delivery_message) {
         arr_variation_data[int_inventory_id] = [str_price, str_delivery_message];
         if (int_first_inventory_id < 0) {
            int_first_inventory_id = int_inventory_id;
         }
      }
   };

   return obj_public;
})();

// Visual - Inventory Image
Kennelpak.visual = (function () {
   var str_main_image_id = '#photo',

   initialise = function() {
      if($('.thumbnails').length == 0) {
         return false;
      }

      $('.thumbnails .holder').click(swap);
      $('.visual .larger, .visual .photo').click(enlarge);
   },
   swap = function() {
      var arr_matches = $('img', this).attr('src').match(/\/product-media\/([^\/]*)/);
      var str_selected = arr_matches[1];

      var str_main_image_src = $(str_main_image_id).attr('src');
      var str_main_image_src = str_main_image_src.replace(/\/product-media\/[^\/]*/, '/product-media/' + str_selected);
      $(str_main_image_id).attr('src', str_main_image_src);

      return false;
   },
   enlarge = function() {
      return false;
   };

   Sprint.modules.add(initialise);

   return {};
}());

/* Tabs */
Kennelpak.tabs = (function () {
   var str_tab_elements = '.tabset li',
   str_tab_contents = '.tab-holder .tab',
   initialise = function () {
      $(str_tab_elements).click(swap_tab);
   },
   swap_tab = function () {
      var str_id = $('a', this).attr('href');
      $(str_tab_elements).removeClass("active");
      $(str_tab_contents).hide();
      $(str_tab_contents + str_id).show();
      $(this).addClass("active");

      return false;
   };

   Sprint.modules.add(initialise);

   return {};
}());


/* Storefinder page */
Kennelpak.storefinder = (function () {
   var str_link_class = '.map_shop_link'
   initialise = function () {
      $('#store_finder_popup_signup_real').submit(function () {
        if ($('input[name*="location"]').val() == '') {
           $('#store_finder_error_message').html('Error: Location is blank.');
           return false;
        } else {
           return true;
        }
      });
      $(str_link_class).click(switch_displayed_shop);
   },
   switch_displayed_shop = function() {
      Sprint.Map.plotLocation($(this).attr('id').substr(5));
      return false;
   };
   Sprint.modules.add(initialise);
   return {};
}());

/**
 * My account - My Pets form validation
 */
Sprint.my_pets = (function() {
   initialise = function () {
      Sprint.slik_form.initialise();
      my_pets_submit();
   },
   my_pets_submit = function() {
      $('#update_my_pet_form').submit(function() {
         var bol_success = Sprint.slik_form.validate_required_fields($('#update_my_pet_form'));

         if (bol_success) {
            AjaxHandler.reset();
            AjaxHandler.process_form($('#update_my_pet_form'));

            AjaxHandler.dispatch(
               function(obj_response)  {
                  window.location="/my-account/view-my-pets";
               },
               function(obj_response)  {
                  $('#customer_pet_error_message').html($('message', obj_response).text());
               }
            );
         }
         return false;
      });
   };
   Sprint.modules.add(initialise);
   return {};
}());

Kennelpak.false_link = (function () {
   var dropdown_selector = '.link_to_delivery_info',
   initialise = function () {
      $(dropdown_selector).click( function() {
         window.location.href='/customer-services/delivery-information';
      });
   };
   Sprint.modules.add(initialise);
   return {};
}());

Kennelpak.newsletter = (function () {
   initialise = function () {
      $('#btn_newsletter_signup_submit').click(submit);
   },
   submit = function() {
      AjaxHandler.reset('/ajax-newsletter/subscribe');
      AjaxHandler.process_form($('#form_newsletter_signup_real'));
      AjaxHandler.dispatch(function (obj_response) {
         alert("Thank you for signing up to our newsletter - we will send you an email shortly with your 10% off first order discount code!");
      }, function (obj_response) {
         alert($('message', obj_response).text() + '\n\nPlease try again.');
      });
   };

   Sprint.modules.add(initialise);

   return {};
}());


