Form=new Class({Extends:Events,initialize:function(form){this.form=$(form);this.form.addEvent('submit',this.submit.bindWithEvent(this));this.submit_button=this.form.getElement('input[type=submit]');this.fields=[];this.is_valid=true;},field:function(el,validators){el=$(el);if(el===null){return false;}
if(!this.fields.contains(el)){this.fields.push(el);el.addEvent('blur',this.validateField.bind(this,el));}
var validation=el.retrieve('validation',[]);new Hash(validators).each(function(value,key){switch(key){case'required':if(value===true){alert(value);validation.push(this.required.bind(this,el));}
break;case'is_handle':if(value===true){validation.push(this.handle.bind(this,el));}
break;case'regex':validation.push(this.regexp.bind(this,[el,value]));break;case'maxlength':validation.push(this.maxlength.bind(this,[el,value]));break;case'dependee':validation.push(this.dependee.bind(this,[el,$(value)]));break;case'depends':this.field(value,{dependee:el});validation.push(this.depends.bind(this,[el,$(value)]));break;case'matchee':validation.push(this.matchee.bind(this,[el,$(value)]));break;case'matcher':this.field(value,{matchee:el});validation.push(this.matcher.bind(this,[el,$(value)]));break;case'maxfilesize':validation.push(this.maxfilesize.bind(this,[el,value]));break;};},this);el.store('validation',validation);return true;},validateField:function(el){var validation=el.retrieve('validation');if(!validation||el.disabled){el.store('is_valid',true);return true;}
var previousErrors=el.getParent().getElement('ul.errorlist');if(previousErrors){previousErrors.dispose();}
var field_valid=true;for(var i=0;i<validation.length;i++){if(!validation[i]()){field_valid=false;break;}}
el.store('is_valid',field_valid);this.is_valid=true;for(var i=0;i<this.fields.length;i++){if(this.fields[i].retrieve('is_valid')===false){window.console.log(this.fields[i].get('id'));this.is_valid=false;}}
this.submit_button.disabled=!this.is_valid;return field_valid;},required:function(el){var value=el.value;if(value.trim().length==0){this.markError(el,'This field is required.');return false;}else{return true;}},handle:function(el){return this.regexp(el,/^[\w-]{4,32}$/);},regexp:function(el,re){var value=el.value;if(!re.test(value)&&(value.trim().length>0)){this.markError(el,'Enter a valid value.');return false;}else{return true;}},maxlength:function(el,len){var value=el.value;if(value.length>len){this.markError(el,'Ensure this value has at most '+len+' characters (it has '+value.length+').');return false;}else{return true;}},maxfilesize:function(el,size){if(el.files){if(el.files.length>0){if(el.files[0].fileSize>size){var pretty_size=size+'bytes';if(size>=(1024*1024)){pretty_size=Math.floor(size/(1024*1024))+'mb'}else if(size>=1024){pretty_size=Math.floor(size/1024)+'kb'}
this.markError(el,'File must not be larger then '+pretty_size+'.');return false;}else{return true;}}else{return true;}}else{return true;}},dependee:function(el,other_el){if(el.value.length==0){return this.validateField(other_el);}
return true;},depends:function(el,depends_on){if(depends_on.value.length!=0&&!depends_on.disabled){return this.required(el);}else{return true;}},matchee:function(el,other_el){if(other_el.value.length>0){this.validateField(other_el);}},matcher:function(el,other_el){if(el.value!=other_el.value){this.markError(el,'Does not match.');return false;}else{return true}},markError:function(el,msg){var ul=new Element('ul',{'class':'errorlist'}).adopt(new Element('li').set('text',msg));var inline=el.getNext('div.inline');if(inline){ul.inject(inline)}else{ul.inject(el,'after')}},submit:function(e){this.is_valid=true;for(var i=0;i<this.form.elements.length;i++){var el=$(this.form.elements[i]);if(el.nodeName.toLowerCase()=='fieldset'){continue;}
this.validateField(el);}
if(!this.is_valid){e.preventDefault();}
else{this.fireEvent('valid',e);}}});