
// ============================
// 	OBJECT CLASSES
// ============================

 // form object class
	function formToValidate (formName) {
		this.formName = formName;
		this.elemsArray = [];
		this.errorArray = [];
		this.submitFormOK = true;
		
	 // write out error styles for advanced error display
		var advErrorStyles  = "<style type='text/css'>";
		    advErrorStyles += ".errorDivContainer { font-famliy: Verdana; border: 1px solid #cc6600; background-color: #ffffea; padding: 6px; color: #cc6600;  }";
			advErrorStyles += ".normalDivContainer { font-famliy: Verdana; border: 0px solid white; background-color: transparent; padding: 0px; color: #333333; }";
			advErrorStyles += "</style>";
			
		document.write(advErrorStyles);
	} // end formToValidate() object

 // form element object class
	function elemToVal (elemName, fieldValType, errorText, compareElemName) {
		this.elemName = elemName;
		this.errorText = errorText;
		this.fieldValType = fieldValType;
		this.valid = true;
		this.compareElemName = compareElemName || "Not Provided";
	} // end elemToVal() object


// ===================================
// 	VALIDATION METHODS AND FUNCTIONS
// ===================================

 // FORM VALIDATE SCRIPT
	formToValidate.prototype.validate = function(simpleAdvancedDisp) {
	
	 // check to see if advanced or simple validation display is selected
		var typeOfErrorDisp = (!simpleAdvancedDisp) ? "simple" : "advanced";
		
	 // clear out errorArray if there have been previous form validations
		this.errorArray.length = 0;
		
		for (i=0; i<this.elemsArray.length; i++) {
		 // build document.formName.element ref and provide the formElem Name
			var elemRef = "document." + this.formName + "." + this.elemsArray[i].elemName;
			var elemName = this.elemsArray[i].elemName;
			var compElemName = this.elemsArray[i].compareElemName;
		
		 // if the advanced validation option has been selected,
		 // change the formElem className back to normal
		 // in case have been previous form validations
		 	var elemErrorIsFor = (compElemName == "Not Provided") ? elemName : compElemName;
			if (typeOfErrorDisp == "advanced") {
				var doNormalDivChange = true;
			 // Since it is possible to apply more than one validation routine
			 // to one field, we have to make sure that an error div tag write out
			 // isn't overwritten by a second validation routine that evals to true
				if (this.errorArray.length > 0) {
					for (k=1; k<this.errorArray.length; k++) {
						if (this.errorArray[k][1] == elemErrorIsFor) {
							doNormalDivChange = false;
						}
					}
				}
				if (doNormalDivChange) changeDivClassName(elemErrorIsFor, "normalDivContainer");
			}
			
		 // check to see if compareElemRef value has been provided
		 // if so, add its reference to the arguments for the validate function call
			var compareElem = false;
			if (this.elemsArray[i].compareElemName != "Not Provided") {
				var compareElemRef = "document." + this.formName + "." + this.elemsArray[i].compareElemName;
				compareElem = true;
			}
			
		 // create the arguments for the specified validation function
			var arguments = (compareElem) ? ("'" + elemRef + "', '" + compareElemRef + "'") : ("'" + elemRef + "'");

		 // call the specified validation function for each element
		 // and set the valid variable to the returned value
			this.elemsArray[i].valid = eval(this.elemsArray[i].fieldValType + "(" + arguments + ")");
			
		 // if valid = false, enter item's error text and field error is for into the formToValidate's 
		 // multi dimensional error array; if advaced valid has been selected, change form elem
		 // to error type style
			if (!this.elemsArray[i].valid) {
				this.errorArray[this.errorArray.length] = [this.elemsArray[i].errorText, elemErrorIsFor];
				if (typeOfErrorDisp == "advanced") changeDivClassName (elemErrorIsFor, "errorDivContainer");
			}
		} // end of looping through the elemsArray	
		
	 // process the form submission errors
		if (!this.errorArray.length < 1) {

			var errorsForAlert = "";
			var errorCount = 0;
			
			for (i=0; i<this.errorArray.length; i++) {
			 // make sure all of the errors are lined up
				var numberPeriod = (errorCount < 9) ? ".   " : ". ";
			 // add the next line of error text
				errorsForAlert += errorCount + 1 + numberPeriod + this.errorArray[i][0] + "\n";
				errorCount++;
			}
		
		 // make sure the error is grammatically correct
			var pluralErrors = (errorCount > 1) ? "S" : "";
			var errorAlert 	 = "(" + errorCount + ")  FORM SUBMISSION ERROR" + pluralErrors + " OCCURED:\n";
			errorAlert 		+= "------------------------------------------------------\n";
			errorAlert		+= errorsForAlert;
			
		 // display errors in an alert message
			alert(errorAlert);
		} // end of form submission error processing
		
		this.submitFormOK = (this.errorArray.length < 1) ? true : false;
	} // end validate() function

 // change divContainer className for possible advanced validation scheme
 	function changeDivClassName (elemName, className) {
		var divTagName = elemName + "DivContainer";
		var divTagRef = findDomObjRef(divTagName, 0);
		eval(divTagRef + ".className = '" + className + "'");
	}

 // change element className for possible advanced validation scheme
	function changeClassName (elemRef, className) {
		var fieldType = eval(elemRef + ".type");
		if (fieldType != "checkbox" && fieldType != "radio" && fieldType != "undefined") {	
			eval(elemRef + ".className = '" + className + "'");
		}
	}
	
 // find dom object ref
	function findDomObjRef (objectId, withStyle) {
		var addStyle = (withStyle == 1) ? '.style' : ''
		if (document.all) return "document.all." + objectId + addStyle;
		if (document.layers) return "document." + objectId
		if (document.getElementById && !document.all) return "document.getElementById('" + objectId + "')" + addStyle
	}

 //---------------------------------
 // Single Value Validation Scripts
 //---------------------------------

 // Check if field is not empty
	function isNotEmpty (elemRef) {
		var elemValRef = eval(elemRef + ".value");
		return (elemValRef != "") ? true : false;
	}
	
 // Check if field is valid email address
	function isValidEmail (elemRef) {
		var elemValRef = eval(elemRef + ".value");
		var emailRegExp = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
		return (elemValRef.match(emailRegExp)) ? true : false;
	}

 // if field contains val, is val valid email
	function ifVal_IsValidEmail (elemRef) {
		if (isNotEmpty(elemRef)) return (isValidEmail(elemRef));
		else return true;
	}
	
 // Check if selectedIndex of a select field is greater than 0
	function selIndexIsGreaterThanOne (elemRef) {
		var elemValRef = eval(elemRef + ".selectedIndex");
		return (elemValRef > 0) ? true : false;
	}
	
 // Check if at least one radio button in a list is selected
	function isRadioItemSelected (elemRef) {
		var elemRefStringLength = elemRef.length;
		var indexOfSecondDot = elemRef.indexOf(".", 10);	
		var thisformRef = elemRef.substring(0, indexOfSecondDot);
		var formLength = eval(thisformRef + ".elements.length");
		var justElemName = elemRef.substring(indexOfSecondDot + 1, elemRefStringLength);
		var returnVal = false;
		
		for (j=0; j<formLength; j++) {
			if (eval(thisformRef + ".elements[" + j + "].type") == 'radio') {
				if (eval(thisformRef + ".elements[" + j + "].name.indexOf('" + justElemName + "')") != -1) {
					if (eval(thisformRef + ".elements[" + j + "].checked") == true) {
						returnVal = true;
					}
				}
			}
		}
		
		return returnVal;	
	}
	
 // Check if field contains a valid date
	function isValidDate(elemRef) {
		var mo, day, yr;
		var entry = eval(elemRef + ".value");
		var re = /\b\d{1,2}[\/-]\d{1,2}[\/-]\d{4}\b/;
		if (re.test(entry)) {
			var delimChar = (entry.indexOf("/") != -1) ? "/" : "-";
			var delim1 = entry.indexOf(delimChar);
			var delim2 = entry.lastIndexOf(delimChar);
			mo = parseInt(entry.substring(0, delim1), 10);
			day = parseInt(entry.substring(delim1+1, delim2), 10);
			yr = parseInt(entry.substring(delim2+1), 10);
			var testDate = new Date(yr, mo-1, day);
			if (testDate.getDate() == day) {
				if (testDate.getMonth() + 1 == mo) {
					if (testDate.getFullYear() == yr) { return true;
					} else { return false; }
				} else { return false; }
			} else { return false; }
		} else { return false; }
		return false;
	}
	
 // If field contains val, is val valid date
	function ifVal_isValidDate (elemRef) {
		if (isNotEmpty(elemRef)) return (isValidDate(elemRef));
		else return true;
	}

 // Check if field contains a valid phone number
	function isValidPhoneNumber (elemRef) {
		var elemValRef = eval(elemRef + ".value");
		var validFormatRegExp = /^(\+\d{1,3} ?)?(\(\d{1,5}\)|\d{1,5}) ?\d{3} ?\d{0,7}( ?(x|xtn|ext|extn|extension)?\.? ?\d{1,5})?$/i
		var isValid = validFormatRegExp.test(elemValRef);
		return isValid;	
	}
	
 // Check if field has a valid postal code
	function isValidZipCode (elemRef) {
		var elemValRef = eval(elemRef + ".value");
	  	var validFormat = /^(\d{5}(-\d{4})?|[a-z][a-z]?\d\d? ?\d[a-z][a-z])$/i
	  	var isValid = validFormat.test(elemValRef);
	  	return isValid;
	}
	
	
 //-------------------------------
 // Comparison Validation Scripts
 //-------------------------------
	
 // If one field is filled in, is an associated field also filled in
	function ifVal_isOtherValNotEmpty (elemRef1, elemRef2) {
		if (isNotEmpty(elemRef1)) {
			if (isNotEmpty(elemRef2)) { return true;
			} else { return false; }
		} else { return true; }
	}
	
 // If one field is filled in, is an associated field also filled in with a valid email address
	function ifVal_isOtherValValidEmail (elemRef1, elemRef2) {
		if (isNotEmpty(elemRef1)) {
			if (isValidEmail(elemRef2)) { return true;
			} else { return false; }
		} else { return true; }
	}

 // If one field is filled in, is its value equal to another field's value
	function ifVal_isEqualToOtherVal (elemRef1, elemRef2) {
		if (isNotEmpty(elemRef1)) {
			var elemValRef1 = eval(elemRef1 + ".value");
			var elemValRef2 = eval(elemRef2 + ".value");
			if (elemValRef1 == elemValRef2) { return true;
			} else { return false; }
		} else { return true; }
	}

 // If both fields are not empty, are both fields equal
	function ifBothVal_areBothEqual (elemRef1, elemRef2) {
		if (isNotEmpty(elemRef1) && isNotEmpty(elemRef2)) {
			var elemValRef1 = eval(elemRef1 + ".value");
			var elemValRef2 = eval(elemRef2 + ".value");
			if (elemValRef1 == elemValRef2) { return true;
			} else { return false; }
		} else { return true; }
	}
