/*
 * jQuery validation plug-in 1.5.2
 *
 * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
 * http://docs.jquery.com/Plugins/Validation
 *
 * Copyright (c) 2006 - 2008 Jörn Zaefferer
 *
 * $Id: jquery.validate.js 6243 2009-02-19 11:40:49Z joern.zaefferer $
 *
 * 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}('(7($){$.H($.2M,{1E:7(c){l(!6.F){c&&c.2j&&2X.1y&&1y.4Z("3p 2C, 4B\'t 1E, 6d 3p");8}p b=$.15(6[0],\'v\');l(b){8 b}b=29 $.v(c,6[0]);$.15(6[0],\'v\',b);l(b.q.3v){6.4J("21, 4E").1q(".4x").4t(7(){b.37=w});6.32(7(a){l(b.q.2j)a.5Y();7 28(){l(b.q.3Y){b.q.3Y.Z(b,b.Y);8 I}8 w}l(b.37){b.37=I;8 28()}l(b.J()){l(b.18){b.1u=w;8 I}8 28()}19{b.2k();8 I}})}8 b},N:7(){l($(6[0]).2L(\'J\')){8 6.1E().J()}19{p b=I;p a=$(6[0].J).1E();6.P(7(){b|=a.M(6)});8 b}},4L:7(c){p d={},$M=6;$.P(c.1I(/\\s/),7(a,b){d[b]=$M.1H(b);$M.4H(b)});8 d},1c:7(h,k){p f=6[0];l(h){p i=$.15(f.J,\'v\').q;p d=i.1c;p c=$.v.2u(f);2r(h){1e"1h":$.H(c,$.v.1S(k));d[f.u]=c;l(k.L)i.L[f.u]=$.H(i.L[f.u],k.L);33;1e"63":l(!k){R d[f.u];8 c}p e={};$.P(k.1I(/\\s/),7(a,b){e[b]=c[b];R c[b]});8 e}}p g=$.v.4a($.H({},$.v.47(f),$.v.43(f),$.v.3Z(f),$.v.2u(f)),f);l(g.13){p j=g.13;R g.13;g=$.H({13:j},g)}8 g}});$.H($.5C[":"],{5z:7(a){8!$.1k(a.U)},5q:7(a){8!!$.1k(a.U)},5o:7(a){8!a.3O}});$.1d=7(c,b){l(S.F==1)8 7(){p a=$.3J(S);a.5c(c);8 $.1d.1G(6,a)};l(S.F>2&&b.2l!=3C){b=$.3J(S).4V(1)}l(b.2l!=3C){b=[b]}$.P(b,7(i,n){c=c.2K(29 3A("\\\\{"+i+"\\\\}","g"),n)});8 c};$.v=7(b,a){6.q=$.H({},$.v.2J,b);6.Y=a;6.3x()};$.H($.v,{2J:{L:{},22:{},1c:{},1a:"3s",2H:"4K",2k:w,3n:$([]),2E:$([]),3v:w,3m:[],3l:I,4I:7(a){6.3k=a;l(6.q.4G&&!6.4F){6.q.1O&&6.q.1O.Z(6,a,6.q.1a);6.1P(a).2y()}},4D:7(a){l(!6.1w(a)&&(a.u 11 6.1l||!6.G(a))){6.M(a)}},4w:7(a){l(a.u 11 6.1l||a==6.3b){6.M(a)}},4u:7(a){l(a.u 11 6.1l)6.M(a)},2s:7(a,b){$(a).2q(b)},1O:7(a,b){$(a).39(b)}},6k:7(a){$.H($.v.2J,a)},L:{13:"6h 4p 2L 13.",1T:"K 35 6 4p.",1U:"K O a N 1U 6b.",1x:"K O a N 65.",1n:"K O a N 1n.",1X:"K O a N 1n (62).",1Y:"4e 4c 4b 30 5W�5U 5S 30.",1A:"K O a N 1A.",27:"4e 4c 4b 5Q 5O 30.",1N:"K O 5L 1N",2g:"K O a N 5I 5G 1A.",3W:"K O 3V 5A U 5y.",3T:"K O a U 5u a N 5t.",16:$.1d("K O 3Q 5p 2R {0} 2Q."),1v:$.1d("K O 5n 5m {0} 2Q."),2d:$.1d("K O a U 3L {0} 40 {1} 2Q 5i."),2a:$.1d("K O a U 3L {0} 40 {1}."),1t:$.1d("K O a U 5d 2R 3I 3H 48 {0}."),1B:$.1d("K O a U 56 2R 3I 3H 48 {0}.")},3G:I,53:{3x:7(){6.2h=$(6.q.2E);6.4i=6.2h.F&&6.2h||$(6.Y);6.2p=$(6.q.3n).1h(6.q.2E);6.1l={};6.4X={};6.18=0;6.1g={};6.1b={};6.1V();p f=(6.22={});$.P(6.q.22,7(d,c){$.P(c.1I(/\\s/),7(a,b){f[b]=d})});p e=6.q.1c;$.P(e,7(b,a){e[b]=$.v.1S(a)});7 1D(a){p b=$.15(6[0].J,"v");b.q["3B"+a.1p]&&b.q["3B"+a.1p].Z(b,6[0])}$(6.Y).1D("3z 3y 4P",":2I, :4O, :4N, 23, 4M",1D).1D("4t",":3u, :3t",1D);l(6.q.3r)$(6.Y).3q("1b-J.1E",6.q.3r)},J:7(){6.3o();$.H(6.1l,6.1r);6.1b=$.H({},6.1r);l(!6.N())$(6.Y).2G("1b-J",[6]);6.1j();8 6.N()},3o:7(){6.2F();Q(p i=0,14=(6.24=6.14());14[i];i++){6.26(14[i])}8 6.N()},M:7(a){a=6.2D(a);6.3b=a;6.3a(a);6.24=$(a);p b=6.26(a);l(b){R 6.1b[a.u]}19{6.1b[a.u]=w}l(!6.3F()){6.12=6.12.1h(6.2p)}6.1j();8 b},1j:7(b){l(b){$.H(6.1r,b);6.T=[];Q(p c 11 b){6.T.20({1f:b[c],M:6.1Z(c)[0]})}6.1m=$.3j(6.1m,7(a){8!(a.u 11 b)})}6.q.1j?6.q.1j.Z(6,6.1r,6.T):6.3i()},2B:7(){l($.2M.2B)$(6.Y).2B();6.1l={};6.2F();6.2A();6.14().39(6.q.1a)},3F:7(){8 6.2e(6.1b)},2e:7(a){p b=0;Q(p i 11 a)b++;8 b},2A:7(){6.2z(6.12).2y()},N:7(){8 6.3h()==0},3h:7(){8 6.T.F},2k:7(){l(6.q.2k){3g{$(6.3f()||6.T.F&&6.T[0].M||[]).1q(":4C").3e()}3d(e){}}},3f:7(){p a=6.3k;8 a&&$.3j(6.T,7(n){8 n.M.u==a.u}).F==1&&a},14:7(){p a=6,2x={};8 $([]).1h(6.Y.14).1q(":21").1F(":32, :1V, :4A, [4z]").1F(6.q.3m).1q(7(){!6.u&&a.q.2j&&2X.1y&&1y.3s("%o 4y 3Q u 4v",6);l(6.u 11 2x||!a.2e($(6).1c()))8 I;2x[6.u]=w;8 w})},2D:7(a){8 $(a)[0]},2v:7(){8 $(6.q.2H+"."+6.q.1a,6.4i)},1V:7(){6.1m=[];6.T=[];6.1r={};6.1i=$([]);6.12=$([]);6.1u=I;6.24=$([])},2F:7(){6.1V();6.12=6.2v().1h(6.2p)},3a:7(a){6.1V();6.12=6.1P(a)},26:7(d){d=6.2D(d);l(6.1w(d)){d=6.1Z(d.u)[0]}p a=$(d).1c();p c=I;Q(V 11 a){p b={V:V,2t:a[V]};3g{p f=$.v.1Q[V].Z(6,d.U.2K(/\\r/g,""),d,b.2t);l(f=="1R-1W"){c=w;6m}c=I;l(f=="1g"){6.12=6.12.1F(6.1P(d));8}l(!f){6.4s(d,b);8 I}}3d(e){6.q.2j&&2X.1y&&1y.6l("6j 6i 6g 6f M "+d.4q+", 26 3V \'"+b.V+"\' V");6e e;}}l(c)8;l(6.2e(a))6.1m.20(d);8 w},4o:7(a,b){l(!$.1C)8;p c=6.q.36?$(a).1C()[6.q.36]:$(a).1C();8 c&&c.L&&c.L[b]},4n:7(a,b){p m=6.q.L[a];8 m&&(m.2l==4m?m:m[b])},4l:7(){Q(p i=0;i<S.F;i++){l(S[i]!==2o)8 S[i]}8 2o},2n:7(a,b){8 6.4l(6.4n(a.u,b),6.4o(a,b),!6.q.3l&&a.6c||2o,$.v.L[b],"<4k>69: 68 1f 67 Q "+a.u+"</4k>")},4s:7(b,a){p c=6.2n(b,a.V);l(17 c=="7")c=c.Z(6,a.2t,b);6.T.20({1f:c,M:b});6.1r[b.u]=c;6.1l[b.u]=c},2z:7(a){l(6.q.2m)a=a.1h(a.64(6.q.2m));8 a},3i:7(){Q(p i=0;6.T[i];i++){p a=6.T[i];6.q.2s&&6.q.2s.Z(6,a.M,6.q.1a);6.2w(a.M,a.1f)}l(6.T.F){6.1i=6.1i.1h(6.2p)}l(6.q.1o){Q(p i=0;6.1m[i];i++){6.2w(6.1m[i])}}l(6.q.1O){Q(p i=0,14=6.4j();14[i];i++){6.q.1O.Z(6,14[i],6.q.1a)}}6.12=6.12.1F(6.1i);6.2A();6.2z(6.1i).4h()},4j:7(){8 6.24.1F(6.3c())},3c:7(){8 $(6.T).4g(7(){8 6.M})},2w:7(a,c){p b=6.1P(a);l(b.F){b.39().2q(6.q.1a);b.1H("4f")&&b.4d(c)}19{b=$("<"+6.q.2H+"/>").1H({"Q":6.31(a),4f:w}).2q(6.q.1a).4d(c||"");l(6.q.2m){b=b.2y().4h().61("<"+6.q.2m+"/>").60()}l(!6.2h.5Z(b).F)6.q.3w?6.q.3w(b,$(a)):b.5X(a)}l(!c&&6.q.1o){b.2I("");17 6.q.1o=="1s"?b.2q(6.q.1o):6.q.1o(b)}6.1i=6.1i.1h(b)},1P:7(a){8 6.2v().1q("[Q=\'"+6.31(a)+"\']")},31:7(a){8 6.22[a.u]||(6.1w(a)?a.u:a.4q||a.u)},1w:7(a){8/3u|3t/i.X(a.1p)},1Z:7(d){p c=6.Y;8 $(5V.5T(d)).4g(7(a,b){8 b.J==c&&b.u==d&&b||49})},1J:7(a,b){2r(b.3D.46()){1e\'23\':8 $("45:2C",b).F;1e\'21\':l(6.1w(b))8 6.1Z(b.u).1q(\':3O\').F}8 a.F},44:7(b,a){8 6.2O[17 b]?6.2O[17 b](b,a):w},2O:{"5P":7(b,a){8 b},"1s":7(b,a){8!!$(b,a.J).F},"7":7(b,a){8 b(a)}},G:7(a){8!$.v.1Q.13.Z(6,$.1k(a.U),a)&&"1R-1W"},42:7(a){l(!6.1g[a.u]){6.18++;6.1g[a.u]=w}},41:7(a,b){6.18--;l(6.18<0)6.18=0;R 6.1g[a.u];l(b&&6.18==0&&6.1u&&6.J()){$(6.Y).32()}19 l(!b&&6.18==0&&6.1u){$(6.Y).2G("1b-J",[6])}},2c:7(a){8 $.15(a,"2c")||$.15(a,"2c",5M={2Z:49,N:w,1f:6.2n(a,"1T")})}},1K:{13:{13:w},1U:{1U:w},1x:{1x:w},1n:{1n:w},1X:{1X:w},1Y:{1Y:w},1A:{1A:w},27:{27:w},1N:{1N:w},2g:{2g:w}},3E:7(a,b){a.2l==4m?6.1K[a]=b:$.H(6.1K,a)},43:7(b){p a={};p c=$(b).1H(\'5K\');c&&$.P(c.1I(\' \'),7(){l(6 11 $.v.1K){$.H(a,$.v.1K[6])}});8 a},3Z:7(c){p a={};p d=$(c);Q(V 11 $.v.1Q){p b=d.1H(V);l(b){a[V]=b}}l(a.16&&/-1|5J|5H/.X(a.16)){R a.16}8 a},47:7(a){l(!$.1C)8{};p b=$.15(a.J,\'v\').q.36;8 b?$(a).1C()[b]:$(a).1C()},2u:7(b){p a={};p c=$.15(b.J,\'v\');l(c.q.1c){a=$.v.1S(c.q.1c[b.u])||{}}8 a},4a:7(d,e){$.P(d,7(c,b){l(b===I){R d[c];8}l(b.2Y||b.2f){p a=w;2r(17 b.2f){1e"1s":a=!!$(b.2f,e.J).F;33;1e"7":a=b.2f.Z(e,e);33}l(a){d[c]=b.2Y!==2o?b.2Y:w}19{R d[c]}}});$.P(d,7(a,b){d[a]=$.5E(b)?b(e):b});$.P([\'1v\',\'16\',\'1B\',\'1t\'],7(){l(d[6]){d[6]=2W(d[6])}});$.P([\'2d\',\'2a\'],7(){l(d[6]){d[6]=[2W(d[6][0]),2W(d[6][1])]}});l($.v.3G){l(d.1B&&d.1t){d.2a=[d.1B,d.1t];R d.1B;R d.1t}l(d.1v&&d.16){d.2d=[d.1v,d.16];R d.1v;R d.16}}l(d.L){R d.L}8 d},1S:7(a){l(17 a=="1s"){p b={};$.P(a.1I(/\\s/),7(){b[6]=w});a=b}8 a},5D:7(c,a,b){$.v.1Q[c]=a;$.v.L[c]=b;l(a.F<3){$.v.3E(c,$.v.1S(c))}},1Q:{13:7(b,c,a){l(!6.44(a,c))8"1R-1W";2r(c.3D.46()){1e\'23\':p d=$("45:2C",c);8 d.F>0&&(c.1p=="23-5B"||($.2V.2P&&!(d[0].5x[\'U\'].5w)?d[0].2I:d[0].U).F>0);1e\'21\':l(6.1w(c))8 6.1J(b,c)>0;5v:8 $.1k(b).F>0}},1T:7(e,h,d){l(6.G(h))8"1R-1W";p g=6.2c(h);l(!6.q.L[h.u])6.q.L[h.u]={};6.q.L[h.u].1T=17 g.1f=="7"?g.1f(e):g.1f;d=17 d=="1s"&&{1x:d}||d;l(g.2Z!==e){g.2Z=e;p i=6;6.42(h);p f={};f[h.u]=e;$.2T($.H(w,{1x:d,3S:"2S",3R:"1E"+h.u,5s:"5r",15:f,1o:7(a){l(a){p b=i.1u;i.3a(h);i.1u=b;i.1m.20(h);i.1j()}19{p c={};c[h.u]=a||i.2n(h,"1T");i.1j(c)}g.N=a;i.41(h,a)}},d));8"1g"}19 l(6.1g[h.u]){8"1g"}8 g.N},1v:7(b,c,a){8 6.G(c)||6.1J($.1k(b),c)>=a},16:7(b,c,a){8 6.G(c)||6.1J($.1k(b),c)<=a},2d:7(b,d,a){p c=6.1J($.1k(b),d);8 6.G(d)||(c>=a[0]&&c<=a[1])},1B:7(b,c,a){8 6.G(c)||b>=a},1t:7(b,c,a){8 6.G(c)||b<=a},2a:7(b,c,a){8 6.G(c)||(b>=a[0]&&b<=a[1])},1U:7(a,b){8 6.G(b)||/^((([a-z]|\\d|[!#\\$%&\'\\*\\+\\-\\/=\\?\\^W`{\\|}~]|[\\C-\\A\\B-\\E\\x-\\y])+(\\.([a-z]|\\d|[!#\\$%&\'\\*\\+\\-\\/=\\?\\^W`{\\|}~]|[\\C-\\A\\B-\\E\\x-\\y])+)*)|((\\3P)((((\\2b|\\1M)*(\\2U\\3U))?(\\2b|\\1M)+)?(([\\3X-\\5F\\3N\\3M\\5l-\\5k\\3K]|\\5j|[\\5h-\\5N]|[\\5g-\\5f]|[\\C-\\A\\B-\\E\\x-\\y])|(\\\\([\\3X-\\1M\\3N\\3M\\2U-\\3K]|[\\C-\\A\\B-\\E\\x-\\y]))))*(((\\2b|\\1M)*(\\2U\\3U))?(\\2b|\\1M)+)?(\\3P)))@((([a-z]|\\d|[\\C-\\A\\B-\\E\\x-\\y])|(([a-z]|\\d|[\\C-\\A\\B-\\E\\x-\\y])([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])*([a-z]|\\d|[\\C-\\A\\B-\\E\\x-\\y])))\\.)+(([a-z]|[\\C-\\A\\B-\\E\\x-\\y])|(([a-z]|[\\C-\\A\\B-\\E\\x-\\y])([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])*([a-z]|[\\C-\\A\\B-\\E\\x-\\y])))\\.?$/i.X(a)},1x:7(a,b){8 6.G(b)||/^(5e?|5R):\\/\\/(((([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])|(%[\\1L-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\C-\\A\\B-\\E\\x-\\y])|(([a-z]|\\d|[\\C-\\A\\B-\\E\\x-\\y])([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])*([a-z]|\\d|[\\C-\\A\\B-\\E\\x-\\y])))\\.)+(([a-z]|[\\C-\\A\\B-\\E\\x-\\y])|(([a-z]|[\\C-\\A\\B-\\E\\x-\\y])([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])*([a-z]|[\\C-\\A\\B-\\E\\x-\\y])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])|(%[\\1L-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])|(%[\\1L-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])|(%[\\1L-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:|@)|[\\5b-\\5a]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])|(%[\\1L-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i.X(a)},1n:7(a,b){8 6.G(b)||!/59|58/.X(29 57(a))},1X:7(a,b){8 6.G(b)||/^\\d{4}[\\/-]\\d{1,2}[\\/-]\\d{1,2}$/.X(a)},1Y:7(a,b){8 6.G(b)||/^\\d\\d?\\.\\d\\d?\\.\\d\\d\\d?\\d?$/.X(a)},1A:7(a,b){8 6.G(b)||/^-?(?:\\d+|\\d{1,3}(?:,\\d{3})+)(?:\\.\\d+)?$/.X(a)},27:7(a,b){8 6.G(b)||/^-?(?:\\d+|\\d{1,3}(?:\\.\\d{3})+)(?:,\\d+)?$/.X(a)},1N:7(a,b){8 6.G(b)||/^\\d+$/.X(a)},2g:7(b,e){l(6.G(e))8"1R-1W";l(/[^0-9-]+/.X(b))8 I;p a=0,d=0,2i=I;b=b.2K(/\\D/g,"");Q(n=b.F-1;n>=0;n--){p c=b.55(n);p d=54(c,10);l(2i){l((d*=2)>9)d-=9}a+=d;2i=!2i}8(a%10)==0},3T:7(b,c,a){a=17 a=="1s"?a:"66|52?g|51";8 6.G(c)||b.50(29 3A(".("+a+")$","i"))},3W:7(b,c,a){8 b==$(a).6a()}}})})(2N);(7($){p c=$.2T;p d={};$.2T=7(a){a=$.H(a,$.H({},$.4Y,a));p b=a.3R;l(a.3S=="2S"){l(d[b]){d[b].2S()}8(d[b]=c.1G(6,S))}8 c.1G(6,S)}})(2N);(7($){$.P({3e:\'3z\',4W:\'3y\'},7(b,a){$.1z.34[a]={4U:7(){l($.2V.2P)8 I;6.4T(b,$.1z.34[a].38,w)},4S:7(){l($.2V.2P)8 I;6.4R(b,$.1z.34[a].38,w)},38:7(e){S[0]=$.1z.35(e);S[0].1p=a;8 $.1z.28.1G(6,S)}}});$.H($.2M,{1D:7(d,e,c){8 6.3q(d,7(a){p b=$(a.4r);l(b.2L(e)){8 c.1G(b,S)}})},4Q:7(a,b){8 6.2G(a,[$.1z.35({1p:a,4r:b})])}})})(2N);',62,395,'||||||this|function|return|||||||||||||if||||var|settings||||name|validator|true|uFDF0|uFFEF||uD7FF|uF900|u00A0||uFDCF|length|optional|extend|false|form|Please|messages|element|valid|enter|each|for|delete|arguments|errorList|value|method|_|test|currentForm|call||in|toHide|required|elements|data|maxlength|typeof|pendingRequest|else|errorClass|invalid|rules|format|case|message|pending|add|toShow|showErrors|trim|submitted|successList|date|success|type|filter|errorMap|string|max|formSubmitted|minlength|checkable|url|console|event|number|min|metadata|delegate|validate|not|apply|attr|split|getLength|classRuleSettings|da|x09|digits|unhighlight|errorsFor|methods|dependency|normalizeRule|remote|email|reset|mismatch|dateISO|dateDE|findByName|push|input|groups|select|currentElements||check|numberDE|handle|new|range|x20|previousValue|rangelength|objectLength|depends|creditcard|labelContainer|bEven|debug|focusInvalid|constructor|wrapper|defaultMessage|undefined|containers|addClass|switch|highlight|parameters|staticRules|errors|showLabel|rulesCache|hide|addWrapper|hideErrors|resetForm|selected|clean|errorLabelContainer|prepareForm|triggerHandler|errorElement|text|defaults|replace|is|fn|jQuery|dependTypes|msie|characters|than|abort|ajax|x0d|browser|Number|window|param|old|ein|idOrName|submit|break|special|fix|meta|cancelSubmit|handler|removeClass|prepareElement|lastElement|invalidElements|catch|focus|findLastActive|try|size|defaultShowErrors|grep|lastActive|ignoreTitle|ignore|errorContainer|checkForm|nothing|bind|invalidHandler|error|checkbox|radio|onsubmit|errorPlacement|init|focusout|focusin|RegExp|on|Array|nodeName|addClassRules|numberOfInvalids|autoCreateRanges|equal|or|makeArray|x7f|between|x0c|x0b|checked|x22|no|port|mode|accept|x0a|the|equalTo|x01|submitHandler|attributeRules|and|stopRequest|startRequest|classRules|depend|option|toLowerCase|metadataRules|to|null|normalizeRules|Sie|geben|html|Bitte|generated|map|show|errorContext|validElements|strong|findDefined|String|customMessage|customMetaMessage|field|id|target|formatAndAdd|click|onclick|assigned|onkeyup|cancel|has|disabled|image|can|visible|onfocusout|button|blockFocusCleanup|focusCleanup|removeAttr|onfocusin|find|label|removeAttrs|textarea|file|password|keyup|triggerEvent|removeEventListener|teardown|addEventListener|setup|slice|blur|valueCache|ajaxSettings|warn|match|gif|jpe|prototype|parseInt|charAt|greater|Date|NaN|Invalid|uF8FF|uE000|unshift|less|https|x7e|x5d|x23|long|x21|x1f|x0e|least|at|unchecked|more|filled|json|dataType|extension|with|default|specified|attributes|again|blank|same|multiple|expr|addMethod|isFunction|x08|card|524288|credit|2147483647|class|only|previous|x5b|Nummer|boolean|eine|ftp|Datum|getElementsByName|ltiges|document|g�|insertAfter|preventDefault|append|parent|wrap|ISO|remove|parents|URL|png|defined|No|Warning|val|address|title|returning|throw|checking|when|This|occured|exception|setDefaults|log|continue'.split('|'),0,{}))


jQuery.validator.addMethod("maxWords", function(value, element, params) {
    return this.optional(element) || value.match(/\b\w+\b/g).length < params;
}, $.format("Please enter {0} words or less."));

jQuery.validator.addMethod("minWords", function(value, element, params) {
    return this.optional(element) || value.match(/\b\w+\b/g).length >= params;
}, $.format("Please enter at least {0} words."));

jQuery.validator.addMethod("rangeWords", function(value, element, params) {
    return this.optional(element) || value.match(/\b\w+\b/g).length >= params[0] && value.match(/bw+b/g).length < params[1];
}, $.format("Please enter between {0} and {1} words."));


jQuery.validator.addMethod("letterswithbasicpunc", function(value, element) {
	return this.optional(element) || /^[a-z-.,()'\"\s]+$/i.test(value);
}, "Letters or punctuation only please");

jQuery.validator.addMethod("alphanumeric", function(value, element) {
	return this.optional(element) || /^\w+$/i.test(value);
}, "Letters, numbers, spaces or underscores only please");

jQuery.validator.addMethod("lettersonly", function(value, element) {
	return this.optional(element) || /^[a-z]+$/i.test(value);
}, "Letters only please");

jQuery.validator.addMethod("nowhitespace", function(value, element) {
	return this.optional(element) || /^\S+$/i.test(value);
}, "No white space please");

jQuery.validator.addMethod("ziprange", function(value, element) {
	return this.optional(element) || /^90[2-5]\d\{2}-\d{4}$/.test(value);
}, "Your ZIP-code must be in the range 902xx-xxxx to 905-xx-xxxx");

/**
* Return true, if the value is a valid vehicle identification number (VIN).
*
* Works with all kind of text inputs.
*
* @example <input type="text" size="20" name="VehicleID" class="{required:true,vinUS:true}" />
* @desc Declares a required input element whose value must be a valid vehicle identification number.
*
* @name jQuery.validator.methods.vinUS
* @type Boolean
* @cat Plugins/Validate/Methods
*/
jQuery.validator.addMethod(
	"vinUS",
	function(v){
		if (v.length != 17)
			return false;
		var i, n, d, f, cd, cdv;
		var LL    = ["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"];
		var VL    = [1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9];
		var FL    = [8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2];
		var rs    = 0;
		for(i = 0; i < 17; i++){
		    f = FL[i];
		    d = v.slice(i,i+1);
		    if(i == 8){
		        cdv = d;
		    }
		    if(!isNaN(d)){
		        d *= f;
		    }
		    else{
		        for(n = 0; n < LL.length; n++){
		            if(d.toUpperCase() === LL[n]){
		                d = VL[n];
		                d *= f;
		                if(isNaN(cdv) && n == 8){
		                    cdv = LL[n];
		                }
		                break;
		            }
		        }
		    }
		    rs += d;
		}
		cd = rs % 11;
		if(cd == 10){cd = "X";}
		if(cd == cdv){return true;}
		return false;
	},
	"The specified vehicle identification number (VIN) is invalid."
);

/**
  * Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.
  *
  * @example jQuery.validator.methods.date("01/01/1900")
  * @result true
  *
  * @example jQuery.validator.methods.date("01/13/1990")
  * @result false
  *
  * @example jQuery.validator.methods.date("01.01.1900")
  * @result false
  *
  * @example <input name="pippo" class="{dateITA:true}" />
  * @desc Declares an optional input element whose value must be a valid date.
  *
  * @name jQuery.validator.methods.dateITA
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
jQuery.validator.addMethod(
	"dateITA",
	function(value, element) {
		var check = false;
		var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/
		if( re.test(value)){
			var adata = value.split('/');
			var gg = parseInt(adata[0],10);
			var mm = parseInt(adata[1],10);
			var aaaa = parseInt(adata[2],10);
			var xdata = new Date(aaaa,mm-1,gg);
			if ( ( xdata.getFullYear() == aaaa ) && ( xdata.getMonth () == mm - 1 ) && ( xdata.getDate() == gg ) )
				check = true;
			else
				check = false;
		} else
			check = false;
		return this.optional(element) || check;
	},
	"Please enter a correct date"
);

jQuery.validator.addMethod("dateNL", function(value, element) {
		return this.optional(element) || /^\d\d?[\.\/-]\d\d?[\.\/-]\d\d\d?\d?$/.test(value);
	}, "Vul hier een geldige datum in."
);

jQuery.validator.addMethod("time", function(value, element) {
		return this.optional(element) || /^([01][0-9])|(2[0123]):([0-5])([0-9])$/.test(value);
	}, "Please enter a valid time, between 00:00 and 23:59"
);

/**
 * matches US phone number format
 *
 * where the area code may not start with 1 and the prefix may not start with 1
 * allows '-' or ' ' as a separator and allows parens around area code
 * some people may want to put a '1' in front of their number
 *
 * 1(212)-999-2345
 * or
 * 212 999 2344
 * or
 * 212-999-0983
 *
 * but not
 * 111-123-5434
 * and not
 * 212 123 4567
 */
jQuery.validator.addMethod("phone", function(phone_number, element) {
    phone_number = phone_number.replace(/\s+/g, "");
	return this.optional(element) || phone_number.length > 9 &&
		phone_number.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
}, "Please specify a valid phone number");

// TODO check if value starts with <, otherwise don't try stripping anything
jQuery.validator.addMethod("strippedminlength", function(value, element, param) {
	return jQuery(value).text().length >= param;
}, jQuery.format("Please enter at least {0} characters"));

// same as email, but TLD is optional
jQuery.validator.addMethod("email2", function(value, element, param) {
	return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
}, jQuery.validator.messages.email);

// same as url, but TLD is optional
jQuery.validator.addMethod("url2", function(value, element, param) {
	return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
}, jQuery.validator.messages.url);

jQuery.validator.addMethod("valeurinitiale", function(value, element, params) {
    return this.optional(element) || value.toLowerCase()!=params.toLowerCase();
}, jQuery.format("Veuillez saisir le champ {0} "));

/*
 * Translated default messages for the jQuery validation plugin.
 * Language: FR
 */
jQuery.extend(jQuery.validator.messages, {
        required: "Ce champ est requis.",
        remote: "Veuillez remplir ce champ pour continuer.",
        email: "Veuillez entrer une adresse email valide.",
        url: "Veuillez entrer une URL valide.",
        date: "Veuillez entrer une date valide.",
        dateISO: "Veuillez entrer une date valide (ISO).",
        number: "Veuillez entrer un nombre valide.",
        digits: "Veuillez entrer (seulement) une valeur numérique.",
        creditcard: "Veuillez entrer un numéro de carte de crédit valide.",
        equalTo: "Veuillez entrer une nouvelle fois la même valeur.",
        accept: "Veuillez entrer une valeur avec une extension valide.",
        maxlength: jQuery.format("Veuillez ne pas entrer plus de {0} caractères."),
        minlength: jQuery.format("Veuillez entrer au moins {0} caractères."),
        rangelength: jQuery.format("Veuillez entrer entre {0} et {1} caractères."),
        range: jQuery.format("Veuillez entrer une valeur entre {0} et {1}."),
        max: jQuery.format("Veuillez entrer une valeur inférieure ou égale à {0}."),
        min: jQuery.format("Veuillez entrer une valeur supérieure ou égale à {0}.")
});
/*
 * jQuery Form Plugin
 * @requires jQuery v1.1 or later
 *
 * Examples at: http://malsup.com/jquery/form/
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.form.js 3028 2007-08-31 13:37:36Z joern.zaefferer $
 */
 (function($) {
/**
 * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX.
 *
 * ajaxSubmit accepts a single argument which can be either a success callback function
 * or an options Object.  If a function is provided it will be invoked upon successful
 * completion of the submit and will be passed the response from the server.
 * If an options Object is provided, the following attributes are supported:
 *
 *  target:   Identifies the element(s) in the page to be updated with the server response.
 *            This value may be specified as a jQuery selection string, a jQuery object,
 *            or a DOM element.
 *            default value: null
 *
 *  url:      URL to which the form data will be submitted.
 *            default value: value of form's 'action' attribute
 *
 *  type:     The method in which the form data should be submitted, 'GET' or 'POST'.
 *            default value: value of form's 'method' attribute (or 'GET' if none found)
 *
 *  data:     Additional data to add to the request, specified as key/value pairs (see $.ajax).
 *
 *  beforeSubmit:  Callback method to be invoked before the form is submitted.
 *            default value: null
 *
 *  success:  Callback method to be invoked after the form has been successfully submitted
 *            and the response has been returned from the server
 *            default value: null
 *
 *  dataType: Expected dataType of the response.  One of: null, 'xml', 'script', or 'json'
 *            default value: null
 *
 *  semantic: Boolean flag indicating whether data must be submitted in semantic order (slower).
 *            default value: false
 *
 *  resetForm: Boolean flag indicating whether the form should be reset if the submit is successful
 *
 *  clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful
 *
 *
 * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for
 * validating the form data.  If the 'beforeSubmit' callback returns false then the form will
 * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data
 * in array format, the jQuery object, and the options object passed into ajaxSubmit.
 * The form data array takes the following form:
 *
 *     [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
 *
 * If a 'success' callback method is provided it is invoked after the response has been returned
 * from the server.  It is passed the responseText or responseXML value (depending on dataType).
 * See jQuery.ajax for further details.
 *
 *
 * The dataType option provides a means for specifying how the server response should be handled.
 * This maps directly to the jQuery.httpData method.  The following values are supported:
 *
 *      'xml':    if dataType == 'xml' the server response is treated as XML and the 'success'
 *                   callback method, if specified, will be passed the responseXML value
 *      'json':   if dataType == 'json' the server response will be evaluted and passed to
 *                   the 'success' callback, if specified
 *      'script': if dataType == 'script' the server response is evaluated in the global context
 *
 *
 * Note that it does not make sense to use both the 'target' and 'dataType' options.  If both
 * are provided the target will be ignored.
 *
 * The semantic argument can be used to force form serialization in semantic order.
 * This is normally true anyway, unless the form contains input elements of type='image'.
 * If your form must be submitted with name/value pairs in semantic order and your form
 * contains an input of type='image" then pass true for this arg, otherwise pass false
 * (or nothing) to avoid the overhead for this logic.
 *
 *
 * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this:
 *
 * $("#form-id").submit(function() {
 *     $(this).ajaxSubmit(options);
 *     return false; // cancel conventional submit
 * });
 *
 * When using ajaxForm(), however, this is done for you.
 *
 * @example
 * $('#myForm').ajaxSubmit(function(data) {
 *     alert('Form submit succeeded! Server returned: ' + data);
 * });
 * @desc Submit form and alert server response
 *
 *
 * @example
 * var options = {
 *     target: '#myTargetDiv'
 * };
 * $('#myForm').ajaxSubmit(options);
 * @desc Submit form and update page element with server response
 *
 *
 * @example
 * var options = {
 *     success: function(responseText) {
 *         alert(responseText);
 *     }
 * };
 * $('#myForm').ajaxSubmit(options);
 * @desc Submit form and alert the server response
 *
 *
 * @example
 * var options = {
 *     beforeSubmit: function(formArray, jqForm) {
 *         if (formArray.length == 0) {
 *             alert('Please enter data.');
 *             return false;
 *         }
 *     }
 * };
 * $('#myForm').ajaxSubmit(options);
 * @desc Pre-submit validation which aborts the submit operation if form data is empty
 *
 *
 * @example
 * var options = {
 *     url: myJsonUrl.php,
 *     dataType: 'json',
 *     success: function(data) {
 *        // 'data' is an object representing the the evaluated json data
 *     }
 * };
 * $('#myForm').ajaxSubmit(options);
 * @desc json data returned and evaluated
 *
 *
 * @example
 * var options = {
 *     url: myXmlUrl.php,
 *     dataType: 'xml',
 *     success: function(responseXML) {
 *        // responseXML is XML document object
 *        var data = $('myElement', responseXML).text();
 *     }
 * };
 * $('#myForm').ajaxSubmit(options);
 * @desc XML data returned from server
 *
 *
 * @example
 * var options = {
 *     resetForm: true
 * };
 * $('#myForm').ajaxSubmit(options);
 * @desc submit form and reset it if successful
 *
 * @example
 * $('#myForm).submit(function() {
 *    $(this).ajaxSubmit();
 *    return false;
 * });
 * @desc Bind form's submit event to use ajaxSubmit
 *
 *
 * @name ajaxSubmit
 * @type jQuery
 * @param options  object literal containing options which control the form submission process
 * @cat Plugins/Form
 * @return jQuery
 */
$.fn.ajaxSubmit = function(options) {
    if (typeof options == 'function')
        options = { success: options };

    options = $.extend({
        url:  this.attr('action') || window.location,
        type: this.attr('method') || 'GET'
    }, options || {});

    // hook for manipulating the form data before it is extracted;
    // convenient for use with rich editors like tinyMCE or FCKEditor
    var veto = {};
    $.event.trigger('form.pre.serialize', [this, options, veto]);
    if (veto.veto) return this;

    var a = this.formToArray(options.semantic);
	if (options.data) {
	    for (var n in options.data)
	        a.push( { name: n, value: options.data[n] } );
	}

    // give pre-submit callback an opportunity to abort the submit
    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this;

    // fire vetoable 'validate' event
    $.event.trigger('form.submit.validate', [a, this, options, veto]);
    if (veto.veto) return this;

    var q = $.param(a);//.replace(/%20/g,'+');

    if (options.type.toUpperCase() == 'GET') {
        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
        options.data = null;  // data is null for 'get'
    }
    else
        options.data = q; // data is the query string for 'post'

    var $form = this, callbacks = [];
    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });

    // perform a load on the target only if dataType is not provided
    if (!options.dataType && options.target) {
        var oldSuccess = options.success || function(){};
        callbacks.push(function(data) {
            if (this.evalScripts)
                $(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, arguments);
            else // jQuery v1.1.4
                $(options.target).html(data).each(oldSuccess, arguments);
        });
    }
    else if (options.success)
        callbacks.push(options.success);

    options.success = function(data, status) {
        for (var i=0, max=callbacks.length; i < max; i++)
            callbacks[i](data, status, $form);
    };

    // are there files to upload?
    var files = $('input:file', this).fieldValue();
    var found = false;
    for (var j=0; j < files.length; j++)
        if (files[j])
            found = true;

    if (options.iframe || found) // options.iframe allows user to force iframe mode
        fileUpload();
    else
        $.ajax(options);

    // fire 'notify' event
    $.event.trigger('form.submit.notify', [this, options]);
    return this;


    // private function for handling file uploads (hat tip to YAHOO!)
    function fileUpload() {
        var form = $form[0];
        var opts = $.extend({}, $.ajaxSettings, options);

        var id = 'jqFormIO' + $.fn.ajaxSubmit.counter++;
        var $io = $('<iframe id="' + id + '" name="' + id + '" />');
        var io = $io[0];
        var op8 = $.browser.opera && window.opera.version() < 9;
        if ($.browser.msie || op8) io.src = 'javascript:false;document.write("");';
        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });

        var xhr = { // mock object
            responseText: null,
            responseXML: null,
            status: 0,
            statusText: 'n/a',
            getAllResponseHeaders: function() {},
            getResponseHeader: function() {},
            setRequestHeader: function() {}
        };

        var g = opts.global;
        // trigger ajax global events so that activity/block indicators work like normal
        if (g && ! $.active++) $.event.trigger("ajaxStart");
        if (g) $.event.trigger("ajaxSend", [xhr, opts]);

        var cbInvoked = 0;
        var timedOut = 0;

        // take a breath so that pending repaints get some cpu time before the upload starts
        setTimeout(function() {
            $io.appendTo('body');
            // jQuery's event binding doesn't work for iframe events in IE
            io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);

            // make sure form attrs are set
            var encAttr = form.encoding ? 'encoding' : 'enctype';
            var t = $form.attr('target');
            $form.attr({
                target:   id,
                method:  'POST',
                action:   opts.url
            });
            form[encAttr] = 'multipart/form-data';

            // support timout
            if (opts.timeout)
                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);

            form.submit();
            $form.attr('target', t); // reset target
        }, 10);

        function cb() {
            if (cbInvoked++) return;

            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);

            var ok = true;
            try {
                if (timedOut) throw 'timeout';
                // extract the server response from the iframe
                var data, doc;
                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
                xhr.responseText = doc.body ? doc.body.innerHTML : null;
                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;

                if (opts.dataType == 'json' || opts.dataType == 'script') {
                    var ta = doc.getElementsByTagName('textarea')[0];
                    data = ta ? ta.value : xhr.responseText;
                    if (opts.dataType == 'json')
                        eval("data = " + data);
                    else
                        $.globalEval(data);
                }
                else if (opts.dataType == 'xml') {
                    data = xhr.responseXML;
                    if (!data && xhr.responseText != null)
                        data = toXml(xhr.responseText);
                }
                else {
                    data = xhr.responseText;
                }
            }
            catch(e){
                ok = false;
                $.handleError(opts, xhr, 'error', e);
            }

            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
            if (ok) {
                opts.success(data, 'success');
                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
            }
            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
            if (g && ! --$.active) $.event.trigger("ajaxStop");
            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');

            // clean up
            setTimeout(function() {
                $io.remove();
                xhr.responseXML = null;
            }, 100);
        };

        function toXml(s, doc) {
            if (window.ActiveXObject) {
                doc = new ActiveXObject('Microsoft.XMLDOM');
                doc.async = 'false';
                doc.loadXML(s);
            }
            else
                doc = (new DOMParser()).parseFromString(s, 'text/xml');
            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
        };
    };
};
$.fn.ajaxSubmit.counter = 0; // used to create unique iframe ids

/**
 * ajaxForm() provides a mechanism for fully automating form submission.
 *
 * The advantages of using this method instead of ajaxSubmit() are:
 *
 * 1: This method will include coordinates for <input type="image" /> elements (if the element
 *    is used to submit the form).
 * 2. This method will include the submit element's name/value data (for the element that was
 *    used to submit the form).
 * 3. This method binds the submit() method to the form for you.
 *
 * Note that for accurate x/y coordinates of image submit elements in all browsers
 * you need to also use the "dimensions" plugin (this method will auto-detect its presence).
 *
 * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
 * passes the options argument along after properly binding events for submit elements and
 * the form itself.  See ajaxSubmit for a full description of the options argument.
 *
 *
 * @example
 * var options = {
 *     target: '#myTargetDiv'
 * };
 * $('#myForm').ajaxSForm(options);
 * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response
 *       when the form is submitted.
 *
 *
 * @example
 * var options = {
 *     success: function(responseText) {
 *         alert(responseText);
 *     }
 * };
 * $('#myForm').ajaxSubmit(options);
 * @desc Bind form's submit event so that server response is alerted after the form is submitted.
 *
 *
 * @example
 * var options = {
 *     beforeSubmit: function(formArray, jqForm) {
 *         if (formArray.length == 0) {
 *             alert('Please enter data.');
 *             return false;
 *         }
 *     }
 * };
 * $('#myForm').ajaxSubmit(options);
 * @desc Bind form's submit event so that pre-submit callback is invoked before the form
 *       is submitted.
 *
 *
 * @name   ajaxForm
 * @param  options  object literal containing options which control the form submission process
 * @return jQuery
 * @cat    Plugins/Form
 * @type   jQuery
 */
$.fn.ajaxForm = function(options) {
    return this.ajaxFormUnbind().submit(submitHandler).each(function() {
        // store options in hash
        this.formPluginId = $.fn.ajaxForm.counter++;
        $.fn.ajaxForm.optionHash[this.formPluginId] = options;
        $(":submit,input:image", this).click(clickHandler);
    });
};

$.fn.ajaxForm.counter = 1;
$.fn.ajaxForm.optionHash = {};

function clickHandler(e) {
    var $form = this.form;
    $form.clk = this;
    if (this.type == 'image') {
        if (e.offsetX != undefined) {
            $form.clk_x = e.offsetX;
            $form.clk_y = e.offsetY;
        } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
            var offset = $(this).offset();
            $form.clk_x = e.pageX - offset.left;
            $form.clk_y = e.pageY - offset.top;
        } else {
            $form.clk_x = e.pageX - this.offsetLeft;
            $form.clk_y = e.pageY - this.offsetTop;
        }
    }
    // clear form vars
    setTimeout(function() { $form.clk = $form.clk_x = $form.clk_y = null; }, 10);
};

function submitHandler() {
    // retrieve options from hash
    var id = this.formPluginId;
    var options = $.fn.ajaxForm.optionHash[id];
    $(this).ajaxSubmit(options);
    return false;
};

/**
 * ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
 *
 * @name   ajaxFormUnbind
 * @return jQuery
 * @cat    Plugins/Form
 * @type   jQuery
 */
$.fn.ajaxFormUnbind = function() {
    this.unbind('submit', submitHandler);
    return this.each(function() {
        $(":submit,input:image", this).unbind('click', clickHandler);
    });

};

/**
 * formToArray() gathers form element data into an array of objects that can
 * be passed to any of the following ajax functions: $.get, $.post, or load.
 * Each object in the array has both a 'name' and 'value' property.  An example of
 * an array for a simple login form might be:
 *
 * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
 *
 * It is this array that is passed to pre-submit callback functions provided to the
 * ajaxSubmit() and ajaxForm() methods.
 *
 * The semantic argument can be used to force form serialization in semantic order.
 * This is normally true anyway, unless the form contains input elements of type='image'.
 * If your form must be submitted with name/value pairs in semantic order and your form
 * contains an input of type='image" then pass true for this arg, otherwise pass false
 * (or nothing) to avoid the overhead for this logic.
 *
 * @example var data = $("#myForm").formToArray();
 * $.post( "myscript.cgi", data );
 * @desc Collect all the data from a form and submit it to the server.
 *
 * @name formToArray
 * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
 * @type Array<Object>
 * @cat Plugins/Form
 */
$.fn.formToArray = function(semantic) {
    var a = [];
    if (this.length == 0) return a;

    var form = this[0];
    var els = semantic ? form.getElementsByTagName('*') : form.elements;
    if (!els) return a;
    for(var i=0, max=els.length; i < max; i++) {
        var el = els[i];
        var n = el.name;
        if (!n) continue;

        if (semantic && form.clk && el.type == "image") {
            // handle image inputs on the fly when semantic == true
            if(!el.disabled && form.clk == el)
                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
            continue;
        }

        var v = $.fieldValue(el, true);
        if (v && v.constructor == Array) {
            for(var j=0, jmax=v.length; j < jmax; j++)
                a.push({name: n, value: v[j]});
        }
        else if (v !== null && typeof v != 'undefined')
            a.push({name: n, value: v});
    }

    if (!semantic && form.clk) {
        // input type=='image' are not found in elements array! handle them here
        var inputs = form.getElementsByTagName("input");
        for(var i=0, max=inputs.length; i < max; i++) {
            var input = inputs[i];
            var n = input.name;
            if(n && !input.disabled && input.type == "image" && form.clk == input)
                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
        }
    }
    return a;
};


/**
 * Serializes form data into a 'submittable' string. This method will return a string
 * in the format: name1=value1&amp;name2=value2
 *
 * The semantic argument can be used to force form serialization in semantic order.
 * If your form must be submitted with name/value pairs in semantic order then pass
 * true for this arg, otherwise pass false (or nothing) to avoid the overhead for
 * this logic (which can be significant for very large forms).
 *
 * @example var data = $("#myForm").formSerialize();
 * $.ajax('POST', "myscript.cgi", data);
 * @desc Collect all the data from a form into a single string
 *
 * @name formSerialize
 * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
 * @type String
 * @cat Plugins/Form
 */
$.fn.formSerialize = function(semantic) {
    //hand off to jQuery.param for proper encoding
    return $.param(this.formToArray(semantic));
};


/**
 * Serializes all field elements in the jQuery object into a query string.
 * This method will return a string in the format: name1=value1&amp;name2=value2
 *
 * The successful argument controls whether or not serialization is limited to
 * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
 * The default value of the successful argument is true.
 *
 * @example var data = $("input").formSerialize();
 * @desc Collect the data from all successful input elements into a query string
 *
 * @example var data = $(":radio").formSerialize();
 * @desc Collect the data from all successful radio input elements into a query string
 *
 * @example var data = $("#myForm :checkbox").formSerialize();
 * @desc Collect the data from all successful checkbox input elements in myForm into a query string
 *
 * @example var data = $("#myForm :checkbox").formSerialize(false);
 * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string
 *
 * @example var data = $(":input").formSerialize();
 * @desc Collect the data from all successful input, select, textarea and button elements into a query string
 *
 * @name fieldSerialize
 * @param successful true if only successful controls should be serialized (default is true)
 * @type String
 * @cat Plugins/Form
 */
$.fn.fieldSerialize = function(successful) {
    var a = [];
    this.each(function() {
        var n = this.name;
        if (!n) return;
        var v = $.fieldValue(this, successful);
        if (v && v.constructor == Array) {
            for (var i=0,max=v.length; i < max; i++)
                a.push({name: n, value: v[i]});
        }
        else if (v !== null && typeof v != 'undefined')
            a.push({name: this.name, value: v});
    });
    //hand off to jQuery.param for proper encoding
    return $.param(a);
};


/**
 * Returns the value(s) of the element in the matched set.  For example, consider the following form:
 *
 *  <form><fieldset>
 *      <input name="A" type="text" />
 *      <input name="A" type="text" />
 *      <input name="B" type="checkbox" value="B1" />
 *      <input name="B" type="checkbox" value="B2"/>
 *      <input name="C" type="radio" value="C1" />
 *      <input name="C" type="radio" value="C2" />
 *  </fieldset></form>
 *
 *  var v = $(':text').fieldValue();
 *  // if no values are entered into the text inputs
 *  v == ['','']
 *  // if values entered into the text inputs are 'foo' and 'bar'
 *  v == ['foo','bar']
 *
 *  var v = $(':checkbox').fieldValue();
 *  // if neither checkbox is checked
 *  v === undefined
 *  // if both checkboxes are checked
 *  v == ['B1', 'B2']
 *
 *  var v = $(':radio').fieldValue();
 *  // if neither radio is checked
 *  v === undefined
 *  // if first radio is checked
 *  v == ['C1']
 *
 * The successful argument controls whether or not the field element must be 'successful'
 * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
 * The default value of the successful argument is true.  If this value is false the value(s)
 * for each element is returned.
 *
 * Note: This method *always* returns an array.  If no valid value can be determined the
 *       array will be empty, otherwise it will contain one or more values.
 *
 * @example var data = $("#myPasswordElement").fieldValue();
 * alert(data[0]);
 * @desc Alerts the current value of the myPasswordElement element
 *
 * @example var data = $("#myForm :input").fieldValue();
 * @desc Get the value(s) of the form elements in myForm
 *
 * @example var data = $("#myForm :checkbox").fieldValue();
 * @desc Get the value(s) for the successful checkbox element(s) in the jQuery object.
 *
 * @example var data = $("#mySingleSelect").fieldValue();
 * @desc Get the value(s) of the select control
 *
 * @example var data = $(':text').fieldValue();
 * @desc Get the value(s) of the text input or textarea elements
 *
 * @example var data = $("#myMultiSelect").fieldValue();
 * @desc Get the values for the select-multiple control
 *
 * @name fieldValue
 * @param Boolean successful true if only the values for successful controls should be returned (default is true)
 * @type Array<String>
 * @cat Plugins/Form
 */
$.fn.fieldValue = function(successful) {
    for (var val=[], i=0, max=this.length; i < max; i++) {
        var el = this[i];
        var v = $.fieldValue(el, successful);
        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
            continue;
        v.constructor == Array ? $.merge(val, v) : val.push(v);
    }
    return val;
};

/**
 * Returns the value of the field element.
 *
 * The successful argument controls whether or not the field element must be 'successful'
 * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
 * The default value of the successful argument is true.  If the given element is not
 * successful and the successful arg is not false then the returned value will be null.
 *
 * Note: If the successful flag is true (default) but the element is not successful, the return will be null
 * Note: The value returned for a successful select-multiple element will always be an array.
 * Note: If the element has no value the return value will be undefined.
 *
 * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]);
 * @desc Gets the current value of the myPasswordElement element
 *
 * @name fieldValue
 * @param Element el The DOM element for which the value will be returned
 * @param Boolean successful true if value returned must be for a successful controls (default is true)
 * @type String or Array<String> or null or undefined
 * @cat Plugins/Form
 */
$.fieldValue = function(el, successful) {
    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
    if (typeof successful == 'undefined') successful = true;

    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
        (t == 'checkbox' || t == 'radio') && !el.checked ||
        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
        tag == 'select' && el.selectedIndex == -1))
            return null;

    if (tag == 'select') {
        var index = el.selectedIndex;
        if (index < 0) return null;
        var a = [], ops = el.options;
        var one = (t == 'select-one');
        var max = (one ? index+1 : ops.length);
        for(var i=(one ? index : 0); i < max; i++) {
            var op = ops[i];
            if (op.selected) {
                // extra pain for IE...
                var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
                if (one) return v;
                a.push(v);
            }
        }
        return a;
    }
    return el.value;
};


/**
 * Clears the form data.  Takes the following actions on the form's input fields:
 *  - input text fields will have their 'value' property set to the empty string
 *  - select elements will have their 'selectedIndex' property set to -1
 *  - checkbox and radio inputs will have their 'checked' property set to false
 *  - inputs of type submit, button, reset, and hidden will *not* be effected
 *  - button elements will *not* be effected
 *
 * @example $('form').clearForm();
 * @desc Clears all forms on the page.
 *
 * @name clearForm
 * @type jQuery
 * @cat Plugins/Form
 */
$.fn.clearForm = function() {
    return this.each(function() {
        $('input,select,textarea', this).clearFields();
    });
};

/**
 * Clears the selected form elements.  Takes the following actions on the matched elements:
 *  - input text fields will have their 'value' property set to the empty string
 *  - select elements will have their 'selectedIndex' property set to -1
 *  - checkbox and radio inputs will have their 'checked' property set to false
 *  - inputs of type submit, button, reset, and hidden will *not* be effected
 *  - button elements will *not* be effected
 *
 * @example $('.myInputs').clearFields();
 * @desc Clears all inputs with class myInputs
 *
 * @name clearFields
 * @type jQuery
 * @cat Plugins/Form
 */
$.fn.clearFields = $.fn.clearInputs = function() {
    return this.each(function() {
        var t = this.type, tag = this.tagName.toLowerCase();
        if (t == 'text' || t == 'password' || tag == 'textarea')
            this.value = '';
        else if (t == 'checkbox' || t == 'radio')
            this.checked = false;
        else if (tag == 'select')
            this.selectedIndex = -1;
    });
};


/**
 * Resets the form data.  Causes all form elements to be reset to their original value.
 *
 * @example $('form').resetForm();
 * @desc Resets all forms on the page.
 *
 * @name resetForm
 * @type jQuery
 * @cat Plugins/Form
 */
$.fn.resetForm = function() {
    return this.each(function() {
        // guard against an input with the name of 'reset'
        // note that IE reports the reset function as an 'object'
        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
            this.reset();
    });
};

})(jQuery);



