Validate=new Class({initialize:function(f,props){this.props={action:false,auto:false,block:false,blocktag:'p',format:'m/d/y',inline:'label',lang:'en',oncomplete:false};Object.extend(this.props,props||{});this.f=$(f);this.f.onsubmit=function(){return this.validate();}.bind(this);a=$ES('button[type="submit"], input, textarea',this.f);for(i=0;i<a.length;i++){el=$(a[i]);t=el.type.toLowerCase();if(t=='submit'){this.submit=el;}
else if(this.props.auto&&this.props.inline&&(el.getTag()=='textarea'||t=='file'||t=='password'||t=='text')){el.onblur=(function(z){return function(){this.validate(z);}})(el).bind(this);}}},validate:function(auto,required,alertonly){this.auto=(auto)?(($type(auto)=='array')?auto:[auto]):false;errors=$$('.error');if(this.auto){safeclean=[];this.auto.each(function(el){safeclean.push(el.parentNode);});}
for(i=0;i<errors.length;i++){el=$(errors[i]);if(this.auto){if(!safeclean.test(el.parentNode)){continue;}}
el.removeClass('error');labels=el.parentNode.getElementsByTagName('label');if(labels.length){labels[0].style.display='block';}
if(el.getTag()=='span'){spans=el.parentNode.getElementsByTagName('span');for(s=0;s<spans.length;s++){if(spans[s].parentNode==el.parentNode&&spans[s]!=el){spans[s].style.display='inline';break;}}}
if(el.getTag()=='span'||el.getTag()=='div'){el.remove();}}
this.submit.disabled='';this.ul=document.createElement('ul');this.fx=[];this.passed=true;this.alertmsg='';this.alertonly=(alertonly)?true:false;this.focused=false;this.els=(this.auto)?this.auto:$ES('input, select, textarea',this.f);for(i=0;i<this.els.length;i++){el=$(this.els[i]);t=el.type.toLowerCase();v=el.value;n=el.title;if(el.getTag()=='textarea'||t=='password'||t=='text'){if(this.isEmpty(v)&&(el.optional==false||required)){(this.props.lang=='es')?this.doError(el,n+' no puede estar vacio'):this.doError(el,n+' cannot be empty');continue;}
if(el.isEmail){if(!this.isEmail(v)){(this.props.lang=='es')?this.doError(el,v+' no es un email v\xe1lido'):this.doError(el,v+' is not a valid email');continue;}}}
if(el.getTag()=='select'){if(this.isEmpty(el.options[el.selectedIndex].value)&&(el.optional==false||required)){(this.props.lang=='es')?this.doError(el,n+' se necesita una opci\xf3n seleccionada'):this.doError(el,n+' needs an option selected');continue;}}
if(t=='radio'||t=='checkbox'){if(el.checked==false&&(el.optional==false||required)){(this.props.lang=='es')?this.doError(el,n+' se necesita una opci\xf3n seleccionada'):this.doError(el,n+' must be checked');continue;}}}
if(this.auto){this.fx.each(function(o,i){o.custom(0,.99);});if(this.alertonly&&!this.passed){alert(this.alertmsg);}
return this.passed;}
if(!this.passed){err=(this.props.lang=='es')?'Por favor corregir los errores indicados':'Please correct the errors indicated';if(this.props.block!=false&&this.props.inline!='block'){if(this.props.block=='alert'){alert(err+'\n'+this.alertmsg);}
else{bt=document.createElement(this.props.blocktag);bt.appendChild(document.createTextNode(err));div=document.createElement('div');div.className='error';div.appendChild(bt);div.appendChild(this.ul.cloneNode(true));o=new Fx.Style(div,'opacity',{duration:1000});o.set(0);this.fx.push(o);if(this.props.block=='outside'){this.f.parentNode.insertBefore(div,this.f);}
else if(this.props.block=='top'){document.body.insertBefore(div,document.body.firstChild);}
else{this.f.insertBefore(div,this.f.firstChild);}}}
if(this.props.inline!=false&&this.props.inline.indexOf('submit')!=-1){this.doError(this.submit,err);}
this.fx.each(function(o,i){o.custom(0,.99);});}
else{if(this.props.oncomplete){setTimeout(this.options.oncomplete,10);}
if(this.props.action){this.f.action=this.props.action;}}
return this.passed;},doError:function(el,err){this.passed=false;el=$(el);el.addClass('error');if(this.alertonly){this.alertmsg=this.alertmsg+'\n'+err;return;}
if(this.props.block!=false&&this.props.inline!='block'){if(this.props.block=='alert'){this.alertmsg=this.alertmsg+'\n'+err;}
else{li=document.createElement('li');li.appendChild(document.createTextNode(err));this.ul.appendChild(li);}}
if(this.props.inline!=false){if(this.props.inline=='block'){p=document.createElement('p');p.appendChild(document.createTextNode(err));div=document.createElement('div');div.className='error';div.appendChild(p);o=new Fx.Style(div,'opacity',{duration:1000});o.set(0);this.fx.push(o);el.parentNode.parentNode.insertBefore(div,el.parentNode.nextSibling);}
else{span=document.createElement('span');span.className='error';span.appendChild(document.createTextNode(err));o=new Fx.Style(span,'opacity',{duration:1000});o.set(0);this.fx.push(o);if(this.props.inline.indexOf('label')!=-1){labels=el.parentNode.getElementsByTagName('label');if(labels.length){labels[0].style.display='none';el.parentNode.insertBefore(span,labels[0]);return;}}
else if(this.props.inline.indexOf('span')!=-1){spans=el.parentNode.getElementsByTagName('span');for(s=0;s<spans.length;s++){if(spans[s].parentNode==el.parentNode){spans[s].style.display='none';el.parentNode.insertBefore(span,spans[s]);return;}}}
if(this.props.inline.indexOf('first')!=-1){el.parentNode.insertBefore(span,el.parentNode.firstChild);}
else if(this.props.inline.indexOf('before')!=-1){el.parentNode.insertBefore(span,el);}
else if(this.props.inline.indexOf('after')!=-1){el.parentNode.insertBefore(span,el.nextSibling);}
else{el.parentNode.appendChild(span);}}}},isEmpty:function(str){return(str==null)||(str.length==0);},isEmail:function(str){if(this.isEmpty(str)){return false;}
re=/^[^\s()<>@,;:\/]+@\w[\w\.-]+\.[a-z]{2,}$/i;return re.test(str);}});