var fValidator=new Class({Implements:[Options,Events],options:{msgContainerTag:"div",msgClass:"fValidator-msg",styleNeutral:"fValidator-Neutral",styleInvalid:"fValidator-Invalid",styleValid:"fValidator-Valid",required:{type:"required",re:/[^.*]/,msg:"Ce champ est requis."},alpha:{type:"alpha",re:/^[a-z ._-]+$/i,msg:"Ce champ n'accepte que des caract&egrave;res alphabetiques."},alphanum:{type:"alphanum",re:/^[a-z0-9 ._-]+$/i,msg:"Ce champ n'accepte que des caract&egrave;res alphanum&eacute;rique."},integer:{type:"integer",re:/^[-+]?\d+$/,msg:"Veuiller saisir un entier."},real:{type:"real",re:/^[-+]?\d*[\.,]?\d+$/,msg:"Veuiller saisir un nombre."},date:{type:"date",re:/^((((0[13578])|([13578])|(1[02]))[\/](([1-9])|([0-2][0-9])|(3[01])))|(((0[469])|([469])|(11))[\/](([1-9])|([0-2][0-9])|(30)))|((2|02)[\/](([1-9])|([0-2][0-9]))))[\/]\d{4}$|^\d{4}$/,msg:"Veuiller saisir un date (jj/mm/aaaa)."},email:{type:"email",re:/^([a-z0-9_\.\-\+])+\@(([a-z0-9\-])+\.)+([a-z0-9]{2,4})+$/i,msg:"Veuiller saisir une adresse mail."},phone:{type:"phone",re:/^[\d\s ().-]+$/,msg:"Veuiller saisir un num&eacute;ro de t&eacute;l&eacute;phone."},url:{type:"url",re:/^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i,msg:"Veuiller saisir une adresse internet."},confirm:{type:"confirm",msg:"Confirm Password does not match original Password."},onValid:Class.empty,onInvalid:Class.empty},initialize:function(form,options){this.form=$(form);this.setOptions(options);this.fields=this.form.getElements("*[class^=fValidate]");this.validations=[];this.fields.each(function(element){if(!this._isChildType(element)){element.morph("."+this.options.styleNeutral)}element.cbErr=0;var classes=element.getProperty("class").split(" "),aFilters,i;classes.each(function(klass){if(klass.match(/^fValidate(\[.+\])$/)){aFilters=eval(klass.match(/^fValidate(\[.+\])$/)[1]);for(i=0;i<aFilters.length;i++){if(this.options[aFilters[i]]){this.register(element,this.options[aFilters[i]])}if(aFilters[i].charAt(0)=="="){this.register(element,$extend(this.options.confirm,{idField:aFilters[i].substr(1)}))}}}}.bind(this))}.bind(this));this.form.addEvents({submit:this._onSubmit.bind(this),reset:this._onReset.bind(this)})},register:function(B,A){B=$(B);this.validations.push([B,A]);B.addEvent("blur",function(){this._validate(B,A)}.bind(this))},_isChildType:function(B){var A=B.type.toLowerCase();if((A=="radio")||(A=="checkbox")){return true}return false},_validate:function(B,A){switch(A.type){case"confirm":if($(A.idField).get("value")==B.get("value")){this._msgRemove(B,A)}else{this._msgInject(B,A)}break;default:if(A.re.test(B.get("value"))){this._msgRemove(B,A)}else{this._msgInject(B,A)}}},_validateChild:function(F,B){var A=this.form[F.getProperty("name")],D=0,E=true,C;for(C=0;C<A.length;C++){if(A[C].checked){D++;if(!B.re.test(A[C].getValue())){E=false;break}}}if(D==0&&B.type=="required"){E=false}if(E){this._msgRemove(F,B)}else{this._msgInject(F,B)}},_msgInject:function(A,B){if(!$(A.getProperty("id")+B.type+"_msg")){new Element(this.options.msgContainerTag,{id:A.getProperty("id")+B.type+"_msg","class":this.options.msgClass}).set("html",B.msg).setStyle("opacity",0).injectAfter(A).fade("in");A.cbErr++;this._chkStatus(A,B)}},_msgRemove:function(A,B,D){D=D||false;if($(A.getProperty("id")+B.type+"_msg")){var C=$(A.getProperty("id")+B.type+"_msg").get("tween").addEvent("complete",function(){C.destroy()}).element.fade("out")}if(!D){if(A.cbErr){A.cbErr--}this._chkStatus(A,B)}},_chkStatus:function(B,A){if(B.cbErr==0){B.morph("."+this.options.styleValid);this.fireEvent("onValid",[B,A],50)}else{B.morph("."+this.options.styleInvalid);this.fireEvent("onInvalid",[B,A],50)}},_onSubmit:function(A){A=new Event(A);var B=true;this.validations.each(function(C){if(this._isChildType(C[0])){this._validateChild(C[0],C[1])}else{this._validate(C[0],C[1])}if(C[0].cbErr>0){B=false}}.bind(this));if(!B){A.stop()}return B},_onReset:function(){this.validations.each(function(A){if(!this._isChildType(A[0])){A[0].morph("."+this.options.styleNeutral)}A[0].cbErr=0;this._msgRemove(A[0],A[1],true)}.bind(this))}});