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:"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: <br /><span>E.g. yourname@domain.com</span>",spamcheck:"<span>2 + 3 = ???</span>",phone:"Please enter a valid phone.",url:"Please enter a valid url: <br /><span>E.g. http://www.domain.com</span>",confirm:"This field is different from %0",differs:"This value must be different of %0",length_str:"Text is too short, it must be between %0 and %1",lengthmax:"Text is too short, it must be at max %0",lengthmin:"Text is too short, 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]+$/,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(el){this.validations.push(el);el.errors=[];if(this._isChildType(el)==false&&this.options.display.showErrors==1)el.addEvent('blur',function(){this._manageError(el,'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(el){if(el.getTag()=='select'&&(el.value==el.options[0].value)){el.errors.push(this.options.alerts.select);return false;}else if(el.type=="checkbox"&&el.checked==false){el.errors.push(this.options.alerts.checkbox);return false;}
return true;},_validateRegex:function(el,ruleMethod,ruleArgs){var msg="";if(ruleArgs[1]&&ruleMethod=='length'){if(ruleArgs[1]==-1){this.options.regexp.length=new RegExp("^.{"+ruleArgs[0]+",}$");msg=this.options.alerts.lengthmin.replace("%0",ruleArgs[0]);}else{this.options.regexp.length=new RegExp("^.{"+ruleArgs[0]+","+ruleArgs[1]+"}$");msg=this.options.alerts.length_str.replace("%0",ruleArgs[0]).replace("%1",ruleArgs[1]);}}else if(ruleArgs[0]){this.options.regexp.length=new RegExp("^.{0,"+ruleArgs[0]+"}$");msg=this.options.alerts.lengthmax.replace("%0",ruleArgs[0]);}else{msg=this.options.alerts[ruleMethod];}
if(ruleArgs[1]&&ruleMethod=='digit'){var regres=true;if(!this.options.regexp.digit.test(el.value)){el.errors.push(this.options.alerts[ruleMethod]);regres=false;}
if(ruleArgs[1]==-1){if(el.value>=ruleArgs[0])var valueres=true;else var valueres=false;msg=this.options.alerts.digitmin.replace("%0",ruleArgs[0]);}else{if(el.value>=ruleArgs[0]&&el.value<=ruleArgs[1])var valueres=true;else var valueres=false;msg=this.options.alerts.digitltd.replace("%0",ruleArgs[0]).replace("%1",ruleArgs[1]);}
if(regres==false||valueres==false){el.errors.push(msg);return false;}}else if(this.options.regexp[ruleMethod].test(el.value)==false){el.errors.push(msg);return false;}
return true;},_validateConfirm:function(el,ruleArgs){if(el.validation.contains('required')==false){}
var confirm=ruleArgs[0];if(el.value!=this.form[confirm].value){msg=this.options.alerts.confirm.replace("%0",ruleArgs[0]);el.errors.push(msg);return false;}
return true;},_validateDiffers:function(el,ruleArgs){var confirm=ruleArgs[0];if(el.value==this.form[confirm].value){msg=this.options.alerts.differs.replace("%0",ruleArgs[0]);el.errors.push(msg);return false;}
return true;},_isChildType:function(el){var elType=el.type.toLowerCase();if((elType=="radio"))return true;return false;},_validateGroup:function(el){el.errors=[];var nlButtonGroup=this.form[el.getProperty("name")];el.group=nlButtonGroup;var cbCheckeds=false;for(var i=0;i<nlButtonGroup.length;i++){if(nlButtonGroup[i].checked){cbCheckeds=true;}}
if(cbCheckeds==false){el.errors.push(this.options.alerts.radios);return false;}else{return true;}},_listErrorsAtTop:function(obj){if(!this.form.element){this.form.element=new Element('div',{'id':'errorlist','class':this.options.error_class}).injectTop(this.form);}
if($type(obj)=='collection'){new Element('p').setHTML("<span>"+obj[0].name+" : </span>"+obj[0].errors[0]).injectInside(this.form.element);}else{if((obj.validation.contains('required')&&obj.errors.length>0)||(obj.errors.length>0&&obj.value&&obj.validation.contains('required')==false)){obj.errors.each(function(error){new Element('p').setHTML("<span>"+obj.name+" : </span>"+error).injectInside(this.form.element);},this);}}},_manageError:function(el,method){var isValid=this._validate(el);if(((!isValid&&el.validation.contains('required'))||(!el.validation.contains('required')&&el.value&&!isValid))){if(this.options.display.listErrorsAtTop==true&&method=='submit')
this._listErrorsAtTop(el,method);if(this.options.display.indicateErrors==2||this.alreadyIndicated==false||el.name==this.alreadyIndicated.name)
{this._addError(el);return false;}}else if((isValid||(!el.validation.contains('required')&&!el.value))&&el.element){this._removeError(el);return true;}
return true;},_addError:function(obj){this.alreadyIndicated=obj;if(!this.firstError)this.firstError=obj;if(!obj.element){if(this.options.display.errorsLocation==1){if(this.options.display.tipsPosition=='relative'){var marginLeft=this.options.display.tipsOffsetX;if(this.options.display.tipsContainer='undef')
var displacement=this.form.getCoordinates().left;else
var displacement=$(this.options.display.tipsContainer).getCoordinates().left;var options={'opacity':0,'position':'absolute','margin-left':obj.getCoordinates().right-displacement+this.options.display.tipsOffsetX}}else if(this.options.display.tipsPosition=='absolute'){var options={'opacity':0,'position':'absolute','margin-left':this.options.display.tipsOffsetX,'left':obj.getCoordinates().right,'bottom':obj.getCoordinates().top}}
obj.element=new Element('div',{'id':'diverror'+obj.name,'class':this.options.tips_class,'styles':options});obj.element.injectInside(this.form);}else if(this.options.display.errorsLocation==2){obj.element=new Element('div',{'id':'diverror'+obj.name,'class':this.options.error_class,'styles':{'opacity':0}});obj.element.injectBefore(obj);}else if(this.options.display.errorsLocation==3){obj.element=new Element('div',{'id':'diverror'+obj.name,'class':this.options.error_class,'styles':{'opacity':0}});if($type(obj.group)=='object'||$type(obj.group)=='collection')
obj.element.injectAfter(obj.group[obj.group.length-1]);else
obj.element.injectAfter(obj);}}
if(obj.element){obj.element.empty();if(this.options.display.errorsLocation==1){var errors=[];obj.errors.each(function(error){errors.push(new Element('p').setHTML(error));});var tips=this._makeTips(errors).injectInside(obj.element);obj.element.setStyle('top',obj.getCoordinates().top-tips.getCoordinates().height-this.options.display.tipsOffsetY);}else{obj.errors.each(function(error){new Element('p').setHTML(error).injectInside(obj.element);});}
if(!window.ie7&&obj.element.getStyle('opacity')==0)
new Fx.Styles(obj.element,{'duration':this.options.display.fadeDuration}).start({'opacity':[1]});else
obj.element.setStyle('opacity',1);}},_removeError:function(obj){this.firstError=false;this.alreadyIndicated=false;obj.errors=[];obj.isOK=true;if(this.options.display.errorsLocation==2)
new Fx.Styles(obj.element,{'duration':this.options.display.fadeDuration}).start({'height':[0]});if(!window.ie7){new Fx.Styles(obj.element,{'duration':this.options.display.fadeDuration,'onComplete':function(){if(obj.element){obj.element.remove();obj.element=false;}}.bind(this)}).start({'opacity':[1,0]});}else{obj.element.remove();obj.element=false;}},_focusOnError:function(obj){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,obj.element.getCoordinates().top);else if(this.options.display.errorsLocation==2)new Fx.Scroll(window,{onComplete:function(){this.isScrolling=false;}.bind(this)}).scrollTo(0,obj.getCoordinates().top-30);this.isScrolling=true;obj.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,obj.getCoordinates().top-30);this.isScrolling=true;obj.focus();this.alreadyFocused=true;}},_makeTips:function(txt){var table=new Element('table',{'class':'tipsbox'});table.cellPadding='0';table.cellSpacing='0';table.border='0';var tbody=new Element('tbody').injectInside(table);var tr1=new Element('tr').injectInside(tbody);new Element('td',{'class':'tipsbox_top_left'}).injectInside(tr1);new Element('td',{'class':'tipsbox_top'}).injectInside(tr1);new Element('td',{'class':'tipsbox_top_right'}).injectInside(tr1);var tr2=new Element('tr').injectInside(tbody);new Element('td',{'class':'tipsbox_left'}).injectInside(tr2);var errors=new Element('td',{'class':'tipsbox_inner'}).injectInside(tr2);var errorImg=new Element('div',{'class':'tipsbox_error'}).injectInside(errors);txt.each(function(error){error.injectInside(errors);});new Element('td',{'class':'tipsbox_right'}).injectInside(tr2);var tr3=new Element('tr').injectInside(tbody);new Element('td',{'class':'tipsbox_bottom_left'}).injectInside(tr3);new Element('td',{'class':'tipsbox_mark'}).injectInside(tr3);new Element('td',{'class':'tipsbox_bottom_right'}).injectInside(tr3);return table;},_reinitialize:function(){this.validations.each(function(el){if(el.element){el.errors=[];el.isOK=true;el.element.remove();el.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(event){this._reinitialize();this.validations.each(function(el){if(!this._manageError(el,'submit'))this.form.isValid=false;},this);if(!this.form.isValid){new Event(event).stop();if(this.firstError)this._focusOnError(this.firstError);}}});FormCheck.implement(new Options());

