var MISSING_FIELD_PREFIX = "You did not enter a value into the ";
var MISSING_FIELD_SUFFIX = " field. This is a required field and must be provided before you can continue.";
var BAD_STATE_CODE = "This field must be a valid two character U.S. state abbreviation (like CA for California). Please make any needed corrections.";
var BAD_ZIP_CODE = "This field must be a 5 or 9 digit U.S. ZIP Code (like 94043). Please make any needed corrections.";
var BAD_PHONE = "This field must be a 10 digit U.S. phone number (like 415 555 1212). Please make any needed corrections.";
var BAD_INTEGER = "This field must be a numeric whole number from 0 to infinity.";
var BAD_MONEY = "This field must be a numeric field to represent a monetary value.";
var BAD_FLOAT = "The information you have entered is not a valid number. Please reenter this information now.";
var BAD_SSN = "This field must be a 9 digit U.S. social security number (like 123 45 6789). Please make any needed corrections.";
var BAD_EMAIL = "This field must be a valid email address (like foo@bar.com). Please make any needed corrections.";
var BAD_DAY = "This field must be a day number between 1 and 31.  Please make any needed corrections.";
var BAD_MONTH = "This field must be a month number between 1 and 12.  Please make any needed corrections.";
var BAD_YEAR = "This field must be a 2 or 4 digit year number.  Please make any needed corrections.";
var BAD_DATE = "The Date that you have entered is not in a valid format (such as 04/14/1999).  Please reenter this date now.";
var BAD_CREDIT_CARD = "This field must be a valid credit card number. Please make any needed corrections.";
var DATE_PREFIX = "The Day, Month, and Year for ";
var DATE_SUFFIX = " do not form a valid date.  Please reenter them now.";
var ENTRY_PROMPT = "Please enter a ";
var HELP_STATE = "2 character code (like CA).";
var HELP_ZIP = "5 or 9 digit U.S. ZIP Code (like 94043).";
var HELP_PHONE = "10 digit U.S. phone number (like 415 555 1212).";
var HELP_SSN = "9 digit U.S. social security number (like 123 45 6789).";
var HELP_EMAIL = "valid email address (like foo@bar.com).";
var HELP_DAY = "day number between 1 and 31.";
var HELP_MONTH = "month number between 1 and 12.";
var HELP_YEAR = "2 or 4 digit year number.";
var HELP_CREDIT_CARD = "valid credit card number.";
var HELP_DATE = " the a valid date (like 4/14/1999).";

function checkValidCharacters (objField, strInput, strValidChars, strFriendlyValidChars, bolEmptyOK)
{
	if (checkValidCharacters.arguments.length < 5) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	var strInvalidChars = stripCharsInBag(objField.value, strValidChars);
	if(strInvalidChars.length > 0)
	{
		if (strInvalidChars.length == 1) 
		{	
			alert("You have used an invalid character in the " + strInput + " field.  The '" + strInvalidChars + "' character is not valid.  The valid characters that can be used for this field include " + strFriendlyValidChars + ".");
		}
		else
		{
			alert("You have used some invalid characters in the " + strInput + " field.  The invalid characters that you have used are '" + strInvalidChars + "'.  The valid characters that can be used for this field include " + strFriendlyValidChars + ".");
		}
		return false;
	}
	else return true;
	return true;
}

function checkStateId (strInput, strType)
{
	if (strInput == 0)
	{
		alert ("You did not enter a value into the " + strType + " field.  This is a required field and must be provided before you can continue.");
		return false;
	}
	else return true;
}

function checkDropDown (strInput, strType)
{
	if (strInput == 0 || strInput == -1)
	{
		alert ("You did not enter a value into the " + strType + " field.  This is a required field and must be provided before you can continue.");
		return false;
	}
	else return true;
}

function promptEntry (strInput)
{
	window.status = ENTRY_PROMPT + strInput;
}

function warnEmpty (objField, strInput)
{
	objField.focus();
	alert(MISSING_FIELD_PREFIX + strInput + MISSING_FIELD_SUFFIX);
	return false;
}

function warnLength (objField, strInput, intLength)
{
	objField.focus();
	alert("The " + strInput + " field must be at least " + intLength + " characters long.  Please type in a new " + strInput + " and try again.");
	return false;
}

function warnInvalid (objField, strInput)
{
	objField.focus();
	objField.select();
	alert(strInput);
	return false;
}

function checkInteger (objField, bolEmptyOK)
{
	if (checkInteger.arguments.length == 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	if (!isInteger(objField.value)) 
		//return warnEmpty (objField, BAD_INTEGER);
		alert(BAD_INTEGER);
	else return true;
}

function checkIntegerWithName (objField, bolEmptyOK, strName)
{
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	if (!isInteger(objField.value)) 
		return warnInvalid (objField, "The " + strName + " must be a valid whole number from 0 to infinity.");
	else return true;
}

function checkFloat (objField, bolEmptyOK)
{
	if (checkFloat.arguments.length == 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	if (!isSignedFloat(objField.value)) 
		alert(BAD_FLOAT);
	else return true;
}

function checkFloatWithName (objField, bolEmptyOK, strName)
{
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	if (!isSignedFloat(objField.value)) 
		return warnInvalid (objField, "The " + strName + " must be a valid decimal number.");
	else return true;
}

function checkString (objField, strInput, bolEmptyOK)
{
	if (checkString.arguments.length == 2) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	if (isWhitespace(objField.value)) 
		return warnEmpty (objField, strInput);
	else return true;
}

function checkStringLength (objField, strInput, intLength)
{
	if (objField.value.length < intLength) 
            return warnLength (objField, strInput, intLength);
	else return true;
}

function checkMatchingStrings (objField1, objField2, strInput1, strInput2)
{
	if(objField1.value != objField2.value) 
	{
		objField1.focus();
		alert("The value typed into the " + strInput1 + " field must match the value typed into the " + strInput2 + " field.  Please re-type these values and try again.");
	}
	else return true;
}

function checkStateCode (objField, bolEmptyOK)
{
	if (checkStateCode.arguments.length == 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	else
	{
		objField.value = objField.value.toUpperCase();
		if (!isStateCode(objField.value, false)) 
			return warnInvalid (objField, BAD_STATE_CODE);
		else return true;
    }
}

function reformatZIPCode (strZIPString)
{
	if (strZIPString.length == 5) return strZIPString;
	else return (reformat (strZIPString, "", 5, "-", 4));
}

function checkZIPCode (objField, bolEmptyOK)
{
	if (checkZIPCode.arguments.length == 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	else
	{
		var strNormalizedZIP = stripCharsInBag(objField.value, strZIPCodeDelimiters)
		if (!isZipCode(strNormalizedZIP, false)) 
			return warnInvalid (objField, BAD_ZIP_CODE);
		else
		{
			objField.value = reformatZIPCode(strNormalizedZIP)
			return true;
		}
	}
}

function reformatPhone (strPhoneString)
{
	return (reformat (strPhoneString, "(", 3, ") ", 3, "-", 4))
}

function checkPhone (objField, strInput, bolEmptyOK)
{
	if (checkPhone.arguments.length == 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	else
	{
		var strNumbersInPhone = stripCharsNotInBag(objField.value, strDigits)
		if (strNumbersInPhone.length <= 10) {		
			var strNormalizedPhone = stripCharsInBag(objField.value, strPhoneNumberDelimiters)
			if (!isPhoneNumber(strNormalizedPhone, false)) 
				return warnInvalid (objField, "The " + strInput + " field is not formatted correctly.  " + BAD_PHONE);
			else 
			{
				objField.value = reformatPhone(strNormalizedPhone)
				return true;
			}
		}
		else return(true);
	}
}

function checkPassword (objField, bolEmptyOK)
{
	if (checkPassword.arguments.length == 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	else
	{
		var strPassword = objField.value
		if (strPassword.length < 6) 
			return warnInvalid (objField, BAD_PASSWORD);
		else
			return true;
	}
}			

function checkEmail (objField, strInput, bolEmptyOK)
{
	if (checkEmail.arguments.length == 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	else if (!isEmail(objField.value, false)) 
		return warnInvalid (objField, "The " + strInput + " field is not formatted correctly.  " + BAD_EMAIL);
	else return true;
}

function reformatSSN (strSSN)
{
	return (reformat (strSSN, "", 3, "-", 2, "-", 4));
}

function checkSSN (objField, bolEmptyOK)
{
	if (checkSSN.arguments.length == 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	else
	{
		var strNormalizedSSN = stripCharsInBag(objField.value, strSSNDelimiters);
		if (!isSSN(strNormalizedSSN, false)) 
			return warnInvalid (objField, BAD_SSN);
		else 
		{
			objField.value = reformatSSN(strNormalizedSSN);
			return true;
		}
	}
}

function checkYear (objField, bolEmptyOK)
{
	if (checkYear.arguments.length == 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	if (!isYear(objField.value, false)) 
		return warnInvalid (objField, BAD_YEAR);
	else return true;
}

function checkMonth (objField, bolEmptyOK)
{
	if (checkMonth.arguments.length == 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	if (!isMonth(objField.value, false)) 
		return warnInvalid (objField, BAD_MONTH);
	else return true;
}

function checkDay (objField, bolEmptyOK)
{
	if (checkDay.arguments.length == 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	if (!isDay(objField.value, false)) 
		return warnInvalid (objField, BAD_DAY);
	else return true;
}

function checkDate (objYearField, objMonthField, objDayField, strLabelString, bolOKtoOmitDay)
{
	if (checkDate.arguments.length == 4) bolOKtoOmitDay = false;
	if (!isYear(objYearField.value)) return warnInvalid (objYearField, BAD_YEAR);
	if (!isMonth(objMonthField.value)) return warnInvalid (objMonthField, BAD_MONTH);
	if ( (bolOKtoOmitDay == true) && isEmpty(objDayField.value) ) return true;
	else if (!isDay(objDayField.value)) 
		return warnInvalid (objDayField, BAD_DAY);
	if (isDate (objYearField.value, objMonthField.value, objDayField.value))
		return true;
	alert (DATE_PREFIX + strLabelString + DATE_SUFFIX);
	return false;
}

function reformatDate(strInputDate)
{
	var strDate;
	strDate = "";
	for (intI = 0; intI < strInputDate.length; intI++)
	{   
		var strChar = strInputDate.charAt(intI);
		if (isDigit(strChar) == false) strDate += "/";
		else strDate += strInputDate.charAt(intI);
	}
	return strDate;
}

function checkDateString (objDateField, bolEmptyOK)
{
	if (checkDateString.arguments.length <= 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objDateField.value))) return true;
	var strDay;
	var strMonth;
	var strYear;
	var strDate;
	strDate = reformatDate(objDateField.value);
	var aDateParts = strDate.split("/");   
	if (aDateParts.length >= 2 && aDateParts.length <= 3)
	{
		strMonth = aDateParts[0];
		if (aDateParts.length == 2)
		{
			strYear = aDateParts[1];
		}
		else
		{
			strDay = aDateParts[1];
			strYear = aDateParts[2];
		}
	}
	else
	{
		warnInvalid (objDateField, BAD_DATE);
		return false;
	}
	if (isDate (strYear, strMonth, strDay))
	{
		objDateField.value = strDate
		return true;
	}
	else
	{
		warnInvalid (objDateField, BAD_DATE);
		return false;
	}
}

function checkFutureDateString (objDateField, bolEmptyOK)
{
	if (checkFutureDateString.arguments.length <= 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objDateField.value))) return true;
	var strDay;
	var strMonth;
	var strYear;
	var strDate;
	var bolOldDate;
	bolOldDate = false;
	strDate = reformatDate(objDateField.value);
	var aDateParts = strDate.split("/");   
	if (aDateParts.length >= 2 && aDateParts.length <= 3)
	{
		strMonth = aDateParts[0];
		if (aDateParts.length == 2)
		{
			strYear = aDateParts[1];
		}
		else
		{
			strDay = aDateParts[1];
			strYear = aDateParts[2];
		}
		//new code to compare input date to current date
		var strCurrentDate = new Date();
		var strCurrentDay = strCurrentDate.getDate();
		var strCurrentMonth = strCurrentDate.getMonth() + 1;
		var strCurrentYear = strCurrentDate.getFullYear();
		
		if(strYear.length == 2) strYear = "20" + strYear;

		if(strYear < strCurrentYear) bolOldDate = true;
		else if(strYear == strCurrentYear)
		{
			if(strMonth < strCurrentMonth) bolOldDate = true;
			else if(strMonth == strCurrentMonth)
			{
				if(strDay < strCurrentDay) bolOldDate = true;
			}
		}
		
		if(bolOldDate == true)
		{
			alert("The date you entered occurs in the past.  You must enter a date in the present or future.");
			return false;
		}
	}
	else
	{
		warnInvalid (objDateField, BAD_DATE);
		return false;
	}
	if (isDate (strYear, strMonth, strDay))
	{
		objDateField.value = strDate
		return true;
	}
	else
	{
		warnInvalid (objDateField, BAD_DATE);
		return false;
	}
}

function checkCompareTwoDates (objFirstDateField, objSecondDateField)
{
	var strFirstDay;
	var strFirstMonth;
	var strFirstYear;
	var strFirstDate;
	
	var strSecondDay;
	var strSecondMonth;
	var strSecondYear;
	var strSecondDate;
	
	var bolOldDate;
	
	bolOldDate = false;
	strFirstDate = reformatDate(objFirstDateField.value);
	strSecondDate = reformatDate(objSecondDateField.value);
	
	var aFirstDateParts = strFirstDate.split("/");   
	var aSecondDateParts = strSecondDate.split("/");
	if (aFirstDateParts.length >= 2 && aFirstDateParts.length <= 3 && aSecondDateParts.length >= 2 && aSecondDateParts.length <= 3)
	{
		strFirstMonth = aFirstDateParts[0];
		strFirstDay = aFirstDateParts[1];
		strFirstYear = aFirstDateParts[2];
		
		strSecondMonth = aSecondDateParts[0];
		strSecondDay = aSecondDateParts[1];
		strSecondYear = aSecondDateParts[2];
		
		//new code to compare input date to current date
		
		if(strFirstYear.length == 2) strFirstYear = "20" + strFirstYear;
		if(strSecondYear.length == 2) strSecondYear = "20" + strSecondYear;
		if(strSecondYear < strFirstYear) bolOldDate = true;
		else if(strFirstYear == strSecondYear)
		{
			if(parseInt(strSecondMonth) < parseInt(strFirstMonth)) bolOldDate = true;
			else if(strFirstMonth == strSecondMonth)
			{
				if(parseInt(strSecondDay) < parseInt(strFirstDay)) bolOldDate = true;
			}
		}
		
		if(bolOldDate == true)
		{
			alert("The Start Date occurs after the End Date.  Please change your End Date to occur after the Start Date.");
			return false;
		}
		else return true;
	}
}


function checkCreditCard (objField, bolEmptyOK)
{
	if (checkCreditCard.arguments.length == 1) bolEmptyOK = bolDefaultEmptyOK;
	if ((bolEmptyOK == true) && (isEmpty(objField.value))) return true;
	var strNormalizedCCN = stripCharsInBag(objField.value, strCreditCardDelimiters)
	if (!isCreditCard(strNormalizedCCN)) 
	return warnInvalid (objField, BAD_CREDIT_CARD);
	else 
	{
		objField.value = strNormalizedCCN;
		return true;
	}
}

