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}('k 1m={6A:\'1.5.0\',6O:{6Q:!!N.5o},56:\'(?:<4a.*?>)((\\n|\\r|.)*?)(?:<\\/4a>)\',3w:c(){},K:c(x){f x}};k 1z={1y:c(){f c(){7.29.2u(7,U)}}};k 1K=Q D();D.B=c(41,1A){18(k 1n 2c 1A){41[1n]=1A[1n]}f 41};D.B(D,{1h:c(V){1R{h(V===1c)f\'1c\';h(V===12)f\'12\';f V.1h?V.1h():V.2h()}1Z(e){h(e aj 9w)f\'...\';2G e}},48:c(V){k 48=[];18(k 1n 2c V)48.M(1n);f 48},1b:c(V){k 1b=[];18(k 1n 2c V)1b.M(V[1n]);f 1b},4t:c(V){f D.B({},V)}});6y.I.1x=c(){k 5g=7,1P=$A(U),V=1P.6e();f c(){f 5g.2u(V,1P.1Q($A(U)))}};6y.I.9t=c(V){k 5g=7,1P=$A(U),V=1P.6e();f c(1a){f 5g.2u(V,[(1a||1r.1a)].1Q(1P).1Q($A(U)))}};D.B(9C.I,{9z:c(){k 5A=7.2h(16);h(7<16)f\'0\'+5A;f 5A},6E:c(){f 7+1},8J:c(L){$R(0,7,1k).T(L);f 7}});k 8X={8Y:c(){k 55;18(k i=0,o=U.o;i<o;i++){k 9o=U[i];1R{55=9o();1i}1Z(e){}}f 55}};k 8E=1z.1y();8E.I={29:c(1L,2m){7.1L=1L;7.2m=2m;7.5l=1g;7.3p()},3p:c(){7.3U=8v(7.3i.1x(7),7.2m*6k)},5D:c(){h(!7.3U)f;9s(7.3U);7.3U=12},3i:c(){h(!7.5l){1R{7.5l=1k;7.1L(7)}9B{7.5l=1g}}}};2l.6r=c(l){f l==12?\'\':2l(l)};D.B(2l.I,{2o:c(25,26){k J=\'\',1A=7,E;26=U.9D.5I(26);1v(1A.o>0){h(E=1A.E(25)){J+=1A.2z(0,E.G);J+=2l.6r(26(E));1A=1A.2z(E.G+E[0].o)}1l{J+=1A,1A=\'\'}}f J},9A:c(25,26,4j){26=7.2o.5I(26);4j=4j===1c?1:4j;f 7.2o(25,c(E){h(--4j<0)f E[0];f 26(E)})},9v:c(25,L){7.2o(25,L);f 7},9y:c(o,3Q){o=o||30;3Q=3Q===1c?\'...\':3Q;f 7.o>o?7.2z(0,o-3Q.o)+3Q:7},4x:c(){f 7.2k(/^\\s+/,\'\').2k(/\\s+$/,\'\')},8o:c(){f 7.2k(/<\\/?[^>]+>/51,\'\')},2x:c(){f 7.2k(Q 52(1m.56,\'8C\'),\'\')},8m:c(){k 8g=Q 52(1m.56,\'8C\');k 8l=Q 52(1m.56,\'9F\');f(7.E(8g)||[]).1D(c(8h){f(8h.E(8l)||[\'\',\'\'])[1]})},3R:c(){f 7.8m().1D(c(4a){f 5Z(4a)})},9q:c(){k 1f=N.4g(\'1f\');k 2T=N.9r(7);1f.5K(2T);f 1f.2J},ap:c(){k 1f=N.4g(\'1f\');1f.2J=7.8o();f 1f.2P[0]?(1f.2P.o>1?$A(1f.2P).2B(\'\',c(3G,1B){f 3G+1B.44}):1f.2P[0].44):\'\'},68:c(8p){k E=7.4x().E(/([^?#]*)(#.*)?$/);h(!E)f{};f E[1].3g(8p||\'&\').2B({},c(2E,P){h((P=P.3g(\'=\'))[0]){k v=8q(P[0]);k l=P[1]?8q(P[1]):1c;h(2E[v]!==1c){h(2E[v].3t!=1O)2E[v]=[2E[v]];h(l)2E[v].M(l)}1l 2E[v]=l}f 2E})},2y:c(){f 7.3g(\'\')},6E:c(){f 7.2z(0,7.o-1)+2l.aa(7.ab(7.o-1)+1)},69:c(){k 22=7.3g(\'-\'),5y=22.o;h(5y==1)f 22[0];k 5G=7.58(0)==\'-\'?22[0].58(0).2e()+22[0].5P(1):22[0];18(k i=1;i<5y;i++)5G+=22[i].58(0).2e()+22[i].5P(1);f 5G},7i:c(){f 7.58(0).2e()+7.5P(1).20()},ac:c(){f 7.2o(/::/,\'/\').2o(/([A-Z]+)([A-Z][a-z])/,\'#{1}43#{2}\').2o(/([a-z\\d])([A-Z])/,\'#{1}43#{2}\').2o(/-/,\'43\').20()},ad:c(){f 7.2o(/43/,\'-\')},1h:c(8i){k 5L=7.2k(/\\\\/g,\'\\\\\\\\\');h(8i)f\'"\'+5L.2k(/"/g,\'\\\\"\')+\'"\';1l f"\'"+5L.2k(/\'/g,\'\\\\\\\'\')+"\'"}});2l.I.2o.5I=c(26){h(1u 26==\'c\')f 26;k 3V=Q 4f(26);f c(E){f 3V.5o(E)}};2l.I.a4=2l.I.68;k 4f=1z.1y();4f.8r=/(^|.|\\r|\\n)(#\\{(.*?)\\})/;4f.I={29:c(3V,25){7.3V=3V.2h();7.25=25||4f.8r},5o:c(V){f 7.3V.2o(7.25,c(E){k 6h=E[1];h(6h==\'\\\\\')f E[2];f 6h+2l.6r(V[E[3]])})}};k $1i=Q D();k $5q=Q D();k 1X={T:c(L){k G=0;1R{7.2N(c(l){1R{L(l,G++)}1Z(e){h(e!=$5q)2G e}})}1Z(e){h(e!=$1i)2G e}f 7},8w:c(31,L){k G=-31,6N=[],1T=7.2y();1v((G+=31)<1T.o)6N.M(1T.2z(G,G+31));f 6N.1D(L)},5N:c(L){k J=1k;7.T(c(l,G){J=J&&!!(L||1m.K)(l,G);h(!J)2G $1i});f J},a5:c(L){k J=1g;7.T(c(l,G){h(J=!!(L||1m.K)(l,G))2G $1i});f J},7O:c(L){k 15=[];7.T(c(l,G){15.M((L||1m.K)(l,G))});f 15},9c:c(L){k J;7.T(c(l,G){h(L(l,G)){J=l;2G $1i}});f J},9e:c(L){k 15=[];7.T(c(l,G){h(L(l,G))15.M(l)});f 15},a6:c(25,L){k 15=[];7.T(c(l,G){k 8B=l.2h();h(8B.E(25))15.M((L||1m.K)(l,G))});f 15},1o:c(V){k 6L=1g;7.T(c(l){h(l==V){6L=1k;2G $1i}});f 6L},a7:c(31,4k){4k=4k===1c?12:4k;f 7.8w(31,c(2z){1v(2z.o<31)2z.M(4k);f 2z})},2B:c(3G,L){7.T(c(l,G){3G=L(3G,l,G)});f 3G},af:c(1C){k 1P=$A(U).2z(1);f 7.1D(c(l){f l[1C].2u(l,1P)})},9G:c(L){k J;7.T(c(l,G){l=(L||1m.K)(l,G);h(J==1c||l>=J)J=l});f J},ak:c(L){k J;7.T(c(l,G){l=(L||1m.K)(l,G);h(J==1c||l<J)J=l});f J},ag:c(L){k 63=[],6S=[];7.T(c(l,G){((L||1m.K)(l,G)?63:6S).M(l)});f[63,6S]},49:c(1n){k 15=[];7.T(c(l,G){15.M(l[1n])});f 15},a3:c(L){k 15=[];7.T(c(l,G){h(!L(l,G))15.M(l)});f 15},a2:c(L){f 7.1D(c(l,G){f{l:l,6o:L(l,G)}}).9O(c(1J,4K){k a=1J.6o,b=4K.6o;f a<b?-1:a>b?1:0}).49(\'l\')},2y:c(){f 7.1D()},9Q:c(){k L=1m.K,1P=$A(U);h(1u 1P.6z()==\'c\')L=1P.9M();k 9l=[7].1Q(1P).1D($A);f 7.1D(c(l,G){f L(9l.49(G))})},8L:c(){f 7.2y().o},1h:c(){f\'#<1X:\'+7.2y().1h()+\'>\'}};D.B(1X,{1D:1X.7O,7T:1X.9c,23:1X.9e,9J:1X.1o,9K:1X.2y});k $A=1O.9R=c(3T){h(!3T)f[];h(3T.2y){f 3T.2y()}1l{k 15=[];18(k i=0,o=3T.o;i<o;i++)15.M(3T[i]);f 15}};D.B(1O.I,1X);h(!1O.I.5B)1O.I.5B=1O.I.4D;D.B(1O.I,{2N:c(L){18(k i=0,o=7.o;i<o;i++)L(7[i])},7R:c(){7.o=0;f 7},45:c(){f 7[0]},6z:c(){f 7[7.o-1]},8G:c(){f 7.23(c(l){f l!=12})},6a:c(){f 7.2B([],c(1T,l){f 1T.1Q(l&&l.3t==1O?l.6a():[l])})},70:c(){k 1b=$A(U);f 7.23(c(l){f!1b.1o(l)})},7p:c(V){18(k i=0,o=7.o;i<o;i++)h(7[i]==V)f i;f-1},4D:c(9n){f(9n!==1g?7:7.2y()).5B()},94:c(){f 7.o>1?7:7[0]},9Z:c(){f 7.2B([],c(1T,l){f 1T.1o(l)?1T:1T.1Q([l])})},4t:c(){f[].1Q(7)},8L:c(){f 7.o},1h:c(){f\'[\'+7.1D(D.1h).2S(\', \')+\']\'}});1O.I.2y=1O.I.4t;c $w(2C){2C=2C.4x();f 2C?2C.3g(/\\s+/):[]}h(1r.2L){1O.I.1Q=c(){k 1T=[];18(k i=0,o=7.o;i<o;i++)1T.M(7[i]);18(k i=0,o=U.o;i<o;i++){h(U[i].3t==1O){18(k j=0,8H=U[i].o;j<8H;j++)1T.M(U[i][j])}1l{1T.M(U[i])}}f 1T}}k 2a=c(4E){D.B(7,4E||{})};D.B(2a,{3y:c(4E){k 22=[];7.I.2N.a0(4E,c(P){h(!P.1p)f;h(P.l&&P.l.3t==1O){k 1b=P.l.8G();h(1b.o<2)P.l=1b.94();1l{1p=4M(P.1p);1b.T(c(l){l=l!=1c?4M(l):\'\';22.M(1p+\'=\'+4M(l))});f}}h(P.l==1c)P[1]=\'\';22.M(P.1D(4M).2S(\'=\'))});f 22.2S(\'&\')}});D.B(2a.I,1X);D.B(2a.I,{2N:c(L){18(k 1p 2c 7){k l=7[1p];h(l&&l==2a.I[1p])5q;k P=[1p,l];P.1p=1p;P.l=l;L(P)}},48:c(){f 7.49(\'1p\')},1b:c(){f 7.49(\'l\')},9T:c(2E){f $H(2E).2B(7,c(6C,P){6C[P.1p]=P.l;f 6C})},4b:c(){k J;18(k i=0,o=U.o;i<o;i++){k l=7[U[i]];h(l!==1c){h(J===1c)J=l;1l{h(J.3t!=1O)J=[J];J.M(l)}}9U 7[U[i]]}f J},3y:c(){f 2a.3y(7)},1h:c(){f\'#<2a:{\'+7.1D(c(P){f P.1D(D.1h).2S(\': \')}).2S(\', \')+\'}>\'}});c $H(V){h(V&&V.3t==2a)f V;f Q 2a(V)};4L=1z.1y();D.B(4L.I,1X);D.B(4L.I,{29:c(2R,3n,3D){7.2R=2R;7.3n=3n;7.3D=3D},2N:c(L){k l=7.2R;1v(7.1o(l)){L(l);l=l.6E()}},1o:c(l){h(l<7.2R)f 1g;h(7.3D)f l<7.3n;f l<=7.3n}});k $R=c(2R,3n,3D){f Q 4L(2R,3n,3D)};k 19={62:c(){f 8X.8Y(c(){f Q 7n()},c(){f Q 7f(\'an.71\')},c(){f Q 7f(\'9W.71\')})||1g},6q:0};19.3z={4i:[],2N:c(L){7.4i.2N(L)},77:c(2K){h(!7.1o(2K))7.4i.M(2K)},9V:c(2K){7.4i=7.4i.70(2K)},5m:c(1L,32,Y,2Q){7.T(c(2K){h(1u 2K[1L]==\'c\'){1R{2K[1L].2u(2K,[32,Y,2Q])}1Z(e){}}})}};D.B(19.3z,1X);19.3z.77({7c:c(){19.6q++},28:c(){19.6q--}});19.5d=c(){};19.5d.I={57:c(C){7.C={1C:\'4u\',5r:1k,7e:\'6l/x-9X-W-9Y\',6T:\'a1-8\',4m:\'\'};D.B(7.C,C||{});7.C.1C=7.C.1C.20();h(1u 7.C.4m==\'2C\')7.C.4m=7.C.4m.68()}};19.4d=1z.1y();19.4d.75=[\'9S\',\'9I\',\'9H\',\'9L\',\'6W\'];19.4d.I=D.B(Q 19.5d(),{6D:1g,29:c(1U,C){7.Y=19.62();7.57(C);7.32(1U)},32:c(1U){7.1U=1U;7.1C=7.C.1C;k 11=7.C.4m;h(![\'7o\',\'4u\'].1o(7.1C)){11[\'9P\']=7.1C;7.1C=\'4u\'}11=2a.3y(11);h(11&&/3M|3O|3X/.2O(2f.2I))11+=\'&43=\';h(7.1C==\'7o\'&&11)7.1U+=(7.1U.7p(\'?\')>-1?\'&\':\'?\')+11;1R{19.3z.5m(\'7c\',7,7.Y);7.Y.9N(7.1C.2e(),7.1U,7.C.5r);h(7.C.5r)3h(c(){7.6p(1)}.1x(7),10);7.Y.7b=7.6H.1x(7);7.7g();k 1N=7.1C==\'4u\'?(7.C.ai||11):12;7.Y.ah(1N);h(!7.C.5r&&7.Y.7I)7.6H()}1Z(e){7.4s(e)}},6H:c(){k 3s=7.Y.3s;h(3s>1&&!((3s==4)&&7.6D))7.6p(7.Y.3s)},7g:c(){k 3d={\'X-al-ao\':\'7n\',\'X-1m-6A\':1m.6A,\'am\':\'2T/76, 2T/1j, 6l/7l, 2T/7l, */*\'};h(7.1C==\'4u\'){3d[\'78-2H\']=7.C.7e+(7.C.6T?\'; ae=\'+7.C.6T:\'\');h(7.Y.7I&&(2f.2I.E(/7G\\/(\\d{4})/)||[0,7J])[1]<7J)3d[\'a8\']=\'a9\'}h(1u 7.C.7K==\'V\'){k 3W=7.C.7K;h(1u 3W.M==\'c\')18(k i=0,o=3W.o;i<o;i+=2)3d[3W[i]]=3W[i+1];1l $H(3W).T(c(P){3d[P.1p]=P.l})}18(k v 2c 3d)7.Y.9x(v,3d[v])},3c:c(){f!7.Y.5h||(7.Y.5h>=9u&&7.Y.5h<9E)},6p:c(3s){k 47=19.4d.75[3s];k Y=7.Y,2Q=7.72();h(47==\'6W\'){1R{7.6D=1k;(7.C[\'3P\'+7.Y.5h]||7.C[\'3P\'+(7.3c()?\'aH\':\'bR\')]||1m.3w)(Y,2Q)}1Z(e){7.4s(e)}h((7.5Q(\'78-2H\')||\'2T/76\').4x().E(/^(2T|6l)\\/(x-)?(bS|bQ)4a(;.*)?$/i))7.7a()}1R{(7.C[\'3P\'+47]||1m.3w)(Y,2Q);19.3z.5m(\'3P\'+47,7,Y,2Q)}1Z(e){7.4s(e)}h(47==\'6W\'){7.Y.7b=1m.3w}},5Q:c(v){1R{f 7.Y.bP(v)}1Z(e){f 12}},72:c(){1R{k 2Q=7.5Q(\'X-bM\');f 2Q?5Z(\'(\'+2Q+\')\'):12}1Z(e){f 12}},7a:c(){1R{f 5Z(7.Y.54)}1Z(e){7.4s(e)}},4s:c(60){(7.C.74||1m.3w)(7,60);19.3z.5m(\'74\',7,60)}});19.5x=1z.1y();D.B(D.B(19.5x.I,19.4d.I),{29:c(21,1U,C){7.21={3c:(21.3c||21),5V:(21.5V||(21.3c?12:21))};7.Y=19.62();7.57(C);k 28=7.C.28||1m.3w;7.C.28=(c(Y,7B){7.7C();28(Y,7B)}).1x(7);7.32(1U)},7C:c(){k 4l=7.21[7.3c()?\'3c\':\'5V\'];k 4n=7.Y.54;h(!7.C.3R)4n=4n.2x();h(4l=$(4l)){h(7.C.7z)Q 7.C.7z(4l,4n);1l 4l.5E(4n)}h(7.3c()){h(7.28)3h(7.28.1x(7),10)}}});19.7y=1z.1y();19.7y.I=D.B(Q 19.5d(),{29:c(21,1U,C){7.57(C);7.28=7.C.28;7.2m=(7.C.2m||2);7.3l=(7.C.3l||1);7.5w={};7.21=21;7.1U=1U;7.2R()},2R:c(){7.C.28=7.7E.1x(7);7.3i()},5D:c(){7.5w.C.28=1c;bN(7.3U);(7.28||1m.3w).2u(7,U)},7E:c(32){h(7.C.3l){7.3l=(32.54==7.7F?7.3l*7.C.3l:1);7.7F=32.54}7.3U=3h(7.3i.1x(7),7.3l*7.2m*6k)},3i:c(){7.5w=Q 19.5x(7.21,7.1U,7.C)}});c $(6){h(U.o>1){18(k i=0,1q=[],o=U.o;i<o;i++)1q.M($(U[i]));f 1q}h(1u 6==\'2C\')6=N.bO(6);f m.B(6)}h(1m.6O.6Q){N.7v=c(17,4y){k 15=[];k 5R=N.5o(17,$(4y)||N,12,bT.bU,12);18(k i=0,o=5R.c0;i<o;i++)15.M(5R.c1(i));f 15}}N.5O=c(1e,4y){h(1m.6O.6Q){k q=".//*[bZ(1Q(\' \', @7q, \' \'), \' "+1e+" \')]";f N.7v(q,4y)}1l{k 6i=($(4y)||N.1N).4e(\'*\');k 1q=[],3e;18(k i=0,o=6i.o;i<o;i++){3e=6i[i];h(m.4T(3e,1e))1q.M(m.B(3e))}f 1q}};h(!1r.m)k m=Q D();m.B=c(6){h(!6||6d||6.4U==3)f 6;h(!6.7m&&6.14&&6!=1r){k 2r=D.4t(m.1s),3f=m.B.3f;h(6.14==\'bY\')D.B(2r,O.1s);h([\'bV\',\'bW\',\'bX\'].1o(6.14))D.B(2r,O.m.1s);D.B(2r,m.1s.5U);18(k 1n 2c 2r){k l=2r[1n];h(1u l==\'c\'&&!(1n 2c 6))6[1n]=3f.5Y(l)}}6.7m=1k;f 6};m.B.3f={5Y:c(l){f 7[l]=7[l]||c(){f l.2u(12,[7].1Q($A(U)))}}};m.1s={5F:c(6){f $(6).u.2d!=\'4P\'},8P:c(6){6=$(6);m[m.5F(6)?\'7s\':\'7t\'](6);f 6},7s:c(6){$(6).u.2d=\'4P\';f 6},7t:c(6){$(6).u.2d=\'\';f 6},4b:c(6){6=$(6);6.2n.6f(6);f 6},5E:c(6,1j){1j=1u 1j==\'1c\'?\'\':1j.2h();$(6).2J=1j.2x();3h(c(){1j.3R()},10);f 6},2k:c(6,1j){6=$(6);1j=1u 1j==\'1c\'?\'\':1j.2h();h(6.7r){6.7r=1j.2x()}1l{k 2q=6.97.8O();2q.5H(6);6.2n.bL(2q.96(1j.2x()),6)}3h(c(){1j.3R()},10);f 6},1h:c(6){6=$(6);k J=\'<\'+6.14.20();$H({\'3E\':\'3E\',\'1e\':\'7q\'}).T(c(P){k 1n=P.45(),1d=P.6z();k l=(6[1n]||\'\').2h();h(l)J+=\' \'+1d+\'=\'+l.1h(1k)});f J+\'>\'},53:c(6,1n){6=$(6);k 1q=[];1v(6=6[1n])h(6.4U==1)1q.M(m.B(6));f 1q},7u:c(6){f $(6).53(\'2n\')},7H:c(6){f $A($(6).4e(\'*\'))},bK:c(6){h(!(6=$(6).50))f[];1v(6&&6.4U!=1)6=6.4X;h(6)f[6].1Q($(6).4C());f[]},6v:c(6){f $(6).53(\'bz\')},4C:c(6){f $(6).53(\'4X\')},bA:c(6){6=$(6);f 6.6v().4D().1Q(6.4C())},E:c(6,2g){h(1u 2g==\'2C\')2g=Q 1W(2g);f 2g.E($(6))},by:c(6,17,G){f 1W.3Y($(6).7u(),17,G)},bx:c(6,17,G){f 1W.3Y($(6).7H(),17,G)},bu:c(6,17,G){f 1W.3Y($(6).6v(),17,G)},bv:c(6,17,G){f 1W.3Y($(6).4C(),17,G)},c3:c(){k 1P=$A(U),6=$(1P.6e());f 1W.6F(6,1P)},5O:c(6,1e){f N.5O(1e,6)},6t:c(6,v){6=$(6);h(N.5N&&!1r.2L){k t=m.24;h(t.1b[v])f t.1b[v](6,v);h(t.4N[v])v=t.4N[v];k 1d=6.4z[v];h(1d)f 1d.44}f 6.8Z(v)},bB:c(6){f $(6).5S().2w},bC:c(6){f $(6).5S().2s},3j:c(6){f Q m.4W(6)},4T:c(6,1e){h(!(6=$(6)))f;k 4B=6.1e;h(4B.o==0)f 1g;h(4B==1e||4B.E(Q 52("(^|\\\\s)"+1e+"(\\\\s|$)")))f 1k;f 1g},bI:c(6,1e){h(!(6=$(6)))f;m.3j(6).6I(1e);f 6},bJ:c(6,1e){h(!(6=$(6)))f;m.3j(6).4b(1e);f 6},bH:c(6,1e){h(!(6=$(6)))f;m.3j(6)[6.4T(1e)?\'4b\':\'6I\'](1e);f 6},3Z:c(){1t.3Z.2u(1t,U);f $A(U).45()},5e:c(){1t.5e.2u(1t,U);f $A(U).45()},bG:c(6){6=$(6);k 1B=6.50;1v(1B){k 7d=1B.4X;h(1B.4U==3&&!/\\S/.2O(1B.44))6.6f(1B);1B=7d}f 6},9j:c(6){f $(6).2J.E(/^\\s*$/)},73:c(6,4S){6=$(6),4S=$(4S);1v(6=6.2n)h(6==4S)f 1k;f 1g},7h:c(6){6=$(6);k 3I=2M.4w(6);1r.7h(3I[0],3I[1]);f 6},1H:c(6,u){6=$(6);h([\'7L\',\'4Q\'].1o(u))u=(1u 6.u.4Y!=\'1c\'?\'4Y\':\'4Q\');u=u.69();k l=6.u[u];h(!l){h(N.6K&&N.6K.7k){k 6V=N.6K.7k(6,12);l=6V?6V[u]:12}1l h(6.7j){l=6.7j[u]}}h((l==\'4q\')&&[\'2s\',\'2w\'].1o(u)&&(6.1H(\'2d\')!=\'4P\'))l=6[\'1Y\'+u.7i()]+\'2i\';h(1r.2L&&[\'1J\',\'1V\',\'4K\',\'79\'].1o(u))h(m.1H(6,\'1F\')==\'61\')l=\'4q\';h(u==\'4Z\'){h(l)f 3x(l);h(l=(6.1H(\'3u\')||\'\').E(/4c\\(4Z=(.*)\\)/))h(l[1])f 3x(l[1])/7M;f 1.0}f l==\'4q\'?12:l},bD:c(6,u){6=$(6);18(k v 2c u){k l=u[v];h(v==\'4Z\'){h(l==1){l=(/7G/.2O(2f.2I)&&!/3M|3O|3X/.2O(2f.2I))?0.bE:1.0;h(/5C/.2O(2f.2I)&&!1r.2L)6.u.3u=6.1H(\'3u\').2k(/4c\\([^\\)]*\\)/51,\'\')}1l h(l==\'\'){h(/5C/.2O(2f.2I)&&!1r.2L)6.u.3u=6.1H(\'3u\').2k(/4c\\([^\\)]*\\)/51,\'\')}1l{h(l<0.bF)l=0;h(/5C/.2O(2f.2I)&&!1r.2L)6.u.3u=6.1H(\'3u\').2k(/4c\\([^\\)]*\\)/51,\'\')+\'4c(4Z=\'+l*7M+\')\'}}1l h([\'7L\',\'4Q\'].1o(v))v=(1u 6.u.4Y!=\'1c\')?\'4Y\':\'4Q\';6.u[v.69()]=l}f 6},5S:c(6){6=$(6);k 2d=$(6).1H(\'2d\');h(2d!=\'4P\'&&2d!=12)f{2s:6.3B,2w:6.3C};k 2A=6.u;k 7A=2A.64;k 7w=2A.1F;k 7x=2A.2d;2A.64=\'5t\';2A.1F=\'3v\';2A.2d=\'c2\';k 7D=6.9b;k 7N=6.8V;2A.2d=7x;2A.1F=7w;2A.64=7A;f{2s:7D,2w:7N}},c7:c(6){6=$(6);k 3I=m.1H(6,\'1F\');h(3I==\'61\'||!3I){6.5X=1k;6.u.1F=\'5i\';h(1r.2L){6.u.1V=0;6.u.1J=0}}f 6},cn:c(6){6=$(6);h(6.5X){6.5X=1c;6.u.1F=6.u.1V=6.u.1J=6.u.79=6.u.4K=\'\'}f 6},cp:c(6){6=$(6);h(6.3J)f 6;6.3J=6.u.4O||\'4q\';h((m.1H(6,\'4O\')||\'5F\')!=\'5t\')6.u.4O=\'5t\';f 6},co:c(6){6=$(6);h(!6.3J)f 6;6.u.4O=6.3J==\'4q\'?\'\':6.3J;6.3J=12;f 6}};D.B(m.1s,{84:m.1s.73});m.24={};m.24.4N={cl:"c9",ca:"cb",c8:"cm",c4:"c5",c6:"cc",cd:"cj",ck:"ci",ch:"ce",95:"cf",cg:"bw"};m.24.1b={6X:c(6,1d){f 6.8Z(1d,2)},4v:c(6,1d){f $(6).5n(1d)?1d:12},u:c(6){f 6.u.bs.20()},90:c(6){k 1B=6.93(\'90\');f 1B.91?1B.44:12}};D.B(m.24.1b,{aM:m.24.1b.6X,aN:m.24.1b.6X,2Z:m.24.1b.4v,8e:m.24.1b.4v,95:m.24.1b.4v,aL:m.24.1b.4v});m.1s.5U={5n:c(6,1d){k t=m.24;1d=t.4N[1d]||1d;f $(6).93(1d).91}};h(N.5N&&!1r.2L){m.1s.5E=c(6,1j){6=$(6);1j=1u 1j==\'1c\'?\'\':1j.2h();k 14=6.14.2e();h([\'8T\',\'66\',\'67\',\'8S\'].1o(14)){k 1f=N.4g(\'1f\');4h(14){1w\'8T\':1w\'66\':1f.2J=\'<3a><3b>\'+1j.2x()+\'</3b></3a>\';4F=2;1i;1w\'67\':1f.2J=\'<3a><3b><4J>\'+1j.2x()+\'</4J></3b></3a>\';4F=3;1i;1w\'8S\':1f.2J=\'<3a><3b><4J><8K>\'+1j.2x()+\'</8K></4J></3b></3a>\';4F=4}$A(6.2P).T(c(1B){6.6f(1B)});4F.8J(c(){1f=1f.50});$A(1f.2P).T(c(1B){6.5K(1B)})}1l{6.2J=1j.2x()}3h(c(){1j.3R()},10);f 6}};D.B(m,m.1s);k 6d=1g;h(/3M|3O|3X/.2O(2f.2I))[\'\',\'O\',\'aK\',\'aI\',\'aJ\'].T(c(4G){k 1e=\'aO\'+4G+\'m\';h(1r[1e])f;k 4I=1r[1e]={};4I.I=N.4g(4G?4G.20():\'1f\').aP});m.8R=c(2r){D.B(m.1s,2r||{});c 4p(2r,41,4H){4H=4H||1g;k 3f=m.B.3f;18(k 1n 2c 2r){k l=2r[1n];h(!4H||!(1n 2c 41))41[1n]=3f.5Y(l)}}h(1u 5T!=\'1c\'){4p(m.1s,5T.I);4p(m.1s.5U,5T.I,1k);4p(O.1s,aU.I);[aV,aT,aq].T(c(4I){4p(O.m.1s,4I.I)});6d=1k}};k 8Q=Q D();8Q.2d=m.8P;1K.1I=c(4A){7.4A=4A};1K.1I.I={29:c(6,3r){7.6=$(6);7.3r=3r.2x();h(7.4A&&7.6.8N){1R{7.6.8N(7.4A,7.3r)}1Z(e){k 14=7.6.14.2e();h([\'66\',\'67\'].1o(14)){7.3N(7.98())}1l{2G e}}}1l{7.2q=7.6.97.8O();h(7.3S)7.3S();7.3N([7.2q.96(7.3r)])}3h(c(){3r.3R()},10)},98:c(){k 1f=N.4g(\'1f\');1f.2J=\'<3a><3b>\'+7.3r+\'</3b></3a>\';f $A(1f.2P[0].2P[0].2P)}};k 1I=Q D();1I.9k=1z.1y();1I.9k.I=D.B(Q 1K.1I(\'aS\'),{3S:c(){7.2q.aQ(7.6)},3N:c(2Y){2Y.T((c(2X){7.6.2n.6P(2X,7.6)}).1x(7))}});1I.9m=1z.1y();1I.9m.I=D.B(Q 1K.1I(\'aR\'),{3S:c(){7.2q.5H(7.6);7.2q.9a(1k)},3N:c(2Y){2Y.4D(1g).T((c(2X){7.6.6P(2X,7.6.50)}).1x(7))}});1I.9i=1z.1y();1I.9i.I=D.B(Q 1K.1I(\'bt\'),{3S:c(){7.2q.5H(7.6);7.2q.9a(7.6)},3N:c(2Y){2Y.T((c(2X){7.6.5K(2X)}).1x(7))}});1I.99=1z.1y();1I.99.I=D.B(Q 1K.1I(\'aG\'),{3S:c(){7.2q.aw(7.6)},3N:c(2Y){2Y.T((c(2X){7.6.2n.6P(2X,7.6.4X)}).1x(7))}});m.4W=1z.1y();m.4W.I={29:c(6){7.6=$(6)},2N:c(L){7.6.1e.3g(/\\s+/).23(c(v){f v.o>0}).2N(L)},6R:c(1e){7.6.1e=1e},6I:c(6J){h(7.1o(6J))f;7.6R($A(7).1Q(6J).2S(\' \'))},4b:c(6Z){h(!7.1o(6Z))f;7.6R($A(7).70(6Z).2S(\' \'))},2h:c(){f $A(7).2S(\' \')}};D.B(m.4W.I,1X);k 1W=1z.1y();1W.I={29:c(17){7.11={3j:[]};7.17=17.2h().4x();7.9g();7.85()},9g:c(){c 4R(9p){2G\'ax av 2c 2g: \'+9p}h(7.17==\'\')4R(\'9j 17\');k 11=7.11,2p=7.17,E,6n,1M,6j;1v(E=2p.E(/^(.*)\\[([a-6G-6s:-]+?)(?:([~\\|!]?=)(?:"([^"]*)"|([^\\]\\s]*)))?\\]$/i)){11.4z=11.4z||[];11.4z.M({v:E[2],4V:E[3],l:E[4]||E[5]||\'\'});2p=E[1]}h(2p==\'*\')f 7.11.87=1k;1v(E=2p.E(/^([^a-6G-6s-])?([a-6G-6s-]+)(.*)/i)){6n=E[1],1M=E[2],6j=E[3];4h(6n){1w\'#\':11.3E=1M;1i;1w\'.\':11.3j.M(1M);1i;1w\'\':1w 1c:11.14=1M.2e();1i;5c:4R(2p.1h())}2p=6j}h(2p.o>0)4R(2p.1h())},83:c(){k 11=7.11,2j=[],1M;h(11.87)2j.M(\'1k\');h(1M=11.3E)2j.M(\'6.6t("3E") == \'+1M.1h());h(1M=11.14)2j.M(\'6.14.2e() == \'+1M.1h());h((1M=11.3j).o>0)18(k i=0,o=1M.o;i<o;i++)2j.M(\'6.4T(\'+1M[i].1h()+\')\');h(1M=11.4z){1M.T(c(1d){k l=\'6.6t(\'+1d.v.1h()+\')\';k 6B=c(86){f l+\' && \'+l+\'.3g(\'+86.1h()+\')\'};4h(1d.4V){1w\'=\':2j.M(l+\' == \'+1d.l.1h());1i;1w\'~=\':2j.M(6B(\' \')+\'.1o(\'+1d.l.1h()+\')\');1i;1w\'|=\':2j.M(6B(\'-\')+\'.45().2e() == \'+1d.l.2e().1h());1i;1w\'!=\':2j.M(l+\' != \'+1d.l.1h());1i;1w\'\':1w 1c:2j.M(\'6.5n(\'+1d.v.1h()+\')\');1i;5c:2G\'au 4V \'+1d.4V+\' 2c 2g\'}})}f 2j.2S(\' && \')},85:c(){7.E=Q 6y(\'6\',\'h(!6.14){ f 1g;} f \'+7.83())},82:c(3m){k 6;h(6=$(7.11.3E))h(7.E(6))h(!3m||m.84(6,3m))f[6];3m=(3m||N).4e(7.11.14||\'*\');k 15=[];18(k i=0,o=3m.o;i<o;i++)h(7.E(6=3m[i]))15.M(m.B(6));f 15},2h:c(){f 7.17}};D.B(1W,{88:c(1q,17){k 2g=Q 1W(17);f 1q.23(2g.E.1x(2g)).1D(m.B)},3Y:c(1q,17,G){h(1u 17==\'31\')G=17,17=1g;f 1W.88(1q,17||\'*\')[G||0]},6F:c(6,89){f 89.1D(c(17){f 17.E(/[^\\s"]+(?:"[^"]*"[^\\s"]+)*/g).2B([12],c(15,2p){k 2g=Q 1W(2p);f 15.2B([],c(1q,J){f 1q.1Q(2g.82(J||6))})})}).6a()}});c $$(){f 1W.6F(N,$A(U))}k O={6w:c(W){$(W).6w();f W},81:c(1q,5p){k 5M=1q.2B({},c(J,6){h(!6.2Z&&6.v){k 1p=6.v,l=$(6).1S();h(l!=1c){h(J[1p]){h(J[1p].3t!=1O)J[1p]=[J[1p]];J[1p].M(l)}1l J[1p]=l}}f J});f 5p?5M:2a.3y(5M)}};O.1s={59:c(W,5p){f O.81(O.3L(W),5p)},3L:c(W){f $A($(W).4e(\'*\')).2B([],c(1q,3e){h(O.m.42[3e.14.20()])1q.M(m.B(3e));f 1q})},ar:c(W,5s,v){W=$(W);k 5u=W.4e(\'2U\');h(!5s&&!v)f $A(5u).1D(m.B);18(k i=0,6g=[],o=5u.o;i<o;i++){k 2U=5u[i];h((5s&&2U.2H!=5s)||(v&&2U.v!=v))5q;6g.M(m.B(2U))}f 6g},7V:c(W){W=$(W);W.3L().T(c(6){6.7Z();6.2Z=\'1k\'});f W},80:c(W){W=$(W);W.3L().T(c(6){6.2Z=\'\'});f W},7S:c(W){f $(W).3L().7T(c(6){f 6.2H!=\'5t\'&&!6.2Z&&[\'2U\',\'23\',\'6u\'].1o(6.14.20())})},as:c(W){W=$(W);W.7S().7Q();f W}};D.B(O,O.1s);O.m={5z:c(6){$(6).5z();f 6},23:c(6){$(6).23();f 6}};O.m.1s={59:c(6){6=$(6);h(!6.2Z&&6.v){k l=6.1S();h(l!=1c){k P={};P[6.v]=l;f 2a.3y(P)}}f\'\'},1S:c(6){6=$(6);k 1C=6.14.20();f O.m.42[1C](6)},7R:c(6){$(6).l=\'\';f 6},at:c(6){f $(6).l!=\'\'},7Q:c(6){6=$(6);6.5z();h(6.23&&(6.14.20()!=\'2U\'||![\'5v\',\'6w\',\'ay\'].1o(6.2H)))6.23();f 6},7V:c(6){6=$(6);6.2Z=1k;f 6},80:c(6){6=$(6);6.7Z();6.2Z=1g;f 6}};D.B(O.m,O.m.1s);k az=O.m;k $F=O.m.1S;O.m.42={2U:c(6){4h(6.2H.20()){1w\'8z\':1w\'8D\':f O.m.42.7X(6);5c:f O.m.42.6u(6)}},7X:c(6){f 6.8e?6.l:12},6u:c(6){f 6.l},23:c(6){f 7[6.2H==\'23-aE\'?\'8f\':\'8x\'](6)},8f:c(6){k G=6.aF;f G>=0?7.6m(6.C[G]):12},8x:c(6){k 1b,o=6.o;h(!o)f 12;18(k i=0,1b=[];i<o;i++){k 3k=6.C[i];h(3k.aD)1b.M(7.6m(3k))}f 1b},6m:c(3k){f m.B(3k).5n(\'l\')?3k.l:3k.2T}};1K.5b=c(){};1K.5b.I={29:c(6,2m,1L){7.2m=2m;7.6=$(6);7.1L=1L;7.2V=7.1S();7.3p()},3p:c(){8v(7.3i.1x(7),7.2m*6k)},3i:c(){k l=7.1S();k 8u=(\'2C\'==1u 7.2V&&\'2C\'==1u l?7.2V!=l:2l(7.2V)!=2l(l));h(8u){7.1L(7.6,l);7.2V=l}}};O.m.5a=1z.1y();O.m.5a.I=D.B(Q 1K.5b(),{1S:c(){f O.m.1S(7.6)}});O.5a=1z.1y();O.5a.I=D.B(Q 1K.5b(),{1S:c(){f O.59(7.6)}});1K.2W=c(){};1K.2W.I={29:c(6,1L){7.6=$(6);7.1L=1L;7.2V=7.1S();h(7.6.14.20()==\'W\')7.8y();1l 7.3p(7.6)},6M:c(){k l=7.1S();h(7.2V!=l){7.1L(7.6,l);7.2V=l}},8y:c(){O.3L(7.6).T(7.3p.1x(7))},3p:c(6){h(6.2H){4h(6.2H.20()){1w\'8z\':1w\'8D\':1t.3Z(6,\'aC\',7.6M.1x(7));1i;5c:1t.3Z(6,\'aA\',7.6M.1x(7));1i}}}};O.m.2W=1z.1y();O.m.2W.I=D.B(Q 1K.2W(),{1S:c(){f O.m.1S(7.6)}});O.2W=1z.1y();O.2W.I=D.B(Q 1K.2W(),{1S:c(){f O.59(7.6)}});h(!1r.1t){k 1t=Q D()}D.B(1t,{aB:8,aW:9,aX:13,bi:27,bj:37,bh:38,bg:39,be:40,bf:46,bk:36,bl:35,bq:33,br:34,6:c(1a){f 1a.2D||1a.bp},bo:c(1a){f(((1a.8n)&&(1a.8n==1))||((1a.5v)&&(1a.5v==1)))},bm:c(1a){f 1a.bn||(1a.bd+(N.5k.3H||N.1N.3H))},bc:c(1a){f 1a.b2||(1a.b3+(N.5k.3K||N.1N.3K))},5D:c(1a){h(1a.8j){1a.8j();1a.b1()}1l{1a.55=1g;1a.b0=1k}},3Y:c(1a,14){k 6=1t.6(1a);1v(6.2n&&(!6.14||(6.14.2e()!=14.2e())))6=6.2n;f 6},2v:1g,8t:c(6,v,2F,2b){h(!7.2v)7.2v=[];h(6.8s){7.2v.M([6,v,2F,2b]);6.8s(v,2F,2b)}1l h(6.6b){7.2v.M([6,v,2F,2b]);6.6b(\'3P\'+v,2F)}},7P:c(){h(!1t.2v)f;18(k i=0,o=1t.2v.o;i<o;i++){1t.5e.2u(7,1t.2v[i]);1t.2v[i][0]=12}1t.2v=1g},3Z:c(6,v,2F,2b){6=$(6);2b=2b||1g;h(v==\'7W\'&&(2f.65.E(/3M|3O|3X/)||6.6b))v=\'7Y\';1t.8t(6,v,2F,2b)},5e:c(6,v,2F,2b){6=$(6);2b=2b||1g;h(v==\'7W\'&&(2f.65.E(/3M|3O|3X/)||6.6c))v=\'7Y\';h(6.7U){6.7U(v,2F,2b)}1l h(6.6c){1R{6.6c(\'3P\'+v,2F)}1Z(e){}}}});h(2f.65.E(/\\aY\\b/))1t.3Z(1r,\'aZ\',1t.7P,1g);k 2M={8a:1g,6Y:c(){7.8d=1r.b4||N.5k.3H||N.1N.3H||0;7.8F=1r.b5||N.5k.3K||N.1N.3K||0},8c:c(6){k 1G=0,1E=0;3A{1G+=6.3K||0;1E+=6.3H||0;6=6.2n}1v(6);f[1E,1G]},4w:c(6){k 1G=0,1E=0;3A{1G+=6.3q||0;1E+=6.3o||0;6=6.2t}1v(6);f[1E,1G]},8W:c(6){k 1G=0,1E=0;3A{1G+=6.3q||0;1E+=6.3o||0;6=6.2t;h(6){h(6.14==\'9d\')1i;k p=m.1H(6,\'1F\');h(p==\'5i\'||p==\'3v\')1i}}1v(6);f[1E,1G]},2t:c(6){h(6.2t)f 6.2t;h(6==N.1N)f 6;1v((6=6.2n)&&6!=N.1N)h(m.1H(6,\'1F\')!=\'61\')f 6;f N.1N},ba:c(6,x,y){h(7.8a)f 7.8b(6,x,y);7.4r=x;7.4o=y;7.1Y=7.4w(6);f(y>=7.1Y[1]&&y<7.1Y[1]+6.3C&&x>=7.1Y[0]&&x<7.1Y[0]+6.3B)},8b:c(6,x,y){k 5W=7.8c(6);7.4r=x+5W[0]-7.8d;7.4o=y+5W[1]-7.8F;7.1Y=7.4w(6);f(7.4o>=7.1Y[1]&&7.4o<7.1Y[1]+6.3C&&7.4r>=7.1Y[0]&&7.4r<7.1Y[0]+6.3B)},bb:c(5j,6){h(!5j)f 0;h(5j==\'b9\')f((7.1Y[1]+6.3C)-7.4o)/6.3C;h(5j==\'b8\')f((7.1Y[0]+6.3B)-7.4r)/6.3B},6U:c(5J){k 1G=0,1E=0;k 6=5J;3A{1G+=6.3q||0;1E+=6.3o||0;h(6.2t==N.1N)h(m.1H(6,\'1F\')==\'3v\')1i}1v(6=6.2t);6=5J;3A{h(!1r.2L||6.14==\'9d\'){1G-=6.3K||0;1E-=6.3H||0}}1v(6=6.2n);f[1E,1G]},4t:c(1A,2D){k C=D.B({8M:1k,8I:1k,92:1k,8U:1k,3q:0,3o:0},U[2]||{});1A=$(1A);k p=2M.6U(1A);2D=$(2D);k 3F=[0,0];k 5f=12;h(m.1H(2D,\'1F\')==\'3v\'){5f=2M.2t(2D);3F=2M.6U(5f)}h(5f==N.1N){3F[0]-=N.1N.3o;3F[1]-=N.1N.3q}h(C.8M)2D.u.1J=(p[0]-3F[0]+C.3o)+\'2i\';h(C.8I)2D.u.1V=(p[1]-3F[1]+C.3q)+\'2i\';h(C.92)2D.u.2s=1A.3B+\'2i\';h(C.8U)2D.u.2w=1A.3C+\'2i\'},b6:c(6){6=$(6);h(6.u.1F==\'3v\')f;2M.6Y();k 6x=2M.8W(6);k 1V=6x[1];k 1J=6x[0];k 2s=6.9b;k 2w=6.8V;6.9f=1J-3x(6.u.1J||0);6.9h=1V-3x(6.u.1V||0);6.8k=6.u.2s;6.8A=6.u.2w;6.u.1F=\'3v\';6.u.1V=1V+\'2i\';6.u.1J=1J+\'2i\';6.u.2s=2s+\'2i\';6.u.2w=2w+\'2i\'},b7:c(6){6=$(6);h(6.u.1F==\'5i\')f;2M.6Y();6.u.1F=\'5i\';k 1V=3x(6.u.1V||0)-(6.9h||0);k 1J=3x(6.u.1J||0)-(6.9f||0);6.u.1V=1V+\'2i\';6.u.1J=1J+\'2i\';6.u.2w=6.8A;6.u.2s=6.8k}};h(/3M|3O|3X/.2O(2f.2I)){2M.4w=c(6){k 1G=0,1E=0;3A{1G+=6.3q||0;1E+=6.3o||0;h(6.2t==N.1N)h(m.1H(6,\'1F\')==\'3v\')1i;6=6.2t}1v(6);f[1E,1G]}}m.8R();',62,770,'||||||element|this|||||function|||return||if|||var|value|Element||length||||||style|name||||||extend|options|Object|match||index||prototype|result||iterator|push|document|Form|pair|new|||each|arguments|object|form||transport|||params|null||tagName|results||expression|for|Ajax|event|values|undefined|attribute|className|div|false|inspect|break|html|true|else|Prototype|property|include|key|elements|window|Methods|Event|typeof|while|case|bind|create|Class|source|node|method|map|valueL|position|valueT|getStyle|Insertion|left|Abstract|callback|clause|body|Array|args|concat|try|getValue|array|url|top|Selector|Enumerable|offset|catch|toLowerCase|container|parts|select|_attributeTranslations|pattern|replacement||onComplete|initialize|Hash|useCapture|in|display|toUpperCase|navigator|selector|toString|px|conditions|replace|String|frequency|parentNode|gsub|expr|range|methods|width|offsetParent|apply|observers|height|stripScripts|toArray|slice|els|inject|string|target|hash|observer|throw|type|userAgent|innerHTML|responder|opera|Position|_each|test|childNodes|json|start|join|text|input|lastValue|EventObserver|fragment|fragments|disabled||number|request||||||||table|tbody|success|headers|child|cache|split|setTimeout|onTimerEvent|classNames|opt|decay|scope|end|offsetLeft|registerCallback|offsetTop|content|readyState|constructor|filter|absolute|emptyFunction|parseFloat|toQueryString|Responders|do|offsetWidth|offsetHeight|exclusive|id|delta|memo|scrollLeft|pos|_overflow|scrollTop|getElements|Konqueror|insertContent|Safari|on|truncation|evalScripts|initializeRange|iterable|timer|template|extras|KHTML|findElement|observe||destination|Serializers|_|nodeValue|first||state|keys|pluck|script|remove|alpha|Request|getElementsByTagName|Template|createElement|switch|responders|count|fillWith|receiver|parameters|response|ycomp|copy|auto|xcomp|dispatchException|clone|post|_flag|cumulativeOffset|strip|parentElement|attributes|adjacency|elementClassName|nextSiblings|reverse|obj|depth|tag|onlyIfAbsent|klass|tr|right|ObjectRange|encodeURIComponent|names|overflow|none|cssFloat|abort|ancestor|hasClassName|nodeType|operator|ClassNames|nextSibling|styleFloat|opacity|firstChild|gi|RegExp|recursivelyCollect|responseText|returnValue|ScriptFragment|setOptions|charAt|serialize|Observer|TimedObserver|default|Base|stopObserving|parent|__method|status|relative|mode|documentElement|currentlyExecuting|dispatch|hasAttribute|evaluate|getHash|continue|asynchronous|typeName|hidden|inputs|button|updater|Updater|len|focus|digits|_reverse|MSIE|stop|update|visible|camelized|selectNodeContents|prepareReplacement|forElement|appendChild|escapedString|data|all|getElementsByClassName|substring|getHeader|query|getDimensions|HTMLElement|Simulated|failure|offsetcache|_madePositioned|findOrStore|eval|exception|static|getTransport|trues|visibility|appVersion|TBODY|TR|toQueryParams|camelize|flatten|attachEvent|detachEvent|_nativeExtensions|shift|removeChild|matchingInputs|before|children|rest|1000|application|optionValue|modifier|criteria|respondToReadyState|activeRequestCount|interpret|9_|readAttribute|textarea|previousSiblings|reset|offsets|Function|last|Version|splitValueBy|mergedHash|_complete|succ|findChildElements|z0|onStateChange|add|classNameToAdd|defaultView|found|onElementEvent|slices|BrowserFeatures|insertBefore|XPath|set|falses|encoding|page|css|Complete|_getAttr|prepare|classNameToRemove|without|XMLHTTP|evalJSON|descendantOf|onException|Events|javascript|register|Content|bottom|evalResponse|onreadystatechange|onCreate|nextNode|contentType|ActiveXObject|setRequestHeaders|scrollTo|capitalize|currentStyle|getComputedStyle|xml|_extended|XMLHttpRequest|get|indexOf|class|outerHTML|hide|show|ancestors|_getElementsByXPath|originalPosition|originalDisplay|PeriodicalUpdater|insertion|originalVisibility|param|updateContent|originalWidth|updateComplete|lastText|Gecko|descendants|overrideMimeType|2005|requestHeaders|float|100|originalHeight|collect|unloadCache|activate|clear|findFirstElement|find|removeEventListener|disable|keypress|inputSelector|keydown|blur|enable|serializeElements|findElements|buildMatchExpression|childOf|compileMatcher|delimiter|wildcard|matchElements|expressions|includeScrollOffsets|withinIncludingScrolloffsets|realOffset|deltaX|checked|selectOne|matchAll|scriptTag|useDoubleQuotes|preventDefault|_originalWidth|matchOne|extractScripts|which|stripTags|separator|decodeURIComponent|Pattern|addEventListener|_observeAndCache|changed|setInterval|eachSlice|selectMany|registerFormCallbacks|checkbox|_originalHeight|stringValue|img|radio|PeriodicalExecuter|deltaY|compact|arrayLength|setTop|times|td|size|setLeft|insertAdjacentHTML|createRange|toggle|Toggle|addMethods|TD|THEAD|setHeight|clientHeight|positionedOffset|Try|these|getAttribute|title|specified|setWidth|getAttributeNode|reduce|readonly|createContextualFragment|ownerDocument|contentFromAnonymousTable|After|collapse|clientWidth|detect|BODY|findAll|_originalLeft|parseExpression|_originalTop|Bottom|empty|Before|collections|Top|inline|lambda|message|escapeHTML|createTextNode|clearInterval|bindAsEventListener|200|scan|RangeError|setRequestHeader|truncate|toColorPart|sub|finally|Number|callee|300|im|max|Loaded|Loading|member|entries|Interactive|pop|open|sort|_method|zip|from|Uninitialized|merge|delete|unregister|Microsoft|www|urlencoded|uniq|call|UTF|sortBy|reject|parseQuery|any|grep|inGroupsOf|Connection|close|fromCharCode|charCodeAt|underscore|dasherize|charset|invoke|partition|send|postBody|instanceof|min|Requested|Accept|Msxml2|With|unescapeHTML|HTMLSelectElement|getInputs|focusFirstElement|present|Unknown|error|setStartAfter|Parse|submit|Field|change|KEY_BACKSPACE|click|selected|one|selectedIndex|afterEnd|Success|TextArea|Select|Input|multiple|href|src|HTML|__proto__|setStartBefore|afterBegin|beforeBegin|HTMLTextAreaElement|HTMLFormElement|HTMLInputElement|KEY_TAB|KEY_RETURN|bMSIE|unload|cancelBubble|stopPropagation|pageY|clientY|pageXOffset|pageYOffset|absolutize|relativize|horizontal|vertical|within|overlap|pointerY|clientX|KEY_DOWN|KEY_DELETE|KEY_RIGHT|KEY_UP|KEY_ESC|KEY_LEFT|KEY_HOME|KEY_END|pointerX|pageX|isLeftClick|srcElement|KEY_PAGEUP|KEY_PAGEDOWN|cssText|beforeEnd|previous|next|longDesc|down|up|previousSibling|siblings|getHeight|getWidth|setStyle|999999|00001|cleanWhitespace|toggleClassName|addClassName|removeClassName|immediateDescendants|replaceChild|JSON|clearTimeout|getElementById|getResponseHeader|ecma|Failure|java|XPathResult|ORDERED_NODE_SNAPSHOT_TYPE|INPUT|TEXTAREA|SELECT|FORM|contains|snapshotLength|snapshotItem|block|getElementsBySelector|datetime|dateTime|accesskey|makePositioned|valign|colSpan|rowspan|rowSpan|accessKey|tabindex|maxLength|readOnly|longdesc|maxlength|encType|tabIndex|enctype|colspan|vAlign|undoPositioned|undoClipping|makeClipping'.split('|'),0,{}))
var FastInit = {
	onload : function() {
		if (FastInit.done) { return; }
		FastInit.done = true;
		for(var x = 0, al = FastInit.f.length; x < al; x++) {
			FastInit.f[x]();
		}
	},
	addOnLoad : function() {
		var a = arguments;
		for(var x = 0, al = a.length; x < al; x++) {
			if(typeof a[x] === 'function') {
				if (FastInit.done ) {
					a[x]();
				} else {
					FastInit.f.push(a[x]);
				}
			}
		}
	},
	listen : function() {
		if (/WebKit|khtml/i.test(navigator.userAgent)) {
			FastInit.timer = setInterval(function() {
				if (/loaded|complete/.test(document.readyState)) {
					clearInterval(FastInit.timer);
					delete FastInit.timer;
					FastInit.onload();
				}}, 10);
		} else if (document.addEventListener) {
			document.addEventListener('DOMContentLoaded', FastInit.onload, false);
		} else if(!FastInit.iew32) {
			if(window.addEventListener) {
				window.addEventListener('load', FastInit.onload, false);
			} else if (window.attachEvent) {
				return window.attachEvent('onload', FastInit.onload);
			}
		}
	},
	f:[],done:false,timer:null,iew32:false
};
/*@cc_on @*/
/*@if (@_win32)
FastInit.iew32 = true;
document.write('<script id="__ie_onload" defer src="' + ((location.protocol == 'https:') ? '//0' : 'javascript:void(0)') + '"><\/script>');
document.getElementById('__ie_onload').onreadystatechange = function(){if (this.readyState == 'complete') { FastInit.onload(); }};
/*@end @*/
FastInit.listen();
// script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007

// Copyright (c) 2005, 2006 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(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
  return element;
}

Element.getOpacity = function(element){
  return $(element).getStyle('opacity');
}

Element.setOpacity = function(element, value){
  return $(element).setStyle({opacity:value});
}

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) { }
};

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

Array.prototype.call = function() {
  var args = arguments;
  this.each(function(f){ f.apply(this, args) });
}

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

var Effect = {
  _elementDoesNotExistError: {
    name: 'ElementDoesNotExistError',
    message: 'The specified DOM element does not exist, but is required for this effect to operate'
  },
  tagifyText: function(element) {
    if(typeof Builder == 'undefined')
      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
      
    var tagifyStyle = 'position:relative';
    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
    
    element = $(element);
    $A(element.childNodes).each( function(child) {
      if(child.nodeType==3) {
        child.nodeValue.toArray().each( function(character) {
          element.insertBefore(
            Builder.node('span',{style: tagifyStyle},
              character == ' ' ? String.fromCharCode(160) : character), 
              child);
        });
        Element.remove(child);
      }
    });
  },
  multiple: function(element, effect) {
    var elements;
    if(((typeof element == 'object') || 
        (typeof element == 'function')) && 
       (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);
  }
};

var Effect2 = Effect; // deprecated

/* ------------- transitions ------------- */

Effect.Transitions = {
  linear: Prototype.K,
  sinoidal: function(pos) {
    return (-Math.cos(pos*Math.PI)/2) + 0.5;
  },
  reverse: function(pos) {
    return 1-pos;
  },
  flicker: function(pos) {
    return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
  },
  wobble: function(pos) {
    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
  },
  pulse: function(pos, pulses) { 
    pulses = pulses || 5; 
    return (
      Math.round((pos % (1/pulses)) * pulses) == 0 ? 
            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
      );
  },
  none: function(pos) {
    return 0;
  },
  full: function(pos) {
    return 1;
  }
};

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

Effect.ScopedQueue = Class.create();
Object.extend(Object.extend(Effect.ScopedQueue.prototype, 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 = (typeof effect.options.queue == 'string') ? 
      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++) 
      if(this.effects[i]) this.effects[i].loop(timePos);
  }
});

Effect.Queues = {
  instances: $H(),
  get: function(queueName) {
    if(typeof queueName != 'string') return queueName;
    
    if(!this.instances[queueName])
      this.instances[queueName] = new Effect.ScopedQueue();
      
    return this.instances[queueName];
  }
}
Effect.Queue = Effect.Queues.get('global');

Effect.DefaultOptions = {
  transition: Effect.Transitions.sinoidal,
  duration:   1.0,   // seconds
  fps:        60.0,  // max. 60fps due to Effect.Queue implementation
  sync:       false, // true for combining
  from:       0.0,
  to:         1.0,
  delay:      0.0,
  queue:      'parallel'
}

Effect.Base = function() {};
Effect.Base.prototype = {
  position: null,
  start: function(options) {
    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.event('beforeStart');
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        '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.finishOn - this.startOn);
      var frame = Math.round(pos * this.options.fps * this.options.duration);
      if(frame > this.currentFrame) {
        this.render(pos);
        this.currentFrame = frame;
      }
    }
  },
  render: function(pos) {
    if(this.state == 'idle') {
      this.state = 'running';
      this.event('beforeSetup');
      if(this.setup) this.setup();
      this.event('afterSetup');
    }
    if(this.state == 'running') {
      if(this.options.transition) pos = this.options.transition(pos);
      pos *= (this.options.to-this.options.from);
      pos += this.options.from;
      this.position = pos;
      this.event('beforeUpdate');
      if(this.update) this.update(pos);
      this.event('afterUpdate');
    }
  },
  cancel: function() {
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        '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(typeof this[property] != 'function') data[property] = this[property];
    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
  }
}

Effect.Parallel = Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
  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.Event = Class.create();
Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
  initialize: function() {
    var options = Object.extend({
      duration: 0
    }, arguments[0] || {});
    this.start(options);
  },
  update: Prototype.emptyFunction
});

Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    // make this work on IE on elements without 'layout'
    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!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();
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
  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() {
    // Bug in Opera: Opera returns the "real" position of a static element or
    // relative element that does not have top/left explicitly set.
    // ==> Always set top and left for position relative elements in your stylesheets 
    // (to 0 if you do not need them) 
    this.element.makePositioned();
    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
    if(this.options.mode == 'absolute') {
      // absolute movement, so we need to calc deltaX and deltaY
      this.options.x = this.options.x - this.originalLeft;
      this.options.y = this.options.y - this.originalTop;
    }
  },
  update: function(position) {
    this.element.setStyle({
      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
      top:  Math.round(this.options.y  * position + this.originalTop)  + '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();
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
  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 = Math.round(width) + 'px';
    if(this.options.scaleY) d.height = Math.round(height) + '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();
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
  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+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
  },
  finish: function() {
    this.element.setStyle(Object.extend(this.oldStyle, {
      backgroundColor: this.options.restorecolor
    }));
  }
});

Effect.ScrollTo = Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    this.start(arguments[1] || {});
  },
  setup: function() {
    Position.prepare();
    var offsets = Position.cumulativeOffset(this.element);
    if(this.options.offset) offsets[1] += this.options.offset;
    var max = window.innerHeight ? 
      window.height - window.innerHeight :
      document.body.scrollHeight - 
        (document.documentElement.clientHeight ? 
          document.documentElement.clientHeight : document.body.clientHeight);
    this.scrollStart = Position.deltaY;
    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
  },
  update: function(position) {
    Position.prepare();
    window.scrollTo(Position.deltaX, 
      this.scrollStart + (position*this.delta));
  }
});

/* ------------- 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 oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left') };
    return new Effect.Move(element, 
      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -20, y: 0, duration: 0.05, 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');
  return new Effect.Scale(element, window.opera ? 0 : 1,
   Object.extend({ scaleContent: false, 
    scaleX: false, 
    scaleMode: 'box',
    scaleFrom: 100,
    restoreAfterFinish: true,
    beforeStartInternal: 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().setStyle({bottom: oldInnerBottom});
      effect.element.down().undoPositioned();
    }
   }, 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] || {};
  var oldOpacity = element.getInlineOpacity();
  var transition = options.transition || Effect.Transitions.sinoidal;
  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
  reverser.bind(transition);
  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();
Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      style: {}
    }, arguments[1] || {});
    if (typeof options.style == 'string') {
      if(options.style.indexOf(':') == -1) {
        var cssText = '', selector = '.' + options.style;
        $A(document.styleSheets).reverse().each(function(styleSheet) {
          if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
          else if (styleSheet.rules) cssRules = styleSheet.rules;
          $A(cssRules).reverse().each(function(rule) {
            if (selector == rule.selectorText) {
              cssText = rule.style.cssText;
              throw $break;
            }
          });
          if (cssText) throw $break;
        });
        this.style = cssText.parseStyle();
        options.afterFinishInternal = function(effect){
          effect.element.addClassName(effect.options.style);
          effect.transforms.each(function(transform) {
            if(transform.style != 'opacity')
              effect.element.style[transform.style.camelize()] = '';
          });
        }
      } else this.style = options.style.parseStyle();
    } else this.style = $H(options.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].underscore().dasherize(), value = pair[1], unit = null;

      if(value.parseColor('#zzzzzz') != '#zzzzzz') {
        value = value.parseColor();
        unit  = 'color';
      } else if(property == 'opacity') {
        value = parseFloat(value);
        if(/MSIE/.test(navigator.userAgent) && !window.opera && (!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 $H({ 
        style: property, 
        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 = $H(), value = null;
    this.transforms.each(function(transform){
      value = transform.unit=='color' ?
        $R(0,2).inject('#',function(m,v,i){
          return m+(Math.round(transform.originalValue[i]+
            (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) : 
        transform.originalValue + Math.round(
          ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
      style[transform.style] = value;
    });
    this.element.setStyle(style);
  }
});

Effect.Transform = Class.create();
Object.extend(Effect.Transform.prototype, {
  initialize: function(tracks){
    this.tracks  = [];
    this.options = arguments[1] || {};
    this.addTracks(tracks);
  },
  addTracks: function(tracks){
    tracks.each(function(track){
      var data = $H(track).values().first();
      this.tracks.push($H({
        ids:     $H(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 elements = [$(track.ids) || $$(track.ids)].flatten();
        return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.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.prototype.parseStyle = function(){
  var element = Element.extend(document.createElement('div'));
  element.innerHTML = '<div style="' + this + '"></div>';
  var style = element.down().style, styleRules = $H();
  
  Element.CSS_PROPERTIES.each(function(property){
    if(style[property]) styleRules[property] = style[property]; 
  });
  if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf('opacity') > -1) {
    styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
  }
  return styleRules;
};

Element.morph = function(element, style) {
  new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
  return element;
};

['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( 
  function(f) { Element.Methods[f] = Element[f]; }
);

Element.Methods.visualEffect = function(element, effect, options) {
  s = effect.gsub(/_/, '-').camelize();
  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
  new Effect[effect_class](element, options);
  return $(element);
};

Element.addMethods();
var proMenu = Class.create();

proMenu.prototype = {
	setOptions: function(options) {
		this.options = {
			vertical: true,
			showEffect: "appear",
			hideEffect: "fade",
			effectDuration: 0.5,
			timeout: 1000
		};
		Object.extend(this.options, options || {});
	},
	initialize : function(mid,options) {
		this.setOptions(options);
		this.mroot = $(mid).getElementsByTagName("ul")[0];
		this.actsub = new Array();
		this.bexit = this.checkout.bindAsEventListener(this);
		this.build();
	},
	build : function(){
		$A(this.mroot.getElementsByTagName("a")).each(function(a){
			a.className="hasub";
			a.sub = false;
			if(s = a.parentNode.getElementsByTagName("ul")[0]){
				s.style.position = "absolute";
				s.style.display = "none";
				a.sub = s;
			}
	    Event.observe(a,'mouseover',this.show.bindAsEventListener(this),false);
	  }.bind(this));
	},
	show : function(evt){
		a = Event.element(evt);
		Event.stop(evt);
		if(this.hide(a) && a.sub){
			this.actsub.push(a);
			//new Effect.Appear(a.sub,{duration:this.options.effectDuration});
			$(a.sub).show();
			$(a.sub).observe('mouseout',this.bexit,false);
			$(a.sub).isIn = true;
		}
	},
	hide : function(a){
		for(i = this.actsub.length - 1; i >= 0; i--){
			if(this.actsub[i].parentNode.parentNode == a.parentNode.parentNode){
				for(j=this.actsub.length -1; j>=i; j--){
					if(this.actsub[j] == a){
						return false;
					}else{
						s = this.actsub.pop().sub;
						s.stopObserving('mouseout',this.bexit,false);
						//new Effect.Fade(s,{duration:this.options.effectDuration});
						$(s).hide();
					}
				}
				break;
			}
		}
		return true;
	},
	checkout : function(evt){
		mX = Event.pointerX(evt);
		mY = Event.pointerY(evt);
		Event.stop(evt);
		for(i = this.actsub.length - 1; i >= 0; i--){
			this.actsub[i].sub.isIn = Position.within(this.actsub[i].sub,mX,mY);
		}
		setTimeout(function(){
			for(i = this.actsub.length - 1; i >= 0; i--){
				if(!this.actsub[i].sub.isIn){
					//new Effect.Fade(this.actsub.pop().sub,{duration:this.options.effectDuration});
					$(this.actsub.pop().sub).hide();
				}else{
					break;
				}
			}
		}.bind(this), this.options.timeout);
	}
//end of class
}

/*----------------------------------------------------------------------------\
|                               Tab Pane 1.02                                 |
|-----------------------------------------------------------------------------|
|                         Created by Erik Arvidsson                           |
|                  (http://webfx.eae.net/contact.html#erik)                   |
|                      For WebFX (http://webfx.eae.net/)                      |
|-----------------------------------------------------------------------------|
|                  Copyright (c) 1998 - 2003 Erik Arvidsson                   |
|-----------------------------------------------------------------------------|
| This software is provided "as is", without warranty of any kind, express or |
| implied, including  but not limited  to the warranties of  merchantability, |
| fitness for a particular purpose and noninfringement. In no event shall the |
| authors or  copyright  holders be  liable for any claim,  damages or  other |
| liability, whether  in an  action of  contract, tort  or otherwise, arising |
| from,  out of  or in  connection with  the software or  the  use  or  other |
| dealings in the software.                                                   |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| This  software is  available under the  three different licenses  mentioned |
| below.  To use this software you must chose, and qualify, for one of those. |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| The WebFX Non-Commercial License          http://webfx.eae.net/license.html |
| Permits  anyone the right to use the  software in a  non-commercial context |
| free of charge.                                                             |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| The WebFX Commercial license           http://webfx.eae.net/commercial.html |
| Permits the  license holder the right to use  the software in a  commercial |
| context. Such license must be specifically obtained, however it's valid for |
| any number of  implementations of the licensed software.                    |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| GPL - The GNU General Public License    http://www.gnu.org/licenses/gpl.txt |
| Permits anyone the right to use and modify the software without limitations |
| as long as proper  credits are given  and the original  and modified source |
| code are included. Requires  that the final product, software derivate from |
| the original  source or any  software  utilizing a GPL  component, such  as |
| this, is also licensed under the GPL license.                               |
|-----------------------------------------------------------------------------|
| 2002-01-?? | First working version                                          |
| 2002-02-17 | Cleaned up for 1.0 public version                              |
| 2003-02-18 | Changed from javascript uri for anchors to return false        |
| 2003-03-03 | Added dispose methods to release IE memory                     |
|-----------------------------------------------------------------------------|
| Dependencies: *.css           a css file to define the layout               |
|-----------------------------------------------------------------------------|
| Created 2002-01-?? | All changes are in the log above. | Updated 2003-03-03 |
\----------------------------------------------------------------------------*/

// This function is used to define if the browser supports the needed
// features
function hasSupport() {

	if (typeof hasSupport.support != "undefined")
		return hasSupport.support;
	
	var ie55 = /msie 5\.[56789]/i.test( navigator.userAgent );
	
	hasSupport.support = ( typeof document.implementation != "undefined" &&
			document.implementation.hasFeature( "html", "1.0" ) || ie55 )
			
	// IE55 has a serious DOM1 bug... Patch it!
	if ( ie55 ) {
		document._getElementsByTagName = document.getElementsByTagName;
		document.getElementsByTagName = function ( sTagName ) {
			if ( sTagName == "*" )
				return document.all;
			else
				return document._getElementsByTagName( sTagName );
		};
	}

	return hasSupport.support;
}

///////////////////////////////////////////////////////////////////////////////////
// The constructor for tab panes
//
// el : HTMLElement		The html element used to represent the tab pane
// bUseCookie : Boolean	Optional. Default is true. Used to determine whether to us
//						persistance using cookies or not
//
function WebFXTabPane( el, bUseCookie ) {
	if ( !hasSupport() || el == null ) return;
	
	this.element = el;
	this.element.tabPane = this;
	this.pages = [];
	this.selectedIndex = null;
	this.useCookie = bUseCookie != null ? bUseCookie : true;
	
	// add class name tag to class name
	this.element.className = this.classNameTag + " " + this.element.className;
	
	// add tab row
	this.tabRow = document.createElement( "div" );
	this.tabRow.className = "tab-row";
	el.insertBefore( this.tabRow, el.firstChild );

	var tabIndex = 0;
	if ( this.useCookie ) {
		tabIndex = Number( WebFXTabPane.getCookie( "webfxtab_" + this.element.id ) );
		if ( isNaN( tabIndex ) )
			tabIndex = 0;
	}
	this.selectedIndex = tabIndex;
	
	// loop through child nodes and add them
	var cs = el.childNodes;
	var n;
	for (var i = 0; i < cs.length; i++) {
		if (cs[i].nodeType == 1 && cs[i].className == "tab-page") {
			this.addTabPage( cs[i] );
		}
	}
}

WebFXTabPane.prototype.classNameTag = "dynamic-tab-pane-control";

WebFXTabPane.prototype.setSelectedIndex = function ( n ) {
	if (this.selectedIndex != n) {
		if (this.selectedIndex != null && this.pages[ this.selectedIndex ] != null )
			this.pages[ this.selectedIndex ].hide();
		this.selectedIndex = n;
		this.pages[ this.selectedIndex ].show();
		
		if ( this.useCookie )
			WebFXTabPane.setCookie( "webfxtab_" + this.element.id, n );	// session cookie
	}
};
	
WebFXTabPane.prototype.getSelectedIndex = function () {
	return this.selectedIndex;
};
	
WebFXTabPane.prototype.addTabPage = function ( oElement ) {
	if ( !hasSupport() ) return;
	
	if ( oElement.tabPage == this )	// already added
		return oElement.tabPage;

	var n = this.pages.length;
	var tp = this.pages[n] = new WebFXTabPage( oElement, this, n );
	tp.tabPane = this;
	
	// move the tab out of the box
	this.tabRow.appendChild( tp.tab );
			
	if ( n == this.selectedIndex )
		tp.show();
	else
		tp.hide();
		
	return tp;
};
	
WebFXTabPane.prototype.dispose = function () {
	this.element.tabPane = null;
	this.element = null;		
	this.tabRow = null;
	
	for (var i = 0; i < this.pages.length; i++) {
		this.pages[i].dispose();
		this.pages[i] = null;
	}
	this.pages = null;
};



// Cookie handling
WebFXTabPane.setCookie = function ( sName, sValue, nDays ) {
	var expires = "";
	if ( nDays ) {
		var d = new Date();
		d.setTime( d.getTime() + nDays * 24 * 60 * 60 * 1000 );
		expires = "; expires=" + d.toGMTString();
	}

	document.cookie = sName + "=" + sValue + expires + "; path=/";
};

WebFXTabPane.getCookie = function (sName) {
	var re = new RegExp( "(\;|^)[^;]*(" + sName + ")\=([^;]*)(;|$)" );
	var res = re.exec( document.cookie );
	return res != null ? res[3] : null;
};

WebFXTabPane.removeCookie = function ( name ) {
	setCookie( name, "", -1 );
};








///////////////////////////////////////////////////////////////////////////////////
// The constructor for tab pages. This one should not be used.
// Use WebFXTabPage.addTabPage instead
//
// el : HTMLElement			The html element used to represent the tab pane
// tabPane : WebFXTabPane	The parent tab pane
// nindex :	Number			The index of the page in the parent pane page array
//
function WebFXTabPage( el, tabPane, nIndex ) {
	if ( !hasSupport() || el == null ) return;
	
	this.element = el;
	this.element.tabPage = this;
	this.index = nIndex;
	
	var cs = el.childNodes;
	for (var i = 0; i < cs.length; i++) {
		if (cs[i].nodeType == 1 && cs[i].className == "tab") {
			this.tab = cs[i];
			break;
		}
	}
	
	// insert a tag around content to support keyboard navigation
	
	
	var a = document.createElement( "A" );
	this.aElement = a;
	a.href = "#";
	a.onclick = function () { return false; };
	while ( this.tab.hasChildNodes() )
		a.appendChild( this.tab.firstChild );
	this.tab.appendChild( a );

	
	// hook up events, using DOM0
	var oThis = this;
	this.tab.onclick = function () { oThis.select(); };
	this.tab.onmouseover = function () { WebFXTabPage.tabOver( oThis ); };
	this.tab.onmouseout = function () { WebFXTabPage.tabOut( oThis ); };
}

WebFXTabPage.prototype.show = function () {
	var el = this.tab;
	var s = el.className + " selected";
	s = s.replace(/ +/g, " ");
	el.className = s;
	
	this.element.style.display = "block";
};

WebFXTabPage.prototype.hide = function () {
	var el = this.tab;
	var s = el.className;
	s = s.replace(/ selected/g, "");
	el.className = s;

	this.element.style.display = "none";
};
	
WebFXTabPage.prototype.select = function () {
	this.tabPane.setSelectedIndex( this.index );
};
	
WebFXTabPage.prototype.dispose = function () {
	this.aElement.onclick = null;
	this.aElement = null;
	this.element.tabPage = null;
	this.tab.onclick = null;
	this.tab.onmouseover = null;
	this.tab.onmouseout = null;
	this.tab = null;
	this.tabPane = null;
	this.element = null;
};

WebFXTabPage.tabOver = function ( tabpage ) {
	var el = tabpage.tab;
	var s = el.className + " hover";
	s = s.replace(/ +/g, " ");
	el.className = s;
};

WebFXTabPage.tabOut = function ( tabpage ) {
	var el = tabpage.tab;
	var s = el.className;
	s = s.replace(/ hover/g, "");
	el.className = s;
};


// This function initializes all uninitialized tab panes and tab pages
function setupAllTabs() {
	if ( !hasSupport() ) return;

	var all = document.getElementsByTagName( "*" );
	var l = all.length;
	var tabPaneRe = /tab\-pane/;
	var tabPageRe = /tab\-page/;
	var cn, el;
	var parentTabPane;
	
	for ( var i = 0; i < l; i++ ) {
		el = all[i]
		cn = el.className;

		// no className
		if ( cn == "" ) continue;
		
		// uninitiated tab pane
		if ( tabPaneRe.test( cn ) && !el.tabPane )
			new WebFXTabPane( el );
	
		// unitiated tab page wit a valid tab pane parent
		else if ( tabPageRe.test( cn ) && !el.tabPage &&
					tabPaneRe.test( el.parentNode.className ) ) {
			el.parentNode.tabPane.addTabPage( el );			
		}
	}
}

function disposeAllTabs() {
	if ( !hasSupport() ) return;
	
	var all = document.getElementsByTagName( "*" );
	var l = all.length;
	var tabPaneRe = /tab\-pane/;
	var cn, el;
	var tabPanes = [];
	
	for ( var i = 0; i < l; i++ ) {
		el = all[i]
		cn = el.className;

		// no className
		if ( cn == "" ) continue;
		
		// tab pane
		if ( tabPaneRe.test( cn ) && el.tabPane )
			tabPanes[tabPanes.length] = el.tabPane;
	}
	
	for (var i = tabPanes.length - 1; i >= 0; i--) {
		tabPanes[i].dispose();
		tabPanes[i] = null;
	}
}

/*
// initialization hook up

// DOM2
if ( typeof window.addEventListener != "undefined" )
	window.addEventListener( "load", setupAllTabs, false );

// IE 
else if ( typeof window.attachEvent != "undefined" ) {
	window.attachEvent( "onload", setupAllTabs );
	window.attachEvent( "onunload", disposeAllTabs );
}

else {
	if ( window.onload != null ) {
		var oldOnload = window.onload;
		window.onload = function ( e ) {
			oldOnload( e );
			setupAllTabs();
		};
	}
	else 
		window.onload = setupAllTabs;
}
*/
if ( typeof window.attachEvent != "undefined" ) {
	window.attachEvent( "onunload", disposeAllTabs );
}
