//****************************************************************
// Description: Check to see if value is valid
// Parameters:
//	1. strType (String) = type of value to be validated
//		a. Alphabetic	m. Negative
//		b. Alphanumeric	n. NonNegative
//		c. Date			o. NonPositive
//		d. Day			p. Number
//		e. Digit		q. Positive
//		f. Email		r. SSN
//		g. Empty		s. StateCode
//		h. Float		t. USPhone
//		i. Integer		u. Year
//		j. IntlPhone	v. Whitespace
//		k. Letter		w. ZipCode
//		l. Month		
//	2. strFieldValue (String) = value of field
//	3. strFieldDesc (String) = description of field to display
//	4. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isValid(strType, strFieldValue, strFieldDesc, blnMessage)
{
	// Check parameter(s)
	if (isValid.arguments.length == 2){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isValid.arguments.length == 3)
			blnMessage = false;
	}
	
	// Convert to lower case
	strType = strType.toLowerCase();
	
	switch (strType) {
		case "alphabetic":		return isAlphabetic(strFieldValue, strFieldDesc, blnMessage); break;
		case "alphanumeric":	return isAlphanumeric(strFieldValue, strFieldDesc, blnMessage); break;
		case "date":			return isDate(strFieldValue, strFieldDesc, blnMessage); break;
		case "day":				return isDay(strFieldValue, strFieldDesc, blnMessage); break;
		case "digit":			return isDigit(strFieldValue, strFieldDesc, blnMessage); break;
		case "email":			return isEmail(strFieldValue, strFieldDesc, blnMessage); break;
		case "empty":			return isEmpty(strFieldValue, strFieldDesc, blnMessage); break;
		case "float":			return isFloat(strFieldValue, strFieldDesc, blnMessage); break;
		case "integer":			return isInteger(strFieldValue, strFieldDesc, blnMessage); break;
		case "intlphone":		return isIntlPhone(strFieldValue, strFieldDesc, blnMessage); break;
		case "letter":			return isLetter(strFieldValue, strFieldDesc, blnMessage); break;
		case "month":			return isMonth(strFieldValue, strFieldDesc, blnMessage); break;
		case "negative":		return isNegative(strFieldValue, strFieldDesc, blnMessage); break;
		case "nonnegative":		return isNonNegative(strFieldValue, strFieldDesc, blnMessage); break;
		case "nonpositive":		return isNonPositive(strFieldValue, strFieldDesc, blnMessage); break;
		case "number":			return isNumber(strFieldValue, strFieldDesc, blnMessage); break;
		case "positive":		return isPositive(strFieldValue, strFieldDesc, blnMessage); break;
		case "ssn":				return isSSN(strFieldValue, strFieldDesc, blnMessage); break;
		case "statecode":		return isStateCode(strFieldValue, strFieldDesc, blnMessage); break;
		case "usphone":			return isUSPhone(strFieldValue, strFieldDesc, blnMessage); break;
		case "whitespace":		return isWhitespace(strFieldValue, strFieldDesc, blnMessage); break;
		case "year":			return isYear(strFieldValue, strFieldDesc, blnMessage); break;
		case "zipcode":			return isZipCode(strFieldValue, strFieldDesc, blnMessage); break;
		
	}
}

//****************************************************************
// Description: Check to make sure field values are dates (not a
//				valid date - e.g. 2/31/00)
// Parameters:
//	1. strType (String) = type of value to be validated
//  2. astrFieldValue (Array)= array of field values
//  3. astrFieldDesc (Array) = array of field descriptions to display
//	4. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isValidArray(strType, astrFieldValue, astrFieldDesc, blnMessage)
{
	// Create default message to show user
	var blnCheck = true;
	var strMessage;
	
	// Convert to lower case
	strType = strType.toLowerCase();
	

	switch (strType) {
		case "alphabetic":		strMessage = "\nThe following fields need to be alphabetic:\n\n\t"; break;
		case "alphanumeric":	strMessage = "\nThe following fields need to be alphanumeric:\n\n\t"; break;
		case "date":			strMessage = "\nThe following fields need to contain dates formatted to MM/DD/YY or MM/DD/YYYY:\n\n\t"; break;
		case "day":				strMessage = "\nThe following fields need to contain days (between 1 and 31):\n\n\t"; break;
		case "digit":			strMessage = "\nThe following fields need to contain digits:\n\n\t"; break;
		case "email":			strMessage = "\nThe following fields need to contain email addresses:\n\n\t"; break;
		case "empty":			strMessage = "\nThe following fields need to contain values:\n\n\t"; break;
		case "float":			strMessage = "\nThe following fields need to contain floating point values:\n\n\t"; break;
		case "integer":			strMessage = "\nThe following fields need to contain integers:\n\n\t"; break;
		case "intlphone":		strMessage = "\nThe following fields need to contain international phone numbers:\n\n\t"; break;
		case "letter":			strMessage = "\nThe following fields need to contain letters:\n\n\t"; break;
		case "month":			strMessage = "\nThe following fields need to contain months (between 1 and 12):\n\n\t";	break;
		case "negative":		strMessage = "\nThe following fields need to contain negative values:\n\n\t"; break;
		case "nonnegative":		strMessage = "\nThe following fields need to contain nonnegative values:\n\n\t"; break;
		case "nonpositive":		strMessage = "\nThe following fields need to contain nonpositive values:\n\n\t"; break;
		case "number":			strMessage = "\nThe following fields need to contain numbers:\n\n\t"; break;
		case "positive":		strMessage = "\nThe following fields need to contain positive values:\n\n\t"; break;
		case "ssn":				strMessage = "\nThe following fields need to contain social security numbers:\n\n\t"; break;
		case "statecode":		strMessage = "\nThe following fields need to contain state codes:\n\n\t"; break;
		case "usphone":			strMessage = "\nThe following fields need to contain US phone numbers formatted to (123) 456-7890:\n\n\t"; break;
		case "whitespace":		strMessage = "\nThe following fields cannot contain white space:\n\n\t"; break;
		case "year":			strMessage = "\nThe following fields need to contain years:\n\n\t"; break;
		case "zipcode":			strMessage = "\nThe following fields need to contain numbers:\n\n\t"; break;
	}

	for(var intFieldNum=0; intFieldNum < astrFieldValue.length; intFieldNum++) {
		switch (strType) {
			case "alphabetic": 
				if (!isAlphabetic(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "alphanumeric": 	 
				if (!isAlphanumeric(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "date":
				if (!isDate(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
					}
				break;
			case "day":
				if (!isDay(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "digit":
				if (!isDigit(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "email":
				if (!isEmail(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "empty":
				if (isEmpty(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "float":
				if (!isFloat(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "integer":
				if (!isInteger(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "intlphone":
				if (!isIntlPhone(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "letter":
				if (!isLetter(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "month":
				if (!isMonth(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "negative":
				if (!isNegative(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "nonnegative":
				if (!isNonNegative(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "nonpositive":
				if (!isNonPositive(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "number":
				if (!isNumber(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "positive":
				if (!isPositive(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "ssn":
				if (!isSSN(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "statecode":
				if (!isStateCode(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "usphone":
				if (!isUSPhone(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "whitespace":
				if (isWhitespace(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "year":
				if (!isYear(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
			case "zipcode":
				if (!isZipCode(astrFieldValue[intFieldNum], astrFieldDesc[intFieldNum], false)) {
					strMessage += astrFieldDesc[intFieldNum] + "\n\t";
					blnCheck = false;
					continue;
				}
				break;
		}
	}

	// All fields are formatted
	if (blnCheck == true) {
		if (strType == "empty" || strType == "whitespace")
			return false;
		else
			return true;
	}
	// Some fields are not formatted
	else {
		// Display default message if specified
		if (blnMessage)
			alert(strMessage);
		
		if (strType == "empty" || strType == "whitespace")
			return true;
		else
			return false;
	}
}


// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// IS functions - not to be called by developers (use isValid)
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


//****************************************************************
// Description: Check to make sure value is alphabetic
// Parameters:
//  1. strFieldValue (String) = field to be tested
//  2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isAlphabetic(strFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isAlphabetic.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isAlphabetic.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	var reAlphabetic = /^[a-zA-Z]+$/;
	
	if (!reAlphabetic.test(strFieldValue)) {
		// Check message
		displayMessage(blnMessage, strFieldDesc, "Some fields need to be alphabetic.", "'" + strFieldDesc + "' needs to be alphabetic.");
		return false;
	}
	return true;
}


//****************************************************************
// Description: Check to make sure value is alphanumeric
// Parameters:
//  1. strFieldValue (String) = field to be tested
//  2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isAlphanumeric(strFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isAlphanumeric.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isAlphanumeric.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	var reAlphanumeric = /^[a-zA-Z0-9]+$/;
	
	if (!reAlphanumeric.test(strFieldValue)) {
		// Check message
		displayMessage(blnMessage, strFieldDesc, "Some fields need to be alphanumeric.", "'" + strFieldDesc + "' needs to be alphanumeric.");
		return false;
	}
	return true;
}


//****************************************************************
// Description: Check to make sure value is a valid date 
// Parameters:
//  1. strFieldValue (String) = field to be tested
//	2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isDate(strFieldValue, strFieldDesc, blnMessage)
{
	// Make sure field is not empty
	if (isEmpty(strFieldValue)) return true;
	
	var strInDate = strFieldValue;

	// Assume a separator of "-" or "/" or "."
	if (strInDate.indexOf("-") != -1) {
		var astrDateSplit = strInDate.split("-")
	}
	else {
		if (strInDate.indexOf("/") != -1) {
			var astrDateSplit = strInDate.split("/")
		}
		else {
			var astrDateSplit = strInDate.split(".")
		}
	}

	// Reformats string to be recognized by parse method below
	strInDate = astrDateSplit[0] + "/" + astrDateSplit[1] + "/" + astrDateSplit[2];
	
	
	var datCheckDate = new Date(Date.parse(strInDate))
	var intDay = (Math.abs(astrDateSplit[1]));
	var intMonth = (Math.abs(astrDateSplit[0]));
	var intYear = (Math.abs(astrDateSplit[2]));
	var strInDate2 = intMonth + "/" + intDay + "/" + intYear;
	
	var strCompleteDate = (datCheckDate.getMonth() + 1) + "/" + (datCheckDate.getDate()) + "/"
	
	if (intYear >= 1000)
		strCompleteDate = strCompleteDate + (datCheckDate.getFullYear())
	else {
		if (intYear < 100)
			strCompleteDate = strCompleteDate + (datCheckDate.getYear())
	}

	
	
	// Cluge for Feburary 29, 00 not 2000
	if (strInDate2 != strCompleteDate && strInDate2 != "2/29/0"){
		if (blnMessage) {
			if (isEmpty(strFieldDesc))
				alert("All dates need to be valid and formatted to MM/DD/YY or MM/DD/YYYY.")
			else
				alert("'" + strFieldDesc + "' needs to be valid and formatted to MM/DD/YY or MM/DD/YYYY.") 		
		}
		return false;
	}
	else {
		if (strCompleteDate == "NaN/NaN/NaN") {
			if (blnMessage) {
				if (isEmpty(strFieldDesc))
					alert("All dates need to be valid and formatted to MM/DD/YY or MM/DD/YYYY.")
				else
					alert("'" + strFieldDesc + "' needs to be valid and formatted to MM/DD/YY or MM/DD/YYYY.") 		
			}		
			return false;			
		}
		return true;
	}
}


//****************************************************************
// Description: Check to make sure value is a day
// Parameters:
//  1. strFieldValue (String) = field to be tested
//	2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isDay(strFieldValue, strFieldDesc, blnMessage) 
{
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isDay.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isDay.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	if (!isInteger(strFieldValue) || !isIntegerInRange (strFieldValue, 1, 31)){
		// Check message
		displayMessage(blnMessage, strFieldDesc, "All days must be between 1 and 31.", "'" + strFieldDesc + "' needs to contain a valid day (between 1 and 31).");
		return false;
	}
	return true;
}


//****************************************************************
// Description: Check to make sure value is a digit
// Parameters:
//  1. strFieldValue (String) = field to be tested
//  2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isDigit(strFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isDigit.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isDigit.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	var reDigit = /^[\d]$/;
	
	if (!reDigit.test(strFieldValue)) {
		// Check message
		displayMessage(blnMessage, strFieldDesc, "Some fields require digits.", "'" + strFieldDesc + "' needs to contain a digit.");
		return false;
	}
	return true;
}


//****************************************************************
// Description: Check to make sure value is an email address
// Parameters:
//  1. strFieldValue (String) = field to be tested
//	2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isEmail(strFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isEmail.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isEmail.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	//var blnCheck = true;
	var reEmail = /^[A-Za-z0-9_.-]+@[a-z0-9.-]+$/;

	// Check message
	if ((!reEmail.test(strFieldValue)) || (strFieldValue.indexOf("..") != -1)  || (strFieldValue.indexOf("--") != -1) || (strFieldValue.indexOf("@.") != -1)
		|| (strFieldValue.indexOf("@-") != -1) || (strFieldValue.indexOf(".@") != -1) || (strFieldValue.indexOf("-@") != -1)){
		displayMessage(blnMessage, strFieldDesc, "Email fields must be formatted correctly.", "'" + strFieldDesc + "' needs to contain an email address.");
		return false;
	}
	
	return true
}

//****************************************************************
// Description: Check to make sure value is a float
// Parameters:
//  1. strFieldValue (String) = field to be tested
//  2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isFloat(strFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isFloat.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isFloat.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	var reFloat = /^-?[\d]*[\.]{1}[\d]+$/;
	
	if (!reFloat.test(strFieldValue)){
		// Check message
		displayMessage(blnMessage, strFieldDesc, "Some fields need to contain floating point values.", "'" + strFieldDesc + "' needs to contain a floating point value.");
		return false;
	}
	return true;
}


//****************************************************************
// Description: Check to make sure value is a number 
//			    (integer; positive or negative)
// Parameters:
//  1. strFieldValue (String) = field to be tested
//	2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isInteger(strFieldValue, strFieldDesc, blnMessage)
{
	// Make sure field is not empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isInteger.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isInteger.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	var reInteger = /^-?[0-9]+$/;
	var reZero = /^-0+$/;
	
	// Check message
	if (!reInteger.test(strFieldValue) || reZero.test(strFieldValue)) {
		displayMessage(blnMessage, strFieldDesc, "Integer fields cannot contain decimals or characters.", "'" + strFieldDesc + "' needs to contain an integer.");
		return false;
	}	
	return true;
}


//****************************************************************
// Description: Check to make sure value is an international phone
// Parameters:
//  1. strFieldValue (String) = field to be tested
//	2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isIntlPhone(strFieldValue, strFieldDesc, blnMessage)
{  
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isIntlPhone.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isIntlPhone.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	var blnCheck = true;
	var strValid = "0123456789-() ";
	
	if (!containsValidChar(strFieldValue, strValid)) {
		blnCheck = false;
	} else {
		if (strFieldValue.length < 5)
			blnCheck = false;
	}
	
	// Check message
	if (!blnCheck) {	
		displayMessage(blnMessage, strFieldDesc, "All International phone numbers need to be formatted correctly", "'" + strFieldDesc + "' needs to be formatted correctly.");
		return false;
	}
    return true;	
}


//****************************************************************
// Description: Check to make sure value is a letter
// Parameters:
//  1. charFieldValue (Character) = field to be tested
//  2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isLetter(charFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(charFieldValue)) return true;
	
	// Check parameter(s)
	if (isLetter.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isLetter.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	var reLetter = /^[a-zA-Z]$/;
	
	if (!reLetter.test(charFieldValue)) {
		// Check message
		displayMessage(blnMessage, strFieldDesc, "Some fields require letters.", "'" + strFieldDesc + "' needs to contain a letter.");
		return false;
	}
	return true;
}


//****************************************************************
// Description: Check to make sure value is a month
// Parameters:
//  1. strFieldValue (String) = field to be tested
//	2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isMonth(strFieldValue, strFieldDesc, blnMessage) 
{
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isMonth.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isMonth.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	if (!isInteger(strFieldValue) || !isIntegerInRange (strFieldValue, 1, 12)){
		// Check message
		displayMessage(blnMessage, strFieldDesc, "All months must be between 1 and 12.", "'" + strFieldDesc + "' needs to contain a valid month (between 1 and 12).");
		return false;
	}
	return true;
}


//****************************************************************
// Description: Check to make sure value is negative
// Parameters:
//  1. varFieldValue (Variant) = field to be tested
//  2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isNegative(varFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(varFieldValue)) return true;
	
	// Check parameter(s)
	if (isNegative.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isNegative.arguments.length == 2)
			blnMessage = false;
	}

	// Check logic	
	var reNegative = /^-[0-9]*[.]?[0-9]+$/;
	var reZero = /^-0*[.]?0+$/;
	
	if (!reNegative.test(varFieldValue) || reZero.test(varFieldValue)) {
		// Check message
		displayMessage(blnMessage, strFieldDesc, "Negative values are required for certain fields.", "'" + strFieldDesc + "' needs to be negative.");
		return false;
	}
	return true
}


//****************************************************************
// Description: Check to make sure value is not negative
// Parameters:
//  1. varFieldValue (Variant) = field to be tested
//  2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isNonNegative(varFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(varFieldValue)) return true;
	
	// Check parameter(s)
	if (isNonNegative.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isNonNegative.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic	
	var reZero = /^0*[.]?0+$/;
	
	if (!isPositive(varFieldValue) && !reZero.test(varFieldValue)) {
		// Check message
		displayMessage(blnMessage, strFieldDesc, "Nonnegative values are required for certain fields.", "'" + strFieldDesc + "' needs to be nonnegative.");
		return false;
	}
	return true
}


//****************************************************************
// Description: Check to make sure value is not positive
// Parameters:
//  1. varFieldValue (Variant) = field to be tested
//  2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isNonPositive(varFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(varFieldValue)) return true;
	
	// Check parameter(s)
	if (isNonPositive.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isNonPositive.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic	
	var reZero = /^0*[.]?0+$/;
	
	if (!isNegative(varFieldValue) && !reZero.test(varFieldValue)) {
		// Check message
		displayMessage(blnMessage, strFieldDesc, "Nonpositive values are required for certain fields.", "'" + strFieldDesc + "' needs to be nonpositive.");
		return false;
	}
	return true;
}


//****************************************************************
// Description: Check to make sure value is a number 
//			    (integer or float; positive or negative)
// Parameters:
//  1. strFieldValue (String) = field to be tested
//  2. strFieldDesc (String) = display name associated with field
//  3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isNumber(strFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isNumber.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isNumber.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic	
	var reNumber = /^-?[0-9]*[.]?[0-9]+$/;
	var reZero = /^-0*[.]?0+$/;
	
	
	// Check message
	if ((!reNumber.test(strFieldValue)) || (reZero.test(strFieldValue))){
		displayMessage(blnMessage, strFieldDesc, "Number fields cannot contain characters.", "'" + strFieldDesc + "' needs to contain a number.");
		return false;
	}
	return true;
}


//****************************************************************
// Description: Check to make sure value is positive
// Parameters:
//  1. varFieldValue (Variant) = field to be tested
//  2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isPositive(varFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(varFieldValue)) return true;
	
	// Check parameter(s)
	if (isPositive.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isPositive.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic	
	var rePositive = /^[0-9]*[.]?[0-9]+$/;
	var reZero = /^0*[.]?0+$/;
	
	// Check message
	if (!rePositive.test(varFieldValue) || reZero.test(varFieldValue)) {
		// Check message
		displayMessage(blnMessage, strFieldDesc, "Positive values are required for certain fields.", "'" + strFieldDesc + "' needs to be positive.");
		return false;
	}
	return true
}


//****************************************************************
// Description: Check to make sure value is a SSN
// Parameters:
//  1. strFieldValue (String) = field to be tested
//	2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isSSN(strFieldValue, strFieldDesc, blnMessage) 
{
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isSSN.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isSSN.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	var blnCheck = true;
	var reValid9 = /^[0-9]{9}$/;
	var reValid11 = /^[0-9]{3}-[0-9]{2}-[0-9]{4}$/;
	
	if (strFieldValue.length == 9) {
		if (!reValid9.test(strFieldValue))
			blnCheck = false;
	} else {
	
		if (strFieldValue.length == 11) {
			if (!reValid11.test(strFieldValue))
				blnCheck = false;
		} else {
	
		blnCheck = false;
		}
	}
	
	
	// Check message
	if (!blnCheck) {	
		displayMessage(blnMessage, strFieldDesc, "All social security numbers need to be formatted to 123456789 or 123-45-6789.", "'" + strFieldDesc + "' needs to be formatted to 123456789 or 123-45-6789.");
		return false;
	}
	return true;
}


//****************************************************************
// Description: Check to make sure value is a state code
// Parameters:
//  1. strFieldValue (String) = field to be tested
//  2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isStateCode(strFieldValue, strFieldDesc, blnMessage)
{   
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isStateCode.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isStateCode.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	var strUSStateCodeDelimiter = "|";
	var strUSStateCodes = "AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|AE|AA|AE|AE|AP"
    if ((strUSStateCodes.indexOf(strFieldValue) != -1) && (strFieldValue.indexOf(strUSStateCodeDelimiter) == -1)) {
		return true;
	} else {
		// Check message
		displayMessage(blnMessage, strFieldDesc, "All states need to contain valid state codes.", "'" + strFieldDesc + "' needs to contain a valid state code.");
		return false;
	}
	return true;
}


//****************************************************************
// Description: Check to make sure value is a US phone
// Parameters:
//  1. strFieldValue (String) = field to be tested
//	2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isUSPhone(strFieldValue, strFieldDesc, blnMessage)
{  
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isUSPhone.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isUSPhone.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	var blnCheck = true;
	var strValid = "0123456789-.()";
	var reValid12 = /(^[0-9]{3}-[0-9]{3}-[0-9]{4}$)|(^[0-9]{3}.[0-9]{3}.[0-9]{4}$)/;
	var reValid13 = /^[\(]{1}[0-9]{3}[\)]{1}[0-9]{3}-[0-9]{4}$/;
	
	strFieldValue = trimWhiteSpace(strFieldValue);
	
	if (!containsValidChar(strFieldValue, strValid)) {
		blnCheck = false;
	} else {
		if (strFieldValue.length == 12) {
			if (!reValid12.test(strFieldValue))
				blnCheck = false;
		} else {
			if (strFieldValue.length == 13) {
				if (!reValid13.test(strFieldValue))
					blnCheck = false	
			} else {
				blnCheck = false;
			}
		}
	}
	
	// Check message
	if (!blnCheck) {	
		displayMessage(blnMessage, strFieldDesc, "All US phone numbers need to be formatted to (123) 456-7890, 123-456-7890, or 123.456.7890", "'" + strFieldDesc + "' needs to be formatted to (123) 456-7890, 123-456-7890 or 123.456.7890.");
		return false;
	}
    return true;
}


//****************************************************************
// Description: Check to make sure value has no spaces
// Parameters:
//  1. strFieldValue (String) = field to be tested
//  2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isWhitespace(strFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(strFieldValue)) return false;
	
	// Check parameter(s)
	if (isWhitespace.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isWhitespace.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	var charInvalid = " "; 
	if (strFieldValue.indexOf(charInvalid) > -1) {
		// Check message
		displayMessage(blnMessage, strFieldDesc, "Some fields require no white space.", "'" + strFieldDesc + "' cannot contain white space.");
		return true;
	}
	return false;
}


//****************************************************************
// Description: Check to make sure value is a year
// Parameters:
//  1. strFieldValue (String) = field to be tested
//	2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isYear(strFieldValue, strFieldDesc, blnMessage)
{  
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isYear.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isYear.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	blnCheck = true;
	
	if ((strFieldValue.length != 2) && (strFieldValue.length != 4)) {
		blnCheck = false;
	} else {
		if (!isInteger(strFieldValue) || !isNonNegative(strFieldValue))
			blnCheck = false;
	}
	
	// Check message
	if (!blnCheck) {	
		displayMessage(blnMessage, strFieldDesc, "All years need to be formatted to 2 or 4 digits.", "'" + strFieldDesc + "' needs to be formatted to 2 or 4 digits.");
		return false;
	}
    return true;
}


//****************************************************************
// Description: Check to make sure value is a zip code
// Parameters:
//  1. strFieldValue (String) = field to be tested
//	2. strFieldDesc (String) = display name associated with field
//	3. blnMessage (Boolean) = should a message be displayed
// Returns: true if successful and false if not
//****************************************************************
//	IE4		IE5		Netscape 4+
//	---		---		-----------
//	Yes		Yes		Yes
//****************************************************************
function isZipCode(strFieldValue, strFieldDesc, blnMessage)
{
	// Check empty
	if (isEmpty(strFieldValue)) return true;
	
	// Check parameter(s)
	if (isZipCode.arguments.length == 1){
		strFieldDesc = null;
		blnMessage = false;	
	} else {
		if(isZipCode.arguments.length == 2)
			blnMessage = false;
	}
	
	// Check logic
	var blnCheck = true;
	var strValid = "0123456789-";

	var reZipCode = /(^[\d]{9}$)|(^[\d]{5}$)|(^[\d]{5}-[\d]{4}$)/;

	// Check message
	if (!reZipCode.test(strFieldValue)) {
		displayMessage(blnMessage, strFieldDesc, "All zip codes need to be formatted to 12345 or 12345-6789.", "'" + strFieldDesc + "' needs to be formatted to 12345 or 12345-6789.");
		return false;
	}
	return true
}


