var FormCheck=new Class({Implements:[Options,Events],options:{tipsClass:"fc-tbx",errorClass:"fc-error",fieldErrorClass:"fc-field-error",submit:true,trimValue:false,validateDisabled:false,submitByAjax:false,ajaxResponseDiv:false,ajaxEvalScripts:false,onAjaxRequest:$empty,onAjaxSuccess:$empty,onAjaxFailure:$empty,onSubmit:$empty,onValidateSuccess:$empty,onValidateFailure:$empty,display:{showErrors:0,titlesInsteadNames:0,errorsLocation:1,indicateErrors:1,indicateErrorsInit:0,keepFocusOnError:0,checkValueIfEmpty:1,
addClassErrorToField:0,removeClassErrorOnTipClosure:0,fixPngForIe:1,replaceTipsEffect:1,flashTips:0,closeTipsButton:1,tipsPosition:"right",tipsOffsetX:-45,tipsOffsetY:0,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.",digitltd:"The value must be between %0 and %1",
number:"Please enter a valid number.",email:"Please enter a valid email.",image:"This field should only contain image types",phone:"Please enter a valid phone.",phone_inter:"Please enter a valid international phone number.",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",length_fix:"The length is incorrect, it must be exactly %0 characters",lengthmax:"The length is incorrect, it must be at max %0",
lengthmin:"The length is incorrect, it must be at least %0",words_min:"This field must concain at least %0 words, currently: %1 words",words_range:"This field must contain %0-%1 words, currently: %2 words",words_max:"This field must contain at max %0 words, currently: %1 words",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-zA-Z0-9_\.\-\+%])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,image:/.(jpg|jpeg|png|gif|bmp)$/i,phone:/^[\d\s ().-]+$/,phone_inter:/^\+{0,1}[0-9 \(\)\.\-]+$/,url:/^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i}},initialize:function(a,c){if(this.form=$(a)){this.form.isValid=true;this.regex=["length"];this.setOptions(c);if(typeof formcheckLanguage!="undefined")this.options.alerts=$merge(this.options.alerts,formcheckLanguage);
this.validations=[];this.firstError=this.alreadyIndicated=false;(new Hash(this.options.regexp)).each(function(b,d){this.regex.push(d)},this);this.form.getElements("*[class*=validate]").each(function(b){if(b.get("tag")=="select"||b.get("tag")=="input"||b.get("tag")=="textarea")this.register(b)},this);this.form.addEvents({submit:this.onSubmit.bind(this)});this.options.display.fixPngForIe&&this.fixIeStuffs();document.addEvent("mousewheel",function(){this.isScrolling=false}.bind(this))}},register:function(a,
c){a.validation=[];a.getProperty("class").split(" ").each(function(b){if(b.match(/^validate(\[.+\])$/)){var d=true;a.type=="radio"&&this.validations.each(function(f){if(f.name==a.name)d=false},this);b=eval(b.match(/^validate(\[.+\])$/)[1]);for(var e=0;e<b.length;e++){a.validation.push(b[e]);b[e].match(/^confirm\[/)&&this.form[eval(b[e].match(/^.+(\[.+\])$/)[1].replace(/([A-Z0-9\._-]+)/i,"'$1'"))].validation.contains("required")&&a.validation.push("required");if(b[e].match(/^target:.+/))a.target=b[e].match(/^target:(.+)/)[1]}if(c&&
c<=this.validations.length){var g=[];this.validations.each(function(f,h){if(c==h+1&&d){g.push(a);this.addListener(a)}g.push(f)},this);this.validations=g}else if(d){this.validations.push(a);this.addListener(a)}}},this)},dispose:function(a){this.validations.erase(a)},addListener:function(a){a.errors=[];if(this.options.display.indicateErrorsInit){this.validations.each(function(c){if(!this.manageError(c,"submit"))this.form.isValid=false},this);return true}if(a.validation[0]=="submit"){a.addEvent("click",
function(c){this.onSubmit(c)&&this.form.submit()}.bind(this));return true}if(this.isChildType(a)==false)a.addEvent("blur",function(){(function(){if(!this.fxRunning&&(a.element||this.options.display.showErrors==1)&&(this.options.display.checkValueIfEmpty||a.value))this.manageError(a,"blur")}).bind(this).delay(100)}.bind(this));else this.isChildType(a)==true&&this.form.getElements('input[name="'+a.getProperty("name")+'"]').each(function(c){c.addEvent("blur",function(){(function(){if((a.element||this.options.display.showErrors==
1)&&(this.options.display.checkValueIfEmpty||a.value))this.manageError(a,"click")}).bind(this).delay(100)}.bind(this))},this)},validate:function(a){a.errors=[];a.isOk=true;if(!this.options.validateDisabled&&a.get("disabled"))return true;if(this.options.trimValue&&a.value)a.value=a.value.trim();a.validation.each(function(c){if(this.isChildType(a)){if(this.validateGroup(a)==false)a.isOk=false}else{var b=[];if(!c.match(/target:.+/)){if(c.match(/^.+\[/)){var d=c.split("[")[0];b=eval(c.match(/^.+(\[.+\])$/)[1].replace(/([A-Z0-9\._-]+)/i,
"'$1'"))}else d=c;if(this.regex.contains(d)&&a.get("tag")!="select")if(this.validateRegex(a,d,b)==false)a.isOk=false;if(d=="confirm")if(this.validateConfirm(a,b)==false)a.isOk=false;if(d=="differs")if(this.validateDiffers(a,b)==false)a.isOk=false;if(d=="words")if(this.validateWords(a,b)==false)a.isOk=false;if(a.get("tag")=="select"||a.type=="checkbox"&&d=="required")if(this.simpleValidate(a)==false)a.isOk=false;if(c.match(/%[A-Z0-9\._-]+$/i)||a.isOk&&c.match(/~[A-Z0-9\._-]+$/i))if(eval(c.slice(1)+
"(el)")==false)a.isOk=false}}},this);return a.isOk?true:false},simpleValidate:function(a){if(a.get("tag")=="select"&&a.selectedIndex<=0){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(a,c,b){var d="";if(b[1]&&c=="length")if(b[1]==-1){this.options.regexp.length=new RegExp("^[\\s\\S]{"+b[0]+",}$");d=this.options.alerts.lengthmin.replace("%0",b[0])}else if(b[0]==
b[1]){this.options.regexp.length=new RegExp("^[\\s\\S]{"+b[0]+"}$");d=this.options.alerts.length_fix.replace("%0",b[0])}else{this.options.regexp.length=new RegExp("^[\\s\\S]{"+b[0]+","+b[1]+"}$");d=this.options.alerts.length_str.replace("%0",b[0]).replace("%1",b[1])}else if(b[0]&&c=="length"){this.options.regexp.length=new RegExp("^.{0,"+b[0]+"}$");d=this.options.alerts.lengthmax.replace("%0",b[0])}else d=this.options.alerts[c];if(b[1]&&c=="digit"){var e=true;if(!this.options.regexp.digit.test(a.value)){a.errors.push(this.options.alerts[c]);
e=false}if(b[1]==-1){c=a.value.toInt()>=b[0].toInt();d=this.options.alerts.digitmin.replace("%0",b[0])}else{c=a.value.toInt()>=b[0].toInt()&&a.value.toInt()<=b[1].toInt();d=this.options.alerts.digitltd.replace("%0",b[0]).replace("%1",b[1])}if(e==false||c==false){a.errors.push(d);return false}}else if(this.options.regexp[c].test(a.value)==false){a.errors.push(d);return false}return true},validateConfirm:function(a,c){var b=c[0];if(a.value!=this.form[b].value){b=this.options.display.titlesInsteadNames?
this.options.alerts.confirm.replace("%0",this.form[b].getProperty("title")):this.options.alerts.confirm.replace("%0",b);a.errors.push(b);return false}return true},validateDiffers:function(a,c){var b=c[0];if(a.value==this.form[b].value){b=this.options.display.titlesInsteadNames?this.options.alerts.differs.replace("%0",this.form[b].getProperty("title")):this.options.alerts.differs.replace("%0",b);a.errors.push(b);return false}return true},validateWords:function(a,c){var b=c[0],d=c[1],e=a.value.replace(/[ \t\v\n\r\f\p]/m,
" ").replace(/[,.;:]/g," ").clean().split(" ");if(d==-1){if(e.length<b){a.errors.push(this.options.alerts.words_min.replace("%0",b).replace("%1",e.length));return false}}else if(b>0){if(e.length<b||e.length>d){a.errors.push(this.options.alerts.words_range.replace("%0",b).replace("%1",d).replace("%2",e.length));return false}}else if(e.length>d){a.errors.push(this.options.alerts.words_max.replace("%0",d).replace("%1",e.length));return false}return true},isFormValid:function(){this.form.isValid=true;
this.validations.each(function(a){if(!this.manageError(a,"testonly"))this.form.isValid=false},this);return this.form.isValid},isChildType:function(a){return $defined(a.type)&&a.type=="radio"?true:false},validateGroup:function(a){a.errors=[];var c=this.form[a.getProperty("name")];a.group=c;for(var b=false,d=0;d<c.length;d++)if(c[d].checked)b=true;if(b==false){a.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.errorClass})).injectTop(this.form);if($type(a)=="collection")(new Element("p")).set("html","<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(c){(new Element("p")).set("html","<span>"+a.name+" : </span>"+c).injectInside(this.form.element)},this);window.fireEvent("resize")},
manageError:function(a,c){var b=this.validate(a);if(c=="testonly")return b;if(!b&&a.validation.flatten()[0].contains("confirm[")||!b&&a.validation.contains("required")||!a.validation.contains("required")&&a.value&&!b){this.options.display.listErrorsAtTop==true&&c=="submit"&&this.listErrorsAtTop(a);if(this.options.display.indicateErrors==2||this.alreadyIndicated==false||a.name==this.alreadyIndicated.name){if(!this.firstError)this.firstError=a;this.alreadyIndicated=a;this.options.display.keepFocusOnError&&
a.name==this.firstError.name&&function(){a.focus()}.delay(20);this.addError(a);return false}}else if(b||!a.validation.contains("required")&&!a.value){this.removeError(a);return true}return true},addError:function(a){var c=a.target?$(a.target).getCoordinates():a.getCoordinates();if(!a.element&&this.options.display.indicateErrors!=0)if(this.options.display.errorsLocation==1){a.element=(new Element("div",{"class":this.options.tipsClass,styles:{opacity:0,"z-index":999,position:"absolute","float":"left",
left:(this.options.display.tipsPosition=="left"?c.left:c.right)+this.options.display.tipsOffsetX}})).injectInside(document.body);this.addPositionEvent(a)}else if(this.options.display.errorsLocation==2)a.element=(new Element("div",{"class":this.options.errorClass,styles:{opacity:0}})).injectBefore(a);else if(this.options.display.errorsLocation==3){a.element=new Element("div",{"class":this.options.errorClass,styles:{opacity:0}});$type(a.group)=="object"||$type(a.group)=="collection"?a.element.injectAfter(a.group[a.group.length-
1]):a.element.injectAfter(a)}if(a.element&&a.element!=true){a.element.empty();if(this.options.display.errorsLocation==1){var b=[];a.errors.each(function(e){b.push((new Element("p")).set("html",e))});var d=this.makeTips(b).injectInside(a.element);this.options.display.closeTipsButton&&d.getElements("a.close").addEvent("mouseup",function(){this.removeError(a,"tip")}.bind(this));a.element.setStyle("top",c.top-d.getCoordinates().height+this.options.display.tipsOffsetY)}else a.errors.each(function(e){(new Element("p")).set("html",
e).injectInside(a.element)});if(!this.options.display.fadeDuration||Browser.Engine.trident&&Browser.Engine.version==5&&this.options.display.errorsLocation<2)a.element.setStyle("opacity",1);else{a.fx=new Fx.Tween(a.element,{duration:this.options.display.fadeDuration,ignore:true,onStart:function(){this.fxRunning=true}.bind(this),onComplete:function(){this.fxRunning=false;if(a.element&&a.element.getStyle("opacity").toInt()==0){a.element.destroy();a.element=false}}.bind(this)});a.element.getStyle("opacity").toInt()!=
1&&a.fx.start("opacity",1)}}if(this.options.display.addClassErrorToField&&this.isChildType(a)==false){a.addClass(this.options.fieldErrorClass);a.element=a.element||true}},addPositionEvent:function(a){a.event=this.options.display.replaceTipsEffect?function(){var c=a.target?$(a.target).getCoordinates():a.getCoordinates();(new Fx.Morph(a.element,{duration:this.options.display.fadeDuration})).start({left:[a.element.getStyle("left"),c.right+this.options.display.tipsOffsetX],top:[a.element.getStyle("top"),
c.top-a.element.getCoordinates().height+this.options.display.tipsOffsetY]})}.bind(this):function(){var c=a.target?$(a.target).getCoordinates():a.getCoordinates();a.element.setStyles({left:c.right+this.options.display.tipsOffsetX,top:c.top-a.element.getCoordinates().height+this.options.display.tipsOffsetY})}.bind(this);window.addEvent("resize",a.event)},removeError:function(a,c){if(this.options.display.addClassErrorToField&&!this.isChildType(a)&&this.options.display.removeClassErrorOnTipClosure||this.options.display.addClassErrorToField&&
!this.isChildType(a)&&!this.options.display.removeClassErrorOnTipClosure&&c!="tip")a.removeClass(this.options.fieldErrorClass);if(a.element){this.alreadyIndicated=false;a.errors=[];a.isOK=true;window.removeEvent("resize",a.event);this.options.display.errorsLocation>=2&&a.element&&(new Fx.Tween(a.element,{duration:this.options.display.fadeDuration})).start("height",0);if(!this.options.display.fadeDuration||Browser.Engine.trident&&Browser.Engine.version==5&&this.options.display.errorsLocation==1&&a.element){this.fxRunning=
true;a.element.destroy();a.element=false;(function(){this.fxRunning=false}).bind(this).delay(200)}else a.element&&a.element!=true&&a.fx.start("opacity",0)}},focusOnError:function(a){if(this.options.display.scrollToFirst&&!this.alreadyFocused&&!this.isScrolling){if(!this.options.display.indicateErrors||!this.options.display.errorsLocation)var c=a.getCoordinates().top-30;else if(this.alreadyIndicated.element){switch(this.options.display.errorsLocation){case 1:c=a.element.getCoordinates().top;break;
case 2:c=a.element.getCoordinates().top-30;break;case 3:c=a.getCoordinates().top-30;break}this.isScrolling=true}if(window.getScroll.y!=c)(new Fx.Scroll(window,{onComplete:function(){this.isScrolling=false;a.getProperty("type")!="hidden"&&a.focus()}.bind(this)})).start(0,c);else{this.isScrolling=false;a.focus()}this.alreadyFocused=true}},fixIeStuffs:function(){if(Browser.Engine.trident4)for(var a=/url\(([.a-zA-Z0-9_\/:-]+.png)\)/,c=/(.+)formcheck.css/,b=0;b<document.styleSheets.length;b++)if(document.styleSheets[b].href.match(/formcheck\.css$/))for(var d=
document.styleSheets[b].href.replace(c,"$1"),e=document.styleSheets[b].rules.length,g=0;g<e;g++){var f=document.styleSheets[b].rules[g].style,h=d+f.backgroundImage.replace(a,"$1");if(h&&h.match(/\.png/i)){f.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, src='"+h+"', sizingMethod='"+(f.backgroundRepeat=="no-repeat"?"crop":"scale")+"')";f.backgroundImage="none"}}},makeTips:function(a){var c=new Element("table");c.cellPadding="0";c.cellSpacing="0";c.border="0";var b=(new Element("tbody")).injectInside(c),
d=(new Element("tr")).injectInside(b);(new Element("td",{"class":"tl"})).injectInside(d);(new Element("td",{"class":"t"})).injectInside(d);(new Element("td",{"class":"tr"})).injectInside(d);d=(new Element("tr")).injectInside(b);(new Element("td",{"class":"l"})).injectInside(d);var e=(new Element("td",{"class":"c"})).injectInside(d),g=(new Element("div",{"class":"err"})).injectInside(e);a.each(function(f){f.injectInside(g)});this.options.display.closeTipsButton&&(new Element("a",{"class":"close"})).injectInside(e);
(new Element("td",{"class":"r"})).injectInside(d);a=(new Element("tr")).injectInside(b);(new Element("td",{"class":"bl"})).injectInside(a);(new Element("td",{"class":"b"})).injectInside(a);(new Element("td",{"class":"br"})).injectInside(a);return c},reinitialize:function(a){this.validations.each(function(c){if(c.element){c.errors=[];c.isOK=true;if(this.options.display.flashTips==1||a=="forced"){c.element.destroy();c.element=false}}},this);this.form.element&&this.form.element.empty();this.firstError=
this.alreadyFocused=false;this.elementToRemove=this.alreadyIndicated;this.alreadyIndicated=false;this.form.isValid=true},submitByAjax:function(){var a=this.form.getProperty("action");this.fireEvent("ajaxRequest");(new Request({url:a,method:this.form.getProperty("method"),data:this.form.toQueryString(),evalScripts:this.options.ajaxEvalScripts,onFailure:function(c){this.fireEvent("ajaxFailure",c)}.bind(this),onSuccess:function(c){this.fireEvent("ajaxSuccess",c);this.options.ajaxResponseDiv&&$(this.options.ajaxResponseDiv).set("html",
c)}.bind(this)})).send()},onSubmit:function(a){this.reinitialize();this.fireEvent("onSubmit");this.validations.each(function(c){if(!this.manageError(c,"submit"))this.form.isValid=false},this);if(this.form.isValid){if(this.options.submitByAjax){(new Event(a)).stop();this.submitByAjax()}else this.options.submit||(new Event(a)).stop();this.fireEvent("validateSuccess");return true}else{(new Event(a)).stop();this.elementToRemove&&this.elementToRemove!=this.firstError&&this.options.display.indicateErrors==
1&&this.removeError(this.elementToRemove);this.focusOnError(this.firstError);this.fireEvent("validateFailure");return false}}});
