//Functions:
//validateControls(formName)
//showStatus(msg)
//clearStatus()
//checkPhoneNumber(phoneNumberControl,iSize,isRequired)
//checkPhoneAreaCode(phoneAreaCodeControl,iSize,isRequired)
//checkPhonePrefix(phonePrefixControl,iSize,isRequired)
//checkPhoneSuffix(phoneSuffixControl,iSize,isRequired)
//checkPhoneGroup(phoneGroupControl,iSize,isRequired)
//checkHPSerialNbr(serialNbrControl,iSize,isRequired)
//checkZipCode(zipCodeControl,iSize,isRequired)
//checkZipCodeCanadaPostalCode(zipCodeControl,iSize,isRequired)
//checkInteger(integerControl,iSize,isRequired)
//checkVarchar(varcharControl,iSize,isRequired)
//checkVarcharRange(varcharControl,iMinSize,iMaxSize,isRequired)
//checkDropdown(dropdownControl,iSize,isRequired)
//checkAge(ageControl,ageBegin,ageEnd,iSize, isRequired)
//checkDateRange(dateRangeControl,dateBegin,dateEnd,iSize, isRequired)
//checkMonth(monthControl,iSize,isRequired)
//checkDatePart(datePartControl,iSize,isRequired)
//checkYear(yearControl,iSize,isRequired)
//checkDateGroup(dateGroupControl,iSize,isRequired)
//checkDate(dateControl,iSize,isRequired)
//checkEmailAddress(emailAddressControl,iSize,isRequired)
//checkAddress1(address1Control,iSize,isRequired)
//checkBrowser()
//openWindow(windowURL, windowName, windowFeatures)

//******************************************************************************
// Purpose:     Validate Form Controls.
// Assumptions:
// Effects:
// Inputs:      Form object
//					YAW_Data_orderofcontrolonpage_field_datatype_size_bitmapflags_editcheck
//					0	1		2					3		4		5		6		7
//					Bitmap flags (1 or 0):
//						1st digit = isrequired
//						2nd digit = isencrypted
//              Format of other Form Control ID's - YAW_NoData_name
// Returns:		False if validation rules are not met.
// Written by:  Greg Sell   JUN 12, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Add DataRange,Age,PhoneAreaCode,
//	 PhonePrefix, PhoneSuffix, 
//	 VarcharStripcrlf, HPSerialNbr          Sen Zhao         September 14, 2000
//******************************************************************************
function validateControls(formName) {
  for (var index = 0; index < formName.elements.length; index++) {
    // If the control is not "hidden"
    if (formName.elements[index].type != "hidden") {
      // If control name starts with "YAW"
      if (formName.elements[index].name.slice(0,3) == "YAW") {
	    var name = formName.elements[index].name.split("_")
	    // If second piece is "DATA"
	    if (name[1].toUpperCase() == "DATA") {
	      // If control data is not encrypted continue with edit check
	      // (encrypted data is validated on server-side only)
	      if (name[6].charAt(1) == "0") {
	        var pattern=/\|/g;
					var fieldName=name[3].replace(pattern," ");
					switch (name[7].toUpperCase()) {
			   case "PHONENUMBER" :
				  if (!checkPhoneNumber(formName.elements[index],name[5],name[6].charAt(0))) {
				     alert("Please enter a valid telephone number in the correct format.");
				     showStatus("Please enter a valid telephone number in the correct format.");
				     formName.elements[index].focus();
				     return false;
				   }
				  break;
				  
				case "PHONEAREACODE" :
				  if (!checkPhoneAreaCode(formName.elements[index],name[5],name[6].charAt(0))) {
				     alert("Please enter your " + name[5] + " digit area code.");
				     showStatus("Please enter your " + name[5] + " digit area code.");
				     formName.elements[index].focus();
				     return false;
				   }
				  break;
				  
				case "PHONEPREFIX" :
				  if (!checkPhonePrefix(formName.elements[index],name[5],name[6].charAt(0))) {
				     alert("Please enter your " + name[5] + " digit phone number prefix.");
				     showStatus("Please enter your " + name[5] + " digit phone number prefix.");
				     formName.elements[index].focus();
				     return false;
				   }
				  break;
				
				case "PHONEGROUP" :
				  if (!checkPhoneGroup(formName.elements[index],name[5],name[6].charAt(0))) {
				     return false;
				   } 
				  break;
	
				case "PHONESUFFIX" :
				  if (!checkPhoneSuffix(formName.elements[index],name[5],name[6].charAt(0))) {
				     alert("Please enter your " + name[5] + " digit phone number suffix.");
				     showStatus("Please enter your " + name[5] + " digit phone number suffix.");
				     formName.elements[index].focus();
				     return false;
				   }
				  break;
				
				case "HPSERIALNBR" :
				  if (!checkHPSerialNbr(formName.elements[index],name[5],name[6].charAt(0))) {
				     alert("Please enter a valid serial number.");
				     showStatus("Please enter a valid serial number.");
				     formName.elements[index].focus();
				     return false;
				   }
				  break;
				
			    case "ZIPCODE" :
			      if (!checkZipCode(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please enter a valid 5 digit zip code");
				      showStatus("Please enter a valid zip code");
				      formName.elements[index].focus();
				      return false;
			      }
			      break;
			      
			     case "ZIPCODECANADAPOSTALCODE" :
			     //replaced name[5] with 5 for US and 6 for Canada
			      if (!checkZipCode(formName.elements[index],5,name[6].charAt(0))) {
							if (!checkZipCodeCanadaPostalCode(formName.elements[index],6,name[6].charAt(0))) {
								alert("Please enter a valid zip code or postal code");
								showStatus("Please enter a valid zip code or postal code");
								formName.elements[index].focus();
								return false;
				      }
			      }
			      break;
			      
			    case "INTEGER" :
			      if (!checkInteger(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please enter a valid " + fieldName + " no longer than " + name[5] + " digits.");
				      showStatus("Please enter a valid " + fieldName + " no longer than " + name[5] + " digits.");
				      formName.elements[index].focus();
				      return false;
			      }
			      break;
			      

			    case "DECIMAL" :
			      if (!checkDecimal(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please enter a valid " + fieldName + " no longer than " + name[5] + " digits.");
				      showStatus("Please enter a valid " + fieldName + " no longer than " + name[5] + " digits.");
				      formName.elements[index].focus();
				      return false;
			      }
			      break;

			    case "DROPDOWN" :
			      if (!checkDropdown(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please select a value for " + fieldName);
				      showStatus("Please select a value for " + fieldName);
				      formName.elements[index].focus();
				      return false;
			      }
			      break;
			      
			    case "VARCHAR" :
			      if (!checkVarchar(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please enter a valid " + fieldName + " no longer than " + name[5] + " characters");
				      showStatus("Please enter a valid " + fieldName + " no longer than " + name[5] + " characters");
				      formName.elements[index].focus();
				      return false;
			      }
			      break;
			      
			    case "DATE" :
			      if (!checkDate(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please enter a valid " + fieldName + ".");
				      showStatus("Please enter a valid " + fieldName + ".");
				      formName.elements[index].focus();
				      return false;
			      }
			      break;
			    
			    case "DATEGROUP" :
			      if (!checkDateGroup(formName.elements[index],name[5],name[6].charAt(0))) {
				      return false;
			      }
			      break;
			    
			    case "MONTH" :
			      if (!checkMonth(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please enter a valid " + fieldName + ".");
				      showStatus("Please enter a valid " + fieldName + ".");
				      formName.elements[index].focus();
				      return false;
			      }
			      break;
			     
			    case "YEAR" :
			      if (!checkYear(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please enter a valid 4-digit " + fieldName + ".");
				      showStatus("Please enter a valid " + fieldName + ".");
				      formName.elements[index].focus();
				      return false;
			      }
			      break;
			      
			    case "DATEPART" :
			      if (!checkDatePart(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please enter a valid date.");
				      showStatus("Please enter a valid date.");
				      formName.elements[index].focus();
				      return false;
			      }
			      break;
			    
			      
			    case "EMAIL" :
			      if (!checkEmailAddress(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please enter a valid email address in the format a@b.c, no longer than " + name[5] + " characters");
				      showStatus("Please enter a valid email address in the format a@b.c, no longer than " + name[5]);
				      formName.elements[index].focus();
				      return false;
			      }
			      break;
			      
			    case "ADDRESS1" :
			      if (!checkAddress1(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please enter your address in the format '123 Anywhere' where your street number comes first, no longer than " + name[5] + " characters");
				      showStatus("Please enter your address in the format '123 Anywhere' where your street number comes first, no longer than " + name[5] + " characters");
				      formName.elements[index].focus();
				      return false;
			      }
			      break;
			      
			    case "CHECKBOX" :
			       if (!checkCheckBox(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please select " + fieldName + ".");
				      showStatus("Please select " + fieldName + ".");
				      formName.elements[index].focus();
				      return false;
			      }
			      break;
			      
			    case "RADIOBUTTON" :
			     if (!checkRadioButton(formName.elements[index],name[5],name[6].charAt(0))) {
				      alert("Please select " + fieldName + ".");
				      showStatus("Please select " + fieldName + ".");
				      formName.elements[index].focus();
				      return false;
			      }
			      break;
			      
			    default :
			       var dataType = name[7].slice(0,12);
			       if (dataType.toUpperCase() == "VARCHARRANGE") {
							var Min =name[7].slice(12,15) * 1 ;
							var Max =name[7].slice(15,18) * 1 ;
							if (!checkVarcharRange(formName.elements[index],Min,Max,name[6].charAt(0))){
							  alert("Please enter a valid " + fieldName + " between " + Min + " and " + Max + " characters.");
							  showStatus("Please enter a valid " + fieldName + " between " + Min + " and " + Max + " characters.");
							  formName.elements[index].focus();
							  return false;
							 }
							}
							else {
								dataType=name[7].slice(0,9);
								if (dataType.toUpperCase() == "DATERANGE") { 
								  var BegDate=name[7].slice(9,11) + "/" + name[7].slice(11,13) + "/" + name[7].slice(13,17);
								  var EndDate=name[7].slice(17,19) + "/" + name[7].slice(19,21) + "/" + name[7].slice(21,25);
								  if (!checkDateRange(formName.elements[index],BegDate,EndDate,name[5],name[6].charAt(0))) {
										alert("Please enter a valid date between " + BegDate + " and " + EndDate + ".");
										showStatus("Please enter a valid date between " +  BegDate + " and " + EndDate + ".");
										formName.elements[index].focus();
										return false;
									}
								}
								else {
									dataType=name[7].slice(0,3);
									if (dataType.toUpperCase() == "AGE") {
										var BegAge =name[7].slice(3,6) * 1 ;
										var EndAge =name[7].slice(6,9) * 1 ;
										if (!checkAge(formName.elements[index],BegAge,EndAge,name[5],name[6].charAt(0))){
										  alert("Please enter a valid age.");
										  showStatus("You must be at least " + BegAge + " years of age to enter.");
										  formName.elements[index].focus();
										  return false;
										}
									}
									else {
										if (!checkVarchar(formName.elements[index],name[5],name[6].charAt(0))) {
											alert("Please enter a value no longer than " + name[5]);
											showStatus("Please enter a value no longer than " + name[5]);
											formName.elements[index].focus();
											return false;
										}
									}
								}
							}
						}
					}	
				}
			}
		}
	}
  return true;
}

//******************************************************************************
// Purpose:     Show the Long Description on the window status bar.
// Assumptions:
// Effects:
// Inputs:      msg - string to be displayed in the status bar.
// Returns:		True if a msg exists
// Written by:  Dallas Glidewell - TKI Consulting   JUN 7, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function showStatus(msg) {
  if (msg.length < 1 || msg.value == 0)
    return;
  var sepPos = msg.indexOf("|");
  var longDesc = msg.substring(sepPos + 1);
  window.status = longDesc;
  return;
}

//******************************************************************************
// Purpose:     Clear the window.status area.
// Assumptions:
// Effects:
// Inputs:      
// Returns:		True
// Written by:  Dallas Glidewell - TKI Consulting   JUN 7, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function clearStatus() {
  // Added the check of the toElement because version 4.x, 5 and 5.5
  // all have a Bug: Onmouseout Fires for SELECT When Cursor Still in
  // Bounds.  The check of the toElement was Microsoft's workaround.
  if (window.event.toElement != null)
    window.status='';
}

//******************************************************************************
// Purpose:     Check for valid phone number.
// Assumptions:
// Effects:
// Inputs:      Phone Number form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad phone number.  Otherwise true.
// Written by:  Greg Sell   JUN 1, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkPhoneNumber(phoneNumberControl,iSize,isRequired) {
  var phoneNumberValue = phoneNumberControl.value;
  var vChar = "";
  var vDelims = "()-. ";
  var vTemp = "";

  if (phoneNumberValue != "") {
    if (isNaN(phoneNumberValue)) {
	  for (iIndex = 0; iIndex < phoneNumberValue.length; iIndex++) {   
        // Check that current character isn't whitespace.
        var vChar = phoneNumberValue.charAt(iIndex);
        if (vDelims.indexOf(vChar) == -1) vTemp += vChar;
      }
	  phoneNumberValue = vTemp;
      if (isNaN(phoneNumberValue)) {
		return false;
	  }
	  else if ((phoneNumberValue.length < 10) || (phoneNumberValue.length > iSize)) {
		return false;
      }
    }
    else {
      if ((phoneNumberValue.length < 10) || (phoneNumberValue.length > iSize)) {
        return false;
      }
    }
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  return true;
}

//******************************************************************************
// Purpose:     Check for valid phone area code.
// Assumptions: 
// Effects:
// Inputs:      Phone Area Code form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad phone area code.  Otherwise true.
// Written by:  Sen Zhao   September 14, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkPhoneAreaCode(phoneAreaCodeControl,iSize,isRequired) {
  var phoneAreaCodeValue = phoneAreaCodeControl.value;
  if (phoneAreaCodeValue != "") {
    if (!isNaN(phoneAreaCodeValue)) {
      if ((phoneAreaCodeValue.length < 3) || (phoneAreaCodeValue.length > iSize)) {
		return false;
      } 
    }
    else {
        return false;
    }
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  
  return true;
}

//******************************************************************************
// Purpose:     Check for valid phone prefix.
// Assumptions: 
// Effects:
// Inputs:      Phone Prefix form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad phone prfix.  Otherwise true.
// Written by:  Sen Zhao   September 14, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkPhonePrefix(phonePrefixControl,iSize,isRequired) {
  var phonePrefixValue = phonePrefixControl.value;
  if ( phonePrefixValue != "") {
    if (!isNaN(phonePrefixValue)) {
      if ((phonePrefixValue.length < 3) || (phonePrefixValue.length > iSize)) {
		return false;
      } 
    }
    else {
        return false;
    }
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  
  return true;
}

//******************************************************************************
// Purpose:     Check for valid phone suffix.
// Assumptions: 
// Effects:
// Inputs:      Phone Suffix form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad phone suffix.  Otherwise true.
// Written by:  Sen Zhao   September 14, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkPhoneSuffix(phoneSuffixControl,iSize,isRequired) {
  var phoneSuffixValue = phoneSuffixControl.value;
  if ( phoneSuffixValue != "") {
    if (!isNaN(phoneSuffixValue)) {
      if ((phoneSuffixValue.length < 4) || (phoneSuffixValue.length > iSize)) {
		return false;
      } 
    }
    else {
        return false;
    }
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  
  return true;
}

//******************************************************************************
// Purpose:     Check for valid phone group.
// Assumptions: 
// Effects:
// Inputs:      Phone group form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad phone group.  Otherwise true.
// Written by:  Sen Zhao   September 14, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkPhoneGroup(phoneGroupControl,iSize,isRequired) {
  var phoneGroupValue=phoneGroupControl.value;
  var phoneParts=phoneGroupValue.split("-");
  var vAreaCode=phoneParts[0];
  var vPrefix =phoneParts[1];
  var vSuffix=phoneParts[2];


  if (isRequired!=1) {
	if ( vAreaCode!="") {
	  if (vAreaCode.length != 3){
		 alert("Please enter a valid 3 digit phone area code. 1");
		 showStatus("Please enter a valid 3 digit phone area code.");
		 return false;
	  }
	  if (vPrefix!="") {
		if (vPrefix.length != 3) {
		   alert("Please enter a valid 3 digit phone prefix.");
		   showStatus("Please enter a valid 3 digit phone prefix.");
		   return false;
		 }
		if (vSuffix!="") {
		   if (vSuffix.length !=4) {
		      alert("Please enter a valid 4 digit phone suffix.");
		      showStatus("Please enter a valid 4 digit phone suffix.");
		      return false;
		   }
		}
		else {
		  alert("Please enter a valid 4 digit phone suffix.");
		  showStatus("Please enter a valid 4 digit phone suffix.");
		  return false;
		}
	  }
	  else {
	     alert("Please enter a valid 3 digit phone prefix.");
	     showStatus("Please enter a valid 3 digit phone prefix.");
	     return false;
	  }
	}
	else {
	  if ((vPrefix!="")||(vSuffix !="")) {
	     alert("Please enter a valid 3 digit phone area code.");
	     showStatus("Please enter a valid 3 digit phone area code.");
	     return false;
	  }
	}
  }
  else {
	  if (vAreaCode.length != 3) {
		 alert("Please enter a valid 3 digit phone area code.");
		 showStatus("Please enter a valid 3 digit phone area code.");
		 return false;
	  }
      if (vPrefix.length !=3) {
	     alert("Please enter a valid 3 digit phone prefix. ");
	     showStatus("Please enter a valid 3 digit prefix.");
	     return false;
	  }
	  if (vSuffix.length !=4) {
	     alert("Please enter a valid 3 digit phone suffix.");
	     showStatus("Please enter a valid 4 digit phone suffix.");
	     return false;
	  }
 }
  
  
  return true;
}

function checkCheckBox ( checkBoxControl, iSize, isRequired) {
  var checkBoxValue= checkBoxControl.value;
  if (checkBoxValue == ""){
	if (isRequired == 1) {
		return false
	}
 }
 return true;
}


function checkRadioButton (radioButtonControl, iSize, isRequired) {
  var radioButtonValue = radioButtonControl.value;
  if (radioButtonValue == ""){
	if (isRequired == 1) {
		return false
	}
 }
 return true;
}


//******************************************************************************
// Purpose:     Check for SerialNbr.
// Assumptions: 
// Effects:
// Inputs:      Varchar SerialNbr form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad serial number.  Otherwise true.
// Written by:  Sen Zhao   September 14, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkHPSerialNbr(serialNbrControl,iSize,isRequired) {
   var serialNbrValue = serialNbrControl.value;
   if (serialNbrValue !="") {
	var serialchar="";
	var charcode="";
	var index="";
	if (serialNbrValue.length == 10) {
	serialchar = serialNbrValue.substring(0,2);
	charcode = serialNbrValue.toUpperCase().charCodeAt(0);
	if ((charcode >= 65) && (charcode <= 90)) {
	  charcode = serialchar.toUpperCase().charCodeAt(1);
	  if ((charcode >= 65) && (charcode <= 90)) {
		serialchar = serialNbrValue.substring(2,10);
	    for (var index = 0; index < 8; index++) {
	      charcode = serialchar.toUpperCase().charCodeAt(index);
	      if (((charcode >= 48) && (charcode <= 57)) || ((charcode >= 65) && (charcode <= 90)) || ((charcode >= 97) && (charcode <=122))){
          }
	      else {
	        return false;
	      }
	    }
	    return true;
	  }
	  else {
	    return false;
	  }
	}
	else {
	  return false;
	}
  }
  else {
      return false;
  }
  }
  else {
      if (isRequired == 1) {
      return false;
    }
 }
	
  return true;
} 

//******************************************************************************
// Purpose:     Check for valid zip code.
// Assumptions:
// Effects:
// Inputs:      ZipCode form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad zip code.  Otherwise true.
// Written by:  Greg Sell   JUN 1, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
// Add check for decimal				Dan Wilcox			Mar 25, 2002
//******************************************************************************
function checkZipCode(zipCodeControl,iSize,isRequired) {
  var zipCodeValue = zipCodeControl.value;
  if (zipCodeValue != "") {
    if (zipCodeValue.indexOf(".") == -1) {
      if (!isNaN(zipCodeValue)) {
        if ((zipCodeValue.length < 5) || (zipCodeValue.length > iSize)) {
		  return false;
	    }
      }
      else {
        return false;
      }
    }
    else {
      return false;
    }
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  return true;
}

//******************************************************************************
// Purpose:     Check for valid Canadian postal codes.
// Assumptions:
// Effects:
// Inputs:      ZipCodeCanadaPostalCode form control variable: 
//									[Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad postal code.  Otherwise true.
// Written by:  Jessica Hagg   July 3, 2001
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkZipCodeCanadaPostalCode(zipCodeControl,iSize,isRequired) {
	var zipCodeValue = zipCodeControl.value;
	zipCodeValue = zipCodeValue.replace(" ", "");
	zipCodeValue = zipCodeValue.replace("-", "");
  var pattern = /[A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|X|Y](\d{1})[A-Z](\d{1})[A-Z](\d{1})$/i;
  /* String validation uses "javascript regular expressions" in a variable named pattern
		i = case insensitive
		\W? = for optional non letter character
		(\d{1}) = number length 1
		| = or
		[A-Z] = any letter a - z
	Postal Code starting letter Province requirements
	//A - New Foundland
	//B - Nova Scotia
	//C - Prince Albert Island
	//E - New Brunswick
	//G, H, J - Quebec
	//K, L, M, N, P - Ontario
	//R - Manitoba
	//S - Saskatchewan
	//T - Alberta
	//V - British Columbia
	//X - Northwest Territories
	//Y - Yukon Territory */
  if (zipCodeValue != "") {
    if (zipCodeValue.search(pattern) != -1) {
      if ((zipCodeValue.length < 6) || (zipCodeValue.length > iSize)) {
				return false;
			}
    }
    else {
      return false;
    }
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  return true;
}

//******************************************************************************
// Purpose:     Check for valid integer.
// Assumptions:
// Effects:
// Inputs:      Integer form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad integer.  Otherwise true.
// Written by:  Greg Sell   JUN 1, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
// Add check for decimal				Dan Wilcox			Mar 25, 2002
//******************************************************************************
function checkInteger(integerControl,iSize,isRequired) {
  var integerValue = integerControl.value;
  if (integerValue != "") {
    if (integerValue.indexOf(".") == -1) {
      if (!isNaN(integerValue)) {
        if (integerValue.length > iSize) {
	  	return false;
	    }
      }
      else {
        return false;
      }
    }
    else {
      return false;
    }
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  return true;
}


//******************************************************************************
// Purpose:     Check for valid decimal.
// Assumptions:
// Effects:
// Inputs:      Decimal form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad decimal number.  Otherwise true.
// Written by:  Dan Wilcox   MAR 25, 2002
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkDecimal(integerControl,iSize,isRequired) {
  var integerValue = integerControl.value;
  if (integerValue != "") {
    if (!isNaN(integerValue)) {
      if (integerValue.length > iSize) {
		return false;
	  }
    }
    else {
      return false;
    }
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  return true;
}


//******************************************************************************
// Purpose:     Check for valid varchar.
// Assumptions:
// Effects:
// Inputs:      Varchar form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad varchar.  Otherwise true.
// Written by:  Greg Sell   JUN 1, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkVarchar(varcharControl,iSize,isRequired) {
  //Get value of control
  var varcharValue = varcharControl.value;
  //Check for embedded carriage return/line feed characters
  var arrayChar = varcharValue.split(unescape("%0D") + unescape("%0A"));
  //If there are embedded carriage return/line feed characters, replace with a space
  var sTempChar = varcharValue;
  if (arrayChar.length > 1) {
	sTempChar = "";
	for (iIndex = 0; iIndex < arrayChar.length; iIndex++) {
	  sTempChar = sTempChar + arrayChar[iIndex] + " ";
    }
	//Remove trailing space added when combining after split
	sTempChar = sTempChar.substr(0, sTempChar.length - 1);
  }
  if (sTempChar != "") {
    if (sTempChar.length > iSize) {
	  return false;
	}
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  varcharControl.value = sTempChar;
  return true;
}

//******************************************************************************
// Purpose:     Check for valid varchar range.
// Assumptions:
// Effects:
// Inputs:      VarcharRange form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
//				(validation in form of VarcharRange015030 for range between 15 and 30)
// Returns:		False if bad varchar.  Otherwise true.
// Written by:  Jessica Hagg   Nov 13, 2001
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkVarcharRange(varcharControl,iMinSize,iMaxSize,isRequired) {
  //Get value of control
  var varcharValue = varcharControl.value;
  //Check for embedded carriage return/line feed characters
  var arrayChar = varcharValue.split(unescape("%0D") + unescape("%0A"));
  //If there are embedded carriage return/line feed characters, replace with a space
  var sTempChar = varcharValue;
  if (arrayChar.length > 1) {
	sTempChar = "";
	for (iIndex = 0; iIndex < arrayChar.length; iIndex++) {
	  sTempChar = sTempChar + arrayChar[iIndex] + " ";
    }
	//Remove trailing space added when combining after split
	sTempChar = sTempChar.substr(0, sTempChar.length - 1);
  }
  if (sTempChar != "") {
    if ((sTempChar.length < iMinSize) || (sTempChar.length > iMaxSize)) {
	  return false;
	}
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  varcharControl.value = sTempChar;
  return true;
}

//******************************************************************************
// Purpose:     Check for value in a dropdown combo box.
// Assumptions:
// Effects:
// Inputs:      Dropdown form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if required drop down combo box has not been selected.  Otherwise true.
// Written by:  Greg Sell   JUN 1, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkDropdown(dropdownControl,iSize,isRequired) {
  var dropdownValue = dropdownControl.value;
  if (dropdownValue != "") {
	return true;
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  return true;
}

//******************************************************************************
// Purpose:     Check for valid age.
// Assumptions: The min age is 000 and max age is 999
// Effects:
// Inputs:      Age form control variable: [Document Name].[Form Name].[Field Name]
//				ageBegin -- Begining range
//				ageEnd -- Ending range
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad date.  Otherwise true.
// Written by:  Sen Zhao   September 14, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkAge(ageControl,ageBegin,ageEnd,iSize, isRequired){
   var ageValue=ageControl.value;
   if (ageValue != "") {
    if (!isNaN(ageValue)) {
      if ((ageValue < ageBegin) || (ageValue > ageEnd) || (ageValue.length > iSize)) {
		return false;
	  }
    }
    else {
      return false;
    }
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  return true;
}




//******************************************************************************
// Purpose:     Check for valid date range.
// Assumptions: The year of the date must be entered with a four digit year.
// Effects:
// Inputs:      Date form control variable: [Document Name].[Form Name].[Field Name]
//				dateBegin -- Begining range
//				dateEnd -- Ending range
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad date.  Otherwise true.
// Written by:  Sen Zhao   September 14, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkDateRange(dateRangeControl,dateBegin,dateEnd,iSize, isRequired){
    var dateRangeValue=dateRangeControl.value;
	if (!checkDate(dateRangeControl,iSize,isRequired)) {
		return false;
	}
	
	if (dateRangeValue !=""){
		if ((Date.parse(dateRangeValue) < Date.parse(dateBegin)) || (Date.parse(dateRangeValue) > Date.parse(dateEnd))){
			return false;
	    }
	} 
	else {
		if (isRequired == 1) {
			return false;
		}
	}

	return true;
}

//******************************************************************************
// Purpose:     Check for valid month.
// Assumptions: 
// Effects:
// Inputs:      Date form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad month.  Otherwise true.
//
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//   disallowed 0 as monthValue          JeffPa              10/23/03
//******************************************************************************
function checkMonth(monthControl,iSize,isRequired) {
  var monthValue = monthControl.value;
  if (monthValue !=""){
    if (!isNaN(monthValue)){
	   if ((monthValue < 1) || (monthValue >12)){
		 return false;
	   }
	}
    else {
      return false;
    }
  }  
  else {
    if (isRequired == 1) {
	  return false;
	}
  }

  return true;
}
 
//******************************************************************************
// Purpose:     Check for valid datepart.
// Assumptions: 
// Effects:
// Inputs:      DatePart control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad datepart.  Otherwise true.
//
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//   disallowed 0 as datePartValue          JeffPa              10/23/03
//******************************************************************************
function checkDatePart(datePartControl,iSize,isRequired) {
  var datePartValue = datePartControl.value;
 
  if (datePartValue !=""){
    if (!isNaN(datePartValue)){
	   if (datePartValue < 1 || datePartValue >31){
		 return false;
	   }
	}
    else {
      return false;
    }
  }  
  else {
    if (isRequired == 1) {
	  return false;
	}
  }

  return true;
}

//******************************************************************************
// Purpose:     Check for valid year.
// Assumptions: 
// Effects:
// Inputs:      Year control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad Year.  Otherwise true.
//
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//   Made min lenght of yearValue=4      JeffPa              10/23/03
//******************************************************************************
function checkYear(yearControl,iSize,isRequired) {
  var yearValue = yearControl.value;
 
  if (yearValue !=""){
    if (!isNaN(yearValue)){
	   if (yearValue.length >iSize){
		 return false;
	   }
	   if (yearValue.length < 4){
	   return false;
	   }
	}
    else {
      return false;
    }
  }  
  else {
    if (isRequired == 1) {
	  return false;
	}
  }

  return true;
}

//******************************************************************************
// Purpose:     Check for valid dategroup.
// Assumptions: 
// Effects:
// Inputs:      Dategroup control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad datepart.  Otherwise true.
//
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkDateGroup(dateGroupControl,iSize,isRequired) {
  var dateGroupValue = dateGroupControl.value;
  var dateParts=dateGroupValue.split("/");
  var vMonth=dateParts[0];
  var vDate=dateParts[1];
  var vYear=dateParts[2];

  if (isRequired!=1) {
	if (vMonth!="") {
	  if ((vMonth >12) || (vMonth<0)) {
		 alert("Please enter a valid month.");
		 showStatus("Please enter a valid month.");
		 return false;
	  }
	  if (vDate!="") {
		if ((vDate >31) || (vDate<0)) {
		   alert("Please enter a valid date.");
		   showStatus("Please enter a valid date.");
		   return false;
		 }
		if (vYear!="") {
		   if (vYear.length !=4) {
		      alert("Please enter a valid year.");
		      showStatus("Please enter a valid year.");
		      return false;
		   }
		   else {
		     if (!checkDate(dateGroupControl,10,0)) {
		       alert ("Please enter a valid date.");
		       showStatus("Please enter a valid date");
		       return false;
		     }
		  }
		}
		else {
		  alert("Please enter a valid year.");
		  showStatus("Please enter a valid year.");
		  return false;
		}
	  }
	  else {
	     alert("Please enter a valid date.");
	     showStatus("Please enter a valid date.");
	     return false;
	  }
	}
	else {
	  if ((vDate !="") || (vYear !="")) {
	     alert("Please enter a valid month.");
	     showStatus("Please enter a valid month.");
	     return false;
	  }
	}
  }
   else {
	  if (!checkMonth(dateParts[0],2,1)) {
		 alert("Please enter a valid month.");
		 showStatus("Please enter a valid month.");
		 return false;
	  }
      if (!checkDatePart(dateParts[1],2,1)) {
	     alert("Please enter a valid date.");
	     showStatus("Please enter a valid date.");
	     return false;
	  }
	  if (!checkYear(dateParts[2],4,1)) {
	     alert("Please enter a valid year.");
	     showStatus("Please enter a valid year.");
	     return false;
	  }
 }
  return true;
}

//******************************************************************************
// Purpose:     Check for valid dates.
// Assumptions: The year of the date must be entered with a four digit year.
// Effects:
// Inputs:      Date form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad date.  Otherwise true.
// Written by:  Greg Sell   JUN 1, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkDate(dateControl,iSize,isRequired) {
  var dateValue = dateControl.value;
  
  var monthValue="";
  var dayValue="";
  var yearValue="";

  if (dateValue != "") {
	if (dateValue.length == 10) {
	  monthValue = dateValue.substring(0,2)	// Month
	  sep1 = dateValue.substring(2,3)			// '/' or '-'
      dayValue = dateValue.substring(3,5)		// Day
      sep2 = dateValue.substring(5,6)			// '/' or '-'
      yearValue = dateValue.substring(6,10)	// Year
    }
    else if (dateValue.length == 9) {
      if (dateValue.indexOf("/",1) == 2 || dateValue.indexOf("-",1) == 2) {
        monthValue = dateValue.substring(0,2)	// Month
        sep1 = dateValue.substring(2,3)		// '/' or '-'
        dayValue = dateValue.substring(3,4)	// Day
        dayValue = "0" + dayValue             // zero pad the day
        sep2 = dateValue.substring(4,5)		// '/' or '-'
        yearValue = dateValue.substring(5,9)	// Year
      }
      else {
        monthValue = dateValue.substring(0,1)	// Month
        monthValue = "0" + monthValue         // zero pad the day
        sep1 = dateValue.substring(1,2)		// '/' or '-'
        dayValue = dateValue.substring(2,4)	// Day
        sep2 = dateValue.substring(4,5)		// '/' or '-'
        yearValue = dateValue.substring(5,9)	// Year
      }
    }
    else if (dateValue.length == 8) {
      monthValue = dateValue.substring(0,1)	// Month
      monthValue = "0" + monthValue           // zero pad the month
      sep1 = dateValue.substring(1,2)			// '/' or '-'
      dayValue = dateValue.substring(2,3)		// Day
      dayValue = "0" + dayValue               // zero pad the day
      sep2 = dateValue.substring(3,4)			// '/' or '-'
      yearValue = dateValue.substring(4,8)	// Year
    }
    else
      return false;
    if (monthValue < 1 ||
        monthValue > 12)
      return false;
    if (sep1 != '/' && sep2 != '/' &&
        sep1 != '-' && sep2 != '-')
      return false;
    if (dayValue < 1 ||
        dayValue > 31)
      return false;
    if (yearValue <= 0)
      return false;
    if (monthValue == 4 ||
        monthValue == 6 ||
        monthValue == 9 ||
        monthValue == 11) {
      if (dayValue == 31)
        return false;
    }
    if (monthValue == 2) {
      var yearCheck = parseInt(yearValue/4)
      if (isNaN(yearCheck))
        return false;
      if (dayValue > 29)
        return false;
      if (dayValue == 29) {
        if ((yearValue/4) != parseInt(yearValue/4)) {
          return false;
        }
        else {
          if (((yearValue/100) == parseInt(yearValue/100)) && ((yearValue/400) != parseInt(yearValue/400))) {
            return false;
          }
        }
      }
    }
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  if (dateControl.value != "") { 
	dateControl.value = monthValue + "/" + dayValue + "/" + yearValue;
  }
  return true;
}
//******************************************************************************
// Purpose:     Check for valid email address.
// Assumptions:
// Effects:
// Inputs:      Email Address form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad email address.  Otherwise true.
// Written by:  Greg Sell   JUN 1, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
// Allow 4 char extensions		Dan Wilcox		Mar 25, 2002
//******************************************************************************
function checkEmailAddress(emailAddressControl,iSize,isRequired) {
  var emailAddressValue = emailAddressControl.value;
  var arrayAt = emailAddressValue.split("@");
  var arrayPeriod = emailAddressValue.split(".");
  var arrayUnderscore = emailAddressValue.split("_");
  if (emailAddressValue != "") {
	if (emailAddressValue.length > iSize) {
	  return false;
	}
	else {
	  //a@b.c should be the shortest an address could be
	  if (emailAddressValue.length < 5) {
		return false;
	  }
	  //Should have at least one "@"
	  else if (emailAddressValue.indexOf("@") == -1) {
	    return false;
	  }
	  //Should have at least one "."
	  else if (emailAddressValue.indexOf(".") == -1) {
	    return false;
	  }
	  //Should have no more than 4 chars after last "."
	  else if (arrayPeriod[arrayPeriod.length - 1].length > 4) {
	    return false;
	  }
	  //Should have no "_" after the "@"
	  else if (arrayAt[arrayAt.length - 1].indexOf("_") != -1) {
		return false;
	  }
	  else {
		//Make sure only one "@" exists
		var iAtCount = 0
		var iIndex
		for (iIndex = 0; iIndex < emailAddressValue.length; iIndex++) {
		  if (emailAddressValue.charAt(iIndex) == "@") {
			iAtCount = iAtCount + 1
		  }
		}
		if (iAtCount > 1) {
		  return false;
		}
		//Check each character for validity
		for (iIndex = 0; iIndex < emailAddressValue.length; iIndex++) {
		  if ((isNaN(emailAddressValue.charAt(iIndex))) && ((emailAddressValue.charAt(iIndex).toLowerCase() < "a") || (emailAddressValue.charAt(iIndex).toLowerCase() > "z")) && (emailAddressValue.charAt(iIndex) != "_") && (emailAddressValue.charAt(iIndex) != ".") && (emailAddressValue.charAt(iIndex) != "@") && (emailAddressValue.charAt(iIndex) != "-")) {
              return false;
		  }
		}
	  }
    }
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  return true;
}
//******************************************************************************
// Purpose:     Check for valid address1.
// Assumptions:
// Effects:
// Inputs:      Address1 form control variable: [Document Name].[Form Name].[Field Name]
//				iSize - maximum length of value
//				isRequired - required bit flag (1 - required, 0 - optional)
// Returns:		False if bad address1.  Otherwise true.
// Written by:  Greg Sell   JUN 1, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkAddress1(address1Control,iSize,isRequired) {
  //Get control value
  var address1Value = address1Control.value;
  //Check for at least one space (multiple words in the address)
  var splitArray = address1Value.split(" ");
  if (address1Value != "") {
	if (address1Value.length > iSize) {
	  return false;
	}
	else {
	  //Should be at least one space (two words) in the address
	  if (splitArray.length < 2) {
	    return false;
	  }
	  else {
	    //Check for at least two words in the address
	    var sTempChar = "";
		var iCount = 0;
		for (iIndex = 0; iIndex < splitArray.length; iIndex++) {
		  if (splitArray[iIndex] != "") {
			sTempChar = sTempChar + splitArray[iIndex] + " ";
			iCount = iCount + 1;
		  }
		}
		if (iCount > 1) {
		  address1Value = sTempChar.substr(0, sTempChar.length - 1);
		  address1Control.value = address1Value;
		  return true;
	    }
	    else {
	      return false;
	    }
	  }
	}
  }
  else {
    if (isRequired == 1) {
      return false;
    }
  }
  return true;
}

//******************************************************************************
// Purpose:     Check for valid browser.
// Assumptions:
// Effects:
// Inputs:      
// Returns:		False if browser is not supported.  Otherwise true.
// Written by:  Greg Sell   JUN 7, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function checkBrowser() {
  var error = "To use this site, your browser must be running Netscape 4 or Internet Explorer 4 or higher";
  if (navigator.appName.indexOf('Netscape') != -1) {
    if (navigator.userAgent.indexOf('Opera') != -1) {
      alert (error);
      return false;
    }
    else {
	  if (navigator.appVersion.substring(0,1) < 4) {
        alert (error);
        return false;
      }
    }
  }
  else {
    if (navigator.appName.indexOf('Microsoft') != -1) {
      if (navigator.appVersion.substring(0,1) < 4) {
        alert (error);
        return false;
      }
    }
    else {
      if (navigator.appName.indexOf('Opera') != -1) {
        if (navigator.appVersion.substring(0,1) < 3) {
          alert (error);
          return false;
        }
      }
      else {
        alert (error);
        return false;
      }
    }
  }
  return true;
}
//******************************************************************************
// Purpose:     Open a new browser window.
// Assumptions:
// Effects:
// Inputs:      
// Returns:		False if fails to open.  Otherwise true.
// Written by:  Greg Sell   AUG 16, 2000
//******************************************************************************
// Changes:                              Developer:          Date:
//   Description                         First Last          MMM DD, YYYY
//******************************************************************************
function openWindow(windowURL, windowName, windowFeatures) {
	window.open(windowURL, windowName, windowFeatures);
	return true;
}