 //This function should also go into your validate.js 


 /* 
 * return the form item object reference with given name 
 * 
 * param formItemName String name of the object to get 
 */ 
 function getFormItem(formItemName) { 
	return eval("document." + THEFORM + "." + formItemName); 
 }
 
function itemHasValue(formItemObject) {
	if (formItemObject == null || formItemObject.value == null || stringTrim(formItemObject.value) == "") {
		return false;
	}
	return true;
}

function stringTrim(s) {
	if (s == null) {
		return s;
	}
	while (s.substring(0,1) == ' ') {
		s = s.substring(1,s.length);
	}
	while (s.substring(s.length-1,s.length) == ' ') {
		s = s.substring(0,s.length-1);
	}
	return s;
	}
	function itemIsChecked(formItemObject) {
		if (formItemObject == null || formItemObject.checked == null) {
			return false;
		} else {
			return formItemObject.checked;
	}
}

/*
* Set focus to the form object with given name
*
* param formObjectName String - name of the form object
*/
function focusOn(formObjectName) {
	var formItem = getFormItem(formObjectName);
	if (formItem != null) {
		formItem.focus();
	}
}

/*
* return true if event is the enter key being pressed
* param event object
*/
var IE = (document.all) ? true : false;
function isEnterEvent(event) {
	var code = 0;
	if (IE) {
		code = event.keyCode;
	} else {
		code = event.which;
	}
	if (code==13 || code==3) {
		return true;
	}
	return false;
}

 /*
    *
	* Object that manages validation. on page submit call isValid() to see if all validation tests passed.
	* object contains an array of "ValidateItem" objects.  It asks each item to validate and accumulate 
	* error messages from ones that fail.  Then it prompts the user if needed and sets focus to the first problem item
	*/	
	function Validator() {
		//object properties
		this.validateItems = new Array();
		
		//object functions
		this.isValid = Validator_isValid;
		this.addItem = Validator_addItem;
	}
	function Validator_isValid() {
		var items = this.validateItems;
		var userMessages = "";
		var focusItem = null;
		var errorCount = 0;
		for (var i = 0; i < items.length; i++) {
			var anItem = items[i];
			if (!anItem.isValid()) {
				errorCount++;
				userMessages += "" + errorCount + ": " + anItem.getReason() + "\n";
				//alert(userMessages);
				if (focusItem == null) {
					focusItem = anItem;
				}
			}
		}
		if (errorCount > 0) {
			var displayMsg = "Validation failed for the following ";
			if (errorCount == 1) {
				displayMsg += "reason";
			} else {
				displayMsg += "" + errorCount + " reasons";			
			}
			displayMsg += ":\n\n" + userMessages+ "\n\n";			
			alert(displayMsg);
			if (focusItem.isRadioType()) {
				document.location.hash=focusItem.anchorName;
			} else {	
				focusOn(focusItem.getName());
			}
			return false;
		} else {
			return true;
		}
	}
	function Validator_addItem(aValidateItem) {
		this.validateItems[this.validateItems.length] = aValidateItem;
	}

	/*	
    * Object that contains information on how to validate form items. Use functions above to 
	* create a new object with the appropriate values set.
	* 
	* param aName String - name of the form item to be validated
	* param aDescription String - description of what the item is that the user will understand
	* param isRequired boolean - true if this field needs to have a value, false if it is optional
	*        this can be usefull if you only want to validate that the user entered a valid number if they enter anything
	* param validateType String - optional value to indicate what type of validation to perform 
	* variable conditionalType - optional int to indicate if item should be conditionally validated.  see below
	* variable extraParam Object - optional value of any type.  required if the type of validation requires it
	* variable anchorName String - name of the anchor to put focus on if radio button validation fails.
	*
	* typeId
	*   ValidateItem.BASICVALUE - validate item has a value (Default)
	*   ValidateItem.NUMBER - validate value is a number
	*   ValidateItem.EMAIL - validate value is a valid email address
	*   ValidateItem.DATE - validate value is a date
	*   ValidateItem.PHONE - validate value is a phone number
	*   ValidateItem.EMPTY - validate value is empty or null
	*   ValidateItem.PASSWORDMATCH - validate value and extra match (password)
	*   ValidateItem.VALUEOREXTRA - validate value OR extra item has a value 
	*   ValidateItem.RADIO - validate radio buttons
	*   ValidateItem.CHECKBOXES - validate at least one check box is checked in group of names
	*
	* conditionalType
	*   ValidateItem.CONDITIONS.OFF -1 - off
	*   ValidateItem.CONDITIONS.EXTRA_IS_CHECKED 0 - if field with name in "extra" is checked, validate 
	*   ValidateItem.CONDITIONS.EXTRA_HAS_VALUE 1 - if field with name in "extra" has value, validate 
	*   ValidateItem.CONDITIONS.EXTRA_IS_EXTRA2 2 - if field with name in "extra" has value same as "extra2", validate
	*/
	function ValidateItem(aName,aDescription, isRequired, validateType) {
		//object properties
		this.name = aName;
		this.description = aDescription;
		this.failureDescription = null;
		this.required = (isRequired == null ? true : isRequired);
		this.type = (validateType == null ? ValidateItem.BASICVALUE : validateType);
		this.conditionalType = ValidateItem.CONDITIONS.OFF;
		this.extra = null;
		this.extra2 = null;
		this.anchorName = null;
		this.reason = "";
		
		//public instance methods (required by validator)
		this.isValid = ValidateItem_isValid;
		this.getReason = ValidateItem_getReason;
		this.isRadioType = ValidateItem_isRadioType;
		this.getName = ValidateItem_getName;		
		//private instance methods
		//this.itemHasValue = ValidateItem_itemHasValue;
		//this.itemIsChecked = ValidateItem_itemIsChecked;
		this.isValidValue = ValidateItem_isValidValue;
		this.isNotSpecificValue = ValidateItem_isNotSpecificValue;
		this.isValidEmptyValue = ValidateItem_isValidEmptyValue;
		this.isValidNumber = ValidateItem_isValidNumber;
		this.isValidPositiveNumber = ValidateItem_isValidPositiveNumber;
		this.isValidInteger = ValidateItem_isValidInteger;
		this.isValidPositiveInteger = ValidateItem_isValidPositiveInteger;
		this.isValidRadioButtons = ValidateItem_isValidRadioButtons;
		this.isValidEmail = ValidateItem_isValidEmail;
		this.isValidDate = ValidateItem_isValidDate;
		this.isValidPhone = ValidateItem_isValidPhone;
		this.isValidPassword = ValidateItem_isValidPassword;
		this.isValidCheckBoxes = ValidateItem_isValidCheckBoxes;
		this.isValidOR = ValidateItem_isValidOR;
	}
	//validation type static constants
	ValidateItem.BASICVALUE = "BasicValue";
	ValidateItem.NOTSPECIFICVALUE = "NotSpecificValue";
	ValidateItem.NUMBER = "Number";
	ValidateItem.POSITIVENUMBER = "PositiveNumber";
	ValidateItem.INTEGER = "Integer";
	ValidateItem.POSITIVEINTEGER = "PositiveInteger";
	ValidateItem.EMAIL = "Email";
	ValidateItem.DATE = "Date";
	ValidateItem.PHONE = "Phone";
	ValidateItem.EMPTY = "EmptyNull";
	ValidateItem.PASSWORDMATCH = "PasswordMatch";
	ValidateItem.VALUEOREXTRA = "ValueOrExtra";
	ValidateItem.RADIO = "RadioButtons";
	ValidateItem.CHECKBOXES = "Checkboxes";
	//conditional types static constants
	function ValidateItemConditionTypes() {
		//holder for static constants
	}
	ValidateItemConditionTypes.OFF = "Off";
	ValidateItemConditionTypes.EXTRA_IS_CHECKED = "Checked Checkbox";
	ValidateItemConditionTypes.EXTRA_HAS_VALUE = "Extra Has Value";
	ValidateItemConditionTypes.EXTRA_IS_EXTRA2 = "Extra is Extra2 Value";
	ValidateItem.CONDITIONS = ValidateItemConditionTypes;
	
	
	//instance methods
	function ValidateItem_getName() {
		return this.name;
	}
	function ValidateItem_getReason() {
		return this.reason;
	}
	function ValidateItem_isValid() {
		//prepare to validate
		if (this.conditionalType != ValidateItem.CONDITIONS.OFF) {
			var condFormItem = getFormItem(this.extra);
			if (this.conditionalType == ValidateItem.CONDITIONS.EXTRA_IS_CHECKED) {
				if (itemIsChecked(condFormItem)) {
					this.required = true;
				} else {
				    this.required = false;
				}
			} else if (this.conditionalType == ValidateItem.CONDITIONS.EXTRA_HAS_VALUE) {
				if (itemHasValue(condFormItem)) {
					this.required = true;
				} else {
				    this.required = false;
				}
			} else if (this.conditionalType == ValidateItem.CONDITIONS.EXTRA_IS_EXTRA2) {
			    if (condFormItem.value == this.extra2) {
					this.required = true;
				} else {
			        this.required = false;
				}
			}
		}
		//alert(this.required);
		//perform validation
		this.reason = "";
		switch (this.type){
			case ValidateItem.BASICVALUE : return this.isValidValue(); 
			case ValidateItem.NOTSPECIFICVALUE : return this.isNotSpecificValue(); 
			case ValidateItem.NUMBER : return this.isValidNumber(); 
			case ValidateItem.POSITIVENUMBER : return this.isValidPositiveNumber(); 
			case ValidateItem.INTEGER : return this.isValidInteger(); 
			case ValidateItem.POSITIVEINTEGER : return this.isValidPositiveInteger(); 
			case ValidateItem.EMAIL : return this.isValidEmail(); 
			case ValidateItem.DATE : return this.isValidDate(); 
			case ValidateItem.PHONE : return this.isValidPhone(); 
			case ValidateItem.EMPTY : return this.isValidEmptyValue(); 
			case ValidateItem.PASSWORDMATCH : return this.isValidPassword(); 
			case ValidateItem.VALUEOREXTRA : return this.isValidOR();			
			case ValidateItem.RADIO : return this.isValidRadioButtons(); 
			case ValidateItem.CHECKBOXES : return this.isValidCheckBoxes(); 									
			default : this.reason="invalid validation type";return false;
		}
	}
	function ValidateItem_isValidValue() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		//assumes is required
		if (hasVal) {
			return true;
		} else {
			if (this.required) {
				this.reason = "" + this.description + " is required";
				return false;
			} else {
				return true;
			}				
		}
	}
	function ValidateItem_isNotSpecificValue() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		if (hasVal) {
			if (formItem.value == this.extra2) {
				this.reason = "" + this.failureDescription;
				return false;		
			} else {
				return true;
			}
		} else {
			if (this.required) {
				this.reason = "" + this.description + " is required";
				return false;
			} else {
				return true;
			}				
		}
	}
	function ValidateItem_isValidPassword() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		if (hasVal) {
			var formItem2 = getFormItem(this.extra);
			var hasVal2 = itemHasValue(formItem2);
			if (hasVal2) {
				if (formItem.value == formItem2.value) {
					return true;
				} else {
					this.reason = "Passwords are not equal";
					return false;
				}
			} else {
				this.reason = "Verify Password is required";
				return false;
			}
		} else {
			if (this.required) {
				this.reason = "Password is required";
				return false;
			} else {
				return true;
			}
		}
	}
	function ValidateItem_isValidOR() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		var formItem2 = getFormItem(this.extra);
		var hasVal2 = itemHasValue(formItem2);
		//alert("" + hasVal +" "+ formItem.value+ " " + formItem2.value + " " +hasVal2);
		if (!hasVal && !hasVal2) {
			this.reason = "" + this.description;
			return false;
		}
		return true;
	}	
	function ValidateItem_isValidEmptyValue() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		//assumes is required
		if (hasVal) {
			this.reason = "" + this.description;
			return false;
		} else {
			return true;
		}
	}
	function ValidateItem_isValidNumber() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		if (hasVal) {
			var value = formItem.value;
			if (isNaN(value)) {
				this.reason = "" + this.description + " is not a number";
				return false;
			} else {
				return true;
			}
		} else {
			if (this.required) {
				this.reason = "" + this.description + " is required";
				return false;
			} else {
				return true;
			}
		}
	}
	function ValidateItem_isValidPositiveNumber() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		if (hasVal) {
			var value = formItem.value;
			if (isNaN(value) || value <= 0) {
				this.reason = "" + this.description + " is not a number greater than zero";
				return false;
			} else {
				return true;
			}
		} else {
			if (this.required) {
				this.reason = "" + this.description + " is required";
				return false;
			} else {
				return true;
			}
		}
	}
	function ValidateItem_isValidInteger() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		if (hasVal) {
			var value = formItem.value;
			if (isNaN(value) || value.indexOf(".") != -1) {
				this.reason = "" + this.description + " is not an integer";
				return false;
			} else {
				return true;
			}
		} else {
			if (this.required) {
				this.reason = "" + this.description + " is required";
				return false;
			} else {
				return true;
			}
		}
	}
	function ValidateItem_isValidPositiveInteger() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		if (hasVal) {
			var value = formItem.value;
			if (isNaN(value) || value.indexOf(".") != -1 || value < 1) {
				this.reason = "" + this.description + " is not an integer greater than one";
				return false;
			} else {
				return true;
			}
		} else {
			if (this.required) {
				this.reason = "" + this.description + " is required";
				return false;
			} else {
				return true;
			}
		}
	}
	function ValidateItem_isValidRadioButtons() {
		var formItem = getFormItem(this.name);
		var val = getSelectedRadioValue(formItem);
		if (val == null || val == "") {
			this.reason = "" + this.description + " is required";
			return false;
		}
		return true;
	}
	function ValidateItem_isValidEmail() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		if (hasVal) {
			var value = formItem.value;
			if ((value.indexOf("@") == -1) || (value.indexOf(".") == -1)) {
				this.reason = "" + this.description + " is not a email address";
				return false;
			} else {
				return true;
			}
		} else {
			if (this.required) {
				this.reason = "" + this.description + " is required";
				return false;
			} else {
				return true;
			}
		}
	}
	function ValidateItem_isValidDate() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		if (hasVal) {
			var value = formItem.value;
			if (value.length < 10 || value.charAt(2) != '/' || value.charAt(5) != '/') {
				this.reason = "" + this.description + " is not a valid date format (MM/DD/YYYY)";
				return false;
			} else {
				return true;
			}
		} else {
			if (this.required) {
				this.reason = "" + this.description + " is required";
				return false;
			} else {
				return true;
			}
		}
	}
	function ValidateItem_isValidPhone() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		if (hasVal) {
			var value = formItem.value;
			if (value.length != 12  || value.charAt(3) != '-' || value.charAt(7) != '-') {
				this.reason = "" + this.description + " is not a valid phone format (000-000-0000)";
				return false;
			} else {
				return true;
			}
		} else {
			if (this.required) {
				this.reason = "" + this.description + " is required";
				return false;
			} else {
				return true;
			}
		}
	}

	function ValidateItem_isValidCheckBoxes() {
		var ids = this.extra;
		for (var i = 0; i < ids.length; i++) {
			var anid = ids[i];
			//assumes name combined with id makes the name of the check box object. 
			var formItem = getFormItem(this.name + anid);
			if (formItem != null) {
				if (formItem.checked) {
					return true;
				}
			}
		}
		this.reason = /*"At least one " +*/ this.description + " must be selected";
		return false;
	}

	function ValidateItem_isRadioType() {
		return (this.type == ValidateItem.RADIO);
	}
   /*
    * constructors for a ValidateItem.  Simplify object creating to require less code on JSP pages.
	* more of these can be added as needed to fit all the possible conditions.
	*/
	function newEmailValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, true, ValidateItem.EMAIL);
	}
	function newOptionalEmailValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, false, ValidateItem.EMAIL);
	}
	function newDateValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, true, ValidateItem.DATE);
	}
	function newOptionalDateValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, false, ValidateItem.DATE);
	}
	function newPhoneValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, true, ValidateItem.PHONE);
	}
	function newOptionalPhoneValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, false, ValidateItem.PHONE);
	}
	function newNumberValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, true, ValidateItem.NUMBER);
	}
	function newPositiveNumberValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, true, ValidateItem.POSITIVENUMBER);
	}
	function newIntegerValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, true, ValidateItem.INTEGER);
	}
	function newPositiveIntegerValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, true, ValidateItem.POSITIVEINTEGER);
	}
	function newOptionalNumberValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, false, ValidateItem.NUMBER);
	}
	function newOptionalIntegerValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, false, ValidateItem.INTEGER);
	}	
	function newOptionalPositiveIntegerValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, false, ValidateItem.POSITIVEINTEGER);
	}	
	function newRadioValidateItem(aName, aDescription, anAnchorName) {
		var newItem = new ValidateItem(aName, aDescription, true, ValidateItem.RADIO);
		newItem.anchorName = anAnchorName;
		return newItem;
	}
	function newNotSpecificValueValidateItem(aName, aDescription, aSpecificValue, aFailureDescription) {
		var newItem = new ValidateItem(aName, aDescription, true, ValidateItem.NOTSPECIFICVALUE);
		newItem.extra2 = aSpecificValue;
		newItem.failureDescription = aFailureDescription;
		return newItem;
	}	
	function newConditionalValidateItem(aName, aDescription, conditionItemName) {
		var newItem = new ValidateItem(aName, aDescription, true, ValidateItem.BASICVALUE);
		newItem.conditionalType = ValidateItem.CONDITIONS.EXTRA_IS_CHECKED;
		newItem.extra = conditionItemName;
		return newItem;
	}
	function newConditionalHasValueValidateItem(aName, aDescription, conditionItemName) {
		var newItem = new ValidateItem(aName, aDescription, true, ValidateItem.BASICVALUE);
		newItem.conditionalType = ValidateItem.CONDITIONS.EXTRA_HAS_VALUE;
		newItem.extra = conditionItemName;
		return newItem;
	}
	function newConditionalNumberValidateItem(aName, aDescription, conditionItemName) {
		var newItem = new ValidateItem(aName, aDescription, true, ValidateItem.NUMBER);
		newItem.conditionalType = ValidateItem.CONDITIONS.EXTRA_IS_CHECKED;
		newItem.extra = conditionItemName;
		return newItem;
	}
	function newConditionalIntegerValidateItem(aName, aDescription, conditionItemName) {
		var newItem = new ValidateItem(aName, aDescription, true, ValidateItem.INTEGER);
		newItem.conditionalType = ValidateItem.CONDITIONS.EXTRA_IS_CHECKED;
		newItem.extra = conditionItemName;
		return newItem;
	}
	function newConditionalPositiveIntegerValidateItem(aName, aDescription, conditionItemName) {
		var newItem = new ValidateItem(aName, aDescription, true, ValidateItem.POSITIVEINTEGER);
		newItem.conditionalType = ValidateItem.CONDITIONS.EXTRA_IS_CHECKED;
		newItem.extra = conditionItemName;
		return newItem;
	}
	function newSpecificConditionalValidateItem(aName, aDescription, conditionItemName,conditionItemValue) {
		var newItem = new ValidateItem(aName, aDescription, true, ValidateItem.BASICVALUE);
		newItem.conditionalType = ValidateItem.CONDITIONS.EXTRA_IS_EXTRA2;
		newItem.extra = conditionItemName;
		newItem.extra2 = conditionItemValue;		
		return newItem;
	}
	function newSpecificConditionalNumberValidateItem(aName, aDescription, conditionItemName,conditionItemValue) {
		var newItem = new ValidateItem(aName, aDescription, true, ValidateItem.NUMBER);
		newItem.conditionalType = ValidateItem.CONDITIONS.EXTRA_IS_EXTRA2;
		newItem.extra = conditionItemName;
		newItem.extra2 = conditionItemValue;		
		return newItem;
	}	
	function newSpecificConditionalIntegerValidateItem(aName, aDescription, conditionItemName,conditionItemValue) {
		var newItem = new ValidateItem(aName, aDescription, true, ValidateItem.INTEGER);
		newItem.conditionalType = ValidateItem.CONDITIONS.EXTRA_IS_EXTRA2;
		newItem.extra = conditionItemName;
		newItem.extra2 = conditionItemValue;		
		return newItem;
	}
	function newSpecificConditionalPositiveIntegerValidateItem(aName, aDescription, conditionItemName,conditionItemValue) {
		var newItem = new ValidateItem(aName, aDescription, true, ValidateItem.POSITIVEINTEGER);
		newItem.conditionalType = ValidateItem.CONDITIONS.EXTRA_IS_EXTRA2;
		newItem.extra = conditionItemName;
		newItem.extra2 = conditionItemValue;		
		return newItem;
	}	
	function newValidateItem(aName, aDescription, extraParam) {
		return new ValidateItem(aName, aDescription, true, ValidateItem.BASICVALUE);
	}
	function newPasswordValidateItem(aName, field2Name) {
		var newItem = new ValidateItem(aName, "", true, ValidateItem.PASSWORDMATCH);
		newItem.extra = field2Name;
		return newItem;
	}
	function newOptionalPasswordValidateItem(aName, field2Name) {
		var newItem = new ValidateItem(aName, "", false, ValidateItem.PASSWORDMATCH);
		newItem.extra = field2Name;
		return newItem;
	}
	function newORValidateItem(aName, aDescription, field2Name) {
		var newItem = new ValidateItem(aName, aDescription, true, ValidateItem.VALUEOREXTRA);
		newItem.extra = field2Name;
		return newItem;
	}
	function newCheckBoxesValidateItem(aNamePrefix, aDescription, checkBoxIdArray) {
		var newItem = new ValidateItem(aNamePrefix, aDescription, true, ValidateItem.CHECKBOXES);
		newItem.extra = checkBoxIdArray;
		return newItem;
	}
	/*	
    * Custom complex validate item.  This item can be used as a base object to do complex validation.  
	* Redefine the isValid() function to perform what you need.
	*/
	function ComplexValidateItem(aName) {
		this.name = aName;
		this.reason = "";
		
		//public object functions (required by validator)
		this.isValid = ComplexValidateItem_isValid;
		this.getReason = ComplexValidateItem_getReason;
		this.isRadioType = ComplexValidateItem_isRadioType;
		this.getName = ComplexValidateItem_getName;		
	}
	function ComplexValidateItem_getName() {
		return this.name;
	}
	function ComplexValidateItem_isRadioType() {
		return false;
	}
	function ComplexValidateItem_getReason() {
		return this.reason;
	}
	function ComplexValidateItem_isValid() {
		//redefine this function to validate, 
		//return true if valid.
		//return false if not valid and set reason to a description why.
		return true;
	}