var fValidator=new Class({Implements:[Events,Options],options:{msgContainerTag:"div",msgClass:"fValidator-msg",styleNeutral:{"background-color":"#fff","border-color":"#369"},styleInvalid:{"background-color":"#fcc","border-color":"#c00"},styleValid:{"background-color":"#cfc","border-color":"#0c0"},language:"en",languagesPath:"./fValidator-lang/",required:{type:"required",re:/[^.*]/},alpha:{type:"alpha",re:/^[a-z ._-]+$/i},alphanum:{type:"alphanum",re:/^[a-z0-9 ._-]+$/i},integer:{type:"integer",re:/^[-+]?\d+$/},real:{type:"real",re:/^[-+]?\d*\.?\d+$/},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}$/},dateISO8601:{type:"dateISO8601",re:/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/},dateEu:{type:"dateEU",re:/^(((([1-9])|([0-2][0-9])|(3[01]))[-]((0[13578])|([13578])|(1[02])))|((([1-9])|([0-2][0-9])|(30))[-]((0[469])|([469])|(11)))|((([1-9])|([0-2][0-9])))[-](2|02))[-]\d{4}$|^\d{4}$/},email:{type:"email",re:/^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i},phone:{type:"phone",re:/^[\d\s ().-]+$/},url:{type:"url",re:/^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i},zip:{type:"zip",re:/^\d{5}(-\d{4})?$/i},confirm:{type:"confirm"},onValid:Class.empty,onInvalid:Class.empty},initialize:function(form,options){this.setOptions(options);var testar=new Asset.javascript(this.options.languagesPath+this.options.language+".js",{id:"fValidatorLang"});this.form=document.id(form);this.fields=this.form.getElements("*[class^=fValidate]");this.validations=[];this.fields.each(function(element){if(!this._isChildType(element)){element.setStyles(this.options.styleNeutral)}element.cbErr=0;var classes=element.getProperty("class").split(" ");classes.each(function(klass){if(klass.match(/^fValidate(\[.+\])$/)){var aFilters=eval(klass.match(/^fValidate(\[.+\])$/)[1]);for(var 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=document.id(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(document.id(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")];var d=0;var e=true;for(var c=0;c<a.length;c++){if(a[c].checked){d++;if(!b.re.test(a[c].get("value"))){e=false;break}}}if(d==0&&b.type=="required"){e=false}if(e){this._msgRemove(f,b)}else{this._msgInject(f,b)}},_msgInject:function(b,c){if(!document.id(b.getProperty("id")+c.type+"_msg")){var d=new Element(this.options.msgContainerTag,{id:b.get("id")+c.type+"_msg","class":this.options.msgClass}).set("html",i18n[c.type]).setStyle("opacity",0).injectAfter(b);var a=new Fx.Tween(d,{duration:500,transition:Fx.Transitions.linear}).start("opacity",0,1);b.cbErr++;this._chkStatus(b,c)}},_msgRemove:function(b,c,e){e=e||false;if(document.id(b.getProperty("id")+c.type+"_msg")){var d=document.id(b.getProperty("id")+c.type+"_msg");var a=new Fx.Tween(d,{duration:500,transition:Fx.Transitions.linear,onComplete:function(){d.destroy()}}).start("opacity",1,0);if(!e){b.cbErr--;this._chkStatus(b,c)}}},_chkStatus:function(c,b){if(c.cbErr==0){var a=new Fx.Morph(c,{duration:500,transition:Fx.Transitions.linear}).start(this.options.styleValid);this.fireEvent("onValid",[c,b],50)}else{var a=new Fx.Morph(c,{duration:500,transition:Fx.Transitions.linear}).start(this.options.styleInvalid);this.fireEvent("onInvalid",[c,b],50)}},_onSubmit:function(a){var 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].setStyles(this.options.styleNeutral)}a[0].cbErr=0;this._msgRemove(a[0],a[1],true)}.bind(this))}});
