
/* **********************************************************************************
 * ROUTINE:  formatValidDate
 *
 * ARGS:     aText.		A reference to an INPUT TEXT control.
 *
 * RETURNS:  None. 
 *
 * DESC:     If the value of the referenced text box evaluates to a date, formats
 *			 the contents of the text control into a MM/DD/YYYY format.
 *
 * NOTES:    
 *********************************************************************************** */
function formatValidDate(aText) 
{
	var aString = aText.value;
	aString = Trim(aString);
	
	if (validDate(aString))	{
		aText.value = formatDate(aString);
	}
	else {
		//alert("Invalid Date!\n\nPlease ensure the value entered is numeric\nand in the following format:\n\n\tMM/DD/YYYY");		
		aText.focus();
		aText.select();
	}
}

/* **********************************************************************************
 * ROUTINE:  Trim
 *
 * ARGS:     aString.		A string value.
 *
 * RETURNS:  The passed string value with the leading and trailing spaces removed.
 *
 * DESC:     Removes any leading and trailing spaces from the passed string variable.
 *
 * NOTES:    
 *********************************************************************************** */
function Trim(aString)
{	
	// Remove leading spaces.
	while (aString.charAt(0) == " ")
	{		aString = aString.substr(1);	}	
	// Remove trailing spaces.
	while(aString.charAt(aString.length - 1) == " ")
	{		aString = aString.substr(0, aString.length - 1);	}	
	return(aString);	
}

/* **********************************************************************************
 * ROUTINE:  validDate
 *
 * ARGS:     aString.		A string value.
 *
 * RETURNS:  Boolean.		Returns true if the passed value evaluates to a date.
 *							
 *
 * DESC:     Verifies if the passed string passes a month/day/year format.
 *
 * NOTES:    No leap year check is implemented in this code.
 *********************************************************************************** */
function validDate(aString){	
	
	if (aString.length == 0) return(true);
		
	var bDate = false;
	var i = 0;
	
	// Check for forward slash separator.
	stringArray = aString.split("/");
	if (stringArray.length == 3) bDate = true;
	
	// Check for backward slash separator.
	if (!bDate) {		
		stringArray = aString.split("\\");	
		if (stringArray.length == 3) bDate = true;
	}
	
	// Check for dash separator.
	if (!bDate)	{
		stringArray = aString.split("-");
		if (stringArray.length == 3) bDate = true;
	}
		
	// Return false if a unable to create a valid date array.
	if (!bDate) {
		alert("Invalid Date!\n\nPlease enter date in the following format:\n\n\tMM/DD/YYYY");
		return(false);
	}
	
	// Check Year. ------------------------------------
	var YY = stringArray[2];
	
	// Look for non-numeric characters.
	if (isNaN(YY)) {
		alert("Invalid Date!\n\nPlease provide a whole number in the year position.");
		return(false);
	}	
	
	YY = Number(YY);

	if (!YY) {
		alert("Invalid Date!\n\nPlease enter a whole number in the year position.");
		return(false);
	}
	
	if (stringArray[2].length <= 2)
	{	if (YY < 0 || YY > 99) {
		alert("Invalid Date! Year must be between 0 and 99 or 1000 and 9999.");
		return(false); }
	}
	else
	{
		if (YY < 1000 || YY > 9999) {
		alert("Invalid Date! Year must be between 0 and 99 or 1000 and 9999.");
		return(false);}
	}
				
	if (YY > 0 && YY < 100) {
		if (YY >= 0 && YY <= 30) {
			YY += 2000;}
		else {
			YY += 1900;}
	}
	

	// Check Month. ----------------------------------
	var MM = stringArray[0];	
	
	// Look for non-numeric characters.
	if (isNaN(MM)) {
		alert("Invalid Date!\n\nPlease provide a whole number in the month position.");
		return(false);
	}

	MM = Number(MM);

	if (MM < 1 || MM > 12) {
		alert("Invalid Date!\n\nMonth value must be between 1 and 12.");	
		return(false);
	}	
	
	// Check Day. -------------------------------------
	var DD = stringArray[1];	
	// Look for non-numeric characters.
	if (isNaN(DD)) {
		alert("Invalid Date!\n\nPlease provide a whole number in the day position.");
		return(false);
	}

	DD = Number(DD);

	// Check for appropriate days in month.	
	if (MM == 2) {
		if ((YY % 4) != 0) { 
			if (DD < 1 || DD > 28) {
				alert("Invalid Date!\n\nFebruary days must be between 1 and 28.");
				return(false); }
		}
		else if ((YY % 400) == 0) {
			if (DD < 1 || DD > 29) {
				alert("Invalid Date!\n\nFebruary days must be between 1 and 29.");
				return(false); }
		}
		else if ((YY % 100) == 0) {
			if (DD < 1 || DD > 28) {
				alert("Invalid Date!\n\nFebruary days must be between 1 and 28.");
				return(false); }
		}
		else {
			if (DD < 1 || DD > 29) {
				alert("Invalid Date!\n\nFebruary days must be between 1 and 29.");
				return(false); }
		}
	}
	else if (MM == 4 || MM == 6 || MM == 9 || MM == 11)	{
		if (DD < 1 || DD > 30) {
			alert("Number of days for this month must be between 1 and 30.");
			return(false);
		}
	}
	else {
		if (DD < 1 || DD > 31) {
			alert("Number of days for this month must be between 1 and 31.");
			return(false);
		}
	}	
	
	// Return success.
	return(true);	
}

/* **********************************************************************************
 * ROUTINE:  formatDate
 *
 * ARGS:     aString.		A string value.
 *
 * RETURNS:  String. 
 *
 * DESC:     Returns passed string in a MM/DD/YYYY format.
 *
 * NOTES:    Assumes passed string has already been verified as a valid date.
 *			 Assumes a 2 digit year of 30 or less should be converted to 2000 and
 *			 31 or greater to 1900.
 *********************************************************************************** */
function formatDate(aString)
{	
	if (aString.length == 0) return("");
	
	// replace backslash or dash with forward slash.
	re = /\\/gi;
	aString = aString.replace(re, "/");
	re = /-/gi;
	aString = aString.replace(re, "/");
	
	// Split the date into its separate elements.
	var stringArray = aString.split("/"); 
	
	var MM = stringArray[0];
	var DD = stringArray[1];
	var YY = stringArray[2];
	
	if (MM.length == 1) MM = "0" + MM;
	if (DD.length == 1) DD = "0" + DD;
	
	if (YY.length == 1)	{
		YY = "200" + YY;
	}
	else if (YY.length == 2) {
		if (YY <= "30")	{
			YY = "20" + YY;
		}
		else {
			YY = "19" + YY;
		}
	}
	
	// Put it back together.
	aString = MM + "/" + DD + "/" + YY;
	
	return(aString);	
}

