eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('G 1f={8B:\'1.6.0.3\',1U:{43:!!(1F.7J&&4l.4o.3B(\'4d\')===-1),4d:4l.4o.3B(\'4d\')>-1,4m:4l.4o.3B(\'em/\')>-1,88:4l.4o.3B(\'88\')>-1&&4l.4o.3B(\'cY\')===-1,cO:!!4l.4o.1e(/dN.*di.*d7/)},3N:{82:!!1b.2R,ck:!!1b.cq,6D:!!1F.6C,7t:1b.3Y(\'1N\')[\'5e\']&&1b.3Y(\'1N\')[\'5e\']!==1b.3Y(\'1z\')[\'5e\']},7a:\'<50[^>]*>([\\\\S\\\\s]*?)<\\/50>\',aw:/^\\/\\*-er-([\\s\\S]*)\\*\\/\\s*$/,3i:q(){},K:q(x){o x}};E(1f.1U.cO)1f.3N.7t=1p;G 2m={2w:q(){G 2V=1j,3p=$A(1q);E(M.2C(3p[0]))2V=3p.4U();q 1M(){C.2O.3D(C,1q)}M.18(1M,2m.1c);1M.9V=2V;1M.d9=[];E(2V){G 9g=q(){};9g.1k=2V.1k;1M.1k=1t 9g;2V.d9.1h(1M)}17(G i=0;i<3p.O;i++)1M.6y(3p[i]);E(!1M.1k.2O)1M.1k.2O=1f.3i;1M.1k.ec=1M;o 1M}};2m.1c={6y:q(2b){G 3U=C.9V&&C.9V.1k;G 3p=M.4p(2b);E(!M.4p({2J:1v}).O)3p.1h("2J","a3");17(G i=0,O=3p.O;i<O;i++){G 1y=3p[i],I=2b[1y];E(3U&&M.2C(I)&&I.ac().3P()=="$4y"){G 1B=I;I=(q(m){o q(){o 3U[m].3D(C,1q)}})(1y).4E(1B);I.a3=1B.a3.2B(1B);I.2J=1B.2J.2B(1B)}C.1k[1y]=I}o C}};G 4Z={};M.18=q(5y,2b){17(G 1y 1Q 2b)5y[1y]=2b[1y];o 5y};M.18(M,{2F:q(W){24{E(M.2D(W))o\'4D\';E(W===1j)o\'1j\';o W.2F?W.2F():22(W)}29(e){E(e aF dM)o\'...\';4z e}},3H:q(W){G 1r=3h W;5v(1r){2k\'4D\':2k\'q\':2k\'dL\':o;2k\'dD\':o W.2J()}E(W===1j)o\'1j\';E(W.3H)o W.3H();E(M.4u(W))o;G U=[];17(G 1y 1Q W){G I=M.3H(W[1y]);E(!M.2D(I))U.1h(1y.3H()+\': \'+I)}o\'{\'+U.2A(\', \')+\'}\'},4R:q(W){o $H(W).4R()},4n:q(W){o W&&W.4n?W.4n():22.62(W)},4p:q(W){G 4p=[];17(G 1y 1Q W)4p.1h(1y);o 4p},1T:q(W){G 1T=[];17(G 1y 1Q W)1T.1h(W[1y]);o 1T},2E:q(W){o M.18({},W)},4u:q(W){o!!(W&&W.3u==1)},4H:q(W){o W!=1j&&3h W=="W"&&\'dH\'1Q W&&\'2A\'1Q W},8E:q(W){o W aF 44},2C:q(W){o 3h W=="q"},3g:q(W){o 3h W=="3n"},55:q(W){o 3h W=="3W"},2D:q(W){o 3h W=="4D"}});M.18(dA.1k,{ac:q(){G 3v=C.2J().1e(/^[\\s\\(]*q[^(]*\\(([^\\)]*)\\)/)[1].1S(/\\s+/g,\'\').4h(\',\');o 3v.O==1&&!3v[0]?[]:3v},2B:q(){E(1q.O<2&&M.2D(1q[0]))o C;G 3j=C,1W=$A(1q),W=1W.4U();o q(){o 3j.3D(W,1W.1X($A(1q)))}},dS:q(){G 3j=C,1W=$A(1q),W=1W.4U();o q(1a){o 3j.3D(W,[1a||1F.1a].1X(1W))}},95:q(){E(!1q.O)o C;G 3j=C,1W=$A(1q);o q(){o 3j.3D(C,1W.1X($A(1q)))}},8Y:q(){G 3j=C,1W=$A(1q),a8=1W.4U()*aU;o 1F.dT(q(){o 3j.3D(3j,1W)},a8)},4S:q(){G 1W=[0.dQ].1X($A(1q));o C.8Y.3D(C,1W)},4E:q(1L){G 3j=C;o q(){o 1L.3D(C,[3j.2B(C)].1X($A(1q)))}},4M:q(){E(C.9W)o C.9W;G 3j=C;o C.9W=q(){o 3j.3D(1j,[C].1X($A(1q)))}}});dP.1k.3H=q(){o\'"\'+C.dV()+\'-\'+(C.dx()+1).4F(2)+\'-\'+C.dk().4F(2)+\'T\'+C.de().4F(2)+\':\'+C.dp().4F(2)+\':\'+C.eI().4F(2)+\'Z"\'};G cf={cg:q(){G 7B;17(G i=0,O=1q.O;i<O;i++){G b3=1q[i];24{7B=b3();2j}29(e){}}o 7B}};49.1k.1e=49.1k.2Y;49.ah=q(5Z){o 22(5Z).1S(/([.*+?^=!:${}()|[\\]\\/\\\\])/g,\'\\\\$1\')};G cQ=2m.2w({2O:q(32,4w){C.32=32;C.4w=4w;C.7U=1p;C.76()},76:q(){C.3Z=bD(C.6E.2B(C),C.4w*aU)},9x:q(){C.32(C)},9M:q(){E(!C.3Z)o;bE(C.3Z);C.3Z=1j},6E:q(){E(!C.7U){24{C.7U=1v;C.9x()}el{C.7U=1p}}}});M.18(22,{62:q(I){o I==1j?\'\':22(I)},ar:{\'\\b\':\'\\\\b\',\'\\t\':\'\\\\t\',\'\\n\':\'\\\\n\',\'\\f\':\'\\\\f\',\'\\r\':\'\\\\r\',\'\\\\\':\'\\\\\\\\\'}});M.18(22.1k,{3k:q(2a,3s){G 1s=\'\',2b=C,1e;3s=1q.5H.9c(3s);1P(2b.O>0){E(1e=2b.1e(2a)){1s+=2b.3w(0,1e.1m);1s+=22.62(3s(1e));2b=2b.3w(1e.1m+1e[0].O)}1i{1s+=2b,2b=\'\'}}o 1s},aG:q(2a,3s,3z){3s=C.3k.9c(3s);3z=M.2D(3z)?1:3z;o C.3k(2a,q(1e){E(--3z<0)o 1e[0];o 3s(1e)})},cd:q(2a,1g){C.3k(2a,1g);o 22(C)},eF:q(O,5K){O=O||30;5K=M.2D(5K)?\'...\':5K;o C.O>O?C.3w(0,O-5K.O)+5K:22(C)},4x:q(){o C.1S(/^\\s+/,\'\').1S(/\\s+$/,\'\')},9E:q(){o C.1S(/<\\/?[^>]+>/gi,\'\')},4q:q(){o C.1S(1t 49(1f.7a,\'b0\'),\'\')},ap:q(){G bu=1t 49(1f.7a,\'b0\');G ak=1t 49(1f.7a,\'et\');o(C.1e(bu)||[]).2X(q(af){o(af.1e(ak)||[\'\',\'\'])[1]})},5m:q(){o C.ap().2X(q(50){o 81(50)})},73:q(){G 5S=1q.5H;5S.4v.7L=C;o 5S.1N.5p},az:q(){G 1N=1t J(\'1N\');1N.5p=C.9E();o 1N.3l[0]?(1N.3l.O>1?$A(1N.3l).3t(\'\',q(2W,L){o 2W+L.4j}):1N.3l[0].4j):\'\'},7O:q(ao){G 1e=C.4x().1e(/([^?#]*)(#.*)?$/);E(!1e)o{};o 1e[1].4h(ao||\'&\').3t({},q(3G,1H){E((1H=1H.4h(\'=\'))[0]){G 1w=8t(1H.4U());G I=1H.O>1?1H.2A(\'=\'):1H[0];E(I!=4D)I=8t(I);E(1w 1Q 3G){E(!M.4H(3G[1w]))3G[1w]=[3G[1w]];3G[1w].1h(I)}1i 3G[1w]=I}o 3G})},3y:q(){o C.4h(\'\')},8z:q(){o C.3w(0,C.O-1)+22.eA(C.aI(C.O-1)+1)},7R:q(3z){o 3z<1?\'\':1t 2o(3z+1).2A(C)},8S:q(){G 4Q=C.4h(\'-\'),9L=4Q.O;E(9L==1)o 4Q[0];G 9K=C.7i(0)==\'-\'?4Q[0].7i(0).2i()+4Q[0].5I(1):4Q[0];17(G i=1;i<9L;i++)9K+=4Q[i].7i(0).2i()+4Q[i].5I(1);o 9K},6h:q(){o C.7i(0).2i()+C.5I(1).2e()},ei:q(){o C.3k(/::/,\'/\').3k(/([A-Z]+)([A-Z][a-z])/,\'#{1}6M#{2}\').3k(/([a-z\\d])([A-Z])/,\'#{1}6M#{2}\').3k(/-/,\'6M\').2e()},eh:q(){o C.3k(/6M/,\'-\')},2F:q(aP){G 9C=C.3k(/[\\ef-\\e6\\\\]/,q(1e){G 9B=22.ar[1e[0]];o 9B?9B:\'\\\\eD\'+1e[0].aI().4F(2,16)});E(aP)o\'"\'+9C.1S(/"/g,\'\\\\"\')+\'"\';o"\'"+9C.1S(/\'/g,\'\\\\\\\'\')+"\'"},3H:q(){o C.2F(1v)},8b:q(2g){o C.aG(2g||1f.aw,\'#{1}\')},au:q(){G 5Z=C;E(5Z.56())o 1p;5Z=C.1S(/\\\\./g,\'@\').1S(/"[^"\\\\\\n\\r]*"/g,\'\');o(/^[,:{}\\[\\]0-9.\\-+dW-u \\n\\r\\t]*$/).2Y(5Z)},5z:q(av){G 3o=C.8b();24{E(!av||3o.au())o 81(\'(\'+3o+\')\')}29(e){}4z 1t dw(\'dg dh ai 3n: \'+C.2F())},1G:q(2a){o C.3B(2a)>-1},9s:q(2a){o C.3B(2a)===0},9r:q(2a){G d=C.O-2a.O;o d>=0&&C.9X(2a)===d},5R:q(){o C==\'\'},56:q(){o/^\\s*$/.2Y(C)},aq:q(W,2a){o 1t 3c(C,2a).2R(W)}});E(1f.1U.4m||1f.1U.43)M.18(22.1k,{73:q(){o C.1S(/&/g,\'&aC;\').1S(/</g,\'&aB;\').1S(/>/g,\'&gt;\')},az:q(){o C.9E().1S(/&aC;/g,\'&\').1S(/&aB;/g,\'<\').1S(/&gt;/g,\'>\')}});22.1k.3k.9c=q(3s){E(M.2C(3s))o 3s;G 6b=1t 3c(3s);o q(1e){o 6b.2R(1e)}};22.1k.ee=22.1k.7O;M.18(22.1k.73,{1N:1b.3Y(\'1N\'),4v:1b.cR(\'\')});22.1k.73.1N.5U(22.1k.73.4v);G 3c=2m.2w({2O:q(6b,2a){C.6b=6b.2J();C.2a=2a||3c.d3},2R:q(W){E(M.2C(W.8A))W=W.8A();o C.6b.3k(C.2a,q(1e){E(W==1j)o\'\';G 57=1e[1]||\'\';E(57==\'\\\\\')o 1e[2];G 6N=W,75=1e[3];G 2a=/^([^.[]+|\\[((?:.*?[^\\\\])?)\\])(\\.|\\[|$)/;1e=2a.d2(75);E(1e==1j)o 57;1P(1e!=1j){G cZ=1e[1].9s(\'[\')?1e[2].3k(\'\\\\\\\\]\',\']\'):1e[1];6N=6N[cZ];E(1j==6N||\'\'==1e[3])2j;75=75.5I(\'[\'==1e[3]?1e[1].O:1e[0].O);1e=2a.d2(75)}o 57+22.62(6N)})}});3c.d3=/(^|.|\\r|\\n)(#\\{(.*?)\\})/;G $2j={};G 2N={1E:q(1g,1J){G 1m=0;24{C.4f(q(I){1g.2K(1J,I,1m++)})}29(e){E(e!=$2j)4z e}o C},cV:q(3W,1g,1J){G 1m=-3W,9G=[],2z=C.3y();E(3W<1)o 2z;1P((1m+=3W)<2z.O)9G.1h(2z.3w(1m,1m+3W));o 9G.9p(1g,1J)},99:q(1g,1J){1g=1g||1f.K;G 1s=1v;C.1E(q(I,1m){1s=1s&&!!1g.2K(1J,I,1m);E(!1s)4z $2j});o 1s},cE:q(1g,1J){1g=1g||1f.K;G 1s=1p;C.1E(q(I,1m){E(1s=!!1g.2K(1J,I,1m))4z $2j});o 1s},9p:q(1g,1J){1g=1g||1f.K;G U=[];C.1E(q(I,1m){U.1h(1g.2K(1J,I,1m))});o U},7b:q(1g,1J){G 1s;C.1E(q(I,1m){E(1g.2K(1J,I,1m)){1s=I;4z $2j}});o 1s},5B:q(1g,1J){G U=[];C.1E(q(I,1m){E(1g.2K(1J,I,1m))U.1h(I)});o U},ej:q(2g,1g,1J){1g=1g||1f.K;G U=[];E(M.3g(2g))2g=1t 49(2g);C.1E(q(I,1m){E(2g.1e(I))U.1h(1g.2K(1J,I,1m))});o U},1G:q(W){E(M.2C(C.3B))E(C.3B(W)!=-1)o 1v;G 9I=1p;C.1E(q(I){E(I==W){9I=1v;4z $2j}});o 9I},e8:q(3W,6Y){6Y=M.2D(6Y)?1j:6Y;o C.cV(3W,q(3w){1P(3w.O<3W)3w.1h(6Y);o 3w})},3t:q(2W,1g,1J){C.1E(q(I,1m){2W=1g.2K(1J,2W,I,1m)});o 2W},9w:q(1B){G 1W=$A(1q).3w(1);o C.2X(q(I){o I[1B].3D(I,1W)})},es:q(1g,1J){1g=1g||1f.K;G 1s;C.1E(q(I,1m){I=1g.2K(1J,I,1m);E(1s==1j||I>=1s)1s=I});o 1s},e7:q(1g,1J){1g=1g||1f.K;G 1s;C.1E(q(I,1m){I=1g.2K(1J,I,1m);E(1s==1j||I<1s)1s=I});o 1s},ep:q(1g,1J){1g=1g||1f.K;G 9f=[],9i=[];C.1E(q(I,1m){(1g.2K(1J,I,1m)?9f:9i).1h(I)});o[9f,9i]},5E:q(1y){G U=[];C.1E(q(I){U.1h(I[1y])});o U},dq:q(1g,1J){G U=[];C.1E(q(I,1m){E(!1g.2K(1J,I,1m))U.1h(I)});o U},cN:q(1g,1J){o C.2X(q(I,1m){o{I:I,6s:1g.2K(1J,I,1m)}}).dt(q(2y,65){G a=2y.6s,b=65.6s;o a<b?-1:a>b?1:0}).5E(\'I\')},3y:q(){o C.2X()},e4:q(){G 1g=1f.K,1W=$A(1q);E(M.2C(1W.2u()))1g=1W.eb();G c2=[C].1X(1W).2X($A);o C.2X(q(I,1m){o 1g(c2.5E(1m))})},cv:q(){o C.3y().O},2F:q(){o\'#<2N:\'+C.3y().2F()+\'>\'}};M.18(2N,{2X:2N.9p,9k:2N.7b,2G:2N.5B,2g:2N.5B,ek:2N.1G,eG:2N.3y,ex:2N.99,ew:2N.cE});q $A(2S){E(!2S)o[];E(2S.3y)o 2S.3y();G O=2S.O||0,U=1t 2o(O);1P(O--)U[O]=2S[O];o U}E(1f.1U.4m){$A=q(2S){E(!2S)o[];E(!(3h 2S===\'q\'&&3h 2S.O===\'3W\'&&3h 2S.5c===\'q\')&&2S.3y)o 2S.3y();G O=2S.O||0,U=1t 2o(O);1P(O--)U[O]=2S[O];o U}}2o.c3=$A;M.18(2o.1k,2N);E(!2o.1k.97)2o.1k.97=2o.1k.4e;M.18(2o.1k,{4f:q(1g){17(G i=0,O=C.O;i<O;i++)1g(C[i])},db:q(){C.O=0;o C},3P:q(){o C[0]},2u:q(){o C[C.O-1]},dy:q(){o C.2G(q(I){o I!=1j})},cM:q(){o C.3t([],q(2z,I){o 2z.1X(M.4H(I)?I.cM():[I])})},6u:q(){G 1T=$A(1q);o C.2G(q(I){o!1T.1G(I)})},4e:q(cL){o(cL!==1p?C:C.3y()).97()},df:q(){o C.O>1?C:C[0]},cp:q(cz){o C.3t([],q(2z,I,1m){E(0==1m||(cz?2z.2u()!=I:!2z.1G(I)))2z.1h(I);o 2z})},dj:q(2z){o C.cp().5B(q(5c){o 2z.7b(q(I){o 5c===I})})},2E:q(){o[].1X(C)},cv:q(){o C.O},2F:q(){o\'[\'+C.2X(M.2F).2A(\', \')+\']\'},3H:q(){G U=[];C.1E(q(W){G I=M.3H(W);E(!M.2D(I))U.1h(I)});o\'[\'+U.2A(\', \')+\']\'}});E(M.2C(2o.1k.ct))2o.1k.4f=2o.1k.ct;E(!2o.1k.3B)2o.1k.3B=q(5c,i){i||(i=0);G O=C.O;E(i<0)i=O+i;17(;i<O;i++)E(C[i]===5c)o i;o-1};E(!2o.1k.9X)2o.1k.9X=q(5c,i){i=dG(i)?C.O:(i<0?C.O+i:i)+1;G n=C.3w(0,i).4e().3B(5c);o(n<0)?n:i-n-1};2o.1k.3y=2o.1k.2E;q $w(3n){E(!M.3g(3n))o[];3n=3n.4x();o 3n?3n.4h(/\\s+/):[]}E(1f.1U.4d){2o.1k.1X=q(){G 2z=[];17(G i=0,O=C.O;i<O;i++)2z.1h(C[i]);17(G i=0,O=1q.O;i<O;i++){E(M.4H(1q[i])){17(G j=0,cK=1q[i].O;j<cK;j++)2z.1h(1q[i][j])}1i{2z.1h(1q[i])}}o 2z}}M.18(4V.1k,{dr:q(){o C.4F(2,16)},8z:q(){o C+1},7R:q(1g,1J){$R(0,C,1v).1E(1g,1J);o C},4F:q(O,bZ){G 3n=C.2J(bZ||10);o\'0\'.7R(O-3n.O)+3n},3H:q(){o eC(C)?C.2J():\'1j\'}});$w(\'ez e3 dX dY\').1E(q(1B){4V.1k[1B]=dZ[1B].4M()});q $H(W){o 1t 44(W)};G 44=2m.2w(2N,(q(){q 8D(1w,I){E(M.2D(I))o 1w;o 1w+\'=\'+bS(22.62(I))}o{2O:q(W){C.48=M.8E(W)?W.6r():M.2E(W)},4f:q(1g){17(G 1w 1Q C.48){G I=C.48[1w],1H=[1w,I];1H.1w=1w;1H.I=I;1g(1H)}},6g:q(1w,I){o C.48[1w]=I},8G:q(1w){E(C.48[1w]!==M.1k[1w])o C.48[1w]},e0:q(1w){G I=C.48[1w];8W C.48[1w];o I},6r:q(){o M.2E(C.48)},4p:q(){o C.5E(\'1w\')},1T:q(){o C.5E(\'I\')},1m:q(I){G 1e=C.7b(q(1H){o 1H.I===I});o 1e&&1e.1w},eg:q(W){o C.2E().4Y(W)},4Y:q(W){o 1t 44(W).3t(C,q(1s,1H){1s.6g(1H.1w,1H.I);o 1s})},4R:q(){o C.3t([],q(U,1H){G 1w=bS(1H.1w),1T=1H.I;E(1T&&3h 1T==\'W\'){E(M.4H(1T))o U.1X(1T.2X(8D.95(1w)))}1i U.1h(8D(1w,1T));o U}).2A(\'&\')},2F:q(){o\'#<44:{\'+C.2X(q(1H){o 1H.2X(M.2F).2A(\': \')}).2A(\', \')+\'}>\'},3H:q(){o M.3H(C.6r())},2E:q(){o 1t 44(C)}}})());44.1k.8A=44.1k.6r;44.c3=$H;G cc=2m.2w(2N,{2O:q(4i,54,68){C.4i=4i;C.54=54;C.68=68},4f:q(1g){G I=C.4i;1P(C.1G(I)){1g(I);I=I.8z()}},1G:q(I){E(I<C.4i)o 1p;E(C.68)o I<C.54;o I<=C.54}});G $R=q(4i,54,68){o 1t cc(4i,54,68)};G 1O={c7:q(){o cf.cg(q(){o 1t d1()},q(){o 1t cb(\'e9.ca\')},q(){o 1t cb(\'ed.ca\')})||1p},8y:0};1O.5M={6G:[],4f:q(1g){C.6G.4f(1g)},c5:q(4b){E(!C.1G(4b))C.6G.1h(4b)},e1:q(4b){C.6G=C.6G.6u(4b)},7x:q(32,2P,1Y,3o){C.1E(q(4b){E(M.2C(4b[32])){24{4b[32].3D(4b,[2P,1Y,3o])}29(e){}}})}};M.18(1O.5M,2N);1O.5M.c5({83:q(){1O.8y++},3R:q(){1O.8y--}});1O.8q=2m.2w({2O:q(V){C.V={1B:\'6U\',7C:1v,6V:\'7h/x-eH-1z-eo\',8N:\'ev-8\',3F:\'\',5z:1v,93:1v};M.18(C.V,V||{});C.V.1B=C.V.1B.2e();E(M.3g(C.V.3F))C.V.3F=C.V.3F.7O();1i E(M.8E(C.V.3F))C.V.3F=C.V.3F.6r()}});1O.5q=2m.2w(1O.8q,{92:1p,2O:q($4y,2U,V){$4y(V);C.1Y=1O.c7();C.2P(2U)},2P:q(2U){C.2U=2U;C.1B=C.V.1B;G 3a=M.2E(C.V.3F);E(![\'8G\',\'6U\'].1G(C.1B)){3a[\'dC\']=C.1B;C.1B=\'6U\'}C.3F=3a;E(3a=M.4R(3a)){E(C.1B==\'8G\')C.2U+=(C.2U.1G(\'?\')?\'&\':\'?\')+3a;1i E(/ea|d7|cY/.2Y(4l.4o))3a+=\'&6M=\'}24{G 2x=1t 1O.8h(C);E(C.V.83)C.V.83(2x);1O.5M.7x(\'83\',C,2x);C.1Y.dl(C.1B.2i(),C.2U,C.V.7C);E(C.V.7C)C.8Z.2B(C).4S(1);C.1Y.7j=C.8C.2B(C);C.d0();C.26=C.1B==\'6U\'?(C.V.dR||3a):1j;C.1Y.dU(C.26);E(!C.V.7C&&C.1Y.bN)C.8C()}29(e){C.5r(e)}},8C:q(){G 2Q=C.1Y.2Q;E(2Q>1&&!((2Q==4)&&C.92))C.8Z(C.1Y.2Q)},d0:q(){G 4W={\'X-dB-dE\':\'d1\',\'X-1f-8B\':1f.8B,\'dI\':\'4v/dJ, 4v/79, 7h/6K, 4v/6K, */*\'};E(C.1B==\'6U\'){4W[\'8U-1r\']=C.V.6V+(C.V.8N?\'; dF=\'+C.V.8N:\'\');E(C.1Y.bN&&(4l.4o.1e(/88\\/(\\d{4})/)||[0,aD])[1]<aD)4W[\'dK\']=\'dz\'}E(3h C.V.ay==\'W\'){G 5X=C.V.ay;E(M.2C(5X.1h))17(G i=0,O=5X.O;i<O;i+=2)4W[5X[i]]=5X[i+1];1i $H(5X).1E(q(1H){4W[1H.1w]=1H.I})}17(G 1d 1Q 4W)C.1Y.dd(1d,4W[1d])},5f:q(){G 4N=C.6k();o!4N||(4N>=dn&&4N<dv)},6k:q(){24{o C.1Y.4N||0}29(e){o 0}},8Z:q(2Q){G 6S=1O.5q.bf[2Q],2x=1t 1O.8h(C);E(6S==\'8J\'){24{C.92=1v;(C.V[\'5J\'+2x.4N]||C.V[\'5J\'+(C.5f()?\'ds\':\'dO\')]||1f.3i)(2x,2x.7z)}29(e){C.5r(e)}G 6V=2x.5V(\'8U-1r\');E(C.V.93==\'al\'||(C.V.93&&C.7E()&&6V&&6V.1e(/^\\s*(4v|7h)\\/(x-)?(eu|eq)50(;.*)?\\s*$/i)))C.bC()}24{(C.V[\'5J\'+6S]||1f.3i)(2x,2x.7z);1O.5M.7x(\'5J\'+6S,C,2x,2x.7z)}29(e){C.5r(e)}E(6S==\'8J\'){C.1Y.7j=1f.3i}},7E:q(){G m=C.2U.1e(/^\\s*e2?:\\/\\/[^\\/]*/);o!m||(m[0]==\'#{96}//#{8k}#{7u}\'.aq({96:7T.96,8k:1b.8k,7u:7T.7u?\':\'+7T.7u:\'\'}))},5V:q(1d){24{o C.1Y.8r(1d)||1j}29(e){o 1j}},bC:q(){24{o 81((C.1Y.3f||\'\').8b())}29(e){C.5r(e)}},5r:q(8u){(C.V.aX||1f.3i)(C,8u);1O.5M.7x(\'aX\',C,8u)}});1O.5q.bf=[\'e5\',\'eB\',\'ey\',\'eE\',\'8J\'];1O.8h=2m.2w({2O:q(2P){C.2P=2P;G 1Y=C.1Y=2P.1Y,2Q=C.2Q=1Y.2Q;E((2Q>2&&!1f.1U.43)||2Q==4){C.4N=C.6k();C.8s=C.br();C.3f=22.62(1Y.3f);C.7z=C.aj()}E(2Q==4){G 6K=1Y.b1;C.b1=M.2D(6K)?1j:6K;C.dm=C.ag()}},4N:0,8s:\'\',6k:1O.5q.1k.6k,br:q(){24{o C.1Y.8s||\'\'}29(e){o\'\'}},5V:1O.5q.1k.5V,du:q(){24{o C.8I()}29(e){o 1j}},8r:q(1d){o C.1Y.8r(1d)},8I:q(){o C.1Y.8I()},aj:q(){G 3o=C.5V(\'X-ai\');E(!3o)o 1j;3o=8t(ah(3o));24{o 3o.5z(C.2P.V.a5||!C.2P.7E())}29(e){C.2P.5r(e)}},ag:q(){G V=C.2P.V;E(!V.5z||(V.5z!=\'al\'&&!(C.5V(\'8U-1r\')||\'\').1G(\'7h/3o\'))||C.3f.56())o 1j;24{o C.3f.5z(V.a5||!C.2P.7E())}29(e){C.2P.5r(e)}}});1O.aa=2m.2w(1O.5q,{2O:q($4y,3x,2U,V){C.3x={5f:(3x.5f||3x),8e:(3x.8e||(3x.5f?1j:3x))};V=M.2E(V);G 3R=V.3R;V.3R=(q(2x,3o){C.ax(2x.3f);E(M.2C(3R))3R(2x,3o)}).2B(C);$4y(2U,V)},ax:q(3f){G 67=C.3x[C.5f()?\'5f\':\'8e\'],V=C.V;E(!V.5m)3f=3f.4q();E(67=$(67)){E(V.53){E(M.3g(V.53)){G 53={};53[V.53]=3f;67.3I(53)}1i V.53(67,3f)}1i 67.4Y(3f)}}});1O.f8=2m.2w(1O.8q,{2O:q($4y,3x,2U,V){$4y(V);C.3R=C.V.3R;C.4w=(C.V.4w||2);C.51=(C.V.51||1);C.8w={};C.3x=3x;C.2U=2U;C.4i()},4i:q(){C.V.3R=C.aH.2B(C);C.6E()},9M:q(){C.8w.V.3R=4D;hj(C.3Z);(C.3R||1f.3i).3D(C,1q)},aH:q(2x){E(C.V.51){C.51=(2x.3f==C.aJ?C.51*C.V.51:1);C.aJ=2x.3f}C.3Z=C.6E.2B(C).8Y(C.51*C.4w)},6E:q(){C.8w=1t 1O.aa(C.3x,C.2U,C.V)}});q $(k){E(1q.O>1){17(G i=0,21=[],O=1q.O;i<O;i++)21.1h($(1q[i]));o 21}E(M.3g(k))k=1b.hN(k);o J.18(k)}E(1f.3N.82){1b.9y=q(1u,84){G U=[];G 8x=1b.2R(1u,$(84)||1b,1j,hE.hw,1j);17(G i=0,O=8x.hA;i<O;i++)U.1h(J.18(8x.hD(i)));o U}}E(!1F.71)G 71={};E(!71.ae){M.18(71,{ae:1,gE:2,a9:3,gD:4,gC:5,gB:6,gF:7,gJ:8,gA:9,gz:10,gr:11,gx:12})}(q(){G k=C.J;C.J=q(14,2t){2t=2t||{};14=14.2e();G 2Z=J.2Z;E(1f.1U.43&&2t.1d){14=\'<\'+14+\' 1d="\'+2t.1d+\'">\';8W 2t.1d;o J.6Q(1b.3Y(14),2t)}E(!2Z[14])2Z[14]=J.18(1b.3Y(14));o J.6Q(2Z[14].gY(1p),2t)};M.18(C.J,k||{});E(k)C.J.1k=k.1k}).2K(1F);J.2Z={};J.1c={8m:q(k){o $(k).Y.3q!=\'7y\'},am:q(k){k=$(k);J[J.8m(k)?\'by\':\'bI\'](k);o k},by:q(k){k=$(k);k.Y.3q=\'7y\';o k},bI:q(k){k=$(k);k.Y.3q=\'\';o k},cG:q(k){k=$(k);k.1R.74(k);o k},4Y:q(k,19){k=$(k);E(19&&19.3r)19=19.3r();E(M.4u(19))o k.4Y().3I(19);19=M.4n(19);k.5p=19.4q();19.5m.2B(19).4S();o k},1S:q(k,19){k=$(k);E(19&&19.3r)19=19.3r();1i E(!M.4u(19)){19=M.4n(19);G 8F=k.h1.h5();8F.h3(k);19.5m.2B(19).4S();19=8F.gO(19.4q())}k.1R.8K(19,k);o k},3I:q(k,3M){k=$(k);E(M.3g(3M)||M.55(3M)||M.4u(3M)||(3M&&(3M.3r||3M.4n)))3M={4X:3M};G 19,3I,14,3l;17(G 1x 1Q 3M){19=3M[1x];1x=1x.2e();3I=J.5A[1x];E(19&&19.3r)19=19.3r();E(M.4u(19)){3I(k,19);3O}19=M.4n(19);14=((1x==\'57\'||1x==\'7G\')?k.1R:k).14.2i();3l=J.7Q(14,19.4q());E(1x==\'2p\'||1x==\'7G\')3l.4e();3l.1E(3I.95(k));19.5m.2B(19).4S()}o k},4E:q(k,1L,2t){k=$(k);E(M.4u(1L))$(1L).6Q(2t||{});1i E(M.3g(1L))1L=1t J(1L,2t);1i 1L=1t J(\'1N\',1L);E(k.1R)k.1R.8K(1L,k);1L.5U(k);o 1L},2F:q(k){k=$(k);G 1s=\'<\'+k.14.2e();$H({\'1o\':\'1o\',\'1l\':\'6P\'}).1E(q(1H){G 1y=1H.3P(),1V=1H.2u();G I=(k[1y]||\'\').2J();E(I)1s+=\' \'+1V+\'=\'+I.2F(1v)});o 1s+\'>\'},7A:q(k,1y){k=$(k);G 21=[];1P(k=k[1y])E(k.3u==1)21.1h(J.18(k));o 21},64:q(k){o $(k).7A(\'1R\')},bh:q(k){o $(k).2G("*")},bg:q(k){k=$(k).5T;1P(k&&k.3u!=1)k=k.4c;o $(k)},bM:q(k){E(!(k=$(k).5T))o[];1P(k&&k.3u!=1)k=k.4c;E(k)o[k].1X($(k).4C());o[]},60:q(k){o $(k).7A(\'cB\')},4C:q(k){o $(k).7A(\'4c\')},gU:q(k){k=$(k);o k.60().4e().1X(k.4C())},1e:q(k,42){E(M.3g(42))42=1t 15(42);o 42.1e($(k))},ht:q(k,1u,1m){k=$(k);E(1q.O==1)o $(k.1R);G 64=k.64();o M.55(1u)?64[1u]:15.6d(64,1u,1m)},gT:q(k,1u,1m){k=$(k);E(1q.O==1)o k.bg();o M.55(1u)?k.bh()[1u]:J.2G(k,1u)[1m||0]},gN:q(k,1u,1m){k=$(k);E(1q.O==1)o $(15.25.6H(k));G 60=k.60();o M.55(1u)?60[1u]:15.6d(60,1u,1m)},6j:q(k,1u,1m){k=$(k);E(1q.O==1)o $(15.25.6B(k));G 4C=k.4C();o M.55(1u)?4C[1u]:15.6d(4C,1u,1m)},2G:q(){G 1W=$A(1q),k=$(1W.4U());o 15.7X(k,1W)},5k:q(){G 1W=$A(1q),k=$(1W.4U());o 15.7X(k.1R,1W).6u(k)},8p:q(k){k=$(k);G 1o=k.5s(\'1o\'),5S=1q.5H;E(1o)o 1o;do{1o=\'gv\'+5S.bx++}1P($(1o));k.6Q(\'1o\',1o);o 1o},5s:q(k,1d){k=$(k);E(1f.1U.43){G t=J.3T.86;E(t.1T[1d])o t.1T[1d](k,1d);E(t.3v[1d])1d=t.3v[1d];E(1d.1G(\':\')){o(!k.2t||!k.2t[1d])?1j:k.2t[1d].I}}o k.94(1d)},6Q:q(k,1d,I){k=$(k);G 2t={},t=J.3T.6m;E(3h 1d==\'W\')2t=1d;1i 2t[1d]=M.2D(I)?1v:I;17(G 2d 1Q 2t){1d=t.3v[2d]||2d;I=2t[2d];E(t.1T[2d])1d=t.1T[2d](k,I);E(I===1p||I===1j)k.9e(1d);1i E(I===1v)k.bt(1d,1d);1i k.bt(1d,I)}o k},co:q(k){o $(k).61().3d},cy:q(k){o $(k).61().2h},6x:q(k){o 1t J.7N(k)},7o:q(k,1l){E(!(k=$(k)))o;G 80=k.1l;o(80.O>0&&(80==1l||1t 49("(^|\\\\s)"+1l+"(\\\\s|$)").2Y(80)))},b8:q(k,1l){E(!(k=$(k)))o;E(!k.7o(1l))k.1l+=(k.1l?\' \':\'\')+1l;o k},ba:q(k,1l){E(!(k=$(k)))o;k.1l=k.1l.1S(1t 49("(^|\\\\s+)"+1l+"(\\\\s+|$)"),\' \').4x();o k},gq:q(k,1l){E(!(k=$(k)))o;o k[k.7o(1l)?\'ba\':\'b8\'](1l)},gG:q(k){k=$(k);G L=k.5T;1P(L){G b9=L.4c;E(L.3u==3&&!/\\S/.2Y(L.4j))k.74(L);L=b9}o k},5R:q(k){o $(k).5p.56()},7p:q(k,3U){k=$(k),3U=$(3U);E(k.bd)o(k.bd(3U)&8)===8;E(3U.5j)o 3U.5j(k)&&3U!==k;1P(k=k.1R)E(k==3U)o 1v;o 1p},bj:q(k){k=$(k);G 5D=k.4g();1F.bj(5D[0],5D[1]);o k},2c:q(k,Y){k=$(k);Y=Y==\'8V\'?\'7k\':Y.8S();G I=k.Y[Y];E(!I||I==\'6L\'){G 8n=1b.hL.hd(k,1j);I=8n?8n[Y]:1j}E(Y==\'3L\')o I?5w(I):1.0;o I==\'6L\'?1j:I},hc:q(k){o $(k).2c(\'3L\')},6e:q(k,4P){k=$(k);G 8g=k.Y,1e;E(M.3g(4P)){k.Y.8v+=\';\'+4P;o 4P.1G(\'3L\')?k.5F(4P.1e(/3L:\\s*(\\d?\\.?\\d*)/)[1]):k}17(G 1y 1Q 4P)E(1y==\'3L\')k.5F(4P[1y]);1i 8g[(1y==\'8V\'||1y==\'7k\')?(M.2D(8g.8T)?\'7k\':\'8T\'):1y]=4P[1y];o k},5F:q(k,I){k=$(k);k.Y.3L=(I==1||I===\'\')?\'\':(I<0.7Y)?0:I;o k},61:q(k){k=$(k);G 3q=k.2c(\'3q\');E(3q!=\'7y\'&&3q!=1j)o{2h:k.5W,3d:k.5G};G 3X=k.Y;G b5=3X.8j;G aV=3X.1x;G aW=3X.3q;3X.8j=\'5g\';3X.1x=\'5P\';3X.3q=\'hs\';G b4=k.bG;G b2=k.bL;3X.3q=aW;3X.1x=aV;3X.8j=b5;o{2h:b4,3d:b2}},hJ:q(k){k=$(k);G 5D=J.2c(k,\'1x\');E(5D==\'63\'||!5D){k.8d=1v;k.Y.1x=\'70\';E(1f.1U.4d){k.Y.2p=0;k.Y.2y=0}}o k},hH:q(k){k=$(k);E(k.8d){k.8d=4D;k.Y.1x=k.Y.2p=k.Y.2y=k.Y.4X=k.Y.65=\'\'}o k},hz:q(k){k=$(k);E(k.58)o k;k.58=J.2c(k,\'8c\')||\'6L\';E(k.58!==\'5g\')k.Y.8c=\'5g\';o k},hC:q(k){k=$(k);E(!k.58)o k;k.Y.8c=k.58==\'6L\'?\'\':k.58;k.58=1j;o k},4g:q(k){G 2M=0,2L=0;do{2M+=k.5b||0;2L+=k.52||0;k=k.2I}1P(k);o J.4t(2L,2M)},6p:q(k){G 2M=0,2L=0;do{2M+=k.5b||0;2L+=k.52||0;k=k.2I;E(k){E(k.14.2i()==\'bq\')2j;G p=J.2c(k,\'1x\');E(p!==\'63\')2j}}1P(k);o J.4t(2L,2M)},a4:q(k){k=$(k);E(k.2c(\'1x\')==\'5P\')o k;G 8o=k.6p();G 2p=8o[1];G 2y=8o[0];G 2h=k.bG;G 3d=k.bL;k.bJ=2y-5w(k.Y.2y||0);k.bK=2p-5w(k.Y.2p||0);k.bz=k.Y.2h;k.bH=k.Y.3d;k.Y.1x=\'5P\';k.Y.2p=2p+\'3m\';k.Y.2y=2y+\'3m\';k.Y.2h=2h+\'3m\';k.Y.3d=3d+\'3m\';o k},9j:q(k){k=$(k);E(k.2c(\'1x\')==\'70\')o k;k.Y.1x=\'70\';G 2p=5w(k.Y.2p||0)-(k.bK||0);G 2y=5w(k.Y.2y||0)-(k.bJ||0);k.Y.2p=2p+\'3m\';k.Y.2y=2y+\'3m\';k.Y.3d=k.bH;k.Y.2h=k.bz;o k},9a:q(k){G 2M=0,2L=0;do{2M+=k.47||0;2L+=k.4k||0;k=k.1R}1P(k);o J.4t(2L,2M)},6c:q(k){E(k.2I)o $(k.2I);E(k==1b.26)o $(k);E(k.14.2i()==\'7g\')o $(1b.26);1P((k=k.1R)&&k!=1b.26)E(J.2c(k,\'1x\')!=\'63\')o $(k);o $(1b.26)},6Z:q(8l){G 2M=0,2L=0;G k=8l;do{2M+=k.5b||0;2L+=k.52||0;E(k.2I==1b.26&&J.2c(k,\'1x\')==\'5P\')2j}1P(k=k.2I);k=8l;do{E(!1f.1U.4d||(k.14&&(k.14.2i()==\'bq\'))){2M-=k.47||0;2L-=k.4k||0}}1P(k=k.1R);o J.4t(2L,2M)},ab:q(k,2b){G V=M.18({bp:1v,bo:1v,bm:1v,bn:1v,5b:0,52:0},1q[2]||{});2b=$(2b);G p=2b.6Z();k=$(k);G 6a=[0,0];G 2V=1j;E(J.2c(k,\'1x\')==\'5P\'){2V=k.6c();6a=2V.6Z()}E(2V==1b.26){6a[0]-=1b.26.52;6a[1]-=1b.26.5b}E(V.bp)k.Y.2y=(p[0]-6a[0]+V.52)+\'3m\';E(V.bo)k.Y.2p=(p[1]-6a[1]+V.5b)+\'3m\';E(V.bm)k.Y.2h=2b.5W+\'3m\';E(V.bn)k.Y.3d=2b.5G+\'3m\';o k}};J.1c.8p.bx=1;M.18(J.1c,{h6:J.1c.2G,gH:J.1c.bM});J.3T={6m:{3v:{1l:\'6P\',aN:\'17\'},1T:{}}};E(1f.1U.4d){J.1c.2c=J.1c.2c.4E(q(2T,k,Y){5v(Y){2k\'2y\':2k\'2p\':2k\'65\':2k\'4X\':E(2T(k,\'1x\')===\'63\')o 1j;2k\'3d\':2k\'2h\':E(!J.8m(k))o 1j;G 7m=an(2T(k,Y),10);E(7m!==k[\'31\'+Y.6h()])o 7m+\'3m\';G 3p;E(Y===\'3d\'){3p=[\'7l-2p-2h\',\'7r-2p\',\'7r-4X\',\'7l-4X-2h\']}1i{3p=[\'7l-2y-2h\',\'7r-2y\',\'7r-65\',\'7l-65-2h\']}o 3p.3t(7m,q(2W,1y){G 8i=2T(k,1y);o 8i===1j?2W:2W-an(8i,10)})+\'3m\';69:o 2T(k,Y)}});J.1c.5s=J.1c.5s.4E(q(2T,k,1V){E(1V===\'78\')o k.78;o 2T(k,1V)})}1i E(1f.1U.43){J.1c.6c=J.1c.6c.4E(q(2T,k){k=$(k);24{k.2I}29(e){o $(1b.26)}G 1x=k.2c(\'1x\');E(1x!==\'63\')o 2T(k);k.6e({1x:\'70\'});G I=2T(k);k.6e({1x:1x});o I});$w(\'6p 6Z\').1E(q(1B){J.1c[1B]=J.1c[1B].4E(q(2T,k){k=$(k);24{k.2I}29(e){o J.4t(0,0)}G 1x=k.2c(\'1x\');E(1x!==\'63\')o 2T(k);G 2I=k.6c();E(2I&&2I.2c(\'1x\')===\'gQ\')2I.6e({8Q:1});k.6e({1x:\'70\'});G I=2T(k);k.6e({1x:1x});o I})});J.1c.4g=J.1c.4g.4E(q(2T,k){24{k.2I}29(e){o J.4t(0,0)}o 2T(k)});J.1c.2c=q(k,Y){k=$(k);Y=(Y==\'8V\'||Y==\'7k\')?\'8T\':Y.8S();G I=k.Y[Y];E(!I&&k.5l)I=k.5l[Y];E(Y==\'3L\'){E(I=(k.2c(\'2g\')||\'\').1e(/8X\\(3L=(.*)\\)/))E(I[1])o 5w(I[1])/aM;o 1.0}E(I==\'6L\'){E((Y==\'2h\'||Y==\'3d\')&&(k.2c(\'3q\')!=\'7y\'))o k[\'31\'+Y.6h()]+\'3m\';o 1j}o I};J.1c.5F=q(k,I){q 8R(2g){o 2g.1S(/8X\\([^\\)]*\\)/gi,\'\')}k=$(k);G 5l=k.5l;E((5l&&!5l.gS)||(!5l&&k.Y.8Q==\'cm\'))k.Y.8Q=1;G 2g=k.2c(\'2g\'),Y=k.Y;E(I==1||I===\'\'){(2g=8R(2g))?Y.2g=2g:Y.9e(\'2g\');o k}1i E(I<0.7Y)I=0;Y.2g=8R(2g)+\'8X(3L=\'+(I*aM)+\')\';o k};J.3T={86:{3v:{\'6P\':\'1l\',\'17\':\'aN\'},1T:{7f:q(k,1V){o k.94(1V,2)},aE:q(k,1V){G L=k.c9(1V);o L?L.I:""},2r:q(k,1V){1V=k.94(1V);o 1V?1V.2J().3w(23,-2):1j},6O:q(k,1V){o $(k).3K(1V)?1V:1j},Y:q(k){o k.Y.8v.2e()},78:q(k){o k.78}}}};J.3T.6m={3v:M.18({gR:\'gM\',gP:\'gW\'},J.3T.86.3v),1T:{3V:q(k,I){k.3V=!!I},Y:q(k,I){k.Y.8v=I?I:\'\'}}};J.3T.8M={};$w(\'h4 h2 gX gZ h0 7M \'+\'gL gK gw gy gu\').1E(q(2d){J.3T.6m.3v[2d.2e()]=2d;J.3T.8M[2d.2e()]=2d});(q(v){M.18(v,{da:v.7f,bs:v.7f,1r:v.7f,5C:v.aE,3E:v.6O,3V:v.6O,gs:v.6O,go:v.6O,gp:v.2r,aY:v.2r,gI:v.2r,h7:v.2r,hB:v.2r,hv:v.2r,hx:v.2r,hy:v.2r,hF:v.2r,hM:v.2r,hO:v.2r,hP:v.2r,hG:v.2r,hI:v.2r,hK:v.2r,hu:v.2r,he:v.2r,hf:v.2r})})(J.3T.86.1T)}1i E(1f.1U.88&&/hg:1\\.8\\.0/.2Y(4l.4o)){J.1c.5F=q(k,I){k=$(k);k.Y.3L=(I==1)?0.hh:(I===\'\')?\'\':(I<0.7Y)?0:I;o k}}1i E(1f.1U.4m){J.1c.5F=q(k,I){k=$(k);k.Y.3L=(I==1||I===\'\')?\'\':(I<0.7Y)?0:I;E(I==1)E(k.14.2i()==\'bQ\'&&k.2h){k.2h++;k.2h--}1i 24{G n=1b.cR(\' \');k.5U(n);k.74(n)}29(e){}o k};J.1c.4g=q(k){G 2M=0,2L=0;do{2M+=k.5b||0;2L+=k.52||0;E(k.2I==1b.26)E(J.2c(k,\'1x\')==\'5P\')2j;k=k.2I}1P(k);o J.4t(2L,2M)}}E(1f.1U.43||1f.1U.4d){J.1c.4Y=q(k,19){k=$(k);E(19&&19.3r)19=19.3r();E(M.4u(19))o k.4Y().3I(19);19=M.4n(19);G 14=k.14.2i();E(14 1Q J.5A.4L){$A(k.3l).1E(q(L){k.74(L)});J.7Q(14,19.4q()).1E(q(L){k.5U(L)})}1i k.5p=19.4q();19.5m.2B(19).4S();o k}}E(\'cU\'1Q 1b.3Y(\'1N\')){J.1c.1S=q(k,19){k=$(k);E(19&&19.3r)19=19.3r();E(M.4u(19)){k.1R.8K(19,k);o k}19=M.4n(19);G 2V=k.1R,14=2V.14.2i();E(J.5A.4L[14]){G 4c=k.6j();G 8H=J.7Q(14,19.4q());2V.74(k);E(4c)8H.1E(q(L){2V.7S(L,4c)});1i 8H.1E(q(L){2V.5U(L)})}1i k.cU=19.4q();19.5m.2B(19).4S();o k}}J.4t=q(l,t){G 1s=[l,t];1s.2y=l;1s.2p=t;o 1s};J.7Q=q(14,79){G 1N=1t J(\'1N\'),t=J.5A.4L[14];E(t){1N.5p=t[0]+79+t[1];t[2].7R(q(){1N=1N.5T})}1i 1N.5p=79;o $A(1N.3l)};J.5A={57:q(k,L){k.1R.7S(L,k)},2p:q(k,L){k.7S(L,k.5T)},4X:q(k,L){k.5U(L)},7G:q(k,L){k.1R.7S(L,k.4c)},4L:{h8:[\'<4I>\',\'</4I>\',1],7d:[\'<4I><5O>\',\'</5O></4I>\',2],bV:[\'<4I><5O><7V>\',\'</7V></5O></4I>\',3],91:[\'<4I><5O><7V><d8>\',\'</d8></7V></5O></4I>\',4],c6:[\'<2G>\',\'</2G>\',1]}};(q(){M.18(C.4L,{bP:C.4L.7d,bU:C.4L.7d,c0:C.4L.91})}).2K(J.5A);J.1c.7v={3K:q(k,1V){1V=J.3T.8M[1V]||1V;G L=$(k).c9(1V);o!!(L&&L.h9)}};J.1c.3C={};M.18(J,J.1c);E(!1f.3N.6D&&1b.3Y(\'1N\')[\'5e\']){1F.6C={};1F.6C.1k=1b.3Y(\'1N\')[\'5e\'];1f.3N.6D=1v}J.18=(q(){E(1f.3N.7t)o 1f.K;G 1c={},3C=J.1c.3C;G 18=M.18(q(k){E(!k||k.77||k.3u!=1||k==1F)o k;G 2H=M.2E(1c),14=k.14.2i(),1y,I;E(3C[14])M.18(2H,3C[14]);17(1y 1Q 2H){I=2H[1y];E(M.2C(I)&&!(1y 1Q k))k[1y]=I.4M()}k.77=1f.3i;o k},{7q:q(){E(!1f.3N.6D){M.18(1c,J.1c);M.18(1c,J.1c.7v)}}});18.7q();o 18})();J.3K=q(k,1V){E(k.3K)o k.3K(1V);o J.1c.7v.3K(k,1V)};J.6y=q(2H){G F=1f.3N,T=J.1c.3C;E(!2H){M.18(1C,1C.1c);M.18(1C.J,1C.J.1c);M.18(J.1c.3C,{"ha":M.2E(1C.1c),"hb":M.2E(1C.J.1c),"c6":M.2E(1C.J.1c),"c4":M.2E(1C.J.1c)})}E(1q.O==2){G 14=2H;2H=1q[1]}E(!14)M.18(J.1c,2H||{});1i{E(M.4H(14))14.1E(18);1i 18(14)}q 18(14){14=14.2i();E(!J.1c.3C[14])J.1c.3C[14]={};M.18(J.1c.3C[14],2H)}q 7w(2H,5y,7K){7K=7K||1p;17(G 1y 1Q 2H){G I=2H[1y];E(!M.2C(I))3O;E(!7K||!(1y 1Q 5y))5y[1y]=I.4M()}}q ci(14){G 1M;G 90={"hi":"hq","c4":"hr","P":"hp","ho":"hk","hl":"hm","hn":"gV","gm":"fh","fi":"fj","fk":"5Q","fg":"5Q","ff":"5Q","fb":"5Q","fa":"5Q","fc":"5Q","Q":"fd","fe":"bT","fl":"bT","A":"fm","bQ":"ft","fu":"fv","fw":"bO","fs":"bO","bP":"8O","bU":"8O","7d":"8O","bV":"fr","c0":"c1","91":"c1","fn":"fo","fp":"eJ"};E(90[14])1M=\'7g\'+90[14]+\'J\';E(1F[1M])o 1F[1M];1M=\'7g\'+14+\'J\';E(1F[1M])o 1F[1M];1M=\'7g\'+14.6h()+\'J\';E(1F[1M])o 1F[1M];1F[1M]={};1F[1M].1k=1b.3Y(14)[\'5e\'];o 1F[1M]}E(F.6D){7w(J.1c,6C.1k);7w(J.1c.7v,6C.1k,1v)}E(F.7t){17(G 8P 1Q J.1c.3C){G 1M=ci(8P);E(M.2D(1M))3O;7w(T[8P],1M.1k)}}M.18(J,J.1c);8W J.3C;E(J.18.7q)J.18.7q();J.2Z={}};1b.fq={61:q(){G 6o={},B=1f.1U;$w(\'2h 3d\').1E(q(d){G D=d.6h();E(B.4m&&!1b.2R){6o[d]=5S[\'f9\'+D]}1i E(B.4d&&5w(1F.gn.eR())<9.5){6o[d]=1b.26[\'cJ\'+D]}1i{6o[d]=1b.5i[\'cJ\'+D]}});o 6o},cy:q(){o C.61().2h},co:q(){o C.61().3d},eS:q(){o J.4t(1F.a6||1b.5i.4k||1b.26.4k,1F.aR||1b.5i.47||1b.26.47)}};G 15=2m.2w({2O:q(1u){C.1u=1u.4x();E(C.cj()){C.4O=\'cx\'}1i E(C.cl()){C.4O=\'2s\';C.cw()}1i{C.4O="cm";C.cr()}},cl:q(){E(!1f.3N.82)o 1p;G e=C.1u;E(1f.1U.4m&&(e.1G("-2v-1r")||e.1G(":5R")))o 1p;E((/(\\[[\\w-]*?:|:3V)/).2Y(e))o 1p;o 1v},cj:q(){E(!1f.3N.ck)o 1p;E(!15.89)15.89=1t J(\'1N\');24{15.89.cq(C.1u)}29(e){o 1p}o 1v},cr:q(){G e=C.1u,4r=15.6z,h=15.25,c=15.6s,3A,p,m;E(15.5o[e]){C.3Q=15.5o[e];o}C.3Q=["C.3Q = q(1n) {","G r = 1n, h = 15.25, c = 1p, n;"];1P(e&&3A!=e&&(/\\S/).2Y(e)){3A=e;17(G i 1Q 4r){p=4r[i];E(m=e.1e(p)){C.3Q.1h(M.2C(c[i])?c[i](m):1t 3c(c[i]).2R(m));e=e.1S(m[0],\'\');2j}}}C.3Q.1h("o h.98(n);\\n}");81(C.3Q.2A(\'\\n\'));15.5o[C.1u]=C.3Q},cw:q(){G e=C.1u,4r=15.6z,x=15.2s,3A,m;E(15.5o[e]){C.2s=15.5o[e];o}C.3Q=[\'.//*\'];1P(e&&3A!=e&&(/\\S/).2Y(e)){3A=e;17(G i 1Q 4r){E(m=e.1e(4r[i])){C.3Q.1h(M.2C(x[i])?x[i](m):1t 3c(x[i]).2R(m));e=e.1S(m[0],\'\');2j}}}C.2s=C.3Q.2A(\'\');15.5o[C.1u]=C.2s},7Z:q(1n){1n=1n||1b;G e=C.1u,U;5v(C.4O){2k\'cx\':E(1n!==1b){G cs=1n.1o,1o=$(1n).8p();e="#"+1o+" "+e}U=$A(1n.eT(e)).2X(J.18);1n.1o=cs;o U;2k\'2s\':o 1b.9y(C.2s,1n);69:o C.3Q(1n)}},1e:q(k){C.8a=[];G e=C.1u,4r=15.6z,as=15.9Z;G 3A,p,m;1P(e&&3A!==e&&(/\\S/).2Y(e)){3A=e;17(G i 1Q 4r){p=4r[i];E(m=e.1e(p)){E(as[i]){C.8a.1h([i,M.2E(m)]);e=e.1S(m[0],\'\')}1i{o C.7Z(1b).1G(k)}}}}G 1e=1v,1d,2q;17(G i=0,87;87=C.8a[i];i++){1d=87[0],2q=87[1];E(!15.9Z[1d](k,2q)){1e=1p;2j}}o 1e},2J:q(){o C.1u},2F:q(){o"#<15:"+C.1u.2F()+">"}});M.18(15,{5o:{},2s:{4A:"//*",1K:"/*",5k:"/6f-4T::*[1]",6i:\'/6f-4T::*\',14:q(m){E(m[1]==\'*\')o\'\';o"[aA-1d()=\'"+m[1].2e()+"\' cu aA-1d()=\'"+m[1].2i()+"\']"},1l:"[5j(1X(\' \', @6P, \' \'), \' #{1} \')]",1o:"[@1o=\'#{1}\']",5Y:q(m){m[1]=m[1].2e();o 1t 3c("[@#{1}]").2R(m)},2d:q(m){m[1]=m[1].2e();m[3]=m[5]||m[6];o 1t 3c(15.2s.6t[m[2]]).2R(m)},6l:q(m){G h=15.2s.2l[m[1]];E(!h)o\'\';E(M.2C(h))o h(m);o 1t 3c(15.2s.2l[m[1]]).2R(m)},6t:{\'=\':"[@#{1}=\'#{3}\']",\'!=\':"[@#{1}!=\'#{3}\']",\'^=\':"[eU-eQ(@#{1}, \'#{3}\')]",\'$=\':"[5I(@#{1}, (3n-O(@#{1}) - 3n-O(\'#{3}\') + 1))=\'#{3}\']",\'*=\':"[5j(@#{1}, \'#{3}\')]",\'~=\':"[5j(1X(\' \', @#{1}, \' \'), \' #{3} \')]",\'|=\':"[5j(1X(\'-\', @#{1}, \'-\'), \'-#{3}-\')]"},2l:{\'3P-1K\':\'[4K(9Y-4T::*)]\',\'2u-1K\':\'[4K(6f-4T::*)]\',\'6A-1K\':\'[4K(9Y-4T::* cu 6f-4T::*)]\',\'5R\':"[3z(*) = 0 6q (3z(4v()) = 0)]",\'3V\':"[@3V]",\'3E\':"[(@3E) 6q (@1r!=\'5g\')]",\'bR\':"[4K(@3E) 6q (@1r!=\'5g\')]",\'4K\':q(m){G e=m[6],p=15.6z,x=15.2s,3A,v;G a2=[];1P(e&&3A!=e&&(/\\S/).2Y(e)){3A=e;17(G i 1Q p){E(m=e.1e(p[i])){v=M.2C(x[i])?x[i](m):1t 3c(x[i]).2R(m);a2.1h("("+v.5I(1,v.O-1)+")");e=e.1S(m[0],\'\');2j}}}o"[4K("+a2.2A(" 6q ")+")]"},\'20-1K\':q(m){o 15.2s.2l.20("(3z(./9Y-4T::*) + 1) ",m)},\'20-2u-1K\':q(m){o 15.2s.2l.20("(3z(./6f-4T::*) + 1) ",m)},\'20-2v-1r\':q(m){o 15.2s.2l.20("1x() ",m)},\'20-2u-2v-1r\':q(m){o 15.2s.2l.20("(2u() + 1 - 1x()) ",m)},\'3P-2v-1r\':q(m){m[6]="1";o 15.2s.2l[\'20-2v-1r\'](m)},\'2u-2v-1r\':q(m){m[6]="1";o 15.2s.2l[\'20-2u-2v-1r\'](m)},\'6A-2v-1r\':q(m){G p=15.2s.2l;o p[\'3P-2v-1r\'](m)+p[\'2u-2v-1r\'](m)},20:q(66,m){G 41,1I=m[6],a0;E(1I==\'bX\')1I=\'2n+0\';E(1I==\'bW\')1I=\'2n+1\';E(41=1I.1e(/^(\\d+)$/))o\'[\'+66+"= "+41[1]+\']\';E(41=1I.1e(/^(-?\\d*)?n(([+-])(\\d+))?/)){E(41[1]=="-")41[1]=-1;G a=41[1]?4V(41[1]):1;G b=41[2]?4V(41[2]):0;a0="[((#{66} - #{b}) eP #{a} = 0) 6q "+"((#{66} - #{b}) 1N #{a} >= 0)]";o 1t 3c(a0).2R({66:66,a:a,b:b})}}}},6s:{14:\'n = h.14(n, r, "#{1}", c);      c = 1p;\',1l:\'n = h.1l(n, r, "#{1}", c);    c = 1p;\',1o:\'n = h.1o(n, r, "#{1}", c);           c = 1p;\',5Y:\'n = h.5Y(n, r, "#{1}", c); c = 1p;\',2d:q(m){m[3]=(m[5]||m[6]);o 1t 3c(\'n = h.2d(n, r, "#{1}", "#{3}", "#{2}", c); c = 1p;\').2R(m)},6l:q(m){E(m[6])m[6]=m[6].1S(/"/g,\'\\\\"\');o 1t 3c(\'n = h.6l(n, "#{1}", "#{6}", r, c); c = 1p;\').2R(m)},4A:\'c = "4A";\',1K:\'c = "1K";\',5k:\'c = "5k";\',6i:\'c = "6i";\'},6z:{6i:/^\\s*~\\s*/,1K:/^\\s*>\\s*/,5k:/^\\s*\\+\\s*/,4A:/^\\s/,14:/^\\s*(\\*|[\\w\\-]+)(\\b|$)?/,1o:/^#([\\w\\-\\*]+)(\\b|$)/,1l:/^\\.([\\w\\-\\*]+)(\\b|$)/,6l:/^:((3P|2u|20|20-2u|6A)(-1K|-2v-1r)|5R|3V|(en|eL)eK|4K)(\\((.*?)\\))?(\\b|$|(?=\\s|[:+~>]))/,5Y:/^\\[((?:[\\w]+:)?[\\w]+)\\]/,2d:/\\[((?:[\\w-]*:)?[\\w-]+)\\s*(?:([!^$*~|]?=)\\s*(([\'"])([^\\4]*?)\\4|([^\'"][^\\]]*?)))?\\]/},9Z:{14:q(k,2q){o 2q[1].2i()==k.14.2i()},1l:q(k,2q){o J.7o(k,2q[1])},1o:q(k,2q){o k.1o===2q[1]},5Y:q(k,2q){o J.3K(k,2q[1])},2d:q(k,2q){G 4j=J.5s(k,2q[1]);o 4j&&15.6t[2q[2]](4j,2q[5]||2q[6])}},25:{1X:q(a,b){17(G i=0,L;L=b[i];i++)a.1h(L);o a},85:q(N){G cH=1f.3i;17(G i=0,L;L=N[i];i++)L.3S=cH;o N},59:q(N){17(G i=0,L;L=N[i];i++)L.3S=4D;o N},1m:q(1R,4e,6F){1R.3S=1f.3i;E(4e){17(G N=1R.3l,i=N.O-1,j=1;i>=0;i--){G L=N[i];E(L.3u==1&&(!6F||L.3S))L.7e=j++}}1i{17(G i=0,j=1,N=1R.3l;L=N[i];i++)E(L.3u==1&&(!6F||L.3S))L.7e=j++}},98:q(N){E(N.O==0)o N;G U=[],n;17(G i=0,l=N.O;i<l;i++)E(!(n=N[i]).3S){n.3S=1f.3i;U.1h(J.18(n))}o 15.25.59(U)},4A:q(N){G h=15.25;17(G i=0,U=[],L;L=N[i];i++)h.1X(U,L.4s(\'*\'));o U},1K:q(N){G h=15.25;17(G i=0,U=[],L;L=N[i];i++){17(G j=0,1K;1K=L.3l[j];j++)E(1K.3u==1&&1K.14!=\'!\')U.1h(1K)}o U},5k:q(N){17(G i=0,U=[],L;L=N[i];i++){G 6j=C.6B(L);E(6j)U.1h(6j)}o U},6i:q(N){G h=15.25;17(G i=0,U=[],L;L=N[i];i++)h.1X(U,J.4C(L));o U},6B:q(L){1P(L=L.4c)E(L.3u==1)o L;o 1j},6H:q(L){1P(L=L.cB)E(L.3u==1)o L;o 1j},14:q(N,1n,14,28){G cA=14.2i();G U=[],h=15.25;E(N){E(28){E(28=="4A"){17(G i=0,L;L=N[i];i++)h.1X(U,L.4s(14));o U}1i N=C[28](N);E(14=="*")o N}17(G i=0,L;L=N[i];i++)E(L.14.2i()===cA)U.1h(L);o U}1i o 1n.4s(14)},1o:q(N,1n,1o,28){G 3b=$(1o),h=15.25;E(!3b)o[];E(!N&&1n==1b)o[3b];E(N){E(28){E(28==\'1K\'){17(G i=0,L;L=N[i];i++)E(3b.1R==L)o[3b]}1i E(28==\'4A\'){17(G i=0,L;L=N[i];i++)E(J.7p(3b,L))o[3b]}1i E(28==\'5k\'){17(G i=0,L;L=N[i];i++)E(15.25.6H(3b)==L)o[3b]}1i N=h[28](N)}17(G i=0,L;L=N[i];i++)E(L==3b)o[3b];o[]}o(3b&&J.7p(3b,1n))?[3b]:[]},1l:q(N,1n,1l,28){E(N&&28)N=C[28](N);o 15.25.cC(N,1n,1l)},cC:q(N,1n,1l){E(!N)N=15.25.4A([1n]);G cD=\' \'+1l+\' \';17(G i=0,U=[],L,6n;L=N[i];i++){6n=L.1l;E(6n.O==0)3O;E(6n==1l||(\' \'+6n+\' \').1G(cD))U.1h(L)}o U},5Y:q(N,1n,2d,28){E(!N)N=1n.4s("*");E(N&&28)N=C[28](N);G U=[];17(G i=0,L;L=N[i];i++)E(J.3K(L,2d))U.1h(L);o U},2d:q(N,1n,2d,I,cF,28){E(!N)N=1n.4s("*");E(N&&28)N=C[28](N);G 2f=15.6t[cF],U=[];17(G i=0,L;L=N[i];i++){G 4j=J.5s(L,2d);E(4j===1j)3O;E(2f(4j,I))U.1h(L)}o U},6l:q(N,1d,I,1n,28){E(N&&28)N=C[28](N);E(!N)N=1n.4s("*");o 15.2l[1d](N,I,1n)}},2l:{\'3P-1K\':q(N,I,1n){17(G i=0,U=[],L;L=N[i];i++){E(15.25.6H(L))3O;U.1h(L)}o U},\'2u-1K\':q(N,I,1n){17(G i=0,U=[],L;L=N[i];i++){E(15.25.6B(L))3O;U.1h(L)}o U},\'6A-1K\':q(N,I,1n){G h=15.25;17(G i=0,U=[],L;L=N[i];i++)E(!h.6H(L)&&!h.6B(L))U.1h(L);o U},\'20-1K\':q(N,1I,1n){o 15.2l.20(N,1I,1n)},\'20-2u-1K\':q(N,1I,1n){o 15.2l.20(N,1I,1n,1v)},\'20-2v-1r\':q(N,1I,1n){o 15.2l.20(N,1I,1n,1p,1v)},\'20-2u-2v-1r\':q(N,1I,1n){o 15.2l.20(N,1I,1n,1v,1v)},\'3P-2v-1r\':q(N,1I,1n){o 15.2l.20(N,"1",1n,1p,1v)},\'2u-2v-1r\':q(N,1I,1n){o 15.2l.20(N,"1",1n,1v,1v)},\'6A-2v-1r\':q(N,1I,1n){G p=15.2l;o p[\'2u-2v-1r\'](p[\'3P-2v-1r\'](N,1I,1n),1I,1n)},bY:q(a,b,ch){E(a==0)o b>0?[b]:[];o $R(1,ch).3t([],q(2W,i){E(0==(i-b)%a&&(i-b)/a>=0)2W.1h(i);o 2W})},20:q(N,1I,1n,4e,6F){E(N.O==0)o[];E(1I==\'bX\')1I=\'2n+0\';E(1I==\'bW\')1I=\'2n+1\';G h=15.25,U=[],9l=[],m;h.85(N);17(G i=0,L;L=N[i];i++){E(!L.1R.3S){h.1m(L.1R,4e,6F);9l.1h(L.1R)}}E(1I.1e(/^\\d+$/)){1I=4V(1I);17(G i=0,L;L=N[i];i++)E(L.7e==1I)U.1h(L)}1i E(m=1I.1e(/^(-?\\d*)?n(([+-])(\\d+))?/)){E(m[1]=="-")m[1]=-1;G a=m[1]?4V(m[1]):1;G b=m[2]?4V(m[2]):0;G 9U=15.2l.bY(a,b,N.O);17(G i=0,L,l=9U.O;L=N[i];i++){17(G j=0;j<l;j++)E(L.7e==9U[j])U.1h(L)}}h.59(N);h.59(9l);o U},\'5R\':q(N,I,1n){17(G i=0,U=[],L;L=N[i];i++){E(L.14==\'!\'||L.5T)3O;U.1h(L)}o U},\'4K\':q(N,42,1n){G h=15.25,eM,m;G 9u=1t 15(42).7Z(1n);h.85(9u);17(G i=0,U=[],L;L=N[i];i++)E(!L.3S)U.1h(L);h.59(9u);o U},\'bR\':q(N,I,1n){17(G i=0,U=[],L;L=N[i];i++)E(!L.3E&&(!L.1r||L.1r!==\'5g\'))U.1h(L);o U},\'3E\':q(N,I,1n){17(G i=0,U=[],L;L=N[i];i++)E(L.3E)U.1h(L);o U},\'3V\':q(N,I,1n){17(G i=0,U=[],L;L=N[i];i++)E(L.3V)U.1h(L);o U}},6t:{\'=\':q(1Z,v){o 1Z==v},\'!=\':q(1Z,v){o 1Z!=v},\'^=\':q(1Z,v){o 1Z==v||1Z&&1Z.9s(v)},\'$=\':q(1Z,v){o 1Z==v||1Z&&1Z.9r(v)},\'*=\':q(1Z,v){o 1Z==v||1Z&&1Z.1G(v)},\'$=\':q(1Z,v){o 1Z.9r(v)},\'*=\':q(1Z,v){o 1Z.1G(v)},\'~=\':q(1Z,v){o(\' \'+1Z+\' \').1G(\' \'+v+\' \')},\'|=\':q(1Z,v){o(\'-\'+(1Z||"").2i()+\'-\').1G(\'-\'+(v||"").2i()+\'-\')}},4h:q(1u){G 4J=[];1u.cd(/(([\\w#:.~>+()\\s-]+|\\*|\\[.*?\\])+)\\s*(,|$)/,q(m){4J.1h(m[1].4x())});o 4J},ce:q(21,1u){G 2q=$$(1u),h=15.25;h.85(2q);17(G i=0,U=[],k;k=21[i];i++)E(k.3S)U.1h(k);h.59(2q);o U},6d:q(21,1u,1m){E(M.55(1u)){1m=1u;1u=1p}o 15.ce(21,1u||\'*\')[1m||0]},7X:q(k,4J){4J=15.4h(4J.2A(\',\'));G U=[],h=15.25;17(G i=0,l=4J.O,42;i<l;i++){42=1t 15(4J[i].4x());h.1X(U,42.7Z(k))}o(l>1)?h.98(U):U}});E(1f.1U.43){M.18(15.25,{1X:q(a,b){17(G i=0,L;L=b[i];i++)E(L.14!=="!")a.1h(L);o a},59:q(N){17(G i=0,L;L=N[i];i++)L.9e(\'3S\');o N}})}q $$(){o 15.7X(1b,$A(1q))}G 1C={9T:q(1z){$(1z).9T();o 1z},c8:q(21,V){E(3h V!=\'W\')V={3G:!!V};1i E(M.2D(V.3G))V.3G=1v;G 1w,I,9h=1p,5h=V.5h;G 7L=21.3t({},q(1s,k){E(!k.3E&&k.1d){1w=k.1d;I=$(k).3e();E(I!=1j&&k.1r!=\'eN\'&&(k.1r!=\'5h\'||(!9h&&5h!==1p&&(!5h||1w==5h)&&(9h=1v)))){E(1w 1Q 1s){E(!M.4H(1s[1w]))1s[1w]=[1s[1w]];1s[1w].1h(I)}1i 1s[1w]=I}}o 1s});o V.3G?7L:M.4R(7L)}};1C.1c={6J:q(1z,V){o 1C.c8(1C.5x(1z),V)},5x:q(1z){o $A($(1z).4s(\'*\')).3t([],q(21,1K){E(1C.J.5L[1K.14.2e()])21.1h(J.18(1K));o 21})},eO:q(1z,7D,1d){1z=$(1z);G 7H=1z.4s(\'4a\');E(!7D&&!1d)o $A(7H).2X(J.18);17(G i=0,9v=[],O=7H.O;i<O;i++){G 4a=7H[i];E((7D&&4a.1r!=7D)||(1d&&4a.1d!=1d))3O;9v.1h(J.18(4a))}o 9v},9S:q(1z){1z=$(1z);1C.5x(1z).9w(\'9S\');o 1z},9R:q(1z){1z=$(1z);1C.5x(1z).9w(\'9R\');o 1z},dc:q(1z){G 21=$(1z).5x().5B(q(k){o\'5g\'!=k.1r&&!k.3E});G 9N=21.5B(q(k){o k.3K(\'7M\')&&k.7M>=0}).cN(q(k){o k.7M}).3P();o 9N?9N:21.9k(q(k){o[\'4a\',\'2G\',\'9J\'].1G(k.14.2e())})},eV:q(1z){1z=$(1z);1z.dc().d6();o 1z},2P:q(1z,V){1z=$(1z),V=M.2E(V||{});G 3a=V.3F,5C=1z.5s(\'5C\')||\'\';E(5C.56())5C=1F.7T.da;V.3F=1z.6J(1v);E(3a){E(M.3g(3a))3a=3a.7O();M.18(V.3F,3a)}E(1z.3K(\'1B\')&&!V.1B)V.1B=1z.1B;o 1t 1O.5q(5C,V)}};1C.J={9P:q(k){$(k).9P();o k},2G:q(k){$(k).2G();o k}};1C.J.1c={6J:q(k){k=$(k);E(!k.3E&&k.1d){G I=k.3e();E(I!=4D){G 1H={};1H[k.1d]=I;o M.4R(1H)}}o\'\'},3e:q(k){k=$(k);G 1B=k.14.2e();o 1C.J.5L[1B](k)},eW:q(k,I){k=$(k);G 1B=k.14.2e();1C.J.5L[1B](k,I);o k},db:q(k){$(k).I=\'\';o k},f4:q(k){o $(k).I!=\'\'},d6:q(k){k=$(k);24{k.9P();E(k.2G&&(k.14.2e()!=\'4a\'||![\'9Q\',\'9T\',\'5h\'].1G(k.1r)))k.2G()}29(e){}o k},9S:q(k){k=$(k);k.3E=1v;o k},9R:q(k){k=$(k);k.3E=1p;o k}};G f5=1C.J;G $F=1C.J.1c.3e;1C.J.5L={4a:q(k,I){5v(k.1r.2e()){2k\'d5\':2k\'9O\':o 1C.J.5L.cW(k,I);69:o 1C.J.5L.9J(k,I)}},cW:q(k,I){E(M.2D(I))o k.3V?k.I:1j;1i k.3V=!!I},9J:q(k,I){E(M.2D(I))o k.I;1i k.I=I},2G:q(k,I){E(M.2D(I))o C[k.1r==\'2G-f6\'?\'cS\':\'cP\'](k);1i{G 3J,7F,cT=!M.4H(I);17(G i=0,O=k.O;i<O;i++){3J=k.V[i];7F=C.7I(3J);E(cT){E(7F==I){3J.9A=1v;o}}1i 3J.9A=I.1G(7F)}}},cS:q(k){G 1m=k.f7;o 1m>=0?C.7I(k.V[1m]):1j},cP:q(k){G 1T,O=k.O;E(!O)o 1j;17(G i=0,1T=[];i<O;i++){G 3J=k.V[i];E(3J.9A)1T.1h(C.7I(3J))}o 1T},7I:q(3J){o J.18(3J).3K(\'I\')?3J.I:3J.4v}};4Z.9D=2m.2w(cQ,{2O:q($4y,k,4w,32){$4y(32,4w);C.k=$(k);C.4G=C.3e()},9x:q(){G I=C.3e();E(M.3g(C.4G)&&M.3g(I)?C.4G!=I:22(C.4G)!=22(I)){C.32(C.k,I);C.4G=I}}});1C.J.cX=2m.2w(4Z.9D,{3e:q(){o 1C.J.3e(C.k)}});1C.cX=2m.2w(4Z.9D,{3e:q(){o 1C.6J(C.k)}});4Z.6R=2m.2w({2O:q(k,32){C.k=$(k);C.32=32;C.4G=C.3e();E(C.k.14.2e()==\'1z\')C.d4();1i C.76(C.k)},9F:q(){G I=C.3e();E(C.4G!=I){C.32(C.k,I);C.4G=I}},d4:q(){1C.5x(C.k).1E(C.76,C)},76:q(k){E(k.1r){5v(k.1r.2e()){2k\'d5\':2k\'9O\':1D.4B(k,\'ad\',C.9F.2B(C));2j;69:1D.4B(k,\'f3\',C.9F.2B(C));2j}}}});1C.J.6R=2m.2w(4Z.6R,{3e:q(){o 1C.J.3e(C.k)}});1C.6R=2m.2w(4Z.6R,{3e:q(){o 1C.6J(C.k)}});E(!1F.1D)G 1D={};M.18(1D,{f2:8,eY:9,eX:13,eZ:27,f0:37,f1:38,fx:39,fy:40,g5:46,g6:36,g7:35,g8:33,g4:34,g3:45,2Z:{},9d:q(1a){G k;5v(1a.1r){2k\'fZ\':k=1a.fY;2j;2k\'g0\':k=1a.3r;2j;69:o 1j}o J.18(k)}});1D.1c=(q(){G 5t;E(1f.1U.43){G aS={0:1,1:4,2:2};5t=q(1a,5u){o 1a.9Q==aS[5u]}}1i E(1f.1U.4m){5t=q(1a,5u){5v(5u){2k 0:o 1a.7s==1&&!1a.a7;2k 1:o 1a.7s==1&&1a.a7;69:o 1p}}}1i{5t=q(1a,5u){o 1a.7s?(1a.7s===5u+1):(1a.9Q===5u)}}o{g1:q(1a){o 5t(1a,0)},g2:q(1a){o 5t(1a,1)},g9:q(1a){o 5t(1a,2)},k:q(1a){1a=1D.18(1a);G L=1a.7n,1r=1a.1r,5n=1a.5n;E(5n&&5n.14){E(1r===\'bA\'||1r===\'bl\'||(1r===\'ad\'&&5n.14.2e()===\'4a\'&&5n.1r===\'9O\'))L=5n}E(L){E(L.3u==71.a9)L=L.1R;o J.18(L)}1i o 1p},6d:q(1a,1u){G k=1D.k(1a);E(!1u)o k;G 21=[k].1X(k.64());o 15.6d(21,1u,0)},5a:q(1a){G 6X=1b.5i,26=1b.26||{4k:0,47:0};o{x:1a.bF||(1a.ga+(6X.4k||26.4k)-(6X.gh||0)),y:1a.bB||(1a.gj+(6X.47||26.47)-(6X.gk||0))}},gl:q(1a){o 1D.5a(1a).x},gg:q(1a){o 1D.5a(1a).y},9M:q(1a){1D.18(1a);1a.bv();1a.aK();1a.gf=1v}}})();1D.18=(q(){G 2H=M.4p(1D.1c).3t({},q(m,1d){m[1d]=1D.1c[1d].4M();o m});E(1f.1U.43){M.18(2H,{aK:q(){C.gb=1v},bv:q(){C.7B=1p},2F:q(){o"[W 1D]"}});o q(1a){E(!1a)o 1p;E(1a.77)o 1a;1a.77=1f.3i;G 5a=1D.5a(1a);M.18(1a,{7n:1a.gc,9d:1D.9d(1a),bF:5a.x,bB:5a.y});o M.18(1a,2H)}}1i{1D.1k=1D.1k||1b.72("be")[\'5e\'];M.18(1D.1k,2H);o 1f.K}})();M.18(1D,(q(){G 2Z=1D.2Z;q 9q(k){24{E(k.9b)o k.9b[0];1q.5H.1o=1q.5H.1o||1;o k.9b=[++1q.5H.1o]}29(bl){o 1p}}q 9m(1A){E(1A&&1A.1G(\':\'))o"bi";o 1A}q 7W(1o){o 2Z[1o]=2Z[1o]||{}}q 7P(1o,1A){G c=7W(1o);o c[1A]=c[1A]||[]}q b7(k,1A,2f){G 1o=9q(k);G c=7P(1o,1A);E(c.5E("2f").1G(2f))o 1p;G 1L=q(1a){E(!1D||!1D.18||(1a.1A&&1a.1A!=1A))o 1p;1D.18(1a);2f.2K(k,1a)};1L.2f=2f;c.1h(1L);o 1L}q 9o(1o,1A,2f){G c=7P(1o,1A);o c.9k(q(1L){o 1L.2f==2f})}q bb(1o,1A,2f){G c=7W(1o);E(!c[1A])o 1p;c[1A]=c[1A].6u(9o(1o,1A,2f))}q b6(){17(G 1o 1Q 2Z)17(G 1A 1Q 2Z[1o])2Z[1o][1A]=1j}E(1F.7J){1F.7J("aY",b6)}E(1f.1U.4m){1F.6v(\'gd\',1f.3i,1p)}o{4B:q(k,1A,2f){k=$(k);G 1d=9m(1A);G 1L=b7(k,1A,2f);E(!1L)o k;E(k.6v){k.6v(1d,1L,1p)}1i{k.7J("5J"+1d,1L)}o k},5d:q(k,1A,2f){k=$(k);G 1o=9q(k),1d=9m(1A);E(!2f&&1A){7P(1o,1A).1E(q(1L){k.5d(1A,1L.2f)});o k}1i E(!1A){M.4p(7W(1o)).1E(q(1A){k.5d(1A)});o k}G 1L=9o(1o,1A,2f);E(!1L)o k;E(k.bc){k.bc(1d,1L,1p)}1i{k.ge("5J"+1d,1L)}bb(1o,1A,2f);o k},5N:q(k,1A,2W){k=$(k);E(k==1b&&1b.72&&!k.aZ)k=1b.5i;G 1a;E(1b.72){1a=1b.72("be");1a.fX("bi",1v,1v)}1i{1a=1b.fW();1a.bk="fG"}1a.1A=1A;1a.2W=2W||{};E(1b.72){k.aZ(1a)}1i{k.fH(1a.bk,1a)}o 1D.18(1a)}}})());M.18(1D,1D.1c);J.6y({5N:1D.5N,4B:1D.4B,5d:1D.5d});M.18(1b,{5N:J.1c.5N.4M(),4B:J.1c.4B.4M(),5d:J.1c.5d.4M(),6w:1p});(q(){G 3Z;q 6T(){E(1b.6w)o;E(3Z)1F.bE(3Z);1b.5N("fI:6w");1b.6w=1v}E(1b.6v){E(1f.1U.4m){3Z=1F.bD(q(){E(/6w|aT/.2Y(1b.2Q))6T()},0);1D.4B(1F,"bA",6T)}1i{1b.6v("fJ",6T,1p)}}1i{1b.6m("<50 1o=bw 4S bs=//:><\\/50>");$("bw").7j=q(){E(C.2Q=="aT"){C.7j=1j;6T()}}}})();44.4R=M.4R;G fF={3q:J.am};J.1c.fE=J.1c.7p;G fA={fz:q(k,19){o J.3I(k,{57:19})},fB:q(k,19){o J.3I(k,{2p:19})},fC:q(k,19){o J.3I(k,{4X:19})},fD:q(k,19){o J.3I(k,{7G:19})}};G $3O=1t fK(\'"4z $3O" fL fS, fT "o" fU\');G 9n={aQ:1p,9t:q(){C.at=1F.a6||1b.5i.4k||1b.26.4k||0;C.cI=1F.aR||1b.5i.47||1b.26.47||0},fV:q(k,x,y){E(C.aQ)o C.aO(k,x,y);C.6W=x;C.6I=y;C.31=J.4g(k);o(y>=C.31[1]&&y<C.31[1]+k.5G&&x>=C.31[0]&&x<C.31[0]+k.5W)},aO:q(k,x,y){G a1=J.9a(k);C.6W=x+a1[0]-C.at;C.6I=y+a1[1]-C.cI;C.31=J.4g(k);o(C.6I>=C.31[1]&&C.6I<C.31[1]+k.5G&&C.6W>=C.31[0]&&C.6W<C.31[0]+k.5W)},fR:q(4O,k){E(!4O)o 0;E(4O==\'fQ\')o((C.31[1]+k.5G)-C.6I)/k.5G;E(4O==\'fM\')o((C.31[0]+k.5W)-C.6W)/k.5W},4g:J.1c.4g,6p:J.1c.6p,a4:q(k){9n.9t();o J.a4(k)},9j:q(k){9n.9t();o J.9j(k)},fN:J.1c.9a,2I:J.1c.6c,fO:J.1c.6Z,2E:q(2b,7n,V){V=V||{};o J.ab(7n,2b,V)}};E(!1b.7c)1b.7c=q(aL){q 9H(1d){o 1d.56()?1j:"[5j(1X(\' \', @6P, \' \'), \' "+1d+" \')]"}aL.7c=1f.3N.82?q(k,1l){1l=1l.2J().4x();G 9z=/\\s/.2Y(1l)?$w(1l).2X(9H).2A(\'\'):9H(1l);o 9z?1b.9y(\'.//*\'+9z,k):[]}:q(k,1l){1l=1l.2J().4x();G 21=[],6x=(/\\s/.2Y(1l)?$w(1l):1j);E(!6x&&!1l)o 21;G N=$(k).4s(\'*\');1l=\' \'+1l+\' \';17(G i=0,1K,cn;1K=N[i];i++){E(1K.1l&&(cn=\' \'+1K.1l+\' \')&&(cn.1G(1l)||(6x&&6x.99(q(1d){o!1d.2J().56()&&cn.1G(\' \'+1d+\' \')}))))21.1h(J.18(1K))}o 21};o q(1l,84){o $(84||1b.26).7c(1l)}}(J.1c);J.7N=2m.2w();J.7N.1k={2O:q(k){C.k=$(k)},4f:q(1g){C.k.1l.4h(/\\s+/).2G(q(1d){o 1d.O>0}).4f(1g)},6g:q(1l){C.k.1l=1l},fP:q(8f){E(C.1G(8f))o;C.6g($A(C).1X(8f).2A(\' \'))},cG:q(8L){E(!C.1G(8L))o;C.6g($A(C).6u(8L).2A(\' \'))},2J:q(){o $A(C).2A(\' \')}};M.18(J.7N.1k,2N);J.6y();',62,1106,'||||||||||||||||||||element||||return||function||||||||||||this||if||var||value|Element||node|Object|nodes|length||||||results|options|object||style||||||tagName|Selector||for|extend|content|event|document|Methods|name|match|Prototype|iterator|push|else|null|prototype|className|index|root|id|false|arguments|type|result|new|expression|true|key|position|property|form|eventName|method|Form|Event|each|window|include|pair|formula|context|child|wrapper|klass|div|Ajax|while|in|parentNode|replace|values|Browser|attribute|args|concat|transport|nv|nth|elements|String||try|handlers|body||combinator|catch|pattern|source|getStyle|attr|toLowerCase|handler|filter|width|toUpperCase|break|case|pseudos|Class||Array|top|matches|_getEv|xpath|attributes|last|of|create|response|left|array|join|bind|isFunction|isUndefined|clone|inspect|select|methods|offsetParent|toString|call|valueL|valueT|Enumerable|initialize|request|readyState|evaluate|iterable|proceed|url|parent|memo|map|test|cache||offset|callback||||||||params|targetNode|Template|height|getValue|responseText|isString|typeof|emptyFunction|__method|gsub|childNodes|px|string|json|properties|display|toElement|replacement|inject|nodeType|names|slice|container|toArray|count|le|indexOf|ByTag|apply|disabled|parameters|hash|toJSON|insert|opt|hasAttribute|opacity|insertions|BrowserFeatures|continue|first|matcher|onComplete|_countedByPrototype|_attributeTranslations|ancestor|checked|number|els|createElement|timer||mm|selector|IE|Hash|||scrollTop|_object|RegExp|input|responder|nextSibling|Opera|reverse|_each|cumulativeOffset|split|start|nodeValue|scrollLeft|navigator|WebKit|toHTML|userAgent|keys|stripScripts|ps|getElementsByTagName|_returnOffset|isElement|text|frequency|strip|super|throw|descendant|observe|nextSiblings|undefined|wrap|toPaddedString|lastValue|isArray|table|expressions|not|tags|methodize|status|mode|styles|parts|toQueryString|defer|sibling|shift|Number|headers|bottom|update|Abstract|script|decay|offsetLeft|insertion|end|isNumber|blank|before|_overflow|unmark|pointer|offsetTop|item|stopObserving|__proto__|success|hidden|submit|documentElement|contains|adjacent|currentStyle|evalScripts|currentTarget|_cache|innerHTML|Request|dispatchException|readAttribute|isButton|code|switch|parseFloat|getElements|destination|evalJSON|_insertionTranslations|findAll|action|pos|pluck|setOpacity|offsetHeight|callee|substring|on|truncation|Serializers|Responders|fire|tbody|absolute|Heading|empty|self|firstChild|appendChild|getHeader|offsetWidth|extras|attrPresence|str|previousSiblings|getDimensions|interpret|static|ancestors|right|fragment|receiver|exclusive|default|delta|template|getOffsetParent|findElement|setStyle|following|set|capitalize|laterSibling|next|getStatus|pseudo|write|nodeClassName|dimensions|positionedOffset|and|toObject|criteria|operators|without|addEventListener|loaded|classNames|addMethods|patterns|only|nextElementSibling|HTMLElement|ElementExtensions|onTimerEvent|ofType|responders|previousElementSibling|ycomp|serialize|xml|auto|_|ctx|_flag|class|writeAttribute|EventObserver|state|fireContentLoadedEvent|post|contentType|xcomp|docElement|fillWith|viewportOffset|relative|Node|createEvent|escapeHTML|removeChild|expr|registerCallback|_extendedByPrototype|title|html|ScriptFragment|detect|getElementsByClassName|TBODY|nodeIndex|_getAttr|HTML|application|charAt|onreadystatechange|cssFloat|border|dim|target|hasClassName|descendantOf|refresh|padding|which|SpecificElementExtensions|port|Simulated|copy|dispatch|none|headerJSON|recursivelyCollect|returnValue|asynchronous|typeName|isSameOrigin|currentValue|after|inputs|optionValue|attachEvent|onlyIfAbsent|data|tabIndex|ClassNames|toQueryParams|getWrappersForEventName|_getContentFromAnonymousElement|times|insertBefore|location|currentlyExecuting|tr|getCacheForID|findChildElements|00001|findElements|elementClassName|eval|XPath|onCreate|parentElement|mark|read|token|Gecko|_div|tokens|unfilterJSON|overflow|_madePositioned|failure|classNameToAdd|elementStyle|Response|val|visibility|domain|forElement|visible|css|offsets|identify|Base|getResponseHeader|statusText|decodeURIComponent|exception|cssText|updater|query|activeRequestCount|succ|toTemplateReplacements|Version|onStateChange|toQueryPair|isHash|range|get|fragments|getAllResponseHeaders|Complete|replaceChild|classNameToRemove|has|encoding|TableSection|tag|zoom|stripAlpha|camelize|styleFloat|Content|float|delete|alpha|delay|respondToReadyState|trans|TD|_complete|evalJS|getAttribute|curry|protocol|_reverse|unique|all|cumulativeScrollOffset|_prototypeEventID|prepareReplacement|relatedTarget|removeAttribute|trues|subclass|submitted|falses|relativize|find|indexed|getDOMEventName|Position|findWrapper|collect|getEventID|endsWith|startsWith|prepare|exclusions|matchingInputs|invoke|execute|_getElementsByXPath|cond|selected|character|escapedString|TimedObserver|stripTags|onElementEvent|slices|iter|found|textarea|camelized|len|stop|firstByIndex|radio|focus|button|enable|disable|reset|indices|superclass|_methodized|lastIndexOf|preceding|assertions|predicate|offsetcache|exclusion|valueOf|absolutize|sanitizeJSON|pageXOffset|metaKey|timeout|TEXT_NODE|Updater|clonePosition|argumentNames|click|ELEMENT_NODE|scriptTag|_getResponseJSON|escape|JSON|_getHeaderJSON|matchOne|force|toggle|parseInt|separator|extractScripts|interpolate|specialChar||deltaX|isJSON|sanitize|JSONFilter|updateContent|requestHeaders|unescapeHTML|local|lt|amp|2005|_getAttrNode|instanceof|sub|updateComplete|charCodeAt|lastText|stopPropagation|instanceMethods|100|htmlFor|withinIncludingScrolloffsets|useDoubleQuotes|includeScrollOffsets|pageYOffset|buttonMap|complete|1000|originalPosition|originalDisplay|onException|onunload|dispatchEvent|img|responseXML|originalHeight|lambda|originalWidth|originalVisibility|destroyCache|createWrapper|addClassName|nextNode|removeClassName|destroyWrapper|removeEventListener|compareDocumentPosition|HTMLEvents|Events|firstDescendant|descendants|dataavailable|scrollTo|eventType|error|setWidth|setHeight|setTop|setLeft|BODY|getStatusText|src|setAttribute|matchAll|preventDefault|__onDOMContentLoaded|counter|hide|_originalWidth|load|pageY|evalResponse|setInterval|clearInterval|pageX|clientWidth|_originalHeight|show|_originalLeft|_originalTop|clientHeight|immediateDescendants|overrideMimeType|TableCol|THEAD|IMG|enabled|encodeURIComponent|Mod|TFOOT|TR|odd|even|getIndices|radix|TH|TableCell|collections|from|TEXTAREA|register|SELECT|getTransport|serializeElements|getAttributeNode|XMLHTTP|ActiveXObject|ObjectRange|scan|matchElements|Try|these|total|findDOMClass|shouldUseSelectorsAPI|SelectorsAPI|shouldUseXPath|normal||getHeight|uniq|querySelector|compileMatcher|oldId|forEach|or|size|compileXPathMatcher|selectorsAPI|getWidth|sorted|uTagName|previousSibling|byClassName|needle|any|operator|remove|_true|deltaY|client|arrayLength|inline|flatten|sortBy|MobileSafari|selectMany|PeriodicalExecuter|createTextNode|selectOne|single|outerHTML|eachSlice|inputSelector|Observer|KHTML|comp|setRequestHeaders|XMLHttpRequest|exec|Pattern|registerFormCallbacks|checkbox|activate|Safari|td|subclasses|href|clear|findFirstElement|setRequestHeader|getUTCHours|reduce|Badly|formed|Mobile|intersect|getUTCDate|open|responseJSON|200||getUTCMinutes|reject|toColorPart|Success|sort|getAllHeaders|300|SyntaxError|getUTCMonth|compact|close|Function|Requested|_method|boolean|With|charset|isNaN|splice|Accept|javascript|Connection|unknown|RangeError|Apple|Failure|Date|01|postBody|bindAsEventListener|setTimeout|send|getUTCFullYear|Eaeflnr|ceil|floor|Math|unset|unregister|https|round|zip|Uninitialized|x1f|min|inGroupsOf|Msxml2|Konqueror|pop|constructor|Microsoft|parseQuery|x00|merge|dasherize|underscore|grep|member|finally|AppleWebKit||urlencoded|partition|ecma|secure|max|im|java|UTF|some|every|Loaded|abs|fromCharCode|Loading|isFinite|u00|Interactive|truncate|entries|www|getUTCSeconds|IFrame|abled|dis|selectorType|file|getInputs|mod|with|version|getScrollOffsets|querySelectorAll|starts|focusFirstElement|setValue|KEY_RETURN|KEY_TAB|KEY_ESC|KEY_LEFT|KEY_UP|KEY_BACKSPACE|change|present|Field|one|selectedIndex|PeriodicalUpdater|inner|H5|H4|H6|Quote|INS|H3|H2|DList|DIR|Directory|H1|DEL|Anchor|FRAMESET|FrameSet|IFRAME|viewport|TableRow|COLGROUP|Image|CAPTION|TableCaption|COL|KEY_RIGHT|KEY_DOWN|Before|Insertion|Top|Bottom|After|childOf|Toggle|ondataavailable|fireEvent|dom|DOMContentLoaded|Error|is|horizontal|realOffset|page|add|vertical|overlap|deprecated|use|instead|within|createEventObject|initEvent|fromElement|mouseover|mouseout|isLeftClick|isMiddleClick|KEY_INSERT|KEY_PAGEDOWN|KEY_DELETE|KEY_HOME|KEY_END|KEY_PAGEUP|isRightClick|clientX|cancelBubble|srcElement|unload|detachEvent|stopped|pointerY|clientLeft||clientY|clientTop|pointerX|DL|opera|multiple|onload|toggleClassName|DOCUMENT_FRAGMENT_NODE|readonly||frameBorder|anonymous_element_|readOnly|NOTATION_NODE|longDesc|DOCUMENT_TYPE_NODE|DOCUMENT_NODE|ENTITY_NODE|ENTITY_REFERENCE_NODE|CDATA_SECTION_NODE|ATTRIBUTE_NODE|PROCESSING_INSTRUCTION_NODE|cleanWhitespace|childElements|onclick|COMMENT_NODE|maxLength|encType|cellPadding|previous|createContextualFragment|cellspacing|fixed|cellpadding|hasLayout|down|siblings|OList|cellSpacing|vAlign|cloneNode|dateTime|accessKey|ownerDocument|rowSpan|selectNode|colSpan|createRange|getElementsBySelector|ondblclick|TABLE|specified|FORM|INPUT|getOpacity|getComputedStyle|onselect|onchange|rv|999999|OPTGROUP|clearTimeout|FieldSet|UL|UList|OL|FIELDSET|Paragraph|OptGroup|TextArea|block|up|onreset|onmouseup|ORDERED_NODE_SNAPSHOT_TYPE|onmouseover|onmousemove|makeClipping|snapshotLength|onmousedown|undoClipping|snapshotItem|XPathResult|onmouseout|onkeydown|undoPositioned|onkeyup|makePositioned|onsubmit|defaultView|onfocus|getElementById|onblur|onkeypress'.split('|'),0,{}))


var Validator=Class.create();Validator.prototype={initialize:function(className,error,test,options){if(typeof test=='function'){this.options=$H(options);this._test=test;}else{this.options=$H(test);this._test=function(){return true};}
this.error=error||'Validation failed.';this.className=className;},test:function(v,elm){return(this._test(v,elm)&&this.options.all(function(p){return Validator.methods[p.key]?Validator.methods[p.key](v,elm,p.value):true;}));}}
Validator.methods={pattern:function(v,elm,opt){return Validation.get('IsEmpty').test(v)||opt.test(v)},minLength:function(v,elm,opt){return v.length>=opt},maxLength:function(v,elm,opt){return v.length<=opt},min:function(v,elm,opt){return v>=parseFloat(opt)},max:function(v,elm,opt){return v<=parseFloat(opt)},notOneOf:function(v,elm,opt){return $A(opt).all(function(value){return v!=value;})},oneOf:function(v,elm,opt){return $A(opt).any(function(value){return v==value;})},is:function(v,elm,opt){return v==opt},isNot:function(v,elm,opt){return v!=opt},equalToField:function(v,elm,opt){return v==$F(opt)},notEqualToField:function(v,elm,opt){return v!=$F(opt)},include:function(v,elm,opt){return $A(opt).all(function(value){return Validation.get(value).test(v,elm);})}}
var Validation=Class.create();Validation.defaultOptions={onSubmit:true,stopOnFirst:false,immediate:false,focusOnError:true,useTitles:false,addClassNameToContainer:false,containerClassName:'.input-box',onFormValidate:function(result,form){},onElementValidate:function(result,elm){}};Validation.prototype={initialize:function(form,options){this.form=$(form);if(!this.form){return;}
this.options=Object.extend({onSubmit:Validation.defaultOptions.onSubmit,stopOnFirst:Validation.defaultOptions.stopOnFirst,immediate:Validation.defaultOptions.immediate,focusOnError:Validation.defaultOptions.focusOnError,useTitles:Validation.defaultOptions.useTitles,onFormValidate:Validation.defaultOptions.onFormValidate,onElementValidate:Validation.defaultOptions.onElementValidate},options||{});if(this.options.onSubmit)Event.observe(this.form,'submit',this.onSubmit.bind(this),false);if(this.options.immediate){Form.getElements(this.form).each(function(input){if(input.tagName.toLowerCase()=='select'){Event.observe(input,'blur',this.onChange.bindAsEventListener(this));}
if(input.type.toLowerCase()=='radio'||input.type.toLowerCase()=='checkbox'){Event.observe(input,'click',this.onChange.bindAsEventListener(this));}else{Event.observe(input,'change',this.onChange.bindAsEventListener(this));}},this);}},onChange:function(ev){Validation.isOnChange=true;Validation.validate(Event.element(ev),{useTitle:this.options.useTitles,onElementValidate:this.options.onElementValidate});Validation.isOnChange=false;},onSubmit:function(ev){if(!this.validate())Event.stop(ev);},validate:function(){var result=false;var useTitles=this.options.useTitles;var callback=this.options.onElementValidate;try{if(this.options.stopOnFirst){result=Form.getElements(this.form).all(function(elm){if(elm.hasClassName('local-validation')&&!this.isElementInForm(elm,this.form)){return true;}
return Validation.validate(elm,{useTitle:useTitles,onElementValidate:callback});},this);}else{result=Form.getElements(this.form).collect(function(elm){if(elm.hasClassName('local-validation')&&!this.isElementInForm(elm,this.form)){return true;}
return Validation.validate(elm,{useTitle:useTitles,onElementValidate:callback});},this).all();}}catch(e){}
if(!result&&this.options.focusOnError){try{Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus()}
catch(e){}}
this.options.onFormValidate(result,this.form);return result;},reset:function(){Form.getElements(this.form).each(Validation.reset);},isElementInForm:function(elm,form){var domForm=elm.up('form');if(domForm==form){return true;}
return false;}}
Object.extend(Validation,{validate:function(elm,options){options=Object.extend({useTitle:false,onElementValidate:function(result,elm){}},options||{});elm=$(elm);var cn=$w(elm.className);return result=cn.all(function(value){var test=Validation.test(value,elm,options.useTitle);options.onElementValidate(test,elm);return test;});},insertAdvice:function(elm,advice){var container=$(elm).up('.field-row');if(container){Element.insert(container,{after:advice});}else if(elm.up('td.value')){elm.up('td.value').insert({bottom:advice});}else if(elm.advaiceContainer&&$(elm.advaiceContainer)){$(elm.advaiceContainer).update(advice);}
else{switch(elm.type.toLowerCase()){case'checkbox':case'radio':var p=elm.parentNode;if(p){Element.insert(p,{'bottom':advice});}else{Element.insert(elm,{'after':advice});}
break;default:Element.insert(elm,{'after':advice});}}},showAdvice:function(elm,advice,adviceName){if(!elm.advices){elm.advices=new Hash();}
else{elm.advices.each(function(pair){this.hideAdvice(elm,pair.value);}.bind(this));}
elm.advices.set(adviceName,advice);if(typeof Effect=='undefined'){advice.style.display='block';}else{if(!advice._adviceAbsolutize){new Effect.Appear(advice,{duration:1});}else{Position.absolutize(advice);advice.show();advice.setStyle({'top':advice._adviceTop,'left':advice._adviceLeft,'width':advice._adviceWidth,'z-index':1000});advice.addClassName('advice-absolute');}}},hideAdvice:function(elm,advice){if(advice!=null)advice.hide();},updateCallback:function(elm,status){if(typeof elm.callbackFunction!='undefined'){eval(elm.callbackFunction+'(\''+elm.id+'\',\''+status+'\')');}},ajaxError:function(elm,errorMsg){var name='validate-ajax';var advice=Validation.getAdvice(name,elm);if(advice==null){advice=this.createAdvice(name,elm,false,errorMsg);}
this.showAdvice(elm,advice,'validate-ajax');this.updateCallback(elm,'failed');elm.addClassName('validation-failed');elm.addClassName('validate-ajax');if(Validation.defaultOptions.addClassNameToContainer&&Validation.defaultOptions.containerClassName!=''){var container=elm.up(Validation.defaultOptions.containerClassName);if(container&&this.allowContainerClassName(elm)){container.removeClassName('validation-passed');container.addClassName('validation-error');}}},allowContainerClassName:function(elm){if(elm.type=='radio'||elm.type=='checkbox'){return elm.hasClassName('change-container-classname');}
return true;},test:function(name,elm,useTitle){var v=Validation.get(name);var prop='__advice'+name.camelize();try{if(Validation.isVisible(elm)&&!v.test($F(elm),elm)){var advice=Validation.getAdvice(name,elm);if(advice==null){advice=this.createAdvice(name,elm,useTitle);}
this.showAdvice(elm,advice,name);this.updateCallback(elm,'failed');elm[prop]=1;if(!elm.advaiceContainer){elm.removeClassName('validation-passed');elm.addClassName('validation-failed');}
if(Validation.defaultOptions.addClassNameToContainer&&Validation.defaultOptions.containerClassName!=''){var container=elm.up(Validation.defaultOptions.containerClassName);if(container&&this.allowContainerClassName(elm)){container.removeClassName('validation-passed');container.addClassName('validation-error');}}
return false;}else{var advice=Validation.getAdvice(name,elm);this.hideAdvice(elm,advice);this.updateCallback(elm,'passed');elm[prop]='';elm.removeClassName('validation-failed');elm.addClassName('validation-passed');if(Validation.defaultOptions.addClassNameToContainer&&Validation.defaultOptions.containerClassName!=''){var container=elm.up(Validation.defaultOptions.containerClassName);if(container&&!container.down('.validation-failed')&&this.allowContainerClassName(elm)){if(!Validation.get('IsEmpty').test(elm.value)||!this.isVisible(elm)){container.addClassName('validation-passed');}else{container.removeClassName('validation-passed');}
container.removeClassName('validation-error');}}
return true;}}catch(e){throw(e)}},isVisible:function(elm){while(elm.tagName!='BODY'){if(!$(elm).visible())return false;elm=elm.parentNode;}
return true;},getAdvice:function(name,elm){return $('advice-'+name+'-'+Validation.getElmID(elm))||$('advice-'+Validation.getElmID(elm));},createAdvice:function(name,elm,useTitle,customError){var v=Validation.get(name);var errorMsg=useTitle?((elm&&elm.title)?elm.title:v.error):v.error;if(customError){errorMsg=customError;}
try{if(Translator){errorMsg=Translator.translate(errorMsg);}}
catch(e){}
advice='<div class="validation-advice" id="advice-'+name+'-'+Validation.getElmID(elm)+'" style="display:none">'+errorMsg+'</div>'
Validation.insertAdvice(elm,advice);advice=Validation.getAdvice(name,elm);if($(elm).hasClassName('absolute-advice')){var dimensions=$(elm).getDimensions();var originalPosition=Position.cumulativeOffset(elm);advice._adviceTop=(originalPosition[1]+dimensions.height)+'px';advice._adviceLeft=(originalPosition[0])+'px';advice._adviceWidth=(dimensions.width)+'px';advice._adviceAbsolutize=true;}
return advice;},getElmID:function(elm){return elm.id?elm.id:elm.name;},reset:function(elm){elm=$(elm);var cn=$w(elm.className);cn.each(function(value){var prop='__advice'+value.camelize();if(elm[prop]){var advice=Validation.getAdvice(value,elm);if(advice){advice.hide();}
elm[prop]='';}
elm.removeClassName('validation-failed');elm.removeClassName('validation-passed');if(Validation.defaultOptions.addClassNameToContainer&&Validation.defaultOptions.containerClassName!=''){var container=elm.up(Validation.defaultOptions.containerClassName);if(container){container.removeClassName('validation-passed');container.removeClassName('validation-error');}}});},add:function(className,error,test,options){var nv={};nv[className]=new Validator(className,error,test,options);Object.extend(Validation.methods,nv);},addAllThese:function(validators){var nv={};$A(validators).each(function(value){nv[value[0]]=new Validator(value[0],value[1],value[2],(value.length>3?value[3]:{}));});Object.extend(Validation.methods,nv);},get:function(name){return Validation.methods[name]?Validation.methods[name]:Validation.methods['_LikeNoIDIEverSaw_'];},methods:{'_LikeNoIDIEverSaw_':new Validator('_LikeNoIDIEverSaw_','',{})}});Validation.add('IsEmpty','',function(v){return(v==''||(v==null)||(v.length==0)||/^\s+$/.test(v));});Validation.addAllThese([['validate-select','Please select an option.',function(v){return((v!="none")&&(v!=null)&&(v.length!=0));}],['required-entry','This is a required field.',function(v){return!Validation.get('IsEmpty').test(v);}],['validate-number','Please enter a valid number in this field.',function(v){return Validation.get('IsEmpty').test(v)||(!isNaN(parseNumber(v))&&!/^\s+$/.test(parseNumber(v)));}],['validate-digits','Please use numbers only in this field. please avoid spaces or other characters such as dots or commas.',function(v){return Validation.get('IsEmpty').test(v)||!/[^\d]/.test(v);}],['validate-alpha','Please use letters only (a-z or A-Z) in this field.',function(v){return Validation.get('IsEmpty').test(v)||/^[a-zA-Z]+$/.test(v)}],['validate-code','Please use only letters (a-z), numbers (0-9) or underscore(_) in this field, first character should be a letter.',function(v){return Validation.get('IsEmpty').test(v)||/^[a-z]+[a-z0-9_]+$/.test(v)}],['validate-alphanum','Please use only letters (a-z or A-Z) or numbers (0-9) only in this field. No spaces or other characters are allowed.',function(v){return Validation.get('IsEmpty').test(v)||/^[a-zA-Z0-9]+$/.test(v)}],['validate-street','Please use only letters (a-z or A-Z) or numbers (0-9) or spaces and # only in this field.',function(v){return Validation.get('IsEmpty').test(v)||/^[ \w]{3,}([A-Za-z]\.)?([ \w]*\#\d+)?(\r\n| )[ \w]{3,}/.test(v)}],['validate-phoneStrict','Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.',function(v){return Validation.get('IsEmpty').test(v)||/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v);}],['validate-phoneLax','Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.',function(v){return Validation.get('IsEmpty').test(v)||/^((\d[-. ]?)?((\(\d{3}\))|\d{3}))?[-. ]?\d{3}[-. ]?\d{4}$/.test(v);}],['validate-fax','Please enter a valid fax number. For example (123) 456-7890 or 123-456-7890.',function(v){return Validation.get('IsEmpty').test(v)||/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v);}],['validate-date','Please enter a valid date.',function(v){var test=new Date(v);return Validation.get('IsEmpty').test(v)||!isNaN(test);}],['validate-email','Please enter a valid email address. For example johndoe@domain.com.',function(v){return Validation.get('IsEmpty').test(v)||/^[a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]+(\.[a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,})/i.test(v)}],['validate-emailSender','Please use only visible characters and spaces.',function(v){return Validation.get('IsEmpty').test(v)||/^[\S ]+$/.test(v)}],['validate-password','Please enter 6 or more characters. Leading or trailing spaces will be ignored.',function(v){var pass=v.strip();return!(pass.length>0&&pass.length<6);}],['validate-admin-password','Please enter 7 or more characters. Password should contain both numeric and alphabetic characters.',function(v){var pass=v.strip();if(0==pass.length){return true;}
if(!(/[a-z]/i.test(v))||!(/[0-9]/.test(v))){return false;}
return!(pass.length<7);}],['validate-cpassword','Please make sure your passwords match.',function(v){var conf=$('confirmation')?$('confirmation'):$$('.validate-cpassword')[0];var pass=false;if($('password')){pass=$('password');}
var passwordElements=$$('.validate-password');for(var i=0;i<passwordElements.size();i++){var passwordElement=passwordElements[i];if(passwordElement.up('form').id==conf.up('form').id){pass=passwordElement;}}
if($$('.validate-admin-password').size()){pass=$$('.validate-admin-password')[0];}
return(pass.value==conf.value);}],['validate-url','Please enter a valid URL. http:// is required',function(v){return Validation.get('IsEmpty').test(v)||/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)}],['validate-clean-url','Please enter a valid URL. For example http://www.example.com or www.example.com',function(v){return Validation.get('IsEmpty').test(v)||/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v)||/^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v)}],['validate-identifier','Please enter a valid URL Key. For example "example-page", "example-page.html" or "anotherlevel/example-page"',function(v){return Validation.get('IsEmpty').test(v)||/^[A-Z0-9][A-Z0-9_\/-]+(\.[A-Z0-9_-]+)*$/i.test(v)}],['validate-xml-identifier','Please enter a valid XML-identifier. For example something_1, block5, id-4',function(v){return Validation.get('IsEmpty').test(v)||/^[A-Z][A-Z0-9_\/-]*$/i.test(v)}],['validate-ssn','Please enter a valid social security number. For example 123-45-6789.',function(v){return Validation.get('IsEmpty').test(v)||/^\d{3}-?\d{2}-?\d{4}$/.test(v);}],['validate-zip','Please enter a valid zip code. For example 90602 or 90602-1234.',function(v){return Validation.get('IsEmpty').test(v)||/(^\d{5}$)|(^\d{5}-\d{4}$)/.test(v);}],['validate-zip-international','Please enter a valid zip code.',function(v){return true;}],['validate-date-au','Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.',function(v){if(Validation.get('IsEmpty').test(v))return true;var regex=/^(\d{2})\/(\d{2})\/(\d{4})$/;if(!regex.test(v))return false;var d=new Date(v.replace(regex,'$2/$1/$3'));return(parseInt(RegExp.$2,10)==(1+d.getMonth()))&&(parseInt(RegExp.$1,10)==d.getDate())&&(parseInt(RegExp.$3,10)==d.getFullYear());}],['validate-currency-dollar','Please enter a valid $ amount. For example $100.00.',function(v){return Validation.get('IsEmpty').test(v)||/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)}],['validate-one-required','Please select one of the above options.',function(v,elm){var p=elm.parentNode;var options=p.getElementsByTagName('INPUT');return $A(options).any(function(elm){return $F(elm);});}],['validate-one-required-by-name','Please select one of the options.',function(v,elm){var inputs=$$('input[name="'+elm.name.replace(/([\\"])/g,'\\$1')+'"]');var error=1;for(var i=0;i<inputs.length;i++){if((inputs[i].type=='checkbox'||inputs[i].type=='radio')&&inputs[i].checked==true){error=0;}
if(Validation.isOnChange&&(inputs[i].type=='checkbox'||inputs[i].type=='radio')){Validation.reset(inputs[i]);}}
if(error==0){return true;}else{return false;}}],['validate-not-negative-number','Please enter a valid number in this field.',function(v){v=parseNumber(v);return(!isNaN(v)&&v>=0);}],['validate-state','Please select State/Province.',function(v){return(v!=0||v=='');}],['validate-new-password','Please enter 6 or more characters. Leading or trailing spaces will be ignored.',function(v){if(!Validation.get('validate-password').test(v))return false;if(Validation.get('IsEmpty').test(v)&&v!='')return false;return true;}],['validate-greater-than-zero','Please enter a number greater than 0 in this field.',function(v){if(v.length)
return parseFloat(v)>0;else
return true;}],['validate-zero-or-greater','Please enter a number 0 or greater in this field.',function(v){if(v.length)
return parseFloat(v)>=0;else
return true;}],['validate-cc-number','Please enter a valid credit card number.',function(v,elm){var ccTypeContainer=$(elm.id.substr(0,elm.id.indexOf('_cc_number'))+'_cc_type');if(ccTypeContainer&&typeof Validation.creditCartTypes.get(ccTypeContainer.value)!='undefined'&&Validation.creditCartTypes.get(ccTypeContainer.value)[2]==false){if(!Validation.get('IsEmpty').test(v)&&Validation.get('validate-digits').test(v)){return true;}else{return false;}}
return validateCreditCard(v);}],['validate-cc-type','Credit card number doesn\'t match credit card type',function(v,elm){elm.value=removeDelimiters(elm.value);v=removeDelimiters(v);var ccTypeContainer=$(elm.id.substr(0,elm.id.indexOf('_cc_number'))+'_cc_type');if(!ccTypeContainer){return true;}
var ccType=ccTypeContainer.value;if(typeof Validation.creditCartTypes.get(ccType)=='undefined'){return false;}
if(Validation.creditCartTypes.get(ccType)[0]==false){return true;}
var ccMatchedType='';Validation.creditCartTypes.each(function(pair){if(pair.value[0]&&v.match(pair.value[0])){ccMatchedType=pair.key;throw $break;}});if(ccMatchedType!=ccType){return false;}
if(ccTypeContainer.hasClassName('validation-failed')&&Validation.isOnChange){Validation.validate(ccTypeContainer);}
return true;}],['validate-cc-type-select','Card type doesn\'t match credit card number',function(v,elm){var ccNumberContainer=$(elm.id.substr(0,elm.id.indexOf('_cc_type'))+'_cc_number');if(Validation.isOnChange&&Validation.get('IsEmpty').test(ccNumberContainer.value)){return true;}
if(Validation.get('validate-cc-type').test(ccNumberContainer.value,ccNumberContainer)){Validation.validate(ccNumberContainer);}
return Validation.get('validate-cc-type').test(ccNumberContainer.value,ccNumberContainer);}],['validate-cc-exp','Incorrect credit card expiration date',function(v,elm){var ccExpMonth=v;var ccExpYear=$(elm.id.substr(0,elm.id.indexOf('_expiration'))+'_expiration_yr').value;var currentTime=new Date();var currentMonth=currentTime.getMonth()+1;var currentYear=currentTime.getFullYear();if(ccExpMonth<currentMonth&&ccExpYear==currentYear){return false;}
return true;}],['validate-cc-cvn','Please enter a valid credit card verification number.',function(v,elm){var ccTypeContainer=$(elm.id.substr(0,elm.id.indexOf('_cc_cid'))+'_cc_type');if(!ccTypeContainer){return true;}
var ccType=ccTypeContainer.value;if(typeof Validation.creditCartTypes.get(ccType)=='undefined'){return false;}
var re=Validation.creditCartTypes.get(ccType)[1];if(v.match(re)){return true;}
return false;}],['validate-ajax','',function(v,elm){return true;}],['validate-data','Please use only letters (a-z or A-Z), numbers (0-9) or underscore(_) in this field, first character should be a letter.',function(v){if(v!=''&&v){return/^[A-Za-z]+[A-Za-z0-9_]+$/.test(v);}
return true;}],['validate-css-length','Please input a valid CSS-length. For example 100px or 77pt or 20em or .5ex or 50%',function(v){if(v!=''&&v){return/^[0-9\.]+(px|pt|em|ex|%)?$/.test(v)&&(!(/\..*\./.test(v)))&&!(/\.$/.test(v));}
return true;}],['validate-length','Maximum length exceeded.',function(v,elm){var re=new RegExp(/^maximum-length-[0-9]+$/);var result=true;$w(elm.className).each(function(name,index){if(name.match(re)&&result){var length=name.split('-')[2];result=(v.length<=length);}});return result;}],['validate-percents','Please enter a number lower than 100',{max:100}]]);function validateCreditCard(s){var v="0123456789";var w="";for(i=0;i<s.length;i++){x=s.charAt(i);if(v.indexOf(x,0)!=-1)
w+=x;}
j=w.length/2;k=Math.floor(j);m=Math.ceil(j)-k;c=0;for(i=0;i<k;i++){a=w.charAt(i*2+m)*2;c+=a>9?Math.floor(a/10+a%10):a;}
for(i=0;i<k+m;i++)c+=w.charAt(i*2+1-m)*1;return(c%10==0);}
function removeDelimiters(v){v=v.replace(/\s/g,'');v=v.replace(/\-/g,'');return v;}
function parseNumber(v)
{if(typeof v!='string'){return parseFloat(v);}
var isDot=v.indexOf('.');var isComa=v.indexOf(',');if(isDot!=-1&&isComa!=-1){if(isComa>isDot){v=v.replace('.','').replace(',','.');}
else{v=v.replace(',','');}}
else if(isComa!=-1){v=v.replace(',','.');}
return parseFloat(v);}
Validation.creditCartTypes=$H({'VI':[new RegExp('^4[0-9]{12}([0-9]{3})?$'),new RegExp('^[0-9]{3}$'),true],'MC':[new RegExp('^5[1-5][0-9]{14}$'),new RegExp('^[0-9]{3}$'),true],'AE':[new RegExp('^3[47][0-9]{13}$'),new RegExp('^[0-9]{4}$'),true],'DI':[new RegExp('^6011[0-9]{12}$'),new RegExp('^[0-9]{3}$'),true],'SS':[new RegExp('^((6759[0-9]{12})|(49[013][1356][0-9]{13})|(633[34][0-9]{12})|(633110[0-9]{10})|(564182[0-9]{10}))([0-9]{2,3})?$'),new RegExp('^([0-9]{3}|[0-9]{4})?$'),true],'OT':[false,new RegExp('^([0-9]{3}|[0-9]{4})?$'),false]});
// script.aculo.us builder.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

var Builder = {
  NODEMAP: {
    AREA: 'map',
    CAPTION: 'table',
    COL: 'table',
    COLGROUP: 'table',
    LEGEND: 'fieldset',
    OPTGROUP: 'select',
    OPTION: 'select',
    PARAM: 'object',
    TBODY: 'table',
    TD: 'table',
    TFOOT: 'table',
    TH: 'table',
    THEAD: 'table',
    TR: 'table'
  },
  // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
  //       due to a Firefox bug
  node: function(elementName) {
    elementName = elementName.toUpperCase();

    // try innerHTML approach
    var parentTag = this.NODEMAP[elementName] || 'div';
    var parentElement = document.createElement(parentTag);
    try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
      parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
    } catch(e) {}
    var element = parentElement.firstChild || null;

    // see if browser added wrapping tags
    if(element && (element.tagName.toUpperCase() != elementName))
      element = element.getElementsByTagName(elementName)[0];

    // fallback to createElement approach
    if(!element) element = document.createElement(elementName);

    // abort if nothing could be created
    if(!element) return;

    // attributes (or text)
    if(arguments[1])
      if(this._isStringOrNumber(arguments[1]) ||
        (arguments[1] instanceof Array) ||
        arguments[1].tagName) {
          this._children(element, arguments[1]);
        } else {
          var attrs = this._attributes(arguments[1]);
          if(attrs.length) {
            try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
              parentElement.innerHTML = "<" +elementName + " " +
                attrs + "></" + elementName + ">";
            } catch(e) {}
            element = parentElement.firstChild || null;
            // workaround firefox 1.0.X bug
            if(!element) {
              element = document.createElement(elementName);
              for(attr in arguments[1])
                element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
            }
            if(element.tagName.toUpperCase() != elementName)
              element = parentElement.getElementsByTagName(elementName)[0];
          }
        }

    // text, or array of children
    if(arguments[2])
      this._children(element, arguments[2]);

     return $(element);
  },
  _text: function(text) {
     return document.createTextNode(text);
  },

  ATTR_MAP: {
    'className': 'class',
    'htmlFor': 'for'
  },

  _attributes: function(attributes) {
    var attrs = [];
    for(attribute in attributes)
      attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
          '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
    return attrs.join(" ");
  },
  _children: function(element, children) {
    if(children.tagName) {
      element.appendChild(children);
      return;
    }
    if(typeof children=='object') { // array can hold nodes and text
      children.flatten().each( function(e) {
        if(typeof e=='object')
          element.appendChild(e);
        else
          if(Builder._isStringOrNumber(e))
            element.appendChild(Builder._text(e));
      });
    } else
      if(Builder._isStringOrNumber(children))
        element.appendChild(Builder._text(children));
  },
  _isStringOrNumber: function(param) {
    return(typeof param=='string' || typeof param=='number');
  },
  build: function(html) {
    var element = this.node('div');
    $(element).update(html.strip());
    return element.down();
  },
  dump: function(scope) {
    if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope

    var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
      "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
      "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
      "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
      "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
      "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);

    tags.each( function(tag){
      scope[tag] = function() {
        return Builder.node.apply(Builder, [tag].concat($A(arguments)));
      };
    });
  }
};
// script.aculo.us effects.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// Contributors:
//  Justin Palmer (http://encytemedia.com/)
//  Mark Pilgrim (http://diveintomark.org/)
//  Martin Bialasinki
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

// converts rgb() and #xxx to #xxxxxx format,
// returns self (or first argument) if not convertable
String.prototype.parseColor = function() {
  var color = '#';
  if (this.slice(0,4) == 'rgb(') {
    var cols = this.slice(4,this.length-1).split(',');
    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
  } else {
    if (this.slice(0,1) == '#') {
      if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
      if (this.length==7) color = this.toLowerCase();
    }
  }
  return (color.length==7 ? color : (arguments[0] || this));
};

/*--------------------------------------------------------------------------*/

Element.collectTextNodes = function(element) {
  return $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue :
      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
  }).flatten().join('');
};

Element.collectTextNodesIgnoreClass = function(element, className) {
  return $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue :
      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
        Element.collectTextNodesIgnoreClass(node, className) : ''));
  }).flatten().join('');
};

Element.setContentZoom = function(element, percent) {
  element = $(element);
  element.setStyle({fontSize: (percent/100) + 'em'});
  if (Prototype.Browser.WebKit) window.scrollBy(0,0);
  return element;
};

Element.getInlineOpacity = function(element){
  return $(element).style.opacity || '';
};

Element.forceRerendering = function(element) {
  try {
    element = $(element);
    var n = document.createTextNode(' ');
    element.appendChild(n);
    element.removeChild(n);
  } catch(e) { }
};

/*--------------------------------------------------------------------------*/

var Effect = {
  _elementDoesNotExistError: {
    name: 'ElementDoesNotExistError',
    message: 'The specified DOM element does not exist, but is required for this effect to operate'
  },
  Transitions: {
    linear: Prototype.K,
    sinoidal: function(pos) {
      return (-Math.cos(pos*Math.PI)/2) + .5;
    },
    reverse: function(pos) {
      return 1-pos;
    },
    flicker: function(pos) {
      var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4;
      return pos > 1 ? 1 : pos;
    },
    wobble: function(pos) {
      return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5;
    },
    pulse: function(pos, pulses) {
      return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5;
    },
    spring: function(pos) {
      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));
    },
    none: function(pos) {
      return 0;
    },
    full: function(pos) {
      return 1;
    }
  },
  DefaultOptions: {
    duration:   1.0,   // seconds
    fps:        100,   // 100= assume 66fps max.
    sync:       false, // true for combining
    from:       0.0,
    to:         1.0,
    delay:      0.0,
    queue:      'parallel'
  },
  tagifyText: function(element) {
    var tagifyStyle = 'position:relative';
    if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';

    element = $(element);
    $A(element.childNodes).each( function(child) {
      if (child.nodeType==3) {
        child.nodeValue.toArray().each( function(character) {
          element.insertBefore(
            new Element('span', {style: tagifyStyle}).update(
              character == ' ' ? String.fromCharCode(160) : character),
              child);
        });
        Element.remove(child);
      }
    });
  },
  multiple: function(element, effect) {
    var elements;
    if (((typeof element == 'object') ||
        Object.isFunction(element)) &&
       (element.length))
      elements = element;
    else
      elements = $(element).childNodes;

    var options = Object.extend({
      speed: 0.1,
      delay: 0.0
    }, arguments[2] || { });
    var masterDelay = options.delay;

    $A(elements).each( function(element, index) {
      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
    });
  },
  PAIRS: {
    'slide':  ['SlideDown','SlideUp'],
    'blind':  ['BlindDown','BlindUp'],
    'appear': ['Appear','Fade']
  },
  toggle: function(element, effect) {
    element = $(element);
    effect = (effect || 'appear').toLowerCase();
    var options = Object.extend({
      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
    }, arguments[2] || { });
    Effect[element.visible() ?
      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
  }
};

Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;

/* ------------- core effects ------------- */

Effect.ScopedQueue = Class.create(Enumerable, {
  initialize: function() {
    this.effects  = [];
    this.interval = null;
  },
  _each: function(iterator) {
    this.effects._each(iterator);
  },
  add: function(effect) {
    var timestamp = new Date().getTime();

    var position = Object.isString(effect.options.queue) ?
      effect.options.queue : effect.options.queue.position;

    switch(position) {
      case 'front':
        // move unstarted effects after this effect
        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
            e.startOn  += effect.finishOn;
            e.finishOn += effect.finishOn;
          });
        break;
      case 'with-last':
        timestamp = this.effects.pluck('startOn').max() || timestamp;
        break;
      case 'end':
        // start effect after last queued effect has finished
        timestamp = this.effects.pluck('finishOn').max() || timestamp;
        break;
    }

    effect.startOn  += timestamp;
    effect.finishOn += timestamp;

    if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
      this.effects.push(effect);

    if (!this.interval)
      this.interval = setInterval(this.loop.bind(this), 15);
  },
  remove: function(effect) {
    this.effects = this.effects.reject(function(e) { return e==effect });
    if (this.effects.length == 0) {
      clearInterval(this.interval);
      this.interval = null;
    }
  },
  loop: function() {
    var timePos = new Date().getTime();
    for(var i=0, len=this.effects.length;i<len;i++)
      this.effects[i] && this.effects[i].loop(timePos);
  }
});

Effect.Queues = {
  instances: $H(),
  get: function(queueName) {
    if (!Object.isString(queueName)) return queueName;

    return this.instances.get(queueName) ||
      this.instances.set(queueName, new Effect.ScopedQueue());
  }
};
Effect.Queue = Effect.Queues.get('global');

Effect.Base = Class.create({
  position: null,
  start: function(options) {
    function codeForEvent(options,eventName){
      return (
        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
        (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
      );
    }
    if (options && options.transition === false) options.transition = Effect.Transitions.linear;
    this.options      = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });
    this.currentFrame = 0;
    this.state        = 'idle';
    this.startOn      = this.options.delay*1000;
    this.finishOn     = this.startOn+(this.options.duration*1000);
    this.fromToDelta  = this.options.to-this.options.from;
    this.totalTime    = this.finishOn-this.startOn;
    this.totalFrames  = this.options.fps*this.options.duration;

    this.render = (function() {
      function dispatch(effect, eventName) {
        if (effect.options[eventName + 'Internal'])
          effect.options[eventName + 'Internal'](effect);
        if (effect.options[eventName])
          effect.options[eventName](effect);
      }

      return function(pos) {
        if (this.state === "idle") {
          this.state = "running";
          dispatch(this, 'beforeSetup');
          if (this.setup) this.setup();
          dispatch(this, 'afterSetup');
        }
        if (this.state === "running") {
          pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from;
          this.position = pos;
          dispatch(this, 'beforeUpdate');
          if (this.update) this.update(pos);
          dispatch(this, 'afterUpdate');
        }
      };
    })();

    this.event('beforeStart');
    if (!this.options.sync)
      Effect.Queues.get(Object.isString(this.options.queue) ?
        'global' : this.options.queue.scope).add(this);
  },
  loop: function(timePos) {
    if (timePos >= this.startOn) {
      if (timePos >= this.finishOn) {
        this.render(1.0);
        this.cancel();
        this.event('beforeFinish');
        if (this.finish) this.finish();
        this.event('afterFinish');
        return;
      }
      var pos   = (timePos - this.startOn) / this.totalTime,
          frame = (pos * this.totalFrames).round();
      if (frame > this.currentFrame) {
        this.render(pos);
        this.currentFrame = frame;
      }
    }
  },
  cancel: function() {
    if (!this.options.sync)
      Effect.Queues.get(Object.isString(this.options.queue) ?
        'global' : this.options.queue.scope).remove(this);
    this.state = 'finished';
  },
  event: function(eventName) {
    if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
    if (this.options[eventName]) this.options[eventName](this);
  },
  inspect: function() {
    var data = $H();
    for(property in this)
      if (!Object.isFunction(this[property])) data.set(property, this[property]);
    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
  }
});

Effect.Parallel = Class.create(Effect.Base, {
  initialize: function(effects) {
    this.effects = effects || [];
    this.start(arguments[1]);
  },
  update: function(position) {
    this.effects.invoke('render', position);
  },
  finish: function(position) {
    this.effects.each( function(effect) {
      effect.render(1.0);
      effect.cancel();
      effect.event('beforeFinish');
      if (effect.finish) effect.finish(position);
      effect.event('afterFinish');
    });
  }
});

Effect.Tween = Class.create(Effect.Base, {
  initialize: function(object, from, to) {
    object = Object.isString(object) ? $(object) : object;
    var args = $A(arguments), method = args.last(),
      options = args.length == 5 ? args[3] : null;
    this.method = Object.isFunction(method) ? method.bind(object) :
      Object.isFunction(object[method]) ? object[method].bind(object) :
      function(value) { object[method] = value };
    this.start(Object.extend({ from: from, to: to }, options || { }));
  },
  update: function(position) {
    this.method(position);
  }
});

Effect.Event = Class.create(Effect.Base, {
  initialize: function() {
    this.start(Object.extend({ duration: 0 }, arguments[0] || { }));
  },
  update: Prototype.emptyFunction
});

Effect.Opacity = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    // make this work on IE on elements without 'layout'
    if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
      this.element.setStyle({zoom: 1});
    var options = Object.extend({
      from: this.element.getOpacity() || 0.0,
      to:   1.0
    }, arguments[1] || { });
    this.start(options);
  },
  update: function(position) {
    this.element.setOpacity(position);
  }
});

Effect.Move = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'relative'
    }, arguments[1] || { });
    this.start(options);
  },
  setup: function() {
    this.element.makePositioned();
    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
    if (this.options.mode == 'absolute') {
      this.options.x = this.options.x - this.originalLeft;
      this.options.y = this.options.y - this.originalTop;
    }
  },
  update: function(position) {
    this.element.setStyle({
      left: (this.options.x  * position + this.originalLeft).round() + 'px',
      top:  (this.options.y  * position + this.originalTop).round()  + 'px'
    });
  }
});

// for backwards compatibility
Effect.MoveBy = function(element, toTop, toLeft) {
  return new Effect.Move(element,
    Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
};

Effect.Scale = Class.create(Effect.Base, {
  initialize: function(element, percent) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      scaleX: true,
      scaleY: true,
      scaleContent: true,
      scaleFromCenter: false,
      scaleMode: 'box',        // 'box' or 'contents' or { } with provided values
      scaleFrom: 100.0,
      scaleTo:   percent
    }, arguments[2] || { });
    this.start(options);
  },
  setup: function() {
    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
    this.elementPositioning = this.element.getStyle('position');

    this.originalStyle = { };
    ['top','left','width','height','fontSize'].each( function(k) {
      this.originalStyle[k] = this.element.style[k];
    }.bind(this));

    this.originalTop  = this.element.offsetTop;
    this.originalLeft = this.element.offsetLeft;

    var fontSize = this.element.getStyle('font-size') || '100%';
    ['em','px','%','pt'].each( function(fontSizeType) {
      if (fontSize.indexOf(fontSizeType)>0) {
        this.fontSize     = parseFloat(fontSize);
        this.fontSizeType = fontSizeType;
      }
    }.bind(this));

    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;

    this.dims = null;
    if (this.options.scaleMode=='box')
      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
    if (/^content/.test(this.options.scaleMode))
      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
    if (!this.dims)
      this.dims = [this.options.scaleMode.originalHeight,
                   this.options.scaleMode.originalWidth];
  },
  update: function(position) {
    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
    if (this.options.scaleContent && this.fontSize)
      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
  },
  finish: function(position) {
    if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
  },
  setDimensions: function(height, width) {
    var d = { };
    if (this.options.scaleX) d.width = width.round() + 'px';
    if (this.options.scaleY) d.height = height.round() + 'px';
    if (this.options.scaleFromCenter) {
      var topd  = (height - this.dims[0])/2;
      var leftd = (width  - this.dims[1])/2;
      if (this.elementPositioning == 'absolute') {
        if (this.options.scaleY) d.top = this.originalTop-topd + 'px';
        if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
      } else {
        if (this.options.scaleY) d.top = -topd + 'px';
        if (this.options.scaleX) d.left = -leftd + 'px';
      }
    }
    this.element.setStyle(d);
  }
});

Effect.Highlight = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
    this.start(options);
  },
  setup: function() {
    // Prevent executing on elements not in the layout flow
    if (this.element.getStyle('display')=='none') { this.cancel(); return; }
    // Disable background image during the effect
    this.oldStyle = { };
    if (!this.options.keepBackgroundImage) {
      this.oldStyle.backgroundImage = this.element.getStyle('background-image');
      this.element.setStyle({backgroundImage: 'none'});
    }
    if (!this.options.endcolor)
      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
    if (!this.options.restorecolor)
      this.options.restorecolor = this.element.getStyle('background-color');
    // init color calculations
    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
  },
  update: function(position) {
    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
      return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });
  },
  finish: function() {
    this.element.setStyle(Object.extend(this.oldStyle, {
      backgroundColor: this.options.restorecolor
    }));
  }
});

Effect.ScrollTo = function(element) {
  var options = arguments[1] || { },
  scrollOffsets = document.viewport.getScrollOffsets(),
  elementOffsets = $(element).cumulativeOffset();

  if (options.offset) elementOffsets[1] += options.offset;

  return new Effect.Tween(null,
    scrollOffsets.top,
    elementOffsets[1],
    options,
    function(p){ scrollTo(scrollOffsets.left, p.round()); }
  );
};

/* ------------- combination effects ------------- */

Effect.Fade = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  var options = Object.extend({
    from: element.getOpacity() || 1.0,
    to:   0.0,
    afterFinishInternal: function(effect) {
      if (effect.options.to!=0) return;
      effect.element.hide().setStyle({opacity: oldOpacity});
    }
  }, arguments[1] || { });
  return new Effect.Opacity(element,options);
};

Effect.Appear = function(element) {
  element = $(element);
  var options = Object.extend({
  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
  to:   1.0,
  // force Safari to render floated elements properly
  afterFinishInternal: function(effect) {
    effect.element.forceRerendering();
  },
  beforeSetup: function(effect) {
    effect.element.setOpacity(effect.options.from).show();
  }}, arguments[1] || { });
  return new Effect.Opacity(element,options);
};

Effect.Puff = function(element) {
  element = $(element);
  var oldStyle = {
    opacity: element.getInlineOpacity(),
    position: element.getStyle('position'),
    top:  element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height
  };
  return new Effect.Parallel(
   [ new Effect.Scale(element, 200,
      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
     Object.extend({ duration: 1.0,
      beforeSetupInternal: function(effect) {
        Position.absolutize(effect.effects[0].element);
      },
      afterFinishInternal: function(effect) {
         effect.effects[0].element.hide().setStyle(oldStyle); }
     }, arguments[1] || { })
   );
};

Effect.BlindUp = function(element) {
  element = $(element);
  element.makeClipping();
  return new Effect.Scale(element, 0,
    Object.extend({ scaleContent: false,
      scaleX: false,
      restoreAfterFinish: true,
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping();
      }
    }, arguments[1] || { })
  );
};

Effect.BlindDown = function(element) {
  element = $(element);
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({
    scaleContent: false,
    scaleX: false,
    scaleFrom: 0,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makeClipping().setStyle({height: '0px'}).show();
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping();
    }
  }, arguments[1] || { }));
};

Effect.SwitchOff = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  return new Effect.Appear(element, Object.extend({
    duration: 0.4,
    from: 0,
    transition: Effect.Transitions.flicker,
    afterFinishInternal: function(effect) {
      new Effect.Scale(effect.element, 1, {
        duration: 0.3, scaleFromCenter: true,
        scaleX: false, scaleContent: false, restoreAfterFinish: true,
        beforeSetup: function(effect) {
          effect.element.makePositioned().makeClipping();
        },
        afterFinishInternal: function(effect) {
          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
        }
      });
    }
  }, arguments[1] || { }));
};

Effect.DropOut = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left'),
    opacity: element.getInlineOpacity() };
  return new Effect.Parallel(
    [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
    Object.extend(
      { duration: 0.5,
        beforeSetup: function(effect) {
          effect.effects[0].element.makePositioned();
        },
        afterFinishInternal: function(effect) {
          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
        }
      }, arguments[1] || { }));
};

Effect.Shake = function(element) {
  element = $(element);
  var options = Object.extend({
    distance: 20,
    duration: 0.5
  }, arguments[1] || {});
  var distance = parseFloat(options.distance);
  var split = parseFloat(options.duration) / 10.0;
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left') };
    return new Effect.Move(element,
      { x:  distance, y: 0, duration: split, afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
        effect.element.undoPositioned().setStyle(oldStyle);
  }}); }}); }}); }}); }}); }});
};

Effect.SlideDown = function(element) {
  element = $(element).cleanWhitespace();
  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
  var oldInnerBottom = element.down().getStyle('bottom');
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({
    scaleContent: false,
    scaleX: false,
    scaleFrom: window.opera ? 0 : 1,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makePositioned();
      effect.element.down().makePositioned();
      if (window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping().setStyle({height: '0px'}).show();
    },
    afterUpdateInternal: function(effect) {
      effect.element.down().setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' });
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping().undoPositioned();
      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
    }, arguments[1] || { })
  );
};

Effect.SlideUp = function(element) {
  element = $(element).cleanWhitespace();
  var oldInnerBottom = element.down().getStyle('bottom');
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, window.opera ? 0 : 1,
   Object.extend({ scaleContent: false,
    scaleX: false,
    scaleMode: 'box',
    scaleFrom: 100,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makePositioned();
      effect.element.down().makePositioned();
      if (window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping().show();
    },
    afterUpdateInternal: function(effect) {
      effect.element.down().setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' });
    },
    afterFinishInternal: function(effect) {
      effect.element.hide().undoClipping().undoPositioned();
      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});
    }
   }, arguments[1] || { })
  );
};

// Bug in opera makes the TD containing this element expand for a instance after finish
Effect.Squish = function(element) {
  return new Effect.Scale(element, window.opera ? 1 : 0, {
    restoreAfterFinish: true,
    beforeSetup: function(effect) {
      effect.element.makeClipping();
    },
    afterFinishInternal: function(effect) {
      effect.element.hide().undoClipping();
    }
  });
};

Effect.Grow = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.full
  }, arguments[1] || { });
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: element.getInlineOpacity() };

  var dims = element.getDimensions();
  var initialMoveX, initialMoveY;
  var moveX, moveY;

  switch (options.direction) {
    case 'top-left':
      initialMoveX = initialMoveY = moveX = moveY = 0;
      break;
    case 'top-right':
      initialMoveX = dims.width;
      initialMoveY = moveY = 0;
      moveX = -dims.width;
      break;
    case 'bottom-left':
      initialMoveX = moveX = 0;
      initialMoveY = dims.height;
      moveY = -dims.height;
      break;
    case 'bottom-right':
      initialMoveX = dims.width;
      initialMoveY = dims.height;
      moveX = -dims.width;
      moveY = -dims.height;
      break;
    case 'center':
      initialMoveX = dims.width / 2;
      initialMoveY = dims.height / 2;
      moveX = -dims.width / 2;
      moveY = -dims.height / 2;
      break;
  }

  return new Effect.Move(element, {
    x: initialMoveX,
    y: initialMoveY,
    duration: 0.01,
    beforeSetup: function(effect) {
      effect.element.hide().makeClipping().makePositioned();
    },
    afterFinishInternal: function(effect) {
      new Effect.Parallel(
        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
          new Effect.Scale(effect.element, 100, {
            scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
        ], Object.extend({
             beforeSetup: function(effect) {
               effect.effects[0].element.setStyle({height: '0px'}).show();
             },
             afterFinishInternal: function(effect) {
               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
             }
           }, options)
      );
    }
  });
};

Effect.Shrink = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.none
  }, arguments[1] || { });
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: element.getInlineOpacity() };

  var dims = element.getDimensions();
  var moveX, moveY;

  switch (options.direction) {
    case 'top-left':
      moveX = moveY = 0;
      break;
    case 'top-right':
      moveX = dims.width;
      moveY = 0;
      break;
    case 'bottom-left':
      moveX = 0;
      moveY = dims.height;
      break;
    case 'bottom-right':
      moveX = dims.width;
      moveY = dims.height;
      break;
    case 'center':
      moveX = dims.width / 2;
      moveY = dims.height / 2;
      break;
  }

  return new Effect.Parallel(
    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
    ], Object.extend({
         beforeStartInternal: function(effect) {
           effect.effects[0].element.makePositioned().makeClipping();
         },
         afterFinishInternal: function(effect) {
           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
       }, options)
  );
};

Effect.Pulsate = function(element) {
  element = $(element);
  var options    = arguments[1] || { },
    oldOpacity = element.getInlineOpacity(),
    transition = options.transition || Effect.Transitions.linear,
    reverser   = function(pos){
      return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5);
    };

  return new Effect.Opacity(element,
    Object.extend(Object.extend({  duration: 2.0, from: 0,
      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
    }, options), {transition: reverser}));
};

Effect.Fold = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height };
  element.makeClipping();
  return new Effect.Scale(element, 5, Object.extend({
    scaleContent: false,
    scaleX: false,
    afterFinishInternal: function(effect) {
    new Effect.Scale(element, 1, {
      scaleContent: false,
      scaleY: false,
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping().setStyle(oldStyle);
      } });
  }}, arguments[1] || { }));
};

Effect.Morph = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      style: { }
    }, arguments[1] || { });

    if (!Object.isString(options.style)) this.style = $H(options.style);
    else {
      if (options.style.include(':'))
        this.style = options.style.parseStyle();
      else {
        this.element.addClassName(options.style);
        this.style = $H(this.element.getStyles());
        this.element.removeClassName(options.style);
        var css = this.element.getStyles();
        this.style = this.style.reject(function(style) {
          return style.value == css[style.key];
        });
        options.afterFinishInternal = function(effect) {
          effect.element.addClassName(effect.options.style);
          effect.transforms.each(function(transform) {
            effect.element.style[transform.style] = '';
          });
        };
      }
    }
    this.start(options);
  },

  setup: function(){
    function parseColor(color){
      if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
      color = color.parseColor();
      return $R(0,2).map(function(i){
        return parseInt( color.slice(i*2+1,i*2+3), 16 );
      });
    }
    this.transforms = this.style.map(function(pair){
      var property = pair[0], value = pair[1], unit = null;

      if (value.parseColor('#zzzzzz') != '#zzzzzz') {
        value = value.parseColor();
        unit  = 'color';
      } else if (property == 'opacity') {
        value = parseFloat(value);
        if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
          this.element.setStyle({zoom: 1});
      } else if (Element.CSS_LENGTH.test(value)) {
          var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
          value = parseFloat(components[1]);
          unit = (components.length == 3) ? components[2] : null;
      }

      var originalValue = this.element.getStyle(property);
      return {
        style: property.camelize(),
        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
        targetValue: unit=='color' ? parseColor(value) : value,
        unit: unit
      };
    }.bind(this)).reject(function(transform){
      return (
        (transform.originalValue == transform.targetValue) ||
        (
          transform.unit != 'color' &&
          (isNaN(transform.originalValue) || isNaN(transform.targetValue))
        )
      );
    });
  },
  update: function(position) {
    var style = { }, transform, i = this.transforms.length;
    while(i--)
      style[(transform = this.transforms[i]).style] =
        transform.unit=='color' ? '#'+
          (Math.round(transform.originalValue[0]+
            (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
          (Math.round(transform.originalValue[1]+
            (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
          (Math.round(transform.originalValue[2]+
            (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
        (transform.originalValue +
          (transform.targetValue - transform.originalValue) * position).toFixed(3) +
            (transform.unit === null ? '' : transform.unit);
    this.element.setStyle(style, true);
  }
});

Effect.Transform = Class.create({
  initialize: function(tracks){
    this.tracks  = [];
    this.options = arguments[1] || { };
    this.addTracks(tracks);
  },
  addTracks: function(tracks){
    tracks.each(function(track){
      track = $H(track);
      var data = track.values().first();
      this.tracks.push($H({
        ids:     track.keys().first(),
        effect:  Effect.Morph,
        options: { style: data }
      }));
    }.bind(this));
    return this;
  },
  play: function(){
    return new Effect.Parallel(
      this.tracks.map(function(track){
        var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');
        var elements = [$(ids) || $$(ids)].flatten();
        return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) });
      }).flatten(),
      this.options
    );
  }
});

Element.CSS_PROPERTIES = $w(
  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
  'fontSize fontWeight height left letterSpacing lineHeight ' +
  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
  'right textIndent top width wordSpacing zIndex');

Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;

String.__parseStyleElement = document.createElement('div');
String.prototype.parseStyle = function(){
  var style, styleRules = $H();
  if (Prototype.Browser.WebKit)
    style = new Element('div',{style:this}).style;
  else {
    String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
    style = String.__parseStyleElement.childNodes[0].style;
  }

  Element.CSS_PROPERTIES.each(function(property){
    if (style[property]) styleRules.set(property, style[property]);
  });

  if (Prototype.Browser.IE && this.include('opacity'))
    styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);

  return styleRules;
};

if (document.defaultView && document.defaultView.getComputedStyle) {
  Element.getStyles = function(element) {
    var css = document.defaultView.getComputedStyle($(element), null);
    return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
      styles[property] = css[property];
      return styles;
    });
  };
} else {
  Element.getStyles = function(element) {
    element = $(element);
    var css = element.currentStyle, styles;
    styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) {
      results[property] = css[property];
      return results;
    });
    if (!styles.opacity) styles.opacity = element.getOpacity();
    return styles;
  };
}

Effect.Methods = {
  morph: function(element, style) {
    element = $(element);
    new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));
    return element;
  },
  visualEffect: function(element, effect, options) {
    element = $(element);
    var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
    new Effect[klass](element, options);
    return element;
  },
  highlight: function(element, options) {
    element = $(element);
    new Effect.Highlight(element, options);
    return element;
  }
};

$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
  'pulsate shake puff squish switchOff dropOut').each(
  function(effect) {
    Effect.Methods[effect] = function(element, options){
      element = $(element);
      Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
      return element;
    };
  }
);

$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
  function(f) { Effect.Methods[f] = Element[f]; }
);

Element.addMethods(Effect.Methods);
// accordion.js v2.0
//
// Copyright (c) 2007 stickmanlabs
// Author: Kevin P Miller | http://www.stickmanlabs.com
// 
// Accordion is freely distributable under the terms of an MIT-style license.
//
// I don't care what you think about the file size...
//   Be a pro: 
//	    http://www.thinkvitamin.com/features/webapps/serving-javascript-fast
//      http://rakaz.nl/item/make_your_pages_load_faster_by_combining_and_compressing_javascript_and_css_files
//

/*-----------------------------------------------------------------------------------------------*/

if (typeof Effect == 'undefined') 
	throw("accordion.js requires including script.aculo.us' effects.js library!");

var accordion = Class.create();
accordion.prototype = {

	//
	//  Setup the Variables
	//
	showAccordion : null,
	currentAccordion : null,
	duration : null,
	effects : [],
	animating : false,
	container : null,
	
	//  
	//  Initialize the accordions
	//
	initialize: function(container, options) {
	  if (!$(container)) {
	    throw(container+" doesn't exist!");
	    return false;
	  }
	  
		this.options = Object.extend({
			resizeSpeed : 8,
			classNames : {
				toggle : 'accordion_toggle',
				toggleActive : 'accordion_toggle_active',
				content : 'accordion_content'
			},
			defaultSize : {
				height : null,
				width : null
			},
			direction : 'vertical',
			onEvent : 'click',
			hideOnLoad : true,
			bindEvent : true
		}, options || {});
		
		this.duration = ((11-this.options.resizeSpeed)*0.15);
		this.container = container;
		
		var accordions = $$('#'+container+' .'+this.options.classNames.toggle);
		accordions.each(function(accordion) {
			if(this.options.bindEvent == true)
			{
				Event.observe(accordion, this.options.onEvent, this.activate.bind(this, accordion), false);
				if (this.options.onEvent == 'click') {
				  accordion.onclick = function() {return false;};
				}
			}
			
			if(this.options.hideOnLoad == true)
			{
				if (this.options.direction == 'horizontal') {
					var options = {width: '0px', display:'none'};
				} else {
					var options = {height: '0px', display:'none'};
				}
			}
//			options.merge({display: 'none'});			
			
			this.currentAccordion = $(accordion.next(0)).setStyle(options);
		}.bind(this));
	},
	
	//
	//  Activate an accordion
	//
	activate : function(accordion) {
		if(this.options.hideOnLoad == false)
		{
			var accordions = $$('#'+this.container+' .'+this.options.classNames.toggle);
			accordions.each(function(acc){
				if (this.options.direction == 'horizontal') {
					var options = {width: '0px', display:'none'};
				} else {
					var options = {height: '0px', display:'none'};
				}
				this.currentAccordion = $(acc.next(0)).setStyle(options);
			}.bind(this));
			this.options.hideOnLoad = true;
		}
		
		if (this.animating) {
			return false;
		}
		
		this.effects = [];
	
	
		this.currentAccordion = $(accordion.next(0));
		this.currentAccordion.setStyle({
			display: 'block'
		});		
		
		this.currentAccordion.previous(0).addClassName(this.options.classNames.toggleActive);

		if (this.options.direction == 'horizontal') {
			this.scaling = $H({
				scaleX: true,
				scaleY: false
			});
		} else {
			this.scaling = $H({
				scaleX: false,
				scaleY: true
			});			
		}
		var id = accordion.id;
		if(id.substring(0,4) == 'left')
		{
			var list = 'list' + id.substring(4);
			if(typeof(laccordion) != 'undefined' && laccordion != null)
			laccordion.activate($(list));
		}
			
		if (this.currentAccordion == this.showAccordion) {
		  this.deactivate();
		} else {
		  this._handleAccordion();
		}
	},
	// 
	// Deactivate an active accordion
	//
	deactivate : function() {
		var options = $H({
		  duration: this.duration,
			scaleContent: false,
			transition: Effect.Transitions.sinoidal,
			queue: {
				position: 'end', 
				scope: 'accordionAnimation'
			},
			scaleMode: { 
				originalHeight: this.options.defaultSize.height ? this.options.defaultSize.height : this.currentAccordion.scrollHeight,
				originalWidth: this.options.defaultSize.width ? this.options.defaultSize.width : this.currentAccordion.scrollWidth
			},
			afterFinish: function() {
				this.showAccordion.setStyle({
          			height: 'auto',
					display: 'none'
				});				
				this.showAccordion = null;
				this.animating = false;
			}.bind(this)
		});    
//    options.merge(this.scaling);

    this.showAccordion.previous(0).removeClassName(this.options.classNames.toggleActive);
    
		new Effect.Scale(this.showAccordion, 0, options.update(this.scaling).toObject());
	},

  //
  // Handle the open/close actions of the accordion
  //
	_handleAccordion : function() {
		var options = $H({
			sync: true,
			scaleFrom: 0,
			scaleContent: false,
			transition: Effect.Transitions.sinoidal,
			scaleMode: { 
				originalHeight: this.options.defaultSize.height ? this.options.defaultSize.height : this.currentAccordion.scrollHeight,
				originalWidth: this.options.defaultSize.width ? this.options.defaultSize.width : this.currentAccordion.scrollWidth
			}
		});
		options.merge(this.scaling);
		
		this.effects.push(
			new Effect.Scale(this.currentAccordion, 100, options.update(this.scaling).toObject())
		);

		if (this.showAccordion) {
			this.showAccordion.previous(0).removeClassName(this.options.classNames.toggleActive);
			
			options = $H({
				sync: true,
				scaleContent: false,
				transition: Effect.Transitions.sinoidal
			});
			options.merge(this.scaling);
			
			this.effects.push(
				new Effect.Scale(this.showAccordion, 0, options.update(this.scaling).toObject())
			);				
		}
		
    new Effect.Parallel(this.effects, {
			duration: this.duration, 
			queue: {
				position: 'end', 
				scope: 'accordionAnimation'
			},
			beforeStart: function() {
				this.animating = true;
			}.bind(this),
			afterFinish: function() {
				if (this.showAccordion) {
					this.showAccordion.setStyle({
						display: 'none'
					});				
				}
				$(this.currentAccordion).setStyle({
				  height: 'auto'
				});
				this.showAccordion = this.currentAccordion;
				this.animating = false;
			}.bind(this)
		});
	}
}
// script.aculo.us dragdrop.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//           (c) 2005-2008 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

if(Object.isUndefined(Effect))
  throw("dragdrop.js requires including script.aculo.us' effects.js library");

var Droppables = {
  drops: [],

  remove: function(element) {
    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
  },

  add: function(element) {
    element = $(element);
    var options = Object.extend({
      greedy:     true,
      hoverclass: null,
      tree:       false
    }, arguments[1] || { });

    // cache containers
    if(options.containment) {
      options._containers = [];
      var containment = options.containment;
      if(Object.isArray(containment)) {
        containment.each( function(c) { options._containers.push($(c)) });
      } else {
        options._containers.push($(containment));
      }
    }

    if(options.accept) options.accept = [options.accept].flatten();

    Element.makePositioned(element); // fix IE
    options.element = element;

    this.drops.push(options);
  },

  findDeepestChild: function(drops) {
    deepest = drops[0];

    for (i = 1; i < drops.length; ++i)
      if (Element.isParent(drops[i].element, deepest.element))
        deepest = drops[i];

    return deepest;
  },

  isContained: function(element, drop) {
    var containmentNode;
    if(drop.tree) {
      containmentNode = element.treeNode;
    } else {
      containmentNode = element.parentNode;
    }
    return drop._containers.detect(function(c) { return containmentNode == c });
  },

  isAffected: function(point, element, drop) {
    return (
      (drop.element!=element) &&
      ((!drop._containers) ||
        this.isContained(element, drop)) &&
      ((!drop.accept) ||
        (Element.classNames(element).detect(
          function(v) { return drop.accept.include(v) } ) )) &&
      Position.within(drop.element, point[0], point[1]) );
  },

  deactivate: function(drop) {
    if(drop.hoverclass)
      Element.removeClassName(drop.element, drop.hoverclass);
    this.last_active = null;
  },

  activate: function(drop) {
    if(drop.hoverclass)
      Element.addClassName(drop.element, drop.hoverclass);
    this.last_active = drop;
  },

  show: function(point, element) {
    if(!this.drops.length) return;
    var drop, affected = [];

    this.drops.each( function(drop) {
      if(Droppables.isAffected(point, element, drop))
        affected.push(drop);
    });

    if(affected.length>0)
      drop = Droppables.findDeepestChild(affected);

    if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);
    if (drop) {
      Position.within(drop.element, point[0], point[1]);
      if(drop.onHover)
        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));

      if (drop != this.last_active) Droppables.activate(drop);
    }
  },

  fire: function(event, element) {
    if(!this.last_active) return;
    Position.prepare();

    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
      if (this.last_active.onDrop) {
        this.last_active.onDrop(element, this.last_active.element, event);
        return true;
      }
  },

  reset: function() {
    if(this.last_active)
      this.deactivate(this.last_active);
  }
};

var Draggables = {
  drags: [],
  observers: [],

  register: function(draggable) {
    if(this.drags.length == 0) {
      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
      this.eventKeypress  = this.keyPress.bindAsEventListener(this);

      Event.observe(document, "mouseup", this.eventMouseUp);
      Event.observe(draggable.element, "mousemove", this.eventMouseMove);
      Event.observe(document, "keypress", this.eventKeypress);
    }
    this.drags.push(draggable);
  },

  unregister: function(draggable) {
    this.drags = this.drags.reject(function(d) { return d==draggable });
    if(this.drags.length == 0) {
      Event.stopObserving(document, "mouseup", this.eventMouseUp);
      Event.stopObserving(draggable.element, "mousemove", this.eventMouseMove);
      Event.stopObserving(document, "keypress", this.eventKeypress);
    }
  },

  activate: function(draggable) {
    if(draggable.options.delay) {
      this._timeout = setTimeout(function() {
        Draggables._timeout = null;
        window.focus();
        Draggables.activeDraggable = draggable;
      }.bind(this), draggable.options.delay);
    } else {
      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
      this.activeDraggable = draggable;
    }
  },

  deactivate: function() {
    this.activeDraggable = null;
  },

  updateDrag: function(event) {
    if(!this.activeDraggable) return;
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    // Mozilla-based browsers fire successive mousemove events with
    // the same coordinates, prevent needless redrawing (moz bug?)
    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
    this._lastPointer = pointer;

    this.activeDraggable.updateDrag(event, pointer);
  },

  endDrag: function(event) {
    if(this._timeout) {
      clearTimeout(this._timeout);
      this._timeout = null;
    }
    if(!this.activeDraggable) return;
    this._lastPointer = null;
    this.activeDraggable.endDrag(event);
    this.activeDraggable = null;
  },

  keyPress: function(event) {
    if(this.activeDraggable)
      this.activeDraggable.keyPress(event);
  },

  addObserver: function(observer) {
    this.observers.push(observer);
    this._cacheObserverCallbacks();
  },

  removeObserver: function(element) {  // element instead of observer fixes mem leaks
    this.observers = this.observers.reject( function(o) { return o.element==element });
    this._cacheObserverCallbacks();
  },

  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
    if(this[eventName+'Count'] > 0)
      this.observers.each( function(o) {
        if(o[eventName]) o[eventName](eventName, draggable, event);
      });
    if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
  },

  _cacheObserverCallbacks: function() {
    ['onStart','onEnd','onDrag'].each( function(eventName) {
      Draggables[eventName+'Count'] = Draggables.observers.select(
        function(o) { return o[eventName]; }
      ).length;
    });
  }
};

/*--------------------------------------------------------------------------*/

var Draggable = Class.create({
  initialize: function(element) {
    var defaults = {
      handle: false,
      reverteffect: function(element, top_offset, left_offset) {
        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
          queue: {scope:'_draggable', position:'end'}
        });
      },
      endeffect: function(element) {
        var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
          queue: {scope:'_draggable', position:'end'},
          afterFinish: function(){
            Draggable._dragging[element] = false
          }
        });
      },
      zindex: 1000,
      revert: false,
      quiet: false,
      scroll: false,
      scrollSensitivity: 20,
      scrollSpeed: 15,
      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] }
      delay: 0
    };

    if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
      Object.extend(defaults, {
        starteffect: function(element) {
          element._opacity = Element.getOpacity(element);
          Draggable._dragging[element] = true;
          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
        }
      });

    var options = Object.extend(defaults, arguments[1] || { });

    this.element = $(element);

    if(options.handle && Object.isString(options.handle))
      this.handle = this.element.down('.'+options.handle, 0);

    if(!this.handle) this.handle = $(options.handle);
    if(!this.handle) this.handle = this.element;

    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
      options.scroll = $(options.scroll);
      this._isScrollChild = Element.childOf(this.element, options.scroll);
    }

    Element.makePositioned(this.element); // fix IE

    this.options  = options;
    this.dragging = false;

    this.eventMouseDown = this.initDrag.bindAsEventListener(this);
    Event.observe(this.handle, "mousedown", this.eventMouseDown);

    Draggables.register(this);
  },

  destroy: function() {
    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
    Draggables.unregister(this);
  },

  currentDelta: function() {
    return([
      parseInt(Element.getStyle(this.element,'left') || '0'),
      parseInt(Element.getStyle(this.element,'top') || '0')]);
  },

  initDrag: function(event) {
    if(!Object.isUndefined(Draggable._dragging[this.element]) &&
      Draggable._dragging[this.element]) return;
    if(Event.isLeftClick(event)) {
      // abort on form elements, fixes a Firefox issue
      var src = Event.element(event);
      if((tag_name = src.tagName.toUpperCase()) && (
        tag_name=='INPUT' ||
        tag_name=='SELECT' ||
        tag_name=='OPTION' ||
        tag_name=='BUTTON' ||
        tag_name=='TEXTAREA')) return;

      var pointer = [Event.pointerX(event), Event.pointerY(event)];
      var pos     = Position.cumulativeOffset(this.element);
      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });

      Draggables.activate(this);
      Event.stop(event);
    }
  },

  startDrag: function(event) {
    this.dragging = true;
    if(!this.delta)
      this.delta = this.currentDelta();

    if(this.options.zindex) {
      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
      this.element.style.zIndex = this.options.zindex;
    }

    if(this.options.ghosting) {
      this._clone = this.element.cloneNode(true);
      this._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
      if (!this._originallyAbsolute)
        Position.absolutize(this.element);
      this.element.parentNode.insertBefore(this._clone, this.element);
    }

    if(this.options.scroll) {
      if (this.options.scroll == window) {
        var where = this._getWindowScroll(this.options.scroll);
        this.originalScrollLeft = where.left;
        this.originalScrollTop = where.top;
      } else {
        this.originalScrollLeft = this.options.scroll.scrollLeft;
        this.originalScrollTop = this.options.scroll.scrollTop;
      }
    }

    Draggables.notify('onStart', this, event);

    if(this.options.starteffect) this.options.starteffect(this.element);
  },

  updateDrag: function(event, pointer) {
    if(!this.dragging) this.startDrag(event);

    if(!this.options.quiet){
      Position.prepare();
      Droppables.show(pointer, this.element);
    }

    Draggables.notify('onDrag', this, event);

    this.draw(pointer);
    if(this.options.change) this.options.change(this);

    if(this.options.scroll) {
      this.stopScrolling();

      var p;
      if (this.options.scroll == window) {
        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
      } else {
        p = Position.page(this.options.scroll);
        p[0] += this.options.scroll.scrollLeft + Position.deltaX;
        p[1] += this.options.scroll.scrollTop + Position.deltaY;
        p.push(p[0]+this.options.scroll.offsetWidth);
        p.push(p[1]+this.options.scroll.offsetHeight);
      }
      var speed = [0,0];
      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
      this.startScrolling(speed);
    }

    // fix AppleWebKit rendering
    if(Prototype.Browser.WebKit) window.scrollBy(0,0);

    Event.stop(event);
  },

  finishDrag: function(event, success) {
    this.dragging = false;

    if(this.options.quiet){
      Position.prepare();
      var pointer = [Event.pointerX(event), Event.pointerY(event)];
      Droppables.show(pointer, this.element);
    }

    if(this.options.ghosting) {
      if (!this._originallyAbsolute)
        Position.relativize(this.element);
      delete this._originallyAbsolute;
      Element.remove(this._clone);
      this._clone = null;
    }

    var dropped = false;
    if(success) {
      dropped = Droppables.fire(event, this.element);
      if (!dropped) dropped = false;
    }
    if(dropped && this.options.onDropped) this.options.onDropped(this.element);
    Draggables.notify('onEnd', this, event);

    var revert = this.options.revert;
    if(revert && Object.isFunction(revert)) revert = revert(this.element);

    var d = this.currentDelta();
    if(revert && this.options.reverteffect) {
      if (dropped == 0 || revert != 'failure')
        this.options.reverteffect(this.element,
          d[1]-this.delta[1], d[0]-this.delta[0]);
    } else {
      this.delta = d;
    }

    if(this.options.zindex)
      this.element.style.zIndex = this.originalZ;

    if(this.options.endeffect)
      this.options.endeffect(this.element);

    Draggables.deactivate(this);
    Droppables.reset();
  },

  keyPress: function(event) {
    if(event.keyCode!=Event.KEY_ESC) return;
    this.finishDrag(event, false);
    Event.stop(event);
  },

  endDrag: function(event) {
    if(!this.dragging) return;
    this.stopScrolling();
    this.finishDrag(event, true);
    Event.stop(event);
  },

  draw: function(point) {
    var pos = Position.cumulativeOffset(this.element);
    if(this.options.ghosting) {
      var r   = Position.realOffset(this.element);
      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
    }

    var d = this.currentDelta();
    pos[0] -= d[0]; pos[1] -= d[1];

    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
    }

    var p = [0,1].map(function(i){
      return (point[i]-pos[i]-this.offset[i])
    }.bind(this));

    if(this.options.snap) {
      if(Object.isFunction(this.options.snap)) {
        p = this.options.snap(p[0],p[1],this);
      } else {
      if(Object.isArray(this.options.snap)) {
        p = p.map( function(v, i) {
          return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this));
      } else {
        p = p.map( function(v) {
          return (v/this.options.snap).round()*this.options.snap }.bind(this));
      }
    }}

    var style = this.element.style;
    if((!this.options.constraint) || (this.options.constraint=='horizontal'))
      style.left = p[0] + "px";
    if((!this.options.constraint) || (this.options.constraint=='vertical'))
      style.top  = p[1] + "px";

    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
  },

  stopScrolling: function() {
    if(this.scrollInterval) {
      clearInterval(this.scrollInterval);
      this.scrollInterval = null;
      Draggables._lastScrollPointer = null;
    }
  },

  startScrolling: function(speed) {
    if(!(speed[0] || speed[1])) return;
    this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
    this.lastScrolled = new Date();
    this.scrollInterval = setInterval(this.scroll.bind(this), 10);
  },

  scroll: function() {
    var current = new Date();
    var delta = current - this.lastScrolled;
    this.lastScrolled = current;
    if(this.options.scroll == window) {
      with (this._getWindowScroll(this.options.scroll)) {
        if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
          var d = delta / 1000;
          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
        }
      }
    } else {
      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
    }

    Position.prepare();
    Droppables.show(Draggables._lastPointer, this.element);
    Draggables.notify('onDrag', this);
    if (this._isScrollChild) {
      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
      if (Draggables._lastScrollPointer[0] < 0)
        Draggables._lastScrollPointer[0] = 0;
      if (Draggables._lastScrollPointer[1] < 0)
        Draggables._lastScrollPointer[1] = 0;
      this.draw(Draggables._lastScrollPointer);
    }

    if(this.options.change) this.options.change(this);
  },

  _getWindowScroll: function(w) {
    var T, L, W, H;
    with (w.document) {
      if (w.document.documentElement && documentElement.scrollTop) {
        T = documentElement.scrollTop;
        L = documentElement.scrollLeft;
      } else if (w.document.body) {
        T = body.scrollTop;
        L = body.scrollLeft;
      }
      if (w.innerWidth) {
        W = w.innerWidth;
        H = w.innerHeight;
      } else if (w.document.documentElement && documentElement.clientWidth) {
        W = documentElement.clientWidth;
        H = documentElement.clientHeight;
      } else {
        W = body.offsetWidth;
        H = body.offsetHeight;
      }
    }
    return { top: T, left: L, width: W, height: H };
  }
});

Draggable._dragging = { };

/*--------------------------------------------------------------------------*/

var SortableObserver = Class.create({
  initialize: function(element, observer) {
    this.element   = $(element);
    this.observer  = observer;
    this.lastValue = Sortable.serialize(this.element);
  },

  onStart: function() {
    this.lastValue = Sortable.serialize(this.element);
  },

  onEnd: function() {
    Sortable.unmark();
    if(this.lastValue != Sortable.serialize(this.element))
      this.observer(this.element)
  }
});

var Sortable = {
  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,

  sortables: { },

  _findRootElement: function(element) {
    while (element.tagName.toUpperCase() != "BODY") {
      if(element.id && Sortable.sortables[element.id]) return element;
      element = element.parentNode;
    }
  },

  options: function(element) {
    element = Sortable._findRootElement($(element));
    if(!element) return;
    return Sortable.sortables[element.id];
  },

  destroy: function(element){
    element = $(element);
    var s = Sortable.sortables[element.id];

    if(s) {
      Draggables.removeObserver(s.element);
      s.droppables.each(function(d){ Droppables.remove(d) });
      s.draggables.invoke('destroy');

      delete Sortable.sortables[s.element.id];
    }
  },

  create: function(element) {
    element = $(element);
    var options = Object.extend({
      element:     element,
      tag:         'li',       // assumes li children, override with tag: 'tagname'
      dropOnEmpty: false,
      tree:        false,
      treeTag:     'ul',
      overlap:     'vertical', // one of 'vertical', 'horizontal'
      constraint:  'vertical', // one of 'vertical', 'horizontal', false
      containment: element,    // also takes array of elements (or id's); or false
      handle:      false,      // or a CSS class
      only:        false,
      delay:       0,
      hoverclass:  null,
      ghosting:    false,
      quiet:       false,
      scroll:      false,
      scrollSensitivity: 20,
      scrollSpeed: 15,
      format:      this.SERIALIZE_RULE,

      // these take arrays of elements or ids and can be
      // used for better initialization performance
      elements:    false,
      handles:     false,

      onChange:    Prototype.emptyFunction,
      onUpdate:    Prototype.emptyFunction
    }, arguments[1] || { });

    // clear any old sortable with same element
    this.destroy(element);

    // build options for the draggables
    var options_for_draggable = {
      revert:      true,
      quiet:       options.quiet,
      scroll:      options.scroll,
      scrollSpeed: options.scrollSpeed,
      scrollSensitivity: options.scrollSensitivity,
      delay:       options.delay,
      ghosting:    options.ghosting,
      constraint:  options.constraint,
      handle:      options.handle };

    if(options.starteffect)
      options_for_draggable.starteffect = options.starteffect;

    if(options.reverteffect)
      options_for_draggable.reverteffect = options.reverteffect;
    else
      if(options.ghosting) options_for_draggable.reverteffect = function(element) {
        element.style.top  = 0;
        element.style.left = 0;
      };

    if(options.endeffect)
      options_for_draggable.endeffect = options.endeffect;

    if(options.zindex)
      options_for_draggable.zindex = options.zindex;

    // build options for the droppables
    var options_for_droppable = {
      overlap:     options.overlap,
      containment: options.containment,
      tree:        options.tree,
      hoverclass:  options.hoverclass,
      onHover:     Sortable.onHover
    };

    var options_for_tree = {
      onHover:      Sortable.onEmptyHover,
      overlap:      options.overlap,
      containment:  options.containment,
      hoverclass:   options.hoverclass
    };

    // fix for gecko engine
    Element.cleanWhitespace(element);

    options.draggables = [];
    options.droppables = [];

    // drop on empty handling
    if(options.dropOnEmpty || options.tree) {
      Droppables.add(element, options_for_tree);
      options.droppables.push(element);
    }

    (options.elements || this.findElements(element, options) || []).each( function(e,i) {
      var handle = options.handles ? $(options.handles[i]) :
        (options.handle ? $(e).select('.' + options.handle)[0] : e);
      options.draggables.push(
        new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
      Droppables.add(e, options_for_droppable);
      if(options.tree) e.treeNode = element;
      options.droppables.push(e);
    });

    if(options.tree) {
      (Sortable.findTreeElements(element, options) || []).each( function(e) {
        Droppables.add(e, options_for_tree);
        e.treeNode = element;
        options.droppables.push(e);
      });
    }

    // keep reference
    this.sortables[element.id] = options;

    // for onupdate
    Draggables.addObserver(new SortableObserver(element, options.onUpdate));

  },

  // return all suitable-for-sortable elements in a guaranteed order
  findElements: function(element, options) {
    return Element.findChildren(
      element, options.only, options.tree ? true : false, options.tag);
  },

  findTreeElements: function(element, options) {
    return Element.findChildren(
      element, options.only, options.tree ? true : false, options.treeTag);
  },

  onHover: function(element, dropon, overlap) {
    if(Element.isParent(dropon, element)) return;

    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
      return;
    } else if(overlap>0.5) {
      Sortable.mark(dropon, 'before');
      if(dropon.previousSibling != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, dropon);
        if(dropon.parentNode!=oldParentNode)
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    } else {
      Sortable.mark(dropon, 'after');
      var nextElement = dropon.nextSibling || null;
      if(nextElement != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, nextElement);
        if(dropon.parentNode!=oldParentNode)
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    }
  },

  onEmptyHover: function(element, dropon, overlap) {
    var oldParentNode = element.parentNode;
    var droponOptions = Sortable.options(dropon);

    if(!Element.isParent(dropon, element)) {
      var index;

      var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
      var child = null;

      if(children) {
        var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);

        for (index = 0; index < children.length; index += 1) {
          if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
            offset -= Element.offsetSize (children[index], droponOptions.overlap);
          } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
            child = index + 1 < children.length ? children[index + 1] : null;
            break;
          } else {
            child = children[index];
            break;
          }
        }
      }

      dropon.insertBefore(element, child);

      Sortable.options(oldParentNode).onChange(element);
      droponOptions.onChange(element);
    }
  },

  unmark: function() {
    if(Sortable._marker) Sortable._marker.hide();
  },

  mark: function(dropon, position) {
    // mark on ghosting only
    var sortable = Sortable.options(dropon.parentNode);
    if(sortable && !sortable.ghosting) return;

    if(!Sortable._marker) {
      Sortable._marker =
        ($('dropmarker') || Element.extend(document.createElement('DIV'))).
          hide().addClassName('dropmarker').setStyle({position:'absolute'});
      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
    }
    var offsets = Position.cumulativeOffset(dropon);
    Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});

    if(position=='after')
      if(sortable.overlap == 'horizontal')
        Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
      else
        Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});

    Sortable._marker.show();
  },

  _tree: function(element, options, parent) {
    var children = Sortable.findElements(element, options) || [];

    for (var i = 0; i < children.length; ++i) {
      var match = children[i].id.match(options.format);

      if (!match) continue;

      var child = {
        id: encodeURIComponent(match ? match[1] : null),
        element: element,
        parent: parent,
        children: [],
        position: parent.children.length,
        container: $(children[i]).down(options.treeTag)
      };

      /* Get the element containing the children and recurse over it */
      if (child.container)
        this._tree(child.container, options, child);

      parent.children.push (child);
    }

    return parent;
  },

  tree: function(element) {
    element = $(element);
    var sortableOptions = this.options(element);
    var options = Object.extend({
      tag: sortableOptions.tag,
      treeTag: sortableOptions.treeTag,
      only: sortableOptions.only,
      name: element.id,
      format: sortableOptions.format
    }, arguments[1] || { });

    var root = {
      id: null,
      parent: null,
      children: [],
      container: element,
      position: 0
    };

    return Sortable._tree(element, options, root);
  },

  /* Construct a [i] index for a particular node */
  _constructIndex: function(node) {
    var index = '';
    do {
      if (node.id) index = '[' + node.position + ']' + index;
    } while ((node = node.parent) != null);
    return index;
  },

  sequence: function(element) {
    element = $(element);
    var options = Object.extend(this.options(element), arguments[1] || { });

    return $(this.findElements(element, options) || []).map( function(item) {
      return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
    });
  },

  setSequence: function(element, new_sequence) {
    element = $(element);
    var options = Object.extend(this.options(element), arguments[2] || { });

    var nodeMap = { };
    this.findElements(element, options).each( function(n) {
        if (n.id.match(options.format))
            nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
        n.parentNode.removeChild(n);
    });

    new_sequence.each(function(ident) {
      var n = nodeMap[ident];
      if (n) {
        n[1].appendChild(n[0]);
        delete nodeMap[ident];
      }
    });
  },

  serialize: function(element) {
    element = $(element);
    var options = Object.extend(Sortable.options(element), arguments[1] || { });
    var name = encodeURIComponent(
      (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);

    if (options.tree) {
      return Sortable.tree(element, arguments[1]).children.map( function (item) {
        return [name + Sortable._constructIndex(item) + "[id]=" +
                encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
      }).flatten().join('&');
    } else {
      return Sortable.sequence(element, arguments[1]).map( function(item) {
        return name + "[]=" + encodeURIComponent(item);
      }).join('&');
    }
  }
};

// Returns true if child is contained within element
Element.isParent = function(child, element) {
  if (!child.parentNode || child == element) return false;
  if (child.parentNode == element) return true;
  return Element.isParent(child.parentNode, element);
};

Element.findChildren = function(element, only, recursive, tagName) {
  if(!element.hasChildNodes()) return null;
  tagName = tagName.toUpperCase();
  if(only) only = [only].flatten();
  var elements = [];
  $A(element.childNodes).each( function(e) {
    if(e.tagName && e.tagName.toUpperCase()==tagName &&
      (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
        elements.push(e);
    if(recursive) {
      var grandchildren = Element.findChildren(e, only, recursive, tagName);
      if(grandchildren) elements.push(grandchildren);
    }
  });

  return (elements.length>0 ? elements.flatten() : []);
};

Element.offsetSize = function (element, type) {
  return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
};
// script.aculo.us controls.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//           (c) 2005-2008 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
//           (c) 2005-2008 Jon Tirsen (http://www.tirsen.com)
// Contributors:
//  Richard Livsey
//  Rahul Bhargava
//  Rob Wills
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

// Autocompleter.Base handles all the autocompletion functionality
// that's independent of the data source for autocompletion. This
// includes drawing the autocompletion menu, observing keyboard
// and mouse events, and similar.
//
// Specific autocompleters need to provide, at the very least,
// a getUpdatedChoices function that will be invoked every time
// the text inside the monitored textbox changes. This method
// should get the text for which to provide autocompletion by
// invoking this.getToken(), NOT by directly accessing
// this.element.value. This is to allow incremental tokenized
// autocompletion. Specific auto-completion logic (AJAX, etc)
// belongs in getUpdatedChoices.
//
// Tokenized incremental autocompletion is enabled automatically
// when an autocompleter is instantiated with the 'tokens' option
// in the options parameter, e.g.:
// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
// will incrementally autocomplete with a comma as the token.
// Additionally, ',' in the above example can be replaced with
// a token array, e.g. { tokens: [',', '\n'] } which
// enables autocompletion on multiple tokens. This is most
// useful when one of the tokens is \n (a newline), as it
// allows smart autocompletion after linebreaks.

if(typeof Effect == 'undefined')
  throw("controls.js requires including script.aculo.us' effects.js library");

var Autocompleter = { };
Autocompleter.Base = Class.create({
  baseInitialize: function(element, update, options) {
    element          = $(element);
    this.element     = element;
    this.update      = $(update);
    this.hasFocus    = false;
    this.changed     = false;
    this.active      = false;
    this.index       = 0;
    this.entryCount  = 0;
    this.oldElementValue = this.element.value;

    if(this.setOptions)
      this.setOptions(options);
    else
      this.options = options || { };

    this.options.paramName    = this.options.paramName || this.element.name;
    this.options.tokens       = this.options.tokens || [];
    this.options.frequency    = this.options.frequency || 0.4;
    this.options.minChars     = this.options.minChars || 1;
    this.options.onShow       = this.options.onShow ||
      function(element, update){
        if(!update.style.position || update.style.position=='absolute') {
          update.style.position = 'absolute';
          Position.clone(element, update, {
            setHeight: false,
            offsetTop: element.offsetHeight
          });
        }
        Effect.Appear(update,{duration:0.15});
      };
    this.options.onHide = this.options.onHide ||
      function(element, update){ new Effect.Fade(update,{duration:0.15}) };

    if(typeof(this.options.tokens) == 'string')
      this.options.tokens = new Array(this.options.tokens);
    // Force carriage returns as token delimiters anyway
    if (!this.options.tokens.include('\n'))
      this.options.tokens.push('\n');

    this.observer = null;

    this.element.setAttribute('autocomplete','off');

    Element.hide(this.update);

    Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
    Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this));
  },

  show: function() {
    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
    if(!this.iefix &&
      (Prototype.Browser.IE) &&
      (Element.getStyle(this.update, 'position')=='absolute')) {
      new Insertion.After(this.update,
       '<iframe id="' + this.update.id + '_iefix" '+
       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
      this.iefix = $(this.update.id+'_iefix');
    }
    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
  },

  fixIEOverlapping: function() {
    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
    this.iefix.style.zIndex = 1;
    this.update.style.zIndex = 2;
    Element.show(this.iefix);
  },

  hide: function() {
    this.stopIndicator();
    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
    if(this.iefix) Element.hide(this.iefix);
  },

  startIndicator: function() {
    if(this.options.indicator) Element.show(this.options.indicator);
  },

  stopIndicator: function() {
    if(this.options.indicator) Element.hide(this.options.indicator);
  },

  onKeyPress: function(event) {
    if(this.active)
      switch(event.keyCode) {
       case Event.KEY_TAB:
       case Event.KEY_RETURN:
         this.selectEntry();
         Event.stop(event);
       case Event.KEY_ESC:
         this.hide();
         this.active = false;
         Event.stop(event);
         return;
       case Event.KEY_LEFT:
       case Event.KEY_RIGHT:
         return;
       case Event.KEY_UP:
         this.markPrevious();
         this.render();
         Event.stop(event);
         return;
       case Event.KEY_DOWN:
         this.markNext();
         this.render();
         Event.stop(event);
         return;
      }
     else
       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
         (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;

    this.changed = true;
    this.hasFocus = true;

    if(this.observer) clearTimeout(this.observer);
      this.observer =
        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
  },

  activate: function() {
    this.changed = false;
    this.hasFocus = true;
    this.getUpdatedChoices();
  },

  onHover: function(event) {
    var element = Event.findElement(event, 'LI');
    if(this.index != element.autocompleteIndex)
    {
        this.index = element.autocompleteIndex;
        this.render();
    }
    Event.stop(event);
  },

  onClick: function(event) {
    var element = Event.findElement(event, 'LI');
    this.index = element.autocompleteIndex;
    this.selectEntry();
    this.hide();
  },

  onBlur: function(event) {
    // needed to make click events working
    setTimeout(this.hide.bind(this), 250);
    this.hasFocus = false;
    this.active = false;
  },

  render: function() {
    if(this.entryCount > 0) {
      for (var i = 0; i < this.entryCount; i++)
        this.index==i ?
          Element.addClassName(this.getEntry(i),"selected") :
          Element.removeClassName(this.getEntry(i),"selected");
      if(this.hasFocus) {
        this.show();
        this.active = true;
      }
    } else {
      this.active = false;
      this.hide();
    }
  },

  markPrevious: function() {
    if(this.index > 0) this.index--;
      else this.index = this.entryCount-1;
    //this.getEntry(this.index).scrollIntoView(true); useless
  },

  markNext: function() {
    if(this.index < this.entryCount-1) this.index++;
      else this.index = 0;
    this.getEntry(this.index).scrollIntoView(false);
  },

  getEntry: function(index) {
    return this.update.firstChild.childNodes[index];
  },

  getCurrentEntry: function() {
    return this.getEntry(this.index);
  },

  selectEntry: function() {
    this.active = false;
    this.updateElement(this.getCurrentEntry());
  },

  updateElement: function(selectedElement) {
    if (this.options.updateElement) {
      this.options.updateElement(selectedElement);
      return;
    }
    var value = '';
    if (this.options.select) {
      var nodes = $(selectedElement).select('.' + this.options.select) || [];
      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
    } else
      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');

    var bounds = this.getTokenBounds();
    if (bounds[0] != -1) {
      var newValue = this.element.value.substr(0, bounds[0]);
      var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);
      if (whitespace)
        newValue += whitespace[0];
      this.element.value = newValue + value + this.element.value.substr(bounds[1]);
    } else {
      this.element.value = value;
    }
    this.oldElementValue = this.element.value;
    this.element.focus();

    if (this.options.afterUpdateElement)
      this.options.afterUpdateElement(this.element, selectedElement);
  },

  updateChoices: function(choices) {
    if(!this.changed && this.hasFocus) {
      this.update.innerHTML = choices;
      Element.cleanWhitespace(this.update);
      Element.cleanWhitespace(this.update.down());

      if(this.update.firstChild && this.update.down().childNodes) {
        this.entryCount =
          this.update.down().childNodes.length;
        for (var i = 0; i < this.entryCount; i++) {
          var entry = this.getEntry(i);
          entry.autocompleteIndex = i;
          this.addObservers(entry);
        }
      } else {
        this.entryCount = 0;
      }

      this.stopIndicator();
      this.index = 0;

      if(this.entryCount==1 && this.options.autoSelect) {
        this.selectEntry();
        this.hide();
      } else {
        this.render();
      }
    }
  },

  addObservers: function(element) {
    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
  },

  onObserverEvent: function() {
    this.changed = false;
    this.tokenBounds = null;
    if(this.getToken().length>=this.options.minChars) {
      this.getUpdatedChoices();
    } else {
      this.active = false;
      this.hide();
    }
    this.oldElementValue = this.element.value;
  },

  getToken: function() {
    var bounds = this.getTokenBounds();
    return this.element.value.substring(bounds[0], bounds[1]).strip();
  },

  getTokenBounds: function() {
    if (null != this.tokenBounds) return this.tokenBounds;
    var value = this.element.value;
    if (value.strip().empty()) return [-1, 0];
    var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);
    var offset = (diff == this.oldElementValue.length ? 1 : 0);
    var prevTokenPos = -1, nextTokenPos = value.length;
    var tp;
    for (var index = 0, l = this.options.tokens.length; index < l; ++index) {
      tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);
      if (tp > prevTokenPos) prevTokenPos = tp;
      tp = value.indexOf(this.options.tokens[index], diff + offset);
      if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;
    }
    return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);
  }
});

Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {
  var boundary = Math.min(newS.length, oldS.length);
  for (var index = 0; index < boundary; ++index)
    if (newS[index] != oldS[index])
      return index;
  return boundary;
};

Ajax.Autocompleter = Class.create(Autocompleter.Base, {
  initialize: function(element, update, url, options) {
    this.baseInitialize(element, update, options);
    this.options.asynchronous  = true;
    this.options.onComplete    = this.onComplete.bind(this);
    this.options.defaultParams = this.options.parameters || null;
    this.url                   = url;
  },

  getUpdatedChoices: function() {
    this.startIndicator();

    var entry = encodeURIComponent(this.options.paramName) + '=' +
      encodeURIComponent(this.getToken());

    this.options.parameters = this.options.callback ?
      this.options.callback(this.element, entry) : entry;

    if(this.options.defaultParams)
      this.options.parameters += '&' + this.options.defaultParams;

    new Ajax.Request(this.url, this.options);
  },

  onComplete: function(request) {
    this.updateChoices(request.responseText);
  }
});

// The local array autocompleter. Used when you'd prefer to
// inject an array of autocompletion options into the page, rather
// than sending out Ajax queries, which can be quite slow sometimes.
//
// The constructor takes four parameters. The first two are, as usual,
// the id of the monitored textbox, and id of the autocompletion menu.
// The third is the array you want to autocomplete from, and the fourth
// is the options block.
//
// Extra local autocompletion options:
// - choices - How many autocompletion choices to offer
//
// - partialSearch - If false, the autocompleter will match entered
//                    text only at the beginning of strings in the
//                    autocomplete array. Defaults to true, which will
//                    match text at the beginning of any *word* in the
//                    strings in the autocomplete array. If you want to
//                    search anywhere in the string, additionally set
//                    the option fullSearch to true (default: off).
//
// - fullSsearch - Search anywhere in autocomplete array strings.
//
// - partialChars - How many characters to enter before triggering
//                   a partial match (unlike minChars, which defines
//                   how many characters are required to do any match
//                   at all). Defaults to 2.
//
// - ignoreCase - Whether to ignore case when autocompleting.
//                 Defaults to true.
//
// It's possible to pass in a custom function as the 'selector'
// option, if you prefer to write your own autocompletion logic.
// In that case, the other options above will not apply unless
// you support them.

Autocompleter.Local = Class.create(Autocompleter.Base, {
  initialize: function(element, update, array, options) {
    this.baseInitialize(element, update, options);
    this.options.array = array;
  },

  getUpdatedChoices: function() {
    this.updateChoices(this.options.selector(this));
  },

  setOptions: function(options) {
    this.options = Object.extend({
      choices: 10,
      partialSearch: true,
      partialChars: 2,
      ignoreCase: true,
      fullSearch: false,
      selector: function(instance) {
        var ret       = []; // Beginning matches
        var partial   = []; // Inside matches
        var entry     = instance.getToken();
        var count     = 0;

        for (var i = 0; i < instance.options.array.length &&
          ret.length < instance.options.choices ; i++) {

          var elem = instance.options.array[i];
          var foundPos = instance.options.ignoreCase ?
            elem.toLowerCase().indexOf(entry.toLowerCase()) :
            elem.indexOf(entry);

          while (foundPos != -1) {
            if (foundPos == 0 && elem.length != entry.length) {
              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
                elem.substr(entry.length) + "</li>");
              break;
            } else if (entry.length >= instance.options.partialChars &&
              instance.options.partialSearch && foundPos != -1) {
              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
                partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
                  elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
                  foundPos + entry.length) + "</li>");
                break;
              }
            }

            foundPos = instance.options.ignoreCase ?
              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
              elem.indexOf(entry, foundPos + 1);

          }
        }
        if (partial.length)
          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length));
        return "<ul>" + ret.join('') + "</ul>";
      }
    }, options || { });
  }
});

// AJAX in-place editor and collection editor
// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April 2007).

// Use this if you notice weird scrolling problems on some browsers,
// the DOM might be a bit confused when this gets called so do this
// waits 1 ms (with setTimeout) until it does the activation
Field.scrollFreeActivate = function(field) {
  setTimeout(function() {
    Field.activate(field);
  }, 1);
};

Ajax.InPlaceEditor = Class.create({
  initialize: function(element, url, options) {
    this.url = url;
    this.element = element = $(element);
    this.prepareOptions();
    this._controls = { };
    arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!!
    Object.extend(this.options, options || { });
    if (!this.options.formId && this.element.id) {
      this.options.formId = this.element.id + '-inplaceeditor';
      if ($(this.options.formId))
        this.options.formId = '';
    }
    if (this.options.externalControl)
      this.options.externalControl = $(this.options.externalControl);
    if (!this.options.externalControl)
      this.options.externalControlOnly = false;
    this._originalBackground = this.element.getStyle('background-color') || 'transparent';
    this.element.title = this.options.clickToEditText;
    this._boundCancelHandler = this.handleFormCancellation.bind(this);
    this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);
    this._boundFailureHandler = this.handleAJAXFailure.bind(this);
    this._boundSubmitHandler = this.handleFormSubmission.bind(this);
    this._boundWrapperHandler = this.wrapUp.bind(this);
    this.registerListeners();
  },
  checkForEscapeOrReturn: function(e) {
    if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;
    if (Event.KEY_ESC == e.keyCode)
      this.handleFormCancellation(e);
    else if (Event.KEY_RETURN == e.keyCode)
      this.handleFormSubmission(e);
  },
  createControl: function(mode, handler, extraClasses) {
    var control = this.options[mode + 'Control'];
    var text = this.options[mode + 'Text'];
    if ('button' == control) {
      var btn = document.createElement('input');
      btn.type = 'submit';
      btn.value = text;
      btn.className = 'editor_' + mode + '_button';
      if ('cancel' == mode)
        btn.onclick = this._boundCancelHandler;
      this._form.appendChild(btn);
      this._controls[mode] = btn;
    } else if ('link' == control) {
      var link = document.createElement('a');
      link.href = '#';
      link.appendChild(document.createTextNode(text));
      link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler;
      link.className = 'editor_' + mode + '_link';
      if (extraClasses)
        link.className += ' ' + extraClasses;
      this._form.appendChild(link);
      this._controls[mode] = link;
    }
  },
  createEditField: function() {
    var text = (this.options.loadTextURL ? this.options.loadingText : this.getText());
    var fld;
    if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {
      fld = document.createElement('input');
      fld.type = 'text';
      var size = this.options.size || this.options.cols || 0;
      if (0 < size) fld.size = size;
    } else {
      fld = document.createElement('textarea');
      fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);
      fld.cols = this.options.cols || 40;
    }
    fld.name = this.options.paramName;
    fld.value = text; // No HTML breaks conversion anymore
    fld.className = 'editor_field';
    if (this.options.submitOnBlur)
      fld.onblur = this._boundSubmitHandler;
    this._controls.editor = fld;
    if (this.options.loadTextURL)
      this.loadExternalText();
    this._form.appendChild(this._controls.editor);
  },
  createForm: function() {
    var ipe = this;
    function addText(mode, condition) {
      var text = ipe.options['text' + mode + 'Controls'];
      if (!text || condition === false) return;
      ipe._form.appendChild(document.createTextNode(text));
    };
    this._form = $(document.createElement('form'));
    this._form.id = this.options.formId;
    this._form.addClassName(this.options.formClassName);
    this._form.onsubmit = this._boundSubmitHandler;
    this.createEditField();
    if ('textarea' == this._controls.editor.tagName.toLowerCase())
      this._form.appendChild(document.createElement('br'));
    if (this.options.onFormCustomization)
      this.options.onFormCustomization(this, this._form);
    addText('Before', this.options.okControl || this.options.cancelControl);
    this.createControl('ok', this._boundSubmitHandler);
    addText('Between', this.options.okControl && this.options.cancelControl);
    this.createControl('cancel', this._boundCancelHandler, 'editor_cancel');
    addText('After', this.options.okControl || this.options.cancelControl);
  },
  destroy: function() {
    if (this._oldInnerHTML)
      this.element.innerHTML = this._oldInnerHTML;
    this.leaveEditMode();
    this.unregisterListeners();
  },
  enterEditMode: function(e) {
    if (this._saving || this._editing) return;
    this._editing = true;
    this.triggerCallback('onEnterEditMode');
    if (this.options.externalControl)
      this.options.externalControl.hide();
    this.element.hide();
    this.createForm();
    this.element.parentNode.insertBefore(this._form, this.element);
    if (!this.options.loadTextURL)
      this.postProcessEditField();
    if (e) Event.stop(e);
  },
  enterHover: function(e) {
    if (this.options.hoverClassName)
      this.element.addClassName(this.options.hoverClassName);
    if (this._saving) return;
    this.triggerCallback('onEnterHover');
  },
  getText: function() {
    return this.element.innerHTML.unescapeHTML();
  },
  handleAJAXFailure: function(transport) {
    this.triggerCallback('onFailure', transport);
    if (this._oldInnerHTML) {
      this.element.innerHTML = this._oldInnerHTML;
      this._oldInnerHTML = null;
    }
  },
  handleFormCancellation: function(e) {
    this.wrapUp();
    if (e) Event.stop(e);
  },
  handleFormSubmission: function(e) {
    var form = this._form;
    var value = $F(this._controls.editor);
    this.prepareSubmission();
    var params = this.options.callback(form, value) || '';
    if (Object.isString(params))
      params = params.toQueryParams();
    params.editorId = this.element.id;
    if (this.options.htmlResponse) {
      var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions);
      Object.extend(options, {
        parameters: params,
        onComplete: this._boundWrapperHandler,
        onFailure: this._boundFailureHandler
      });
      new Ajax.Updater({ success: this.element }, this.url, options);
    } else {
      var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
      Object.extend(options, {
        parameters: params,
        onComplete: this._boundWrapperHandler,
        onFailure: this._boundFailureHandler
      });
      new Ajax.Request(this.url, options);
    }
    if (e) Event.stop(e);
  },
  leaveEditMode: function() {
    this.element.removeClassName(this.options.savingClassName);
    this.removeForm();
    this.leaveHover();
    this.element.style.backgroundColor = this._originalBackground;
    this.element.show();
    if (this.options.externalControl)
      this.options.externalControl.show();
    this._saving = false;
    this._editing = false;
    this._oldInnerHTML = null;
    this.triggerCallback('onLeaveEditMode');
  },
  leaveHover: function(e) {
    if (this.options.hoverClassName)
      this.element.removeClassName(this.options.hoverClassName);
    if (this._saving) return;
    this.triggerCallback('onLeaveHover');
  },
  loadExternalText: function() {
    this._form.addClassName(this.options.loadingClassName);
    this._controls.editor.disabled = true;
    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
    Object.extend(options, {
      parameters: 'editorId=' + encodeURIComponent(this.element.id),
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        this._form.removeClassName(this.options.loadingClassName);
        var text = transport.responseText;
        if (this.options.stripLoadedTextTags)
          text = text.stripTags();
        this._controls.editor.value = text;
        this._controls.editor.disabled = false;
        this.postProcessEditField();
      }.bind(this),
      onFailure: this._boundFailureHandler
    });
    new Ajax.Request(this.options.loadTextURL, options);
  },
  postProcessEditField: function() {
    var fpc = this.options.fieldPostCreation;
    if (fpc)
      $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate']();
  },
  prepareOptions: function() {
    this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);
    Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);
    [this._extraDefaultOptions].flatten().compact().each(function(defs) {
      Object.extend(this.options, defs);
    }.bind(this));
  },
  prepareSubmission: function() {
    this._saving = true;
    this.removeForm();
    this.leaveHover();
    this.showSaving();
  },
  registerListeners: function() {
    this._listeners = { };
    var listener;
    $H(Ajax.InPlaceEditor.Listeners).each(function(pair) {
      listener = this[pair.value].bind(this);
      this._listeners[pair.key] = listener;
      if (!this.options.externalControlOnly)
        this.element.observe(pair.key, listener);
      if (this.options.externalControl)
        this.options.externalControl.observe(pair.key, listener);
    }.bind(this));
  },
  removeForm: function() {
    if (!this._form) return;
    this._form.remove();
    this._form = null;
    this._controls = { };
  },
  showSaving: function() {
    this._oldInnerHTML = this.element.innerHTML;
    this.element.innerHTML = this.options.savingText;
    this.element.addClassName(this.options.savingClassName);
    this.element.style.backgroundColor = this._originalBackground;
    this.element.show();
  },
  triggerCallback: function(cbName, arg) {
    if ('function' == typeof this.options[cbName]) {
      this.options[cbName](this, arg);
    }
  },
  unregisterListeners: function() {
    $H(this._listeners).each(function(pair) {
      if (!this.options.externalControlOnly)
        this.element.stopObserving(pair.key, pair.value);
      if (this.options.externalControl)
        this.options.externalControl.stopObserving(pair.key, pair.value);
    }.bind(this));
  },
  wrapUp: function(transport) {
    this.leaveEditMode();
    // Can't use triggerCallback due to backward compatibility: requires
    // binding + direct element
    this._boundComplete(transport, this.element);
  }
});

Object.extend(Ajax.InPlaceEditor.prototype, {
  dispose: Ajax.InPlaceEditor.prototype.destroy
});

Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {
  initialize: function($super, element, url, options) {
    this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;
    $super(element, url, options);
  },

  createEditField: function() {
    var list = document.createElement('select');
    list.name = this.options.paramName;
    list.size = 1;
    this._controls.editor = list;
    this._collection = this.options.collection || [];
    if (this.options.loadCollectionURL)
      this.loadCollection();
    else
      this.checkForExternalText();
    this._form.appendChild(this._controls.editor);
  },

  loadCollection: function() {
    this._form.addClassName(this.options.loadingClassName);
    this.showLoadingText(this.options.loadingCollectionText);
    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
    Object.extend(options, {
      parameters: 'editorId=' + encodeURIComponent(this.element.id),
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        var js = transport.responseText.strip();
        if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check
          throw('Server returned an invalid collection representation.');
        this._collection = eval(js);
        this.checkForExternalText();
      }.bind(this),
      onFailure: this.onFailure
    });
    new Ajax.Request(this.options.loadCollectionURL, options);
  },

  showLoadingText: function(text) {
    this._controls.editor.disabled = true;
    var tempOption = this._controls.editor.firstChild;
    if (!tempOption) {
      tempOption = document.createElement('option');
      tempOption.value = '';
      this._controls.editor.appendChild(tempOption);
      tempOption.selected = true;
    }
    tempOption.update((text || '').stripScripts().stripTags());
  },

  checkForExternalText: function() {
    this._text = this.getText();
    if (this.options.loadTextURL)
      this.loadExternalText();
    else
      this.buildOptionList();
  },

  loadExternalText: function() {
    this.showLoadingText(this.options.loadingText);
    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
    Object.extend(options, {
      parameters: 'editorId=' + encodeURIComponent(this.element.id),
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        this._text = transport.responseText.strip();
        this.buildOptionList();
      }.bind(this),
      onFailure: this.onFailure
    });
    new Ajax.Request(this.options.loadTextURL, options);
  },

  buildOptionList: function() {
    this._form.removeClassName(this.options.loadingClassName);
    this._collection = this._collection.map(function(entry) {
      return 2 === entry.length ? entry : [entry, entry].flatten();
    });
    var marker = ('value' in this.options) ? this.options.value : this._text;
    var textFound = this._collection.any(function(entry) {
      return entry[0] == marker;
    }.bind(this));
    this._controls.editor.update('');
    var option;
    this._collection.each(function(entry, index) {
      option = document.createElement('option');
      option.value = entry[0];
      option.selected = textFound ? entry[0] == marker : 0 == index;
      option.appendChild(document.createTextNode(entry[1]));
      this._controls.editor.appendChild(option);
    }.bind(this));
    this._controls.editor.disabled = false;
    Field.scrollFreeActivate(this._controls.editor);
  }
});

//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! ****
//**** This only  exists for a while,  in order to  let ****
//**** users adapt to  the new API.  Read up on the new ****
//**** API and convert your code to it ASAP!            ****

Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) {
  if (!options) return;
  function fallback(name, expr) {
    if (name in options || expr === undefined) return;
    options[name] = expr;
  };
  fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' :
    options.cancelLink == options.cancelButton == false ? false : undefined)));
  fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' :
    options.okLink == options.okButton == false ? false : undefined)));
  fallback('highlightColor', options.highlightcolor);
  fallback('highlightEndColor', options.highlightendcolor);
};

Object.extend(Ajax.InPlaceEditor, {
  DefaultOptions: {
    ajaxOptions: { },
    autoRows: 3,                                // Use when multi-line w/ rows == 1
    cancelControl: 'link',                      // 'link'|'button'|false
    cancelText: 'cancel',
    clickToEditText: 'Click to edit',
    externalControl: null,                      // id|elt
    externalControlOnly: false,
    fieldPostCreation: 'activate',              // 'activate'|'focus'|false
    formClassName: 'inplaceeditor-form',
    formId: null,                               // id|elt
    highlightColor: '#ffff99',
    highlightEndColor: '#ffffff',
    hoverClassName: '',
    htmlResponse: true,
    loadingClassName: 'inplaceeditor-loading',
    loadingText: 'Loading...',
    okControl: 'button',                        // 'link'|'button'|false
    okText: 'ok',
    paramName: 'value',
    rows: 1,                                    // If 1 and multi-line, uses autoRows
    savingClassName: 'inplaceeditor-saving',
    savingText: 'Saving...',
    size: 0,
    stripLoadedTextTags: false,
    submitOnBlur: false,
    textAfterControls: '',
    textBeforeControls: '',
    textBetweenControls: ''
  },
  DefaultCallbacks: {
    callback: function(form) {
      return Form.serialize(form);
    },
    onComplete: function(transport, element) {
      // For backward compatibility, this one is bound to the IPE, and passes
      // the element directly.  It was too often customized, so we don't break it.
      new Effect.Highlight(element, {
        startcolor: this.options.highlightColor, keepBackgroundImage: true });
    },
    onEnterEditMode: null,
    onEnterHover: function(ipe) {
      ipe.element.style.backgroundColor = ipe.options.highlightColor;
      if (ipe._effect)
        ipe._effect.cancel();
    },
    onFailure: function(transport, ipe) {
      alert('Error communication with the server: ' + transport.responseText.stripTags());
    },
    onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls.
    onLeaveEditMode: null,
    onLeaveHover: function(ipe) {
      ipe._effect = new Effect.Highlight(ipe.element, {
        startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor,
        restorecolor: ipe._originalBackground, keepBackgroundImage: true
      });
    }
  },
  Listeners: {
    click: 'enterEditMode',
    keydown: 'checkForEscapeOrReturn',
    mouseover: 'enterHover',
    mouseout: 'leaveHover'
  }
});

Ajax.InPlaceCollectionEditor.DefaultOptions = {
  loadingCollectionText: 'Loading options...'
};

// Delayed observer, like Form.Element.Observer,
// but waits for delay after last key input
// Ideal for live-search fields

Form.Element.DelayedObserver = Class.create({
  initialize: function(element, delay, callback) {
    this.delay     = delay || 0.5;
    this.element   = $(element);
    this.callback  = callback;
    this.timer     = null;
    this.lastValue = $F(this.element);
    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
  },
  delayedListener: function(event) {
    if(this.lastValue == $F(this.element)) return;
    if(this.timer) clearTimeout(this.timer);
    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
    this.lastValue = $F(this.element);
  },
  onTimerEvent: function() {
    this.timer = null;
    this.callback(this.element, $F(this.element));
  }
});
// script.aculo.us slider.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Marty Haught, Thomas Fuchs
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

if (!Control) var Control = { };

// options:
//  axis: 'vertical', or 'horizontal' (default)
//
// callbacks:
//  onChange(value)
//  onSlide(value)
Control.Slider = Class.create({
  initialize: function(handle, track, options) {
    var slider = this;

    if (Object.isArray(handle)) {
      this.handles = handle.collect( function(e) { return $(e) });
    } else {
      this.handles = [$(handle)];
    }

    this.track   = $(track);
    this.options = options || { };

    this.axis      = this.options.axis || 'horizontal';
    this.increment = this.options.increment || 1;
    this.step      = parseInt(this.options.step || '1');
    this.range     = this.options.range || $R(0,1);

    this.value     = 0; // assure backwards compat
    this.values    = this.handles.map( function() { return 0 });
    this.spans     = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
    this.options.startSpan = $(this.options.startSpan || null);
    this.options.endSpan   = $(this.options.endSpan || null);

    this.restricted = this.options.restricted || false;

    this.maximum   = this.options.maximum || this.range.end;
    this.minimum   = this.options.minimum || this.range.start;

    // Will be used to align the handle onto the track, if necessary
    this.alignX = parseInt(this.options.alignX || '0');
    this.alignY = parseInt(this.options.alignY || '0');

    this.trackLength = this.maximumOffset() - this.minimumOffset();

    this.handleLength = this.isVertical() ?
      (this.handles[0].offsetHeight != 0 ?
        this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
      (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
        this.handles[0].style.width.replace(/px$/,""));

    this.active   = false;
    this.dragging = false;
    this.disabled = false;

    if (this.options.disabled) this.setDisabled();

    // Allowed values array
    this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
    if (this.allowedValues) {
      this.minimum = this.allowedValues.min();
      this.maximum = this.allowedValues.max();
    }

    this.eventMouseDown = this.startDrag.bindAsEventListener(this);
    this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
    this.eventMouseMove = this.update.bindAsEventListener(this);

    // Initialize handles in reverse (make sure first handle is active)
    this.handles.each( function(h,i) {
      i = slider.handles.length-1-i;
      slider.setValue(parseFloat(
        (Object.isArray(slider.options.sliderValue) ?
          slider.options.sliderValue[i] : slider.options.sliderValue) ||
         slider.range.start), i);
      h.makePositioned().observe("mousedown", slider.eventMouseDown);
    });

    this.track.observe("mousedown", this.eventMouseDown);
    document.observe("mouseup", this.eventMouseUp);
    $(this.track.parentNode.parentNode).observe("mousemove", this.eventMouseMove);


    this.initialized = true;
  },
  dispose: function() {
    var slider = this;
    Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
    Event.stopObserving(document, "mouseup", this.eventMouseUp);
    Event.stopObserving(this.track.parentNode.parentNode, "mousemove", this.eventMouseMove);
    this.handles.each( function(h) {
      Event.stopObserving(h, "mousedown", slider.eventMouseDown);
    });
  },
  setDisabled: function(){
    this.disabled = true;
    this.track.parentNode.className = this.track.parentNode.className + ' disabled';
  },
  setEnabled: function(){
    this.disabled = false;
  },
  getNearestValue: function(value){
    if (this.allowedValues){
      if (value >= this.allowedValues.max()) return(this.allowedValues.max());
      if (value <= this.allowedValues.min()) return(this.allowedValues.min());

      var offset = Math.abs(this.allowedValues[0] - value);
      var newValue = this.allowedValues[0];
      this.allowedValues.each( function(v) {
        var currentOffset = Math.abs(v - value);
        if (currentOffset <= offset){
          newValue = v;
          offset = currentOffset;
        }
      });
      return newValue;
    }
    if (value > this.range.end) return this.range.end;
    if (value < this.range.start) return this.range.start;
    return value;
  },
  setValue: function(sliderValue, handleIdx){
    if (!this.active) {
      this.activeHandleIdx = handleIdx || 0;
      this.activeHandle    = this.handles[this.activeHandleIdx];
      this.updateStyles();
    }
    handleIdx = handleIdx || this.activeHandleIdx || 0;
    if (this.initialized && this.restricted) {
      if ((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
        sliderValue = this.values[handleIdx-1];
      if ((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
        sliderValue = this.values[handleIdx+1];
    }
    sliderValue = this.getNearestValue(sliderValue);
    this.values[handleIdx] = sliderValue;
    this.value = this.values[0]; // assure backwards compat

    this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
      this.translateToPx(sliderValue);

    this.drawSpans();
    if (!this.dragging || !this.event) this.updateFinished();
  },
  setValueBy: function(delta, handleIdx) {
    this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
      handleIdx || this.activeHandleIdx || 0);
  },
  translateToPx: function(value) {
    return Math.round(
      ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
      (value - this.range.start)) + "px";
  },
  translateToValue: function(offset) {
    return ((offset/(this.trackLength-this.handleLength) *
      (this.range.end-this.range.start)) + this.range.start);
  },
  getRange: function(range) {
    var v = this.values.sortBy(Prototype.K);
    range = range || 0;
    return $R(v[range],v[range+1]);
  },
  minimumOffset: function(){
    return(this.isVertical() ? this.alignY : this.alignX);
  },
  maximumOffset: function(){
    return(this.isVertical() ?
      (this.track.offsetHeight != 0 ? this.track.offsetHeight :
        this.track.style.height.replace(/px$/,"")) - this.alignY :
      (this.track.offsetWidth != 0 ? this.track.offsetWidth :
        this.track.style.width.replace(/px$/,"")) - this.alignX);
  },
  isVertical:  function(){
    return (this.axis == 'vertical');
  },
  drawSpans: function() {
    var slider = this;
    if (this.spans)
      $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
    if (this.options.startSpan)
      this.setSpan(this.options.startSpan,
        $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
    if (this.options.endSpan)
      this.setSpan(this.options.endSpan,
        $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
  },
  setSpan: function(span, range) {
    if (this.isVertical()) {
      span.style.top = this.translateToPx(range.start);
      span.style.height = this.translateToPx(range.end - range.start + this.range.start);
    } else {
      span.style.left = this.translateToPx(range.start);
      span.style.width = this.translateToPx(range.end - range.start + this.range.start);
    }
  },
  updateStyles: function() {
    this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
    Element.addClassName(this.activeHandle, 'selected');
  },
  startDrag: function(event) {
    if (Event.isLeftClick(event)) {
      if (!this.disabled){
        this.active = true;

        var handle = Event.element(event);
        var pointer  = [Event.pointerX(event), Event.pointerY(event)];
        var track = handle;
        if (track==this.track) {
          var offsets  = Position.cumulativeOffset(this.track);
          this.event = event;
          this.setValue(this.translateToValue(
           (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
          ));
          var offsets  = Position.cumulativeOffset(this.activeHandle);
          this.offsetX = (pointer[0] - offsets[0]);
          this.offsetY = (pointer[1] - offsets[1]);
        } else {
          // find the handle (prevents issues with Safari)
          while((this.handles.indexOf(handle) == -1) && handle.parentNode)
            handle = handle.parentNode;

          if (this.handles.indexOf(handle)!=-1) {
            this.activeHandle    = handle;
            this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
            this.updateStyles();

            var offsets  = Position.cumulativeOffset(this.activeHandle);
            this.offsetX = (pointer[0] - offsets[0]);
            this.offsetY = (pointer[1] - offsets[1]);
          }
        }
      }
      Event.stop(event);
    }
  },
  update: function(event) {
   if (this.active) {
      if (!this.dragging) this.dragging = true;
      this.draw(event);
      if (Prototype.Browser.WebKit) window.scrollBy(0,0);
      Event.stop(event);
   }
  },
  draw: function(event) {
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    var offsets = Position.cumulativeOffset(this.track);
    pointer[0] -= this.offsetX + offsets[0];
    pointer[1] -= this.offsetY + offsets[1];
    this.event = event;
    this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
    if (this.initialized && this.options.onSlide)
      this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
  },
  endDrag: function(event) {
    if (this.active && this.dragging) {
      this.finishDrag(event, true);
      Event.stop(event);
    }
    this.active = false;
    this.dragging = false;
  },
  finishDrag: function(event, success) {
    this.active = false;
    this.dragging = false;
    this.updateFinished();
  },
  updateFinished: function() {
    if (this.initialized && this.options.onChange)
      this.options.onChange(this.values.length>1 ? this.values : this.value, this);
    this.event = null;
  }
});
LightboxOptions=Object.extend({fileLoadingImage:'/media/loading.gif',fileBottomNavCloseImage:'/media/closelabel.gif',overlayOpacity:0.8,animate:true,resizeSpeed:7,borderSize:10,labelImage:"Image",labelOf:"of"},window.LightboxOptions||{});var Lightbox=Class.create();Lightbox.prototype={imageArray:[],activeImage:undefined,initialize:function(){this.updateImageList();this.keyboardAction=this.keyboardAction.bindAsEventListener(this);if(LightboxOptions.resizeSpeed>10)LightboxOptions.resizeSpeed=10;if(LightboxOptions.resizeSpeed<1)LightboxOptions.resizeSpeed=1;this.resizeDuration=LightboxOptions.animate?((11-LightboxOptions.resizeSpeed)*0.15):0;this.overlayDuration=LightboxOptions.animate?0.2:0;var size=(LightboxOptions.animate?250:1)+'px';var objBody=$$('body')[0];objBody.appendChild(Builder.node('div',{id:'overlay'}));objBody.appendChild(Builder.node('div',{id:'lightbox'},[Builder.node('div',{id:'outerImageContainer'},Builder.node('div',{id:'imageContainer'},[Builder.node('img',{id:'lightboxImage'}),Builder.node('div',{id:'hoverNav'},[Builder.node('a',{id:'prevLink',href:'#'}),Builder.node('a',{id:'nextLink',href:'#'})]),Builder.node('div',{id:'loading'},Builder.node('a',{id:'loadingLink',href:'#'},Builder.node('img',{src:LightboxOptions.fileLoadingImage})))])),Builder.node('div',{id:'imageDataContainer'},Builder.node('div',{id:'imageData'},[Builder.node('div',{id:'imageDetails'},[Builder.node('span',{id:'caption'}),Builder.node('span',{id:'numberDisplay'})]),Builder.node('div',{id:'bottomNav'},Builder.node('a',{id:'bottomNavClose',href:'#'},Builder.node('img',{src:LightboxOptions.fileBottomNavCloseImage})))]))]));$('overlay').hide().observe('click',(function(){this.end();}).bind(this));$('lightbox').hide().observe('click',(function(event){if(event.element().id=='lightbox')this.end();}).bind(this));$('outerImageContainer').setStyle({width:size,height:size});$('prevLink').observe('click',(function(event){event.stop();this.changeImage(this.activeImage-1);}).bindAsEventListener(this));$('nextLink').observe('click',(function(event){event.stop();this.changeImage(this.activeImage+1);}).bindAsEventListener(this));$('loadingLink').observe('click',(function(event){event.stop();this.end();}).bind(this));$('bottomNavClose').observe('click',(function(event){event.stop();this.end();}).bind(this));var th=this;(function(){var ids='overlay lightbox outerImageContainer imageContainer lightboxImage hoverNav prevLink nextLink loading loadingLink '+'imageDataContainer imageData imageDetails caption numberDisplay bottomNav bottomNavClose';$w(ids).each(function(id){th[id]=$(id);});}).defer();},updateImageList:function(){this.updateImageList=Prototype.emptyFunction;document.observe('click',(function(event){var target=event.findElement('a[rel^=lightbox]')||event.findElement('area[rel^=lightbox]');if(target){event.stop();this.start(target);}}).bind(this));},start:function(imageLink){$$('select','object','embed').each(function(node){node.style.visibility='hidden'});var arrayPageSize=this.getPageSize();$('overlay').setStyle({width:arrayPageSize[0]+'px',height:arrayPageSize[1]+'px'});new Effect.Appear(this.overlay,{duration:this.overlayDuration,from:0.0,to:LightboxOptions.overlayOpacity});this.imageArray=[];var imageNum=0;if((imageLink.rel=='lightbox')){this.imageArray.push([imageLink.href,imageLink.title]);}else{this.imageArray=$$(imageLink.tagName+'[href][rel="'+imageLink.rel+'"]').collect(function(anchor){return[anchor.href,anchor.title];}).uniq();while(this.imageArray[imageNum][0]!=imageLink.href){imageNum++;}}
var arrayPageScroll=document.viewport.getScrollOffsets();var lightboxTop=arrayPageScroll[1]+(document.viewport.getHeight()/10);var lightboxLeft=arrayPageScroll[0];this.lightbox.setStyle({top:lightboxTop+'px',left:lightboxLeft+'px'}).show();this.changeImage(imageNum);},changeImage:function(imageNum){this.activeImage=imageNum;if(LightboxOptions.animate)this.loading.show();this.lightboxImage.hide();this.hoverNav.hide();this.prevLink.hide();this.nextLink.hide();this.imageDataContainer.setStyle({opacity:.0001});this.numberDisplay.hide();var imgPreloader=new Image();imgPreloader.onload=(function(){this.lightboxImage.src=this.imageArray[this.activeImage][0];this.resizeImageContainer(imgPreloader.width,imgPreloader.height);}).bind(this);imgPreloader.src=this.imageArray[this.activeImage][0];},resizeImageContainer:function(imgWidth,imgHeight){var widthCurrent=this.outerImageContainer.getWidth();var heightCurrent=this.outerImageContainer.getHeight();var widthNew=(imgWidth+LightboxOptions.borderSize*2);var heightNew=(imgHeight+LightboxOptions.borderSize*2);var xScale=(widthNew/widthCurrent)*100;var yScale=(heightNew/heightCurrent)*100;var wDiff=widthCurrent-widthNew;var hDiff=heightCurrent-heightNew;if(hDiff!=0)new Effect.Scale(this.outerImageContainer,yScale,{scaleX:false,duration:this.resizeDuration,queue:'front'});if(wDiff!=0)new Effect.Scale(this.outerImageContainer,xScale,{scaleY:false,duration:this.resizeDuration,delay:this.resizeDuration});var timeout=0;if((hDiff==0)&&(wDiff==0)){timeout=100;if(Prototype.Browser.IE)timeout=250;}
(function(){this.prevLink.setStyle({height:imgHeight+'px'});this.nextLink.setStyle({height:imgHeight+'px'});this.imageDataContainer.setStyle({width:widthNew+'px'});this.showImage();}).bind(this).delay(timeout/1000);},showImage:function(){this.loading.hide();new Effect.Appear(this.lightboxImage,{duration:this.resizeDuration,queue:'end',afterFinish:(function(){this.updateDetails();}).bind(this)});this.preloadNeighborImages();},updateDetails:function(){if(this.imageArray[this.activeImage][1]!=""){this.caption.update(this.imageArray[this.activeImage][1]).show();}
if(this.imageArray.length>1){this.numberDisplay.update(LightboxOptions.labelImage+' '+(this.activeImage+1)+' '+LightboxOptions.labelOf+'  '+this.imageArray.length).show();}
new Effect.Parallel([new Effect.SlideDown(this.imageDataContainer,{sync:true,duration:this.resizeDuration,from:0.0,to:1.0}),new Effect.Appear(this.imageDataContainer,{sync:true,duration:this.resizeDuration})],{duration:this.resizeDuration,afterFinish:(function(){var arrayPageSize=this.getPageSize();this.overlay.setStyle({height:arrayPageSize[1]+'px'});this.updateNav();}).bind(this)});},updateNav:function(){this.hoverNav.show();if(this.activeImage>0)this.prevLink.show();if(this.activeImage<(this.imageArray.length-1))this.nextLink.show();this.enableKeyboardNav();},enableKeyboardNav:function(){document.observe('keydown',this.keyboardAction);},disableKeyboardNav:function(){document.stopObserving('keydown',this.keyboardAction);},keyboardAction:function(event){var keycode=event.keyCode;var escapeKey;if(event.DOM_VK_ESCAPE){escapeKey=event.DOM_VK_ESCAPE;}else{escapeKey=27;}
var key=String.fromCharCode(keycode).toLowerCase();if(key.match(/x|o|c/)||(keycode==escapeKey)){this.end();}else if((key=='p')||(keycode==37)){if(this.activeImage!=0){this.disableKeyboardNav();this.changeImage(this.activeImage-1);}}else if((key=='n')||(keycode==39)){if(this.activeImage!=(this.imageArray.length-1)){this.disableKeyboardNav();this.changeImage(this.activeImage+1);}}},preloadNeighborImages:function(){var preloadNextImage,preloadPrevImage;if(this.imageArray.length>this.activeImage+1){preloadNextImage=new Image();preloadNextImage.src=this.imageArray[this.activeImage+1][0];}
if(this.activeImage>0){preloadPrevImage=new Image();preloadPrevImage.src=this.imageArray[this.activeImage-1][0];}},end:function(){this.disableKeyboardNav();this.lightbox.hide();new Effect.Fade(this.overlay,{duration:this.overlayDuration});$$('select','object','embed').each(function(node){node.style.visibility='visible'});},getPageSize:function(){var xScroll,yScroll;if(window.innerHeight&&window.scrollMaxY){xScroll=window.innerWidth+window.scrollMaxX;yScroll=window.innerHeight+window.scrollMaxY;}else if(document.body.scrollHeight>document.body.offsetHeight){xScroll=document.body.scrollWidth;yScroll=document.body.scrollHeight;}else{xScroll=document.body.offsetWidth;yScroll=document.body.offsetHeight;}
var windowWidth,windowHeight;if(self.innerHeight){if(document.documentElement.clientWidth){windowWidth=document.documentElement.clientWidth;}else{windowWidth=self.innerWidth;}
windowHeight=self.innerHeight;}else if(document.documentElement&&document.documentElement.clientHeight){windowWidth=document.documentElement.clientWidth;windowHeight=document.documentElement.clientHeight;}else if(document.body){windowWidth=document.body.clientWidth;windowHeight=document.body.clientHeight;}
if(yScroll<windowHeight){pageHeight=windowHeight;}else{pageHeight=yScroll;}
if(xScroll<windowWidth){pageWidth=xScroll;}else{pageWidth=windowWidth;}
return[pageWidth,pageHeight];}}
document.observe('dom:loaded',function(){new Lightbox();});

function popWin(url,win,para){var win=window.open(url,win,para);win.focus();}
function setLocation(url){window.location.href=url;}
function setPLocation(url,setFocus){if(setFocus){window.opener.focus();}
window.opener.location.href=url;}
function setLanguageCode(code,fromCode){var href=window.location.href;var after='',dash;if(dash=href.match(/\#(.*)$/)){href=href.replace(/\#(.*)$/,'');after=dash[0];}
if(href.match(/[?]/)){var re=/([?&]store=)[a-z0-9_]*/;if(href.match(re)){href=href.replace(re,'$1'+code);}else{href+='&store='+code;}
var re=/([?&]from_store=)[a-z0-9_]*/;if(href.match(re)){href=href.replace(re,'');}}else{href+='?store='+code;}
if(typeof(fromCode)!='undefined'){href+='&from_store='+fromCode;}
href+=after;setLocation(href);}
function decorateGeneric(elements,decorateParams)
{var allSupportedParams=['odd','even','first','last'];var _decorateParams={};var total=elements.length;if(total){if(typeof(decorateParams)=='undefined'){decorateParams=allSupportedParams;}
if(!decorateParams.length){return;}
for(var k in allSupportedParams){_decorateParams[allSupportedParams[k]]=false;}
for(var k in decorateParams){_decorateParams[decorateParams[k]]=true;}
if(_decorateParams.first){Element.addClassName(elements[0],'first');}
if(_decorateParams.last){Element.addClassName(elements[total-1],'last');}
for(var i=0;i<total;i++){if((i+1)%2==0){if(_decorateParams.even){Element.addClassName(elements[i],'even');}}
else{if(_decorateParams.odd){Element.addClassName(elements[i],'odd');}}}}}
function decorateTable(table,options){var table=$(table);if(table){var _options={'tbody':false,'tbody tr':['odd','even','first','last'],'thead tr':['first','last'],'tfoot tr':['first','last'],'tr td':['last']};if(typeof(options)!='undefined'){for(var k in options){_options[k]=options[k];}}
if(_options['tbody']){decorateGeneric(table.select('tbody'),_options['tbody']);}
if(_options['tbody tr']){decorateGeneric(table.select('tbody tr'),_options['tbody tr']);}
if(_options['thead tr']){decorateGeneric(table.select('thead tr'),_options['thead tr']);}
if(_options['tfoot tr']){decorateGeneric(table.select('tfoot tr'),_options['tfoot tr']);}
if(_options['tr td']){var allRows=table.select('tr');if(allRows.length){for(var i=0;i<allRows.length;i++){decorateGeneric(allRows[i].getElementsByTagName('TD'),_options['tr td']);}}}}}
function decorateList(list,nonRecursive){if($(list)){if(typeof(nonRecursive)=='undefined'){var items=$(list).select('li')}
else{var items=$(list).childElements();}
decorateGeneric(items,['odd','even','last']);}}
function decorateDataList(list){list=$(list);if(list){decorateGeneric(list.select('dt'),['odd','even','last']);decorateGeneric(list.select('dd'),['odd','even','last']);}}
function parseSidUrl(baseUrl,urlExt){sidPos=baseUrl.indexOf('/?SID=');sid='';urlExt=(urlExt!=undefined)?urlExt:'';if(sidPos>-1){sid='?'+baseUrl.substring(sidPos+2);baseUrl=baseUrl.substring(0,sidPos+1);}
return baseUrl+urlExt+sid;}
function formatCurrency(price,format,showPlus){precision=isNaN(format.precision=Math.abs(format.precision))?2:format.precision;requiredPrecision=isNaN(format.requiredPrecision=Math.abs(format.requiredPrecision))?2:format.requiredPrecision;precision=requiredPrecision;integerRequired=isNaN(format.integerRequired=Math.abs(format.integerRequired))?1:format.integerRequired;decimalSymbol=format.decimalSymbol==undefined?",":format.decimalSymbol;groupSymbol=format.groupSymbol==undefined?".":format.groupSymbol;groupLength=format.groupLength==undefined?3:format.groupLength;if(showPlus==undefined||showPlus==true){s=price<0?"-":(showPlus?"+":"");}else if(showPlus==false){s='';}
i=parseInt(price=Math.abs(+price||0).toFixed(precision))+"";pad=(i.length<integerRequired)?(integerRequired-i.length):0;while(pad){i='0'+i;pad--;}
j=(j=i.length)>groupLength?j%groupLength:0;re=new RegExp("(\\d{"+groupLength+"})(?=\\d)","g");r=(j?i.substr(0,j)+groupSymbol:"")+i.substr(j).replace(re,"$1"+groupSymbol)+(precision?decimalSymbol+Math.abs(price-i).toFixed(precision).replace(/-/,0).slice(2):"")
if(format.pattern.indexOf('{sign}')==-1){pattern=s+format.pattern;}else{pattern=format.pattern.replace('{sign}',s);}
return pattern.replace('%s',r).replace(/^\s\s*/,'').replace(/\s\s*$/,'');};function expandDetails(el,childClass){if(Element.hasClassName(el,'show-details')){$$(childClass).each(function(item){item.hide()});Element.removeClassName(el,'show-details');}
else{$$(childClass).each(function(item){item.show()});Element.addClassName(el,'show-details');}}
var isIE=navigator.appVersion.match(/MSIE/)=="MSIE";if(!window.Varien)
var Varien=new Object();Varien.showLoading=function(){Element.show('loading-process');}
Varien.hideLoading=function(){Element.hide('loading-process');}
Varien.GlobalHandlers={onCreate:function(){Varien.showLoading();},onComplete:function(){if(Ajax.activeRequestCount==0){Varien.hideLoading();}}};Ajax.Responders.register(Varien.GlobalHandlers);Varien.searchForm=Class.create();Varien.searchForm.prototype={initialize:function(form,field,emptyText){this.form=$(form);this.field=$(field);this.emptyText=emptyText;Event.observe(this.form,'submit',this.submit.bind(this));Event.observe(this.field,'focus',this.focus.bind(this));Event.observe(this.field,'blur',this.blur.bind(this));this.blur();},submit:function(event){if(this.field.value==this.emptyText||this.field.value==''){Event.stop(event);return false;}
return true;},focus:function(event){if(this.field.value==this.emptyText){this.field.value='';}},blur:function(event){if(this.field.value==''){this.field.value=this.emptyText;}},initAutocomplete:function(url,destinationElement){new Ajax.Autocompleter(this.field,destinationElement,url,{paramName:this.field.name,method:'get',minChars:2,updateElement:this._selectAutocompleteItem.bind(this),onShow:function(element,update){if(!update.style.position||update.style.position=='absolute'){update.style.position='absolute';Position.clone(element,update,{setHeight:false,offsetTop:element.offsetHeight});}
Effect.Appear(update,{duration:0});}});},_selectAutocompleteItem:function(element){if(element.title){this.field.value=element.title;}
this.form.submit();}}
Varien.Tabs=Class.create();Varien.Tabs.prototype={initialize:function(selector){var self=this;$$(selector+' a').each(this.initTab.bind(this));},initTab:function(el){el.href='javascript:void(0)';if($(el.parentNode).hasClassName('active')){this.showContent(el);}
el.observe('click',this.showContent.bind(this,el));},showContent:function(a){var li=$(a.parentNode),ul=$(li.parentNode);ul.getElementsBySelector('li','ol').each(function(el){var contents=$(el.id+'_contents');if(el==li){el.addClassName('active');contents.show();}else{el.removeClassName('active');contents.hide();}});}}
Varien.DOB=Class.create();Varien.DOB.prototype={initialize:function(selector,required,format){var el=$$(selector)[0];this.day=Element.select($(el),'.dob-day input')[0];this.month=Element.select($(el),'.dob-month input')[0];this.year=Element.select($(el),'.dob-year input')[0];this.dob=Element.select($(el),'.dob-full input')[0];this.advice=Element.select($(el),'.validation-advice')[0];this.required=required;this.format=format;this.day.validate=this.validate.bind(this);this.month.validate=this.validate.bind(this);this.year.validate=this.validate.bind(this);this.advice.hide();},validate:function(){var error=false;if(this.day.value==''&&this.month.value==''&&this.year.value==''){if(this.required){error='This date is a required value.';}else{this.dob.value='';}}else if(this.day.value==''||this.month.value==''||this.year.value==''){error='Please enter a valid full date.';}else{var date=new Date();if(this.day.value<1||this.day.value>31){error='Please enter a valid day (1-31).';}else if(this.month.value<1||this.month.value>12){error='Please enter a valid month (1-12).';}else if(this.year.value<1900||this.year.value>date.getFullYear()){error='Please enter a valid year (1900-'+date.getFullYear()+').';}else{this.dob.value=this.format.replace(/(%m|%b)/i,this.month.value).replace(/(%d|%e)/i,this.day.value).replace(/%y/i,this.year.value);var testDOB=this.month.value+'/'+this.day.value+'/'+this.year.value;var test=new Date(testDOB);if(isNaN(test)){error='Please enter a valid date.';}}}
if(error!==false){try{this.advice.innerHTML=Translator.translate(error);}
catch(e){this.advice.innerHTML=error;}
this.advice.show();return false;}
this.advice.hide();return true;}}
Validation.addAllThese([['validate-custom',' ',function(v,elm){return elm.validate();}]]);function truncateOptions(){$$('.truncated').each(function(element){Event.observe(element,'mouseover',function(){if(element.down('div.truncated_full_value')){element.down('div.truncated_full_value').addClassName('show')}});Event.observe(element,'mouseout',function(){if(element.down('div.truncated_full_value')){element.down('div.truncated_full_value').removeClassName('show')}});});}
Event.observe(window,'load',function(){truncateOptions();});Element.addMethods({getInnerText:function(element)
{element=$(element);if(element.innerText&&!Prototype.Browser.Opera){return element.innerText}
return element.innerHTML.stripScripts().unescapeHTML().replace(/[\n\r\s]+/g,' ');}});if(!("console"in window)||!("firebug"in console))
{var names=["log","debug","info","warn","error","assert","dir","dirxml","group","groupEnd","time","timeEnd","count","trace","profile","profileEnd"];window.console={};for(var i=0;i<names.length;++i)
window.console[names[i]]=function(){}}

VarienForm=Class.create();VarienForm.prototype={initialize:function(formId,firstFieldFocus){this.form=$(formId);if(!this.form){return;}
this.cache=$A();this.currLoader=false;this.currDataIndex=false;this.validator=new Validation(this.form);this.elementFocus=this.elementOnFocus.bindAsEventListener(this);this.elementBlur=this.elementOnBlur.bindAsEventListener(this);this.childLoader=this.onChangeChildLoad.bindAsEventListener(this);this.highlightClass='highlight';this.extraChildParams='';this.firstFieldFocus=firstFieldFocus||false;this.bindElements();if(this.firstFieldFocus){try{Form.Element.focus(Form.findFirstElement(this.form))}
catch(e){}}},submit:function(url){if(this.validator&&this.validator.validate()){this.form.submit();}
return false;},bindElements:function(){var elements=Form.getElements(this.form);for(var row in elements){if(elements[row].id){Event.observe(elements[row],'focus',this.elementFocus);Event.observe(elements[row],'blur',this.elementBlur);}}},elementOnFocus:function(event){var element=Event.findElement(event,'fieldset');if(element){Element.addClassName(element,this.highlightClass);}},elementOnBlur:function(event){var element=Event.findElement(event,'fieldset');if(element){Element.removeClassName(element,this.highlightClass);}},setElementsRelation:function(parent,child,dataUrl,first){if(parent=$(parent)){if(!this.cache[parent.id]){this.cache[parent.id]=$A();this.cache[parent.id]['child']=child;this.cache[parent.id]['dataUrl']=dataUrl;this.cache[parent.id]['data']=$A();this.cache[parent.id]['first']=first||false;}
Event.observe(parent,'change',this.childLoader);}},onChangeChildLoad:function(event){element=Event.element(event);this.elementChildLoad(element);},elementChildLoad:function(element,callback){this.callback=callback||false;if(element.value){this.currLoader=element.id;this.currDataIndex=element.value;if(this.cache[element.id]['data'][element.value]){this.setDataToChild(this.cache[element.id]['data'][element.value]);}
else{new Ajax.Request(this.cache[this.currLoader]['dataUrl'],{method:'post',parameters:{"parent":element.value},onComplete:this.reloadChildren.bind(this)});}}},reloadChildren:function(transport){var data=eval('('+transport.responseText+')');this.cache[this.currLoader]['data'][this.currDataIndex]=data;this.setDataToChild(data);},setDataToChild:function(data){if(data.length){var child=$(this.cache[this.currLoader]['child']);if(child){var html='<select name="'+child.name+'" id="'+child.id+'" class="'+child.className+'" title="'+child.title+'" '+this.extraChildParams+'>';if(this.cache[this.currLoader]['first']){html+='<option value="">'+this.cache[this.currLoader]['first']+'</option>';}
for(var i in data){if(data[i].value){html+='<option value="'+data[i].value+'"';if(child.value&&(child.value==data[i].value||child.value==data[i].label)){html+=' selected';}
html+='>'+data[i].label+'</option>';}}
html+='</select>';Element.insert(child,{before:html});Element.remove(child);}}
else{var child=$(this.cache[this.currLoader]['child']);if(child){var html='<input type="text" name="'+child.name+'" id="'+child.id+'" class="'+child.className+'" title="'+child.title+'" '+this.extraChildParams+'>';Element.insert(child,{before:html});Element.remove(child);}}
this.bindElements();if(this.callback){this.callback();}}}
RegionUpdater=Class.create();RegionUpdater.prototype={initialize:function(countryEl,regionTextEl,regionSelectEl,regions,disableAction,zipEl)
{this.countryEl=$(countryEl);this.regionTextEl=$(regionTextEl);this.regionSelectEl=$(regionSelectEl);this.zipEl=$(zipEl);this.regions=regions;this.disableAction=(typeof disableAction=='undefined')?'hide':disableAction;this.zipOptions=(typeof zipOptions=='undefined')?false:zipOptions;if(this.regionSelectEl.options.length<=1){this.update();}
Event.observe(this.countryEl,'change',this.update.bind(this));},update:function()
{if(this.regions[this.countryEl.value]){var i,option,region,def;if(this.regionTextEl){def=this.regionTextEl.value.toLowerCase();this.regionTextEl.value='';}
if(!def){def=this.regionSelectEl.getAttribute('defaultValue');}
this.regionSelectEl.options.length=1;for(regionId in this.regions[this.countryEl.value]){region=this.regions[this.countryEl.value][regionId];option=document.createElement('OPTION');option.value=regionId;option.text=region.name;if(this.regionSelectEl.options.add){this.regionSelectEl.options.add(option);}else{this.regionSelectEl.appendChild(option);}
if(regionId==def||region.name.toLowerCase()==def||region.code.toLowerCase()==def){this.regionSelectEl.value=regionId;}}
if(this.disableAction=='hide'){if(this.regionTextEl){this.regionTextEl.style.display='none';}
this.regionSelectEl.style.display='';}else if(this.disableAction=='disable'){if(this.regionTextEl){this.regionTextEl.disabled=true;}
this.regionSelectEl.disabled=false;}
this.setMarkDisplay(this.regionSelectEl,true);}else{if(this.disableAction=='hide'){if(this.regionTextEl){this.regionTextEl.style.display='';}
this.regionSelectEl.style.display='none';Validation.reset(this.regionSelectEl);}else if(this.disableAction=='disable'){if(this.regionTextEl){this.regionTextEl.disabled=false;}
this.regionSelectEl.disabled=true;}else if(this.disableAction=='nullify'){this.regionSelectEl.options.length=1;this.regionSelectEl.value='';this.regionSelectEl.selectedIndex=0;this.lastCountryId='';}
this.setMarkDisplay(this.regionSelectEl,false);}
var zipUpdater=new ZipUpdater(this.countryEl.value,this.zipEl);zipUpdater.update();},setMarkDisplay:function(elem,display){elem=$(elem);var labelElement=elem.up(0).down('label > span.required')||elem.up(1).down('label > span.required')||elem.up(0).down('label.required > em')||elem.up(1).down('label.required > em');if(labelElement){inputElement=labelElement.up().next('input');if(display){labelElement.show();if(inputElement){inputElement.addClassName('required-entry');}}else{labelElement.hide();if(inputElement){inputElement.removeClassName('required-entry');}}}}}
ZipUpdater=Class.create();ZipUpdater.prototype={initialize:function(country,zipElement)
{this.country=country;this.zipElement=$(zipElement);},update:function()
{if(typeof optionalZipCountries=='undefined'){return false;}
if(this.zipElement!=undefined){this._setPostcodeOptional();}else{Event.observe(window,"load",this._setPostcodeOptional.bind(this));}},_setPostcodeOptional:function()
{this.zipElement=$(this.zipElement);if(this.zipElement==undefined){return false;}
var label=$$('label[for="'+this.zipElement.id+'"]')[0];if(label!=undefined){var wildCard=label.down('em')||label.down('span.required');}
if(optionalZipCountries.indexOf(this.country)!=-1){while(this.zipElement.hasClassName('required-entry')){this.zipElement.removeClassName('required-entry');}
if(wildCard!=undefined){wildCard.hide();}}else{this.zipElement.addClassName('required-entry');if(wildCard!=undefined){wildCard.show();}}}}
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Varien
 * @package     js
 * @copyright   Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
function toggleMenu(el, over)
{
    if (over) {
        Element.addClassName(el, 'over');
    }
    else {
        Element.removeClassName(el, 'over');
    }
}

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Mage
 * @package     js
 * @copyright   Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */

var Translate = Class.create();
Translate.prototype = {
    initialize: function(data){
        this.data = $H(data);
    },

    translate : function(){
        var args = arguments;
        var text = arguments[0];

        if(this.data.get(text)){
            return this.data.get(text);
        }
        return text;
    },
    add : function() {
        if (arguments.length > 1) {
            this.data.set(arguments[0], arguments[1]);
        } else if (typeof arguments[0] =='object') {
            $H(arguments[0]).each(function (pair){
                this.data.set(pair.key, pair.value);
            }.bind(this));
        }
    }
}

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Mage
 * @package     js
 * @copyright   Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
// old school cookie functions grabbed off the web

if (!window.Mage) var Mage = {};

Mage.Cookies = {};
Mage.Cookies.expires  = null;
Mage.Cookies.path     = '/';
Mage.Cookies.domain   = null;
Mage.Cookies.secure   = false;
Mage.Cookies.set = function(name, value){
     var argv = arguments;
     var argc = arguments.length;
     var expires = (argc > 2) ? argv[2] : Mage.Cookies.expires;
     var path = (argc > 3) ? argv[3] : Mage.Cookies.path;
     var domain = (argc > 4) ? argv[4] : Mage.Cookies.domain;
     var secure = (argc > 5) ? argv[5] : Mage.Cookies.secure;
     document.cookie = name + "=" + escape (value) +
       ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
       ((path == null) ? "" : ("; path=" + path)) +
       ((domain == null) ? "" : ("; domain=" + domain)) +
       ((secure == true) ? "; secure" : "");
};

Mage.Cookies.get = function(name){
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    var j = 0;
    while(i < clen){
        j = i + alen;
        if (document.cookie.substring(i, j) == arg)
            return Mage.Cookies.getCookieVal(j);
        i = document.cookie.indexOf(" ", i) + 1;
        if(i == 0)
            break;
    }
    return null;
};

Mage.Cookies.clear = function(name) {
  if(Mage.Cookies.get(name)){
    document.cookie = name + "=" +
    "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  }
};

Mage.Cookies.getCookieVal = function(offset){
   var endstr = document.cookie.indexOf(";", offset);
   if(endstr == -1){
       endstr = document.cookie.length;
   }
   return unescape(document.cookie.substring(offset, endstr));
};


