var FormCheck=new Class({options:{tips_class:"tipsbox",error_class:"error_f",display:{showErrors:1,errorsLocation:1,indicateErrors:1,tipsOffsetX:-30,tipsOffsetY:-5,tipsPosition:"relative",tipsContainer:"undef",listErrorsAtTop:false,scrollToFirst:true,fadeDuration:300},alerts:{required:"This field is required.",alpha:"This field accepts alphabetic characters only.",alphanum:"This field accepts alphanumeric characters only.",nodigit:"No digits are accepted.",digit:"Please enter a valid integer.",digitmin:"The number must be at least %0",digitltd:"The value must be between %0 and %1",number:"Please enter a valid number.",email:"Please enter a valid email.",phone:"Please enter a valid phone.",url:"Please enter a valid url.",confirm:"This field is different from %0",differs:"This value must be different of %0",length_str:"The length is incorrect, it must be between %0 and %1",lengthmax:"The length is incorrect, it must be at max %0",lengthmin:"The length is incorrect, it must be at least %0",checkbox:"Please check the box",radios:"Please select a radio",select:"Please choose a value"},regexp:{required:/[^.*]/,alpha:/^[a-z ._-]+$/i,alphanum:/^[a-z0-9 ._-]+$/i,digit:/^[-+]?[0-9]+$/,nodigit:/^[^0-9]+$/,number:/^[-+]?\d*\.?\d+$/,email:/^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i,phone:/^[\d\s ().-]+$/,url:/^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i}},initialize:function(form,options){if(this.form=$(form)){this.form.isValid=true;this.regex=["length"];this.setOptions(options);if(typeof (formcheckLanguage)!="undefined"){this.options.alerts=formcheckLanguage}this.validations=[];this.alreadyIndicated=false;this.firstError=false;var regex=new Hash(this.options.regexp);regex.each(function(el,key){this.regex.push(key)},this);this.form.getElements("*[class*=validate]").each(function(el){el.validation=[];var classes=el.getProperty("class").split(" ");classes.each(function(classX){if(classX.match(/^validate(\[.+\])$/)){var validators=eval(classX.match(/^validate(\[.+\])$/)[1]);for(var i=0;i<validators.length;i++){el.validation.push(validators[i])}this._register(el)}},this)},this);this.form.addEvents({submit:this._onSubmit.bind(this)})}},_register:function(C){this.validations.push(C);C.errors=[];if(this._isChildType(C)==false&&this.options.display.showErrors==1){C.addEvent("blur",function(){this._manageError(C,"blur")}.bind(this))}else{if(this._isChildType(C)==true&&this.options.display.showErrors==1&&!window.ie){var A=this.form[C.getProperty("name")];for(var B=0;B<A.length;B++){A[B].addEvent("click",function(){this._manageError(C,"blur")}.bind(this))}}}},_validate:function(el){el.errors=[];el.isOk=true;el.validation.each(function(rule){if(this._isChildType(el)){if(this._validateGroup(el)==false){el.isOk=false}}else{var ruleArgs=[];if(rule.match(/^.+\[/)){var ruleMethod=rule.split("[")[0];var ruleArgs=eval(rule.match(/^.+(\[.+\])$/)[1].replace(/([A-Z]+)/i,"'$1'"))}else{var ruleMethod=rule}if(this.regex.contains(ruleMethod)){if(this._validateRegex(el,ruleMethod,ruleArgs)==false){el.isOk=false}}if(ruleMethod=="confirm"){if(this._validateConfirm(el,ruleArgs)==false){el.isOk=false}}if(ruleMethod=="differs"){if(this._validateDiffers(el,ruleArgs)==false){el.isOk=false}}if(el.getTag()=="select"||el.type=="checkbox"){if(this._simpleValidate(el)==false){el.isOk=false}}}},this);if(el.isOk){return true}else{return false}},_simpleValidate:function(A){if(A.getTag()=="select"&&(A.value==A.options[0].value)){A.errors.push(this.options.alerts.select);return false}else{if(A.type=="checkbox"&&A.checked==false){A.errors.push(this.options.alerts.checkbox);return false}}return true},_validateRegex:function(C,B,D){var E="";if(D[1]&&B=="length"){if(D[1]==-1){this.options.regexp.length=new RegExp("^.{"+D[0]+",}$");E=this.options.alerts.lengthmin.replace("%0",D[0])}else{this.options.regexp.length=new RegExp("^.{"+D[0]+","+D[1]+"}$");E=this.options.alerts.length_str.replace("%0",D[0]).replace("%1",D[1])}}else{if(D[0]){this.options.regexp.length=new RegExp("^.{0,"+D[0]+"}$");E=this.options.alerts.lengthmax.replace("%0",D[0])}else{E=this.options.alerts[B]}}if(D[1]&&B=="digit"){var A=true;if(!this.options.regexp.digit.test(C.value)){C.errors.push(this.options.alerts[B]);A=false}if(D[1]==-1){if(C.value>=D[0]){var F=true}else{var F=false}E=this.options.alerts.digitmin.replace("%0",D[0])}else{if(C.value>=D[0]&&C.value<=D[1]){var F=true}else{var F=false}E=this.options.alerts.digitltd.replace("%0",D[0]).replace("%1",D[1])}if(A==false||F==false){C.errors.push(E);return false}}else{if(this.options.regexp[B].test(C.value)==false){C.errors.push(E);return false}}return true},_validateConfirm:function(B,C){if(B.validation.contains("required")==false){}var A=C[0];if(B.value!=this.form[A].value){msg=this.options.alerts.confirm.replace("%0",C[0]);B.errors.push(msg);return false}return true},_validateDiffers:function(B,C){var A=C[0];if(B.value==this.form[A].value){msg=this.options.alerts.differs.replace("%0",C[0]);B.errors.push(msg);return false}return true},_isChildType:function(B){var A=B.type.toLowerCase();if((A=="radio")){return true}return false},_validateGroup:function(D){D.errors=[];var A=this.form[D.getProperty("name")];D.group=A;var C=false;for(var B=0;B<A.length;B++){if(A[B].checked){C=true}}if(C==false){D.errors.push(this.options.alerts.radios);return false}else{return true}},_listErrorsAtTop:function(A){if(!this.form.element){this.form.element=new Element("div",{id:"errorlist","class":this.options.error_class}).injectTop(this.form)}if($type(A)=="collection"){new Element("p").setHTML("<span>"+A[0].name+" : </span>"+A[0].errors[0]).injectInside(this.form.element)}else{if((A.validation.contains("required")&&A.errors.length>0)||(A.errors.length>0&&A.value&&A.validation.contains("required")==false)){A.errors.each(function(B){new Element("p").setHTML("<span>"+A.name+" : </span>"+B).injectInside(this.form.element)},this)}}},_manageError:function(A,C){var B=this._validate(A);if(((!B&&A.validation.contains("required"))||(!A.validation.contains("required")&&A.value&&!B))){if(this.options.display.listErrorsAtTop==true&&C=="submit"){this._listErrorsAtTop(A,C)}if(this.options.display.indicateErrors==2||this.alreadyIndicated==false||A.name==this.alreadyIndicated.name){this._addError(A);return false}}else{if((B||(!A.validation.contains("required")&&!A.value))&&A.element){this._removeError(A);return true}}return true},_addError:function(E){this.alreadyIndicated=E;if(!this.firstError){this.firstError=E}if(!E.element){if(this.options.display.errorsLocation==1){if(this.options.display.tipsPosition=="relative"){var D=(window.ie)?this.options.display.tipsOffsetX-75:this.options.display.tipsOffsetX;if(this.options.display.tipsContainer="undef"){var B=this.form.getCoordinates().left}else{var B=$(this.options.display.tipsContainer).getCoordinates().left}var C={opacity:0,position:"absolute","margin-left":E.getCoordinates().right-B+D}}else{if(this.options.display.tipsPosition=="absolute"){var C={opacity:0,position:"absolute","margin-left":this.options.display.tipsOffsetX,left:E.getCoordinates().right,bottom:E.getCoordinates().top}}}E.element=new Element("div",{id:"diverror"+E.name,"class":this.options.tips_class,styles:C});E.element.injectInside(this.form)}else{if(this.options.display.errorsLocation==2){E.element=new Element("div",{id:"diverror"+E.name,"class":this.options.error_class,styles:{opacity:0}});E.element.injectBefore(E)}else{if(this.options.display.errorsLocation==3){E.element=new Element("div",{id:"diverror"+E.name,"class":this.options.error_class,styles:{opacity:0}});if($type(E.group)=="object"||$type(E.group)=="collection"){E.element.injectAfter(E.group[E.group.length-1])}else{E.element.injectAfter(E)}}}}}if(E.element){E.element.empty();if(this.options.display.errorsLocation==1){var F=[];E.errors.each(function(G){F.push(new Element("p").setHTML(G))});var A=this._makeTips(F).injectInside(E.element);$E(".tipsbox_error",A).addEvent("click",function(){this._removeError(E)}.bind(this));E.element.setStyle("top",E.getCoordinates().top-A.getCoordinates().height-this.options.display.tipsOffsetY)}else{E.errors.each(function(G){new Element("p").setHTML(G).injectInside(E.element)})}if(!window.ie7&&E.element.getStyle("opacity")==0){new Fx.Styles(E.element,{duration:this.options.display.fadeDuration}).start({opacity:[1]})}else{E.element.setStyle("opacity",1)}}},_removeError:function(A){this.firstError=false;this.alreadyIndicated=false;A.errors=[];A.isOK=true;if(this.options.display.errorsLocation==2){new Fx.Styles(A.element,{duration:this.options.display.fadeDuration}).start({height:[0]})}if(!window.ie7){new Fx.Styles(A.element,{duration:this.options.display.fadeDuration,onComplete:function(){if(A.element){A.element.remove();A.element=false}}.bind(this)}).start({opacity:[1,0]})}else{A.element.remove();A.element=false}},_focusOnError:function(A){if(this.options.display.scrollToFirst&&!this.alreadyFocused&&this.alreadyIndicated.element&&!this.isScrolling){if(this.options.display.errorsLocation==1){new Fx.Scroll(window,{onComplete:function(){this.isScrolling=false}.bind(this)}).scrollTo(0,A.element.getCoordinates().top)}else{if(this.options.display.errorsLocation==2){new Fx.Scroll(window,{onComplete:function(){this.isScrolling=false}.bind(this)}).scrollTo(0,A.getCoordinates().top-30)}}this.isScrolling=true;A.focus();this.alreadyFocused=true}else{if(this.options.display.scrollToFirst&&!this.isScrolling){new Fx.Scroll(window,{onComplete:function(){this.isScrolling=false}.bind(this)}).scrollTo(0,A.getCoordinates().top-30);this.isScrolling=true;A.focus();this.alreadyFocused=true}}},_makeTips:function(B){var D=new Element("table",{"class":"tipsbox"});D.cellPadding="0";D.cellSpacing="0";D.border="0";var C=new Element("tbody").injectInside(D);var A=new Element("tr").injectInside(C);new Element("td",{"class":"tipsbox_top_left"}).injectInside(A);new Element("td",{"class":"tipsbox_top"}).injectInside(A);new Element("td",{"class":"tipsbox_top_right"}).injectInside(A);var H=new Element("tr").injectInside(C);new Element("td",{"class":"tipsbox_left"}).injectInside(H);var G=new Element("td",{"class":"tipsbox_inner"}).injectInside(H);var F=new Element("div",{"class":"tipsbox_error"}).injectInside(G);B.each(function(I){I.injectInside(G)});new Element("td",{"class":"tipsbox_right"}).injectInside(H);var E=new Element("tr").injectInside(C);new Element("td",{"class":"tipsbox_bottom_left"}).injectInside(E);new Element("td",{"class":"tipsbox_mark"}).injectInside(E);new Element("td",{"class":"tipsbox_bottom_right"}).injectInside(E);return D},_reinitialize:function(){this.validations.each(function(A){if(A.element){A.errors=[];A.isOK=true;A.element.remove();A.element=false}});if(this.form.element){this.form.element.empty()}this.alreadyFocused=false;this.firstError=false;this.alreadyIndicated=false;this.form.isValid=true},_onSubmit:function(A){this._reinitialize();this.validations.each(function(B){if(!this._manageError(B,"submit")){this.form.isValid=false}},this);if(!this.form.isValid){new Event(A).stop();if(this.firstError){this._focusOnError(this.firstError)}}}});FormCheck.implement(new Options());