// ####################################################################################################
// ####################################################################################################
// Class: FormCheck
// Properties: Form, Debug
// Methods: IsBlank, IsDate, IsNumber, IsEmail, DateIsAfter, DateIsBefore, DateIsBetween, 
//					DateIsAfterToday, NumberIsAfter, NumberIsBefore, NumberIsBetween, 
//					MaxLength, ErrorsExist, ErrorMsg, Clear, GetValue, NowRequired,
//					IsUSPhone, IsUSZip, IsSSN, NumberIsAfterZero
//
// Version: 2.3  -- use method Version() for info
// Date: 4/4/2002, 6/30/2002, 7/3/2002, 9/16/2002, 9/17/2002, 9/26/2002
// Author: jesse house, function DateIsAfterToday, IsSSN, IsUSPhone, IsUSZip, NumberIsAfterZero added by ed pearson
// ####################################################################################################
// ####################################################################################################  


// constructor
function FormCheck(objForm, blnStateIsDebug)
{  
	
	// force call to new
  // if( !(this instanceof FormCheck) ) return new FormCheck( );
  
  // initialize
	this.Form = eval ('document.' + objForm);
	this.Debug = blnStateIsDebug;

	// public access
	this.Version = FormCheck_Version;
	this.NowRequired = FormCheck_NowRequired;
	this.Clear = FormCheck_Clear;
	this.IsBlank = FormCheck_IsBlank;
	this.IsEmail = FormCheck_IsEmail;
	this.IsNumber = FormCheck_IsNumber;
	this.IsDate = FormCheck_IsDate;
	this.DateIsAfter = FormCheck_DateIsAfter;
	this.DateIsBefore = FormCheck_DateIsBefore;
	this.DateIsBetween = FormCheck_DateIsBetween;
	this.DateIsAfterToday = FormCheck_DateIsAfterToday;
	this.DateIsBeforeToday = FormCheck_DateIsBeforeToday;
	this.NumberIsAfter = FormCheck_NumberIsAfter;
	this.NumberIsBefore = FormCheck_NumberIsBefore;
	this.NumberIsBetween = FormCheck_NumberIsBetween;
	this.MaxLength = FormCheck_MaxLength;
	this.GetValue = FormCheck_GetValue;
	this.IsSSN = FormCheck_IsSSN;
	this.IsUSPhone = FormCheck_IsUSPhone;
	this.IsUSZip = FormCheck_IsUSZip;
	this.NumberIsAfterZero = FormCheck_NumberIsAfterZero;

	this.ErrorMsg = FormCheck_ErrorMsg;
	this.FatalErrorMsg = FormCheck_FatalErrorMsg;
	this.ErrorsExist = FormCheck_ErrorsExist;
  
}; // END constructor

// private vars
var _errorMsg = "";
var _fatalErrorMsg = "";
var _errorsExist = false;
var _version = "Version 2.3 - FormCheck()\nLast Updated: 9/26/2002";

// *********************************************************
// *********************************************************
function FormCheck_Clear()
{
	// clear all error strings
	_errorMsg = "";
	_errorsExist = false;
	
}


// *********************************************************
// *********************************************************
function FormCheck_GetValue(sFormField)
{
	var sRv = GetFormValue(this.Form.elements[sFormField]);
	return sRv;
}



// *********************************************************
// *********************************************************
function FormCheck_MaxLength(sFormField, sString, iMaxLength)
{
	var bRv = false;
	var v = GetFormValue(this.Form.elements[sFormField]);
	var iLength = v.length;
	
	if (Number(iLength) > Number(iMaxLength))
	{
		_errorMsg = _errorMsg + "\n" + 	sString + " may contain only " + iMaxLength + " characters. You have entered " + iLength + " characters.";
	}
	else
	{
		bRv = true;
	}
	
	// set the error flag
	if (!bRv)
	{
		_errorsExist = true;
	}
	
	return bRv;
}


// *********************************************************
// *********************************************************
// NOTE: this func is passive.
// returns true if errors occur such as not valid numbers passed
// by design. 
// must be less than or equal to
function FormCheck_NumberIsBefore(n, sn, nBefore, snBefore)
{
	var bRv = true;
	var n1 = Number(GetFormValue(this.Form.elements[n]));
	var n2 = Number(GetFormValue(this.Form.elements[nBefore]));
	
	if ( (!isNaN(n1)) && (!isNaN(n2)) )
	{
		
		if (n1 <= n2)
		{
			bRv = true;
		}
		else
		{
			_errorMsg = _errorMsg + "\n" + 	sn + " must be smaller than " + snBefore + ".";
			bRv = false;
		} 
		
	}
	
	// set the error flag
	if (!bRv)
	{
		_errorsExist = true;
	}	
	
	return bRv;
}

// *********************************************************
// *********************************************************
// NOTE: this func is passive.
// returns true if errors occur such as not valid numbers passed
// by design. 
function FormCheck_NumberIsAfter(n, sn, nAfter, snAfter)
{
	var bRv = true;
	var n1 = Number(GetFormValue(this.Form.elements[n]));
	var n2 = Number(GetFormValue(this.Form.elements[nAfter]));
	
	
	if ( (!isNaN(n1)) && (!isNaN(n2)) )
	{
		// if n1 > n2 && n1 < n3
		if (n1 > n2)
		{
			bRv = true;
		}
		else
		{
			_errorMsg = _errorMsg + "\n" + 	sn + " must be larger than " + snAfter + ".";
			bRv = false;
		} 
		
	}
	
	// set the error flag
	if (!bRv)
	{
		_errorsExist = true;
	}	
	
	return bRv;
}

// *********************************************************
// *********************************************************
// NOTE: this func is passive.
// returns true if errors occur such as not valid numbers passed
// by design. 
function FormCheck_NumberIsBetween(n, sn, nBefore, snBefore, nAfter, snAfter)
{
	var bRv = true;
	var n1 = Number(GetFormValue(this.Form.elements[n]));
	var n2 = Number(GetFormValue(this.Form.elements[nBefore]));
	var n3 = Number(GetFormValue(this.Form.elements[nAfter]));
	
	
	if ( (!isNaN(n1)) && (!isNaN(n2)) && (!isNaN(n3)) )
	{
		// if n1 > n2 && n1 < n3
		if (n1 > n2 && n1 < n3)
		{
			bRv = true;
		}
		else
		{
			_errorMsg = _errorMsg + "\n" + 	sn + " must be between " + snBefore + " and " + snAfter + ".";
			bRv = false;
		} 
		
	}
	
	// set the error flag
	if (!bRv)
	{
		_errorsExist = true;
	}
		
	return bRv;
}

// *********************************************************
// *********************************************************
// NOTE: this func is passive.
// returns true if errors occur such as not valid dates passed
// by design. 
function FormCheck_DateIsBetween(d, sd, dBefore, sdBefore, dAfter, sdAfter)
{
	var bRv = true;
	var d1 = new Date(GetFormValue(this.Form.elements[d]));
	var d2 = new Date(GetFormValue(this.Form.elements[dBefore]));
	var d3 = new Date(GetFormValue(this.Form.elements[dAfter]));
	
	if ( (!isNaN(d1)) && (!isNaN(d2)) && (!isNaN(d3)) )
	{
		// if d1 > d2 && d1 < d3
		if (ConvertDateToSeconds(GetFormValue(this.Form.elements[d])) >= ConvertDateToSeconds(GetFormValue(this.Form.elements[dBefore])) && ConvertDateToSeconds(GetFormValue(this.Form.elements[d])) <= ConvertDateToSeconds(GetFormValue(this.Form.elements[dAfter])))
		{
			bRv = true;
		}
		else
		{
			// alert(ConvertDateToSeconds(GetFormValue(this.Form.elements[d])) + ', ' + ConvertDateToSeconds(GetFormValue(this.Form.elements[dBefore])) + ', ' + ConvertDateToSeconds(GetFormValue(this.Form.elements[d])) + ', ' + ConvertDateToSeconds(GetFormValue(this.Form.elements[dAfter])));
			_errorMsg = _errorMsg + "\n" + 	sd + " must occur between " + sdAfter + " and " + sdBefore + ".";
			bRv = false;
		} // END if (ConvertDateToSeconds(d) < ConvertDateToSeconds(dCheck))
		
	} // END if ( (!isNaN(d1)) && (!isNaN(d2)) )
	
	
	// set the error flag
	if (!bRv)
	{
		_errorsExist = true;
	}
	
	return bRv;
}

// *********************************************************
// *********************************************************
// NOTE: this func is passive.
// returns true if errors occur such as not valid dates passed
// by design. 
function FormCheck_DateIsBefore(d, sd, dCheck, sdCheck)
{
	var bRv = true;
	var d1 = new Date(GetFormValue(this.Form.elements[d]));
	var d2 = new Date(GetFormValue(this.Form.elements[dCheck]));
	
	if ( (!isNaN(d1)) && (!isNaN(d2)) )
	{
		if (ConvertDateToSeconds(GetFormValue(this.Form.elements[d])) <= ConvertDateToSeconds(GetFormValue(this.Form.elements[dCheck])))
		{
			bRv = true;
		}
		else
		{
			_errorMsg = _errorMsg + "\n" + 	sd + " must occur before " + sdCheck + ".";
			bRv = false;
		} // END if (ConvertDateToSeconds(d) < ConvertDateToSeconds(dCheck))
		
	} // END if ( (!isNaN(d1)) && (!isNaN(d2)) )
	
	// set the error flag
	if (!bRv)
	{
		_errorsExist = true;
	}	
	
	return bRv;
}

// *********************************************************
// *********************************************************
// NOTE: this func is passive.
// returns true if errors occur such as not valid dates passed
// by design. 
// raises error if d is before sdCheck; if d == dCheck then no error unless passing blnAfter as true
function FormCheck_DateIsAfter(d, sd, dCheck, sdCheck, blnAfter)
{
	var bRv = true;
	var d1 = new Date(GetFormValue(this.Form.elements[d]));
	var d2 = new Date(GetFormValue(this.Form.elements[dCheck]));

	if((!isNaN(d1)) && (!isNaN(d2)))	{
		if(blnAfter)	{	//checks if d1 is AFTER d2
			if(ConvertDateToSeconds(GetFormValue(this.Form.elements[d])) > ConvertDateToSeconds(GetFormValue(this.Form.elements[dCheck])))	{
				bRv = true;
			} else {
				_errorMsg = _errorMsg + "\n" + 	sd + " must occur after " + sdCheck + ".";
				bRv = false;
			}
		} else {	//checks if d1 is AFTER or EQUAL to d2
			if(ConvertDateToSeconds(GetFormValue(this.Form.elements[d])) >= ConvertDateToSeconds(GetFormValue(this.Form.elements[dCheck])))	{
				bRv = true;
			} else {
				_errorMsg = _errorMsg + "\n" + 	sd + " must occur after " + sdCheck + ".";
				bRv = false;
			}
		}
	}

	// set the error flag
	if(!bRv)
		_errorsExist = true;

	return bRv;
}


// *********************************************************
// *********************************************************
// If blnToday, then date is equal to or after today's date
// otherwise the date is after today's date & can't be equal to today's date

function FormCheck_DateIsAfterToday(d, sd, blnToday)
{
	var bRv = true;
	var d1 = new Date(GetFormValue(this.Form.elements[d]));
	var d2 = new Date();
	var dToday = d2.toLocaleString();

	if(!isNaN(d1))	{
		if(blnToday)	{
			if(ConvertDateToSeconds(GetFormValue(this.Form.elements[d])) >= ConvertDateToSeconds(dToday))	{
				//Date is equal to or greater than today's date then return true
				bRv = true;
			} else {
				_errorMsg = _errorMsg + "\n" + 	sd + " must occur after today's date.";
				bRv = false;
			}
		} else {
			if(ConvertDateToSeconds(GetFormValue(this.Form.elements[d])) > ConvertDateToSeconds(dToday))	{
				//Date is greater than today's date and NOT equal to today's date
				bRv = true;
			} else {
				_errorMsg = _errorMsg + "\n" + 	sd + " must occur after today's date.";
				bRv = false;
			}
		}
	}

	// set the error flag
	if (!bRv)
		_errorsExist = true;

	return bRv;
}

// *********************************************************
// *********************************************************

function FormCheck_DateIsBeforeToday(d, sd, blnFlag)
{
	var bRv = true;
	var d1 = new Date(GetFormValue(this.Form.elements[d]));
	var d2 = new Date();
	//var dToday = d2.toLocaleDateString();
	var dToday = d2.toLocaleString();

	if(!isNaN(d1))
	{
		if(blnFlag == 1)	{	//by passing 1 in the function, date can't be before today's date, but can be equal to today's date
			if(ConvertDateToSeconds(GetFormValue(this.Form.elements[d])) <= ConvertDateToSeconds(dToday))
			{
				bRv = true;
			} else {
				_errorMsg = _errorMsg + "\n" + 	sd + " can't occur after today's date.";
				bRv = false;
			} // END if (ConvertDateToSeconds(d) < ConvertDateToSeconds(dCheck))
		} else {
			if(ConvertDateToSeconds(GetFormValue(this.Form.elements[d])) < ConvertDateToSeconds(dToday))
			{
				bRv = true;
			} else {
				_errorMsg = _errorMsg + "\n" + 	sd + " must occur before today's date.";
				bRv = false;
			} // END if (ConvertDateToSeconds(d) < ConvertDateToSeconds(dCheck))
		}		
	}

	// set the error flag
	if (!bRv)
	{
		_errorsExist = true;
	}	

	return bRv;
}


// *********************************************************
// *********************************************************
function FormCheck_IsDate () 
{
	var i = 0;
	var k = 0;
	//var t = "";
	var blnNotDate = false;
		
	var arrFields = FormCheck_IsDate.arguments;
	var iArrayLength = (arrFields.length) 

	// loop through the function arguments
	// should be in format FieldName, ErrorLabel, FieldName, ErrorLabel, etc...
	for (i = 0; i < iArrayLength; i+=2 )
	{
		k = i + 1;
			
		// if this is an object check if it is blank
		if (this.Form.elements[arrFields[i]])
		{
			if ((! ValidateDate(GetFormValue(this.Form.elements[arrFields[i]]))) && (GetFormValue(this.Form.elements[arrFields[i]]) != ''))
			{
				_errorMsg = _errorMsg + "\n" + arrFields[k] + " must contain a date.";
				blnNotDate = true;
			}
		}
		else
		{
			if (this.Debug)
			{
				// we are in a state of debug throw error.
				alert("\nIsBlank: " + arrFields[i] + " is not a form object.");
			}
			else
			{
				// in production just log errs
				_fatalErrorMsg = _fatalErrorMsg + "\nIsDate: " + arrFields[i] + " is not a form object.";
			}
			// blnNotDate = true;
		}
		
	}

	// set the error flag
	if (blnNotDate)
	{
		_errorsExist = true;
	}
		
		
	return blnNotDate;
}	




// *********************************************************
// *********************************************************
function FormCheck_IsEmail () 
{
	var i = 0;
	var k = 0;
	//var t = "";
	var blnNotEmail = false;
		
	var arrFields = FormCheck_IsEmail.arguments;
	var iArrayLength = (arrFields.length) 

	// loop through the function arguments
	// should be in format FieldName, ErrorLabel, FieldName, ErrorLabel, etc...
	for (i = 0; i < iArrayLength; i+=2 )
	{
		k = i + 1;

		// if this is an object check if it is blank
		if(this.Form.elements[arrFields[i]])
		{
			if ((! ValidateEmail(GetFormValue(this.Form.elements[arrFields[i]]))) && (GetFormValue(this.Form.elements[arrFields[i]]) != ''))
			{
				_errorMsg = _errorMsg + "\n" + arrFields[k] + " must contain an email.";
				blnNotEmail = true;
			}
		}
		else
		{
			if (this.Debug)
			{
				// we are in a state of debug throw error.
				alert("\nIsEmail: " + arrFields[i] + " is not a form object.");
			}
			else
			{
				// in production just log errs
				_fatalErrorMsg = _fatalErrorMsg + "\nIsEmail: " + arrFields[i] + " is not a form object.";
			}
			// blnNotEmail = true;
		}
		
	}

	// set the error flag
	if (blnNotEmail)
	{
		_errorsExist = true;
	}
		
	return blnNotEmail;
}	
	
	
	

// *********************************************************
// *********************************************************
function FormCheck_NowRequired (sParentField, sEventValue) 
{
	var i = 0;
	var k = 0;
	var blnBlank = false;
	
	var sParentFieldValue = GetFormValue(this.Form.elements[sParentField]);
	
	// if the parent field has been set to a specific value 
	// then check that all other fields are not blank.
	if (CompareAsNumberAndAsString(sParentFieldValue, sEventValue))
	{
		var arrFields = FormCheck_NowRequired.arguments;
		var iArrayLength = (arrFields.length)
		
		// loop skip first 2 args
		for (i = 2; i < iArrayLength; i+=2 )
		{
			k = i + 1;
				
			// if this is an object check if it is blank
			if (this.Form.elements[arrFields[i]])
			{
				if (GetFormValue(this.Form.elements[arrFields[i]]) == '')
				{
					_errorMsg = _errorMsg + "\n" + arrFields[k] + " is blank.";
					blnBlank = true;
				} 
			} // END (this.Form.elements[arrFields[i]])
		}	// END for Loop
	} // END (sParentFieldValue == sEventValue)
	
	
	// set the error flag
	if (blnBlank)
	{
		_errorsExist = true;
	}
	
	return blnBlank;	
}



// *********************************************************
// *********************************************************
function FormCheck_IsBlank () 
{
	var i = 0;
	var k = 0;
	//var t = "";
	var blnBlank = false;
		
	var arrFields = FormCheck_IsBlank.arguments;
	var iArrayLength = (arrFields.length) //- 1;

	//alert("length: " + iArrayLength);

	//alert("this.Form.name is " + this.Form.name);

	// loop through the function arguments
	// should be in format FieldName, ErrorLabel, FieldName, ErrorLabel, etc...
	for (i = 0; i < iArrayLength; i+=2 )
	{
		k = i + 1;
			
		// if this is an object check if it is blank
		if (this.Form.elements[arrFields[i]])
		{
			if (GetFormValue(this.Form.elements[arrFields[i]]) == '')
			{
				_errorMsg = _errorMsg + "\n" + arrFields[k] + " is blank.";
				blnBlank = true;
			}
		}
		else
		{
			if (this.Debug)
			{
				// we are in a state of debug throw error.
				alert("\nIsBlank: " + arrFields[i] + " is not a form object.");
			}
			else
			{
				// in production just log errs
				_fatalErrorMsg = _fatalErrorMsg + "\nIsBlank: " + arrFields[i] + " is not a form object.";
			}
			// blnBlank = true;
		}
		
	}

	// set the error flag
	if (blnBlank)
	{
		_errorsExist = true;
	}
		
		
	return blnBlank;
}
  
// *********************************************************
// *********************************************************  
function FormCheck_IsNumber()
{
	var i = 0;
	var k = 0;

	var blnNotNumber = false;
		
	var arrFields = FormCheck_IsNumber.arguments;
	var iArrayLength = (arrFields.length);

	// loop through the function arguments
	// should be in format FieldName, ErrorLabel, FieldName, ErrorLabel, etc...
	for (i = 0; i < iArrayLength; i+=2 )
	{
		k = i + 1;

		// if this is an object check if it is blank
		if (this.Form.elements[arrFields[i]])
		{
			if ((! ValidateNumber(GetFormValue(this.Form.elements[arrFields[i]]))) && (GetFormValue(this.Form.elements[arrFields[i]]) != ''))
			{
				_errorMsg = _errorMsg + "\n" + arrFields[k] + " must be numeric.";
				blnNotNumber = true;
			}
		}
		else
		{
			if (this.Debug)
			{
				// we are in a state of debug throw error.
				alert("\nIsNumber: " + arrFields[i] + " is not a form object.");
			}
			else
			{
				// in production just log errs
				_fatalErrorMsg = _fatalErrorMsg + "\nIsNumber: " + arrFields[i] + " is not a form object.";
			}
			blnNotEmail = true;
		}
		
	}

	// set the error flag
	if (blnNotNumber)
	{
		_errorsExist = true;
	} else {
		//this sets the value to be numeric. Previously, entering this: ( 15.50xxxx ) would still submit; this converts it to this value: 15.50
		
		// remove any commas that may have been added (bug fix)
		var iLength = GetFormValue(this.Form.elements[arrFields[0]]).length;
		var c_COMMA = ",";
		var iNumber = GetFormValue(this.Form.elements[arrFields[0]]);
		var tmpNumber = "";

		for(x = 0; x < iLength; x++)	{
			if(iNumber.charAt(x) != c_COMMA)	{
				tmpNumber += iNumber.charAt(x);
			}
		}
		iNumber = tmpNumber;

		this.Form.elements[arrFields[0]].value = parseFloat(iNumber);

		if(this.Form.elements[arrFields[0]].value == 'NaN')
			this.Form.elements[arrFields[0]].value = '';
	}

	return blnNotNumber;  
}
  
  
  
// *********************************************************
// *********************************************************
function FormCheck_Version()
{
	return _version;	
}

// *********************************************************
// *********************************************************
function FormCheck_ErrorsExist()
{
	var bReturn = false;
		
	if (_errorsExist)
	{
		bReturn = true;
	}
		
	return bReturn;	
}
  
// *********************************************************
// *********************************************************
function FormCheck_FatalErrorMsg()
{
	var sReturn = "";
		
	// return the fatal err string if it is not blank
	if (_fatalErrorMsg != '')
	{
		sReturn = _version + "\n\n" + _fatalErrorMsg;	
	}
	else
	{
		sReturn = "";
	}
		
	return sReturn;
}
  
    
// *********************************************************
// *********************************************************
function FormCheck_ErrorMsg()
{
	var sRv = _errorMsg;
	
	// clear the error msg 
	// sticky in netscape 4
	_errorMsg = "";
	
	return sRv;	
}  
  
// *********************************************************
// *********************************************************
// PRIVATE FUNCTIONS
// *********************************************************
// ********************************************************* 
function ValidateEmail(s)
{
	var s2; 
	var emailReturn = true;
	
	// email without @ 
	if (s.indexOf('@') == -1)
		emailReturn = false; 
	// email with @ as the 1st char 
	if (s.indexOf('@') == 0)
		emailReturn = false; 
	// email with @ as the last char 
	if ((s.indexOf('@')+1) == s.length)
		emailReturn = false; 
	// email without . 
	if (s.indexOf('.') == -1)
		emailReturn = false; 
	// email with . as the 1st char 
	if (s.indexOf('.') == 0)
		emailReturn = false; 
	// email with . as the last char 
	if ((s.indexOf('.')+1) == s.length)
		emailReturn = false; 

	// Now look for the first . after the first @ 
	// s2 = string after the first @ 
	s2=s.substring(s.indexOf('@')+1,s.length); 
	
	// email without a dot after the first @ 
	if (s2.indexOf('.') == -1)
		emailReturn = false; 
	// email dot right after the first @ 
	if (s2.indexOf('.') == 0)
		emailReturn = false; 
	
	return emailReturn; 
}
  
// *********************************************************
// ********************************************************* 
function ValidateNumber(aNumber)
{
	var intTemp;
	var numReturn = true;

	intTemp = parseFloat(aNumber);

	if(isNaN(intTemp))
	{
		numReturn = false;
	}

	return numReturn;
}


// *********************************************************
// ********************************************************* 
function ValidateDate(vData)
{
	var bRv = false;						// function return value
	var d = new Date(vData);		// date pased 
	var t = new String(vData);	// date as a string
	var a;											// array to hold string parts
	var l;											// string to hold delimitor
	var sMonth;									// string to hold month from string
	
	
	if (! isNaN(d))
	{
	
		// this is a valid date
		// but they may have entered 2/29/2002 - the date is now 3/1/2002
		if ((t.search ("/")) > 0)
		{
			l = "/";
		}
		else if  ((t.search ("-")) > 0)
		{
			// NOTE: Netscape 4.x will does not think 2-2-2002 is a date, will never get here
			l = "-";
		}
		else
		{
			// some other date format ok
			bRv = true;
		}
		
		// if still not valid split on delimitor
		if (!bRv)
		{
			a = t.split (l);
			
			if (a.length > 2)
			{
				sMonth = a[0];
				if ((sMonth - 1) == d.getMonth () && (a[2].length == 2 || a[2].length == 4))
				{
					bRv = true;
				}
			} // END if (a.length > 2)
		} // END if (!bRv)
	}	// END if (! isNaN(d))
	
	return bRv;
}
  


// *********************************************************
// *********************************************************
function FormCheck_IsSSN(sFormField, sString)	{
	var bRv = true;
	var strSSN = GetFormValue(this.Form.elements[sFormField]);
	var isNum = true;

	if(strSSN.length > 11)	{
		bRv = false;
		_errorMsg += "\n" + 	sString + " has too many characters.";
	}

	if(strSSN.length < 11 && strSSN.length > 0)	{
		bRv = false;
		_errorMsg += "\n" + 	sString + " doesn't have enough characters.";
	}

	for(x = 0; x < strSSN.length; x++)	{
		var goodChar = false;

		if(x == 3 && strSSN.charAt(x) == '-')
			goodChar = true;
		if(x == 6 && strSSN.charAt(x) == '-')
			goodChar = true;

		if(isNaN(parseInt(strSSN.charAt(x))))	{
			if(!goodChar)	{
				bRv = false;
				isNum = false;
			}
		}
	}
		
	if(!isNum)
		_errorMsg += "\n" + 	sString + " must be numeric and contain two dashes.";

	// set the error flag
	if(!bRv)
		_errorsExist = true;

	return bRv;
}


// *********************************************************
// *********************************************************
function FormCheck_IsUSPhone(sFormField, sString)	{
	var bRv = true;
	var strPhone = GetFormValue(this.Form.elements[sFormField]);
	var iStrLength = 14;	//format is 14 characters like so: (xxx) xxx-xxxx

	if(strPhone.length > 0)	{
		for(x = 0; x < iStrLength; x++)	{
			var goodChar = false;

			if(x == 0 && strPhone.charAt(x) == '(')
				goodChar = true;
			if(x == 4 && strPhone.charAt(x) == ')')
				goodChar = true;
			if(x == 5 && strPhone.charAt(x) == ' ')
				goodChar = true;
			if(x == 9 && strPhone.charAt(x) == '-')
				goodChar = true;

			if(isNaN(parseInt(strPhone.charAt(x))))	{
				if(!goodChar)	{
					bRv = false;
				}
			}
		}
	}

	// set the error flag
	if(!bRv)	{
		_errorsExist = true;
		_errorMsg += "\n" + 	sString + " must contain numeric characters and be in this format: (xxx) xxx-xxxx";
	}

	return bRv;
}


// *********************************************************
// *********************************************************
function FormCheck_IsUSZip(sFormField, sString)	{
	var bRv = true;
	var strZip = GetFormValue(this.Form.elements[sFormField]);

	for(x = 0; x < strZip.length; x++)	{
		var goodChar = false;

		if(x == 5 && strZip.charAt(x) == '-')
			goodChar = true;

		if(isNaN(parseInt(strZip.charAt(x))))	{
			if(!goodChar)
				bRv = false;
		}
	}

	// set the error flag
	if(!bRv)	{
		_errorsExist = true;
		_errorMsg += "\n" + 	sString + " must contain numeric characters and must be in\neither of these formats: 12345 or 12345-6789\n";
	}

	return bRv;
}

// ****************************************************************
// ****************************************************************
// private function that returns the value of a form field
function GetFormValue(o)
{
	var vValue;
		
	// set the value - could be select type or could be other.
	// add code later for select-multiple
	if (o == null)
	{
		vValue = '';
	}
	else
	{
		if (o.type == 'select-one')
		{
			vValue = o.options[o.selectedIndex].value;
		}
		//else if (o.type == 'checkbox')
		//{
		//	vValue = o.value;
		//}
		else
		{
			// alert ("Type: " + o.type + " value: " + o.value);
			vValue = o.value;
		}	
	}

		
	return vValue;
}


// ****************************************************************
// ****************************************************************
function CompareAsNumberAndAsString(vValueOne, vValueTwo)
{
	var bRv = false;
	var n1 = Number(vValueOne);
	var n2 = Number(vValueTwo);
	
	
	if ( (!isNaN(n1)) && (!isNaN(n2)) )
	{
		// they are both numbers compare
		if (n1 == n2)
		{
			bRv = true;
		}
	}
	else if (vValueOne.toLowerCase == vValueTwo.toLowerCase)
	{
		bRv = true;
	}
	
	return bRv;
}

// ****************************************************************
// ****************************************************************
// takes a date, creates to vars from it.
// one of type date, one of type string
// if not sure of year 2000, then uses string manipulation to determine
function ConvertDateToSeconds(vData)
{
	var iRv = 0;
	
	// relies on this being validated already
	var dDate = new Date(vData);
	var s = new String(vData);
	
	var dYear = dDate.getFullYear();
	var dMonth = dDate.getMonth ();
	var dMonthDay = dDate.getDate ();
	var sYear;
	var l;
	var a;
	

	// the year is a pain
	// if less than 1970 may need to be converted to 2000
	if (dYear < 1970)	
	{
		if ((s.search ("/")) > 0)
		{
			l = "/";
		}
		else if  ((s.search ("-")) > 0)
		{
			l = "-";
		}
		else
		{		
			l = "XXXXXXXXXXXXXXXXXXXXXXXXXXX"; // FATAL Error if this happens
		}
		
		a = s.split (l);
		if (a.length > 2)
		{
			sYear = a[2];
		}
		else
		{
			sYear = 0;
		}
		
		// add 2000 to this year, it is < 1970 and only 2 chars long.
		if (sYear < 100)
		{
			sYear = Number(sYear) + 2000;
		}
	}
	else
	{
		sYear = dYear;
	}


	var dDateToCheck = new Date(sYear, dMonth, dMonthDay);
	var iRv = dDateToCheck.getTime();
	
	return Number(iRv)
}


// *********************************************************
// *********************************************************
// NOTE: this func is passive.
// returns true if number passed is greater than zero
// If blnMoney is true, than number must be greater than or equal to $0.01 (or one cent)
// If blnMoney is false, we check non-money values if they're greater than 0
function FormCheck_NumberIsAfterZero(n, sn, blnMoney, blnCustomMsg, sCustomMsg)
{
	var bRv = true;
	var n1 = Number(GetFormValue(this.Form.elements[n]));

	if(!isNaN(n1))	{
		if(blnMoney)	{
			if(n1 >= 0.01)	{
				bRv = true;
			} else {
				if(blnCustomMsg)
					_errorMsg += "\n" + 	sCustomMsg;
				else
					_errorMsg += "\n" + 	sn + " must be larger than $0.01.";

				bRv = false;
			}
		} else {
			if(n1 > 0)	{
				bRv = true;
			} else {
				if(blnCustomMsg)
					_errorMsg += "\n" + 	sCustomMsg;
				else
					_errorMsg += "\n" + 	sn + " must be larger than zero.";

				bRv = false;
			}
		}
	} else {
		_errorMsg += "\n" + 	sn + " must be a monetary value.";
		bRv = false;
	}

	//Set the error flag
	if (!bRv)
		_errorsExist = true;

	return bRv;
}

// ####################################################################################################
// ####################################################################################################
// ####################################################################################################
// ####################################################################################################  

