/********************************************************************************
 * 
 * File:
 *	verify.js 
 * 
 * Description:
 *	Contains the form field verification definitions, regular expressions and
 *	routines.
 * 
 * Revision History:
 *	2008.11.12	dwo
 *				Original.
 * 
 * Copyright (c) 2008-2009 Oxford Consulting, LLC
 *	All rights reserved worldwide by Oxford Consulting, LLC
 *	http://www.OxfordConsulting.us
 * 
 ********************************************************************************/

// Regular expressions for validation of a variety of field types.
var regexFloat=/^(\d+\.?)$|(\d*\.\d+)$/
var regexAge=/^\s*\d{1,3}\s*$/
var regexYear=/^(\d{2})$|(\d{4})$/
var regexSSN=/^\s*\d{3}-\d{2}-\d{4}\s*$/
var regexPhoneNumber=/^\s*(((\d{3})-?\s*)|(\(\d{3}\))\s*)?(((\d{3})-(\d{4}))|((\d{3})(\d{4})))\s*(x\s*\d{1,6})?\s*$/
var regexZipCode=/^\s*(\d{5}-\d{4}|\d{5})\s*$/
var regexCurrency=/^\s*\$?(([1-9],)?([0-9]{3},){0,3}[0-9]{3}|[0-9]{0,16})(\.[0-9]{0,3})?\s*$/
var regexDate2=/^\s*(\d{1,2})[\/-](\d{1,2})[\/-](\d{2})\s*$/
var regexDate4=/^\s*(\d{1,2})[\/-](\d{1,2})[\/-](\d{4})\s*$/
var regexPersonsName=/^\s*[A-Za-z]+.*$/
var regexEmailAddress=/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/

function validateFloat(value, errMessage, isRequired)
{
	var blnError = false;

	if (value.length == 0)
		blnError = isRequired;
	else
		blnError = (! regexFloat.test(value));

	if (blnError)
	    return errMessage;

  return '';

}	// End validateFloat()

function validatePersonsName(Name, errMessage, isRequired)
{
	var blnError = false;

	if (Name.length == 0)
		blnError = isRequired;
	else
		blnError = (! regexPersonsName.test(Name));

	if (blnError)
	    return errMessage;

  return '';

}	// End validatePersonsName()

function validatePhoneNumber(phoneNumber, phoneNumberDescription, isRequired)
{
	var msg = '';
	var blnError = false;

	if (phoneNumber.length == 0)
		blnError = isRequired;
	else
		blnError = (! regexPhoneNumber.test(phoneNumber));

	if (blnError)
		{
		msg = msg + "Please enter the " + phoneNumberDescription + " in one of the following formats:\n";
		msg = msg + "        (   )___-____\n";
		msg = msg + "        (   )___-____ x____\n";
		msg = msg + "        e.g.: (603)224-1234\n";
		msg = msg + "                 (603)224-1234 x23\n";
		msg = msg + "    Note: Phone Number digits must be numeric. Extensions may not be more than 6 digits.\n";
		}

  return msg;

}	// End validatePhoneNumber()

function validateEmailAddress(EmailAddress, errMessage, isRequired)
{
	var blnError = false;

	if (EmailAddress.length == 0)
		blnError = isRequired;
	else
		blnError = (! regexEmailAddress.test(EmailAddress));

	if (blnError)
	    return errMessage;

  return '';

}	// End validateEmailAddress()

function validateAge(Age, errMessage, isRequired)
{
	var blnError = false;

	if (Age.length == 0)
		blnError = isRequired;
	else
		blnError = (! regexAge.test(Age));

	if (blnError)
	    return errMessage;

  return '';

}	// End validateSSN()

function validateSSN(SSN, errMessage, isRequired)
{
	var blnError = false;

	if (SSN.length == 0)
		blnError = isRequired;
	else
		blnError = (! regexSSN.test(SSN));

	if (blnError)
	    return errMessage;

  return '';

}	// End validateSSN()

function validateZipCode(zipCode, errMessage, isRequired)
{
	var blnError = false;

	if (zipCode.length == 0)
		blnError = isRequired;
	else
		blnError = (! regexZipCode.test(zipCode));

	if (blnError)
	    return errMessage;

  return '';

}	// End validateZipCode()

function validateCurrency(amount, errMessage, isRequired)
{
	var blnError = false;

	if (amount.length == 0)
		blnError = isRequired;
	else
		blnError = (! regexCurrency.test(amount));

	if (blnError)
	    return errMessage;

  return '';

}	// End validateCurrency()

function validateDateOrCurrent(str, errMessage, isRequired)
{
	if (str == 'Current' || str == 'current')
		return '';

	return validateDate(str, errMessage, isRequired);

}	// End validateDateOrCurrent()

function validateDate(str, errMessage, isRequired)
{
	var blnError = false;

	if (str.length == 0)
		{
		if ( isRequired )
			return errMessage;
		else
			return '';
		}

	var strDateParts = str.match(regexDate4);
	
	if (strDateParts == null)
		strDateParts = str.match(regexDate2);

	if (strDateParts == null)
		return errMessage;
	
	return validateDateSerial(parseInt(strDateParts[3], 10),parseInt(strDateParts[1], 10),parseInt(strDateParts[2], 10), errMessage, isRequired);

}	// End validateDate()

function validateDateSerial(intYear, intMonth, intDay, errMessage, isRequired)
{
	var blnError = false;

	if ((intYear == 0) || (intMonth == 0) || (intDay == 0))
		blnError = isRequired;

	if (blnError)
	    return errMessage;

	var dt = new Date(intYear, intMonth-1, intDay);
	if (dt.getMonth() != intMonth-1)
		return errMessage;

	return '';

}	// End validateDateSerial()

function validateBirthDate(str, errMessage, isRequired)
{
	var blnError = false;

	if (str.length == 0)
		{
		if ( isRequired )
			return errMessage;
		else
			return '';
		}

	var strDateParts = str.match(regexDate4);
	
	//if (strDateParts == null)
	//	strDateParts = str.match(regexDate2);

	if (strDateParts == null)
		return errMessage;
	var intMonth = parseInt(strDateParts[1], 10);
	var dt = new Date(parseInt(strDateParts[3], 10), intMonth-1, parseInt(strDateParts[2], 10));
	if (dt.getMonth() != intMonth-1)
		return errMessage;

	// Is the given date in the future?  Birth dates can not be in the future.
	if (dt.getTime() > (new Date()).getTime())
		return errMessage;

	return '';

}	// End validateBirthDate()

function validateBirthDateSerial(intYear, intMonth, intDay, errMessage, isRequired)
{
	var blnError = false;

	if ((intYear == 0) || (intMonth == 0) || (intDay == 0))
		blnError = isRequired;

	if (blnError)
	    return errMessage;

	var dt = new Date(intYear, intMonth-1, intDay);
	if (dt.getMonth() != intMonth-1)
		return errMessage;

	// Is the given date in the future?  Birth dates can not be in the future.
	if (dt.getTime() > (new Date()).getTime())
		return errMessage;

	return '';

}	// End validateBirthDateSerial()

function validateYearOfBirth(YearOfBirth, errMessage, isRequired)
{
	var blnError = false;

	if (YearOfBirth.length == 0)
		blnError = isRequired;
	else
		{
		if ( ! (blnError = (! regexYear.test(YearOfBirth))) )
			{
			var intYear = parseInt(YearOfBirth,10);
			if ( isNaN(intYear) )
				blnError = true;
			else
				{
				var dt = new Date();
				if (dt.getFullYear() < intYear)
					blnError = true;
				}
			}
		}

	if (blnError)
	    return errMessage;

	return '';

}	// End validateYearOfBirth()

// Trim whitespace from the beginning and the end of a string.
function trim(str)
{
	str = str.replace(/^\s\s*/, '');
	var ws = /\s/;
	var i = str.length;
	while (ws.test(str.charAt(--i)));
	return str.slice(0, i + 1);
}

function verifyField(fieldId, errMessage, isRequired, fieldType, validClass, invalidClass)
{
	var ctl = document.getElementById(fieldId);
	
	// Make sure the specified field exists.
	if ( (ctl == null) || (ctl == undefined) )
		return "\nUnrecognized form element: '" + fieldId + "'.\n\n";

	var strFieldContents = trim(ctl.value);
	var strErrorMessage = "";
			
	switch(fieldType)
		{
		case 'personsName':
			strErrorMessage = validatePersonsName(strFieldContents, errMessage, isRequired);
			break;
							
		case 'age':
			strErrorMessage = validateAge(strFieldContents, errMessage, isRequired);
			break;
				
		case 'float':
			strErrorMessage = validateFloat(strFieldContents, errMessage, isRequired);
			break;
				
		case 'ssn':
			strErrorMessage = validateSSN(strFieldContents, errMessage, isRequired);
			break;
				
		case 'emailaddress':
			strErrorMessage = validateEmailAddress(strFieldContents, errMessage, isRequired);
			break;
		
		case 'phoneNumber':
			strErrorMessage = validatePhoneNumber(strFieldContents, errMessage, isRequired);
			break;

		case 'zipCode':
			strErrorMessage = validateZipCode(strFieldContents, errMessage, isRequired);
			break;

		case 'currency':
			strErrorMessage = validateCurrency(strFieldContents, errMessage, isRequired);
			break;

		case 'date':
			strErrorMessage = validateDate(strFieldContents, errMessage, isRequired);
			break;

		case 'dateOrCurrent':
			strErrorMessage = validateDateOrCurrent(strFieldContents, errMessage, isRequired);
			break;

		case 'birthdate':
			strErrorMessage = validateBirthDate(strFieldContents, errMessage, isRequired);
			break;

		case 'yearofbirth':
			strErrorMessage = validateYearOfBirth(strFieldContents, errMessage, isRequired);
			break;

		default:
			if (strFieldContents.length == 0)
				{
				if (isRequired)
					strErrorMessage = errMessage;
				else
					strErrorMessage = '';
				}
			break;
		}	// End switch(fieldType)
		
	if ( strErrorMessage.length )
		{
		if ( invalidClass )
			ctl.className = invalidClass;
		}
	else
		{
		if ( validClass )
			ctl.className = validClass;
		}

	return strErrorMessage;
	
}	// End verifyField()
