/* Metacafe Copyright - http://www.metacafe.com/ */
/* Files included: Validator.js */

var Validator=new Class({options:{invalidClassName:'Invalid',parentClassName:'FormRow',onSuccess:Class.empty,onfailure:Class.empty,validateOnKeyDown:false,validateOnFocus:false,validateOnBlur:false,preventSubmit:true,scrollToError:true},initialize:function(formID,fields,options){this.setOptions(options);this.form=$(formID);this.formID=formID;this.fields=this.mergeFields(fields);this.allErrors='';this.errorField=$E('.FormErrors',formID)||false;this.fields.each(function(el){this.initFieldEvents(el);}.bind(this));this.onSuccess=this.options.onSuccess;this.onFailure=this.options.onFailure;},initFieldEvents:function(el){var field=el.el;var p=el.el;while(!p.hasClass(this.options.parentClassName)){p=p.getParent();}
el.parent=p;switch(el.format){case'select':case'selectDate':if(this.options.validateOnFocus){field.addEvent('change',this.validateField.bindWithEvent(this,el));}
break;case'radio':if(this.options.validateOnFocus){if(!window.ie){field.addEvent('click',this.validateField.bindWithEvent(this,el));}else{field.addEvent('click',this.ieValidateWrap.bindWithEvent(this,el));}}
break;case'group':if(this.options.validateOnFocus){if(!window.ie)field.addEvent('click',this.validateField.bindWithEvent(this,el));else field.addEvent('click',this.ieValidateWrap.bindWithEvent(this,el));}
break;default:if(this.options.validateOnKeyDown){field.addEvent('keyup',this.validateField.bindWithEvent(this,el));}
if(this.options.validateOnFocus){field.addEvent('focus',this.validateField.bindWithEvent(this,el));}
if(this.options.validateOnBlur){field.addEvent('blur',this.validateField.bindWithEvent(this,el));}
break;}},mergeFields:function(h){var tmp=[];var i=0;h.each(function(el){var e=el.el;if(!el.options){el.options={};}
if(!e.each){tmp[i]={el:el.el,format:el.format,options:el.options};i++;}else{var c='Group'+i;e.each(function(els){e.addClass(c);tmp[i]={el:els,format:el.format,options:el.options};i++;});}});return tmp;},addField:function(field){this.initFieldEvents(field);this.fields.push(field);},removeField:function(field){this.fields.remove(field);},validateField:function(e,v){try{var el=v.el;var value=el.value.trim();var valid=false;var tmp='';var req=v.options.required===undefined||(v.options.requires&&v.options.requires.value!='')?true:v.options.required;switch(v.format){case'select':var empty=v.options.empty?v.options.empty:'';if(value!=empty)valid=true;break;case'radio':$ES('input[name="'+el.getProperty('name')+'"]',this.form).each(function(el){if(el.checked)valid=true;}.bind(this));break;case'group':var selectCount=0;$ES('.'+el.className.replace(/(Over|Down)/gi,''),this.form).each(function(el){if(el.checked&&!el.disabled){valid=true;selectCount+=1;}}.bind(this));if(!req&&selectCount==0){valid=!req;}else{valid=v.options.maxSelect>=selectCount;}
break;case'selectDate':var els=$ES('.'+el.className);var date=new Date(els[v.options.yPos].value,els[v.options.mPos].value-1,els[v.options.dPos].value,0,0,0,0);var diff=date-v.options.minDate;valid=isNaN(diff)||diff>0?false:true;break;case'confirm':if(value==$(v.options.confirmWith).value)valid=true;break;case'checkbox':if(el.checked)valid=true;break;case'comparison':if(value.length<v.options.min)break;value=value.trim();v.options.compareWith=v.options.compareWith.trim();var val1=value.substr(0,1).toUpperCase()+value.substr(1,value.length);var val2=v.options.compareWith.substr(0,1).toUpperCase()+v.options.compareWith.substr(1,v.options.compareWith.length);valid=val1==val2;if(v.options.invert)valid=!valid;break;default:var exp='';switch(v.format){case'text':exp=/^[a-z0-9\W\._%-\{\}\[\]\|\#]+$/i;break;case'cleantext':exp=/^(\s*[^<>\{\}\[\]\|\s]+)(\s+[^<>\{\}\[\]\|\s]+\s*)*$/i;break;case'tags':exp=/^(\s*[^<>\{\}\[\]\|\,\s]{1,64})(\s+[^<>\{\}\[\]\|\,\s]{1,64}\s*)*$/i;break;case'tags_comma':exp=/^([^<>\{\}\[\]\|\,]{1,64},?)(,\s?[^<>\{\}\[\]\|\,]{1,64},?)*$/i;break;case'alphanum':exp=/^[a-zA-Z0-9]+$/i;break;case'email':exp=/^[a-z0-9\.\_%-]+@[a-z0-9\.\-]+\.[a-z]{2,4}$/i;break;case'nickname':exp=/^([^\[\]\{\}\<\>\|\:\?\/\\\#]*)$/i;break;case'number':exp=/^[\-\+]?\d*\.?\d+$/;break;case'phone':exp=/^[\d\s \(\)\.\-\+]+$/;break;case'url':exp=/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][\-\d\w]{0,253}\.)+[\w]{2,4}(:[\d]+)?(\/([\-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([\-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([\-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/;break;case'expression':exp=v.options.exp;break;}
var min=v.options.min?v.options.min:2;if((exp.test(value)&&value.length>=min)||(!req&&value.length==0))valid=true;if(v.options.max){if(value.length>v.options.max)el.value=el.value.substr(0,v.options.max);}
break;}
if(valid){v.parent.removeClass(this.options.invalidClassName);}else{v.parent.addClass(this.options.invalidClassName);}}catch(err){}
return valid;},ieValidateWrap:function(e,v){this.validateField(e,v);return true;},validateForm:function(e){if(e){new Event(e).preventDefault();}
var valid=true;this.allErrors='';this.fields.each(function(el){if(!this.validateField(null,el))valid=false;}.bind(this));if(!valid){this.fireEvent('onFailure');if(this.options.scrollToError){window.scrollTo(0,$E('.'+this.options.invalidClassName).getCoordinates().top-50);}
if(this.errorField){this.errorField.addClass(this.options.invalidClassName).setHTML('Invalid information entered. Please review and correct the marked errors below');}
return false;}else{this.fireEvent('onSubmit');if(this.errorField){this.errorField.removeClass(this.options.invalidClassName).setHTML('');}
if(!this.options.ajaxMode){return true;}else{return false;}}},reset:function(){this.form.reset();this.resetErrors();},resetErrors:function(){$ES('.'+this.options.invalidClassName).removeClass(this.options.invalidClassName);if(this.errorField)this.errorField.removeClass(this.options.invalidClassName);this.allErrors='';},getFieldById:function(id){j=null;this.fields.each(function(el,i){if(el.el.getProperty('id')==id){j=i;}});if(j!=null){return this.fields[j];}else{return false;}}});Validator.implement(new Options);Validator.implement(new Events);