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


/* ******************************** REVISIONS *************************************
040307 - Phred White - If your page contains a div or td with an id of "formerrors", it will:
			1. display errors in the div otherwise they will display in an alert.
			2. color the erroneous form fields red with white text
050807 - Phred White - fixed bugs that caused JS errors when used with radio buttons, and
         form Option selectors
101107 - Phred White - changed error text from white to black for better readability
112807 - Phred White - eliminate "no errors submitting" message becaseu it was confusing
20081010 - Phred White - changed for each loops into for loops to eliminate bug
20090205 - Phred White - added removeItem() to allow optional checks to be removed
*********************************************************************************** */


 /*
 
	* 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
	*/	
/* ************************************* USAGE ******************************************
Insert this code in the head of your page to attach the object and support code:

<script src="scripts/utilities.js"></script>
<script src="scripts/validate.js"></script>

Insert this javascript to do the following:
<script language="JavaScript" type="text/JavaScript">
//Create instance of the validator
	var validator = new Validator();

	//Handle enter keys 
	function checkEnter(event) {
		if (isEnterEvent(event)) {
			submitClicked(document.update_profile);
		}
	}
	//Invoke validator before submit. If no errors, form is submitted
	function submitClicked(formObj) {
		if (validator.isValid()) {
			formObj.submit();
		}
	}

</script>

Insert this javascript to specify fields to check and type of checking:
(First term is the form item id, the second is the name to show in the warnings)

<script language="JavaScript">
	validator.addItem(newEmailValidateItem('email','Email'));
	validator.addItem(newValidateItem('address1','address1'));
	validator.addItem(newValidateItem('city','City'));
	validator.addItem(newValidateItem('state','State'));
	validator.addItem(newNumberValidateItem('zipcode','Zip Code'));
	validator.addItem(newPhoneValidateItem('worknumber','Phone'));
	validator.addItem(newValidateItem('username','User Name'));
</script>

Notice that some fields have specific checks, e.g. newEmailValidateItem that check existence 
as well as format.
"newValidateItem" is a simple check that the field isn't empty

This will show the errors in a javascript alert, and send focus to the first error item.

If you want to display errors in the page and highlight all error items then
insert this HTML wherever you eant the errors to appear (the comment isn't necessary):

<!-- Div for inserting form errors from validate.js -->
<div id="formerrors"  style="color: red;"></div>


************************************************************************************* */




	function Validator() {
		//object properties
		this.validateItems = new Array();
		
		//object functions
		this.isValid = Validator_isValid;
		this.addItem = Validator_addItem;
		this.removeItem = Validator_removeItem;
	}
	function Validator_isValid() {
		//If your page contains a div or td with and id of "formerrors", errors will display there
		//otherwise they will display in an alert.
		var items = this.validateItems;
		var errorItems = new Array(); //ph
		var userMessages = "";
		var inPageUserMessages = ""; //ph
		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";
				inPageUserMessages += "" + errorCount + ": " + anItem.getReason() + "<br>\n"; //ph
				errorItems.push(anItem);
				//alert("errorItems.length: "+errorItems.length);
				//alert(userMessages);
				if (focusItem == null) {
					focusItem = anItem;
				}
			}
		}
		if (errorCount > 0) {
			var displayMsg = "Your form has errors. Please correct the following ";
			var inPageDisplayMsg = "Your form has errors. Please correct the following "; //ph
			if (errorCount == 1) {
				displayMsg += "item";
				inPageDisplayMsg += "item";
			} else {
				displayMsg += "" + errorCount + " items";			
				inPageDisplayMsg += "" + errorCount + " items";			
			}
			displayMsg += ":\n\n" + userMessages+ "\n\n";			
			inPageDisplayMsg += ":<br><br>\n\n" + inPageUserMessages+ "<br><br>\n\n";			//ph
			
			if (document.getElementById('formerrors')) { //ph
				document.getElementById('formerrors').innerHTML = inPageDisplayMsg;
						//alert("items: "+items);
			//	for (var word in items) {
				for (var wd=0;wd< items.length;wd++) {
					if (items[wd].type!="RadioButtons") {
						//alert("not radiobuttons word: "+wd);
						//alert("items["+wd+"].getName(): "+items[wd].getName()+" getReason(): "+items[wd].getReason()+" items.length: "+items.length);
						document.getElementById(items[wd].getName()).style.background = "#ffffff";
						document.getElementById(items[wd].getName()).style.color      = "#000000";
					}
				}
				for (var wd=0;wd< errorItems.length;wd++) {
//				for (var word in errorItems) {
					//alert("errorItems - "+wd+": "+errorItems[wd]);
					if (errorItems[wd].type!="RadioButtons") {
						document.getElementById(errorItems[wd].getName()).style.background = "#EBA2A0";
						document.getElementById(errorItems[wd].getName()).style.color      = "#000000";
					}
				}
			} else {
				alert(displayMsg);
			}
			if (focusItem.isRadioType()) {
				document.location.hash=focusItem.anchorName;
			} else {	
				focusOn(focusItem.getName());
			}
			
			return false;
		} else {
			if (document.getElementById('formerrors')) { //ph
				document.getElementById('formerrors').innerHTML = "<br>Form submitted. Please wait...<br><br>"; // no errors message
			//	for (var word in items) {
				for (var wd=0;wd< items.length;wd++) {
					if (items[wd].type!="RadioButtons") {
						document.getElementById(items[wd].getName()).style.background = "#ffffff"; //ph
						document.getElementById(items[wd].getName()).style.color      = "#000000";
					}
			}
			}
			return true;
		}
	}
	function Validator_addItem(aValidateItem) {
		this.validateItems[this.validateItems.length] = aValidateItem;
	}

	function Validator_removeItem(itemName) {
		for (var idx=0;idx<this.validateItems.length;idx++) {
			if (this.validateItems[idx].name == itemName) {
				document.getElementById(itemName).style.background = "#ffffff";
				document.getElementById(itemName).style.color      = "#000000";
				this.validateItems.splice(idx,1);
				return idx;
			}
		}
		return -1;
	}

	/*	
    * 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.DATETIME - validate value is a date and time 
	*   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) {
	//alert("ValidateItem -aName: "+aName);
		//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.isValidDateTime = ValidateItem_isValidDateTime;
		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.DATETIME = "DateTime";
	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.DATETIME : return this.isValidDateTime(); 
			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 valid 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_isValidDateTime() {
		var formItem = getFormItem(this.name);
		var hasVal = itemHasValue(formItem);
		if (hasVal) {
			var value = formItem.value;
			if (value.length < 22 || value.charAt(2) != '/' || value.charAt(5) != '/' || value.charAt(10) != ' '|| value.charAt(13) != ':' || value.charAt(16) != ':'||value.charAt(19) != ' ' ) {
				this.reason = "" + this.description + " is not a valid date format (MM/DD/YYYY HH:MM:SS AM)";
				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 newDateTimeValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, true, ValidateItem.DATETIME);
	}
	function newOptionalDateTimeValidateItem(aName, aDescription) {
		return new ValidateItem(aName, aDescription, false, ValidateItem.DATETIME);
	}
	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;
	}
	// ****************Non-object functions added from utilities.js **********************
		function getFormItem(formItemName) {
		return findAnyObject(formItemName);
	}
		function findAnyObject(objectName) {
		return MM_findObj(objectName);	
	}
	function itemHasValue(formItemObject) {
		if (formItemObject == null || !stringHasValue(formItemObject.value)) {
			return false;
		}
		return true;
	}
	function stringHasValue(valueString) {
		if (valueString == null || stringTrim(valueString) == "") {
			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 getSelectedRadioValue(formItem) {
		if (formItem == null || formItem.length == 0) {
				return "";
		}
		for (var i = 0; i < formItem.length; i++) {
			var currentItem = formItem[i];
			if (currentItem.checked) {
				return currentItem.value;
			}
		}
		return null;
	}
	function itemIsChecked(formItemObject) {
		if (formItemObject == null || formItemObject.checked == null) {
				return false;
		} else {
				return formItemObject.checked;
		}
	}
	function focusOn(formObjectName) {
		var formItem = getFormItem(formObjectName);
		if (formItem != null) {
			formItem.focus();
			if (!formItem.type.indexOf("SELECT")) {
				formItem.select();
			}
		}
	}
function MM_findObj(n, d) { //v4.01
  		var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
	    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
		if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
		for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
		if(!x && d.getElementById) x=d.getElementById(n); return x;
	}

