Index: /trunk/prototype/plugins/jquery.cycle/jquery.cycle.js
===================================================================
--- /trunk/prototype/plugins/jquery.cycle/jquery.cycle.js	(revision 7843)
+++ /trunk/prototype/plugins/jquery.cycle/jquery.cycle.js	(revision 7843)
@@ -0,0 +1,10 @@
+/*
+ * jQuery Cycle Plugin (with Transition Definitions)
+ * Examples and documentation at: http://malsup.com/jquery/cycle/
+ * Copyright (c) 2007-2008 M. Alsup
+ * Version: 2.30 (02-NOV-2008)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ */
+;eval(function(p,a,c,k,e,r){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--)r[e(c)]=k[c]||e(c);k=[function(e){return r[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}(';(4($){8 q=\'2.30\';8 r=$.25.26&&/37 6.0/.1u(38.39);4 1n(){7(27.28&&27.28.1n)27.28.1n(\'[B] \'+3a.3b.3c.3d(2x,\'\'))};$.E.B=4(n){8 o=2x[1];O x.1s(4(){7(n===3e||n===P)n={};7(n.29==2y){3f(n){2a\'3g\':7(x.S)1v(x.S);x.S=0;$(x).1F(\'B.1M\',\'\');O;2a\'2b\':x.1g=1;O;2a\'2z\':x.1g=0;7(o===2c){n=$(x).1F(\'B.1M\');7(!n){1n(\'2A 1o 2B, 2C 1o 2z\');O}7(x.S){1v(x.S);x.S=0}1j(n.1N,n,1,1)}O;3h:n={1p:n}}}Q 7(n.29==3i){8 d=n;n=$(x).1F(\'B.1M\');7(!n){1n(\'2A 1o 2B, 2C 1o 1O 2D\');O}7(d<0||d>=n.1N.L){1n(\'3j 2D 1G: \'+d);O}n.N=d;7(x.S){1v(x.S);x.S=0}1j(n.1N,n,1,d>=n.1b);O}7(x.S)1v(x.S);x.S=0;x.1g=0;8 e=$(x);8 f=n.2d?$(n.2d,x):e.3k();8 g=f.3l();7(g.L<2){1n(\'3m; 3n 3o 3p: \'+g.L);O}8 h=$.3q({},$.E.B.2E,n||{},$.2F?e.2F():$.3r?e.1F():{});7(h.2e)h.2f=h.2g||g.L;e.1F(\'B.1M\',h);h.1w=x;h.1N=g;h.H=h.H?[h.H]:[];h.1k=h.1k?[h.1k]:[];h.1k.1P(4(){h.2h=0});7(h.1x)h.1k.J(4(){1j(g,h,0,!h.1y)});7(r&&h.1Q&&!h.2G)2i(f);8 j=x.3s;h.D=T((j.1H(/w:(\\d+)/)||[])[1])||h.D;h.C=T((j.1H(/h:(\\d+)/)||[])[1])||h.C;h.W=T((j.1H(/t:(\\d+)/)||[])[1])||h.W;7(e.u(\'1R\')==\'3t\')e.u(\'1R\',\'3u\');7(h.D)e.D(h.D);7(h.C&&h.C!=\'1S\')e.C(h.C);7(h.18)h.18=T(h.18);7(h.1l){h.1q=[];1I(8 i=0;i<g.L;i++)h.1q.J(i);h.1q.3v(4(a,b){O 3w.1l()-0.5});h.Z=0;h.18=h.1q[0]}Q 7(h.18>=g.L)h.18=0;8 k=h.18||0;f.u({1R:\'2H\',y:0,9:0}).U().1s(4(i){8 z=k?i>=k?g.L-(i-k):k-i:g.L-i;$(x).u(\'z-1G\',z)});$(g[k]).u(\'1h\',1).V();7($.25.26)g[k].2I.2J(\'2j\');7(h.1m&&h.D)f.D(h.D);7(h.1m&&h.C&&h.C!=\'1S\')f.C(h.C);7(h.2b)e.2K(4(){x.1g=1},4(){x.1g=0});8 l=$.E.B.M[h.1p];7($.2L(l))l(e,f,h);Q 7(h.1p!=\'2k\')1n(\'3x 3y: \'+h.1p);f.1s(4(){8 a=$(x);x.11=(h.1m&&h.C)?h.C:a.C();x.12=(h.1m&&h.D)?h.D:a.D()});h.A=h.A||{};h.I=h.I||{};h.G=h.G||{};f.1o(\':2l(\'+k+\')\').u(h.A);7(h.1f)$(f[k]).u(h.1f);7(h.W){h.W=T(h.W);7(h.19.29==2y)h.19=$.1p.3z[h.19]||T(h.19);7(!h.1T)h.19=h.19/2;3A((h.W-h.19)<3B)h.W+=h.19}7(h.2m)h.1U=h.1V=h.2m;7(!h.1z)h.1z=h.19;7(!h.1J)h.1J=h.19;h.2M=g.L;h.1b=k;7(h.1l){h.N=h.1b;7(++h.Z==g.L)h.Z=0;h.N=h.1q[h.Z]}Q h.N=h.18>=(g.L-1)?0:h.18+1;8 m=f[k];7(h.H.L)h.H[0].1W(m,[m,m,h,2c]);7(h.1k.L>1)h.1k[1].1W(m,[m,m,h,2c]);7(h.1K&&!h.1a)h.1a=h.1K;7(h.1a)$(h.1a).2n(\'1K\',4(){O 1O(g,h,h.1y?-1:1)});7(h.2o)$(h.2o).2n(\'1K\',4(){O 1O(g,h,h.1y?1:-1)});7(h.1r)2N(g,h);h.3C=4(a,b){8 c=$(a),s=c[0];7(!h.2g)h.2f++;g[b?\'1P\':\'J\'](s);7(h.1c)h.1c[b?\'1P\':\'J\'](s);h.2M=g.L;c.u(\'1R\',\'2H\');c[b?\'3D\':\'2O\'](e);7(b){h.1b++;h.N++}7(r&&h.1Q&&!h.2G)2i(c);7(h.1m&&h.D)c.D(h.D);7(h.1m&&h.C&&h.C!=\'1S\')f.C(h.C);s.11=(h.1m&&h.C)?h.C:c.C();s.12=(h.1m&&h.D)?h.D:c.D();c.u(h.A);7(h.1r)$.E.B.2p(g.L-1,s,$(h.1r),g,h);7(1X h.X==\'4\')h.X(c)};7(h.W||h.1x)x.S=1Y(4(){1j(g,h,0,!h.1y)},h.1x?10:h.W+(h.2P||0))})};4 1j(a,b,c,d){7(b.2h)O;8 p=b.1w,1A=a[b.1b],1a=a[b.N];7(p.S===0&&!c)O;7(!c&&!p.1g&&((b.2e&&(--b.2f<=0))||(b.1Z&&!b.1l&&b.N<b.1b))){7(b.2q)b.2q(b);O}7(c||!p.1g){7(b.H.L)$.1s(b.H,4(i,o){o.1W(1a,[1A,1a,b,d])});8 e=4(){7($.25.26&&b.1Q)x.2I.2J(\'2j\');$.1s(b.1k,4(i,o){o.1W(1a,[1A,1a,b,d])})};7(b.N!=b.1b){b.2h=1;7(b.20)b.20(1A,1a,b,e,d);Q 7($.2L($.E.B[b.1p]))$.E.B[b.1p](1A,1a,b,e);Q $.E.B.2k(1A,1a,b,e,c&&b.2Q)}7(b.1l){b.1b=b.N;7(++b.Z==a.L)b.Z=0;b.N=b.1q[b.Z]}Q{8 f=(b.N+1)==a.L;b.N=f?0:b.N+1;b.1b=f?a.L-1:b.N-1}7(b.1r)$.E.B.2r(b.1r,b.1b)}7(b.W&&!b.1x)p.S=1Y(4(){1j(a,b,0,!b.1y)},b.W);Q 7(b.1x&&p.1g)p.S=1Y(4(){1j(a,b,0,!b.1y)},10)};$.E.B.2r=4(a,b){$(a).3E(\'a\').3F(\'2R\').2j(\'a:2l(\'+b+\')\').3G(\'2R\')};4 1O(a,b,c){8 p=b.1w,W=p.S;7(W){1v(W);p.S=0}7(b.1l&&c<0){b.Z--;7(--b.Z==-2)b.Z=a.L-2;Q 7(b.Z==-1)b.Z=a.L-1;b.N=b.1q[b.Z]}Q 7(b.1l){7(++b.Z==a.L)b.Z=0;b.N=b.1q[b.Z]}Q{b.N=b.1b+c;7(b.N<0){7(b.1Z)O 21;b.N=a.L-1}Q 7(b.N>=a.L){7(b.1Z)O 21;b.N=0}}7(b.22&&1X b.22==\'4\')b.22(c>0,b.N,a[b.N]);1j(a,b,1,c>=0);O 21};4 2N(a,b){8 c=$(b.1r);$.1s(a,4(i,o){$.E.B.2p(i,o,c,a,b)});$.E.B.2r(b.1r,b.18)};$.E.B.2p=4(i,a,b,c,d){8 e=(1X d.2s==\'4\')?$(d.2s(i,a)):$(\'<a 3H="#">\'+(i+1)+\'</a>\');7(e.3I(\'3J\').L==0)e.2O(b);e.2n(d.2S,4(){d.N=i;8 p=d.1w,W=p.S;7(W){1v(W);p.S=0}7(1X d.2t==\'4\')d.2t(d.N,c[d.N]);1j(c,d,1,d.1b<i);O 21});7(d.2T)e.2K(4(){d.1w.1g=1},4(){d.1w.1g=0})};4 2i(b){4 23(s){8 s=T(s).3K(16);O s.L<2?\'0\'+s:s};4 2U(e){1I(;e&&e.3L.3M()!=\'3N\';e=e.3O){8 v=$.u(e,\'2V-2W\');7(v.3P(\'3Q\')>=0){8 a=v.1H(/\\d+/g);O\'#\'+23(a[0])+23(a[1])+23(a[2])}7(v&&v!=\'3R\')O v}O\'#3S\'};b.1s(4(){$(x).u(\'2V-2W\',2U(x))})};$.E.B.2k=4(a,b,c,d,e){8 f=$(a),$n=$(b);$n.u(c.A);8 g=e?1:c.1z;8 h=e?1:c.1J;8 i=e?P:c.1U;8 j=e?P:c.1V;8 k=4(){$n.24(c.I,g,i,d)};f.24(c.G,h,j,4(){7(c.K)f.u(c.K);7(!c.1T)k()});7(c.1T)k()};$.E.B.M={2X:4(b,c,d){c.1o(\':2l(\'+d.18+\')\').u(\'1h\',0);d.H.J(4(){$(x).V()});d.I={1h:1};d.G={1h:0};d.A={1h:0};d.K={R:\'Y\'};d.X=4(a){a.U()}}};$.E.B.3T=4(){O q};$.E.B.2E={1p:\'2X\',W:3U,1x:0,19:3V,1z:P,1J:P,1a:P,2o:P,22:P,1r:P,2t:P,2S:\'1K\',2s:P,H:P,1k:P,2q:P,2m:P,1U:P,1V:P,1L:P,I:P,G:P,A:P,K:P,20:P,C:\'1S\',18:0,1T:1,1l:0,1m:0,2b:0,2T:0,2e:0,2g:0,2P:0,2d:P,1Q:0,1Z:0,2Q:0}})(2Y);(4($){$.E.B.M.3W=4(d,e,f){d.u(\'17\',\'1d\');f.H.J(4(a,b,c){$(x).V();c.A.y=b.1B;c.G.y=0-a.1B});f.1f={y:0};f.I={y:0};f.K={R:\'Y\'}};$.E.B.M.3X=4(d,e,f){d.u(\'17\',\'1d\');f.H.J(4(a,b,c){$(x).V();c.A.y=0-b.1B;c.G.y=a.1B});f.1f={y:0};f.I={y:0};f.K={R:\'Y\'}};$.E.B.M.3Y=4(d,e,f){d.u(\'17\',\'1d\');f.H.J(4(a,b,c){$(x).V();c.A.9=b.1C;c.G.9=0-a.1C});f.1f={9:0};f.I={9:0}};$.E.B.M.3Z=4(d,e,f){d.u(\'17\',\'1d\');f.H.J(4(a,b,c){$(x).V();c.A.9=0-b.1C;c.G.9=a.1C});f.1f={9:0};f.I={9:0}};$.E.B.M.40=4(f,g,h){f.u(\'17\',\'1d\').D();h.H.J(4(a,b,c,d){$(x).V();8 e=a.1C,2u=b.1C;c.A=d?{9:2u}:{9:-2u};c.I.9=0;c.G.9=d?-e:e;g.1o(a).u(c.A)});h.1f={9:0};h.K={R:\'Y\'}};$.E.B.M.41=4(f,g,h){f.u(\'17\',\'1d\');h.H.J(4(a,b,c,d){$(x).V();8 e=a.1B,2v=b.1B;c.A=d?{y:-2v}:{y:2v};c.I.y=0;c.G.y=d?e:-e;g.1o(a).u(c.A)});h.1f={y:0};h.K={R:\'Y\'}};$.E.B.M.42=4(d,e,f){f.H.J(4(a,b,c){$(a).u(\'F\',1)});f.X=4(a){a.U()};f.A={F:2};f.I={D:\'V\'};f.G={D:\'U\'}};$.E.B.M.43=4(d,e,f){f.H.J(4(a,b,c){$(a).u(\'F\',1)});f.X=4(a){a.U()};f.A={F:2};f.I={C:\'V\'};f.G={C:\'U\'}};$.E.B.M.1L=4(g,h,j){8 w=g.u(\'17\',\'2Z\').D();h.u({9:0,y:0});j.H.J(4(){$(x).V()});j.19=j.19/2;j.1l=0;j.1L=j.1L||{9:-w,y:15};j.1c=[];1I(8 i=0;i<h.L;i++)j.1c.J(h[i]);1I(8 i=0;i<j.18;i++)j.1c.J(j.1c.31());j.20=4(a,b,c,d,e){8 f=e?$(a):$(b);f.24(c.1L,c.1z,c.1U,4(){e?c.1c.J(c.1c.31()):c.1c.1P(c.1c.44());7(e)1I(8 i=0,2w=c.1c.L;i<2w;i++)$(c.1c[i]).u(\'z-1G\',2w-i);Q{8 z=$(a).u(\'z-1G\');f.u(\'z-1G\',T(z)+1)}f.24({9:0,y:0},c.1J,c.1V,4(){$(e?x:a).U();7(d)d()})})};j.X=4(a){a.U()}};$.E.B.M.45=4(d,e,f){f.H.J(4(a,b,c){$(x).V();c.A.y=b.11;c.I.C=b.11});f.X=4(a){a.U()};f.1f={y:0};f.A={C:0};f.I={y:0};f.G={C:0};f.K={R:\'Y\'}};$.E.B.M.46=4(d,e,f){f.H.J(4(a,b,c){$(x).V();c.I.C=b.11;c.G.y=a.11});f.X=4(a){a.U()};f.1f={y:0};f.A={y:0,C:0};f.G={C:0};f.K={R:\'Y\'}};$.E.B.M.47=4(d,e,f){f.H.J(4(a,b,c){$(x).V();c.A.9=b.12;c.I.D=b.12});f.X=4(a){a.U()};f.A={D:0};f.I={9:0};f.G={D:0};f.K={R:\'Y\'}};$.E.B.M.48=4(d,e,f){f.H.J(4(a,b,c){$(x).V();c.I.D=b.12;c.G.9=a.12});f.X=4(a){a.U()};f.A={9:0,D:0};f.I={9:0};f.G={D:0};f.K={R:\'Y\'}};$.E.B.M.32=4(d,e,f){f.1f={y:0,9:0};f.K={R:\'Y\'};f.H.J(4(a,b,c){$(x).V();c.A={D:0,C:0,y:b.11/2,9:b.12/2};c.K={R:\'Y\'};c.I={y:0,9:0,D:b.12,C:b.11};c.G={D:0,C:0,y:a.11/2,9:a.12/2};$(a).u(\'F\',2);$(b).u(\'F\',1)});f.X=4(a){a.U()}};$.E.B.M.49=4(d,e,f){f.H.J(4(a,b,c){c.A={D:0,C:0,1h:1,9:b.12/2,y:b.11/2,F:1};c.I={y:0,9:0,D:b.12,C:b.11}});f.G={1h:0};f.K={F:0}};$.E.B.M.4a=4(d,e,f){8 w=d.u(\'17\',\'1d\').D();e.V();f.H.J(4(a,b,c){$(a).u(\'F\',1)});f.A={9:w,F:2};f.K={F:1};f.I={9:0};f.G={9:w}};$.E.B.M.4b=4(d,e,f){8 h=d.u(\'17\',\'1d\').C();e.V();f.H.J(4(a,b,c){$(a).u(\'F\',1)});f.A={y:h,F:2};f.K={F:1};f.I={y:0};f.G={y:h}};$.E.B.M.4c=4(d,e,f){8 h=d.u(\'17\',\'1d\').C();8 w=d.D();e.V();f.H.J(4(a,b,c){$(a).u(\'F\',1)});f.A={y:h,9:w,F:2};f.K={F:1};f.I={y:0,9:0};f.G={y:h,9:w}};$.E.B.M.4d=4(d,e,f){f.H.J(4(a,b,c){c.A={9:x.12/2,D:0,F:2};c.I={9:0,D:x.12};c.G={9:0};$(a).u(\'F\',1)});f.X=4(a){a.U().u(\'F\',1)}};$.E.B.M.4e=4(d,e,f){f.H.J(4(a,b,c){c.A={y:x.11/2,C:0,F:2};c.I={y:0,C:x.11};c.G={y:0};$(a).u(\'F\',1)});f.X=4(a){a.U().u(\'F\',1)}};$.E.B.M.4f=4(d,e,f){f.H.J(4(a,b,c){c.A={9:b.12/2,D:0,F:1,R:\'1D\'};c.I={9:0,D:x.12};c.G={9:a.12/2,D:0};$(a).u(\'F\',2)});f.X=4(a){a.U()};f.K={F:1,R:\'Y\'}};$.E.B.M.4g=4(d,e,f){f.H.J(4(a,b,c){c.A={y:b.11/2,C:0,F:1,R:\'1D\'};c.I={y:0,C:x.11};c.G={y:a.11/2,C:0};$(a).u(\'F\',2)});f.X=4(a){a.U()};f.K={F:1,R:\'Y\'}};$.E.B.M.4h=4(e,f,g){8 d=g.33||\'9\';8 w=e.u(\'17\',\'1d\').D();8 h=e.C();g.H.J(4(a,b,c){c.A=c.A||{};c.A.F=2;c.A.R=\'1D\';7(d==\'34\')c.A.9=-w;Q 7(d==\'35\')c.A.y=h;Q 7(d==\'36\')c.A.y=-h;Q c.A.9=w;$(a).u(\'F\',1)});7(!g.I)g.I={9:0,y:0};7(!g.G)g.G={9:0,y:0};g.K=g.K||{};g.K.F=2;g.K.R=\'Y\'};$.E.B.M.4i=4(e,f,g){8 d=g.33||\'9\';8 w=e.u(\'17\',\'1d\').D();8 h=e.C();g.H.J(4(a,b,c){c.A.R=\'1D\';7(d==\'34\')c.G.9=w;Q 7(d==\'35\')c.G.y=-h;Q 7(d==\'36\')c.G.y=h;Q c.G.9=-w;$(a).u(\'F\',2);$(b).u(\'F\',1)});g.X=4(a){a.U()};7(!g.I)g.I={9:0,y:0};g.A=g.A||{};g.A.y=0;g.A.9=0;g.K=g.K||{};g.K.F=1;g.K.R=\'Y\'};$.E.B.M.4j=4(d,e,f){8 w=d.u(\'17\',\'2Z\').D();8 h=d.C();f.H.J(4(a,b,c){$(a).u(\'F\',2);c.A.R=\'1D\';7(!c.G.9&&!c.G.y)c.G={9:w*2,y:-h/2,1h:0};Q c.G.1h=0});f.X=4(a){a.U()};f.A={9:0,y:0,F:1,1h:1};f.I={9:0};f.K={F:2,R:\'Y\'}};$.E.B.M.4k=4(o,p,q){8 w=o.u(\'17\',\'1d\').D();8 h=o.C();q.A=q.A||{};8 s;7(q.1i){7(/4l/.1u(q.1i))s=\'1t(1e 1e \'+h+\'14 1e)\';Q 7(/4m/.1u(q.1i))s=\'1t(1e \'+w+\'14 \'+h+\'14 \'+w+\'14)\';Q 7(/4n/.1u(q.1i))s=\'1t(1e \'+w+\'14 1e 1e)\';Q 7(/4o/.1u(q.1i))s=\'1t(\'+h+\'14 \'+w+\'14 \'+h+\'14 1e)\';Q 7(/32/.1u(q.1i)){8 t=T(h/2);8 l=T(w/2);s=\'1t(\'+t+\'14 \'+l+\'14 \'+t+\'14 \'+l+\'14)\'}}q.A.1i=q.A.1i||s||\'1t(1e 1e 1e 1e)\';8 d=q.A.1i.1H(/(\\d+)/g);8 t=T(d[0]),r=T(d[1]),b=T(d[2]),l=T(d[3]);q.H.J(4(g,i,j){7(g==i)O;8 k=$(g).u(\'F\',2);8 m=$(i).u({F:3,R:\'1D\'});8 n=1,1E=T((j.1z/13))-1;4 f(){8 a=t?t-T(n*(t/1E)):0;8 c=l?l-T(n*(l/1E)):0;8 d=b<h?b+T(n*((h-b)/1E||1)):h;8 e=r<w?r+T(n*((w-r)/1E||1)):w;m.u({1i:\'1t(\'+a+\'14 \'+e+\'14 \'+d+\'14 \'+c+\'14)\'});(n++<=1E)?1Y(f,13):k.u(\'R\',\'Y\')}f()});q.K={};q.I={9:0};q.G={9:0}}})(2Y);',62,273,'||||function|||if|var|left|||||||||||||||||||||css|||this|top||cssBefore|cycle|height|width|fn|zIndex|animOut|before|animIn|push|cssAfter|length|transitions|nextSlide|return|null|else|display|cycleTimeout|parseInt|hide|show|timeout|onAddSlide|none|randomIndex||cycleH|cycleW||px|||overflow|startingSlide|speed|next|currSlide|els|hidden|0px|cssFirst|cyclePause|opacity|clip|go|after|random|fit|log|not|fx|randomMap|pager|each|rect|test|clearTimeout|container|continuous|rev|speedIn|curr|offsetHeight|offsetWidth|block|count|data|index|match|for|speedOut|click|shuffle|opts|elements|advance|unshift|cleartype|position|auto|sync|easeIn|easeOut|apply|typeof|setTimeout|nowrap|fxFn|false|prevNextClick|hex|animate|browser|msie|window|console|constructor|case|pause|true|slideExpr|autostop|countdown|autostopCount|busy|clearTypeFix|filter|custom|eq|easing|bind|prev|createPagerAnchor|end|updateActivePagerLink|pagerAnchorBuilder|pagerClick|nextW|nextH|len|arguments|String|resume|options|found|can|slide|defaults|metadata|cleartypeNoBg|absolute|style|removeAttribute|hover|isFunction|slideCount|buildPager|appendTo|delay|fastOnEvent|activeSlide|pagerEvent|pauseOnPagerHover|getBg|background|color|fade|jQuery|visible||shift|zoom|direction|right|up|down|MSIE|navigator|userAgent|Array|prototype|join|call|undefined|switch|stop|default|Number|invalid|children|get|terminating|too|few|slides|extend|meta|className|static|relative|sort|Math|unknown|transition|speeds|while|250|addSlide|prependTo|find|removeClass|addClass|href|parents|body|toString|nodeName|toLowerCase|html|parentNode|indexOf|rgb|transparent|ffffff|ver|4000|1000|scrollUp|scrollDown|scrollLeft|scrollRight|scrollHorz|scrollVert|slideX|slideY|pop|turnUp|turnDown|turnLeft|turnRight|fadeZoom|blindX|blindY|blindZ|growX|growY|curtainX|curtainY|cover|uncover|toss|wipe|l2r|r2l|t2b|b2t'.split('|'),0,{}));
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-it.js
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-it.js	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-it.js	(revision 7843)
@@ -0,0 +1,21 @@
+﻿/* http://keith-wood.name/keypad.html
+   Italian initialisation for the jQuery keypad extension
+   Written by Francesco Strappini (www.strx.it). */
+(function($) { // hide the namespace
+	$.keypad.regional['it'] = {
+		buttonText: '...', buttonStatus: 'Visualizza Tastiera',
+		closeText: 'Chiudi', closeStatus: 'Nascondi Tastiera',
+		clearText: 'Pulisci', clearStatus: 'Elimina il Testo',
+		backText: 'Del', backStatus: 'Elimina l\'ultimo carattere',
+		shiftText: 'Shift', shiftStatus: 'Maiuscole/Minuscole',
+		spacebarText: '&nbsp;', spacebarStatus: '',
+		enterText: 'Enter', enterStatus: 'Ritorno a Capo',
+		tabText: '→', tabStatus: '',
+		alphabeticLayout: $.keypad.qwertyAlphabetic,
+		fullLayout: $.keypad.qwertyLayout,
+		isAlphabetic: $.keypad.isAlphabetic,
+		isNumeric: $.keypad.isNumeric,
+		toUpper: $.keypad.toUpper,
+		isRTL: false};
+	$.keypad.setDefaults($.keypad.regional['it']);
+})(jQuery);
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad.alt.css
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad.alt.css	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad.alt.css	(revision 7843)
@@ -0,0 +1,106 @@
+/* Alternate style sheet for jQuery Keypad v1.5.0. */
+button.keypad-trigger {
+	width: 25px;
+	padding: 0px;
+}
+img.keypad-trigger {
+	margin: 2px;
+	vertical-align: middle;
+}
+.keypad-popup, .keypad-inline, .keypad-key, .keypad-special {
+	font-family: Arial,Helvetica,sans-serif;
+	font-size: 14px;
+}
+.keypad-popup {
+	display: none;
+	z-index: 10;
+	margin: 0;
+	padding: 0;
+	background-color: #fff;
+	color: #000;
+	border: 1px solid #888;
+	border-radius: 0.25em;
+	-moz-border-radius: 0.25em;
+	-webkit-border-radius: 0.25em;
+}
+.keypad-keyentry {
+	display: none;
+}
+.keypad-inline {
+	background-color: #fff;
+	border: 1px solid #888;
+	border-radius: 0.25em;
+	-moz-border-radius: 0.25em;
+	-webkit-border-radius: 0.25em;
+}
+.keypad-disabled {
+	position: absolute;
+	z-index: 100;
+	background-color: white;
+	opacity: 0.25;
+	filter: alpha(opacity=25);
+}
+.keypad-rtl {
+	direction: rtl;
+}
+.keypad-prompt {
+	clear: both;
+	text-align: center;
+}
+.keypad-prompt.ui-widget-header {
+	margin: 0.125em;
+}
+.keypad-row {
+	clear: both;
+	float: left;
+	width: 100%;
+}
+.keypad-space {
+	float: left;
+	margin: 0.125em;
+	width: 2em;
+}
+* html .keypad-space { /* IE6 */
+	margin: 0em;
+	width: 2.25em;
+}
+.keypad-half-space {
+	float: left;
+	margin: 0.125em 0.0625em;
+	width: 1em;
+}
+* html .keypad-half-space { /* IE6 */
+	margin: 0em;
+	width: 1.125em;
+}
+.keypad-key, .keypad-special {
+	float: left;
+	margin: 0.125em;
+	padding: 0em;
+	width: 2em;
+	text-align: center;
+	cursor: pointer;
+}
+.keypad-special {
+	width: 4.25em;
+}
+.keypad-spacebar {
+	width: 13.25em;
+}
+.keypad-tab {
+	width: 2em;
+}
+.keypad-clear, .keypad-back, .keypad-close, .keypad-shift {
+	font-weight: bold;
+}
+.keypad-cover {
+	display: none;
+	display/**/: block;
+	position: absolute;
+	z-index: -1;
+	filter: mask();
+	top: -4px;
+	left: -4px;
+	width: 125px;
+	height: 200px;
+}
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad.css
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad.css	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad.css	(revision 7843)
@@ -0,0 +1,128 @@
+/* Main style sheet for jQuery Keypad v1.5.0. */
+button.keypad-trigger {
+	width: 25px;
+	padding: 0px;
+}
+img.keypad-trigger {
+	margin: 2px;
+	vertical-align: middle;
+}
+.keypad-popup, .keypad-inline, .keypad-key, .keypad-special {
+	font-family: Arial,Helvetica,sans-serif;
+	font-size: 14px;
+}
+.keypad-popup {
+	display: none;
+	z-index: 10;
+	margin: 0;
+	padding: 0;
+	background-color: #fff;
+	color: #000;
+	border: 1px solid #888;
+	border-radius: 0.25em;
+	-moz-border-radius: 0.25em;
+	-webkit-border-radius: 0.25em;
+}
+.keypad-keyentry {
+	display: none;
+}
+.keypad-inline {
+	background-color: #fff;
+	border: 1px solid #888;
+	border-radius: 0.25em;
+	-moz-border-radius: 0.25em;
+	-webkit-border-radius: 0.25em;
+}
+.keypad-disabled {
+	position: absolute;
+	z-index: 100;
+	background-color: white;
+	opacity: 0.5;
+	filter: alpha(opacity=50);
+}
+.keypad-rtl {
+	direction: rtl;
+}
+.keypad-prompt {
+	clear: both;
+	text-align: center;
+}
+.keypad-prompt.ui-widget-header {
+	margin: 0.125em;
+}
+.keypad-row {
+	clear: both;
+	float: left;
+	width: 100%;
+}
+.keypad-space {
+	float: left;
+	margin: 0.125em;
+	width: 2em;
+}
+* html .keypad-space { /* IE6 */
+	margin: 0em;
+	width: 2.25em;
+}
+.keypad-half-space {
+	float: left;
+	margin: 0.125em 0.0625em;
+	width: 1em;
+}
+* html .keypad-half-space { /* IE6 */
+	margin: 0em;
+	width: 1.125em;
+}
+.keypad-key, .keypad-special {
+	float: left;
+	margin: 0.125em;
+	padding: 0em;
+	width: 2em;
+	background-color: #f4f4f4;
+	border-radius: 0.25em;
+	-moz-border-radius: 0.25em;
+	-webkit-border-radius: 0.25em;
+	text-align: center;
+	cursor: pointer;
+}
+.keypad-key[disabled] {
+	border: 0.125em outset;
+}
+.keypad-key-down {
+}
+.keypad-special {
+	width: 4.25em;
+}
+.keypad-spacebar {
+	width: 13.25em;
+}
+.keypad-tab {
+	width: 2em;
+}
+.keypad-clear, .keypad-back, .keypad-close, .keypad-shift {
+	color: #000;
+	font-weight: bold;
+}
+/*.keypad-clear {
+	background-color: #a00;
+}
+.keypad-back {
+	background-color: #00a;
+}
+.keypad-close {
+	background-color: #0a0;
+}
+.keypad-shift {
+	background-color: #0aa;
+}*/
+.keypad-cover {
+	display: none;
+	display/**/: block;
+	position: absolute;
+	z-index: -1;
+	filter: mask();
+	top: -4px;
+	left: -4px;
+	width: 125px;
+	height: 200px;
+}
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad.js
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad.js	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad.js	(revision 7843)
@@ -0,0 +1,906 @@
+﻿/* http://keith-wood.name/keypad.html
+   Keypad field entry extension for jQuery v1.5.0.
+   Written by Keith Wood (kbwood{at}iinet.com.au) August 2008.
+   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
+   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
+   Please attribute the author if you use it. */
+   
+(function($) { // hide the namespace
+
+/* Keypad manager.
+   Use the singleton instance of this class, $.keypad, to interact with the plugin.
+   Settings for keypad fields are maintained in instance objects,
+   allowing multiple different settings on the same page. */
+function Keypad() {
+	this._curInst = null; // The current instance in use
+	this._disabledFields = []; // List of keypad fields that have been disabled
+	this._keypadShowing = false; // True if the popup panel is showing , false if not
+	this._keyCode = 0;
+	this._specialKeys = [];
+	this.addKeyDef('CLOSE', 'close', function(inst) {
+		plugin._curInst = (inst._inline ? inst : plugin._curInst);
+		plugin._hidePlugin();
+	});
+	this.addKeyDef('CLEAR', 'clear', function(inst) { plugin._clearValue(inst); });
+	this.addKeyDef('BACK', 'back', function(inst) { plugin._backValue(inst); });
+	this.addKeyDef('SHIFT', 'shift', function(inst) { plugin._shiftKeypad(inst); });
+	this.addKeyDef('SPACE_BAR', 'spacebar', function(inst) { plugin._selectValue(inst, ' '); }, true);
+	this.addKeyDef('SPACE', 'space');
+	this.addKeyDef('HALF_SPACE', 'half-space');
+	this.addKeyDef('ENTER', 'enter', function(inst) { plugin._selectValue(inst, '\x0D'); }, true);
+	this.addKeyDef('TAB', 'tab', function(inst) { plugin._selectValue(inst, '\x09'); }, true);
+	// Standard US keyboard alphabetic layout
+	this.qwertyAlphabetic = ['qwertyuiop', 'asdfghjkl', 'zxcvbnm'];
+	// Standard US keyboard layout
+	this.qwertyLayout = ['!@#$%^&*()_=' + this.HALF_SPACE + this.SPACE + this.CLOSE,
+		this.HALF_SPACE + '`~[]{}<>\\|/' + this.SPACE + '789',
+		'qwertyuiop\'"' + this.HALF_SPACE + '456',
+		this.HALF_SPACE + 'asdfghjkl;:' + this.SPACE + '123',
+		this.SPACE + 'zxcvbnm,.?' + this.SPACE + this.HALF_SPACE + '-0+',
+		'' + this.TAB + this.ENTER + this.SPACE_BAR + this.SHIFT +
+		this.HALF_SPACE + this.BACK + this.CLEAR];
+	this.regional = []; // Available regional settings, indexed by language code
+	this.regional[''] = { // Default regional settings
+		buttonText: '...', // Display text for trigger button
+		buttonStatus: 'Open the keypad', // Status text for trigger button
+		closeText: 'Close', // Display text for close link
+		closeStatus: 'Close the keypad', // Status text for close link
+		clearText: 'Clear', // Display text for clear link
+		clearStatus: 'Erase all the text', // Status text for clear link
+		backText: 'Back', // Display text for back link
+		backStatus: 'Erase the previous character', // Status text for back link
+		spacebarText: '&nbsp;', // Display text for space bar
+		spacebarStatus: 'Space', // Status text for space bar
+		enterText: 'Enter', // Display text for carriage return
+		enterStatus: 'Carriage return', // Status text for carriage return
+		tabText: '→', // Display text for tab
+		tabStatus: 'Horizontal tab', // Status text for tab
+		shiftText: 'Shift', // Display text for shift link
+		shiftStatus: 'Toggle upper/lower case characters', // Status text for shift link
+		alphabeticLayout: this.qwertyAlphabetic, // Default layout for alphabetic characters
+		fullLayout: this.qwertyLayout, // Default layout for full keyboard
+		isAlphabetic: this.isAlphabetic, // Function to determine if character is alphabetic
+		isNumeric: this.isNumeric, // Function to determine if character is numeric
+		toUpper: this.toUpper, // Function to convert characters to upper case
+		isRTL: false // True if right-to-left language, false if left-to-right
+	};
+	this._defaults = { // Global defaults for all the keypad instances
+		showOn: 'focus', // 'focus' for popup on focus,
+			// 'button' for trigger button, or 'both' for either
+		buttonImage: '', // URL for trigger button image
+		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
+		showAnim: 'show', // Name of jQuery animation for popup
+		showOptions: {}, // Options for enhanced animations
+		duration: 'normal', // Duration of display/closure
+		appendText: '', // Display text following the text field, e.g. showing the format
+		useThemeRoller: false, // True to add ThemeRoller classes
+		keypadClass: '', // Additional CSS class for the keypad for an instance
+		prompt: '', // Display text at the top of the keypad
+		layout: ['123' + this.CLOSE, '456' + this.CLEAR, '789' + this.BACK, this.SPACE + '0'], // Layout of keys
+		separator: '', // Separator character between keys
+		target: null, // Input target for an inline keypad
+		keypadOnly: true, // True for entry only via the keypad, false for real keyboard too
+		randomiseAlphabetic: false, // True to randomise the alphabetic key positions, false to keep in order
+		randomiseNumeric: false, // True to randomise the numeric key positions, false to keep in order
+		randomiseOther: false, // True to randomise the other key positions, false to keep in order
+		randomiseAll: false, // True to randomise all key positions, false to keep in order
+		beforeShow: null, // Callback before showing the keypad
+		onKeypress: null, // Callback when a key is selected
+		onClose: null // Callback when the panel is closed
+	};
+	$.extend(this._defaults, this.regional['']);
+	this.mainDiv = $('<div class="' + this._mainDivClass + '" style="display: none;"></div>');
+}
+
+$.extend(Keypad.prototype, {
+	/* Class name added to elements to indicate already configured with keypad. */
+	markerClassName: 'hasKeypad',
+	/* Name of the data property for instance settings. */
+	propertyName: 'keypad',
+
+	_mainDivClass: 'keypad-popup', // The main keypad division class
+	_inlineClass: 'keypad-inline', // The inline marker class
+	_appendClass: 'keypad-append', // The append marker class
+	_triggerClass: 'keypad-trigger', // The trigger marker class
+	_disableClass: 'keypad-disabled', // The disabled covering marker class
+	_inlineEntryClass: 'keypad-keyentry', // The inline entry marker class
+	_coverClass: 'keypad-cover', // The IE select cover marker class
+	_rtlClass: 'keypad-rtl', // The right-to-left marker class
+	_rowClass: 'keypad-row', // The keypad row marker class
+	_promptClass: 'keypad-prompt', // The prompt marker class
+	_specialClass: 'keypad-special', // The special key marker class
+	_namePrefixClass: 'keypad-', // The key name marker class prefix
+	_keyClass: 'keypad-key', // The key marker class
+	_keyDownClass: 'keypad-key-down', // The key down marker class
+
+	/* Override the default settings for all keypad instances.
+	   @param  settings  (object) the new settings to use as defaults
+	   @return  (Keypad) this object */
+	setDefaults: function(settings) {
+		$.extend(this._defaults, settings || {});
+		return this;
+	},
+
+	/* Add the definition of a special key.
+	   @param  id           (string) the identifier for this key - access via $.keypad.<id>
+	   @param  name         (string) the prefix for localisation strings and
+	                        the suffix for a class name
+	   @param  action       (function) the action performed for this key -
+	                        receives inst as a parameter
+	   @param  noHighlight  (boolean) true to suppress highlight when using ThemeRoller
+	   @return  (Keypad) this object */
+	addKeyDef: function(id, name, action, noHighlight) {
+		if (this._keyCode == 32) {
+			throw 'Only 32 special keys allowed';
+		}
+		this[id] = String.fromCharCode(this._keyCode++);
+		this._specialKeys.push({code: this[id], id: id, name: name,
+			action: action, noHighlight: noHighlight});
+		return this;
+	},
+
+	/* Attach the keypad to a jQuery selection.
+	   @param  target   (element) the control to affect
+	   @param  options  (object) the custom options for this instance */
+	_attachPlugin: function(target, options) {
+		target = $(target);
+		if (target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var inline = !target[0].nodeName.toLowerCase().match(/input|textarea/);
+		var inst = {options: $.extend({}, this._defaults, options), _inline: inline,
+			_mainDiv: (inline ? $('<div class="' + this._inlineClass + '"></div>') : plugin.mainDiv),
+			ucase: false};
+		this._setInput(target, inst);
+		this._connectKeypad(target, inst);
+		if (inline) {
+			target.append(inst._mainDiv).
+				bind('click.' + this.propertyName, function() { inst._input.focus(); });
+			this._updateKeypad(inst);
+		}
+		else if (target.is(':disabled')) {
+			this._disablePlugin(target);
+		}
+	},
+
+	/* Determine the input field for the keypad.
+	   @param  target  (jQuery) the target control
+	   @param  inst    (object) the instance settings */
+	_setInput: function(target, inst) {
+		inst._input = $(!inst._inline ? target : inst.options.target ||
+			'<input type="text" class="' + this._inlineEntryClass + '" disabled="disabled"/>');
+		if (inst._inline) {
+			target.find('input').remove();
+			if (!inst.options.target) {
+				target.append(inst._input);
+			}
+		}
+	},
+
+	/* Attach the keypad to a text field.
+	   @param  target  (jQuery) the target text field
+	   @param  inst    (object) the instance settings */
+	_connectKeypad: function(target, inst) {
+		target = $(target);
+		var appendText = inst.options.appendText;
+		if (appendText) {
+			target[inst.options.isRTL ? 'before' : 'after'](
+				'<span class="' + this._appendClass + '">' + appendText + '</span>');
+		}
+		if (!inst._inline) {
+			if (inst.options.showOn == 'focus' || inst.options.showOn == 'both') {
+				// pop-up keypad when in the marked field
+				target.bind('focus.' + this.propertyName, this._showPlugin).
+					bind('keydown.' + this.propertyName, this._doKeyDown);
+			}
+			if (inst.options.showOn == 'button' || inst.options.showOn == 'both') {
+				// pop-up keypad when button clicked
+				var buttonStatus = inst.options.buttonStatus;
+				var buttonImage = inst.options.buttonImage;
+				var trigger = $(inst.options.buttonImageOnly ? 
+					$('<img src="' + buttonImage + '" alt="' +
+					buttonStatus + '" title="' + buttonStatus + '"/>') :
+				$('<button type="button" title="' + buttonStatus + '"></button>').
+					html(buttonImage == '' ? inst.options.buttonText :
+					$('<img src="' + buttonImage + '" alt="' +
+					buttonStatus + '" title="' + buttonStatus + '"/>')));
+				target[inst.options.isRTL ? 'before' : 'after'](trigger);
+				trigger.addClass(this._triggerClass).click(function() {
+					if (plugin._keypadShowing && plugin._lastField == target[0]) {
+						plugin._hidePlugin();
+					}
+					else {
+						plugin._showPlugin(target[0]);
+					}
+					return false;
+				});
+			}
+		}
+		inst.saveReadonly = target.attr('readonly');
+		target.addClass(this.markerClassName).
+			data(this.propertyName, inst)
+			[inst.options.keypadOnly ? 'attr' : 'removeAttr']('readonly', true).
+			bind('setData.' + this.propertyName, function(event, key, value) {
+				inst.options[key] = value;
+			}).bind('getData.' + this.propertyName, function(event, key) {
+				return inst.options[key];
+			});
+	},
+
+	/* Retrieve or reconfigure the settings for a control.
+	   @param  target   (element) the control to affect
+	   @param  options  (object) the new options for this instance or
+	                    (string) an individual property name
+	   @param  value    (any) the individual property value (omit if options
+	                    is an object or to retrieve the value of a setting)
+	   @return  (any) if retrieving a value */
+	_optionPlugin: function(target, options, value) {
+		target = $(target);
+		var inst = target.data(this.propertyName);
+		if (!options || (typeof options == 'string' && value == null)) { // Get option
+			var name = options;
+			options = (inst || {}).options;
+			return (options && name ? options[name] : options);
+		}
+
+		if (!target.hasClass(this.markerClassName)) {
+			return;
+		}
+		options = options || {};
+		if (typeof options == 'string') {
+			var name = options;
+			options = {};
+			options[name] = value;
+		}
+		if (this._curInst == inst) {
+			this._hidePlugin();
+		}
+		$.extend(inst.options, options);
+		this._setInput(target, inst);
+		this._updateKeypad(inst);
+	},
+
+	/* Detach keypad from its control.
+	   @param  target  (element) the target text field */
+	_destroyPlugin: function(target) {
+		target = $(target);
+		if (!target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var inst = target.data(this.propertyName);
+		if (this._curInst == inst) {
+			this._hidePlugin();
+		}
+		target.siblings('.' + this._appendClass).remove().end().
+			siblings('.' + this._triggerClass).remove().end().
+			prev('.' + this._inlineEntryClass).remove();
+		target.removeClass(this.markerClassName).empty().
+			unbind('.' + this.propertyName).
+			removeData(this.propertyName)
+			[inst.saveReadonly ? 'attr' : 'removeAttr']('readonly', true);
+		inst._input.removeData(this.propertyName);
+	},
+
+	/* Enable the keypad for a jQuery selection.
+	   @param  target  (element) the target text field */
+	_enablePlugin: function(target) {
+		target = $(target);
+		if (!target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var nodeName = target[0].nodeName.toLowerCase();
+		if (nodeName.match(/input|textarea/)) {
+			target[0].disabled = false;
+			target.siblings('button.' + this._triggerClass).
+				each(function() { this.disabled = false; }).end().
+				siblings('img.' + this._triggerClass).
+				css({opacity: '1.0', cursor: ''});
+		}
+		else if (nodeName.match(/div|span/)) {
+			target.children('.' + this._disableClass).remove();
+			var inst = target.data(this.propertyName);
+			inst._mainDiv.find('button').removeAttr('disabled');
+		}
+		this._disabledFields = $.map(this._disabledFields,
+			function(value) { return (value == target[0] ? null : value); }); // delete entry
+	},
+
+	/* Disable the keypad for a jQuery selection.
+	   @param  target  (element) the target text field */
+	_disablePlugin: function(target) {
+		target = $(target);
+		if (!target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var nodeName = target[0].nodeName.toLowerCase();
+		if (nodeName.match(/input|textarea/)) {
+			target[0].disabled = true;
+			target.siblings('button.' + this._triggerClass).
+				each(function() { this.disabled = true; }).end().
+				siblings('img.' + this._triggerClass).
+				css({opacity: '0.5', cursor: 'default'});
+		}
+		else if (nodeName.match(/div|span/)) {
+			var inline = target.children('.' + this._inlineClass);
+			var offset = inline.offset();
+			var relOffset = {left: 0, top: 0};
+			inline.parents().each(function() {
+				if ($(this).css('position') == 'relative') {
+					relOffset = $(this).offset();
+					return false;
+				}
+			});
+			target.prepend('<div class="' + this._disableClass + '" style="width: ' +
+				inline.outerWidth() + 'px; height: ' + inline.outerHeight() +
+				'px; left: ' + (offset.left - relOffset.left) +
+				'px; top: ' + (offset.top - relOffset.top) + 'px;"></div>');
+			var inst = target.data(this.propertyName);
+			inst._mainDiv.find('button').attr('disabled', 'disabled');
+		}
+		this._disabledFields = $.map(this._disabledFields,
+			function(value) { return (value == target[0] ? null : value); }); // delete entry
+		this._disabledFields[this._disabledFields.length] = target[0];
+	},
+
+	/* Is the text field disabled as a keypad?
+	   @param  target  (element) the target text field
+	   @return  (boolean) true if disabled, false if enabled */
+	_isDisabledPlugin: function(target) {
+		return (target && $.inArray(target, this._disabledFields) > -1);
+	},
+
+	/* Pop-up the keypad for a given text field.
+	   @param  field  (element) the text field attached to the keypad or
+	                  (event) if triggered by focus */
+	_showPlugin: function(field) {
+		field = field.target || field;
+		if (plugin._isDisabledPlugin(field) ||
+				plugin._lastField == field) { // already here
+			return;
+		}
+		var inst = $.data(field, plugin.propertyName);
+		plugin._hidePlugin(null, '');
+		plugin._lastField = field;
+		plugin._pos = plugin._findPos(field);
+		plugin._pos[1] += field.offsetHeight; // add the height
+		var isFixed = false;
+		$(field).parents().each(function() {
+			isFixed |= $(this).css('position') == 'fixed';
+			return !isFixed;
+		});
+		if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
+			plugin._pos[0] -= document.documentElement.scrollLeft;
+			plugin._pos[1] -= document.documentElement.scrollTop;
+		}
+		var offset = {left: plugin._pos[0], top: plugin._pos[1]};
+		plugin._pos = null;
+		// determine sizing offscreen
+		inst._mainDiv.css({position: 'absolute', display: 'block', top: '-1000px',
+			width: ($.browser.opera ? '1000px' : 'auto')});
+		plugin._updateKeypad(inst);
+		// and adjust position before showing
+		offset = plugin._checkOffset(inst, offset, isFixed);
+		inst._mainDiv.css({position: (isFixed ? 'fixed' : 'absolute'), display: 'none',
+			left: offset.left + 'px', top: offset.top + 'px'});
+		var duration = inst.options.duration;
+		duration = (duration == 'normal' && $.ui && $.ui.version >= '1.8' ? '_default' : duration);
+		var showAnim = inst.options.showAnim;
+		var postProcess = function() {
+			plugin._keypadShowing = true;
+			var borders = plugin._getBorders(inst._mainDiv);
+			inst._mainDiv.find('iframe.' + plugin._coverClass). // IE6- only
+				css({left: -borders[0], top: -borders[1],
+					width: inst._mainDiv.outerWidth(), height: inst._mainDiv.outerHeight()});
+		};
+		if ($.effects && ($.effects[showAnim] || ($.effects.effect && $.effects.effect[showAnim]))) {
+			var data = inst._mainDiv.data(); // Update old effects data
+			for (var key in data) {
+				if (key.match(/^ec\.storage\./)) {
+					data[key] = inst._mainDiv.css(key.replace(/ec\.storage\./, ''));
+				}
+			}
+			inst._mainDiv.data(data).show(showAnim,
+				inst.options.showOptions, duration, postProcess);
+		}
+		else {
+			inst._mainDiv[showAnim || 'show']((showAnim ? duration : ''), postProcess);
+		}
+		if (!showAnim) {
+			postProcess();
+		}
+		if (inst._input[0].type != 'hidden') {
+			inst._input[0].focus();
+		}
+		plugin._curInst = inst;
+	},
+
+	/* Generate the keypad content.
+	   @param  inst  (object) the instance settings */
+	_updateKeypad: function(inst) {
+		var borders = this._getBorders(inst._mainDiv);
+		inst._mainDiv.empty().append(this._generateHTML(inst)).
+			find('iframe.' + this._coverClass). // IE6- only
+			css({left: -borders[0], top: -borders[1],
+				width: inst._mainDiv.outerWidth(), height: inst._mainDiv.outerHeight()});
+		inst._mainDiv.removeClass().addClass(inst.options.keypadClass +
+			(inst.options.useThemeRoller ? ' ui-widget ui-widget-content' : '') +
+			(inst.options.isRTL ? ' ' + this._rtlClass : '') + ' ' +
+			(inst._inline ? this._inlineClass : this._mainDivClass));
+		if ($.isFunction(inst.options.beforeShow)) {
+			inst.options.beforeShow.apply((inst._input ? inst._input[0] : null),
+				[inst._mainDiv, inst]);
+		}
+	},
+
+	/* Retrieve the size of left and top borders for an element.
+	   @param  elem  (jQuery object) the element of interest
+	   @return  (number[2]) the left and top borders */
+	_getBorders: function(elem) {
+		var convert = function(value) {
+			var extra = ($.browser.msie ? 1 : 0);
+			return {thin: 1 + extra, medium: 3 + extra, thick: 5 + extra}[value] || value;
+		};
+		return [parseFloat(convert(elem.css('border-left-width'))),
+			parseFloat(convert(elem.css('border-top-width')))];
+	},
+
+	/* Check positioning to remain on screen.
+	   @param  inst    (object) the instance settings
+	   @param  offset  (object) the current offset
+	   @param  isFixed  (boolean) true if the text field is fixed in position
+	   @return  (object) the updated offset */
+	_checkOffset: function(inst, offset, isFixed) {
+		var pos = inst._input ? this._findPos(inst._input[0]) : null;
+		var browserWidth = window.innerWidth || document.documentElement.clientWidth;
+		var browserHeight = window.innerHeight || document.documentElement.clientHeight;
+		var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+		var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+		if (($.browser.msie && parseInt($.browser.version, 10) < 7) || $.browser.opera) {
+			// recalculate width as otherwise set to 100%
+			var width = 0;
+			inst._mainDiv.find(':not(div,iframe)').each(function() {
+				width = Math.max(width, this.offsetLeft + $(this).outerWidth() +
+					parseInt($(this).css('margin-right'), 10));
+			});
+			inst._mainDiv.css('width', width);
+		}
+		// reposition keypad panel horizontally if outside the browser window
+		if (inst.options.isRTL ||
+				(offset.left + inst._mainDiv.outerWidth() - scrollX) > browserWidth) {
+			offset.left = Math.max((isFixed ? 0 : scrollX),
+				pos[0] + (inst._input ? inst._input.outerWidth() : 0) -
+				(isFixed ? scrollX : 0) - inst._mainDiv.outerWidth() -
+				(isFixed && $.browser.opera ? document.documentElement.scrollLeft : 0));
+		}
+		else {
+			offset.left -= (isFixed ? scrollX : 0);
+		}
+		// reposition keypad panel vertically if outside the browser window
+		if ((offset.top + inst._mainDiv.outerHeight() - scrollY) > browserHeight) {
+			offset.top = Math.max((isFixed ? 0 : scrollY),
+				pos[1] - (isFixed ? scrollY : 0) - inst._mainDiv.outerHeight() -
+				(isFixed && $.browser.opera ? document.documentElement.scrollTop : 0));
+		}
+		else {
+			offset.top -= (isFixed ? scrollY : 0);
+		}
+		return offset;
+	},
+	
+	/* Find an object's position on the screen.
+	   @param  obj  (element) the element to find the position for
+	   @return  (int[2]) the element's position */
+	_findPos: function(obj) {
+        while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
+            obj = obj.nextSibling;
+        }
+        var position = $(obj).offset();
+	    return [position.left, position.top];
+	},
+
+	/* Hide the keypad from view.
+	   @param  field     (element) the text field attached to the keypad
+	   @param  duration  (string) the duration over which to close the keypad */
+	_hidePlugin: function(field, duration) {
+		var inst = this._curInst;
+		if (!inst || (field && inst != $.data(field, this.propertyName))) {
+			return;
+		}
+		if (this._keypadShowing) {
+			duration = (duration != null ? duration : inst.options.duration);
+			duration = (duration == 'normal' && $.ui && $.ui.version >= '1.8' ? '_default' : duration);
+			var showAnim = inst.options.showAnim;
+			if ($.effects && ($.effects[showAnim] || ($.effects.effect && $.effects.effect[showAnim]))) {
+				inst._mainDiv.hide(showAnim, inst.options.showOptions, duration);
+			}
+			else {
+				inst._mainDiv[(showAnim == 'slideDown' ? 'slideUp' :
+					(showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))](showAnim ? duration : '');
+			}
+		}
+		if ($.isFunction(inst.options.onClose)) {
+			inst.options.onClose.apply((inst._input ? inst._input[0] : null),  // trigger custom callback
+				[inst._input.val(), inst]);
+		}
+		if (this._keypadShowing) {
+			this._keypadShowing = false;
+			this._lastField = null;
+		}
+		if (inst._inline) {
+			inst._input.val('');
+		}
+		this._curInst = null;
+	},
+
+	/* Handle keystrokes.
+	   @param  e  (event) the key event */
+	_doKeyDown: function(e) {
+		if (e.keyCode == 9) { // Tab out
+			plugin.mainDiv.stop(true, true);
+			plugin._hidePlugin();
+		}
+	},
+
+	/* Close keypad if clicked elsewhere.
+	   @param  event  (event) the mouseclick details */
+	_checkExternalClick: function(event) {
+		if (!plugin._curInst) {
+			return;
+		}
+		var target = $(event.target);
+		if (!target.parents().andSelf().hasClass(plugin._mainDivClass) &&
+				!target.hasClass(plugin.markerClassName) &&
+				!target.parents().andSelf().hasClass(plugin._triggerClass) &&
+				plugin._keypadShowing) {
+			plugin._hidePlugin();
+		}
+	},
+
+	/* Toggle between upper and lower case.
+	   @param  inst  (object) the instance settings */
+	_shiftKeypad: function(inst) {
+		inst.ucase = !inst.ucase;
+		this._updateKeypad(inst);
+		inst._input.focus(); // for further typing
+	},
+
+	/* Erase the text field.
+	   @param  inst  (object) the instance settings */
+	_clearValue: function(inst) {
+		this._setValue(inst, '', 0);
+		this._notifyKeypress(inst, plugin.DEL);
+	},
+
+	/* Erase the last character.
+	   @param  inst  (object) the instance settings */
+	_backValue: function(inst) {
+		var field = inst._input[0];
+		var value = inst._input.val();
+		var range = [value.length, value.length];
+		if (field.setSelectionRange) { // Mozilla
+			range = (inst._input.attr('readonly') || inst._input.attr('disabled') ?
+				range : [field.selectionStart, field.selectionEnd]);
+		}
+		else if (field.createTextRange) { // IE
+			range = (inst._input.attr('readonly') || inst._input.attr('disabled') ?
+				range : this._getIERange(field));
+		}
+		this._setValue(inst, (value.length == 0 ? '' :
+			value.substr(0, range[0] - 1) + value.substr(range[1])), range[0] - 1);
+		this._notifyKeypress(inst, plugin.BS);
+	},
+
+	/* Update the text field with the selected value.
+	   @param  inst   (object) the instance settings
+	   @param  value  (string) the new character to add */
+	_selectValue: function(inst, value) {
+		this.insertValue(inst._input[0], value);
+		this._setValue(inst, inst._input.val());
+		this._notifyKeypress(inst, value);
+	},
+
+	/* Update the text field with the selected value.
+	   @param  input  (element) the input field or
+	                  (jQuery) jQuery collection
+	   @param  value  (string) the new character to add */
+	insertValue: function(input, value) {
+		input = (input.jquery ? input : $(input));
+		var field = input[0];
+		var newValue = input.val();
+		var range = [newValue.length, newValue.length];
+		if (field.setSelectionRange) { // Mozilla
+			range = (input.attr('readonly') || input.attr('disabled') ?
+				range : [field.selectionStart, field.selectionEnd]);
+		}
+		else if (field.createTextRange) { // IE
+			range = (input.attr('readonly') || input.attr('disabled') ?
+				range : this._getIERange(field));
+		}
+		input.val(newValue.substr(0, range[0]) + value + newValue.substr(range[1]));
+		pos = range[0] + value.length;
+		if (input.is(':visible')) {
+			input.focus(); // for further typing
+		}
+		if (field.setSelectionRange) { // Mozilla
+			if (input.is(':visible')) {
+				field.setSelectionRange(pos, pos);
+			}
+		}
+		else if (field.createTextRange) { // IE
+			range = field.createTextRange();
+			range.move('character', pos);
+			range.select();
+		}
+	},
+
+	/* Get the coordinates for the selected area in the text field in IE.
+	   @param  field  (element) the target text field
+	   @return  (int[2]) the start and end positions of the selection */
+	_getIERange: function(field) {
+		field.focus();
+		var selectionRange = document.selection.createRange().duplicate();
+		// Use two ranges: before and selection
+		var beforeRange = this._getIETextRange(field);
+		beforeRange.setEndPoint('EndToStart', selectionRange);
+		// Check each range for trimmed newlines by shrinking the range by one
+		// character and seeing if the text property has changed. If it has not
+		// changed then we know that IE has trimmed a \r\n from the end.
+		var checkCRLF = function(range) {
+			var origText = range.text;
+			var text = origText;
+			var finished = false;
+			while (true) {
+				if (range.compareEndPoints('StartToEnd', range) == 0) {
+					break;
+				} 
+				else {
+					range.moveEnd('character', -1);
+					if (range.text == origText) {
+						text += '\r\n';
+					} 
+					else {
+						break;
+					}
+				}
+			}
+			return text;
+		};
+		var beforeText = checkCRLF(beforeRange);
+		var selectionText = checkCRLF(selectionRange);
+		return [beforeText.length, beforeText.length + selectionText.length];
+	},
+
+	/* Create an IE text range for the text field.
+	   @param  field  (element) the target text field
+	   @return  (object) the corresponding text range */
+	_getIETextRange: function(field) {
+		var isInput = (field.nodeName.toLowerCase() == 'input');
+		var range = (isInput ? field.createTextRange() : document.body.createTextRange());
+		if (!isInput) {
+			range.moveToElementText(field); // Selects all the text for a textarea
+		}
+		return range;
+	},
+
+	/* Set the text field to the selected value,
+	   and trigger any on change event.
+	   @param  inst   (object) the instance settings
+	   @param  value  (string) the new value for the text field */
+	_setValue: function(inst, value) {
+		var maxlen = inst._input.attr('maxlength');
+		if (maxlen > -1) {
+			value = value.substr(0, maxlen);
+		}
+		inst._input.val(value);
+		if (!$.isFunction(inst.options.onKeypress)) {
+			inst._input.trigger('change'); // fire the change event
+		}
+	},
+
+	_notifyKeypress: function(inst, key) {
+		if ($.isFunction(inst.options.onKeypress)) { // trigger custom callback
+			inst.options.onKeypress.apply((inst._input ? inst._input[0] : null),
+				[key, inst._input.val(), inst]);
+		}
+	},
+
+	/* Generate the HTML for the current state of the keypad.
+	   @param  inst  (object) the instance settings
+	   @return  (jQuery) the HTML for this keypad */
+	_generateHTML: function(inst) {
+		var html = (!inst.options.prompt ? '' : '<div class="' + this._promptClass +
+			(inst.options.useThemeRoller ? ' ui-widget-header ui-corner-all' : '') + '">' +
+			inst.options.prompt + '</div>');
+		var layout = this._randomiseLayout(inst);
+		for (var i = 0; i < layout.length; i++) {
+			html += '<div class="' + this._rowClass + '">';
+			var keys = layout[i].split(inst.options.separator);
+			for (var j = 0; j < keys.length; j++) {
+				if (inst.ucase) {
+					keys[j] = inst.options.toUpper(keys[j]);
+				}
+				var keyDef = this._specialKeys[keys[j].charCodeAt(0)];
+				if (keyDef) {
+					html += (keyDef.action ? '<button type="button" class="' + this._specialClass +
+						' ' + this._namePrefixClass + keyDef.name +
+						(inst.options.useThemeRoller ? ' ui-corner-all ui-state-default' +
+						(keyDef.noHighlight ? '' : ' ui-state-highlight') : '') +
+						'" title="' + inst.options[keyDef.name + 'Status'] + '">' +
+						(inst.options[keyDef.name + 'Text'] || '&nbsp;') + '</button>' :
+						'<div class="' + this._namePrefixClass + keyDef.name + '"></div>');
+				}
+				else {
+					html += '<button type="button" class="' + this._keyClass +
+						(inst.options.useThemeRoller ? ' ui-corner-all ui-state-default' : '') + '">' +
+						(keys[j] == ' ' ? '&nbsp;' : keys[j]) + '</button>';
+				}
+			}
+			html += '</div>';
+		}
+		html += '<div style="clear: both;"></div>' + 
+			(!inst._inline && $.browser.msie && parseInt($.browser.version, 10) < 7 ? 
+			'<iframe src="javascript:false;" class="' + plugin._coverClass + '"></iframe>' : '');
+		html = $(html);
+		var thisInst = inst;
+		var activeClasses = this._keyDownClass + (inst.options.useThemeRoller ? ' ui-state-active' : '');
+		html.find('button').mousedown(function() { $(this).addClass(activeClasses); }).
+			mouseup(function() { $(this).removeClass(activeClasses); }).
+			mouseout(function() { $(this).removeClass(activeClasses); }).
+			filter('.' + this._keyClass).click(function() { plugin._selectValue(thisInst, $(this).text()); });
+		$.each(this._specialKeys, function(i, keyDef) {
+			html.find('.' + plugin._namePrefixClass + keyDef.name).click(function() {
+				keyDef.action.apply(thisInst._input, [thisInst]);
+			});
+		});
+		return html;
+	},
+
+	/* Check whether characters should be randomised,
+	   and, if so, produce the randomised layout.
+	   @param  inst  (object) the instance settings
+	   @return  (string[]) the layout with any requested randomisations applied */
+	_randomiseLayout: function(inst) {
+		if (!inst.options.randomiseNumeric && !inst.options.randomiseAlphabetic &&
+				!inst.options.randomiseOther && !inst.options.randomiseAll) {
+			return inst.options.layout;
+		}
+		var numerics = [];
+		var alphas = [];
+		var others = [];
+		var newLayout = [];
+		// Find characters of different types
+		for (var i = 0; i < inst.options.layout.length; i++) {
+			newLayout[i] = '';
+			var keys = inst.options.layout[i].split(inst.options.separator);
+			for (var j = 0; j < keys.length; j++) {
+				if (this._isControl(keys[j])) {
+					continue;
+				}
+				if (inst.options.randomiseAll) {
+					others.push(keys[j]);
+				}
+				else if (inst.options.isNumeric(keys[j])) {
+					numerics.push(keys[j]);
+				}
+				else if (inst.options.isAlphabetic(keys[j])) {
+					alphas.push(keys[j]);
+				}
+				else {
+					others.push(keys[j]);
+				}
+			}
+		}
+		// Shuffle them
+		if (inst.options.randomiseNumeric) {
+			this._shuffle(numerics);
+		}
+		if (inst.options.randomiseAlphabetic) {
+			this._shuffle(alphas);
+		}
+		if (inst.options.randomiseOther || inst.options.randomiseAll) {
+			this._shuffle(others);
+		}
+		var n = 0;
+		var a = 0;
+		var o = 0;
+		// And replace them in the layout
+		for (var i = 0; i < inst.options.layout.length; i++) {
+			var keys = inst.options.layout[i].split(inst.options.separator);
+			for (var j = 0; j < keys.length; j++) {
+				newLayout[i] += (this._isControl(keys[j]) ? keys[j] :
+					(inst.options.randomiseAll ? others[o++] :
+					(inst.options.isNumeric(keys[j]) ? numerics[n++] :
+					(inst.options.isAlphabetic(keys[j]) ? alphas[a++] :
+					others[o++])))) + inst.options.separator;
+			}
+		}
+		return newLayout;
+	},
+
+	/* Is a given character a control character?
+	   @param  ch  (char) the character to test
+	   @return  (boolean) true if a control character, false if not */
+	_isControl: function(ch) {
+		return ch < ' ';
+	},
+
+	/* Is a given character alphabetic?
+	   @param  ch  (char) the character to test
+	   @return  (boolean) true if alphabetic, false if not */
+	isAlphabetic: function(ch) {
+		return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
+	},
+
+	/* Is a given character numeric?
+	   @param  ch  (char) the character to test
+	   @return  (boolean) true if numeric, false if not */
+	isNumeric: function(ch) {
+		return (ch >= '0' && ch <= '9');
+	},
+
+	/* Convert a character to upper case.
+	   @param  ch  (char) the character to convert
+	   @return  (char) its uppercase version */
+	toUpper: function(ch) {
+		return ch.toUpperCase();
+	},
+	/* Randomise the contents of an array.
+	   @param  values  (string[]) the array to rearrange */
+	_shuffle: function(values) {
+		for (var i = values.length - 1; i > 0; i--) {
+			var j = Math.floor(Math.random() * values.length);
+			var ch = values[i];
+			values[i] = values[j];
+			values[j] = ch;
+		}
+	}
+});
+
+// The list of commands that return values and don't permit chaining
+var getters = ['isDisabled'];
+
+/* Determine whether a command is a getter and doesn't permit chaining.
+   @param  command    (string, optional) the command to run
+   @param  otherArgs  ([], optional) any other arguments for the command
+   @return  true if the command is a getter, false if not */
+function isNotChained(command, otherArgs) {
+	if (command == 'option' && (otherArgs.length == 0 ||
+			(otherArgs.length == 1 && typeof otherArgs[0] == 'string'))) {
+		return true;
+	}
+	return $.inArray(command, getters) > -1;
+}
+
+/* Invoke the keypad functionality.
+   @param  options  (object) the new settings to use for these instances (optional) or
+                    (string) the command to run (optional)
+   @return  (jQuery) for chaining further calls or
+            (any) getter value */
+$.fn.keypad = function(options) {
+	var otherArgs = Array.prototype.slice.call(arguments, 1);
+	if (isNotChained(options, otherArgs)) {
+		return plugin['_' + options + 'Plugin'].apply(plugin, [this[0]].concat(otherArgs));
+	}
+	return this.each(function() {
+		if (typeof options == 'string') {
+			if (!plugin['_' + options + 'Plugin']) {
+				throw 'Unknown command: ' + options;
+			}
+			plugin['_' + options + 'Plugin'].apply(plugin, [this].concat(otherArgs));
+		}
+		else {
+			plugin._attachPlugin(this, options || {});
+		}
+	});
+};
+
+/* Initialise the keypad functionality. */
+var plugin = $.keypad = new Keypad(); // Singleton instance
+
+// Add the keypad division and external click check
+$(function() {
+	$(document.body).append(plugin.mainDiv).
+		mousedown(plugin._checkExternalClick);
+});
+
+})(jQuery);
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-ca.js
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-ca.js	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-ca.js	(revision 7843)
@@ -0,0 +1,21 @@
+﻿/* http://keith-wood.name/keypad.html
+   Catalan initialisation for the jQuery keypad extension
+   Written by Ignasi Nogues (inogues@clickartedu.com). */
+(function($) { // hide the namespace
+	$.keypad.regional['ca'] = {
+		buttonText: '...', buttonStatus: 'Obrir el teclat',
+		closeText: 'Tancar', closeStatus: 'Tancar el teclat',
+		clearText: 'Netejar', clearStatus: 'Eliminar tot el text',
+		backText: 'Tornar', backStatus: 'Borrar el caràcter anterior',
+		shiftText: 'Shift', shiftStatus: 'Canviar majúscules/minúscules',
+		spacebarText: '&nbsp;', spacebarStatus: '',
+		enterText: 'Entrar', enterStatus: '',
+		tabText: '→', tabStatus: '',
+		alphabeticLayout: $.keypad.qwertyAlphabetic,
+		fullLayout: $.keypad.qwertyLayout,
+		isAlphabetic: $.keypad.isAlphabetic,
+		isNumeric: $.keypad.isNumeric,
+		toUpper: $.keypad.toUpper,
+		isRTL: false};
+	$.keypad.setDefaults($.keypad.regional['ca']);
+})(jQuery);
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-pt-BR.js
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-pt-BR.js	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-pt-BR.js	(revision 7843)
@@ -0,0 +1,21 @@
+﻿/* http://keith-wood.name/keypad.html
+   brazilian portuguese initialisation for the jQuery keypad extension
+   Written by Israel Rodriguez (yzraeu{at}gmail.com) July 2009. */
+(function($) { // hide the namespace
+    $.keypad.regional['pt-BR'] = {
+        buttonText: '...', buttonStatus: 'Abrir o teclado',
+        closeText: 'Fechar', closeStatus: 'Fechar o teclado',
+        clearText: 'Limpar', clearStatus: 'Limpar todo o texto',
+        backText: 'Apagar', backStatus: 'Apagar o caractere anterior',
+        shiftText: 'Shift', shiftStatus: 'Ativar maiúsculas/minusculas',
+		spacebarText: '&nbsp;', spacebarStatus: '',
+		enterText: 'Enter', enterStatus: '',
+		tabText: '→', tabStatus: '',
+        alphabeticLayout: $.keypad.qwertyAlphabetic,
+        fullLayout: $.keypad.qwertyLayout,
+        isAlphabetic: $.keypad.isAlphabetic,
+        isNumeric: $.keypad.isNumeric,
+		toUpper: $.keypad.toUpper,
+        isRTL: false};
+    $.keypad.setDefaults($.keypad.regional['pt-BR']);
+})(jQuery);
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad.min.js
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad.min.js	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad.min.js	(revision 7843)
@@ -0,0 +1,7 @@
+﻿/* http://keith-wood.name/keypad.html
+   Keypad field entry extension for jQuery v1.5.0.
+   Written by Keith Wood (kbwood{at}iinet.com.au) August 2008.
+   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
+   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
+   Please attribute the author if you use it. */
+(function($){function Keypad(){this._curInst=null;this._disabledFields=[];this._keypadShowing=false;this._keyCode=0;this._specialKeys=[];this.addKeyDef('CLOSE','close',function(a){l._curInst=(a._inline?a:l._curInst);l._hidePlugin()});this.addKeyDef('CLEAR','clear',function(a){l._clearValue(a)});this.addKeyDef('BACK','back',function(a){l._backValue(a)});this.addKeyDef('SHIFT','shift',function(a){l._shiftKeypad(a)});this.addKeyDef('SPACE_BAR','spacebar',function(a){l._selectValue(a,' ')},true);this.addKeyDef('SPACE','space');this.addKeyDef('HALF_SPACE','half-space');this.addKeyDef('ENTER','enter',function(a){l._selectValue(a,'\x0D')},true);this.addKeyDef('TAB','tab',function(a){l._selectValue(a,'\x09')},true);this.qwertyAlphabetic=['qwertyuiop','asdfghjkl','zxcvbnm'];this.qwertyLayout=['!@#$%^&*()_='+this.HALF_SPACE+this.SPACE+this.CLOSE,this.HALF_SPACE+'`~[]{}<>\\|/'+this.SPACE+'789','qwertyuiop\'"'+this.HALF_SPACE+'456',this.HALF_SPACE+'asdfghjkl;:'+this.SPACE+'123',this.SPACE+'zxcvbnm,.?'+this.SPACE+this.HALF_SPACE+'-0+',''+this.TAB+this.ENTER+this.SPACE_BAR+this.SHIFT+this.HALF_SPACE+this.BACK+this.CLEAR];this.regional=[];this.regional['']={buttonText:'...',buttonStatus:'Open the keypad',closeText:'Close',closeStatus:'Close the keypad',clearText:'Clear',clearStatus:'Erase all the text',backText:'Back',backStatus:'Erase the previous character',spacebarText:'&nbsp;',spacebarStatus:'Space',enterText:'Enter',enterStatus:'Carriage return',tabText:'→',tabStatus:'Horizontal tab',shiftText:'Shift',shiftStatus:'Toggle upper/lower case characters',alphabeticLayout:this.qwertyAlphabetic,fullLayout:this.qwertyLayout,isAlphabetic:this.isAlphabetic,isNumeric:this.isNumeric,toUpper:this.toUpper,isRTL:false};this._defaults={showOn:'focus',buttonImage:'',buttonImageOnly:false,showAnim:'show',showOptions:{},duration:'normal',appendText:'',useThemeRoller:false,keypadClass:'',prompt:'',layout:['123'+this.CLOSE,'456'+this.CLEAR,'789'+this.BACK,this.SPACE+'0'],separator:'',target:null,keypadOnly:true,randomiseAlphabetic:false,randomiseNumeric:false,randomiseOther:false,randomiseAll:false,beforeShow:null,onKeypress:null,onClose:null};$.extend(this._defaults,this.regional['']);this.mainDiv=$('<div class="'+this._mainDivClass+'" style="display: none;"></div>')}$.extend(Keypad.prototype,{markerClassName:'hasKeypad',propertyName:'keypad',_mainDivClass:'keypad-popup',_inlineClass:'keypad-inline',_appendClass:'keypad-append',_triggerClass:'keypad-trigger',_disableClass:'keypad-disabled',_inlineEntryClass:'keypad-keyentry',_coverClass:'keypad-cover',_rtlClass:'keypad-rtl',_rowClass:'keypad-row',_promptClass:'keypad-prompt',_specialClass:'keypad-special',_namePrefixClass:'keypad-',_keyClass:'keypad-key',_keyDownClass:'keypad-key-down',setDefaults:function(a){$.extend(this._defaults,a||{});return this},addKeyDef:function(a,b,c,d){if(this._keyCode==32){throw'Only 32 special keys allowed';}this[a]=String.fromCharCode(this._keyCode++);this._specialKeys.push({code:this[a],id:a,name:b,action:c,noHighlight:d});return this},_attachPlugin:function(a,b){a=$(a);if(a.hasClass(this.markerClassName)){return}var c=!a[0].nodeName.toLowerCase().match(/input|textarea/);var d={options:$.extend({},this._defaults,b),_inline:c,_mainDiv:(c?$('<div class="'+this._inlineClass+'"></div>'):l.mainDiv),ucase:false};this._setInput(a,d);this._connectKeypad(a,d);if(c){a.append(d._mainDiv).bind('click.'+this.propertyName,function(){d._input.focus()});this._updateKeypad(d)}else if(a.is(':disabled')){this._disablePlugin(a)}},_setInput:function(a,b){b._input=$(!b._inline?a:b.options.target||'<input type="text" class="'+this._inlineEntryClass+'" disabled="disabled"/>');if(b._inline){a.find('input').remove();if(!b.options.target){a.append(b._input)}}},_connectKeypad:function(d,e){d=$(d);var f=e.options.appendText;if(f){d[e.options.isRTL?'before':'after']('<span class="'+this._appendClass+'">'+f+'</span>')}if(!e._inline){if(e.options.showOn=='focus'||e.options.showOn=='both'){d.bind('focus.'+this.propertyName,this._showPlugin).bind('keydown.'+this.propertyName,this._doKeyDown)}if(e.options.showOn=='button'||e.options.showOn=='both'){var g=e.options.buttonStatus;var h=e.options.buttonImage;var i=$(e.options.buttonImageOnly?$('<img src="'+h+'" alt="'+g+'" title="'+g+'"/>'):$('<button type="button" title="'+g+'"></button>').html(h==''?e.options.buttonText:$('<img src="'+h+'" alt="'+g+'" title="'+g+'"/>')));d[e.options.isRTL?'before':'after'](i);i.addClass(this._triggerClass).click(function(){if(l._keypadShowing&&l._lastField==d[0]){l._hidePlugin()}else{l._showPlugin(d[0])}return false})}}e.saveReadonly=d.attr('readonly');d.addClass(this.markerClassName).data(this.propertyName,e)[e.options.keypadOnly?'attr':'removeAttr']('readonly',true).bind('setData.'+this.propertyName,function(a,b,c){e.options[b]=c}).bind('getData.'+this.propertyName,function(a,b){return e.options[b]})},_optionPlugin:function(a,b,c){a=$(a);var d=a.data(this.propertyName);if(!b||(typeof b=='string'&&c==null)){var e=b;b=(d||{}).options;return(b&&e?b[e]:b)}if(!a.hasClass(this.markerClassName)){return}b=b||{};if(typeof b=='string'){var e=b;b={};b[e]=c}if(this._curInst==d){this._hidePlugin()}$.extend(d.options,b);this._setInput(a,d);this._updateKeypad(d)},_destroyPlugin:function(a){a=$(a);if(!a.hasClass(this.markerClassName)){return}var b=a.data(this.propertyName);if(this._curInst==b){this._hidePlugin()}a.siblings('.'+this._appendClass).remove().end().siblings('.'+this._triggerClass).remove().end().prev('.'+this._inlineEntryClass).remove();a.removeClass(this.markerClassName).empty().unbind('.'+this.propertyName).removeData(this.propertyName)[b.saveReadonly?'attr':'removeAttr']('readonly',true);b._input.removeData(this.propertyName)},_enablePlugin:function(b){b=$(b);if(!b.hasClass(this.markerClassName)){return}var c=b[0].nodeName.toLowerCase();if(c.match(/input|textarea/)){b[0].disabled=false;b.siblings('button.'+this._triggerClass).each(function(){this.disabled=false}).end().siblings('img.'+this._triggerClass).css({opacity:'1.0',cursor:''})}else if(c.match(/div|span/)){b.children('.'+this._disableClass).remove();var d=b.data(this.propertyName);d._mainDiv.find('button').removeAttr('disabled')}this._disabledFields=$.map(this._disabledFields,function(a){return(a==b[0]?null:a)})},_disablePlugin:function(b){b=$(b);if(!b.hasClass(this.markerClassName)){return}var c=b[0].nodeName.toLowerCase();if(c.match(/input|textarea/)){b[0].disabled=true;b.siblings('button.'+this._triggerClass).each(function(){this.disabled=true}).end().siblings('img.'+this._triggerClass).css({opacity:'0.5',cursor:'default'})}else if(c.match(/div|span/)){var d=b.children('.'+this._inlineClass);var e=d.offset();var f={left:0,top:0};d.parents().each(function(){if($(this).css('position')=='relative'){f=$(this).offset();return false}});b.prepend('<div class="'+this._disableClass+'" style="width: '+d.outerWidth()+'px; height: '+d.outerHeight()+'px; left: '+(e.left-f.left)+'px; top: '+(e.top-f.top)+'px;"></div>');var g=b.data(this.propertyName);g._mainDiv.find('button').attr('disabled','disabled')}this._disabledFields=$.map(this._disabledFields,function(a){return(a==b[0]?null:a)});this._disabledFields[this._disabledFields.length]=b[0]},_isDisabledPlugin:function(a){return(a&&$.inArray(a,this._disabledFields)>-1)},_showPlugin:function(b){b=b.target||b;if(l._isDisabledPlugin(b)||l._lastField==b){return}var c=$.data(b,l.propertyName);l._hidePlugin(null,'');l._lastField=b;l._pos=l._findPos(b);l._pos[1]+=b.offsetHeight;var d=false;$(b).parents().each(function(){d|=$(this).css('position')=='fixed';return!d});if(d&&$.browser.opera){l._pos[0]-=document.documentElement.scrollLeft;l._pos[1]-=document.documentElement.scrollTop}var e={left:l._pos[0],top:l._pos[1]};l._pos=null;c._mainDiv.css({position:'absolute',display:'block',top:'-1000px',width:($.browser.opera?'1000px':'auto')});l._updateKeypad(c);e=l._checkOffset(c,e,d);c._mainDiv.css({position:(d?'fixed':'absolute'),display:'none',left:e.left+'px',top:e.top+'px'});var f=c.options.duration;f=(f=='normal'&&$.ui&&$.ui.version>='1.8'?'_default':f);var g=c.options.showAnim;var h=function(){l._keypadShowing=true;var a=l._getBorders(c._mainDiv);c._mainDiv.find('iframe.'+l._coverClass).css({left:-a[0],top:-a[1],width:c._mainDiv.outerWidth(),height:c._mainDiv.outerHeight()})};if($.effects&&($.effects[g]||($.effects.effect&&$.effects.effect[g]))){var i=c._mainDiv.data();for(var j in i){if(j.match(/^ec\.storage\./)){i[j]=c._mainDiv.css(j.replace(/ec\.storage\./,''))}}c._mainDiv.data(i).show(g,c.options.showOptions,f,h)}else{c._mainDiv[g||'show']((g?f:''),h)}if(!g){h()}if(c._input[0].type!='hidden'){c._input[0].focus()}l._curInst=c},_updateKeypad:function(a){var b=this._getBorders(a._mainDiv);a._mainDiv.empty().append(this._generateHTML(a)).find('iframe.'+this._coverClass).css({left:-b[0],top:-b[1],width:a._mainDiv.outerWidth(),height:a._mainDiv.outerHeight()});a._mainDiv.removeClass().addClass(a.options.keypadClass+(a.options.useThemeRoller?' ui-widget ui-widget-content':'')+(a.options.isRTL?' '+this._rtlClass:'')+' '+(a._inline?this._inlineClass:this._mainDivClass));if($.isFunction(a.options.beforeShow)){a.options.beforeShow.apply((a._input?a._input[0]:null),[a._mainDiv,a])}},_getBorders:function(c){var d=function(a){var b=($.browser.msie?1:0);return{thin:1+b,medium:3+b,thick:5+b}[a]||a};return[parseFloat(d(c.css('border-left-width'))),parseFloat(d(c.css('border-top-width')))]},_checkOffset:function(a,b,c){var d=a._input?this._findPos(a._input[0]):null;var e=window.innerWidth||document.documentElement.clientWidth;var f=window.innerHeight||document.documentElement.clientHeight;var g=document.documentElement.scrollLeft||document.body.scrollLeft;var h=document.documentElement.scrollTop||document.body.scrollTop;if(($.browser.msie&&parseInt($.browser.version,10)<7)||$.browser.opera){var i=0;a._mainDiv.find(':not(div,iframe)').each(function(){i=Math.max(i,this.offsetLeft+$(this).outerWidth()+parseInt($(this).css('margin-right'),10))});a._mainDiv.css('width',i)}if(a.options.isRTL||(b.left+a._mainDiv.outerWidth()-g)>e){b.left=Math.max((c?0:g),d[0]+(a._input?a._input.outerWidth():0)-(c?g:0)-a._mainDiv.outerWidth()-(c&&$.browser.opera?document.documentElement.scrollLeft:0))}else{b.left-=(c?g:0)}if((b.top+a._mainDiv.outerHeight()-h)>f){b.top=Math.max((c?0:h),d[1]-(c?h:0)-a._mainDiv.outerHeight()-(c&&$.browser.opera?document.documentElement.scrollTop:0))}else{b.top-=(c?h:0)}return b},_findPos:function(a){while(a&&(a.type=='hidden'||a.nodeType!=1)){a=a.nextSibling}var b=$(a).offset();return[b.left,b.top]},_hidePlugin:function(a,b){var c=this._curInst;if(!c||(a&&c!=$.data(a,this.propertyName))){return}if(this._keypadShowing){b=(b!=null?b:c.options.duration);b=(b=='normal'&&$.ui&&$.ui.version>='1.8'?'_default':b);var d=c.options.showAnim;if($.effects&&($.effects[d]||($.effects.effect&&$.effects.effect[d]))){c._mainDiv.hide(d,c.options.showOptions,b)}else{c._mainDiv[(d=='slideDown'?'slideUp':(d=='fadeIn'?'fadeOut':'hide'))](d?b:'')}}if($.isFunction(c.options.onClose)){c.options.onClose.apply((c._input?c._input[0]:null),[c._input.val(),c])}if(this._keypadShowing){this._keypadShowing=false;this._lastField=null}if(c._inline){c._input.val('')}this._curInst=null},_doKeyDown:function(e){if(e.keyCode==9){l.mainDiv.stop(true,true);l._hidePlugin()}},_checkExternalClick:function(a){if(!l._curInst){return}var b=$(a.target);if(!b.parents().andSelf().hasClass(l._mainDivClass)&&!b.hasClass(l.markerClassName)&&!b.parents().andSelf().hasClass(l._triggerClass)&&l._keypadShowing){l._hidePlugin()}},_shiftKeypad:function(a){a.ucase=!a.ucase;this._updateKeypad(a);a._input.focus()},_clearValue:function(a){this._setValue(a,'',0);this._notifyKeypress(a,l.DEL)},_backValue:function(a){var b=a._input[0];var c=a._input.val();var d=[c.length,c.length];if(b.setSelectionRange){d=(a._input.attr('readonly')||a._input.attr('disabled')?d:[b.selectionStart,b.selectionEnd])}else if(b.createTextRange){d=(a._input.attr('readonly')||a._input.attr('disabled')?d:this._getIERange(b))}this._setValue(a,(c.length==0?'':c.substr(0,d[0]-1)+c.substr(d[1])),d[0]-1);this._notifyKeypress(a,l.BS)},_selectValue:function(a,b){this.insertValue(a._input[0],b);this._setValue(a,a._input.val());this._notifyKeypress(a,b)},insertValue:function(a,b){a=(a.jquery?a:$(a));var c=a[0];var d=a.val();var e=[d.length,d.length];if(c.setSelectionRange){e=(a.attr('readonly')||a.attr('disabled')?e:[c.selectionStart,c.selectionEnd])}else if(c.createTextRange){e=(a.attr('readonly')||a.attr('disabled')?e:this._getIERange(c))}a.val(d.substr(0,e[0])+b+d.substr(e[1]));pos=e[0]+b.length;if(a.is(':visible')){a.focus()}if(c.setSelectionRange){if(a.is(':visible')){c.setSelectionRange(pos,pos)}}else if(c.createTextRange){e=c.createTextRange();e.move('character',pos);e.select()}},_getIERange:function(e){e.focus();var f=document.selection.createRange().duplicate();var g=this._getIETextRange(e);g.setEndPoint('EndToStart',f);var h=function(a){var b=a.text;var c=b;var d=false;while(true){if(a.compareEndPoints('StartToEnd',a)==0){break}else{a.moveEnd('character',-1);if(a.text==b){c+='\r\n'}else{break}}}return c};var i=h(g);var j=h(f);return[i.length,i.length+j.length]},_getIETextRange:function(a){var b=(a.nodeName.toLowerCase()=='input');var c=(b?a.createTextRange():document.body.createTextRange());if(!b){c.moveToElementText(a)}return c},_setValue:function(a,b){var c=a._input.attr('maxlength');if(c>-1){b=b.substr(0,c)}a._input.val(b);if(!$.isFunction(a.options.onKeypress)){a._input.trigger('change')}},_notifyKeypress:function(a,b){if($.isFunction(a.options.onKeypress)){a.options.onKeypress.apply((a._input?a._input[0]:null),[b,a._input.val(),a])}},_generateHTML:function(b){var c=(!b.options.prompt?'':'<div class="'+this._promptClass+(b.options.useThemeRoller?' ui-widget-header ui-corner-all':'')+'">'+b.options.prompt+'</div>');var d=this._randomiseLayout(b);for(var i=0;i<d.length;i++){c+='<div class="'+this._rowClass+'">';var e=d[i].split(b.options.separator);for(var j=0;j<e.length;j++){if(b.ucase){e[j]=b.options.toUpper(e[j])}var f=this._specialKeys[e[j].charCodeAt(0)];if(f){c+=(f.action?'<button type="button" class="'+this._specialClass+' '+this._namePrefixClass+f.name+(b.options.useThemeRoller?' ui-corner-all ui-state-default'+(f.noHighlight?'':' ui-state-highlight'):'')+'" title="'+b.options[f.name+'Status']+'">'+(b.options[f.name+'Text']||'&nbsp;')+'</button>':'<div class="'+this._namePrefixClass+f.name+'"></div>')}else{c+='<button type="button" class="'+this._keyClass+(b.options.useThemeRoller?' ui-corner-all ui-state-default':'')+'">'+(e[j]==' '?'&nbsp;':e[j])+'</button>'}}c+='</div>'}c+='<div style="clear: both;"></div>'+(!b._inline&&$.browser.msie&&parseInt($.browser.version,10)<7?'<iframe src="javascript:false;" class="'+l._coverClass+'"></iframe>':'');c=$(c);var g=b;var h=this._keyDownClass+(b.options.useThemeRoller?' ui-state-active':'');c.find('button').mousedown(function(){$(this).addClass(h)}).mouseup(function(){$(this).removeClass(h)}).mouseout(function(){$(this).removeClass(h)}).filter('.'+this._keyClass).click(function(){l._selectValue(g,$(this).text())});$.each(this._specialKeys,function(i,a){c.find('.'+l._namePrefixClass+a.name).click(function(){a.action.apply(g._input,[g])})});return c},_randomiseLayout:function(b){if(!b.options.randomiseNumeric&&!b.options.randomiseAlphabetic&&!b.options.randomiseOther&&!b.options.randomiseAll){return b.options.layout}var c=[];var d=[];var e=[];var f=[];for(var i=0;i<b.options.layout.length;i++){f[i]='';var g=b.options.layout[i].split(b.options.separator);for(var j=0;j<g.length;j++){if(this._isControl(g[j])){continue}if(b.options.randomiseAll){e.push(g[j])}else if(b.options.isNumeric(g[j])){c.push(g[j])}else if(b.options.isAlphabetic(g[j])){d.push(g[j])}else{e.push(g[j])}}}if(b.options.randomiseNumeric){this._shuffle(c)}if(b.options.randomiseAlphabetic){this._shuffle(d)}if(b.options.randomiseOther||b.options.randomiseAll){this._shuffle(e)}var n=0;var a=0;var o=0;for(var i=0;i<b.options.layout.length;i++){var g=b.options.layout[i].split(b.options.separator);for(var j=0;j<g.length;j++){f[i]+=(this._isControl(g[j])?g[j]:(b.options.randomiseAll?e[o++]:(b.options.isNumeric(g[j])?c[n++]:(b.options.isAlphabetic(g[j])?d[a++]:e[o++]))))+b.options.separator}}return f},_isControl:function(a){return a<' '},isAlphabetic:function(a){return(a>='A'&&a<='Z')||(a>='a'&&a<='z')},isNumeric:function(a){return(a>='0'&&a<='9')},toUpper:function(a){return a.toUpperCase()},_shuffle:function(a){for(var i=a.length-1;i>0;i--){var j=Math.floor(Math.random()*a.length);var b=a[i];a[i]=a[j];a[j]=b}}});var k=['isDisabled'];function isNotChained(a,b){if(a=='option'&&(b.length==0||(b.length==1&&typeof b[0]=='string'))){return true}return $.inArray(a,k)>-1}$.fn.keypad=function(a){var b=Array.prototype.slice.call(arguments,1);if(isNotChained(a,b)){return l['_'+a+'Plugin'].apply(l,[this[0]].concat(b))}return this.each(function(){if(typeof a=='string'){if(!l['_'+a+'Plugin']){throw'Unknown command: '+a;}l['_'+a+'Plugin'].apply(l,[this].concat(b))}else{l._attachPlugin(this,a||{})}})};var l=$.keypad=new Keypad();$(function(){$(document.body).append(l.mainDiv).mousedown(l._checkExternalClick)})})(jQuery);
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-cs.js
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-cs.js	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-cs.js	(revision 7843)
@@ -0,0 +1,21 @@
+﻿/* http://keith-wood.name/keypad.html
+   Czech initialisation for the jQuery keypad extension
+   Written by Amadeo Mareš. */
+(function($) { // hide the namespace
+    $.keypad.regional['cs'] = {
+        buttonText: '...', buttonStatus: 'Otevřít',
+        closeText: 'Zavřít', closeStatus: 'Zavře klávesnici',
+        clearText: 'Vymazat', clearStatus: 'Smaže text',
+        backText: 'Smazat', backStatus: 'Smaže poslední písmeno',
+        shiftText: 'Velikost', shiftStatus: 'Nastaví velká/malá písmena',
+		spacebarText: '&nbsp;', spacebarStatus: '',
+		enterText: 'Enter', enterStatus: '',
+		tabText: '→', tabStatus: '',
+        alphabeticLayout: $.keypad.qwertyAlphabetic,
+        fullLayout: $.keypad.qwertyLayout,
+        isAlphabetic: $.keypad.isAlphabetic,
+        isNumeric: $.keypad.isNumeric,
+		toUpper: $.keypad.toUpper,
+        isRTL: false};
+    $.keypad.setDefaults($.keypad.regional['cs']);
+})(jQuery);
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-tr.js
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-tr.js	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-tr.js	(revision 7843)
@@ -0,0 +1,21 @@
+﻿/* http://keith-wood.name/keypad.html
+   Turkish localisation for the jQuery keypad extension
+   Written by Yücel Kandemir(yucel{at}21bilisim.com) September 2010. */
+(function($) { // hide the namespace
+	$.keypad.regional['tr'] = {
+		buttonText: '...', buttonStatus: 'Aç',
+		closeText: 'Kapat', closeStatus: 'Klavyeyi Kapatýr',
+		clearText: 'Sil', clearStatus: 'Ýçerisini Temizler',
+		backText: 'Geri Al', backStatus: 'Son Karakteri Siler.',
+		shiftText: 'Büyüt', shiftStatus: 'Büyük Harfle Yazmak Ýçin Seçiniz.',
+		spacebarText: '&nbsp;', spacebarStatus: '',
+		enterText: 'Enter', enterStatus: '',
+		tabText: '→', tabStatus: '',
+    	alphabeticLayout: $.keypad.qwertyAlphabetic,
+	    fullLayout: $.keypad.qwertyLayout,
+    	isAlphabetic: $.keypad.isAlphabetic,
+	    isNumeric: $.keypad.isNumeric,
+		toUpper: $.keypad.toUpper,
+    	isRTL: false};
+	$.keypad.setDefaults($.keypad.regional['tr']);
+})(jQuery);
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-es.js
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-es.js	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-es.js	(revision 7843)
@@ -0,0 +1,21 @@
+﻿/* http://keith-wood.name/keypad.html
+   Spanish initialisation for the jQuery keypad extension
+   Written by Cristhian Benitez (cbenitez@gmail.com). */
+(function($) { // hide the namespace
+	$.keypad.regional['es'] = {
+		buttonText: '...', buttonStatus: 'Abrir el teclado',
+		closeText: 'Cerrar', closeStatus: 'Cerrar el teclado',
+		clearText: 'Limpiar', clearStatus: 'Eliminar todo el texto',
+		backText: 'Volver', backStatus: 'Borrar el caracter anterior',
+		shiftText: 'Shift', shiftStatus: 'Cambiar mayusculas/minusculas',
+		spacebarText: '&nbsp;', spacebarStatus: '',
+		enterText: 'Enter', enterStatus: '',
+		tabText: '→', tabStatus: '',
+		alphabeticLayout: $.keypad.qwertyAlphabetic,
+		fullLayout: $.keypad.qwertyLayout,
+		isAlphabetic: $.keypad.isAlphabetic,
+		isNumeric: $.keypad.isNumeric,
+		toUpper: $.keypad.toUpper,
+		isRTL: false};
+	$.keypad.setDefaults($.keypad.regional['es']);
+})(jQuery);
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-fr.js
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-fr.js	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-fr.js	(revision 7843)
@@ -0,0 +1,37 @@
+﻿/* http://keith-wood.name/keypad.html
+   French initialisation for the jQuery keypad extension
+   Written by Keith Wood (kbwood{at}iinet.com.au) August 2008. */
+(function($) { // hide the namespace
+
+	$.keypad.azertyAlphabetic = ['àâçéèêîôùû', 'azertyuiop', 'qsdfghjklm', 'wxcvbn'];
+	$.keypad.azertyLayout = ['&~#{([_@])}' + $.keypad.HALF_SPACE + '£$€',
+		'<>|`°^!?\'"\\' + $.keypad.HALF_SPACE + '/*=',
+		$.keypad.HALF_SPACE + $.keypad.azertyAlphabetic[0] + $.keypad.SPACE + '789',
+		$.keypad.azertyAlphabetic[1] + '%' + $.keypad.HALF_SPACE + '456',
+		$.keypad.HALF_SPACE + $.keypad.azertyAlphabetic[2] + $.keypad.SPACE + '123',
+		'§' + $.keypad.azertyAlphabetic[3] + ',.;:' + $.keypad.HALF_SPACE + '-0+',
+		$.keypad.SHIFT + $.keypad.SPACE_BAR + $.keypad.HALF_SPACE +
+		$.keypad.BACK + $.keypad.CLEAR + $.keypad.CLOSE];
+	$.keypad.regional['fr'] = {
+		buttonText: '...', buttonStatus: 'Ouvrir',
+		closeText: 'Fermer', closeStatus: 'Fermer le pavé numérique',
+		clearText: 'Effacer', clearStatus: 'Effacer la valeur',
+		backText: 'Défaire', backStatus: 'Effacer la dernière touche',
+		shiftText: 'Maj', shiftStatus: '',
+		spacebarText: '&nbsp;', spacebarStatus: '',
+		enterText: 'Enter', enterStatus: '',
+		tabText: '→', tabStatus: '',
+		alphabeticLayout: $.keypad.azertyAlphabetic,
+		fullLayout: $.keypad.azertyLayout,
+		isAlphabetic: $.keypad.isAlphabetic,
+		isNumeric: $.keypad.isNumeric,
+		toUpper: $.keypad.toUpper,
+		isRTL: false};
+	$.keypad.setDefaults($.keypad.regional['fr']);
+
+	function isAlphabetic(ch) {
+		return ($.keypad.isAlphabetic(ch) ||
+			'áàäãâçéèëêíìïîóòöõôúùüû'.indexOf(ch) > -1);
+	}
+
+})(jQuery);
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-de.js
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-de.js	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-de.js	(revision 7843)
@@ -0,0 +1,36 @@
+﻿/* http://keith-wood.name/keypad.html
+   German localisation for the jQuery keypad extension
+   Written by Uwe Jakobs(u.jakobs{at}imageco.de) September 2009. */
+(function($) { // hide the namespace
+
+	$.keypad.qwertzAlphabetic = ['qwertzuiopüß', 'asdfghjklöä', 'yxcvbnm'];
+	$.keypad.qwertzLayout = 
+		['!"§$%&/()=?`' + $.keypad.BACK + $.keypad.HALF_SPACE + '$£€/',
+		'<>°^@{[]}\\~´;:' + $.keypad.HALF_SPACE + '789*',
+		$.keypad.qwertzAlphabetic[0] + '+*' +
+		$.keypad.HALF_SPACE + '456-',
+		$.keypad.HALF_SPACE + $.keypad.qwertzAlphabetic[1] +
+		'#\'' + $.keypad.SPACE + '123+',
+		'|' + $.keypad.qwertzAlphabetic[2] + 'µ,.-_' +
+		$.keypad.SPACE + $.keypad.HALF_SPACE +'.0,=', 
+		$.keypad.SHIFT + $.keypad.SPACE + $.keypad.SPACE_BAR +
+		$.keypad.SPACE + $.keypad.SPACE + $.keypad.SPACE + $.keypad.CLEAR +
+		$.keypad.SPACE + $.keypad.SPACE + $.keypad.HALF_SPACE + $.keypad.CLOSE];
+	$.keypad.regional['de'] = {
+		buttonText: '...', buttonStatus: 'Öffnen',
+		closeText: 'schließen', closeStatus: 'schließen',
+		clearText: 'löschen', clearStatus: 'Gesamten Inhalt löschen',
+		backText: 'zurück', backStatus: 'Letzte Eingabe löschen',
+		shiftText: 'umschalten', shiftStatus: 'Zwischen Groß- und Kleinschreibung wechseln',
+		spacebarText: '&nbsp;', spacebarStatus: '',
+		enterText: 'Enter', enterStatus: '',
+		tabText: '→', tabStatus: '',
+		alphabeticLayout: $.keypad.qwertzAlphabetic,
+		fullLayout: $.keypad.qwertzLayout,
+		isAlphabetic: $.keypad.isAlphabetic,
+		isNumeric: $.keypad.isNumeric,
+		toUpper: $.keypad.toUpper,
+		isRTL: false};
+	$.keypad.setDefaults($.keypad.regional['de']);
+
+})(jQuery);
Index: /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-nl.js
===================================================================
--- /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-nl.js	(revision 7843)
+++ /trunk/prototype/plugins/jquery.keyboard/jquery.keypad-nl.js	(revision 7843)
@@ -0,0 +1,21 @@
+﻿/* http://keith-wood.name/keypad.html
+   dutch initialisation for the jQuery keypad extension
+   Written by Michiel Mussies (mail{at}webcrafts.nl) November 2009. */
+(function($) { // hide the namespace
+    $.keypad.regional['nl'] = {
+        buttonText: '...', buttonStatus: 'Open',
+        closeText: 'Sluit', closeStatus: 'Sluit',
+        clearText: 'Wissen', clearStatus: 'Wis alle tekens',
+        backText: 'Terug', backStatus: 'Wis laatste teken',
+        shiftText: 'Shift', shiftStatus: 'Activeer hoofd-/kleine letters',
+		spacebarText: '&nbsp;', spacebarStatus: '',
+		enterText: 'Enter', enterStatus: '',
+		tabText: '→', tabStatus: '',
+        alphabeticLayout: $.keypad.qwertyAlphabetic,
+        fullLayout: $.keypad.qwertyLayout,
+        isAlphabetic: $.keypad.isAlphabetic,
+        isNumeric: $.keypad.isNumeric,
+		toUpper: $.keypad.toUpper,
+        isRTL: false};
+    $.keypad.setDefaults($.keypad.regional['nl']);
+})(jQuery);
