/*
	File:	dataValidationLib.js
	Date:	2 September 2002
	Author:	LMS
	
	bool validateDate (obj controlName,  string field)
	bool validateTime (obj controlName, string field)	
	bool checkLength (obj controlName, int maxLength, string field)
	bool requiredField (obj controlName, string field)
	bool function validateEditMode (obj controlName)
	bool confirmFields (obj first, obj second string fieldString)
	bool eitherNewOrOld (obj newFile, obj oldFile, string field)
	bool numberRange (obj controlName, string fieldString, int/float low, int/float high)
	bool validateEmail(obj controlName, string field)

*/
function validateDate (controlName, field)
{
	var daysInMonth = Array (0,31,28,31,30,31,30,31,31,30,31,30,31);
	var monthString = Array ("", "January", "February", "March", "April", "May", "June",
								"July", "August", "September", "October", "November", "December");
	var dateString = controlName.value;
	var dateParts = dateString.split ("/");
	var year = dateParts[2] - 0;
	var month = dateParts[0] - 0;
	var day = dateParts[1] - 0;
	var errorFlag = true;
	
//	alert ("dateString = "+dateString+" day="+day+", month="+month+", year="+year);
	
	if (month == 2 && (year % 4 == 0))
		daysInMonth[2] = 29;

	if (dateParts.length != 3)
		{
		alert (dateString+" is not a valid date string for "+field+".\n Pease enter a date in format MM/DD/YYYY)!");
		errorFlag = false;
		}
	else if (year < 2000 || year > 2099)
		{
		alert (year+" is not a valid year for "+field+".");
		errorFlag = false;
		}
	else if (month < 1 || month > 12)
		{
		alert (month+" is not a valid month for "+field+".");
		errorFlag = false;
		}
	else if (day < 1 || day > daysInMonth[month])
		{
		alert (day+" in not a valid day for "+monthString[month]+", "+year+" in field "+field+".");
		errorFlag = false;
		}
	
	if (!errorFlag)
		controlName.focus();

	return (errorFlag);						// for use by a calling function					
}

function validateTime (controlName, field)
{
var timeParts = controlName.value.split (":");
var errorFlag = true;

	if (timeParts.length != 2)
		{
		alert ("Please enter a valid time formatted HH:MM");
		errorFlag = false;
		}
	else if (timeParts[0] < 1 || timeParts[0] > 12)
		{
		alert ("The hour in field "+field+" must be between 1 and 12!");
		errorFlag = false;
		}
	if (timeParts[1] < 0 || timeParts[1] > 59)
		{
		alert ("The minutes in field "+field+" must be between 0 and 60!");
		errorFlag = false;
		}

	return (errorFlag);
}
	
function checkLength (controlName, minLength, maxLength, field)
{
// alert ('In checkLength: controlName='+controlName.name+', min='+minLength+', max='+maxLength+', field='+field);
	var status = true;
	var fieldValue = controlName.value;
	if (fieldValue.length > maxLength)
		{
		alert (field+" string must be less than "+maxLength+" characters!");
		controlName.value = fieldValue.substr(0,maxLength);
		status = false;
		controlName.focus();
		}
	else if (fieldValue.length < minLength)
		{
		alert (field+" string must be greater than "+minLength+" characters!");
		status = false;
		controlName.focus();
		}
	
	return (status);					// for use by a calling function
}

function requiredField (controlName, field)
{
var status = true;
var fieldValue = controlName.value;

//	alert ("requiredField: fieldValue = "+fieldValue);
	if (fieldValue.length < 1)
		{
		alert (field+" is a required field!");
		controlName.focus();
		status = false;
		}

	return (status);
}

function validateEditMode (controlName)
{
var status = false;
// alert ("validateEditMode: "+controlName.name+"="+controlName.value);
	if (controlName.value == "")
		alert ("Please select an Edit Mode");
	else
		status = true;

	return status;
}		

function validatePassword (controlName, minLength, maxLength, field)
{
var status = false;
var passwordPattern = '[a-zA-Z0-9]{'+minLength+','+maxLength+'}';

	if (checkLength (controlName, minLength, maxLength, field)
		&& controlName.value.search (passwordPattern) != -1)
		{
		status = true;
		}
	else
		{
		alert ('The password '+controlName.value+' contains invalid characters.  It can only contain letters or numbers, no spaces or puntuation.');
		controlName.focus ();
		}
//	alert ('validatePassword: status='+status);
	return status;
}

function confirmFields (first, second, fieldString)
	{
	var status = false;
// alert ('Password='+first.value+', Confirm='+second.value);	
	if (first.value == second.value)
		status = true;
	else
		alert ('The '+fieldString+' and Confirm '+fieldString+' do not agree.  Please re-enter.');

	return status;
	}

function eitherNewOrOld (newFile, oldFile, field)
	{
	var status = false;

		if (oldFile.value.length != 0)
			status = true;
		else
			status = requiredField (newFile, field);

	return status;
	}

function numberRange (controlName, fieldString, low, high)
	{
	var status = false;
	var value = controlName.value - 0;
	
	if (value < low && value > high)
		alert (fieldString+' is out of range ('+low+' - '+high+'): current value is '+value+'.');
	else
		status = true;

	return status;
	}

function validateEmail(controlName, field)
{
var EmailOk  = false;
var emailPattern = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;

//	result = controlName.value.search (emailPattern);
//	alert ('validateEmail: result='+result);
	if (controlName.value.search (emailPattern) == -1)
		{
		alert ('The email address entered ('+controlName.value+') entered is not valid.')
		controlName.focus ();
		}
	else
		EmailOk = true;
//	alert ('validateEmail: EmailOk='+EmailOk);
return EmailOk;
}

function validateCC (ccNumCtrl, ccNumStr, 
					expMonth, expYear, expStr, 
					valCtrl, codeStr)
	{
	var status = false;
	
	if (validateCCNumber (ccNumCtrl, ccNumStr)
		&& validateCCExpiration (expMonth, expYear, expStr)
		&& validateCCCode (valCtrl, codeStr))
		status = true;

// alert ('validateCC: status='+status);
	return status;
	}

function validateCCNumber (ccNumCtrl, fieldStr)
	{
	var status = true;

	if (ccNumCtrl.value.search (/^\d{4}( |-)?\d{4}( |-)?\d{4}( |-)?\d{4}$/))
			{
			alert ('The credit card number entered ('+ccNumCtrl.value+') is not a valid format.  Please re-enter.');
			ccNumCtrl.select ();
			ccNumCtrl.focus ();
			status = false;
			}

// alert ('validateCCNumber: status='+status);
	return status;
	}

function validateCCExpiration (expMonth, expYear, expStr)
	{
	var status = true;

	today = new Date();
	
	var thisYear = today.getFullYear();
	var thisMonth = today.getMonth() + 1;

	if (expYear.value == thisYear && expMonth.value < thisMonth)
		{
		alert ('The card expiration date entered has expired.  Please enter a valid expiration date.');
		expMonth.focus ();
		status = false;
		}

// alert ('validateCCExpiration: status='+status);
	return status;
	}

function validateCCCode (valCtrl, codeStr)
	{
	var status = true;
	var valCode = valCtrl.value;
/*	
	if (valCode.length < 3
		|| valCode.length > 4
		|| !isFinite (valCode))
*/
	if (valCode.search (/^[0-9]{3,4}$/) == -1)
		{
		alert ('Validation code must contain 3 or 4 characters and be a number from 000 to 9999');
		valCtrl.select ();
		valCtrl.focus ();
		status = false;
		}

// alert ('validateCCCode: status='+status);
	return status;
	}

function validateZipcode (controlName, fieldStr)
	{
	var status=false;
	
	var result = controlName.value.search (/^\d{5}( |-)?(\d{4})?$/);
	if (result == 0)
		status = true;
	else
		{
		alert ('The zipcode entered ('+controlName.value+') is not valid.');
		status = false;
		controlName.focus ();
		}

	return status;
	}