function validator(frm,onsubmit){this.errors=false;this.fields=new Array();this.before=null;this.after=null;this.form=document.forms[frm]||document.getElementById(frm);this.form.validator=this;if(this.form.onsubmit&&onsubmit){this.form.onsubmit=onsubmit}this.error=function(msg,el){this.errors=true;if(el){msg+=" ["+el+"]"}alert("Validator: "+msg);return false};this.getEl=function(el){return this.form.elements[el]||document.getElementById(el)};if(!this.form){return this.error("Could not locate form",frm)}if(this.form.onsubmit){this.form.oldsubmit=this.form.onsubmit}this.form.onsubmit=function(){this.validator.errors=false;try{if(this.validator.before){if(!this.validator.before(this)){return false}}if(this.validator.errors){return false}for(var i=0;i<this.validator.fields.length;i++){var item=this.validator.fields[i];item.validator=this.validator;item.el=this.validator.getEl(item.name);if(item.el&&item.el.length>1&&!item.el.selectedIndex){item.el=item.el[0]}if(!item.el){return this.validator.error("Field not available.",item.name)}item.el.setAttribute("autocomplete","off");if(!this.validator.validate(item)){if(this.validator.errors){return false}if(!item.error){item.error="{0}: Field is not valid"}alert(item.error.replace("{0}",item.name));if(item.el.type){if(item.el.type.toLowerCase()=="hidden"){return false}}if(typeof item.el.focus=="function"){item.el.focus()}if(typeof item.el.select=="function"){item.el.select()}return false}}if(this.validator.errors){return false}if(this.validator.after){if(!this.validator.after(this)){return false}}if(this.validator.errors){return false}if(this.oldsubmit){return this.oldsubmit()}}catch(e){return this.validator.error("An error occurred while validating this form. Please try agian later.\n"+e.description)}return true};this.add=function(item,cmd,msg){if(!this.form){this.error("Please set your form")}this.fields[this.fields.length]={name:item,cmd:cmd,msg:msg}};this.remove=function(item){if(!this.form){this.error("Please set your form")}for(var i=0;i<this.fields.length;i++){if(this.fields[i].name==item){this.fields.splice(i,1);i=0}}};this.clear=function(){this.fields.length=0};this.validate=function(item){if(!item||typeof (item)!="object"){return false}if(!item.el){return false}item.error=item.msg;var value=(item.el.value||"").toLowerCase();var cmd=(item.cmd||"").toLowerCase();var int_equal=cmd.indexOf("=");if(int_equal>=0){var cmdvalue=cmd.substr(int_equal+1);cmd=cmd.substring(0,int_equal);if(!cmdvalue){return this.error("Command value has not been set",item.name)}}switch(cmd){case"req":case"required":if(!item.error){item.error="{0}: This field is required"}var el=item.validator.getEl(item.name);if(el.selectedIndex){return(item.el.selectedIndex!=0)}else{if(el.length>1){for(var i=0;i<el.length;i++){if(el[i].checked){return true}}}else{return(value.length>0)}}break;case"equals":case"is":if(!item.error){item.error="{0}: Please verify the entered value"}return(value==cmdvalue);break;case"checked":case"chk":if(!item.error){item.error="{0}: Must be checked before continuing"}return item.el.checked;break;case"maxlength":case"maxlen":if(value.length==0){return true}if(!item.error){item.error="{0}: Please enter at most "+cmdvalue+" characters"}item.error+="\n[Current length = "+value.length+" ]";cmdvalue=parseInt(cmdvalue)||0;return(value.length<=cmdvalue);break;case"minlength":case"minlen":if(value.length==0){return true}if(!item.error){item.error="{0}: Please enter at least "+cmdvalue+" characters"}item.error+="\n[Current length = "+value.length+" ]";cmdvalue=parseInt(cmdvalue)||0;b_return(value.length>=cmdvalue);break;case"alnum":case"alphanumeric":if(value.length==0){return true}if(!item.error){item.error="{0}: Please enter only alpha-numeric characters"}return(value.match(/[^A-Za-z0-9]/)==null);break;case"num":case"numeric":if(value.length==0){return true}if(!item.error){item.error="{0}: Please enter only numeric characters"}return(value.match(/[^0-9]/)==null);break;case"alpha":case"alphabetic":if(value.length==0){return true}if(!item.error){item.error="{0}: Please enter only alphabetic characters"}return(value.match(/[^A-Za-z]/)==null);break;case"alnumhyphen":if(value.length==0){return true}if(!item.error){item.error="{0}: Only enter the allowed characters of A-Z,a-z,0-9,- and _"}return(value.match(/[^A-Za-z0-9\-_]/)==null);break;case"url":if(value.length==0){return true}if(!item.error){item.error="{0}: Please enter a valid web address"}if(cmdvalue){if(value.indexOf(cmdvalue+"://")!=0){value=cmdvalue+"://"+value;item.el.value=value}}return !(value.match(/http:\/\/+(www\.)?[a-z0-9\-\.]{3,}\.[a-z]{2,4}$/)==null);break;case"phone":if(value.length==0){return true}if(!item.error){item.error="{0}: Please enter a valid phone number"}return !(value.match(/^(\(?\d\d\d\)?)?( |-|\.)?\d\d\d( |-|\.)?\d{4,4}(( |-|\.)?[ext\.]+ ?\d+)?$/)==null);break;case"zip":if(value.length==0){return true}if(!item.error){item.error="{0}: Please enter a valid zip code"}return !(value.match(/^((\d{5}-\d{4})|(\d{5}))?$/)==null);break;case"postal":if(value.length==0){return true}if(!item.error){item.error="{0}: Please enter a valid postal code number"}if(cmdvalue=="zip"||cmdvalue=="us"||cmdvalue=="usa"){var reg=/^((\d{5}-\d{4})|(\d{5}))?$/}else{if(cmdvalue=="postal"||cmdvalue=="cn"||cmdvalue=="can"){var reg=/^([AaBbCcEeGgHhJjKkLlMmNnPpRrSsTtVvXxYy]\d[A-Za-z]\s?\d[A-Za-z]\d)$/}else{var reg=/^((\d{5}-\d{4})|(\d{5})|([AaBbCcEeGgHhJjKkLlMmNnPpRrSsTtVvXxYy]\d[A-Za-z]\s?\d[A-Za-z]\d))$/}}return !(value.match(reg)==null);break;case"lt":case"lessthan":if(isNaN(value)){return this.error("Please enter a number",item.name)}if(!item.error){item.error="{0}: Please enter a number less than "+cmdvalue}return(eval(value)<eval(cmdvalue));break;case"gt":case"greaterthan":if(isNaN(value)){return this.error("Please enter a number",item.name)}if(!item.error){item.error="{0}: Please enter a number greater than "+cmdvalue}return(eval(value)>eval(cmdvalue));break;case"regexp":case"regex":case"reg":if(!item.error){item.error="{0}: Please verify your entry"}return !(value.match(cmdvalue)==null);break;case"dontselect":case"nosel":var el=item.validator.getEl(item.name);if(el.selectedIndex==null){return this.error("Cannot validate a non-select item",item.name)}if(!item.error){item.error="{0}: Please select an option"}cmdvalue=parseInt(cmdvalue)||0;return(el.selectedIndex!=cmdvalue);break;case"credit":if(value.length==0){return true}var type=cmdvalue;if(type!="visa"&&type!="mc"&&type!="disc"&&type!="amex"&&type!="diners"){type=(item.el.form[cmdvalue].value||"").toLowerCase()}if(!type){return this.error("No credit card type specified",item.name)}if(!item.error){item.error="{0}: Invalid credit card"}if(type=="visa"){var reg=/^4\d{3}[-, ,]?\d{4}[-, ,]?\d{4}[-, ,]?\d{4}$/}else{if(type=="mc"){var reg=/^5[1-5]\d{2}[-, ,]?\d{4}[-, ,]?\d{4}[-, ,]?\d{4}$/}else{if(type=="disc"){var reg=/^6011[-, ,]?\d{4}[-, ,]?\d{4}[-, ,]?\d{4}$/}else{if(type=="amex"){var reg=/^3[4,7]\d{13}$/}else{if(type=="diners"){var reg=/^3[0,6,8]\d{12}$/}}}}}if(!reg){return this.error("Validation expression not available for "+type,item.name)}if(reg.test(value)){var ccnum=value.split("-").join("");var checksum=0;for(var i=(2-(ccnum.length%2));i<=ccnum.length;i+=2){checksum+=parseInt(ccnum.charAt(i-1))}for(var i=(ccnum.length%2)+1;i<ccnum.length;i+=2){var digit=parseInt(ccnum.charAt(i-1))*2;if(digit<10){checksum+=digit}else{checksum+=(digit-9)}}return((checksum%10)==0)}break;case"email":if(value.length==0){return true}if(!item.error){item.error="{0}: Invalid email address"}return !(value.match(/^.+@[^\.].*\.[a-z]{2,}$/)==null);break;case"custom":if(!cmdvalue){return this.error("Please specify custom function",item.name)}if(cmdvalue){cmdvalue=eval(cmdvalue);if(cmdvalue){return cmdvalue(item)}}break;default:return false}return false}}