var InputValidator=new Class({initialize:function(className,options){this.options=Object.extend({errorMsg:'Validation failed.',test:function(field){return true}},options||{});this.className=className},test:function(field){if($(field))return this.options.test($(field),this.getProps(field));else return false},getError:function(field){var err=this.options.errorMsg;if($type(err)=="function")err=err($(field),this.getProps(field));return err},getProps:function(field){if($(field)&&$(field).getProperty('validatorProps')){try{return Json.evaluate($(field).getProperty('validatorProps'))}catch(e){return{}}}else{return{}}}});var FormValidator=new Class({initialize:function(form,options){this.options=Object.extend({fieldSelectors:"input, select, textarea",useTitles:false,evaluateOnSubmit:true,evaluateFieldsOnBlur:true,onFormValidate:function(isValid,form){},onElementValidate:function(isValid,field){}},options||{});try{this.form=$(form);if(this.options.evaluateOnSubmit)this.form.addEvent('submit',this.onSubmit.bind(this));if(this.options.evaluateFieldsOnBlur)this.watchFields()}catch(e){}},watchFields:function(){try{this.form.getElementsBySelector(this.options.fieldSelectors).each(function(el){el.addEvent('blur',this.validateField.pass(el,this))},this)}catch(e){}},onSubmit:function(event){if(!this.validate())new Event(event).stop()},reset:function(){this.form.getElementsBySelector(this.options.fieldSelectors).each(this.resetField,this)},validate:function(){var result=this.form.getElementsBySelector(this.options.fieldSelectors).map(function(field){return this.validateField(field)},this);result=result.every(function(val){return val});this.options.onFormValidate(result,this.form);return result},validateField:function(field){field=$(field);var result=true;if(field){var validators=field.className.split(" ").some(function(cn){return FormValidator.getValidator(cn)});result=field.className.split(" ").map(function(className){var test=this.test(className,field);return test},this);result=result.every(function(val){return val});if(validators){if(result)field.addClass('validation-passed').removeClass('validation-failed');else field.addClass('validation-failed').removeClass('validation-passed')}}return result},getPropName:function(className){return'__advice'+className},test:function(className,field){field=$(field);var isValid=true;if(field){var validator=FormValidator.getValidator(className);if(validator&&this.isVisible(field)){isValid=validator.test(field);if(!isValid&&validator.getError(field)){var advice=this.makeAdvice(className,field,validator.getError(field));this.showAdvice(className,field)}else this.hideAdvice(className,field);this.options.onElementValidate(isValid,field)}}return isValid},showAdvice:function(className,field){var advice=this.getAdvice(className,field);if(advice&&!field[this.getPropName(className)]&&(advice.getStyle('display')=="none"||advice.getStyle('visiblity')=="hidden"||advice.getStyle('opacity')==0)){field[this.getPropName(className)]=true;advice.setStyles({'display':'block','visibility':'hidden'});var h=advice.getSize().scrollSize.y;var pt=advice.getStyle('padding-top').toInt();var pb=advice.getStyle('padding-bottom').toInt();var mt=advice.getStyle('margin-top').toInt();var mb=advice.getStyle('margin-bottom').toInt();h=h-pt-pb;advice.setStyles({'opacity':0,'height':'0px','padding-top':'0px','padding-bottom':'0px','margin-top':'0px','margin-bottom':'0px'}).effects().start({'height':h,'opacity':1,'padding-top':pt,'padding-bottom':pb,'margin-top':mt,'margin-bottom':mb})}},hideAdvice:function(className,field){var advice=this.getAdvice(className,field);if(advice&&field[this.getPropName(className)]){field[this.getPropName(className)]=false;var h=advice.getSize().scrollSize.y;var pt=advice.getStyle('padding-top').toInt();var pb=advice.getStyle('padding-bottom').toInt();var mt=advice.getStyle('margin-top').toInt();var mb=advice.getStyle('margin-bottom').toInt();h=h-pt-pb;advice.effects().start({'height':0,'opacity':0,'padding-top':0,'padding-bottom':0,'margin-top':0,'margin-bottom':0}).chain(function(){advice.setStyles({'display':'none','height':h+'px','padding-top':pt+'px','padding-bottom':pb+'px','margin-top':mt+'px','margin-bottom':mb+'px'})})}},isVisible:function(field){while(field.tagName!='BODY'){if($(field).getStyle('display')=="none")return false;field=field.parentNode}return true},getAdvice:function(className,field){return $('advice-'+className+'-'+this.getFieldId(field))},makeAdvice:function(className,field,error){var errorMsg=this.options.useTitles?$pick(field.title,error):error;var advice=this.getAdvice(className,field);if(!advice){advice=new Element('div').addClass('validation-advice').setProperty('id','advice-'+className+'-'+this.getFieldId(field)).setStyle('display','none').appendText(errorMsg);switch(field.type.toLowerCase()){case'radio':var p=$(field.parentNode);if(p){p.adopt(advice);break}default:advice.injectAfter($(field))}}else{advice.setHTML(errorMsg)}return advice},getFieldId:function(field){return field.id?field.id:field.id="input_"+field.name},resetField:function(field){field=$(field);if(field){var cn=field.className.split(" ");cn.each(function(className){var prop=this.getPropName(className);if(field[prop])this.hideAdvice(className,field);field.removeClass('validation-failed');field.removeClass('validation-passed')},this)}}});Object.extend(FormValidator,{validators:[],add:function(className,options){this.validators[className]=new InputValidator(className,options)},addAllThese:function(validators){$A(validators).each(function(validator){this.add(validator[0],validator[1])},this)},getValidator:function(className){return FormValidator.validators[className]=$pick(FormValidator.validators[className],false)}});FormValidator.add('IsEmpty',{errorMsg:false,test:function(element){if(element.type=="select-one"||element.type=="select")return!(element.selectedIndex>=0&&element.options[element.selectedIndex].value!="");else return((element.getValue()==null)||(element.getValue().length==0))}});FormValidator.addAllThese([['required',{errorMsg:function(element){return'Campo necessario'},test:function(element){return!FormValidator.getValidator('IsEmpty').test(element)}}],['minLength',{errorMsg:function(element,props){if($type(props.minLength))return'Inserire almeno '+props.minLength+' caratteri (hai inserito '+element.getValue().length+' caratteri).';else return''},test:function(element,props){if($type(props.minLength))return(element.getValue().length>=$pick(props.minLength,0));else return true}}],['maxLength',{errorMsg:function(element,props){if($type(props.maxLength))return'Massimo '+props.maxLength+' caratteri (hai inserito '+element.getValue().length+' caratteri).';else return''},test:function(element,props){return(element.getValue().length<=$pick(props.maxLength,10000))}}],['validate-number',{errorMsg:'Inserire un numero valido',test:function(element){return FormValidator.getValidator('IsEmpty').test(element)||((!isNaN(element.getValue())&&!/^\s+$/.test(element.getValue())))}}],['validate-digits',{errorMsg:'Inserire solo numeri senza spazi',test:function(element){return FormValidator.getValidator('IsEmpty').test(element)||(!/[^a-zA-Z]/.test(element.getValue())&&/[\d]/.test(element.getValue()))}}],['validate-alpha',{errorMsg:'Inserire solo lettere (a-z) nel campo',test:function(element){return FormValidator.getValidator('IsEmpty').test(element)||/^[a-zA-Z]+$/.test(element.getValue())}}],['validate-alphanum',{errorMsg:'inserire solo lettere (a-z) o numeri (0-9).Non inserire spazi o caratteri speciali.',test:function(element){return FormValidator.getValidator('IsEmpty').test(element)||!/\W/.test(element.getValue())}}],['validate-date',{errorMsg:'Usare questo formato per la data: mm/gg/aaaa. Ad esempio 18/02/1976 per il 18 febbraio 1976',test:function(element){if(FormValidator.getValidator('IsEmpty').test(element))return true;var regex=/^(\d{2})\/(\d{2})\/(\d{4})$/;if(!regex.test(element.getValue()))return false;var d=new Date(element.getValue().replace(regex,'$1/$2/$3'));return(parseInt(RegExp.$1,10)==(1+d.getMonth()))&&(parseInt(RegExp.$2,10)==d.getDate())&&(parseInt(RegExp.$3,10)==d.getFullYear())}}],['validate-email',{errorMsg:'Inserire un indirizzo email valido.',test:function(element){return FormValidator.getValidator('IsEmpty').test(element)||/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(element.getValue())}}],['validate-url',{errorMsg:'Inserire un url valido',test:function(element){return FormValidator.getValidator('IsEmpty').test(element)||/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(element.getValue())}}],['validate-date-au',{errorMsg:'Usare questo formato per la data: gg/mm/aaaa. Ad esempio 18/02/1976 per il 18 febbraio 1976',test:function(element){if(FormValidator.getValidator('IsEmpty').test(element))return true;var regex=/^(\d{2})\/(\d{2})\/(\d{4})$/;if(!regex.test(element.getValue()))return false;var d=new Date(element.getValue().replace(regex,'$2/$1/$3'));return(parseInt(RegExp.$2,10)==(1+d.getMonth()))&&(parseInt(RegExp.$1,10)==d.getDate())&&(parseInt(RegExp.$3,10)==d.getFullYear())}}],['validate-currency-dollar',{errorMsg:'Inserire una cifra valida. Ad esempio &euro;100.00 .',test:function(element){return FormValidator.getValidator('IsEmpty').test(element)||/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(element.getValue())}}],['validate-one-required',{errorMsg:'Compilare almeno uno dei campi',test:function(element){var p=element.parentNode;var options=p.getElements('input');return $A(options).some(function(el){return el.getValue()})}}]]);