<!--
/* 
 * Form Validator
 * 
 * Needs Prototype.js - http://prototypejs.org
 * 
 * Created By Vincent Limjap 
 * Last Edited 12/05/06
 * 
 * Instructions: The script tag to include this file must be located at the end of the HTML file. All element ID names must be unique.
 * 
 * Available validations:
 * 		validateEmail 
 * 		requiredField
 * 		validateNumeric
 * 		requiredAlphanumeric
 * 		validateUSPhone
 * 		requiredUSPhone
 * 		requiredEmail
 * 		confirmField
 * 		requiredCheckbox
 * 		validDate
 * 		validateUSZip 
 * 		requiredRadio
 * Ex.
 * input field: <input id="inputID" type="text" class="requiredEmail" /> <span id="inputID_err" class="formError"></span>
 * textarea field: <textarea id="textareaID" class="requiredField" /> </textarea> <span id="textareaID_err" class="formError"></span>
 * select field: <select id="selectID" class="requiredField" name="selectID">
 * 					<option value="1">1</option>
 * 				</select>
 * 				<span id="selectID_err" class="formError"></span>
 * radio fields: <input type="radio" name="requiredRadio" id="requiredRadio1" class="requiredRadio"></input>
 * 						<input type="radio" name="requiredRadio" id="requiredRadio1"></input>
 * 						<input type="radio" name="requiredRadio" id="requiredRadio1"></input>
 * age validation: <input type="input" class="verifyAge" id="ageMin_10" />
 */

//Initialize Script
var Prototype;
if(!Prototype) {
	alert('Prototype framework missing. - http://prototypejs.org');
	window.open('http://prototypejs.org','prototypewindow');
}


//	**** USER CONFIGURATION SETTINGS HERE *************************	
var alertBox=0; // set to 1 if you want a javascript alert to appear.
var eventListener=1 //set to 1 if you want the eventlistener to be initialized on upon loading. 
var errInputBGColor='#FFEDED'; // input field bgcolor for invalid fields.
// ****************************************************************


var	FormValidation = Class.create();

FormValidation.prototype = {
	initialize:function() {
		this.alertBox=alertBox;
		this.docForm=document.getElementsByTagName('form');
		if (eventListener==1) {
			for (x=0;x<this.docForm.length;x++) {
				this.docForm[x].onsubmit = this.validateForm.bindAsEventListener(this.docForm[x],this.docForm[x].id);
				
			}
		}
	},
	
	trimAll:function(strValue) {
		var objRegExp = /^(\s*)$/;
		//check for all spaces
		if(objRegExp.test(strValue)) {
			strValue = strValue.replace(objRegExp, '');
			if(strValue.length == 0) return strValue;
		}
		//check for leading & trailing spaces
		objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
		if(objRegExp.test(strValue)) {
			//remove leading and trailing whitespace characters
			strValue = strValue.replace(objRegExp, '$2');
		}
		return strValue;		
	},
	
	clearFormErr:function(formEl) {
		formErr=$(formEl).getElementsByTagName('span');
		for (y=0; y<formErr.length; y++) {
			errorItems=formErr.item(y);
			errorAttr=errorItems.className;
			if (errorAttr=='formError' || errorAttr=='formErr') {
				try {
					$(errorItems.id).innerHTML='';
				} catch(err) {};	
			}
		}		
	},	
	
	displayError:function(el, errMsg) {
		$(el.id+'_err').innerHTML = errMsg;
	},
	
	verifyDate:function(strValue) {
		var ValidDatefilter = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
		
		if(!ValidDatefilter.test(strValue))
			return false; //doesn't match pattern, bad date
		else {
			var strSeparator = strValue.substring(2,3); //find date separator
			var arrayDate = strValue.split(strSeparator); //split date into month, day, year
			//create a lookup for months not equal to Feb.
		    var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
		                        '08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
		    var intDay = parseInt(arrayDate[1],10); 
		
		    //check if month value and day value agree
		    if(arrayLookup[arrayDate[0]] != null) {
		      if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
		        return true; //found in lookup table, good date
		    }
		    
		    //check for February (bugfix 20050322)
		    //bugfix  for parseInt kevin
		    //bugfix  biss year  O.Jp Voutat
		    var intMonth = parseInt(arrayDate[0],10);
		    if (intMonth == 2) { 
		       var intYear = parseInt(arrayDate[2]);
		       if (intDay > 0 && intDay < 29) {
		           return true;
		       }
		       else if (intDay == 29) {
		         if ((intYear % 4 == 0) && (intYear % 100 != 0) || 
		             (intYear % 400 == 0)) {
		              // year div by 4 and ((not div by 100) or div by 400) ->ok
		             return true;
		         }   
		       }
		    }
		  }  
		  return false; //any other values, bad date										
	},
	
	goValidate:function(formEl) {
		if(formEl) {
			var fieldItemsAry = new Array;
	
			var Emailfilter  = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
			var Phonefilter1 = /(\(?\d{3}\)?)?(\-| )?\d{3}(\-| )?\d{4}/; //(123)456-7890;
			var Phonefilter2 =  /[0-9]{3}-[0-9]{3}-[0-9]{4}/; //123-456-7890
			var Numericfilter = /(^-?\d\d*$)/;
			var Alphanumericfilter = /^[a-zA-Z0-9\.\s]+$/;
			var ValidUSZip = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
	
			var fieldAry = new Array('input', 'select', 'textarea');
						
			this.clearFormErr(formEl);
			mForm=$(formEl);
			for(x=0; x<fieldAry.length; x++) {
				fieldRows=mForm.getElementsByTagName(fieldAry[x]);
				
				for (y=0; y<fieldRows.length; y++) {
					fieldItem=fieldRows.item(y);
					fieldAttr=fieldItem.className;
					fieldItem.style.backgroundColor='';
					if (fieldAttr) {
						switch(fieldAttr) {
							case "validateEmail":
								if (fieldItem.value) {
									if(!Emailfilter.test(fieldItem.value)) {
										try {
											errMsg='*Invalid email address.';
											this.displayError(fieldItem,errMsg);
										} catch(err) {};
										if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);	
									}
								}
							break;
							case "requiredField":
								if (!fieldItem.value.replace(/^\s+/g, '').replace(/\s+$/g, '')) {
									try {
										errMsg='*Required field.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
							case "validateNumeric":
								if (fieldItem.value) {
									if(!Numericfilter.test(fieldItem.value)) {
										try {
											errMsg='*Numeric data required.';
											this.displayError(fieldItem,errMsg);
										} catch(err) {};
										if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
									}
								}
							break; 
							case "requiredAlphanumeric":
								if(!Alphanumericfilter.test(this.trimAll(fieldItem.value))) {
									try {
										errMsg='*Invalid characters.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break; 
							case "validateUSPhone":
								if (fieldItem.value) {
									if(!Phonefilter1.test(fieldItem.value) || !Phonefilter2.test(fieldItem.value)) {
										try {
											errMsg='*Invalid phone number.';
											this.displayError(fieldItem,errMsg);
										} catch(err) {};
										if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);								
									} 
								}
							break;
							case "requiredUSPhone":
								if(!Phonefilter1.test(fieldItem.value) || !Phonefilter2.test(fieldItem.value)) {
									try {
										errMsg='*Invalid phone number.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);								
								} 
							break;
							case "validateUSZip":
								if (fieldItem.value) {
									if(!ValidUSZip.test(fieldItem.value)) {
										try {
											errMsg='*Invalid zip code.';
											this.displayError(fieldItem,errMsg);
										} catch(err) {};
										if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);	
									}
								}
							break;
							case "requiredUSZip":							
								if(!ValidUSZip.test(fieldItem.value)||(fieldItem.value.length==0)) {
									try {
										errMsg='*Invalid zip code.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);	
								}
							break;
							case "requiredEmail":
								if (!Emailfilter.test(fieldItem.value)) {
									try {
										errMsg='*Invalid email address.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
							case "confirmField": //Matching email must be the PREVIOUS input element.
								fieldCount = 2; //Value is 2 for ATG
								if (!this.trimAll(fieldRows.item(y).value) || fieldRows.item(y).value!=fieldRows.item(y-fieldCount).value) {
									try {
										errMsg='*Mismatched field.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
							case "requiredCheckbox":
								if (!fieldItem.checked) {
									try {
										errMsg='*Required checkbox.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};								
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
													
							case "requiredRadio":
							radioCheck=0;
								for(x=0;x<eval('$(formEl).'+fieldItem.name+'.length');x++) {
									if (eval('document.forms[\''+formEl+'\'].'+fieldItem.name+'[x].checked')) {
										radioCheck=1;
									}
								}
								if(radioCheck==0) {
									try {
										errMsg='*Required field.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
				
							case "validDate":
								if (!this.verifyDate(fieldItem.value)) {
									try {
										errMsg='*Invalid date.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
							
							case "verifyAge":
								if (fieldItem.value.length==1) fieldItem.value = '0'+fieldItem.value
								var strSeparator = fieldItem.value.substring(2,3); //find date separator
								var arrayDate = fieldItem.value.split(strSeparator); //split date into month, day, year
								minAge=fieldItem.id.substr(fieldItem.id.indexOf('_')+1,2);
								var now = new Date();
								var then = new Date((now.getFullYear() - minAge),now.getMonth(),now.getDate());
								var bd = new Date(arrayDate[2],(Number(arrayDate[0]) - 1),arrayDate[1]);
								if(bd>then || !this.verifyDate(fieldItem.value)) {
									try {
										errMsg='*Age requirements not met.';
										this.displayError(fieldItem,errMsg);
									} catch(err) {};
									if ($(fieldItem.id)) fieldItemsAry.push(fieldItem.id);
								}
							break;
						}
					}
				}
			}
						
			if (fieldItemsAry.length>0) {
				if(this.alertBox==1) alert('Please make sure all fields are valid.');
				for (x=0; x<fieldItemsAry.length; x++) {
					$(fieldItemsAry[x]).style.backgroundColor=errInputBGColor;
				}
				try {
				$(fieldItemsAry[0]).focus();
				} catch(err) {}
				return false;
			}
		}
		return true;		
	},
	
	validateForm: function(formEvt,formID) {
		return FormValidation.goValidate(formID);
	}
} 
var FormValidation = new FormValidation();
-->
