var FormCheck=new Class({options:{tips_class:"tipsbox",error_class:"error_f",display:{showErrors:1,errorsLocation:1,indicateErrors:1,tipsOffsetX:-32,tipsOffsetY:-12,tipsPosition:"relative",tipsContainer:"undef",listErrorsAtTop:false,scrollToFirst:true,fadeDuration:1000},alerts:{required:"Este campo é obrigatório.",alpha:"Este campo aceita apenas caracteres alfabéticos.",alphanum:"Este campo aceita apenas caracteres alfanuméricos.",nodigit:"Não são aceitos dígitos.",digit:"Por favor, digite um número inteiro válido.",digitmin:"O número deve ser pelo menos 0",digitltd:"O valor deve ser entre 0 e 1",number:"Por favor, digite um número válido.",email:"Por favor, indique um e-mail válido: <br /> <span> E.g. yourname@domain.com </ span>",spamcheck:"<span>2 + 3 = ???</span>",phone:"Por favor, indique um telefone válido.",url:"Por favor introduza um URL válido: <br /> <span> E.g. http://www.domain.com </ span>",confirm:"Este campo é diferente de 0",differs:"Este valor deve ser diferente de 0",length_str:"O texto é muito curto, deve ser entre 0 e 1",lengthmax:"O texto é muito curto, ele deve ter 20 caracteres no mínimo",lengthmin:"O texto é muito curto, ele deve ter, no mínimo",checkbox:"Por favor, marque a caixa",radios:"Por favor, selecione uma opção",select:"Por favor, escolha um valor"},regexp:{required:/[^.*]/,alpha:/^[a-z ._-]+$/i,alphanum:/^[a-z0-9 ._-]+$/i,digit:/^[-+]?[0-9]+$/,nodigit:/^[^0-9]+$/,spamcheck:/^[5]+$/,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(a){this.validations.push(a);a.errors=[];if(this._isChildType(a)==false&&this.options.display.showErrors==1){a.addEvent("blur",function(){this._manageError(a,"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=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+this.options.display.tipsOffsetX}}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.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());