//conversion.js

(function(){var e=null;function f(a){return a!=e?escape(a.toString()):""}function h(a,b){var g=f(b);if(g!=""){var c=f(a);if(c!="")return"&".concat(c,"=",g)}return""}function j(a){var b=typeof a;return a==e||b=="object"||b=="function"?e:String(a).replace(/,/g,"\\,").replace(/;/g,"\\;").replace(/=/g,"\\=")}
function k(a){var b;a=a.google_custom_params;if(!a||typeof a!="object"||typeof a.join=="function")b="";else{var g=[];for(b in a)if(Object.prototype.hasOwnProperty.call(a,b)){var c=a[b];if(c&&typeof c.join=="function"){for(var d=[],i=0;i<c.length;++i){var p=j(c[i]);p!=e&&d.push(p)}c=d.length==0?e:d.join(",")}else c=j(c);(d=j(b))&&c!=e&&g.push(d+"="+c)}b=g.join(";")}return b==""?"":"&".concat("data=",encodeURIComponent(b))}
function l(a){return typeof a!="number"&&typeof a!="string"?"":f(a.toString())}function m(a){if(!a)return"";a=a.google_conversion_items;if(!a)return"";for(var b=[],g=0,c=a.length;g<c;g++){var d=a[g],i=[];d&&(i.push(l(d.value)),i.push(l(d.quantity)),i.push(l(d.item_id)),i.push(l(d.adwords_grouping)),i.push(l(d.sku)),b.push("("+i.join("*")+")"))}return b.length>0?"&item="+b.join(""):""}
function n(a,b,g){var c=[];if(a){var d=a.screen;d&&(c.push(h("u_h",d.height)),c.push(h("u_w",d.width)),c.push(h("u_ah",d.availHeight)),c.push(h("u_aw",d.availWidth)),c.push(h("u_cd",d.colorDepth)));a.history&&c.push(h("u_his",a.history.length))}g&&typeof g.getTimezoneOffset=="function"&&c.push(h("u_tz",-g.getTimezoneOffset()));b&&(typeof b.javaEnabled=="function"&&c.push(h("u_java",b.javaEnabled())),b.plugins&&c.push(h("u_nplug",b.plugins.length)),b.mimeTypes&&c.push(h("u_nmime",b.mimeTypes.length)));
return c.join("")}function o(a,b){var g="";if(b){var c=b.referrer;if(a&&a.top&&b.location&&a.top.location==b.location)g+=h("ref",c!=e?c.toString().substring(0,256):""),c=b.location;g+=h("url",c!=e?c.toString().substring(0,256):"")}return g}function q(a){return a&&a.location&&a.location.protocol&&a.location.protocol.toString().toLowerCase()=="https:"?"https:":"http:"}
function r(a){return a.google_remarketing_only?"googleads.g.doubleclick.net":a.google_conversion_domain||"www.googleadservices.com"}
function s(a){var b=navigator,g=document,c="/?";a.google_conversion_type=="landing"&&(c="/extclk?");var c=q(a)+"//"+r(a)+"/pagead/"+[a.google_remarketing_only?"viewthroughconversion/":"conversion/",f(a.google_conversion_id),c,"random=",f(a.google_conversion_time)].join(""),d;a:{d=a.google_conversion_language;if(d!=e){d=d.toString();if(2==d.length){d=h("hl",d);break a}if(5==d.length){d=h("hl",d.substring(0,2))+h("gl",d.substring(3,5));break a}}d=""}c+=[h("cv",a.google_conversion_js_version),h("fst",
a.google_conversion_first_time),h("num",a.google_conversion_snippets),h("fmt",a.google_conversion_format),h("value",a.google_conversion_value),h("label",a.google_conversion_label),h("oid",a.google_conversion_order_id),h("bg",a.google_conversion_color),d,h("guid","ON"),h("disvt",a.google_disable_viewthrough),h("is_call",a.google_is_call),m(a),n(a,b,a.google_conversion_date),o(a,g),k(a)].join("");return c}
function t(){var a=u,b=s(a),g=function(a,b,g){return'<img height="'+g+'" width="'+b+'" border="0" src="'+a+'" />'};return a.google_conversion_format==0&&a.google_conversion_domain==e?'<a href="'+(q(a)+"//services.google.com/sitestats/"+({ar:1,bg:1,cs:1,da:1,de:1,el:1,en_AU:1,en_US:1,en_GB:1,es:1,et:1,fi:1,fr:1,hi:1,hr:1,hu:1,id:1,is:1,it:1,iw:1,ja:1,ko:1,lt:1,nl:1,no:1,pl:1,pt_BR:1,pt_PT:1,ro:1,ru:1,sk:1,sl:1,sr:1,sv:1,th:1,tl:1,tr:1,vi:1,zh_CN:1,zh_TW:1}[a.google_conversion_language]?a.google_conversion_language+
".html":"en_US.html")+"?cid="+f(a.google_conversion_id))+'" target="_blank">'+g(b,135,27)+"</a>":a.google_conversion_snippets>1||a.google_conversion_format==3?g(b,1,1):'<iframe name="google_conversion_frame" width="'+(a.google_conversion_format==2?200:300)+'" height="'+(a.google_conversion_format==2?26:13)+'" src="'+b+'" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no">'+g(b.replace(/\?random=/,"?frame=0&random="),1,1)+"</iframe>"}
function v(){var a=u;if(a.google_conversion_type=="landing"||!a.google_conversion_id)return false;if(a.google_remarketing_only&&a.google_disable_viewthrough)return false;a.google_conversion_date=new Date;a.google_conversion_time=a.google_conversion_date.getTime();typeof a.google_conversion_snippets=="number"&&a.google_conversion_snippets>0?a.google_conversion_snippets+=1:a.google_conversion_snippets=1;typeof a.google_conversion_first_time!="number"&&(a.google_conversion_first_time=a.google_conversion_time);
a.google_conversion_js_version="6";a.google_conversion_format!=0&&a.google_conversion_format!=1&&a.google_conversion_format!=2&&a.google_conversion_format!=3&&(a.google_conversion_format=1);return true};var u=window;
if(u)if(/[\?&;]google_debug/.exec(document.URL)!=e){var w=document.getElementsByTagName("head")[0];w||(w=document.createElement("head"),document.getElementsByTagName("html")[0].insertBefore(w,document.getElementsByTagName("body")[0]));var x=document.createElement("script");x.src=q(window)+"//"+r(window)+"/pagead/conversion_debug_overlay.js";w.appendChild(x)}else{try{v()&&document.write(t())}catch(y){}var z=u;z.google_conversion_date=e;z.google_conversion_time=e;z.google_conversion_js_version=e;z.google_conversion_id=
e;z.google_conversion_value=e;z.google_conversion_label=e;z.google_conversion_language=e;z.google_conversion_format=e;z.google_conversion_color=e;z.google_conversion_type=e;z.google_conversion_order_id=e;z.google_conversion_items=e;z.google_custom_params=e;z.google_conversion_domain=e;z.google_disable_viewthrough=e;z.google_remarketing_only=e};})();


//css_browser_selector.js

/*
CSS Browser Selector v0.4.0 (Nov 02, 2010)
Rafael Lima (http://rafael.adm.br)
http://rafael.adm.br/css_browser_selector
License: http://creativecommons.org/licenses/by/2.5/
Contributors: http://rafael.adm.br/css_browser_selector#contributors
*/
function css_browser_selector(u){var ua=u.toLowerCase(),is=function(t){return ua.indexOf(t)>-1},g='gecko',w='webkit',s='safari',o='opera',m='mobile',h=document.documentElement,b=[(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3.5')?g+' ff3 ff3_5':is('firefox/3.6')?g+' ff3 ff3_6':is('firefox/3')?g+' ff3':is('gecko/')?g:is('opera')?o+(/version\/(\d+)/.test(ua)?' '+o+RegExp.$1:(/opera(\s|\/)(\d+)/.test(ua)?' '+o+RegExp.$2:'')):is('konqueror')?'konqueror':is('blackberry')?m+' blackberry':is('android')?m+' android':is('chrome')?w+' chrome':is('iron')?w+' iron':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'',is('j2me')?m+' j2me':is('iphone')?m+' iphone':is('ipod')?m+' ipod':is('ipad')?m+' ipad':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win'+(is('windows nt 6.0')?' vista':''):is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js']; c = b.join(' '); h.className += ' '+c; return c;}; css_browser_selector(navigator.userAgent);


//ga.js

(function(){var g=void 0,h=null,aa=encodeURIComponent,ba=decodeURIComponent,j=Math;function ca(a,b){return a.name=b}var k="push",da="slice",ea="replace",fa="load",l="charAt",ga="value",n="indexOf",ha="match",o="name",ia="host",r="toString",s="length",t="prototype",u="split",v="stopPropagation",ja="scope",w="location",x="getString",y="substring",la="navigator",A="join",B="toLowerCase",C;function ma(a,b){switch(b){case 0:return""+a;case 1:return a*1;case 2:return!!a;case 3:return a*1E3}return a}function D(a){return g==a||"-"==a||""==a}function na(a){if(!a||""==a)return"";for(;a&&" \n\r\t"[n](a[l](0))>-1;)a=a[y](1);for(;a&&" \n\r\t"[n](a[l](a[s]-1))>-1;)a=a[y](0,a[s]-1);return a}function oa(a){var b=1,c=0,d;if(!D(a)){b=0;for(d=a[s]-1;d>=0;d--)c=a.charCodeAt(d),b=(b<<6&268435455)+c+(c<<14),c=b&266338304,b=c!=0?b^c>>21:b}return b}function pa(){return j.round(j.random()*2147483647)}
function qa(){}function E(a,b){return aa instanceof Function?b?encodeURI(a):aa(a):(F(68),escape(a))}function G(a){a=a[u]("+")[A](" ");if(ba instanceof Function)try{return ba(a)}catch(b){F(17)}else F(68);return unescape(a)}var ra=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)},sa=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,!!d):a.detachEvent&&a.detachEvent("on"+b,c)};function H(a){return a&&a[s]>0?a[0]:""}
function ta(a){var b=a?a[s]:0;return b>0?a[b-1]:""}var ua=function(){this.prefix="ga.";this.F={}};ua[t].set=function(a,b){this.F[this.prefix+a]=b};ua[t].get=function(a){return this.F[this.prefix+a]};ua[t].contains=function(a){return this.get(a)!==g};function va(a){a[n]("www.")==0&&(a=a[y](4));return a[B]()}function wa(a,b){var c,d={url:a,protocol:"http",host:"",path:"",c:new ua,anchor:""};if(!a)return d;c=a[n]("://");if(c>=0)d.protocol=a[y](0,c),a=a[y](c+3);c=a.search("/|\\?|#");if(c>=0)d.host=a[y](0,c)[B](),a=a[y](c);else return d.host=a[B](),d;c=a[n]("#");if(c>=0)d.anchor=a[y](c+1),a=a[y](0,c);c=a[n]("?");c>=0&&(xa(d.c,a[y](c+1)),a=a[y](0,c));d.anchor&&b&&xa(d.c,d.anchor);a&&a[l](0)=="/"&&(a=a[y](1));d.path=a;return d}
function xa(a,b){function c(b,c){a.contains(b)||a.set(b,[]);a.get(b)[k](c)}for(var d=na(b)[u]("&"),e=0;e<d[s];e++)if(d[e]){var f=d[e][n]("=");f<0?c(d[e],"1"):c(d[e][y](0,f),d[e][y](f+1))}}function ya(a,b){if(D(a))return"-";if("["==a[l](0)&&"]"==a[l](a[s]-1))return"-";var c=I.domain;c+=b&&b!="/"?b:"";return a[n](c)==(a[n]("http://")==0?7:a[n]("https://")==0?8:0)?"0":a};function za(a,b,c){j.random()*100>=1||(a=["utmt=error","type="+a,"utmwv=5.1.7","utmn="+pa(),"utmsp=1"],b&&a[k]("api="+b),c&&a[k]("msg="+E(c[y](0,100))),J.p&&a[k]("aip=1"),Aa(a[A]("&")))};var Ba=0;function K(a){return(a?"_":"")+Ba++}
var Ca=K(),Da=K(),Ea=K(),Fa=K(),Ga=K(),L=K(),M=K(),Ha=K(),Ia=K(),Ja=K(),Ka=K(),La=K(),Ma=K(),Na=K(),Oa=K(),Pa=K(),Qa=K(),Ra=K(),Sa=K(),Ta=K(),Ua=K(),Va=K(),Wa=K(),Xa=K(),Ya=K(),Za=K(),$a=K(),ab=K(),bb=K(),cb=K(),db=K(),eb=K(),fb=K(),gb=K(),hb=K(),N=K(!0),ib=K(),jb=K(),kb=K(),lb=K(),mb=K(),nb=K(),ob=K(),pb=K(),qb=K(),rb=K(),O=K(!0),sb=K(!0),tb=K(!0),ub=K(!0),wb=K(!0),xb=K(!0),yb=K(!0),zb=K(!0),Ab=K(!0),Bb=K(!0),Cb=K(!0),P=K(!0),Db=K(!0),Eb=K(!0),Fb=K(!0),Gb=K(!0),Hb=K(!0),Ib=K(!0),Jb=K(!0),Kb=K(!0),
Lb=K(!0),Mb=K(!0),Nb=K(!0),Ob=K(!0),Pb=K(!0),Qb=K(),Rb=K();K();var Sb=K(),Tb=K(),Ub=K(),Vb=K(),Wb=K(),Xb=K(),$b=K(),ac=K(),bc=K();K();var cc=K(),dc=K();var ec=function(){function a(a,c,d){Q(R[t],a,c,d)}S("_getName",Ea,58);S("_getAccount",Ca,64);S("_visitCode",O,54);S("_getClientInfo",Na,53,1);S("_getDetectTitle",Qa,56,1);S("_getDetectFlash",Oa,65,1);S("_getLocalGifPath",$a,57);S("_getServiceMode",ab,59);T("_setClientInfo",Na,66,2);T("_setAccount",Ca,3);T("_setNamespace",Da,48);T("_setAllowLinker",Ka,11,2);T("_setDetectFlash",Oa,61,2);T("_setDetectTitle",Qa,62,2);T("_setLocalGifPath",$a,46,0);T("_setLocalServerMode",ab,92,g,0);T("_setRemoteServerMode",
ab,63,g,1);T("_setLocalRemoteServerMode",ab,47,g,2);T("_setSampleRate",Za,45,1);T("_setCampaignTrack",Pa,36,2);T("_setAllowAnchor",La,7,2);T("_setCampNameKey",Sa,41);T("_setCampContentKey",Xa,38);T("_setCampIdKey",Ra,39);T("_setCampMediumKey",Va,40);T("_setCampNOKey",Ya,42);T("_setCampSourceKey",Ua,43);T("_setCampTermKey",Wa,44);T("_setCampCIdKey",Ta,37);T("_setCookiePath",M,9,0);T("_setMaxCustomVariables",bb,0,1);T("_setVisitorCookieTimeout",Ha,28,1);T("_setSessionCookieTimeout",Ia,26,1);T("_setCampaignCookieTimeout",
Ja,29,1);T("_setReferrerOverride",kb,49);a("_trackPageview",R[t].ka,1);a("_trackEvent",R[t].u,4);a("_trackSocial",R[t].la,104);a("_trackPageLoadTime",R[t].ja,100);a("_trackTrans",R[t].ma,18);a("_sendXEvent",R[t].t,78);a("_createEventTracker",R[t].S,74);a("_getVersion",R[t].X,60);a("_setDomainName",R[t].s,6);a("_setAllowHash",R[t].ba,8);a("_getLinkerUrl",R[t].W,52);a("_link",R[t].link,101);a("_linkByPost",R[t].aa,102);a("_setTrans",R[t].ea,20);a("_addTrans",R[t].L,21);a("_addItem",R[t].J,19);a("_setTransactionDelim",
R[t].fa,82);a("_setCustomVar",R[t].ca,10);a("_deleteCustomVar",R[t].U,35);a("_getVisitorCustomVar",R[t].Y,50);a("_setXKey",R[t].ha,83);a("_setXValue",R[t].ia,84);a("_getXKey",R[t].Z,76);a("_getXValue",R[t].$,77);a("_clearXKey",R[t].P,72);a("_clearXValue",R[t].Q,73);a("_createXObj",R[t].T,75);a("_addIgnoredOrganic",R[t].H,15);a("_clearIgnoredOrganic",R[t].M,97);a("_addIgnoredRef",R[t].I,31);a("_clearIgnoredRef",R[t].N,32);a("_addOrganic",R[t].K,14);a("_clearOrganic",R[t].O,70);a("_cookiePathCopy",
R[t].R,30);a("_get",R[t].V,106);a("_set",R[t].da,107);a("_addEventListener",R[t].addEventListener,108);a("_removeEventListener",R[t].removeEventListener,109);a("_initData",R[t].l,2);a("_setVar",R[t].ga,22);T("_setSessionTimeout",Ia,27,3);T("_setCookieTimeout",Ja,25,3);T("_setCookiePersistence",Ha,24,1);a("_setAutoTrackOutbound",qa,79);a("_setTrackOutboundSubdomains",qa,81);a("_setHrefExamineLimit",qa,80)},Q=function(a,b,c,d){a[b]=function(){try{return F(d),c.apply(this,arguments)}catch(a){throw za("exc",
b,a&&a[o]),a;}}},S=function(a,b,c,d){R[t][a]=function(){try{return F(c),ma(this.a.get(b),d)}catch(e){throw za("exc",a,e&&e[o]),e;}}},T=function(a,b,c,d,e){R[t][a]=function(f){try{F(c),e==g?this.a.set(b,ma(f,d)):this.a.set(b,e)}catch(i){throw za("exc",a,i&&i[o]),i;}}},fc=function(a,b){return{type:b,target:a,stopPropagation:function(){throw"aborted";}}};var gc=function(a,b){return b!=="/"?!1:(a[n]("www.google.")==0||a[n](".google.")==0||a[n]("google.")==0)&&!(a[n]("google.org")>-1)?!0:!1},hc=function(a){var b=a.get(Ga),c=a[x](M,"/");gc(b,c)&&a[v]()};var lc=function(){var a={},b={},c=new ic;this.g=function(a,b){c.add(a,b)};var d=new ic;this.d=function(a,b){d.add(a,b)};var e=!1,f=!1,i=!0;this.G=function(){e=!0};this.f=function(a){this[fa]();this.set(Qb,a,!0);e=!1;d.execute(this);e=!0;b={};this.i()};this.load=function(){e&&(e=!1,this.na(),jc(this),f||(f=!0,c.execute(this),kc(this),jc(this)),e=!0)};this.i=function(){if(e)if(f)e=!1,kc(this),e=!0;else this[fa]()};this.get=function(c){c&&c[l](0)=="_"&&this[fa]();return b[c]!==g?b[c]:a[c]};this.set=
function(c,d,e){c&&c[l](0)=="_"&&this[fa]();e?b[c]=d:a[c]=d;c&&c[l](0)=="_"&&this.i()};this.m=function(b){a[b]=this.b(b,0)+1};this.b=function(a,b){var c=this.get(a);return c==g||c===""?b:c*1};this.getString=function(a,b){var c=this.get(a);return c==g?b:c+""};this.na=function(){if(i){var b=this[x](Ga,""),c=this[x](M,"/");gc(b,c)||(a[L]=a[Ma]&&b!=""?oa(b):1,i=!1)}}};lc[t].stopPropagation=function(){throw"aborted";};function mc(a,b){for(var b=b||[],c=0;c<b[s];c++){var d=b[c];if(""+a==d||d[n](a+".")==0)return d}return"-"}
var oc=function(a,b,c){c=c?"":a[x](L,"1");b=b[u](".");if(b[s]!==6||nc(b[0],c))return!1;var c=b[1]*1,d=b[2]*1,e=b[3]*1,f=b[4]*1,b=b[5]*1;if(!(c>=0&&d>0&&e>0&&f>0&&b>=0))return F(110),!1;a.set(O,c);a.set(wb,d);a.set(xb,e);a.set(yb,f);a.set(zb,b);return!0},pc=function(a){var b=a.get(O),c=a.get(wb),d=a.get(xb),e=a.get(yb),f=a.b(zb,1);b==g?F(113):b==NaN&&F(114);b>=0&&c>0&&d>0&&e>0&&f>=0||F(115);return[a.b(L,1),b!=g?b:"-",c||"-",d||"-",e||"-",f][A](".")},qc=function(a){return[a.b(L,1),a.b(Cb,0),a.b(P,1),
a.b(Db,0)][A](".")},rc=function(a,b,c){var c=c?"":a[x](L,"1"),d=b[u](".");if(d[s]!==4||nc(d[0],c))d=h;a.set(Cb,d?d[1]*1:0);a.set(P,d?d[2]*1:10);a.set(Db,d?d[3]*1:a.get(Fa));return d!=h||!nc(b,c)},sc=function(a,b){var c=E(a[x](tb,"")),d=[],e=a.get(N);if(!b&&e){for(var f=0;f<e[s];f++){var i=e[f];i&&i[ja]==1&&d[k](f+"="+E(i[o])+"="+E(i[ga])+"=1")}d[s]>0&&(c+="|"+d[A](","))}return c?a.b(L,1)+"."+c:h},tc=function(a,b,c){c=c?"":a[x](L,"1");b=b[u](".");if(b[s]<2||nc(b[0],c))return!1;b=b[da](1)[A](".")[u]("|");
b[s]>0&&a.set(tb,G(b[0]));if(b[s]<=1)return!0;for(var c=b[1][u](b[1][n](",")==-1?"^":","),d=0;d<c[s];d++){var e=c[d][u]("=");if(e[s]==4){var f={};ca(f,G(e[1]));f.value=G(e[2]);f.scope=1;a.get(N)[e[0]]=f}}b[1][n]("^")>=0&&F(125);return!0},vc=function(a,b){var c=uc(a,b);return c?[a.b(L,1),a.b(Eb,0),a.b(Fb,1),a.b(Gb,1),c][A]("."):""},uc=function(a){function b(b,e){if(!D(a.get(b))){var f=a[x](b,""),f=f[u](" ")[A]("%20"),f=f[u]("+")[A]("%20");c[k](e+"="+f)}}var c=[];b(Ib,"utmcid");b(Mb,"utmcsr");b(Kb,
"utmgclid");b(Lb,"utmdclid");b(Jb,"utmccn");b(Nb,"utmcmd");b(Ob,"utmctr");b(Pb,"utmcct");return c[A]("|")},xc=function(a,b,c){c=c?"":a[x](L,"1");b=b[u](".");if(b[s]<5||nc(b[0],c))return a.set(Eb,g),a.set(Fb,g),a.set(Gb,g),a.set(Ib,g),a.set(Jb,g),a.set(Mb,g),a.set(Nb,g),a.set(Ob,g),a.set(Pb,g),a.set(Kb,g),a.set(Lb,g),!1;a.set(Eb,b[1]*1);a.set(Fb,b[2]*1);a.set(Gb,b[3]*1);wc(a,b[da](4)[A]("."));return!0},wc=function(a,b){function c(a){return(a=b[ha](a+"=(.*?)(?:\\|utm|$)"))&&a[s]==2?a[1]:g}function d(b,
c){c&&(c=e?G(c):c[u]("%20")[A](" "),a.set(b,c))}b[n]("=")==-1&&(b=G(b));var e=c("utmcvr")=="2";d(Ib,c("utmcid"));d(Jb,c("utmccn"));d(Mb,c("utmcsr"));d(Nb,c("utmcmd"));d(Ob,c("utmctr"));d(Pb,c("utmcct"));d(Kb,c("utmgclid"));d(Lb,c("utmdclid"))},nc=function(a,b){return b?a!=b:!/^\d+$/.test(a)};var ic=function(){this.r=[]};ic[t].add=function(a,b){this.r[k]({name:a,xa:b})};ic[t].execute=function(a){try{for(var b=0;b<this.r[s];b++)this.r[b].xa.call(U,a)}catch(c){}};function yc(a){a.get(Za)!=100&&a.get(O)%1E4>=a.get(Za)*100&&a[v]()}function zc(a){Ac()&&a[v]()}function Bc(a){I[w].protocol=="file:"&&a[v]()}function Cc(a){a.get(jb)||a.set(jb,I.title,!0);a.get(ib)||a.set(ib,I[w].pathname+I[w].search,!0)};var Dc=new function(){var a=[];this.set=function(b){a[b]=!0};this.ya=function(){for(var b=[],c=0;c<a[s];c++)a[c]&&(b[j.floor(c/6)]^=1<<c%6);for(c=0;c<b[s];c++)b[c]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"[l](b[c]||0);return b[A]("")+"~"}};function F(a){Dc.set(a)};var U=window,I=document,Ac=function(){var a=U._gaUserPrefs;return a&&a.ioo&&a.ioo()},Ec=function(a,b){setTimeout(a,b)},V=function(a){for(var b=[],c=I.cookie[u](";"),a=RegExp("^\\s*"+a+"=\\s*(.*?)\\s*$"),d=0;d<c[s];d++){var e=c[d][ha](a);e&&b[k](e[1])}return b},W=function(a,b,c,d,e){var f;f=Ac()?!1:gc(d,c)?!1:!0;if(f){if(b&&U[la].userAgent[n]("Firefox")>=0){b=b[ea](/\n|\r/g," ");f=0;for(var i=b[s];f<i;++f){var m=b.charCodeAt(f)&255;if(m==10||m==13)b=b[y](0,f)+"?"+b[y](f+1)}}b&&b[s]>2E3&&(b=b[y](0,
2E3),F(69));a=a+"="+b+"; path="+c+"; ";e&&(a+="expires="+(new Date((new Date).getTime()+e)).toGMTString()+"; ");d&&(a+="domain="+d+";");I.cookie=a}};var Fc,Gc,Hc=function(){if(!Fc){var a={},b=U[la],c=U.screen;a.D=c?c.width+"x"+c.height:"-";a.C=c?c.colorDepth+"-bit":"-";a.language=(b&&(b.language||b.browserLanguage)||"-")[B]();a.javaEnabled=b&&b.javaEnabled()?1:0;a.characterSet=I.characterSet||I.charset||"-";Fc=a}},Ic=function(){Hc();for(var a=Fc,b=U[la],a=b.appName+b.version+a.language+b.platform+b.userAgent+a.javaEnabled+a.D+a.C+(I.cookie?I.cookie:"")+(I.referrer?I.referrer:""),b=a[s],c=U.history[s];c>0;)a+=c--^b++;return oa(a)},Jc=function(a){Hc();
var b=Fc;a.set(mb,b.D);a.set(nb,b.C);a.set(qb,b.language);a.set(rb,b.characterSet);a.set(ob,b.javaEnabled);if(a.get(Na)&&a.get(Oa)){if(!(b=Gc)){var c,d,e;d="ShockwaveFlash";if((b=(b=U[la])?b.plugins:g)&&b[s]>0)for(c=0;c<b[s]&&!e;c++)d=b[c],d[o][n]("Shockwave Flash")>-1&&(e=d.description[u]("Shockwave Flash ")[1]);else{d=d+"."+d;try{c=new ActiveXObject(d+".7"),e=c.GetVariable("$version")}catch(f){}if(!e)try{c=new ActiveXObject(d+".6"),e="WIN 6,0,21,0",c.AllowScriptAccess="always",e=c.GetVariable("$version")}catch(i){}if(!e)try{c=
new ActiveXObject(d),e=c.GetVariable("$version")}catch(m){}e&&(e=e[u](" ")[1][u](","),e=e[0]+"."+e[1]+" r"+e[2])}b=e?e:"-"}Gc=b;a.set(pb,Gc)}else a.set(pb,"-")};var X=function(){Q(X[t],"push",X[t][k],5);Q(X[t],"_createAsyncTracker",X[t].va,33);Q(X[t],"_getAsyncTracker",X[t].wa,34);this.q=0};X[t].va=function(a,b){return J.k(a,b||"")};X[t].wa=function(a){return J.o(a)};X[t].push=function(a){this.q>0&&F(105);this.q++;for(var b=arguments,c=0,d=0;d<b[s];d++)try{if(typeof b[d]==="function")b[d]();else{var e="",f=b[d][0],i=f.lastIndexOf(".");i>0&&(e=f[y](0,i),f=f[y](i+1));var m=e=="_gat"?J:e=="_gaq"?Kc:J.o(e);m[f].apply(m,b[d][da](1))}}catch(p){c++}this.q--;return c};var Nc=function(){function a(a,b,c,d){g==f[a]&&(f[a]={});g==f[a][b]&&(f[a][b]=[]);f[a][b][c]=d}function b(a,b,c){if(g!=f[a]&&g!=f[a][b])return f[a][b][c]}function c(a,b){if(g!=f[a]&&g!=f[a][b]){f[a][b]=g;var c=!0,d;for(d=0;d<i[s];d++)if(g!=f[a][i[d]]){c=!1;break}c&&(f[a]=g)}}function d(a){var b="",c=!1,d,e;for(d=0;d<i[s];d++)if(e=a[i[d]],g!=e){c&&(b+=i[d]);for(var c=[],f=g,Y=g,Y=0;Y<e[s];Y++)if(g!=e[Y]){f="";Y!=Z&&g==e[Y-1]&&(f+=Y[r]()+ka);for(var Oc=e[Y],Pc="",vb=g,Yb=g,Zb=g,vb=0;vb<Oc[s];vb++)Yb=
Oc[l](vb),Zb=z[Yb],Pc+=g!=Zb?Zb:Yb;f+=Pc;c[k](f)}b+=m+c[A](q)+p;c=!1}else c=!0;return b}var e=this,f=[],i=["k","v"],m="(",p=")",q="*",ka="!",z={"'":"'0"};z[p]="'1";z[q]="'2";z[ka]="'3";var Z=1;e.qa=function(a){return g!=f[a]};e.n=function(){for(var a="",b=0;b<f[s];b++)g!=f[b]&&(a+=b[r]()+d(f[b]));return a};e.pa=function(a){if(a==g)return e.n();for(var b=a.n(),c=0;c<f[s];c++)g!=f[c]&&!a.qa(c)&&(b+=c[r]()+d(f[c]));return b};e.e=function(b,c,d){if(!Lc(d))return!1;a(b,"k",c,d);return!0};e.j=function(b,
c,d){if(!Mc(d))return!1;a(b,"v",c,d[r]());return!0};e.getKey=function(a,c){return b(a,"k",c)};e.z=function(a,c){return b(a,"v",c)};e.v=function(a){c(a,"k")};e.w=function(a){c(a,"v")};Q(e,"_setKey",e.e,89);Q(e,"_setValue",e.j,90);Q(e,"_getKey",e.getKey,87);Q(e,"_getValue",e.z,88);Q(e,"_clearKey",e.v,85);Q(e,"_clearValue",e.w,86)};function Lc(a){return typeof a=="string"}function Mc(a){return typeof a!="number"&&(g==Number||!(a instanceof Number))||j.round(a)!=a||a==NaN||a==Infinity?!1:!0};var Qc=function(a){var b=U.gaGlobal;a&&!b&&(U.gaGlobal=b={});return b},Rc=function(){var a=Qc(!0).hid;if(a==h)a=pa(),Qc(!0).hid=a;return a},Sc=function(a){a.set(lb,Rc());var b=Qc();if(b&&b.dh==a.get(L)){var c=b.sid;c&&(c=="0"&&F(112),a.set(yb,c),a.get(sb)&&a.set(xb,c));b=b.vid;a.get(sb)&&b&&(b=b[u]("."),b[1]*1||F(112),a.set(O,b[0]*1),a.set(wb,b[1]*1))}};var Tc,Uc=function(a,b,c){var d=a[x](Ga,""),e=a[x](M,"/"),a=a.b(Ha,0);W(b,c,e,d,a)},kc=function(a){var b=a[x](Ga,"");a.b(L,1);var c=a[x](M,"/");W("__utma",pc(a),c,b,a.get(Ha));W("__utmb",qc(a),c,b,a.get(Ia));W("__utmc",""+a.b(L,1),c,b);var d=vc(a,!0);d?W("__utmz",d,c,b,a.get(Ja)):W("__utmz","",c,b,-1);(d=sc(a,!1))?W("__utmv",d,c,b,a.get(Ha)):W("__utmv","",c,b,-1)},jc=function(a){var b=a.b(L,1);if(!oc(a,mc(b,V("__utma"))))return a.set(ub,!0),!1;var c=!rc(a,mc(b,V("__utmb")));a.set(Bb,c);xc(a,mc(b,
V("__utmz")));tc(a,mc(b,V("__utmv")));Tc=!c;return!0},Vc=function(a){!Tc&&!(V("__utmb")[s]>0)&&(W("__utmd","1",a[x](M,"/"),a[x](Ga,""),1E4),V("__utmd")[s]==0&&a[v]())};var Yc=function(a){a.get(O)==g?Wc(a):a.get(ub)&&!a.get(cc)?Wc(a):a.get(Bb)&&Xc(a)},Zc=function(a){a.get(Hb)&&!a.get(Ab)&&(Xc(a),a.set(Fb,a.get(zb)))},Wc=function(a){var b=a.get(Fa);a.set(sb,!0);a.set(O,pa()^Ic(a)&2147483647);a.set(tb,"");a.set(wb,b);a.set(xb,b);a.set(yb,b);a.set(zb,1);a.set(Ab,!0);a.set(Cb,0);a.set(P,10);a.set(Db,b);a.set(N,[]);a.set(ub,!1);a.set(Bb,!1)},Xc=function(a){a.set(xb,a.get(yb));a.set(yb,a.get(Fa));a.m(zb);a.set(Ab,!0);a.set(Cb,0);a.set(P,10);a.set(Db,a.get(Fa));a.set(Bb,
!1)};var $c="daum:q,eniro:search_word,naver:query,pchome:q,images.google:q,google:q,yahoo:p,yahoo:q,msn:q,bing:q,aol:query,aol:q,lycos:query,ask:q,netscape:query,cnn:query,about:terms,mamma:q,voila:rdata,virgilio:qs,live:q,baidu:wd,alice:qs,yandex:text,najdi:q,seznam:q,search:q,wp:szukaj,onet:qt,szukacz:q,yam:k,kvasir:q,ozu:q,terra:query,rambler:query".split(","),fd=function(a){if(a.get(Pa)&&!a.get(cc)){for(var b=!D(a.get(Ib))||!D(a.get(Mb))||!D(a.get(Kb))||!D(a.get(Lb)),c={},d=0;d<ad[s];d++){var e=ad[d];
c[e]=a.get(e)}d=wa(I[w].href,a.get(La));if(!(ta(d.c.get(a.get(Ya)))=="1"&&b)&&(!bd(a,d)&&!cd(a)&&!b&&a.get(Ab)&&a.get(Ab)&&dd(a,g,"(direct)",g,g,"(direct)","(none)",g,g),a.set(Hb,ed(a,c)),b=a.get(Mb)=="(direct)"&&a.get(Jb)=="(direct)"&&a.get(Nb)=="(none)",a.get(Hb)||a.get(Ab)&&!b))a.set(Eb,a.get(Fa)),a.set(Fb,a.get(zb)),a.m(Gb)}},bd=function(a,b){function c(c,d){var d=d||"-",e=ta(b.c.get(a.get(c)));return e&&e!="-"?G(e):d}var d=ta(b.c.get(a.get(Ra)))||"-",e=ta(b.c.get(a.get(Ua)))||"-",f=ta(b.c.get(a.get(Ta)))||
"-",i=ta(b.c.get("dclid"))||"-",m=c(Sa,"(not set)"),p=c(Va,"(not set)"),q=c(Wa),ka=c(Xa);if(D(d)&&D(f)&&D(i)&&D(e))return!1;if(D(q)){var z=ya(a.get(kb),a.get(M)),z=wa(z,!0);(z=gd(a,z))&&!D(z[1]&&!z[2])&&(q=z[1])}dd(a,d,e,f,i,m,p,q,ka);return!0},cd=function(a){var b=ya(a.get(kb),a.get(M)),c=wa(b,!0);if(!(b!=g&&b!=h&&b!=""&&b!="0"&&b!="-"&&b[n]("://")>=0)||c&&c[ia][n]("google")>-1&&c.c.contains("q")&&c.path=="cse")return!1;if((b=gd(a,c))&&!b[2])return dd(a,g,b[0],g,g,"(organic)","organic",b[1],g),!0;
else if(b)return!1;if(a.get(Ab))a:{for(var b=a.get(eb),d=va(c[ia]),e=0;e<b[s];++e)if(d[n](b[e])>-1){a=!1;break a}dd(a,g,d,g,g,"(referral)","referral",g,"/"+c.path);a=!0}else a=!1;return a},gd=function(a,b){for(var c=a.get(cb),d=0;d<c[s];++d){var e=c[d][u](":");if(b[ia][n](e[0][B]())>-1){var f=H(b.c.get(e[1]));if(f&&(!e[3]||b.url[n](e[3])>-1)){a:{for(var c=f,d=a.get(db),c=G(c)[B](),i=0;i<d[s];++i)if(c==d[i]){c=!0;break a}c=!1}return[e[2]||e[0],f,c]}}}return h},dd=function(a,b,c,d,e,f,i,m,p){a.set(Ib,
b);a.set(Mb,c);a.set(Kb,d);a.set(Lb,e);a.set(Jb,f);a.set(Nb,i);a.set(Ob,m);a.set(Pb,p)},ad=[Jb,Ib,Kb,Lb,Mb,Nb,Ob,Pb],ed=function(a,b){function c(a){a=(""+a)[u]("+")[A]("%20");return a=a[u](" ")[A]("%20")}function d(c){var d=""+(a.get(c)||""),c=""+(b[c]||"");return d[s]>0&&d==c}var e=!1;if(d(Kb)||d(Lb))e=!0;for(var f=0;f<ad[s];f++){var i=ad[f],m=b[i]||"-",i=a.get(i)||"-";if(c(m)!=c(i))return e&&F(131),!0}return!1};var id=function(a){hd(a,I[w].href)?(a.set(cc,!0),F(12)):a.set(cc,!1)},hd=function(a,b){if(!a.get(Ka))return!1;var c=wa(b,a.get(La)),d=H(c.c.get("__utma")),e=H(c.c.get("__utmb")),f=H(c.c.get("__utmc")),i=H(c.c.get("__utmx")),m=H(c.c.get("__utmz")),p=H(c.c.get("__utmv")),c=H(c.c.get("__utmk"));if(oa(""+d+e+f+i+m+p)!=c){d=G(d);e=G(e);f=G(f);i=G(i);a:{for(var f=d+e+f+i,q=0;q<3;q++){for(var ka=0;ka<3;ka++){if(c==oa(f+m+p)){F(127);c=[m,p];break a}var z=m[ea](/ /g,"%20"),Z=p[ea](/ /g,"%20");if(c==oa(f+z+
Z)){F(128);c=[z,Z];break a}z=z[ea](/\+/g,"%20");Z=Z[ea](/\+/g,"%20");if(c==oa(f+z+Z)){F(129);c=[z,Z];break a}m=G(m)}p=G(p)}c=g}if(!c)return!1;m=c[0];p=c[1]}if(!oc(a,d,!0))return!1;rc(a,e,!0);xc(a,m,!0);tc(a,p,!0);jd(a,i,!0);return!0},ld=function(a,b,c){var d;d=pc(a)||"-";var e=qc(a)||"-",f=""+a.b(L,1)||"-",i=kd(a)||"-",m=vc(a,!1)||"-",a=sc(a,!1)||"-",p=oa(""+d+e+f+i+m+a),q=[];q[k]("__utma="+d);q[k]("__utmb="+e);q[k]("__utmc="+f);q[k]("__utmx="+i);q[k]("__utmz="+m);q[k]("__utmv="+a);q[k]("__utmk="+
p);d=q[A]("&");if(!d)return b;e=b[n]("#");return c?e<0?b+"#"+d:b+"&"+d:(c="",f=b[n]("?"),e>0&&(c=b[y](e),b=b[y](0,e)),f<0?b+"?"+d+c:b+"&"+d+c)};var md="|",od=function(a,b,c,d,e,f,i,m,p){var q=nd(a,b);q||(q={},a.get(fb)[k](q));q.id_=b;q.affiliation_=c;q.total_=d;q.tax_=e;q.shipping_=f;q.city_=i;q.state_=m;q.country_=p;q.items_=q.items_||[];return q},pd=function(a,b,c,d,e,f,i){var a=nd(a,b)||od(a,b,"",0,0,0,"","",""),m;a:{if(a&&a.items_){m=a.items_;for(var p=0;p<m[s];p++)if(m[p].sku_==c){m=m[p];break a}}m=h}p=m||{};p.transId_=b;p.sku_=c;p.name_=d;p.category_=e;p.price_=f;p.quantity_=i;m||a.items_[k](p);return p},nd=function(a,b){for(var c=
a.get(fb),d=0;d<c[s];d++)if(c[d].id_==b)return c[d];return h};var qd,rd=function(a){var f;var e;if(!qd){var b;b=I[w].hash;var c=U[o],d=/^#?gaso=([^&]*)/;if(f=(e=(b=b&&b[ha](d)||c&&c[ha](d))?b[1]:H(V("GASO")),b=e)&&b[ha](/^(?:\|([-0-9a-z.]{1,40})\|)?([-.\w]{10,1200})$/i),c=f)if(Uc(a,"GASO",""+b),J._gasoDomain=a.get(Ga),J._gasoCPath=a.get(M),b="https://"+((c[1]||"www")+".google.com")+"/analytics/reporting/overlay_js?gaso="+c[2]+"&"+pa())a=I.createElement("script"),a.type="text/javascript",a.async=!0,a.src=b,a.id="_gasojs",a.onload=g,b=I.getElementsByTagName("script")[0],
b.parentNode.insertBefore(a,b);qd=!0}};var jd=function(a,b,c){c&&(b=G(b));c=a.b(L,1);b=b[u](".");!(b[s]<2)&&/^\d+$/.test(b[0])&&(b[0]=""+c,Uc(a,"__utmx",b[A](".")))},kd=function(a,b){var c=mc(a.get(L),V("__utmx"));c=="-"&&(c="");return b?E(c):c};var vd=function(a,b){if(a.b(O,0)%100>=a.b(bc,0))return!1;var c=sd();c==g&&(c=td());if(c==g||c==Infinity||isNaN(c))return!1;c>0?b(ud(c)):ra(U,"load",function(){vd(a,b)},!1);return!0},ud=function(a){var b=new Nc,c=j.min(j.floor(a/100),5E3);b.e(14,1,c>0?c+"00":"0");b.j(14,1,a);return b},sd=function(){var a=U.performance||U.webkitPerformance;return(a=a&&a.timing)&&a.loadEventStart-a.fetchStart},td=function(){if(U.top==U){var a=U.external,b=a&&a.onloadT;a&&!a.isValidLoadTime&&(b=g);b>2147483648&&(b=g);
b>0&&a.setPageReadyTime();return b}};var R=function(a,b,c){function d(a){return function(b){if((b=b.get(dc)[a])&&b[s])for(var c=fc(e,a),d=0;d<b[s];d++)b[d].call(e,c)}}var e=this;this.a=new lc;this.get=function(a){return this.a.get(a)};this.set=function(a,b,c){this.a.set(a,b,c)};this.set(Ca,b||"UA-XXXXX-X");this.set(Ea,a||"");this.set(Da,c||"");this.set(Fa,j.round((new Date).getTime()/1E3));this.set(M,"/");this.set(Ha,63072E6);this.set(Ja,15768E6);this.set(Ia,18E5);this.set(Ka,!1);this.set(bb,50);this.set(La,!1);this.set(Ma,!0);this.set(Na,
!0);this.set(Oa,!0);this.set(Pa,!0);this.set(Qa,!0);this.set(Sa,"utm_campaign");this.set(Ra,"utm_id");this.set(Ta,"gclid");this.set(Ua,"utm_source");this.set(Va,"utm_medium");this.set(Wa,"utm_term");this.set(Xa,"utm_content");this.set(Ya,"utm_nooverride");this.set(Za,100);this.set(bc,10);this.set($a,"/__utm.gif");this.set(ab,1);this.set(fb,[]);this.set(N,[]);this.set(cb,$c);this.set(db,[]);this.set(eb,[]);this.s("auto");this.set(kb,I.referrer);this.set(dc,{hit:[],load:[]});this.a.g("0",id);this.a.g("1",
Yc);this.a.g("2",fd);this.a.g("3",Zc);this.a.g("4",d("load"));this.a.g("5",rd);this.a.d("A",zc);this.a.d("B",Bc);this.a.d("C",Yc);this.a.d("D",yc);this.a.d("E",hc);this.a.d("F",wd);this.a.d("G",Vc);this.a.d("H",Cc);this.a.d("I",Jc);this.a.d("J",Sc);this.a.d("K",d("hit"));this.a.d("L",xd);this.a.d("M",yd);this.get(Fa)===0&&F(111);this.a.G()};C=R[t];C.h=function(){var a=this.get(gb);a||(a=new Nc,this.set(gb,a));return a};
C.oa=function(a){for(var b in a){var c=a[b];a.hasOwnProperty(b)&&typeof c!="function"&&this.set(b,c,!0)}};C.ka=function(a){a&&a!=g&&(a.constructor+"")[n]("String")>-1?(F(13),this.set(ib,a,!0)):typeof a==="object"&&a!==h&&this.oa(a);this.a.f("page")};C.u=function(a,b,c,d,e){if(a==""||!Lc(a)||b==""||!Lc(b))return!1;if(c!=g&&!Lc(c))return!1;if(d!=g&&!Mc(d))return!1;this.set(Tb,a,!0);this.set(Ub,b,!0);this.set(Vb,c,!0);this.set(Wb,d,!0);this.set(Sb,!!e,!0);this.a.f("event");return!0};
C.la=function(a,b,c,d){if(!a||!b)return!1;this.set(Xb,a,!0);this.set($b,b,!0);this.set(ac,c||I[w].href,!0);d&&this.set(ib,d,!0);this.a.f("social");return!0};C.ja=function(){var a=this;return vd(this.a,function(b){a.t(b)})};C.ma=function(){this.a.f("trans")};C.t=function(a){this.set(hb,a,!0);this.a.f("event")};C.S=function(a){this.l();var b=this;return{_trackEvent:function(c,d,e){F(91);b.u(a,c,d,e)}}};C.V=function(a){return this.get(a)};
C.da=function(a,b){if(a)if(a!=g&&(a.constructor+"")[n]("String")>-1)this.set(a,b);else if(typeof a=="object")for(var c in a)a.hasOwnProperty(c)&&this.set(c,a[c])};C.addEventListener=function(a,b){var c=this.get(dc)[a];c&&c[k](b)};C.removeEventListener=function(a,b){for(var c=this.get(dc)[a],d=0;c&&d<c[s];d++)if(c[d]==b){c.splice(d,1);break}};C.X=function(){return"5.1.7"};C.s=function(a){this.get(Ma);a=a=="auto"?va(I.domain):!a||a=="-"||a=="none"?"":a[B]();this.set(Ga,a)};
C.ba=function(a){this.set(Ma,!!a)};C.W=function(a,b){return ld(this.a,a,b)};C.link=function(a,b){if(this.a.get(Ka)&&a){var c=ld(this.a,a,b);I[w].href=c}};C.aa=function(a,b){this.a.get(Ka)&&a&&a.action&&(a.action=ld(this.a,a.action,b))};
C.ea=function(){this.l();var a=this.a,b=I.getElementById?I.getElementById("utmtrans"):I.utmform&&I.utmform.utmtrans?I.utmform.utmtrans:h;if(b&&b[ga]){a.set(fb,[]);for(var b=b[ga][u]("UTM:"),c=0;c<b[s];c++){b[c]=na(b[c]);for(var d=b[c][u](md),e=0;e<d[s];e++)d[e]=na(d[e]);"T"==d[0]?od(a,d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8]):"I"==d[0]&&pd(a,d[1],d[2],d[3],d[4],d[5],d[6])}}};C.L=function(a,b,c,d,e,f,i,m){return od(this.a,a,b,c,d,e,f,i,m)};C.J=function(a,b,c,d,e,f){return pd(this.a,a,b,c,d,e,f)};
C.fa=function(a){md=a||"|"};C.ca=function(a,b,c,d){var e=this.a;if(a<=0||a>e.get(bb))a=!1;else if(!b||!c||E(b)[s]+E(c)[s]>64)a=!1;else{d!=1&&d!=2&&(d=3);var f={};ca(f,b);f.value=c;f.scope=d;e.get(N)[a]=f;a=!0}a&&this.a.i();return a};C.U=function(a){this.a.get(N)[a]=g;this.a.i()};C.Y=function(a){return(a=this.a.get(N)[a])&&a[ja]==1?a[ga]:g};C.ha=function(a,b,c){this.h().e(a,b,c)};C.ia=function(a,b,c){this.h().j(a,b,c)};C.Z=function(a,b){return this.h().getKey(a,b)};
C.$=function(a,b){return this.h().z(a,b)};C.P=function(a){this.h().v(a)};C.Q=function(a){this.h().w(a)};C.T=function(){return new Nc};C.H=function(a){a&&this.get(db)[k](a[B]())};C.M=function(){this.set(db,[])};C.I=function(a){a&&this.get(eb)[k](a[B]())};C.N=function(){this.set(eb,[])};C.K=function(a,b,c,d,e){if(a&&b){a=[a,b[B]()][A](":");if(d||e)a=[a,d,e][A](":");d=this.get(cb);d.splice(c?0:d[s],0,a)}};C.O=function(){this.set(cb,[])};
C.R=function(a){this.a[fa]();var b=this.get(M),c=kd(this.a);this.set(M,a);this.a.i();jd(this.a,c);this.set(M,b)};C.l=function(){this.a[fa]()};C.ga=function(a){a&&a!=""&&(this.set(tb,a),this.a.f("var"))};var wd=function(a){a.get(Qb)!=="trans"&&a.b(Cb,0)>=500&&a[v]();if(a.get(Qb)==="event"){var b=(new Date).getTime(),c=a.b(Db,0),d=a.b(yb,0),c=j.floor(0.2*((b-(c!=d?c:c*1E3))/1E3));c>0&&(a.set(Db,b),a.set(P,j.min(10,a.b(P,0)+c)));a.b(P,0)<=0&&a[v]()}},yd=function(a){a.get(Qb)==="event"&&a.set(P,j.max(0,a.b(P,10)-1))};var zd=function(){var a=[];this.add=function(b,c,d){d&&(c=E(""+c));a[k](b+"="+c)};this.toString=function(){return a[A]("&")}},Ad=function(a,b){(b||a.get(ab)!=2)&&a.m(Cb)},Bd=function(a,b){b.add("utmwv","5.1.7");b.add("utms",a.get(Cb));b.add("utmn",pa());var c=I[w].hostname;D(c)||b.add("utmhn",c,!0);c=a.get(Za);c!=100&&b.add("utmsp",c,!0)},Dd=function(a,b){b.add("utmac",a.get(Ca));a.get(Sb)&&b.add("utmni",1);Cd(a,b);J.p&&b.add("aip",1);b.add("utmu",Dc.ya())},Cd=function(a,b){function c(a,b){b&&d[k](a+
"="+b+";")}var d=[];c("__utma",pc(a));c("__utmz",vc(a,!1));c("__utmv",sc(a,!0));c("__utmx",kd(a));b.add("utmcc",d[A]("+"),!0)},Ed=function(a,b){a.get(Na)&&(b.add("utmcs",a.get(rb),!0),b.add("utmsr",a.get(mb)),b.add("utmsc",a.get(nb)),b.add("utmul",a.get(qb)),b.add("utmje",a.get(ob)),b.add("utmfl",a.get(pb),!0))},Fd=function(a,b){a.get(Qa)&&a.get(jb)&&b.add("utmdt",a.get(jb),!0);b.add("utmhid",a.get(lb));b.add("utmr",ya(a.get(kb),a.get(M)),!0);b.add("utmp",E(a.get(ib),!0),!0)},Gd=function(a,b){for(var c=
a.get(gb),d=a.get(hb),e=a.get(N)||[],f=0;f<e[s];f++){var i=e[f];i&&(c||(c=new Nc),c.e(8,f,i[o]),c.e(9,f,i[ga]),i[ja]!=3&&c.e(11,f,""+i[ja]))}!D(a.get(Tb))&&!D(a.get(Ub))&&(c||(c=new Nc),c.e(5,1,a.get(Tb)),c.e(5,2,a.get(Ub)),e=a.get(Vb),e!=g&&c.e(5,3,e),e=a.get(Wb),e!=g&&c.j(5,1,e));c?b.add("utme",c.pa(d),!0):d&&b.add("utme",d.n(),!0)},Hd=function(a,b,c){var d=new zd;Ad(a,c);Bd(a,d);d.add("utmt","tran");d.add("utmtid",b.id_,!0);d.add("utmtst",b.affiliation_,!0);d.add("utmtto",b.total_,!0);d.add("utmttx",
b.tax_,!0);d.add("utmtsp",b.shipping_,!0);d.add("utmtci",b.city_,!0);d.add("utmtrg",b.state_,!0);d.add("utmtco",b.country_,!0);!c&&Dd(a,d);return d[r]()},Id=function(a,b,c){var d=new zd;Ad(a,c);Bd(a,d);d.add("utmt","item");d.add("utmtid",b.transId_,!0);d.add("utmipc",b.sku_,!0);d.add("utmipn",b.name_,!0);d.add("utmiva",b.category_,!0);d.add("utmipr",b.price_,!0);d.add("utmiqt",b.quantity_,!0);!c&&Dd(a,d);return d[r]()},Jd=function(a,b){var c=a.get(Qb);if(c=="page")c=new zd,Ad(a,b),Bd(a,c),Gd(a,c),
Ed(a,c),Fd(a,c),b||Dd(a,c),c=[c[r]()];else if(c=="event")c=new zd,Ad(a,b),Bd(a,c),c.add("utmt","event"),Gd(a,c),Ed(a,c),Fd(a,c),!b&&Dd(a,c),c=[c[r]()];else if(c=="var")c=new zd,Ad(a,b),Bd(a,c),c.add("utmt","var"),!b&&Dd(a,c),c=[c[r]()];else if(c=="trans")for(var c=[],d=a.get(fb),e=0;e<d[s];++e){c[k](Hd(a,d[e],b));for(var f=d[e].items_,i=0;i<f[s];++i)c[k](Id(a,f[i],b))}else c=="social"?b?c=[]:(c=new zd,Ad(a,b),Bd(a,c),c.add("utmt","social"),c.add("utmsn",a.get(Xb),!0),c.add("utmsa",a.get($b),!0),c.add("utmsid",
a.get(ac),!0),Gd(a,c),Ed(a,c),Fd(a,c),Dd(a,c),c=[c[r]()]):c=[];return c},xd=function(a){var b,c=a.get(Rb),d=a.get(ab);if(d==0||d==2){var e=a.get($a)+"?";b=Jd(a,!0);for(var f=0,i=b[s];f<i;f++)Aa(b[f],d!=2&&f==i-1&&c,e,!0)}if(d==1||d==2){b=Jd(a);f=0;for(i=b[s];f<i;f++)try{Aa(b[f],f==i-1&&c)}catch(m){m&&za(m[o],g,m.message)}}};var Kd="https:"==I[w].protocol?"https://ssl.google-analytics.com":"http://www.google-analytics.com",Ld=function(a){ca(this,"len");this.message=a+"-8192"},Md=function(a){ca(this,"ff2post");this.message=a+"-2036"},Aa=function(a,b,c,d){b=b||qa;if(d||a[s]<=2036)Nd(a,b,c);else if(a[s]<=8192){if(U[la].userAgent[n]("Firefox")>=0&&![].reduce)throw new Md(a[s]);Od(a,b)||Pd(a,b)}else throw new Ld(a[s]);},Nd=function(a,b,c){var c=c||Kd+"/__utm.gif?",d=new Image(1,1);d.src=c+a;d.onload=function(){d.onload=h;
b()}},Od=function(a,b){var c,d=Kd+"/p/__utm.gif",e=U.XDomainRequest;if(e)c=new e,c.open("POST",d);else if(e=U.XMLHttpRequest)e=new e,"withCredentials"in e&&(c=e,c.open("POST",d,!0),c.setRequestHeader("Content-Type","text/plain"));if(c)return c.onreadystatechange=function(){c.readyState==4&&(b(),c=h)},c.send(a),!0},Pd=function(a,b){if(I.body){a=aa(a);try{var c=I.createElement('<iframe name="'+a+'"></iframe>')}catch(d){c=I.createElement("iframe"),ca(c,a)}c.height="0";c.width="0";c.style.display="none";
c.style.visibility="hidden";var e=I[w],e=Kd+"/u/post_iframe.html#"+aa(e.protocol+"//"+e[ia]+"/favicon.ico"),f=function(){c.src="";c.parentNode&&c.parentNode.removeChild(c)};ra(U,"beforeunload",f);var i=!1,m=0,p=function(){if(!i){try{if(m>9||c.contentWindow[w][ia]==I[w][ia]){i=!0;f();sa(U,"beforeunload",f);b();return}}catch(a){}m++;setTimeout(p,200)}};ra(c,"load",p);I.body.appendChild(c);c.src=e}else Ec(function(){Pd(a,b)},100)};var $=function(){this.p=!1;this.A={};this.B=[];this.ra=0;this._gasoCPath=this._gasoDomain=g;Q($[t],"_createTracker",$[t].k,55);Q($[t],"_getTracker",$[t].ta,0);Q($[t],"_getTrackerByName",$[t].o,51);Q($[t],"_getTrackers",$[t].ua,130);Q($[t],"_anonymizeIp",$[t].sa,16);ec()};C=$[t];C.ta=function(a,b){return this.k(a,g,b)};C.k=function(a,b,c){b&&F(23);c&&F(67);b==g&&(b="~"+J.ra++);a=new R(b,a,c);J.A[b]=a;J.B[k](a);return a};C.o=function(a){a=a||"";return J.A[a]||J.k(g,a)};C.ua=function(){return J.B[da](0)};
C.sa=function(){this.p=!0};var Qd=function(a){if(I.webkitVisibilityState=="prerender")return!1;a();return!0};var J=new $;var Rd=U._gat;Rd&&typeof Rd._getTracker=="function"?J=Rd:U._gat=J;var Kc=new X;(function(a){if(!Qd(a)){F(123);var b=!1,c=function(){!b&&Qd(a)&&(F(124),b=!0,sa(I,"webkitvisibilitychange",c))};ra(I,"webkitvisibilitychange",c)}})(function(){var a=U._gaq,b=!1;if(a&&typeof a[k]=="function"&&(b=Object[t][r].call(Object(a))=="[object Array]",!b)){Kc=a;return}U._gaq=Kc;b&&Kc[k].apply(Kc,a)});})();



//stuHover.js

/* ================================================================ 
This copyright notice must be kept untouched in the stylesheet at 
all times.

The original version of this script and the associated (x)html
is available at http://www.stunicholls.com/menu/pro_drop_1.html
Copyright (c) 2005-2007 Stu Nicholls. All rights reserved.
This script and the associated (x)html may be modified in any 
way to fit your requirements.
=================================================================== */

stuHover = function() {
	var cssRule;
	var newSelector;
	for (var i = 0; i < document.styleSheets.length; i++)
		for (var x = 0; x < document.styleSheets[i].rules.length ; x++)
			{
			cssRule = document.styleSheets[i].rules[x];
			if (cssRule.selectorText.indexOf("LI:hover") != -1)
			{
				 newSelector = cssRule.selectorText.replace(/LI:hover/gi, "LI.iehover");
				document.styleSheets[i].addRule(newSelector , cssRule.style.cssText);
			}
		}
	var getElm = document.getElementById("nav").getElementsByTagName("LI");
	for (var i=0; i<getElm.length; i++) {
		getElm[i].onmouseover=function() {
			this.className+=" iehover";
		}
		getElm[i].onmouseout=function() {
			this.className=this.className.replace(new RegExp(" iehover\\b"), "");
		}
	}
}

stuHover2 = function() {
	var cssRule;
	var newSelector;
	for (var i = 0; i < document.styleSheets.length; i++)
		for (var x = 0; x < document.styleSheets[i].rules.length ; x++)
			{
			cssRule = document.styleSheets[i].rules[x];
			if (cssRule.selectorText.indexOf("LI:hover") != -1)
			{
				 newSelector = cssRule.selectorText.replace(/LI:hover/gi, "LI.iehover");
				document.styleSheets[i].addRule(newSelector , cssRule.style.cssText);
			}
		}
	var getElm = document.getElementById("prod_nav").getElementsByTagName("LI");
	for (var i=0; i<getElm.length; i++) {
		getElm[i].onmouseover=function() {
			this.className+=" iehover";
		}
		getElm[i].onmouseout=function() {
			this.className=this.className.replace(new RegExp(" iehover\\b"), "");
		}
	}
}

if (window.attachEvent) window.attachEvent("onload", stuHover);
if (window.attachEvent) window.attachEvent("onload", stuHover2);



// jquery.cj-object-scaler.js

/*global jQuery */
/* ****************************************************************************

	CJ Object Scaler jQuery Plug-In v2.1.2

	Copyright (c) 2010, Doug Jones. All rights reserved.
	
	Redistribution and use in source and binary forms, with or without
	modification, are permitted provided that the following conditions are met:
	
	Redistributions of source code must retain the above copyright notice, this
	list of conditions and the following disclaimer. Redistributions in binary
	form must reproduce the above copyright notice, this list of conditions and
	the following disclaimer in the documentation and/or other materials
	provided with the distribution. Neither the name BernieCode nor
	the names of its contributors may be used to endorse or promote products
	derived from this software without specific prior written permission. 
	
	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
	AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
	ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
	ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
	DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
	SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
	CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
	LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
	OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
	DAMAGE.
	
	For more information please visit www.cjboco.com.
	
	Example:
	
	jQuery("#myImage").cjObjectScaler({
		destElem: jQuery("#myParent"),	// option parent node. If not passed, it will use it's immediate parent
		method: "fit",					// fit | fill (default)
		fade: 500						// 0 no fade, positive integer fade duration
	}, function() {
		// custom callback function called when scaling is complete...
	});
	
	CHANGELOG
	
		v1.0	09/10/08 -	Initial Release
		v2.0	09/22/09 -	Coverted it to a jQuery plug-in
		v2.0.1	10/14/09 -	Fixed a bug where the scaling function
								wasn't being triggered, do to the
								image already being loaded.
								(Discovered by Ben Visser)
		v2.1	05/13/10 -	Added a new image onLoad check.
		v2.1.1	05/14/10 -	The border width check was failing in IE
								Big thanks to Funger for discovering this bug.
		v2.1.2 	06/10/10 -	It was recommended to add a callback function,
								which is called once the scaling is complete
								*Credit goes to Chris Bellew <Chris.Bellew@luxus.fi>
								for this. Thanks Chris!
	

**************************************************************************** */

/*
 jQuery('img.photo',this).imagesLoaded(myFunction)
 execute a callback when all images have loaded.
 needed because .load() doesn't work on cached images

 mit license. paul irish. 2010.
 webkit fix from Oren Solomianik. thx!

 callback function is passed the last image to load
 as an argument, and the collection as `this`
*/
(function ($) {
	jQuery.fn.imagesLoaded = function (callback) {
		var elems = this.filter('img'),
			len = elems.length;
		elems.bind('load', function () {
			if (--len <= 0) {
				callback.call(elems, this);
			}
		}).each(function () {
			// cached images don't fire load sometimes, so we reset src.
			if (this.complete || this.complete === undefined) {
				var src = this.src;
				// webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
				this.src = '#';
				this.src = src;
			}
		});
	};
})(jQuery);

/*
 CJ Object Scaler
*/
(function ($) {
	jQuery.fn.cjObjectScaler = function (options, callback) {

		/* 
			user variables (settings)
		***************************************/
		var settings = {
			// must be a jQuery object
			method: "fill",
			// the parent object to scale our object into
			destElem: null,
			// fit|fill
			fade: 0 // if positive value, do hide/fadeIn
		};

		/* 
			system variables
		***************************************/
		var sys = {
			// function parameters
			version: '2.1.2',
			elem: null
		};

		/* 
			scale the image
		***************************************/

		function scaleObj(obj) {

			// declare some local variables
			var destW = jQuery(settings.destElem).width(),
				destH = jQuery(settings.destElem).height(),
				ratioX, ratioY, scale, newWidth, newHeight, 
				borderW = parseInt(jQuery(obj).css("borderLeftWidth"), 10) + parseInt(jQuery(obj).css("borderRightWidth"), 10),
				borderH = parseInt(jQuery(obj).css("borderTopWidth"), 10) + parseInt(jQuery(obj).css("borderBottomWidth"), 10),
				objW = jQuery(obj).width(),
				objH = jQuery(obj).height();
				
			// check for valid border values. IE takes in account border size when calculating width/height so just set to 0
			borderW = isNaN(borderW) ? 0 : borderW;
			borderH = isNaN(borderH) ? 0 : borderH;
			
			// calculate scale ratios
			ratioX = destW / jQuery(obj).width();
			ratioY = destH / jQuery(obj).height();

			// Determine which algorithm to use
			if (!jQuery(obj).hasClass("cf_image_scaler_fill") && (jQuery(obj).hasClass("cf_image_scaler_fit") || settings.method === "fit")) {
				scale = ratioX < ratioY ? ratioX : ratioY;
			} else if (!jQuery(obj).hasClass("cf_image_scaler_fit") && (jQuery(obj).hasClass("cf_image_scaler_fill") || settings.method === "fill")) {
				scale = ratioX > ratioY ? ratioX : ratioY;
			}

			// calculate our new image dimensions
			newWidth = parseInt(jQuery(obj).width() * scale, 10) - borderW;
			newHeight = parseInt(jQuery(obj).height() * scale, 10) - borderH;
			
			// Set new dimensions & offset
			jQuery(obj).css({
				"width": newWidth + "px",
				"height": newHeight + "px",
				"position": "absolute",
				"top": (parseInt((destH - newHeight) / 2, 10) - parseInt(borderH / 2, 10)) + "px",
				"left": (parseInt((destW - newWidth) / 2, 10) - parseInt(borderW / 2, 10)) + "px"
			}).attr({
				"width": newWidth,
				"height": newHeight
			});

			// do our fancy fade in, if user supplied a fade amount
			if (settings.fade > 0) {
				jQuery(obj).fadeIn(settings.fade);
			}
			
			// cal the callback function if it was provided
			if (typeof callback === "function") {
				callback();
			}

		}

		/* 
			set up any user passed variables
		***************************************/
		if (typeof options === "object") {
			jQuery.extend(settings, options);
		} else if (typeof options === "function") {
			// be sure that they are passing options and not just a callback function.
			callback = options;
		}

		/* 
			main
		***************************************/
		return this.each(function () {
			
			sys.elem = this;

			// if they don't provide a destObject, use parent
			if (settings.destElem === null) {

				settings.destElem = jQuery(sys.elem).parent();
			}

			// need to make sure the user set the parent's position. Things go bonker's if not set.
			// valid values: absolute|relative|fixed
			if (jQuery(settings.destElem).css("position") === "static") {
				jQuery(settings.destElem).css({
					"position": "relative"
				});
			}

			// if our object to scale is an image, we need to make sure it's loaded before we continue.
			if (typeof sys.elem === "object" && typeof settings.destElem === "object" && typeof settings.method === "string") {
				
				// if the user supplied a fade amount, hide our image
				if (settings.fade > 0) {
					jQuery(sys.elem).hide();
				}
				
				if (sys.elem.nodeName === "IMG") {
					
					// to fix the weird width/height caching issue we set the image dimensions to be auto;
					jQuery(sys.elem).width("auto");
					jQuery(sys.elem).height("auto");
					
					// wait until the image is loaded before scaling
					jQuery(sys.elem).imagesLoaded(function () {
						scaleObj(this);
					});
					
				} else {
				
					// scale immediately
					scaleObj(jQuery(sys.elem));
				}

			} else {

				// wonky parameters were not passed
				alert("CJ Object Scaler could not initialize. Bad parameters.");
				return;

			}

		});

	};
})(jQuery);


//jquery.validationEngine.js

/*
 * Inline Form Validation Engine 2.2, jQuery plugin
 *
 * Copyright(c) 2010, Cedric Dugas
 * http://www.position-absolute.com
 *
 * 2.0 Rewrite by Olivier Refalo
 * http://www.crionics.com
 *
 * Form validation engine allowing custom regex rules to be added.
 * Licensed under the MIT License
 */
(function ($) {

    var methods = {

        /**
        * Kind of the constructor, called before any action
        * @param {Map} user options
        */
        init: function (options) {
            var form = this;
            if (!form.data('jqv') || form.data('jqv') == null) {
                methods._saveOptions(form, options);

                // bind all formError elements to close on click
                $(".formError").live("click", function () {
                    $(this).fadeOut(150, function () {

                        // remove prompt once invisible
                        $(this).remove();
                    });
                });
            }
        },
        /**
        * Attachs jQuery.validationEngine to form.submit and field.blur events
        * Takes an optional params: a list of options
        * ie. jQuery("#formID1").validationEngine('attach', {promptPosition : "centerRight"});
        */
        attach: function (userOptions) {
            var form = this;
            var options;

            if (userOptions)
                options = methods._saveOptions(form, userOptions);
            else
                options = form.data('jqv');

            var validateAttribute = (form.find("[data-validation-engine*=validate]")) ? "data-validation-engine" : "class";

            if (!options.binded) {
                if (options.bindMethod == "bind") {

                    // bind fields
                    form.find("[class*=validate]:not([type=checkbox])").bind(options.validationEventTrigger, methods._onFieldEvent);
                    form.find("[class*=validate][type=checkbox]").bind("click", methods._onFieldEvent);

                    // bind form.submit
                    form.bind("submit", methods._onSubmitEvent);
                } else if (options.bindMethod == "live") {
                    // bind fields with LIVE (for persistant state)
                    form.find("[class*=validate]:not([type=checkbox])").live(options.validationEventTrigger, methods._onFieldEvent);
                    form.find("[class*=validate][type=checkbox]").live("click", methods._onFieldEvent);

                    // bind form.submit
                    form.live("submit", methods._onSubmitEvent);
                }

                options.binded = true;
            }

        },
        /**
        * Unregisters any bindings that may point to jQuery.validaitonEngine
        */
        detach: function () {
            var form = this;
            var options = form.data('jqv');
            if (options.binded) {

                // unbind fields
                form.find("[class*=validate]").not("[type=checkbox]").unbind(options.validationEventTrigger, methods._onFieldEvent);
                form.find("[class*=validate][type=checkbox]").unbind("click", methods._onFieldEvent);
                // unbind form.submit
                form.unbind("submit", methods.onAjaxFormComplete);


                // unbind live fields (kill)
                form.find("[class*=validate]").not("[type=checkbox]").die(options.validationEventTrigger, methods._onFieldEvent);
                form.find("[class*=validate][type=checkbox]").die("click", methods._onFieldEvent);
                // unbind form.submit
                form.die("submit", methods.onAjaxFormComplete);

                form.removeData('jqv');
            }
        },
        /**
        * Validates the form fields, shows prompts accordingly.
        * Note: There is no ajax form validation with this method, only field ajax validation are evaluated
        *
        * @return true if the form validates, false if it fails
        */
        validate: function () {
            return methods._validateFields(this);
        },
        /**
        * Validates one field, shows prompt accordingly.
        * Note: There is no ajax form validation with this method, only field ajax validation are evaluated
        *
        * @return true if the form validates, false if it fails
        */
        validateField: function (el) {
            var options = $(this).data('jqv');
            return methods._validateField($(el), options);
        },
        /**
        * Validates the form fields, shows prompts accordingly.
        * Note: this methods performs fields and form ajax validations(if setup)
        *
        * @return true if the form validates, false if it fails, undefined if ajax is used for form validation
        */
        validateform: function () {
            return methods._onSubmitEvent.call(this);
        },
        /**
        * Displays a prompt on a element.
        * Note that the element needs an id!
        *
        * @param {String} promptText html text to display type
        * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
        * @param {String} possible values topLeft, topRight, bottomLeft, centerRight, bottomRight
        */
        showPrompt: function (promptText, type, promptPosition, showArrow) {

            var form = this.closest('form');
            var options = form.data('jqv');
            // No option, take default one
            if (!options) options = methods._saveOptions(this, options);
            if (promptPosition)
                options.promptPosition = promptPosition;
            options.showArrow = showArrow == true;

            methods._showPrompt(this, promptText, type, false, options);
        },
        /**
        * Closes all error prompts on the page
        */
        hidePrompt: function () {
            var promptClass = "." + methods._getClassName($(this).attr("id")) + "formError";
            $(promptClass).fadeTo("fast", 0.3, function () {
                $(this).remove();
            });
        },
        /**
        * Closes form error prompts, CAN be invidual
        */
        hide: function () {
            var closingtag;
            if ($(this).is("form")) {
                closingtag = "parentForm" + $(this).attr('id');
            } else {
                closingtag = $(this).attr('id') + "formError";
            }
            $('.' + closingtag).fadeTo("fast", 0.3, function () {
                $(this).remove();
            });
        },
        /**
        * Closes all error prompts on the page
        */
        hideAll: function () {
            $('.formError').fadeTo("fast", 0.3, function () {
                $(this).remove();
            });
        },
        /**
        * Typically called when user exists a field using tab or a mouse click, triggers a field
        * validation
        */
        _onFieldEvent: function () {
            var field = $(this);
            var form = field.closest('form');
            var options = form.data('jqv');
            // validate the current field
            methods._validateField(field, options);
        },
        /**
        * Called when the form is submited, shows prompts accordingly
        *
        * @param {jqObject}
        *            form
        * @return false if form submission needs to be cancelled
        */
        _onSubmitEvent: function () {
            var form = $(this);
            var options = form.data('jqv');

            // validate each field (- skip field ajax validation, no necessary since we will perform an ajax form validation)
            var r = methods._validateFields(form, true);

            if (r && options.ajaxFormValidation) {
                methods._validateFormWithAjax(form, options);
                return false;
            }

            if (options.onValidationComplete) {
                options.onValidationComplete(form, r);
                return false;
            }
            return r;
        },

        /**
        * Return true if the ajax field validations passed so far
        * @param {Object} options
        * @return true, is all ajax validation passed so far (remember ajax is async)
        */
        _checkAjaxStatus: function (options) {
            var status = true;
            $.each(options.ajaxValidCache, function (key, value) {
                if (!value) {
                    status = false;
                    // break the each
                    return false;
                }
            });
            return status;
        },
        /**
        * Validates form fields, shows prompts accordingly
        *
        * @param {jqObject}
        *            form
        * @param {skipAjaxFieldValidation}
        *            boolean - when set to true, ajax field validation is skipped, typically used when the submit button is clicked
        *
        * @return true if form is valid, false if not, undefined if ajax form validation is done
        */
        _validateFields: function (form, skipAjaxValidation) {
            var options = form.data('jqv');

            // this variable is set to true if an error is found
            var errorFound = false;

            // Trigger hook, start validation
            form.trigger("jqv.form.validating");
            // first, evaluate status of non ajax fields
            form.find('[class*=validate]').not(':hidden').each(function () {
                var field = $(this);
                errorFound |= methods._validateField(field, options, skipAjaxValidation);
            });
            // second, check to see if all ajax calls completed ok
            // errorFound |= !methods._checkAjaxStatus(options);

            // thrird, check status and scroll the container accordingly
            form.trigger("jqv.form.result", [errorFound]);

            if (errorFound) {

                if (options.scroll) {

                    // get the position of the first error, there should be at least one, no need to check this
                    //var destination = form.find(".formError:not('.greenPopup'):first").offset().top;

                    // look for the visually top prompt
                    var destination = Number.MAX_VALUE;
                    var fixleft = 0;
                    var lst = $(".formError:not('.greenPopup')");

                    for (var i = 0; i < lst.length; i++) {
                        var d = $(lst[i]).offset().top;
                        if (d < destination) {
                            destination = d;
                            fixleft = $(lst[i]).offset().left;
                        }
                    }

                    if (!options.isOverflown)
                        $("html:not(:animated),body:not(:animated)").animate({
                            scrollTop: destination,
                            scrollLeft: fixleft
                        }, 1100);
                    else {
                        var overflowDIV = $(options.overflownDIV);
                        var scrollContainerScroll = overflowDIV.scrollTop();
                        var scrollContainerPos = -parseInt(overflowDIV.offset().top);

                        destination += scrollContainerScroll + scrollContainerPos - 5;
                        var scrollContainer = $(options.overflownDIV + ":not(:animated)");

                        scrollContainer.animate({
                            scrollTop: destination
                        }, 1100);

                        $("html:not(:animated),body:not(:animated)").animate({
                            scrollTop: overflowDIV.offset().top,
                            scrollLeft: fixleft
                        }, 1100);
                    }
                }
                return false;
            }
            return true;
        },
        /**
        * This method is called to perform an ajax form validation.
        * During this process all the (field, value) pairs are sent to the server which returns a list of invalid fields or true
        *
        * @param {jqObject} form
        * @param {Map} options
        */
        _validateFormWithAjax: function (form, options) {

            var data = form.serialize();
            var url = (options.ajaxFormValidationURL) ? options.ajaxFormValidationURL : form.attr("action");
            $.ajax({
                type: "POST",
                url: url,
                cache: false,
                dataType: "json",
                data: data,
                form: form,
                methods: methods,
                options: options,
                beforeSend: function () {
                    return options.onBeforeAjaxFormValidation(form, options);
                },
                error: function (data, transport) {
                    methods._ajaxError(data, transport);
                },
                success: function (json) {

                    if (json !== true) {

                        // getting to this case doesn't necessary means that the form is invalid
                        // the server may return green or closing prompt actions
                        // this flag helps figuring it out
                        var errorInForm = false;
                        for (var i = 0; i < json.length; i++) {
                            var value = json[i];

                            var errorFieldId = value[0];
                            var errorField = $($("#" + errorFieldId)[0]);

                            // make sure we found the element
                            if (errorField.length == 1) {

                                // promptText or selector
                                var msg = value[2];
                                // if the field is valid
                                if (value[1] == true) {

                                    if (msg == "" || !msg) {
                                        // if for some reason, status==true and error="", just close the prompt
                                        methods._closePrompt(errorField);
                                    } else {
                                        // the field is valid, but we are displaying a green prompt
                                        if (options.allrules[msg]) {
                                            var txt = options.allrules[msg].alertTextOk;
                                            if (txt)
                                                msg = txt;
                                        }
                                        methods._showPrompt(errorField, msg, "pass", false, options, true);
                                    }

                                } else {
                                    // the field is invalid, show the red error prompt
                                    errorInForm |= true;
                                    if (options.allrules[msg]) {
                                        var txt = options.allrules[msg].alertText;
                                        if (txt)
                                            msg = txt;
                                    }
                                    methods._showPrompt(errorField, msg, "", false, options, true);
                                }
                            }
                        }
                        options.onAjaxFormComplete(!errorInForm, form, json, options);
                    } else
                        options.onAjaxFormComplete(true, form, "", options);
                }
            });

        },
        /**
        * Validates field, shows prompts accordingly
        *
        * @param {jqObject}
        *            field
        * @param {Array[String]}
        *            field's validation rules
        * @param {Map}
        *            user options
        * @return true if field is valid
        */
        _validateField: function (field, options, skipAjaxValidation) {
            if (!field.attr("id"))
                $.error("jQueryValidate: an ID attribute is required for this field: " + field.attr("name") + " class:" +
                field.attr("class"));

            var rulesParsing = field.attr('class');
            var getRules = /validate\[(.*)\]/.exec(rulesParsing);
            if (!getRules)
                return false;
            var str = getRules[1];
            var rules = str.split(/\[|,|\]/);

            // true if we ran the ajax validation, tells the logic to stop messing with prompts
            var isAjaxValidator = false;
            var fieldName = field.attr("name");
            var promptText = "";
            var required = false;
            options.isError = false;
            options.showArrow = true;

            for (var i = 0; i < rules.length; i++) {

                var errorMsg = undefined;
                switch (rules[i]) {

                    case "required":
                        required = true;
                        errorMsg = methods._required(field, rules, i, options);
                        break;
                    case "custom":
                        errorMsg = methods._customRegex(field, rules, i, options);
                        break;
                    case "ajax":
                        // ajax has its own prompts handling technique
                        if (!skipAjaxValidation) {
                            methods._ajax(field, rules, i, options);
                            isAjaxValidator = true;
                        }
                        break;
                    case "minSize":
                        errorMsg = methods._minSize(field, rules, i, options);
                        break;
                    case "maxSize":
                        errorMsg = methods._maxSize(field, rules, i, options);
                        break;
                    case "min":
                        errorMsg = methods._min(field, rules, i, options);
                        break;
                    case "max":
                        errorMsg = methods._max(field, rules, i, options);
                        break;
                    case "past":
                        errorMsg = methods._past(field, rules, i, options);
                        break;
                    case "future":
                        errorMsg = methods._future(field, rules, i, options);
                        break;
                    case "maxCheckbox":
                        errorMsg = methods._maxCheckbox(field, rules, i, options);
                        field = $($("input[name='" + fieldName + "']"));
                        break;
                    case "minCheckbox":
                        errorMsg = methods._minCheckbox(field, rules, i, options);
                        field = $($("input[name='" + fieldName + "']"));
                        break;
                    case "equals":
                        errorMsg = methods._equals(field, rules, i, options);
                        break;
                    case "funcCall":
                        errorMsg = methods._funcCall(field, rules, i, options);
                        break;

                    default:
                        //$.error("jQueryValidator rule not found"+rules[i]);
                }
                if (errorMsg !== undefined) {
                    promptText += errorMsg + "<br/>";
                    options.isError = true;

                }

            }
            // If the rules required is not added, an empty field is not validated
            if (!required) {
                if (field.val() == "") options.isError = false;
            }
            // Hack for radio/checkbox group button, the validation go into the
            // first radio/checkbox of the group
            var fieldType = field.attr("type");

            if ((fieldType == "radio" || fieldType == "checkbox") && $("input[name='" + fieldName + "']").size() > 1) {
                field = $($("input[name='" + fieldName + "'][type!=hidden]:first"));
                options.showArrow = false;
            }

            if (options.isError) {

                methods._showPrompt(field, promptText, "", false, options);
            } else {
                if (!isAjaxValidator) methods._closePrompt(field);
            }
            field.trigger("jqv.field.result", [field, options.isError, promptText]);
            return options.isError;
        },
        /**
        * Required validation
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return an error string if validation failed
        */
        _required: function (field, rules, i, options) {
            switch (field.attr("type")) {
                case "text":
                case "password":
                case "textarea":
                case "file":
                default:
                    if (!field.val())
                        return options.allrules[rules[i]].alertText;
                    break;
                case "radio":
                case "checkbox":
                    var name = field.attr("name");
                    if ($("input[name='" + name + "']:checked").size() == 0) {

                        if ($("input[name='" + name + "']").size() == 1)
                            return options.allrules[rules[i]].alertTextCheckboxe;
                        else
                            return options.allrules[rules[i]].alertTextCheckboxMultiple;
                    }
                    break;
                // required for <select>    
                case "select-one":
                    // added by paul@kinetek.net for select boxes, Thank you
                    if (!field.val())
                        return options.allrules[rules[i]].alertText;
                    break;
                case "select-multiple":
                    // added by paul@kinetek.net for select boxes, Thank you
                    if (!field.find("option:selected").val())
                        return options.allrules[rules[i]].alertText;
                    break;
            }
        },
        /**
        * Validate Regex rules
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return an error string if validation failed
        */
        _customRegex: function (field, rules, i, options) {
            var customRule = rules[i + 1];
            var rule = options.allrules[customRule];
            if (!rule) {
                alert("jqv:custom rule not found " + customRule);
                return;
            }

            var ex = rule.regex;
            if (!ex) {
                alert("jqv:custom regex not found " + customRule);
                return;
            }
            var pattern = new RegExp(ex);

            if (!pattern.test(field.val()))
                return options.allrules[customRule].alertText;
        },
        /**
        * Validate custom function outside of the engine scope
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return an error string if validation failed
        */
        _funcCall: function (field, rules, i, options) {
            var functionName = rules[i + 1];
            var fn = window[functionName];
            if (typeof (fn) == 'function')
                return fn(field, rules, i, options);

        },
        /**
        * Field match
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return an error string if validation failed
        */
        _equals: function (field, rules, i, options) {
            var equalsField = rules[i + 1];

            if (field.val() != $("#" + equalsField).val())
                return options.allrules.equals.alertText;
        },
        /**
        * Check the maximum size (in characters)
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return an error string if validation failed
        */
        _maxSize: function (field, rules, i, options) {
            var max = rules[i + 1];
            var len = field.val().length;

            if (len > max) {
                var rule = options.allrules.maxSize;
                return rule.alertText + max + rule.alertText2;
            }
        },
        /**
        * Check the minimum size (in characters)
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return an error string if validation failed
        */
        _minSize: function (field, rules, i, options) {
            var min = rules[i + 1];
            var len = field.val().length;

            if (len < min) {
                var rule = options.allrules.minSize;
                return rule.alertText + min + rule.alertText2;
            }
        },
        /**
        * Check number minimum value
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return an error string if validation failed
        */
        _min: function (field, rules, i, options) {
            var min = parseFloat(rules[i + 1]);
            var len = parseFloat(field.val());

            if (len < min) {
                var rule = options.allrules.min;
                if (rule.alertText2) return rule.alertText + min + rule.alertText2;
                return rule.alertText + min;
            }
        },
        /**
        * Check number maximum value
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return an error string if validation failed
        */
        _max: function (field, rules, i, options) {
            var max = parseFloat(rules[i + 1]);
            var len = parseFloat(field.val());

            if (len > max) {
                var rule = options.allrules.max;
                if (rule.alertText2) return rule.alertText + max + rule.alertText2;
                //orefalo: to review, also do the translations
                return rule.alertText + max;
            }
        },
        /**
        * Checks date is in the past
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return an error string if validation failed
        */
        _past: function (field, rules, i, options) {

            var p = rules[i + 1];
            var pdate = (p.toLowerCase() == "now") ? new Date() : methods._parseDate(p);
            var vdate = methods._parseDate(field.val());

            if (vdate < pdate) {
                var rule = options.allrules.past;
                if (rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
                return rule.alertText + methods._dateToString(pdate);
            }
        },
        /**
        * Checks date is in the future
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return an error string if validation failed
        */
        _future: function (field, rules, i, options) {

            var p = rules[i + 1];
            var pdate = (p.toLowerCase() == "now") ? new Date() : methods._parseDate(p);
            var vdate = methods._parseDate(field.val());

            if (vdate > pdate) {
                var rule = options.allrules.future;
                if (rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
                return rule.alertText + methods._dateToString(pdate);
            }
        },
        /**
        * Max number of checkbox selected
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return an error string if validation failed
        */
        _maxCheckbox: function (field, rules, i, options) {

            var nbCheck = rules[i + 1];
            var groupname = field.attr("name");
            var groupSize = $("input[name='" + groupname + "']:checked").size();
            if (groupSize > nbCheck) {
                options.showArrow = false;
                if (options.allrules.maxCheckbox.alertText2) return options.allrules.maxCheckbox.alertText + " " + nbCheck + " " + options.allrules.maxCheckbox.alertText2;
                return options.allrules.maxCheckbox.alertText;
            }
        },
        /**
        * Min number of checkbox selected
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return an error string if validation failed
        */
        _minCheckbox: function (field, rules, i, options) {

            var nbCheck = rules[i + 1];
            var groupname = field.attr("name");
            var groupSize = $("input[name='" + groupname + "']:checked").size();
            if (groupSize < nbCheck) {
                options.showArrow = false;
                return options.allrules.minCheckbox.alertText + " " + nbCheck + " " +
                options.allrules.minCheckbox.alertText2;
            }
        },
        /**
        * Ajax field validation
        *
        * @param {jqObject} field
        * @param {Array[String]} rules
        * @param {int} i rules index
        * @param {Map}
        *            user options
        * @return nothing! the ajax validator handles the prompts itself
        */
        _ajax: function (field, rules, i, options) {


            var errorSelector = rules[i + 1];
            var rule = options.allrules[errorSelector];
            var extraData = rule.extraData;
            var extraDataDynamic = rule.extraDataDynamic;
            
            if (!extraData)
                extraData = "";

            if (extraDataDynamic) {
                var tmpData = [];
                var domIds = String(extraDataDynamic).split(",");
                for (var i = 0; i < domIds.length; i++) {
                    var id = domIds[i];
                    if ($(id).length) {
                        var inputValue = field.closest("form").find(id).val();
                        var keyValue = id.replace('#', '') + '=' + escape(inputValue);
                        tmpData.push(keyValue);
                    }
                }
                extraDataDynamic = tmpData.join("&");
            } else {
                extraDataDynamic = "";
            }

            if (!options.isError) {
                $.ajax({
                    type: "GET",
                    url: rule.url,
                    cache: false,
                    dataType: "json",
                    data: "fieldId=" + field.attr("id") + "&fieldValue=" + field.val() + "&extraData=" + extraData + "&" + extraDataDynamic,
                    field: field,
                    rule: rule,
                    methods: methods,
                    options: options,
                    beforeSend: function () {
                        // build the loading prompt
                        var loadingText = rule.alertTextLoad;
                        if (loadingText)
                            methods._showPrompt(field, loadingText, "load", true, options);
                    },
                    error: function (data, transport) {
                        methods._ajaxError(data, transport);
                    },
                    success: function (json) {

                        // asynchronously called on success, data is the json answer from the server
                        var errorFieldId = json[0];
                        var errorField = $($("#" + errorFieldId)[0]);
                        // make sure we found the element
                        if (errorField.length == 1) {
                            var status = json[1];
                            // read the optional msg from the server
                            var msg = json[2];
                            if (!status) {
                                // Houston we got a problem - display an red prompt
                                options.ajaxValidCache[errorFieldId] = false;
                                options.isError = true;

                                // resolve the msg prompt
                                if (msg) {
                                    if (options.allrules[msg]) {
                                        var txt = options.allrules[msg].alertText;
                                        if (txt)
                                            msg = txt;
                                    }
                                }
                                else
                                    msg = rule.alertText;

                                methods._showPrompt(errorField, msg, "", true, options);
                            } else {
                                if (options.ajaxValidCache[errorFieldId] !== undefined)
                                    options.ajaxValidCache[errorFieldId] = true;

                                // resolves the msg prompt
                                if (msg) {
                                    if (options.allrules[msg]) {
                                        var txt = options.allrules[msg].alertTextOk;
                                        if (txt)
                                            msg = txt;
                                    }
                                }
                                else
                                    msg = rule.alertTextOk;

                                // see if we should display a green prompt
                                if (msg)
                                    methods._showPrompt(errorField, msg, "pass", true, options);
                                else
                                    methods._closePrompt(errorField);
                            }
                        }
                    }
                });
            }
        },
        /**
        * Common method to handle ajax errors
        *
        * @param {Object} data
        * @param {Object} transport
        */
        _ajaxError: function (data, transport) {
            if (data.status == 0 && transport == null)
                alert("The page is not served from a server! ajax call failed");
            else if (typeof console != "undefined")
                console.log("Ajax error: " + data.status + " " + transport);
        },
        /**
        * date -> string
        *
        * @param {Object} date
        */
        _dateToString: function (date) {

            return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
        },
        /**
        * Parses an ISO date
        * @param {String} d
        */
        _parseDate: function (d) {

            var dateParts = d.split("-");
            if (dateParts == d)
                dateParts = d.split("/");
            return new Date(dateParts[0], (dateParts[1] - 1), dateParts[2]);
        },
        /**
        * Builds or updates a prompt with the given information
        *
        * @param {jqObject} field
        * @param {String} promptText html text to display type
        * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
        * @param {boolean} ajaxed - use to mark fields than being validated with ajax
        * @param {Map} options user options
        */
        _showPrompt: function (field, promptText, type, ajaxed, options, ajaxform) {
            var prompt = methods._getPrompt(field);
            // The ajax submit errors are not see has an error in the form,
            // When the form errors are returned, the engine see 2 bubbles, but those are ebing closed by the engine at the same time
            // Because no error was found befor submitting
            if (ajaxform) prompt = false;
            if (prompt)
                methods._updatePrompt(field, prompt, promptText, type, ajaxed, options);
            else
                methods._buildPrompt(field, promptText, type, ajaxed, options);
        },
        /**
        * Builds and shades a prompt for the given field.
        *
        * @param {jqObject} field
        * @param {String} promptText html text to display type
        * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
        * @param {boolean} ajaxed - use to mark fields than being validated with ajax
        * @param {Map} options user options
        */
        _buildPrompt: function (field, promptText, type, ajaxed, options) {

            // create the prompt
            var prompt = $('<div>');
            prompt.addClass(methods._getClassName(field.attr("id")) + "formError");
            // add a class name to identify the parent form of the prompt
            if (field.is(":input")) prompt.addClass("parentForm" + methods._getClassName(field.parents('form').attr("id")));
            prompt.addClass("formError");

            switch (type) {
                case "pass":
                    prompt.addClass("greenPopup");
                    break;
                case "load":
                    prompt.addClass("blackPopup");
            }
            if (ajaxed)
                prompt.addClass("ajaxed");

            // create the prompt content
            var promptContent = $('<div>').addClass("formErrorContent").html(promptText).appendTo(prompt);
            // create the css arrow pointing at the field
            // note that there is no triangle on max-checkbox and radio
            if (options.showArrow) {
                var arrow = $('<div>').addClass("formErrorArrow");

                switch (options.promptPosition) {
                    case "bottomLeft":
                    case "bottomRight":
                        prompt.find(".formErrorContent").before(arrow);
                        arrow.addClass("formErrorArrowBottom").html('<div class="line1"><!-- --></div><div class="line2"><!-- --></div><div class="line3"><!-- --></div><div class="line4"><!-- --></div><div class="line5"><!-- --></div><div class="line6"><!-- --></div><div class="line7"><!-- --></div><div class="line8"><!-- --></div><div class="line9"><!-- --></div><div class="line10"><!-- --></div>');
                        break;
                    case "topLeft":
                    case "topRight":
                        arrow.html('<div class="line10"><!-- --></div><div class="line9"><!-- --></div><div class="line8"><!-- --></div><div class="line7"><!-- --></div><div class="line6"><!-- --></div><div class="line5"><!-- --></div><div class="line4"><!-- --></div><div class="line3"><!-- --></div><div class="line2"><!-- --></div><div class="line1"><!-- --></div>');
                        prompt.append(arrow);
                        break;
                }
            }

            //Cedric: Needed if a container is in position:relative
            // insert prompt in the form or in the overflown container?
            if (options.isOverflown)
                field.before(prompt);
            else
                $("body").append(prompt);

            var pos = methods._calculatePosition(field, prompt, options);
            prompt.css({
                "top": pos.callerTopPosition,
                "left": pos.callerleftPosition,
                "marginTop": pos.marginTopSize,
                "opacity": 0
            });

            return prompt.animate({
                "opacity": 0.87
            });

        },
        /**
        * Updates the prompt text field - the field for which the prompt
        * @param {jqObject} field
        * @param {String} promptText html text to display type
        * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
        * @param {boolean} ajaxed - use to mark fields than being validated with ajax
        * @param {Map} options user options
        */
        _updatePrompt: function (field, prompt, promptText, type, ajaxed, options) {

            if (prompt) {
                if (type == "pass")
                    prompt.addClass("greenPopup");
                else
                    prompt.removeClass("greenPopup");

                if (type == "load")
                    prompt.addClass("blackPopup");
                else
                    prompt.removeClass("blackPopup");

                if (ajaxed)
                    prompt.addClass("ajaxed");
                else
                    prompt.removeClass("ajaxed");

                prompt.find(".formErrorContent").html(promptText);

                var pos = methods._calculatePosition(field, prompt, options);
                prompt.animate({
                    "top": pos.callerTopPosition,
                    "marginTop": pos.marginTopSize
                });
            }
        },
        /**
        * Closes the prompt associated with the given field
        *
        * @param {jqObject}
        *            field
        */
        _closePrompt: function (field) {

            var prompt = methods._getPrompt(field);
            if (prompt)
                prompt.fadeTo("fast", 0, function () {
                    prompt.remove();
                });
        },
        closePrompt: function (field) {
            return methods._closePrompt(field);
        },
        /**
        * Returns the error prompt matching the field if any
        *
        * @param {jqObject}
        *            field
        * @return undefined or the error prompt (jqObject)
        */
        _getPrompt: function (field) {

            var className = "." + methods._getClassName(field.attr("id")) + "formError";
            var match = $(className)[0];
            if (match)
                return $(match);
        },
        /**
        * Calculates prompt position
        *
        * @param {jqObject}
        *            field
        * @param {jqObject}
        *            the prompt
        * @param {Map}
        *            options
        * @return positions
        */
        _calculatePosition: function (field, promptElmt, options) {

            var promptTopPosition, promptleftPosition, marginTopSize;
            var fieldWidth = field.width();
            var promptHeight = promptElmt.height();

            var overflow = options.isOverflown;
            if (overflow) {
                // is the form contained in an overflown container?
                promptTopPosition = promptleftPosition = 0;
                // compensation for the arrow
                marginTopSize = -promptHeight;
            } else {
                var offset = field.offset();
                promptTopPosition = offset.top;
                promptleftPosition = offset.left;
                marginTopSize = 0;
            }

            switch (options.promptPosition) {

                default:
                case "topRight":
                    if (overflow)
                    // Is the form contained in an overflown container?
                        promptleftPosition += fieldWidth - 30;
                    else {
                        promptleftPosition += fieldWidth - 30;
                        promptTopPosition += -promptHeight;
                    }
                    break;
                case "topLeft":
                    promptTopPosition += -promptHeight - 10;
                    break;
                case "centerRight":
                    promptleftPosition += fieldWidth + 13;
                    break;
                case "bottomLeft":
                    promptTopPosition = promptTopPosition + field.height() + 15;
                    break;
                case "bottomRight":
                    promptleftPosition += fieldWidth - 30;
                    promptTopPosition += field.height() + 5;
            }

            return {
                "callerTopPosition": promptTopPosition + "px",
                "callerleftPosition": promptleftPosition + "px",
                "marginTopSize": marginTopSize + "px"
            };
        },
        /**
        * Saves the user options and variables in the form.data
        *
        * @param {jqObject}
        *            form - the form where the user option should be saved
        * @param {Map}
        *            options - the user options
        * @return the user options (extended from the defaults)
        */
        _saveOptions: function (form, options) {

            // is there a language localisation ?
            if ($.validationEngineLanguage)
                var allRules = $.validationEngineLanguage.allRules;
            else
                $.error("jQuery.validationEngine rules are not loaded, plz add localization files to the page");

            var userOptions = $.extend({

                // Name of the event triggering field validation
                validationEventTrigger: "blur",
                // Automatically scroll viewport to the first error
                scroll: true,
                // Opening box position, possible locations are: topLeft,
                // topRight, bottomLeft, centerRight, bottomRight
                promptPosition: "topRight",
                bindMethod: "bind",
                // internal, automatically set to true when it parse a _ajax rule
                inlineAjax: false,
                // if set to true, the form data is sent asynchronously via ajax to the form.action url (get)
                ajaxFormValidation: false,
                // Ajax form validation callback method: boolean onComplete(form, status, errors, options)
                // retuns false if the form.submit event needs to be canceled.
                ajaxFormValidationURL: false,
                // The url to send the submit ajax validation (default to action)
                onAjaxFormComplete: $.noop,
                // called right before the ajax call, may return false to cancel
                onBeforeAjaxFormValidation: $.noop,
                // Stops form from submitting and execute function assiciated with it
                onValidationComplete: false,

                // Used when the form is displayed within a scrolling DIV
                isOverflown: false,
                overflownDIV: "",

                // --- Internals DO NOT TOUCH or OVERLOAD ---
                // validation rules and i18
                allrules: allRules,
                // true when form and fields are binded
                binded: false,
                // set to true, when the prompt arrow needs to be displayed
                showArrow: true,
                // did one of the validation fail ? kept global to stop further ajax validations
                isError: false,
                // Caches field validation status, typically only bad status are created.
                // the array is used during ajax form validation to detect issues early and prevent an expensive submit
                ajaxValidCache: {}

            }, options);

            form.data('jqv', userOptions);
            return userOptions;
        },

        /**
        * Removes forbidden characters from class name
        * @param {String} className
        */
        _getClassName: function (className) {
            return className.replace(":", "_").replace(".", "_");
        }
    };

    /**
    * Plugin entry point.
    * You may pass an action as a parameter or a list of options.
    * if none, the init and attach methods are being called.
    * Remember: if you pass options, the attached method is NOT called automatically
    *
    * @param {String}
    *            method (optional) action
    */
    $.fn.validationEngine = function (method) {

        var form = $(this);
        if (!form[0]) return false;  // stop here if the form does not exist

        if (typeof (method) == 'string' && method.charAt(0) != '_' && methods[method]) {

            // make sure init is called once
            if (method != "showPrompt" && method != "hidePrompt" && method != "hide" && method != "hideAll")
                methods.init.apply(form);

            return methods[method].apply(form, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method == 'object' || !method) {
            // default constructor with or without arguments
            methods.init.apply(form, arguments);
            return methods.attach.apply(form);
        } else {
            $.error('Method ' + method + ' does not exist in jQuery.validationEngine');
        }
    };
})(jQuery);




//jquery.slider.js
// jQuery Slider Plugin
// Egor Khmelev - http://blog.egorkhmelev.com/ - hmelyoff@gmail.com

(function(){

  // Simple Inheritance
  Function.prototype.inheritFrom = function(BaseClass, oOverride){
  	var Inheritance = function() {};
  	Inheritance.prototype = BaseClass.prototype;
  	this.prototype = new Inheritance();
  	this.prototype.constructor = this;
  	this.prototype.baseConstructor = BaseClass;
  	this.prototype.superClass = BaseClass.prototype;

  	if(oOverride){
  		for(var i in oOverride) {
  			this.prototype[i] = oOverride[i];
  		}
  	}
  };
  
  // Format numbers
  Number.prototype.jSliderNice=function(iRoundBase){
  	var re=/^(-)?(\d+)([\.,](\d+))?$/;
  	var iNum=Number(this);
  	var sNum=String(iNum);
  	var aMatches;
  	var sDecPart='';
  	var sTSeparator=' ';
  	if((aMatches = sNum.match(re))){
  		var sIntPart=aMatches[2];
  		var iDecPart=(aMatches[4]) ? Number('0.'+aMatches[4]) : 0;
  		if(iDecPart){
  			var iRF=Math.pow(10, (iRoundBase) ? iRoundBase : 2);
  			iDecPart=Math.round(iDecPart*iRF);
  			sNewDecPart=String(iDecPart);
  			sDecPart = sNewDecPart;
  			if(sNewDecPart.length < iRoundBase){
  				var iDiff = iRoundBase-sNewDecPart.length;
  				for (var i=0; i < iDiff; i++) {
  					sDecPart = "0" + sDecPart;
  				};
  			}
  			sDecPart = "," + sDecPart;
  		} else {
  			if(iRoundBase && iRoundBase != 0){
  				for (var i=0; i < iRoundBase; i++) {
  					sDecPart += "0";
  				};
  				sDecPart = "," + sDecPart;
  			}
  		}
  		var sResult;
  		if(Number(sIntPart) < 1000){
  			sResult = sIntPart+sDecPart;
  		}else{
  			var sNewNum='';
  			var i;
  			for(i=1; i*3<sIntPart.length; i++)
  				sNewNum=sTSeparator+sIntPart.substring(sIntPart.length - i*3, sIntPart.length - (i-1)*3)+sNewNum;
  			sResult = sIntPart.substr(0, 3 - i*3 + sIntPart.length)+sNewNum+sDecPart;
  		}
  		if(aMatches[1])
  			return '-'+sResult;
  		else
  			return sResult;
  	}
  	else{
  		return sNum;
  	}
  };

  this.jSliderIsArray = function( value ){
    if( typeof value == "undefined" ) return false;
    
    if (value instanceof Array ||  // Works quickly in same execution context.
        // If value is from a different execution context then
        // !(value instanceof Object), which lets us early out in the common
        // case when value is from the same context but not an array.
        // The {if (value)} check above means we don't have to worry about
        // undefined behavior of Object.prototype.toString on null/undefined.
        //
        // HACK: In order to use an Object prototype method on the arbitrary
        //   value, the compiler requires the value be cast to type Object,
        //   even though the ECMA spec explicitly allows it.
        (!(value instanceof Object) &&
         (Object.prototype.toString.call(
             /** @type {Object} */ (value)) == '[object Array]') ||

         // In IE all non value types are wrapped as objects across window
         // boundaries (not iframe though) so we have to do object detection
         // for this edge case
         typeof value.length == 'number' &&
         typeof value.splice != 'undefined' &&
         typeof value.propertyIsEnumerable != 'undefined' &&
         !value.propertyIsEnumerable('splice')

        )) {
      return true;
    }
    
    return false;
  }
  
  
})();


// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed

(function(){
  var cache = {};
  
  this.jSliderTmpl = function jSliderTmpl(str, data){
    // Figure out if we're getting a template, or if we need to
    // load the template - and be sure to cache the result.
    var fn = !(/\W/).test(str) ?
      cache[str] = cache[str] ||
        jSliderTmpl(str) :
      
      // Generate a reusable function that will serve as a template
      // generator (and which will be cached).
      new Function("obj",
        "var p=[],print=function(){p.push.apply(p,arguments);};" +
        
        // Introduce the data as local variables using with(){}
        "with(obj){p.push('" +
        
        // Convert the template into pure JavaScript
        str
          .replace(/[\r\t\n]/g, " ")
          .split("<%").join("\t")
          .replace(/((^|%>)[^\t]*)'/g, "$1\r")
          .replace(/\t=(.*?)%>/g, "',$1,'")
          .split("\t").join("');")
          .split("%>").join("p.push('")
          .split("\r").join("\\'")
      + "');}return p.join('');");
    
    // Provide some basic currying to the user
    return data ? fn( data ) : fn;
  };
})();


// Draggable Class
// Egor Khmelev - http://blog.egorkhmelev.com/

(function( $ ){

  this.Draggable = function(){
  	this._init.apply( this, arguments );
  };

  Draggable.prototype = {
  	// Methods for re-init in child class
  	oninit: function(){},
  	events: function(){},
  	onmousedown: function(){
  		this.ptr.css({ position: "absolute" });
  	},
  	onmousemove: function( evt, x, y ){
  		this.ptr.css({ left: x, top: y });
  	},
  	onmouseup: function(){},

  	isDefault: {
  		drag: false,
  		clicked: false,
  		toclick: true,
  		mouseup: false
  	},

  	_init: function(){
  		if( arguments.length > 0 ){
  			this.ptr = $(arguments[0]);
  			this.outer = $(".draggable-outer");

  			this.is = {};
  			$.extend( this.is, this.isDefault );

  			var _offset = this.ptr.offset();
  			this.d = {
  				left: _offset.left,
  				top: _offset.top,
  				width: this.ptr.width(),
  				height: this.ptr.height()
  			};

  			this.oninit.apply( this, arguments );

  			this._events();
  		}
  	},
  	_getPageCoords: function( event ){
  	  if( event.targetTouches && event.targetTouches[0] ){
  	    return { x: event.targetTouches[0].pageX, y: event.targetTouches[0].pageY };
  	  } else
  	    return { x: event.pageX, y: event.pageY };
  	},
  	_bindEvent: function( ptr, eventType, handler ){
  	  var self = this;

  	  if( this.supportTouches_ )
        ptr.get(0).addEventListener( this.events_[ eventType ], handler, false );
  	  
  	  else
  	    ptr.bind( this.events_[ eventType ], handler );
  	},
  	_events: function(){
  		var self = this;

      this.supportTouches_ = ( $.browser.webkit && navigator.userAgent.indexOf("Mobile") != -1 );
      this.events_ = {
        "click": this.supportTouches_ ? "touchstart" : "click",
        "down": this.supportTouches_ ? "touchstart" : "mousedown",
        "move": this.supportTouches_ ? "touchmove" : "mousemove",
        "up"  : this.supportTouches_ ? "touchend" : "mouseup"
      };

      this._bindEvent( $( document ), "move", function( event ){
				if( self.is.drag ){
          event.stopPropagation();
          event.preventDefault();
					self._mousemove( event );
				}
			});
      this._bindEvent( $( document ), "down", function( event ){
				if( self.is.drag ){
          event.stopPropagation();
          event.preventDefault();
				}
			});
      this._bindEvent( $( document ), "up", function( event ){
				self._mouseup( event );
			});
			
      this._bindEvent( this.ptr, "down", function( event ){
				self._mousedown( event );
				return false;
			});
      this._bindEvent( this.ptr, "up", function( event ){
				self._mouseup( event );
			});
			
  		this.ptr.find("a")
  			.click(function(){
  				self.is.clicked = true;

  				if( !self.is.toclick ){
  					self.is.toclick = true;
  					return false;
  				}
  			})
  			.mousedown(function( event ){
  				self._mousedown( event );
  				return false;
  			});

  		this.events();
  	},
  	_mousedown: function( evt ){
  		this.is.drag = true;
  		this.is.clicked = false;
  		this.is.mouseup = false;

  		var _offset = this.ptr.offset();
  		var coords = this._getPageCoords( evt );
  		this.cx = coords.x - _offset.left;
  		this.cy = coords.y - _offset.top;

  		$.extend(this.d, {
  			left: _offset.left,
  			top: _offset.top,
  			width: this.ptr.width(),
  			height: this.ptr.height()
  		});

  		if( this.outer && this.outer.get(0) ){
  			this.outer.css({ height: Math.max(this.outer.height(), $(document.body).height()), overflow: "hidden" });
  		}

  		this.onmousedown( evt );
  	},
  	_mousemove: function( evt ){
  		this.is.toclick = false;
  		var coords = this._getPageCoords( evt );
  		this.onmousemove( evt, coords.x - this.cx, coords.y - this.cy );
  	},
  	_mouseup: function( evt ){
  		var oThis = this;

  		if( this.is.drag ){
  			this.is.drag = false;

  			if( this.outer && this.outer.get(0) ){

  				if( $.browser.mozilla ){
  					this.outer.css({ overflow: "hidden" });
  				} else {
  					this.outer.css({ overflow: "visible" });
  				}

  				if( $.browser.msie && $.browser.version == '6.0' ){
  					this.outer.css({ height: "100%" });
  				} else {
  					this.outer.css({ height: "auto" });
  				}	
  			}

  			this.onmouseup( evt );
  		}
  	}

  };

})( jQuery );



// jQuery Slider (Safari)
// Egor Khmelev - http://blog.egorkhmelev.com/

(function( $ ) {

	$.slider = function( node, settings ){
	  var jNode = $(node);
	  if( !jNode.data( "jslider" ) )
	    jNode.data( "jslider", new jSlider( node, settings ) );
	  
	  return jNode.data( "jslider" );
	};
	
	$.fn.slider = function( action, opt_value ){
	  var returnValue, args = arguments;
	  
	  function isDef( val ){
	    return val !== undefined;
	  };

	  function isDefAndNotNull( val ){
      return val != null;
	  };
	  
		this.each(function(){
		  var self = $.slider( this, action );
		  
		  // do actions
		  if( typeof action == "string" ){
		    switch( action ){
		      case "value":
		        if( isDef( args[ 1 ] ) && isDef( args[ 2 ] ) ){
		          var pointers = self.getPointers();
		          if( isDefAndNotNull( pointers[0] ) && isDefAndNotNull( args[1] ) ){
		            pointers[0].set( args[ 1 ] );
		            pointers[0].setIndexOver();
		          }
		          
		          if( isDefAndNotNull( pointers[1] ) && isDefAndNotNull( args[2] ) ){
		            pointers[1].set( args[ 2 ] );
		            pointers[1].setIndexOver();
		          }
		        }
		        
		        else if( isDef( args[ 1 ] ) ){
		          var pointers = self.getPointers();
		          if( isDefAndNotNull( pointers[0] ) && isDefAndNotNull( args[1] ) ){
		            pointers[0].set( args[ 1 ] );
		            pointers[0].setIndexOver();
		          }
		        }
		        
		        else
  		        returnValue = self.getValue();

		        break;

		      case "prc":
		        if( isDef( args[ 1 ] ) && isDef( args[ 2 ] ) ){
		          var pointers = self.getPointers();
		          if( isDefAndNotNull( pointers[0] ) && isDefAndNotNull( args[1] ) ){
		            pointers[0]._set( args[ 1 ] );
		            pointers[0].setIndexOver();
		          }

		          if( isDefAndNotNull( pointers[1] ) && isDefAndNotNull( args[2] ) ){
		            pointers[1]._set( args[ 2 ] );
		            pointers[1].setIndexOver();
		          }
		        }

		        else if( isDef( args[ 1 ] ) ){
		          var pointers = self.getPointers();
		          if( isDefAndNotNull( pointers[0] ) && isDefAndNotNull( args[1] ) ){
		            pointers[0]._set( args[ 1 ] );
		            pointers[0].setIndexOver();
		          }
		        }

		        else
  		        returnValue = self.getPrcValue();

		        break;

  		    case "calculatedValue":
  		      var value = self.getValue().split(";");
  		      returnValue = "";
  		      for (var i=0; i < value.length; i++) {
  		        returnValue += (i > 0 ? ";" : "") + self.nice( value[i] );
  		      };
  		      
  		      break;
  		      
  		    case "skin":
		        self.setSkin( args[1] );

  		      break;
		    };
		  
		  }
		  
		  // return actual object
		  else if( !action && !opt_value ){
		    if( !jSliderIsArray( returnValue ) )
		      returnValue = [];

		    returnValue.push( slider );
		  }
		});
		
		// flatten array just with one slider
		if( jSliderIsArray( returnValue ) && returnValue.length == 1 )
		  returnValue = returnValue[ 0 ];
		
		return returnValue || this;
	};
  
  var OPTIONS = {

    settings: {
      from: 1,
      to: 10,
      step: 1,
      smooth: true,
      limits: true,
      round: 0,
      value: "5;7",
      dimension: ""
    },
    
    className: "jslider",
    selector: ".jslider-",

    template: jSliderTmpl(
      '<span class="<%=className%>">' +
        '<table><tr><td>' +
          '<div class="<%=className%>-bg">' +
            '<i class="l"><i></i></i><i class="r"><i></i></i>' +
            '<i class="v"><i></i></i>' +
          '</div>' +

          '<div class="<%=className%>-pointer"><i></i></div>' +
          '<div class="<%=className%>-pointer <%=className%>-pointer-to"><i></i></div>' +
        
          '<div class="<%=className%>-label"><span><%=settings.from%></span></div>' +
          '<div class="<%=className%>-label <%=className%>-label-to"><span><%=settings.to%></span><%=settings.dimension%></div>' +

          '<div class="<%=className%>-value"><span></span><%=settings.dimension%></div>' +
          '<div class="<%=className%>-value <%=className%>-value-to"><span></span><%=settings.dimension%></div>' +
          
          '<div class="<%=className%>-scale"><%=scale%></div>'+

        '</td></tr></table>' +
      '</span>'
    )
    
  };

  this.jSlider = function(){
  	return this.init.apply( this, arguments );
  };

  jSlider.prototype = {
    init: function( node, settings ){
      this.settings = $.extend(true, {}, OPTIONS.settings, settings ? settings : {});
      
      // obj.sliderHandler = this;
      this.inputNode = $( node ).hide();
      						
			this.settings.interval = this.settings.to-this.settings.from;
			this.settings.value = this.inputNode.attr("value");
			
			if( this.settings.calculate && $.isFunction( this.settings.calculate ) )
			  this.nice = this.settings.calculate;

			if( this.settings.onstatechange && $.isFunction( this.settings.onstatechange ) )
			  this.onstatechange = this.settings.onstatechange;

      this.is = {
        init: false
      };
			this.o = {};

      this.create();
    },
    
    onstatechange: function(){},
    
    create: function(){
      var $this = this;
      
      this.domNode = $( OPTIONS.template({
        className: OPTIONS.className,
        settings: {
          from: this.nice( this.settings.from ),
          to: this.nice( this.settings.to ),
          dimension: this.settings.dimension
        },
        scale: this.generateScale()
      }) );
      
      this.inputNode.after( this.domNode );
      this.drawScale();
      
      // set skin class
      if( this.settings.skin && this.settings.skin.length > 0 )
        this.setSkin( this.settings.skin );

			this.sizes = {
			  domWidth: this.domNode.width(),
			  domOffset: this.domNode.offset()
			};

      // find some objects
      $.extend(this.o, {
        pointers: {},
        labels: {
          0: {
            o: this.domNode.find(OPTIONS.selector + "value").not(OPTIONS.selector + "value-to")
          },
          1: {
            o: this.domNode.find(OPTIONS.selector + "value").filter(OPTIONS.selector + "value-to")
          }
        },
        limits: {
          0: this.domNode.find(OPTIONS.selector + "label").not(OPTIONS.selector + "label-to"),
          1: this.domNode.find(OPTIONS.selector + "label").filter(OPTIONS.selector + "label-to")
        }
      });

      $.extend(this.o.labels[0], {
        value: this.o.labels[0].o.find("span")
      });

      $.extend(this.o.labels[1], {
        value: this.o.labels[1].o.find("span")
      });

      
      if( !$this.settings.value.split(";")[1] ){
        this.settings.single = true;
        this.domNode.addDependClass("single");
      }

      if( !$this.settings.limits )
        this.domNode.addDependClass("limitless");

      this.domNode.find(OPTIONS.selector + "pointer").each(function( i ){
        var value = $this.settings.value.split(";")[i];
        if( value ){
          $this.o.pointers[i] = new jSliderPointer( this, i, $this );

          var prev = $this.settings.value.split(";")[i-1];
          if( prev && new Number(value) < new Number(prev) ) value = prev;

          value = value < $this.settings.from ? $this.settings.from : value;
          value = value > $this.settings.to ? $this.settings.to : value;
        
          $this.o.pointers[i].set( value, true );
        }
      });
      
      this.o.value = this.domNode.find(".v");
      this.is.init = true;
      
      $.each(this.o.pointers, function(i){
        $this.redraw(this);
      });
      
      (function(self){
        $(window).resize(function(){
          self.onresize();
        });
      })(this);

    },
    
    setSkin: function( skin ){
      if( this.skin_ )
        this.domNode.removeDependClass( this.skin_, "_" );

      this.domNode.addDependClass( this.skin_ = skin, "_" );
    },
    
    setPointersIndex: function( i ){
      $.each(this.getPointers(), function(i){
        this.index( i );
      });
    },
    
    getPointers: function(){
      return this.o.pointers;
    },
    
    generateScale: function(){
      if( this.settings.scale && this.settings.scale.length > 0 ){
        var str = "";
        var s = this.settings.scale;
        var prc = Math.round((100/(s.length-1))*10)/10;
        for( var i=0; i < s.length; i++ ){
          str += '<span style="left: ' + i*prc + '%">' + ( s[i] != '|' ? '<ins>' + s[i] + '</ins>' : '' ) + '</span>';
        };
        return str;
      } else return "";

      return "";
    },
    
    drawScale: function(){
      this.domNode.find(OPTIONS.selector + "scale span ins").each(function(){
        $(this).css({ marginLeft: -$(this).outerWidth()/2 });
      });
    },
    
    onresize: function(){
      var self = this;
			this.sizes = {
			  domWidth: this.domNode.width(),
			  domOffset: this.domNode.offset()
			};

      $.each(this.o.pointers, function(i){
        self.redraw(this);
      });
    },
    
    limits: function( x, pointer ){
  	  // smooth
  	  if( !this.settings.smooth ){
  	    var step = this.settings.step*100 / ( this.settings.interval );
  	    x = Math.round( x/step ) * step;
  	  }
  	  
  	  var another = this.o.pointers[1-pointer.uid];
  	  if( another && pointer.uid && x < another.value.prc ) x = another.value.prc;
  	  if( another && !pointer.uid && x > another.value.prc ) x = another.value.prc;

      // base limit
  	  if( x < 0 ) x = 0;
  	  if( x > 100 ) x = 100;
  	  
      return Math.round( x*10 ) / 10;
    },
    
    redraw: function( pointer ){
      if( !this.is.init ) return false;
      
      this.setValue();
      
      // redraw range line
      if( this.o.pointers[0] && this.o.pointers[1] )
        this.o.value.css({ left: this.o.pointers[0].value.prc + "%", width: ( this.o.pointers[1].value.prc - this.o.pointers[0].value.prc ) + "%" });

      this.o.labels[pointer.uid].value.html(
        this.nice(
          pointer.value.origin
        )
      );
      
      // redraw position of labels
      this.redrawLabels( pointer );

    },
    
    redrawLabels: function( pointer ){

      function setPosition( label, sizes, prc ){
    	  sizes.margin = -sizes.label/2;

        // left limit
        label_left = sizes.border + sizes.margin;
        if( label_left < 0 )
          sizes.margin -= label_left;

        // right limit
        if( sizes.border+sizes.label / 2 > self.sizes.domWidth ){
          sizes.margin = 0;
          sizes.right = true;
        } else
          sizes.right = false;
          
        label.o.css({ left: prc + "%", marginLeft: sizes.margin, right: "auto" });
        if( sizes.right ) label.o.css({ left: "auto", right: 0 });
        return sizes;
      }

      var self = this;
  	  var label = this.o.labels[pointer.uid];
  	  var prc = pointer.value.prc;

  	  var sizes = {
  	    label: label.o.outerWidth(),
  	    right: false,
  	    border: ( prc * this.sizes.domWidth ) / 100
  	  };

      //console.log(this.o.pointers[1-pointer.uid])
      if( !this.settings.single ){
        // glue if near;
        var another = this.o.pointers[1-pointer.uid];
      	var another_label = this.o.labels[another.uid];

        switch( pointer.uid ){
          case 0:
            if( sizes.border+sizes.label / 2 > another_label.o.offset().left-this.sizes.domOffset.left ){
              another_label.o.css({ visibility: "hidden" });
          	  another_label.value.html( this.nice( another.value.origin ) );

            	label.o.css({ visibility: "visible" });

            	prc = ( another.value.prc - prc ) / 2 + prc;
            	if( another.value.prc != pointer.value.prc ){
            	  label.value.html( this.nice(pointer.value.origin) + "&nbsp;&ndash;&nbsp;" + this.nice(another.value.origin) );
              	sizes.label = label.o.outerWidth();
              	sizes.border = ( prc * this.sizes.domWidth ) / 100;
              }
            } else {
            	another_label.o.css({ visibility: "visible" });
            }
            break;

          case 1:
            if( sizes.border - sizes.label / 2 < another_label.o.offset().left - this.sizes.domOffset.left + another_label.o.outerWidth() ){
              another_label.o.css({ visibility: "hidden" });
          	  another_label.value.html( this.nice(another.value.origin) );

            	label.o.css({ visibility: "visible" });

            	prc = ( prc - another.value.prc ) / 2 + another.value.prc;
            	if( another.value.prc != pointer.value.prc ){
            	  label.value.html( this.nice(another.value.origin) + "&nbsp;&ndash;&nbsp;" + this.nice(pointer.value.origin) );
              	sizes.label = label.o.outerWidth();
              	sizes.border = ( prc * this.sizes.domWidth ) / 100;
              }
            } else {
              another_label.o.css({ visibility: "visible" });
            }
            break;
        }
      }

      sizes = setPosition( label, sizes, prc );
      
      /* draw second label */
      if( another_label ){
        var sizes = {
    	    label: another_label.o.outerWidth(),
    	    right: false,
    	    border: ( another.value.prc * this.sizes.domWidth ) / 100
    	  };
        sizes = setPosition( another_label, sizes, another.value.prc );
      }
  	  
	    this.redrawLimits();
    },
    
    redrawLimits: function(){
  	  if( this.settings.limits ){

        var limits = [ true, true ];

        for( key in this.o.pointers ){

          if( !this.settings.single || key == 0 ){
          
        	  var pointer = this.o.pointers[key];
            var label = this.o.labels[pointer.uid];
            var label_left = label.o.offset().left - this.sizes.domOffset.left;

        	  var limit = this.o.limits[0];
            if( label_left < limit.outerWidth() )
              limits[0] = false;

        	  var limit = this.o.limits[1];
        	  if( label_left + label.o.outerWidth() > this.sizes.domWidth - limit.outerWidth() )
        	    limits[1] = false;
        	}

        };

        for( var i=0; i < limits.length; i++ ){
          if( limits[i] )
            this.o.limits[i].fadeIn("fast");
          else
            this.o.limits[i].fadeOut("fast");
        };

  	  }
    },
    
    setValue: function(){
      var value = this.getValue();
      this.inputNode.attr( "value", value );
      this.onstatechange.call( this, value );
    },
    getValue: function(){
      if(!this.is.init) return false;
      var $this = this;
      
      var value = "";
      $.each( this.o.pointers, function(i){
        if( this.value.prc != undefined && !isNaN(this.value.prc) ) value += (i > 0 ? ";" : "") + $this.prcToValue( this.value.prc );
      });
      return value;
    },
    getPrcValue: function(){
      if(!this.is.init) return false;
      var $this = this;
      
      var value = "";
      $.each( this.o.pointers, function(i){
        if( this.value.prc != undefined && !isNaN(this.value.prc) ) value += (i > 0 ? ";" : "") + this.value.prc;
      });
      return value;
    },
    prcToValue: function( prc ){

  	  if( this.settings.heterogeneity && this.settings.heterogeneity.length > 0 ){
    	  var h = this.settings.heterogeneity;

    	  var _start = 0;
    	  var _from = this.settings.from;

    	  for( var i=0; i <= h.length; i++ ){
    	    if( h[i] ) var v = h[i].split("/");
    	    else       var v = [100, this.settings.to];
    	    
    	    v[0] = new Number(v[0]);
    	    v[1] = new Number(v[1]);
    	      
    	    if( prc >= _start && prc <= v[0] ) {
    	      var value = _from + ( (prc-_start) * (v[1]-_from) ) / (v[0]-_start);
    	    }

    	    _start = v[0];
    	    _from = v[1];
    	  };

  	  } else {
        var value = this.settings.from + ( prc * this.settings.interval ) / 100;
  	  }

      return this.round( value );
    },
    
  	valueToPrc: function( value, pointer ){  	  
  	  if( this.settings.heterogeneity && this.settings.heterogeneity.length > 0 ){
    	  var h = this.settings.heterogeneity;

    	  var _start = 0;
    	  var _from = this.settings.from;

    	  for (var i=0; i <= h.length; i++) {
    	    if(h[i]) var v = h[i].split("/");
    	    else     var v = [100, this.settings.to];
    	    v[0] = new Number(v[0]); v[1] = new Number(v[1]);
    	      
    	    if(value >= _from && value <= v[1]){
    	      var prc = pointer.limits(_start + (value-_from)*(v[0]-_start)/(v[1]-_from));
    	    }

    	    _start = v[0]; _from = v[1];
    	  };

  	  } else {
    	  var prc = pointer.limits((value-this.settings.from)*100/this.settings.interval);
  	  }

  	  return prc;
  	},
    
    
  	round: function( value ){
	    value = Math.round( value / this.settings.step ) * this.settings.step;
  		if( this.settings.round ) value = Math.round( value * Math.pow(10, this.settings.round) ) / Math.pow(10, this.settings.round);
  		else value = Math.round( value );
  		return value;
  	},
  	
  	nice: function( value ){
  		value = value.toString().replace(/,/gi, ".");
  		value = value.toString().replace(/ /gi, "");
  		if( Number.prototype.jSliderNice )
  		  return (new Number(value)).jSliderNice(this.settings.round).replace(/-/gi, "&minus;");
  		else
  		  return new Number(value);
  	}
    
  };
  
  function jSliderPointer(){
  	this.baseConstructor.apply(this, arguments);
  }

  jSliderPointer.inheritFrom(Draggable, {
    oninit: function( ptr, id, _constructor ){
      this.uid = id;
      this.parent = _constructor;
      this.value = {};
      this.settings = this.parent.settings;
    },
  	onmousedown: function(evt){
  	  this._parent = {
  	    offset: this.parent.domNode.offset(),
  	    width: this.parent.domNode.width()
  	  };
  	  this.ptr.addDependClass("hover");
  	  this.setIndexOver();
  	},
  	onmousemove: function( evt, x ){
  	  var coords = this._getPageCoords( evt );
  	  this._set( this.calc( coords.x ) );
  	},
  	onmouseup: function( evt ){
      // var coords = this._getPageCoords( evt );
      // this._set( this.calc( coords.x ) );

  	  if( this.parent.settings.callback && $.isFunction(this.parent.settings.callback) )
  	    this.parent.settings.callback.call( this.parent, this.parent.getValue() );
  	    
  	  this.ptr.removeDependClass("hover");
  	},
  	
  	setIndexOver: function(){
  	  this.parent.setPointersIndex( 1 );
  	  this.index( 2 );
  	},
  	
  	index: function( i ){
  	  this.ptr.css({ zIndex: i });
  	},
  	
  	limits: function( x ){
  	  return this.parent.limits( x, this );
  	},
  	
  	calc: function(coords){
  	  var x = this.limits(((coords-this._parent.offset.left)*100)/this._parent.width);
  	  return x;
  	},

  	set: function( value, opt_origin ){
  	  this.value.origin = this.parent.round(value);
  	  this._set( this.parent.valueToPrc( value, this ), opt_origin );
  	},  	
  	_set: function( prc, opt_origin ){
  	  if( !opt_origin )
  	    this.value.origin = this.parent.prcToValue(prc);

  	  this.value.prc = prc;
  		this.ptr.css({ left: prc + "%" });
  	  this.parent.redraw(this);
  	}
  	
  });
  
  
})(jQuery);





/* end */


//jquery.jslider.1.2.1.js

/*
* Copyright 2010 Fredrik Forsmo (@Frozzare)
* jSlider is under GPL Version 2 licenses.
* http://www.gnu.org/licenses/gpl-2.0.html
* Contribution by: David Rodrigues (@DavidProw)
*/

(function ($) {
    $.fn.jSlider = function (g) {
        var i = $(this);
        var j = $.extend({
        title: true,					//- Default: true			- true or false
        startWithZero: false, 		//- Default: false		- true or false
		usingEasing: false,				//- Default: false		- true or false
		easingEffect: 'easeOutBack', //- Default: ''			- 'easeOutBack', 'easeOutElastic', 'easeOutBounce'
		easingDuration: 'slow', 		//- Default: ''			- 'slow', 'fast' or 1500 
		timeChange: true,				//- Default: true         - true or false
		nextPrevPosition: 1,			//- Default: 1			- 1 is above slider, 2 is below slider
		time: 10000,						//- Default: 5000			- 5000 = 5 second
		NextText: '<img src="images/jFlowNext_arrow.gif" width="20" height="18" alt="Next" />', 			//- Default: Next			- text
		PrevText: '<img src="images/jFlowPrev-arrow.gif" width="20" height="18" alt="Prev" />', 		//- Default: Previous		- text		
		HideText: 'Hide',				//- Default: Hide			- text
		ShowText: 'Show',				//- Default: Show			- text
		StopText: 'Stop',				//- Default: Stop			- text
		StartText: 'Start',				//- Default: Start		- text
		StopStartClass: 'stop-auto',	//- Default: 'stop-auto'	- text/css-class
		height:	315,						//- Default: 0			- int
		hide: '',						//- Default: ''			- 'nextPrev', 'numbers', 'both'
		slideType: 'default'			//- Default: 'default'	- 'default', 'slideDown', 'slideHalf', 'slideHalfTwo'
       
        }, g || {});
        var k = 0;
        var b = 0;
        var l = 0;
        var h = 0;
        var m = 0;
        var o = 0;
        var p = 0;
        var t = 0;
        var a = $('#jSlider').attr('rel');

        function goToSlider(n) {
            l = i.find('.slide').length;
            if (m == l || m == l + 1) m = 0;
            if (j.title) {
                if (n == l) h = 0;
                else if (n == -1) h = l - 1;
                else h = n;
                setTitle($($('.slide img')[h]).attr('alt'))
            }
            if ($('.slide-title').hasClass('title-hide')) {
                $('.slide-title').hide()
            }
            if (n < 0) n = l - 1;
            else if (n > l - 1) n = 0;
            e = n - k;
            e = e * a;
            if (j.slideType === 'default') {
                slideThis(true, false, false, false, e, 0)
            } else if (j.slideType === 'slideDown') {
                j.title = false;
                slideDown(n, l)
            } else if (j.slideType === 'slideHalf') {
                j.title = false;
                slideHalf(e, l)
            } else if (j.slideType === 'slideHalfTwo') {
                j.title = false;
                slideHalfTwo(e, l)
            }
            $(".slidernumbers a").removeClass("active");
            $($(".slidernumbers a[rel^=" + n + "]")).addClass("active");
            k = n
        }
        function slideHalf(e, l) {
            var r = l * j.height;
            var b = l / 2;
            var c = b - 1;
            var d = c * a;
            m++;
            if (m == b) slideThis(true, true, true, false, d, j.height);
            else if (m >= l) slideThis(true, true, true, true, d, j.height);
            else slideThis(true, false, false, false, e, 0)
        }
        function slideHalfTwo(e, l) {
            var r = l * j.height;
            var b = l / 2;
            var c = b - 1;
            var d = c * j.height;
            if (m >= 2) m = 0;
            m++;
            o++;
            if (m == 2 && o != l) slideThis(true, true, true, false, a, j.height);
            else if (o == l) o = 0,
            slideThis(true, true, true, true, a, d);
            else slideThis(true, false, false, false, e, 0)
        }
        function slideDown(n, l) {
            var a = l - 1;
            var r = a * j.height;
            m++;
            if (n < 0) n = l - 1;
            else if (n > l - 1) n = 0;
            e = n - k;
            e = e * j.height;
            slideThis(true, true, false, false, 0, e)
        }
        function slideThis(a, b, c, d, e, f) {
            if (a && !b) {
                if (j.usingEasing) {
                    if (c) {
                        i.animate({
                            marginLeft: "+=" + e
                        }, {
                            easing: j.easingEffect,
                            duration: j.easingDuration
                        }, 'slow', 'swing')
                    } else {
                        i.animate({
                            marginLeft: "-=" + e
                        }, {
                            easing: j.easingEffect,
                            duration: j.easingDuration
                        }, 'slow', 'swing')
                    }
                } else {
                    if (c) {
                        i.animate({
                            marginLeft: "+=" + e
                        }, 'slow', 'swing')
                    } else {
                        i.animate({
                            marginLeft: "-=" + e
                        }, 'slow', 'swing')
                    }
                }
            } else if (a && b) {
                if (j.usingEasing) {
                    if (c) {
                        if (d) {
                            i.animate({
                                marginLeft: "+=" + e,
                                marginTop: "+=" + f
                            }, {
                                easing: j.easingEffect,
                                duration: j.easingDuration
                            }, 'slow', 'swing')
                        } else {
                            i.animate({
                                marginLeft: "+=" + e,
                                marginTop: "-=" + f
                            }, {
                                easing: j.easingEffect,
                                duration: j.easingDuration
                            }, 'slow', 'swing')
                        }
                    } else {
                        if (d) {
                            i.animate({
                                marginLeft: "-=" + e,
                                marginTop: "+=" + f
                            }, {
                                easing: j.easingEffect,
                                duration: j.easingDuration
                            }, 'slow', 'swing')
                        } else {
                            i.animate({
                                marginLeft: "-=" + e,
                                marginTop: "-=" + f
                            }, {
                                easing: j.easingEffect,
                                duration: j.easingDuration
                            }, 'slow', 'swing')
                        }
                    }
                } else {
                    if (c) {
                        if (d) {
                            i.animate({
                                marginLeft: "+=" + e,
                                marginTop: "+=" + f
                            }, 'slow', 'swing')
                        } else {
                            i.animate({
                                marginLeft: "+=" + e,
                                marginTop: "-=" + f
                            }, 'slow', 'swing')
                        }
                    } else {
                        if (d) {
                            i.animate({
                                marginLeft: "-=" + e,
                                marginTop: "+=" + f
                            }, 'slow', 'swing')
                        } else {
                            i.animate({
                                marginLeft: "-=" + e,
                                marginTop: "-=" + f
                            }, 'slow', 'swing')
                        }
                    }
                }
            }
        }
        function setTitle(t) {
            if (j.slideType === 'default') {
                if (typeof(t) !== 'undefined' && t != null) {
                    $('.slide-title').show();
                    $('.slide-title span:first').remove();
                    $('.slide-title').prepend('<span id="spantitle">' + t + '</span>')
                } else {
                    $('.slide-title').hide();
                    $('.slide-show').hide()
                }
            } else {
                $('.slide-title').hide()
            }
        }
        function buttonsAndNumbers() {
            if (j.nextPrevPosition == 1) {
                if (j.hide != 'nextPrev' && j.hide != 'both') $('#myController').prepend('<div class="quick_nav"><span class="jFlowNext"><a class="slidenext" href="#">' + j.NextText + '</a></span>')
                if (j.hide != 'numbers' && j.hide != 'both') $('#myController .quick_nav').prepend('<span class="slidernumbers"></span>')
                if (j.hide != 'nextPrev' && j.hide != 'both') $('#myController .quick_nav').prepend('<span class="jFlowPrev"><a class="slideprev" href="#">' + j.PrevText + '</a></span></div>');
            } else if (j.nextPrevPosition == 2) {
            if (j.hide != 'numbers' && j.hide != 'both') $('#myController').prepend('<div class="slidernumbers">');
            if (j.hide != 'nextPrev' && j.hide != 'both') $('#myController').append('<a class="slideprev" href="#">' + j.PrevText + '</a><a class="slidenext" href="#">' + j.NextText + '</a></p></div>')
            } else {
                alert("Error! You have to set nextPrevPosition value to 1 or 2 not " + j.nextPrevPosition + "!")
            }
        }
        function renderItem() {
            buttonsAndNumbers();
            $('#jSlider').find('.slider').append('<div class="slidetitle"><p class="slide-title"><span></span><span class="hide"><a href="#" class="slide-hide" rel="1">' + j.HideText + '</a></span></p><p class="slide-tools"><span class="hide"><a class="slide-show" href="#">' + j.ShowText + '</a></span></p></div>');
            var l = i.find('.slide').length;
            for (var c = 0; c < l; c++) {
                var n = 0;
                if (j.startWithZero) n = c;
                else n = c + 1;
                if (c == 0) {
                    $(".slidernumbers").append('<a href="#" class="active" rel="' + c + '">' + n + '</a>')
                } else {
                    $(".slidernumbers").append('<a href="#" rel="' + c + '">' + n + '</a>')
                }
            }
        }
        function slider() {
            renderItem();
            if (j.title) setTitle($($('.slide img')[0]).attr('alt'));
            else $('.slide-title').hide();
            $('.slide-show').hide();
            $(".slidernumbers a").live("click", function () {
                var b = parseInt($(this).attr('rel'));
                if (j.title) setTitle($($('.slide img')[b]).attr('alt'));
                goToSlider(b);
                t = 1
            });
            $(".slidenext").click(function () {
                goToSlider(k + 1);
                t = 1
            });
            $(".slideprev").click(function () {
                goToSlider(k - 1);
                t = 1
            });
            $('.slide-hide').click(function () {
                $('.slide-title').addClass('title-hide').hide();
                $('.slide-show').show()
            });
            $('.slide-show').click(function () {
                $('.slide-show').hide();
                $('.slide-title').removeClass('title-hide').show()
            });
            $('.' + j.StopStartClass).click(function () {
                if (p > 1) {
                    $(this).text(j.StopText);
                    p = 0;
                    var a = j.time;
                    j.time = 0;
                    j.time = a;
                    t = 0
                } else {
                    p = 2;
                    $(this).text(j.StartText)
                }
            });
            if (j.timeChange) {
                setInterval(function () {
                    timeChanges()
                }, j.time)
            }
        }
        function timeChanges() {
            if (t > 0) {
                var a = j.time;
                j.time = 0;
                j.time = a;
                t = 0
            } else if (p != 2) {
                goToSlider(k + 1)
            }
        }
        return slider()
    }
})(jQuery);


//jquery.jqtransform.js

/*
 *
 * jqTransform
 * by mathieu vilaplana mvilaplana@dfc-e.com
 * Designer ghyslain armand garmand@dfc-e.com
 *
 *
 * Version 1.0 25.09.08
 * Version 1.1 06.08.09
 * Add event click on Checkbox and Radio
 * Auto calculate the size of a select element
 * Can now, disabled the elements
 * Correct bug in ff if click on select (overflow=hidden)
 * No need any more preloading !!
 * 
 ******************************************** */
 
(function($){
	var defaultOptions = {preloadImg:true};
	var jqTransformImgPreloaded = false;

	var jqTransformPreloadHoverFocusImg = function(strImgUrl) {
		//guillemets to remove for ie
		strImgUrl = strImgUrl.replace(/^url\((.*)\)/,'$1').replace(/^\"(.*)\"$/,'$1');
		var imgHover = new Image();
		imgHover.src = strImgUrl.replace(/\.([a-zA-Z]*)$/,'-hover.$1');
		var imgFocus = new Image();
		imgFocus.src = strImgUrl.replace(/\.([a-zA-Z]*)$/,'-focus.$1');				
	};

	
	/***************************
	  Labels
	***************************/
	var jqTransformGetLabel = function(objfield){
		var selfForm = $(objfield.get(0).form);
		var oLabel = objfield.next();
		if(!oLabel.is('label')) {
			oLabel = objfield.prev();
			if(oLabel.is('label')){
				var inputname = objfield.attr('id');
				if(inputname){
					oLabel = selfForm.find('label[for="'+inputname+'"]');
				} 
			}
		}
		if(oLabel.is('label')){return oLabel.css('cursor','pointer');}
		return false;
	};
	
	/* Hide all open selects */
	var jqTransformHideSelect = function(oTarget){
		var ulVisible = $('.jqTransformSelectWrapper ul:visible');
		ulVisible.each(function(){
			var oSelect = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0);
			//do not hide if click on the label object associated to the select
			if( !(oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0)) ){$(this).hide();}
		});
	};
	/* Check for an external click */
	var jqTransformCheckExternalClick = function(event) {
		if ($(event.target).parents('.jqTransformSelectWrapper').length === 0) { jqTransformHideSelect($(event.target)); }
	};

	/* Apply document listener */
	var jqTransformAddDocumentListener = function (){
		$(document).mousedown(jqTransformCheckExternalClick);
	};	
			
	/* Add a new handler for the reset action */
	var jqTransformReset = function(f){
		var sel;
		$('.jqTransformSelectWrapper select', f).each(function(){sel = (this.selectedIndex<0) ? 0 : this.selectedIndex; $('ul', $(this).parent()).each(function(){$('a:eq('+ sel +')', this).click();});});
		$('a.jqTransformCheckbox, a.jqTransformRadio', f).removeClass('jqTransformChecked');
		$('input:checkbox, input:radio', f).each(function(){if(this.checked){$('a', $(this).parent()).addClass('jqTransformChecked');}});
	};

	/***************************
	  Buttons
	 ***************************/
	$.fn.jqTransInputButton = function(){
		return this.each(function(){
			var newBtn = $('<button id="'+ this.id +'" name="'+ this.name +'" type="'+ this.type +'" class="'+ this.className +' jqTransformButton"><span><span>'+ $(this).attr('value') +'</span></span>')
				.hover(function(){newBtn.addClass('jqTransformButton_hover');},function(){newBtn.removeClass('jqTransformButton_hover')})
				.mousedown(function(){newBtn.addClass('jqTransformButton_click')})
				.mouseup(function(){newBtn.removeClass('jqTransformButton_click')})
			;
			$(this).replaceWith(newBtn);
		});
	};
	
	/***************************
	  Text Fields 
	 ***************************/
	$.fn.jqTransInputText = function(){
		return this.each(function(){
			var $input = $(this);
	
			if($input.hasClass('jqtranformdone') || !$input.is('input')) {return;}
			$input.addClass('jqtranformdone');
	
			var oLabel = jqTransformGetLabel($(this));
			oLabel && oLabel.bind('click',function(){$input.focus();});
	
			var inputSize=$input.width();
			if($input.attr('size')){
				inputSize = $input.attr('size')*10;
				$input.css('width',inputSize);
			}
			
			$input.addClass("jqTransformInput").wrap('<div class="jqTransformInputWrapper"><div class="jqTransformInputInner"><div></div></div></div>');
			var $wrapper = $input.parent().parent().parent();
			$wrapper.css("width", inputSize+10);
			$input
				.focus(function(){$wrapper.addClass("jqTransformInputWrapper_focus");})
				.blur(function(){$wrapper.removeClass("jqTransformInputWrapper_focus");})
				.hover(function(){$wrapper.addClass("jqTransformInputWrapper_hover");},function(){$wrapper.removeClass("jqTransformInputWrapper_hover");})
			;
	
			/* If this is safari we need to add an extra class */
			$.browser.safari && $wrapper.addClass('jqTransformSafari');
			$.browser.safari && $input.css('width',$wrapper.width()+16);
			this.wrapper = $wrapper;
			
		});
	};
	
	/***************************
	  Check Boxes 
	 ***************************/	
	$.fn.jqTransCheckBox = function(){
		return this.each(function(){
			if($(this).hasClass('jqTransformHidden')) {return;}

			var $input = $(this);
			var inputSelf = this;

			//set the click on the label
			var oLabel=jqTransformGetLabel($input);
			oLabel && oLabel.click(function(){aLink.trigger('click');});
			
			var aLink = $('<a href="#" class="jqTransformCheckbox"></a>');
			//wrap and add the link
			$input.addClass('jqTransformHidden').wrap('<span class="jqTransformCheckboxWrapper"></span>').parent().prepend(aLink);
			//on change, change the class of the link
			$input.change(function(){
				this.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
				return true;
			});
			// Click Handler, trigger the click and change event on the input
			aLink.click(function(){
				//do nothing if the original input is disabled
				if($input.attr('disabled')){return false;}
				//trigger the envents on the input object
				$input.trigger('click').trigger("change");	
				return false;
			});

			// set the default state
			this.checked && aLink.addClass('jqTransformChecked');		
		});
	};
	/***************************
	  Radio Buttons 
	 ***************************/	
	$.fn.jqTransRadio = function(){
		return this.each(function(){
			if($(this).hasClass('jqTransformHidden')) {return;}

			var $input = $(this);
			var inputSelf = this;
				
			oLabel = jqTransformGetLabel($input);
			oLabel && oLabel.click(function(){aLink.trigger('click');});
	
			var aLink = $('<a href="#" class="jqTransformRadio" rel="'+ this.name +'"></a>');
			$input.addClass('jqTransformHidden').wrap('<span class="jqTransformRadioWrapper"></span>').parent().prepend(aLink);
			
			$input.change(function(){
				inputSelf.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
				return true;
			});
			// Click Handler
			aLink.click(function(){
				if($input.attr('disabled')){return false;}
				$input.trigger('click').trigger('change');
	
				// uncheck all others of same name input radio elements
				$('input[name="'+$input.attr('name')+'"]',inputSelf.form).not($input).each(function(){
					$(this).attr('type')=='radio' && $(this).trigger('change');
				});
	
				return false;					
			});
			// set the default state
			inputSelf.checked && aLink.addClass('jqTransformChecked');
		});
	};
	
	/***************************
	  TextArea 
	 ***************************/	
	$.fn.jqTransTextarea = function(){
		return this.each(function(){
			var textarea = $(this);
	
			if(textarea.hasClass('jqtransformdone')) {return;}
			textarea.addClass('jqtransformdone');
	
			oLabel = jqTransformGetLabel(textarea);
			oLabel && oLabel.click(function(){textarea.focus();});
			
			var strTable = '<table cellspacing="0" cellpadding="0" border="0" class="jqTransformTextarea">';
			strTable +='<tr><td id="jqTransformTextarea-tl"></td><td id="jqTransformTextarea-tm"></td><td id="jqTransformTextarea-tr"></td></tr>';
			strTable +='<tr><td id="jqTransformTextarea-ml">&nbsp;</td><td id="jqTransformTextarea-mm"><div></div></td><td id="jqTransformTextarea-mr">&nbsp;</td></tr>';	
			strTable +='<tr><td id="jqTransformTextarea-bl"></td><td id="jqTransformTextarea-bm"></td><td id="jqTransformTextarea-br"></td></tr>';
			strTable +='</table>';					
			var oTable = $(strTable)
					.insertAfter(textarea)
					.hover(function(){
						!oTable.hasClass('jqTransformTextarea-focus') && oTable.addClass('jqTransformTextarea-hover');
					},function(){
						oTable.removeClass('jqTransformTextarea-hover');					
					})
				;
				
			textarea
				.focus(function(){oTable.removeClass('jqTransformTextarea-hover').addClass('jqTransformTextarea-focus');})
				.blur(function(){oTable.removeClass('jqTransformTextarea-focus');})
				.appendTo($('#jqTransformTextarea-mm div',oTable))
			;
			this.oTable = oTable;
			if($.browser.safari){
				$('#jqTransformTextarea-mm',oTable)
					.addClass('jqTransformSafariTextarea')
					.find('div')
						.css('height',textarea.height())
						.css('width',textarea.width())
				;
			}
		});
	};
	
	/***************************
	  Select 
	 ***************************/	
	$.fn.jqTransSelect = function(){
		return this.each(function(index){
			var $select = $(this);

			if($select.hasClass('jqTransformHidden')) {return;}
			if($select.attr('multiple')) {return;}

			var oLabel  =  jqTransformGetLabel($select);
			/* First thing we do is Wrap it */
			var $wrapper = $select
				.addClass('jqTransformHidden')
				.wrap('<div class="jqTransformSelectWrapper"></div>')
				.parent()
				.css({zIndex: 10-index})
			;
			
			/* Now add the html for the select */
			$wrapper.prepend('<div><span></span><a href="#" class="jqTransformSelectOpen"></a></div><ul class="special_ul"></ul>');
			var $ul = $('ul', $wrapper).css('width',$select.width()).hide();
			/* Now we add the options */
			$('option', this).each(function(i){
				var oLi = $('<li><a href="#" index="'+ i +'">'+ $(this).html() +'</a></li>');
				$ul.append(oLi);
			});
			
			/* Add click handler to the a */
			$ul.find('a').click(function(){
					$('a.selected', $wrapper).removeClass('selected');
					$(this).addClass('selected');	
					/* Fire the onchange event */
					if ($select[0].selectedIndex != $(this).attr('index') && $select[0].onchange) { $select[0].selectedIndex = $(this).attr('index'); $select[0].onchange(); }
					$select[0].selectedIndex = $(this).attr('index');
					$('span:eq(0)', $wrapper).html($(this).html());
					$ul.hide();
					return false;
			});
			/* Set the default */
			$('a:eq('+ this.selectedIndex +')', $ul).click();
			$('span:first', $wrapper).click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click');});
			oLabel && oLabel.click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click');});
			this.oLabel = oLabel;
			
			/* Apply the click handler to the Open */
			var oLinkOpen = $('a.jqTransformSelectOpen', $wrapper)
				.click(function(){
					//Check if box is already open to still allow toggle, but close all other selects
					if( $ul.css('display') == 'none' ) {jqTransformHideSelect();} 
					if($select.attr('disabled')){return false;}

					$ul.slideToggle('fast', function(){					
						var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);
						$ul.animate({scrollTop: offSet});
					});
					return false;
				})
			;

			// Set the new width
			var iSelectWidth = $select.outerWidth();
			var oSpan = $('span:first',$wrapper);
			var newWidth = (iSelectWidth > oSpan.innerWidth())?iSelectWidth+oLinkOpen.outerWidth():$wrapper.width();
			$wrapper.css('width',newWidth);
			$ul.css('width',newWidth-2);
			oSpan.css({width:iSelectWidth});
		
			// Calculate the height if necessary, less elements that the default height
			//show the ul to calculate the block, if ul is not displayed li height value is 0
			$ul.css({display:'block',visibility:'hidden'});
			var iSelectHeight = ($('li',$ul).length)*($('li:first',$ul).height());//+1 else bug ff
			(iSelectHeight < $ul.height()) && $ul.css({height:iSelectHeight,'overflow':'hidden'});//hidden else bug with ff
			$ul.css({display:'none',visibility:'visible'});
			
		});
	};
	$.fn.jqTransform = function(options){
		var opt = $.extend({},defaultOptions,options);
		
		/* each form */
		 return this.each(function(){
			var selfForm = $(this);
			if(selfForm.hasClass('jqtransformdone')) {return;}
			selfForm.addClass('jqtransformdone');
			
			$('input:submit, input:reset, input[type="button"]', this).jqTransInputButton();			
			$('input:text, input:password', this).jqTransInputText();			
			$('input:checkbox', this).jqTransCheckBox();
			$('input:radio', this).jqTransRadio();
			$('textarea', this).jqTransTextarea();
			
			if( $('select', this).jqTransSelect().length > 0 ){jqTransformAddDocumentListener();}
			selfForm.bind('reset',function(){var action = function(){jqTransformReset(this);}; window.setTimeout(action, 10);});
			
			//preloading dont needed anymore since normal, focus and hover image are the same one
			/*if(opt.preloadImg && !jqTransformImgPreloaded){
				jqTransformImgPreloaded = true;
				var oInputText = $('input:text:first', selfForm);
				if(oInputText.length > 0){
					//pour ie on eleve les ""
					var strWrapperImgUrl = oInputText.get(0).wrapper.css('background-image');
					jqTransformPreloadHoverFocusImg(strWrapperImgUrl);					
					var strInnerImgUrl = $('div.jqTransformInputInner',$(oInputText.get(0).wrapper)).css('background-image');
					jqTransformPreloadHoverFocusImg(strInnerImgUrl);
				}
				
				var oTextarea = $('textarea',selfForm);
				if(oTextarea.length > 0){
					var oTable = oTextarea.get(0).oTable;
					$('td',oTable).each(function(){
						var strImgBack = $(this).css('background-image');
						jqTransformPreloadHoverFocusImg(strImgBack);
					});
				}
			}*/
			
			
		}); /* End Form each */
				
	};/* End the Plugin */

})(jQuery);
				   

//jquery.dependClass.js

/*
 * Depend Class v0.1b : attach class based on first class in list of current element
 * File: jquery.dependClass.js
 * Copyright (c) 2009 Egor Hmelyoff, hmelyoff@gmail.com
 */


(function($) {
	// Init plugin function
	$.baseClass = function(obj){
	  obj = $(obj);
	  return obj.get(0).className.match(/([^ ]+)/)[1];
	};
	
	$.fn.addDependClass = function(className, delimiter){
		var options = {
		  delimiter: delimiter ? delimiter : '-'
		}
		return this.each(function(){
		  var baseClass = $.baseClass(this);
		  if(baseClass)
    		$(this).addClass(baseClass + options.delimiter + className);
		});
	};

	$.fn.removeDependClass = function(className, delimiter){
		var options = {
		  delimiter: delimiter ? delimiter : '-'
		}
		return this.each(function(){
		  var baseClass = $.baseClass(this);
		  if(baseClass)
    		$(this).removeClass(baseClass + options.delimiter + className);
		});
	};

	$.fn.toggleDependClass = function(className, delimiter){
		var options = {
		  delimiter: delimiter ? delimiter : '-'
		}
		return this.each(function(){
		  var baseClass = $.baseClass(this);
		  if(baseClass)
		    if($(this).is("." + baseClass + options.delimiter + className))
    		  $(this).removeClass(baseClass + options.delimiter + className);
    		else
    		  $(this).addClass(baseClass + options.delimiter + className);
		});
	};

	// end of closure
})(jQuery);


// jquery.validationEngine-en.js
(function($){
    $.fn.validationEngineLanguage = function(){
    };
    $.validationEngineLanguage = {
        newLang: function(){
            $.validationEngineLanguage.allRules = {
                "required": { // Add your regex rules here, you can take telephone as an example
                    "regex": "none",
                    "alertText": "* This field is required",
                    "alertTextCheckboxMultiple": "* Please select an option",
                    "alertTextCheckboxe": "* This checkbox is required"
                },
                "minSize": {
                    "regex": "none",
                    "alertText": "* Minimum ",
                    "alertText2": " characters allowed"
                },
                "maxSize": {
                    "regex": "none",
                    "alertText": "* Maximum ",
                    "alertText2": " characters allowed"
                },
                "min": {
                    "regex": "none",
                    "alertText": "* Minimum value is "
                },
                "max": {
                    "regex": "none",
                    "alertText": "* Maximum value is "
                },
                "past": {
                    "regex": "none",
                    "alertText": "* Date prior to "
                },
                "future": {
                    "regex": "none",
                    "alertText": "* Date past "
                },	
                "maxCheckbox": {
                    "regex": "none",
                    "alertText": "* Maximum ",
                    "alertText2": " options allowed"
                },
                "minCheckbox": {
                    "regex": "none",
                    "alertText": "* Please select ",
                    "alertText2": " options"
                },
                "equals": {
                    "regex": "none",
                    "alertText": "* Fields do not match"
                },
                "phone": {
                    // credit: jquery.h5validate.js / orefalo
                    "regex": /^([\+][0-9]{1,3}[ \.\-])?([\(]{1}[0-9]{2,6}[\)])?([0-9 \.\-\/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?$/,
                    "alertText": "* Invalid phone number"
                },
                "email": {
                    // Shamelessly lifted from Scott Gonzalez via the Bassistance Validation plugin http://projects.scottsplayground.com/email_address_validation/
                    "regex": /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i,
                    "alertText": "* Invalid email address"
                },
                "integer": {
                    "regex": /^[\-\+]?\d+$/,
                    "alertText": "* Not a valid integer"
                },
                "number": {
                    // Number, including positive, negative, and floating decimal. credit: orefalo
                    "regex": /^[\-\+]?(([0-9]+)([\.,]([0-9]+))?|([\.,]([0-9]+))?)$/,
                    "alertText": "* Invalid floating decimal number"
                },
                "date": {
                    "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/,
                    "alertText": "* Invalid date, must be in YYYY-MM-DD format"
                },
                "ipv4": {
                    "regex": /^((([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))$/,
                    "alertText": "* Invalid IP address"
                },
                "url": {
                    "regex": /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,
                    "alertText": "* Invalid URL"
                },
                "onlyNumberSp": {
                    "regex": /^[0-9\ ]+$/,
                    "alertText": "* Numbers only"
                },
                "onlyLetterSp": {
                    "regex": /^[a-zA-Z\ \']+$/,
                    "alertText": "* Letters only"
                },
                "onlyLetterNumber": {
                    "regex": /^[0-9a-zA-Z]+$/,
                    "alertText": "* No special characters allowed"
                },
                "password2": {
                    "regex": "none",
                    "compareFields": "comparefields",
                    "alertText": "* Password does not match"

                },
                "valState": {
                    "regex": "none",
                    "alertText": "* Please select a valid state"

                },
                // --- CUSTOM RULES -- Those are specific to the demos, they can be removed or changed to your likings
                "ajaxUserCall": {
                    "url": "ajaxValidateFieldUser",
                    // you may want to pass extra data on the ajax call
                    "extraData": "name=eric",
                    "alertText": "* This user is already taken",
                    "alertTextLoad": "* Validating, please wait"
                },
				"ajaxUserCallPhp": {
                    "url": "phpajax/ajaxValidateFieldUser.php",
                    // you may want to pass extra data on the ajax call
                    "extraData": "name=eric",
                    // if you provide an "alertTextOk", it will show as a green prompt when the field validates
                    "alertTextOk": "* This username is available",
                    "alertText": "* This user is already taken",
                    "alertTextLoad": "* Validating, please wait"
                },
                "ajaxNameCall": {
                    // remote json service location
                    "url": "ajaxValidateFieldName",
                    // error
                    "alertText": "* This name is already taken",
                    // if you provide an "alertTextOk", it will show as a green prompt when the field validates
                    "alertTextOk": "* This name is available",
                    // speaks by itself
                    "alertTextLoad": "* Validating, please wait"
                },
				 "ajaxNameCallPhp": {
	                    // remote json service location
	                    "url": "phpajax/ajaxValidateFieldName.php",
	                    // error
	                    "alertText": "* This name is already taken",
	                    // speaks by itself
	                    "alertTextLoad": "* Validating, please wait"
	                },
                "validate2fields": {
                    "alertText": "* Please input HELLO"
                }
            };
            
        }
    };
    $.validationEngineLanguage.newLang();
})(jQuery);


//toggler.js

var bigImageContainerId = "big_image_container";
var togglerId = "toggler";
var thumbsContainerId = "thumbs_container";

// ----------------------------------------
$(document).ready(function() {
	var bigImageEl = $("#" + bigImageContainerId)[0];
	var togglerEl = $("#" + togglerId);
	var thumbsEl = $("#" + thumbsContainerId);
	var prevButtonId = "";

	thumbsEl.hide();

	$(".image_gallery a").click(function (){return false});
	$(".image_gallery img.thumb").each(function() {
		$(this).click(function () {
			$("#" + bigImageContainerId + " img").attr( {
				src : $(this).parent().attr("rel")
			}).appendTo($(bigImageEl));
			
		});
	});
	togglerEl.click(function() {
		thumbsEl.toggle();
	});
	$("#" + thumbsContainerId + " a.close").click(function() {
		thumbsEl.hide();
	});

	$("#prev_button").click(function() {
		var imgSrc = $("#" + bigImageContainerId + " img").attr("src");
		if ($(".image_gallery a[rel="+imgSrc+"]").parent().prev().length)
		{
			$(".image_gallery a[rel="+imgSrc+"]").parent().prev().find("img").click();
		}
		else
		{
			$(".image_gallery:last-child").find("img").click();
		}
	});
	$("#next_button").click(function() {
		var imgSrc = $("#" + bigImageContainerId + " img").attr("src");
		if ($(".image_gallery a[rel="+imgSrc+"]").parent().next().length)
		{
			$(".image_gallery a[rel="+imgSrc+"]").parent().next().find("img").click();
		}
		else
		{
			$(".image_gallery img.thumb:first").click();
		}
	});
});

// ----------------------------------------


//imagepanner.js

/* Simple Image Panner and Zoomer (March 11th, 10)
* This notice must stay intact for usage 
* Author: Dynamic Drive at http://www.dynamicdrive.com/
* Visit http://www.dynamicdrive.com/ for full source code
*/

// v1.1 (March 25th, 10): Updated with ability to zoom in/out of image

//jQuery.noConflict()
 


var ddimagepanner = {

    magnifyicons: ['images/magnifyPlus.gif', 'images/magnifyMinus.gif', 25, 25], //set path to zoom in/out images, plus their dimensions
    maxzoom: 4, //set maximum zoom level (from 1x)

    init: function ($, $img, options) {
        var s = options
        s.imagesize = [$img.width(), $img.height()]
        s.oimagesize = [$img.width(), $img.height()] //always remember image's original size
        s.pos = (s.pos == "center") ? [-(s.imagesize[0] / 2 - s.wrappersize[0] / 2), -(s.imagesize[1] / 2 - s.wrappersize[1] / 2)] : [0, 0] //initial coords of image
        s.pos = [Math.floor(s.pos[0]), Math.floor(s.pos[1])]
        $img.css({ position: 'absolute', left: s.pos[0], top: s.pos[1] })
        if (s.canzoom == "yes") { //enable image zooming?
            s.dragcheck = { h: (s.wrappersize[0] > s.imagesize[0]) ? false : true, v: (s.wrappersize[1] > s.imagesize[1]) ? false : true} //check if image should be draggable horizon and vertically
            s.$statusdiv = $('<div style="position:absolute;color:white;background:#353535;padding:2px 10px;font-size:12px;visibility:hidden">1x Magnify</div>').appendTo(s.$pancontainer) //create DIV to show current magnify level
            s.$statusdiv.css({ left: 0, top: s.wrappersize[1] - s.$statusdiv.outerHeight(), display: 'none', visibility: 'visible' })
            this.zoomfunct($, $img, s)
        }
        this.dragimage($, $img, s)
    },

    dragimage: function ($, $img, s) {
        $img.mousedown(function (e) {
            s.pos = [parseInt($img.css('left')), parseInt($img.css('top'))]
            var xypos = [e.clientX, e.clientY]
            $img.bind('mousemove.dragstart', function (e) {
                var pos = s.pos, imagesize = s.imagesize, wrappersize = s.wrappersize
                var dx = e.clientX - xypos[0] //distance to move horizontally
                var dy = e.clientY - xypos[1] //vertically
                s.dragcheck = { h: (wrappersize[0] > imagesize[0]) ? false : true, v: (wrappersize[1] > imagesize[1]) ? false : true }
                if (s.dragcheck.h == true) //allow dragging horizontally?
                    var newx = (dx > 0) ? Math.min(0, pos[0] + dx) : Math.max(-imagesize[0] + wrappersize[0], pos[0] + dx) //Set horizonal bonds. dx>0 indicates drag right versus left
                if (s.dragcheck.v == true) //allow dragging vertically?
                    var newy = (dy > 0) ? Math.min(0, s.pos[1] + dy) : Math.max(-imagesize[1] + wrappersize[1], pos[1] + dy) //Set vertical bonds. dy>0 indicates drag downwards versus up
                $img.css({ left: (typeof newx != "undefined") ? newx : pos[0], top: (typeof newy != "undefined") ? newy : pos[1] })
                return false //cancel default drag action
            })
            return false //cancel default drag action
        })
        $(document).bind('mouseup', function (e) {
            $img.unbind('mousemove.dragstart')
        })
    },

    zoomfunct: function ($, $img, s) {
        var magnifyicons = this.magnifyicons
        var $zoomimages = $('<span class="magnify magPlus"></span> <span class="magnify magMinus"></span>')
			.css({ cursor: 'pointer',  zIndex: 1000,
			     opacity: 0.7
			})
		
	    //var $zoomimages = $('<img src="' + magnifyicons[0] + '" /><img src="' + magnifyicons[1] + '" />')
		//	.css({ width: magnifyicons[2], height: magnifyicons[3], cursor: 'pointer', zIndex: 1000, position: 'absolute',
		//	    top: s.wrappersize[1] - magnifyicons[3] - 1, left: s.wrappersize[0] - magnifyicons[2] - 3, opacity: 0.7
		//	})
			.attr("title", "Zoom Out")
			//.appendTo(s.$pancontainer)
			.appendTo(".magIcons")
        $zoomimages.eq(0).css({ left: parseInt($zoomimages.eq(0).css('left')) - magnifyicons[2] - 3, opacity: 1 }) //position "zoom in" image
			.attr("title", "Zoom In")
        $zoomimages.click(function (e) { //assign click behavior to zoom images
            var $zimg = $(this) //reference image clicked on
            //var $zimg = $(".image_options .magnify") //reference image clicked on
            var curzoom = s.curzoom //get current zoom level
            var zoomtype = ($zimg.attr("title").indexOf("In") != -1) ? "in" : "out"
            if (zoomtype == "in" && s.curzoom == ddimagepanner.maxzoom || zoomtype == "out" && s.curzoom == 1) //exit if user at either ends of magnify levels
                return
            var basepos = [s.pos[0] / curzoom, s.pos[1] / curzoom]
            var newzoom = (zoomtype == "out") ? Math.max(1, curzoom - 1) : Math.min(ddimagepanner.maxzoom, curzoom + 1) //get new zoom level
            $zoomimages.css("opacity", 1)
            if (newzoom == 1) //if zoom level is 1x, dim "zoom out" image
                $zoomimages.eq(1).css("opacity", 0.7)
            else if (newzoom == ddimagepanner.maxzoom) //if zoom level is max level, dim "zoom in" image
                $zoomimages.eq(0).css("opacity", 0.7)
            clearTimeout(s.statustimer)
            s.$statusdiv.html(newzoom + "x Magnify").show() //show current zoom status/level
            var nd = [s.oimagesize[0] * newzoom, s.oimagesize[1] * newzoom]
            var newpos = [basepos[0] * newzoom, basepos[1] * newzoom]
            newpos = [(zoomtype == "in" && s.wrappersize[0] > s.imagesize[0] || zoomtype == "out" && s.wrappersize[0] > nd[0]) ? s.wrappersize[0] / 2 - nd[0] / 2 : Math.max(-nd[0] + s.wrappersize[0], newpos[0]),
				(zoomtype == "in" && s.wrappersize[1] > s.imagesize[1] || zoomtype == "out" && s.wrappersize[1] > nd[1]) ? s.wrappersize[1] / 2 - nd[1] / 2 : Math.max(-nd[1] + s.wrappersize[1], newpos[1])]
            $img.animate({ width: nd[0], height: nd[1], left: newpos[0], top: newpos[1] }, function () {
                s.statustimer = setTimeout(function () { s.$statusdiv.hide() }, 5000)
            })
            s.imagesize = nd
            s.curzoom = newzoom
            s.pos = [newpos[0], newpos[1]]
        })
    }

}


jQuery.fn.imgmover = function (options) {
    var $ = jQuery
    return this.each(function () { //return jQuery obj
        if (this.tagName != "IMG")
            return true //skip to next matched element 
        var $imgref = $(this)
        if (parseInt(this.style.width) > 0 && parseInt(this.style.height) > 0) //if image has explicit CSS width/height defined
            ddimagepanner.init($, $imgref, options)
        else if (this.complete) { //account for IE not firing image.onload
            ddimagepanner.init($, $imgref, options)
        }
        else {
            $imgref.bind('load', function () {
                ddimagepanner.init($, $imgref, options)
            })
        }
    })
}


jQuery(document).ready(function ($) { //By default look for DIVs with class="pancontainer"
    var $pancontainer = $('div.pancontainer')
  // var $imageoptions = $('image_options')
    $pancontainer.each(function () {
        var $this = $(this).css({ position: 'relative', overflow: 'hidden', cursor: 'move' })
        var $img = $this.find('img:eq(0)') //image to pan
        var options = { $pancontainer: $this, pos: $this.attr('data-orient'), curzoom: 1, canzoom: $this.attr('data-canzoom'), wrappersize: [$this.width(), $this.height()] }
        $img.imgmover(options)
    })
})
