//--------------------------------------
//file:		lib_c_validate.js
//for:		validation for forms, client-side javascript version
//mods:
//09/20/00 16:11 JC Lango, created
//04/06/01 15:20 JC Lango, new validation based on types
//04/10/01 09:58 Bob Henry, added c_FormatCurrency
//04/20/01 15:26 Bob Henry, added c_PersonDOBAge
//04/20/01 15:26 Bob Henry, updated c_FormatCurrency to include .00
//04/20/01 15:26 Bob Henry, added c_FormatCurrency
//04/23/01 14:53 Bob Henry, updated c_PersonDOBAge
//05/04/01 12:22 Bob Henry, updated c_PersonDOBAge (for leap years)
//06/12/01 15:27 Bob Henry, added c_FormatYear
//06/13/01 13:56 JC Lango, renamed from validate_client.js
//06/15/01 18:48 JC Lango, changed c_FormatInteger to set 0 to blank
//06/18/01 12:01 JC Lango, c_DateFromParts return 0 if any part 0
//06/18/01 17:10 JC Lango, changed getYear to getFullYear to fix NS
//06/21/01 11:10 Bob Henry, updated to match lib_c_validate.asp
//06/25/01 11:39 Bob Henry, updated c_FormatYear for 2 digit years
//08/31/01 19:03 Bob Henry, added c_FormatIntegerZero
//09/12/01 10:27 Bob Henry, updated c_FormatIntegerZero to allow blank
//09/27/01 10:46 Bob Henry, added c_FormatTextArea
//10/01/01 14:58 Bob Henry, added TextArea Min and Max
//10/05/01 17:30 JC Lango, password format & validation
//10/10/01 11:56 JC Lango, changed password format & validation
//10/16/01 12:22 Bob Henry, added c_FormatCurrencyComma
//11/07/01 11:47 JC Lango, added eFldUrl & stuff for it
//11/13/01 11:44 Bob Henry, added eFldDecimal to call c_FormatDecimal that already existed
//11/14/01 11:59 Bob Henry, added same char check to SSN and Phone validate
//03/06/02 15:42 Bob Henry, added c_FormatNumeric to support leading zero numeric
//03/07/02 10:38 Bob Henry, cleanup of c_FormatIntegerZero and c_FormatNumeric
//03/27/02 11:04 Bob Henry, fixed c_FormatIntegerZero to not zero prefill
//02/21/03 14:24 R Stewart, updated email validation
//04/10/03 9:57 R Stewart, added "=" to phone validation to fix issues

//--------------------------------------
//NOTE:		keep source in synch with lib_c_validate.asp
//--------------------------------------
//global variables for validation

//validation type enums
var eFldFirstName=1;
var eFldMiddleName=2;
var eFldLastName=3;
var eFldEntityName=4;
var eFldAddress=5;
var eFldCity=6;
var eFldState=7;
var eFldZip=8;
var eFldCounty=9;
var eFldCountry=10;
var eFldPhoneUSA=11;
var eFldEmail=12;
var eFldSSN=13;
var eFldDOB=14;
var eFldInteger=15;			//integer or blank if zero
var eFldYear=16;
var eFldIntegerZero=17;		//integer and zero if zero
var eFldTextArea=18;
var eFldPassword=19;
var eFldUrl=20;
var eFldDecimal=21;			//numeric with decimal places
var eFldNumeric=22;			//leading zero numeric

function c_FieldMin(iType){
	if(iType==eFldFirstName)
		return(g_lcPersonFirstNameMin);
	if(iType==eFldMiddleName)
		return(g_lcPersonMiddleNameMin);
	if(iType==eFldLastName)
		return(g_lcPersonLastNameMin);
	if(iType==eFldEntityName)
		return(g_lcEntityNameMin);
	if(iType==eFldAddress)
		return(g_lcEntityAddressMin);
	if(iType==eFldCity)
		return(g_lcEntityCityMin);
	if(iType==eFldState)
		return(g_lcEntityStateMin);
	if(iType==eFldZip)
		return(g_lcEntityZipMin);
	if(iType==eFldCounty)
		return(g_lcEntityCountyMin);
	if(iType==eFldCountry)
		return(g_lcEntityCountryMin);
	if(iType==eFldEmail)
		return(g_lcEntityEmailMin);
	if(iType==eFldPhoneUSA)
		return(g_lcEntityPhoneUSAMin);
	if(iType==eFldSSN)
		return(g_lcPersonSSNMin);
	if(iType==eFldDOB)
		return(g_lcPersonDOBMin);
	if(iType==eFldYear)
		return(g_lcYearMin);
	if(iType==eFldTextArea)
		return(g_lcTextAreaMin);
	if(iType==eFldPassword)
		return(g_lcPasswordMin);
	if(iType==eFldUrl)
		return(g_lcUrlMin);
	return(g_lcResultSuccess);
}

function c_FieldMax(iType){
	if(iType==eFldFirstName)
		return(g_lcPersonFirstNameMax);
	if(iType==eFldMiddleName)
		return(g_lcPersonMiddleNameMax);
	if(iType==eFldLastName)
		return(g_lcPersonLastNameMax);
	if(iType==eFldEntityName)
		return(g_lcEntityNameMax);
	if(iType==eFldAddress)
		return(g_lcEntityAddressMax);
	if(iType==eFldCity)
		return(g_lcEntityCityMax);
	if(iType==eFldState)
		return(g_lcEntityStateMax);
	if(iType==eFldZip)
		return(g_lcEntityZipMax);
	if(iType==eFldCounty)
		return(g_lcEntityCountyMax);
	if(iType==eFldCountry)
		return(g_lcEntityCountryMax);
	if(iType==eFldEmail)
		return(g_lcEntityEmailMax);
	if(iType==eFldPhoneUSA)
		return(g_lcEntityPhoneUSAMax);
	if(iType==eFldSSN)
		return(g_lcPersonSSNMax);
	if(iType==eFldDOB)
		return(g_lcPersonDOBMax);
	if(iType==eFldYear)
		return(g_lcYearMax);
	if(iType==eFldTextArea)
		return(g_lcTextAreaMax);
	if(iType==eFldPassword)
		return(g_lcPasswordMax);
	if(iType==eFldUrl)
		return(g_lcUrlMax);
	return(g_lcResultSuccess);
}

function c_ResultInvalid(iType){
	if(iType==eFldFirstName)
		return(g_lcResultPersonFirstNameInvalid);
	if(iType==eFldMiddleName)
		return(g_lcResultPersonMiddleNameInvalid);
	if(iType==eFldLastName)
		return(g_lcResultPersonLastNameInvalid);
	if(iType==eFldEntityName)
		return(g_lcResultEntityNameInvalid);
	if(iType==eFldAddress)
		return(g_lcResultEntityAddressInvalid);
	if(iType==eFldCity)
		return(g_lcResultEntityCityInvalid);
	if(iType==eFldState)
		return(g_lcResultEntityStateInvalid);
	if(iType==eFldZip)
		return(g_lcResultEntityZipInvalid);
	if(iType==eFldCounty)
		return(g_lcResultEntityCountyInvalid);
	if(iType==eFldCountry)
		return(g_lcResultEntityCountryInvalid);
	if(iType==eFldEmail)
		return(g_lcResultEntityEmailInvalid);
	if(iType==eFldPhoneUSA)
		return(g_lcResultEntityPhoneUSAInvalid);
	if(iType==eFldSSN)
		return(g_lcResultPersonSSNInvalid);
	if(iType==eFldDOB)
		return(g_lcResultPersonDOBInvalid);
	if(iType==eFldYear)
		return(g_lcResultYearInvalid);
	if(iType==eFldTextArea)
		return(g_lcResultTextAreaInvalid);
	if(iType==eFldPassword)
		return(g_lcResultPasswordInvalid);
	if(iType==eFldUrl)
		return(g_lcResultUrlInvalid);
	return(g_lcResultSuccess);
}

function c_ResultTooShort(iType){
	if(iType==eFldFirstName)
		return(g_lcResultPersonFirstNameTooShort);
	if(iType==eFldMiddleName)
		return(g_lcResultPersonMiddleNameTooShort);
	if(iType==eFldLastName)
		return(g_lcResultPersonLastNameTooShort);
	if(iType==eFldEntityName)
		return(g_lcResultEntityNameTooShort);
	if(iType==eFldAddress)
		return(g_lcResultEntityAddressTooShort);
	if(iType==eFldCity)
		return(g_lcResultEntityCityTooShort);
	if(iType==eFldState)
		return(g_lcResultEntityStateTooShort);
	if(iType==eFldZip)
		return(g_lcResultEntityZipTooShort);
	if(iType==eFldCounty)
		return(g_lcResultEntityCountyTooShort);
	if(iType==eFldCountry)
		return(g_lcResultEntityCountryTooShort);
	if(iType==eFldEmail)
		return(g_lcResultEntityEmailTooShort);
	if(iType==eFldPhoneUSA)
		return(g_lcResultEntityPhoneUSATooShort);
	if(iType==eFldSSN)
		return(g_lcResultPersonSSNTooShort);
	if(iType==eFldDOB)
		return(g_lcResultPersonDOBTooShort);
	if(iType==eFldYear)
		return(g_lcResultYearTooShort);
	if(iType==eFldTextArea)
		return(g_lcResultTextAreaTooShort);
	if(iType==eFldPassword)
		return(g_lcResultPasswordTooShort);
	if(iType==eFldUrl)
		return(g_lcResultUrlTooShort);
	return(g_lcResultSuccess);
}

function c_ResultTooLong(iType){
	if(iType==eFldFirstName)
		return(g_lcResultPersonFirstNameTooLong);
	if(iType==eFldMiddleName)
		return(g_lcResultPersonMiddleNameTooLong);
	if(iType==eFldLastName)
		return(g_lcResultPersonLastNameTooLong);
	if(iType==eFldEntityName)
		return(g_lcResultEntityNameTooLong);
	if(iType==eFldAddress)
		return(g_lcResultEntityAddressTooLong);
	if(iType==eFldCity)
		return(g_lcResultEntityCityTooLong);
	if(iType==eFldState)
		return(g_lcResultEntityStateTooLong);
	if(iType==eFldZip)
		return(g_lcResultEntityZipTooLong);
	if(iType==eFldCounty)
		return(g_lcResultEntityCountyTooLong);
	if(iType==eFldCountry)
		return(g_lcResultEntityCountryTooLong);
	if(iType==eFldEmail)
		return(g_lcResultEntityEmailTooLong);
	if(iType==eFldPhoneUSA)
		return(g_lcResultEntityPhoneUSATooLong);
	if(iType==eFldSSN)
		return(g_lcResultPersonSSNTooLong);
	if(iType==eFldDOB)
		return(g_lcResultPersonDOBTooLong);
	if(iType==eFldYear)
		return(g_lcResultYearTooLong);
	if(iType==eFldTextArea)
		return(g_lcResultTextAreaTooLong);
	if(iType==eFldPassword)
		return(g_lcResultPasswordTooLong);
	if(iType==eFldUrl)
		return(g_lcResultUrlTooLong);
	return(g_lcResultSuccess);
}

//format form field text according to field type enum
function c_FormatText(sText,iType){
	if(iType==eFldFirstName)
		return(c_PersonFirstNameFormat(sText));
	if(iType==eFldMiddleName)
		return(c_PersonMiddleNameFormat(sText));
	if(iType==eFldLastName)
		return(c_PersonLastNameFormat(sText));
	if(iType==eFldEntityName)
		return(c_EntityNameFormat(sText));
	if(iType==eFldAddress)
		return(c_EntityAddressFormat(sText));
	if(iType==eFldCity)
		return(c_EntityCityFormat(sText));
	if(iType==eFldState)
		return(c_EntityStateFormat(sText));
	if(iType==eFldZip)
		return(c_EntityZipFormat(sText));
	if(iType==eFldCounty)
		return(c_EntityCountyFormat(sText));
	if(iType==eFldCountry)
		return(c_EntityCountryFormat(sText));
	if(iType==eFldEmail)
		return(c_EntityEmailFormat(sText));
	if(iType==eFldPhoneUSA)
		return(c_EntityPhoneUSAFormat(sText));
	if(iType==eFldSSN)
		return(c_PersonSSNFormat(sText));
	if(iType==eFldInteger)
		return(c_FormatInteger(sText));
	if(iType==eFldYear)
		return(c_FormatYear(sText));
	if(iType==eFldIntegerZero)
		return(c_FormatIntegerZero(sText));
	if(iType==eFldTextArea)
		return(c_FormatTextArea(sText));
	if(iType==eFldPassword)
		return(c_FormatPassword(sText));
	if(iType==eFldUrl)
		return(c_UrlFormat(sText));
	if(iType==eFldDecimal)
		return(c_FormatDecimal(sText));
	if(iType==eFldNumeric)
		return(c_FormatNumeric(sText));
	return(sText);
}

//validate form field text according to field type enum
function c_ValidateText(sText,iType){
	if(iType==eFldFirstName)
		return(c_PersonFirstNameValidate(sText));
	if(iType==eFldMiddleName)
		return(c_PersonMiddleNameValidate(sText));
	if(iType==eFldLastName)
		return(c_PersonLastNameValidate(sText));
	if(iType==eFldEntityName)
		return(c_EntityNameValidate(sText));
	if(iType==eFldAddress)
		return(c_EntityAddressValidate(sText));
	if(iType==eFldCity)
		return(c_EntityCityValidate(sText));
	if(iType==eFldState)
		return(c_EntityStateValidate(sText));
	if(iType==eFldZip)
		return(c_EntityZipValidate(sText));
	if(iType==eFldCounty)
		return(c_EntityCountyValidate(sText));
	if(iType==eFldCountry)
		return(c_EntityCountryValidate(sText));
	if(iType==eFldEmail)
		return(c_EntityEmailValidate(sText));
	if(iType==eFldPhoneUSA)
		return(c_EntityPhoneUSAValidate(sText));
	if(iType==eFldSSN)
		return(c_PersonSSNValidate(sText));
	if(iType==eFldDOB)
		return(c_PersonDOBValidate(sText));
	if(iType==eFldYear)
		return(c_YearValidate(sText));
	if(iType==eFldTextArea)
		return(c_TextAreaValidate(sText));
	if(iType==eFldPassword)
		return(c_ValidatePassword(sText));
	if(iType==eFldUrl)
		return(c_UrlValidate(sText));
	return(g_lcResultSuccess);
}

function c_SizeText(sText,iSize){
//convert text string to given maximum length
	if(sText.length>iSize)
		sText=sText.substr(0,iSize)			
	return(sText);	
}

function c_SloppyAlpha(sTemp){
	if(sTemp.length==0)
		return(sTemp);
	sTemp=sTemp.replace(/0/,"O");
	sTemp=sTemp.replace(/1/,"l");
	sTemp=sTemp.replace(/2/,"Z");
	sTemp=sTemp.replace(/5/,"S");
	sTemp=sTemp.replace(/6/,"b");
	sTemp=sTemp.replace(/8/,"B");
	sTemp=sTemp.replace(/9/,"q");
	return(sTemp);
}

function c_SloppyNumeric(sTemp){
	if(sTemp.length==0)
		return(sTemp);
	sTemp=sTemp.replace(/b/,"6");
	sTemp=sTemp.replace(/B/,"8");
	sTemp=sTemp.replace(/i/,"1");
	sTemp=sTemp.replace(/I/,"1");
	sTemp=sTemp.replace(/o/,"0");
	sTemp=sTemp.replace(/O/,"0");
	sTemp=sTemp.replace(/l/,"1");
	sTemp=sTemp.replace(/L/,"1");
	return(sTemp);
}

function c_TrimText(sText){
//remove leading & trailing spaces and inner multiple spaces
	var i;
	var sTmp="";
	var bIsLeading=true;
	var bIsKeep;
	var bIsLastWasSpace=false;
	for(i=0;i<sText.length;i++){
		bIsKeep=true;
		if(sText.charAt(i)==" "){
			if(bIsLastWasSpace)
				bIsKeep=false;
			if(bIsLeading==true)
				bIsKeep=false;
			if(bIsKeep)
				bIsLastWasSpace=true;
		}
		else{
			bIsLastWasSpace=false;
			bIsLeading=false;
		}
		if(bIsKeep)
			sTmp=sTmp+sText.charAt(i);
	}
	if(sTmp.charAt(sTmp.length-1)==" ")
		sTmp=sTmp.substr(0,sTmp.length-1);
	return(sTmp);	
}

function c_TrimAlphaText(sText){
//convert text string to contain only alphabet characters
	var i;
	var sTmp="";
	for(i=0;i<sText.length;i++)
		if(c_IsAlpha(sText.charAt(i)))
			sTmp=sTmp+sText.charAt(i);
	return(sTmp);	
}

function c_TrimNumberText(sText){
//convert text string to string containing only numbers
	var i;
	var sTmp="";
	for(i=0;i<sText.length;i++)
		if(c_IsNumeric(sText.charAt(i)))
			sTmp=sTmp+sText.charAt(i);
	return(sTmp);	
}

function c_TrimAlphaNumericText(sText){
//convert text string to contain only alphabet or numeric characters or space
	var i;
	var sTmp="";
	for(i=0;i<sText.length;i++)
		if(c_IsAlphaNumeric(sText.charAt(i)))
			sTmp=sTmp+sText.charAt(i);
	return(sTmp);	
}

function c_TrimAlphaNumericOrSpaceText(sText){
//convert text string to contain only alphabet or numeric characters or space
	var i;
	var sTmp="";
	for(i=0;i<sText.length;i++)
		if(c_IsAlphaNumeric(sText.charAt(i))||(sText.charAt(i)==" "))
			sTmp=sTmp+sText.charAt(i);
	return(sTmp);	
}

function c_TrimSafeText(sText){
//convert text string to contain only safe characters
	var i;
	var sTmp="";
	for(i=0;i<sText.length;i++)
		if(c_IsValidText(g_scSafeCharacters,sText.charAt(i)))
			sTmp=sTmp+sText.charAt(i);
	return(sTmp);	
}

function c_TrimNoScriptText(sText){
//convert text string to remove potential script tags
	var i;
	var sTmp="";
	var re;
	sTmp=c_TrimText(sText);
	re=/\s/;	//non white space
	sTmp=sTmp.replace(re," ");
	re=/script/;
	sTmp=sTmp.replace(re,"");
	return(sTmp);	
}

function c_TrimValidText(sValid,sText){
//convert string to contain only characters found in given valid string
	var i;
	var sTmp="";
	for(i=0;i<sText.length;i++)
		if(c_IsValidText(sValid,sText.charAt(i)))
			sTmp=sTmp+sText.charAt(i);
	return(sTmp);	
}

function c_IsValidText(sValid,sText){
//true=contains only characters found in given valid string
	var i;
	for(i=0;i<sText.length;i++)
		if(sValid.indexOf(sText.charAt(i))==-1)
			return(false);
	return(true);
}

function c_IsAlphaNumeric(sText){
//true=contains only alpha or numeric
	var i;
	for(i=0;i<sText.length;i++)
		if("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".indexOf(sText.charAt(i))==-1)
			return(false);
	return(true);
}

function c_IsAlpha(sText){
//true=contains only alpha
	var i;
	for(i=0;i<sText.length;i++)
		if("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(sText.charAt(i))==-1)
			return(false);
	return(true);
}

function c_IsNumeric(sText){
//true=contains only numeric
	var i;
	for(i=0;i<sText.length;i++)
		if("1234567890".indexOf(sText.charAt(i))==-1)
			return(false);
	return(true);
}

function c_FormatInteger(sText){
//convert text string to string containing only the integer value
//and returns a blank if it is zero
    var i;
	var sTmp="";
	for(i=0;i<sText.length;i++)
		if(c_IsNumeric(sText.charAt(i))||(sText.charAt(i)=="."))
			sTmp=sTmp+sText.charAt(i);
	sTmp=Math.round(sTmp);
	if(sTmp==0)
		sTmp="";
	return(sTmp);	
}

function c_FormatIntegerZero(sText){
//convert text string to string containing only the integer value
//and returns a zero if it is zero
    var i;
	var sTmp="";
	for(i=0;i<sText.length;i++)
		if(c_IsNumeric(sText.charAt(i))||(sText.charAt(i)=="."))
			sTmp=sTmp+sText.charAt(i);
	if(sTmp.length>0)
		sTmp=Math.round(sTmp);
	return(sTmp);	
}

function c_FormatNumeric(sText){
//convert text string to string containing only numerics
//allows for leading zeros to support account number type fields
	return(c_TrimNumberText(sText));
}

function c_FormatTextArea(sText){
//convert text string to string containing only valid chars and "CrLf"
	sText=c_TrimValidText(g_scValidTextArea,sText);
	sText=c_TrimText(sText);
	return(sText);	
}

function c_TextAreaValidate(sText){
	if(sText.length<g_lcTextAreaMin)
		return(g_lcResultTextAreaTooShort);
	if(sText.length>g_lcTextAreaMax)
		return(g_lcResultTextAreaTooLong);
	return(g_lcResultSuccess);
}

function c_FormatDecimal(sText){
//convert text string to string containing a decimal number like money
	var i;
	var sTmp="";
	for(i=0;i<sText.length;i++)
		if(c_IsNumeric(sText.charAt(i))||(sText.charAt(i)=="."))
			sTmp=sTmp+sText.charAt(i);
	return(sTmp);	
}

function c_FormatCurrency(expr,decplaces){
//convert text string to string containing specified number of decimal places
	var str = (Math.round(parseFloat(expr) * Math.pow(10,decplaces))).toString();
		while (str.length <= decplaces) {
			str = "0" + str;
		}
	var decpoint = str.length - decplaces;
	return str.substring(0,decpoint) + "." + str.substring(decpoint,str.length);
}

function c_FormatCurrencyComma(number,decplaces){
// decplaces = "yes" to have 2, otherwise there is none
//	var num = new String(number);
	var num = (number);
	if(num.indexOf(".") == -1) {
		intLen = num.length;
		toEnd = intLen;
		var strLeft = new String(num.substring(0, toEnd));
		var strRight = new String("00");
	}
	else {
		pos = eval(num.indexOf("."));
		var strLeft = new String(num.substring(0, pos));
		intToEnd = num.length;
		intThing = pos + 1;
		var strRight = new String(num.substring(intThing, intToEnd));
			
		if(strRight.length > 2) {
			nextInt = strRight.charAt(2);
			if (nextInt >= 5) {
				strRight = new String(strRight.substring(0, 2));
				strRight = new String(eval((strRight * 1) + 1));
				if((strRight * 1) >= 100) {
					strRight = "00";
					strLeft = new String(eval((strLeft * 1) + 1));
				}				
				if(strRight.length <= 1) {
					strRight = new String("0" + strRight);
				}
			}
			else {
				strRight = new String(strRight.substring(0, 2));
			}
		}
		else {
			if(strRight.length != 2) {
				strRight = strRight + "0";
			}
		}
	}
	if(strLeft.length > 3) {
		var curPos = (strLeft.length - 3);
		while(curPos > 0) {
			var remainingLeft = new String(strLeft.substring(0, curPos));
			var strLeftLeft = new String(strLeft.substring(0, curPos));
			var strLeftRight = new String(strLeft.substring(curPos, strLeft.length));
			strLeft = new String(strLeftLeft + "," + strLeftRight);
			curPos = (remainingLeft.length - 3);
		}
	}
	if(decplaces == "yes"){
		strWhole = strLeft + "." + strRight;
	}else{
		strWhole = strLeft;
	}
	finalValue = "$" + strWhole;
//	finalValue = strWhole;
	return(finalValue);
}	

function c_FormatPassword(sText){
//don't format a password because user can't see it
	return(sText);
}

function c_ValidatePassword(sText){
	if(sText!=c_TrimValidText(g_scValidPassword,sText))
		return(g_lcResultPasswordInvalid);
	if(sText.length<g_lcPasswordMin)
		return(g_lcResultPasswordTooShort);
	if(sText.length>g_lcPasswordMax)
		return(g_lcResultPasswordTooLong);
	return(g_lcResultSuccess);
}

function c_UrlFormat(sText){
	sText=c_TrimValidText(g_scValidUrl,sText);
	sText=c_TrimText(sText);
	sText=c_SizeText(sText,g_lcUrlMax)
	sText=sText.toLowerCase();
	return(sText);
}

function c_UrlValidate(sText){
	if(sText!=c_TrimValidText(g_scValidUrl,sText))
		return(g_lcResultUrlInvalid);
	if(sText.length<g_lcUrlMin)
		return(g_lcResultUrlTooShort);
	if(sText.length>g_lcUrlMax)
		return(g_lcResultUrlTooLong);
	return(g_lcResultSuccess);
}

function c_FormatYear(sText){
//format 4 digit year (converts 2 digit year to 4 digit if necessary)
	var today;
	var thisYear;
	var thatYear;

	//convert to numbers
	sText=c_TrimNumberText(sText);
	if(!sText.length)
		return(sText);

	//convert 2-digit year to 4-digit year
	//it uses 19xx if 2 digit year is > thisYear 2 digit year + 10
	thatYear=new String(sText);
	if(thatYear.length==3)
		return(sText);
	if(thatYear.length<3){
		today=new Date();
		thisYear=today.getFullYear();
		thisYear=thisYear-1990;
		if(thatYear.length==1)
			thatYear="0"+thatYear;
		if(thatYear>thisYear)
			thatYear="19"+thatYear;
		else
			thatYear="20"+thatYear;
	}
	return(thatYear);
}

function c_YearValidate(sText){
	if(sText.length<g_lcYearMin)
		return(g_lcResultYearTooShort);
	if(sText.length>g_lcYearMax)
		return(g_lcResultYearTooLong);
	if(sText.length<4)
		return(g_lcResultYearInvalid);
	if(sText<1800)
		return(g_lcResultYearInvalid);
	if(sText>3000)
		return(g_lcResultYearInvalid);
	return(g_lcResultSuccess);
}

function c_DateFromParts(iMonth,iDay,iYear){
//convert date parts to a date object
	var dtDate;
	var today;
	var thisYear;
	var thatYear;

	//convert to numbers
	iMonth=new Number(iMonth);
	iDay=new Number(iDay);
	iYear=new Number(iYear);
	
	if((iMonth==0)||(iDay==0)||(iYear==0))
		return(0);

	//convert 2-digit year to 4-digit year
	//if the 2-digit year is greater than todays 2-digit year, it uses 19xx
	thatYear=new String(iYear);
	if(thatYear.length==3)
		return(g_lcResultFail);
	if(thatYear.length<3){
		today=new Date();
		thisYear=today.getFullYear();
		thisYear=thisYear-2000;
		if(thatYear.length==1)
			thatYear="0"+thatYear;
		if(thatYear>thisYear)
			thatYear="19"+thatYear;
		else
			thatYear="20"+thatYear;
	}

	//validate parts
	if((iMonth<1) || (iMonth>12))
		return(g_lcResultFail);
	
	if((iDay<1) || (iDay>31))
		return(g_lcResultFail);
	
	//validate day against month
	if((iMonth==4)||(iMonth==6)||(iMonth==9)||(iMonth==11))
		if(iDay>30)
			return(g_lcResultFail);
			
	if(iMonth==2)
		if(iDay>29)
			return(g_lcResultFail);

	//convert to date
	dtDate=new Date(thatYear,iMonth-1,iDay);
	//success
	return(dtDate);
}

function c_DateToString(dtDate){
//given a jscript date object, returns string in format mm/dd/yyyy
	var s;
	var sYear;
	s=new String(dtDate);
	sYear=s.substr(s.length-4,4);
	s=(dtDate.getMonth() + 1) + "/";
	s+=dtDate.getDate() + "/";
	s+=sYear;
	return(s);
}

function c_PersonFirstNameFormat(sText){
	sText=c_TrimValidText(g_scPersonValidFirstName,sText);
	sText=c_TrimText(sText);
	sText=c_SizeText(sText,g_lcPersonFirstNameMax)
	sText=sText.toUpperCase();
	return(sText);
}

function c_PersonFirstNameValidate(sText){
	var sTmp;
	if(sText.length<g_lcPersonFirstNameMin)
		return(g_lcResultPersonFirstNameTooShort);
	if(sText.length>g_lcPersonFirstNameMax)
		return(g_lcResultPersonFirstNameTooLong);
	return(g_lcResultSuccess);
}

function c_PersonMiddleNameFormat(sText){
	sText=c_TrimValidText(g_scPersonValidMiddleName,sText);
	sText=c_TrimText(sText);
	sText=c_SizeText(sText,g_lcPersonMiddleNameMax)
	sText=sText.toUpperCase();
	return(sText);
}

function c_PersonMiddleNameValidate(sText){
	var sTmp;
	if(sText.length<g_lcPersonMiddleNameMin)
		return(g_lcResultPersonMiddleNameTooShort);
	if(sText.length>g_lcPersonMiddleNameMax)
		return(g_lcResultPersonMiddleNameTooLong);
	return(g_lcResultSuccess);
}

function c_PersonLastNameFormat(sText){
	sText=c_TrimValidText(g_scPersonValidLastName,sText);
	sText=c_TrimText(sText);
	sText=c_SizeText(sText,g_lcPersonLastNameMax)
	sText=sText.toUpperCase();
	return(sText);
}

function c_PersonLastNameValidate(sText){
	var sTmp;
	if(sText.length<g_lcPersonLastNameMin)
		return(g_lcResultPersonLastNameTooShort);
	if(sText.length>g_lcPersonLastNameMax)
		return(g_lcResultPersonLastNameTooLong);
	return(g_lcResultSuccess);
}

function c_PersonSSNFormat(sText){
	sText=c_TrimNumberText(sText);
	sText=c_SizeText(sText,9);
	if(sText.length!=9)
		return(sText);
	sText=sText.substr(0,3) + "-" + sText.substr(3,2) + "-" + sText.substr(5,4)
	return(sText);
}


function c_PersonSSNValidate(sText){
	var iSameNum=0;
	var sTmp;
	sTmp=c_TrimNumberText(sText);
	sChar=sTmp.charAt(0);
	if(sTmp.length!=9)
		return(g_lcResultPersonSSNInvalid);
	if(sTmp<1)
		return(g_lcResultPersonSSNInvalid);
	for(i=0;i<sTmp.length;i++){
		if(sTmp.charAt(i)==sChar)
			iSameNum++;
	}
	if(iSameNum==sTmp.length)
		return(g_lcResultPersonSSNInvalid);
	return(g_lcResultSuccess);
}

function c_DateFormat(sText){
	var dtDate;
	dtDate=new Date(sText);
	sText=c_DateToString(dtDate);
	return(sText);
}

function c_DateValidate(sText){
//TODO
	return(g_lcResultSuccess);
}

function c_PersonDOBValidate(sText){
	var dtValidDate;
	var dtBirthDate;
	dtBirthDate=new Date(sText);
	dtValidDate=new Date();
	dtValidDate.setYear(dtValidDate.getFullYear()-g_lcPersonMaxAge);
	if(dtBirthDate<dtValidDate){
		return(g_lcResultPersonDOBInvalid);
	}
	dtValidDate=new Date();
	dtValidDate.setYear(dtValidDate.getFullYear()-g_lcPersonMinAge);
	if(dtBirthDate>dtValidDate){
		return(g_lcResultPersonDOBInvalid);
	}
	return(g_lcResultSuccess);
}

function c_PersonDOBAge(iMonth,iDay,iYear){
	var dtBirthDate;
	var dtTodaysDate;
	dtBirthDate=c_DateFromParts(iMonth,iDay,iYear);
	dtTodaysDate=new Date();
	iAge=(dtTodaysDate-dtBirthDate)/31557600000;
	return(iAge);
}

function c_PersonDOBAgeValidate(sText,iMinAge,iMaxAge){
	var dtValidDate;
	var dtBirthDate;
	dtBirthDate=new Date(sText);
	dtValidDate=new Date();
	dtValidDate.setYear(dtValidDate.getFullYear()-iMaxAge);
	if(dtBirthDate<dtValidDate){
		return(g_lcResultPersonDOBTooOld);
	}
	dtValidDate=new Date();
	dtValidDate.setYear(dtValidDate.getFullYear()-iMinAge);
	if(dtBirthDate>dtValidDate){
		return(g_lcResultPersonDOBTooYoung);
	}
	return(g_lcResultSuccess);
}

function c_EntityNameFormat(sText){
	sText=c_TrimValidText(g_scEntityValidName,sText);
	sText=c_TrimText(sText);
	sText=c_SizeText(sText,g_lcEntityNameMax)
	sText=sText.toUpperCase();
	return(sText);
}

function c_EntityNameValidate(sText){
	var sTmp;
	if(sText.length<g_lcEntityNameMin)
		return(g_lcResultEntityNameTooShort);
	if(sText.length>g_lcEntityNameMax)
		return(g_lcResultEntityNameTooLong);
	return(g_lcResultSuccess);
}

function c_EntityAddressFormat(sText){
	sText=c_TrimValidText(g_scEntityValidAddress,sText);
	sText=c_TrimText(sText);
	sText=c_SizeText(sText,g_lcEntityAddressMax)
	sText=sText.toUpperCase();
	return(sText);
}

function c_EntityAddressValidate(sText){
	var sTmp;
	if(sText.length<g_lcEntityAddressMin)
		return(g_lcResultEntityAddressTooShort);
	if(sText.length>g_lcEntityAddressMax)
		return(g_lcResultEntityAddressTooLong);
	return(g_lcResultSuccess);
}

function c_EntityCityFormat(sText){
	
	sText=c_TrimValidText(g_scEntityValidCity,sText);
	sText=c_TrimText(sText);
	sText=c_SizeText(sText,g_lcEntityCityMax)
	sText=sText.toUpperCase();
	return(sText);
}

function c_EntityCityValidate(sText){
	var sTmp;
	if(sText.length<g_lcEntityCityMin)
		return(g_lcResultEntityCityTooShort);
	if(sText.length>g_lcEntityCityMax)
		return(g_lcResultEntityCityTooLong);
	return(g_lcResultSuccess);
}

function c_EntityStateFormat(sText){
	sText=c_TrimValidText(g_scEntityValidState,sText);
	sText=c_TrimText(sText);
	sText=c_SizeText(sText,g_lcEntityStateMax)
	sText=sText.toUpperCase();
	return(sText);
}

function c_EntityStateValidate(sText){
	var sTmp;
	if(sText.length<g_lcEntityStateMin)
		return(g_lcResultEntityStateTooShort);
	if(sText.length>g_lcEntityStateMax)
		return(g_lcResultEntityStateTooLong);
	return(g_lcResultSuccess);
}

function c_EntityCountyFormat(sText){
	sText=c_TrimValidText(g_scEntityValidCounty,sText);
	sText=c_TrimText(sText);
	sText=c_SizeText(sText,g_lcEntityCountyMax)
	sText=sText.toUpperCase();
	return(sText);
}

function c_EntityCountyValidate(sText){
	var sTmp;
	if(sText.length<g_lcEntityCountyMin)
		return(g_lcResultEntityCountyTooShort);
	if(sText.length>g_lcEntityCountyMax)
		return(g_lcResultEntityCountyTooLong);
	return(g_lcResultSuccess);
}

function c_EntityCountryFormat(sText){
	sText=c_TrimValidText(g_scEntityValidCountry,sText);
	sText=c_TrimText(sText);
	sText=c_SizeText(sText,g_lcEntityCountryMax)
	sText=sText.toUpperCase();
	return(sText);
}

function c_EntityCountryValidate(sText){
	var sTmp;
	if(sText.length<g_lcEntityCountryMin)
		return(g_lcResultEntityCountryTooShort);
	if(sText.length>g_lcEntityCountryMax)
		return(g_lcResultEntityCountryTooLong);
	return(g_lcResultSuccess);
}

function c_EntityZipFormat(sText){
	sText=c_TrimNumberText(sText);
	sText=c_SizeText(sText,9)
	if(sText.length<6)
		return(sText);
	sText=sText.substr(0,5)+"-"+sText.substr(5,4)
	return(sText);
}

function c_EntityZipValidate(sText){
	var sTmp;
	sTmp=c_TrimNumberText(sText);
	if(sTmp.length<5)
		return(g_lcResultEntityZipTooShort);
	if(sTmp.length>9)
		return(g_lcResultEntityZipTooLong);
	if((sTmp.length!=5)&&(sTmp.length!=9))
		return(g_lcResultEntityZipInvalid);
	if(sTmp<1)
		return(g_lcResultEntityZipInvalid);
	return(g_lcResultSuccess);
}

function c_EntityPhoneUSAFormat(sText){
	sText=c_TrimNumberText(sText);
	sText=c_SizeText(sText,10);
	if(!((sText.length==7)||(sText.length==10)))
		return(sText);
	if(sText.length==7)
		sText=sText.substr(0,3) + "-" + sText.substr(3,4)
	if(sText.length==10)
		sText=sText.substr(0,3) + "-" + sText.substr(3,3) + "-" + sText.substr(6,4)
	return(sText);
}

function c_EntityPhoneUSAValidate(sText){
	var iSameNum=0;
	sText=c_TrimNumberText(sText);
	sChar=sText.charAt(0);
	if(sText.length<7)
		return(g_lcResultEntityPhoneUSAInvalid);
	if(sText.length<10)
		return(g_lcResultEntityPhoneUSAInvalid);
	if(sText.substr(0,1)=="0")
		return(g_lcResultEntityPhoneUSAInvalid);
	if(sText.substr(0,1)=="1")
		return(g_lcResultEntityPhoneUSAInvalid);
	if(sText.substr(0,3)=="555")
		return(g_lcResultEntityPhoneUSAInvalid);
	if(sText.substr(3,1)=="0")
		return(g_lcResultEntityPhoneUSAInvalid);
	if(sText.substr(3,1)=="1")
		return(g_lcResultEntityPhoneUSAInvalid);
	if(sText.substr(3,3)=="555")
		return(g_lcResultEntityPhoneUSAInvalid);
	for(i=0;i<sText.length;i++){
		if(sText.charAt(i)==sChar)
			iSameNum++;
	}
	if(iSameNum==sText.length)
		return(g_lcResultEntityPhoneUSAInvalid);
	return(g_lcResultSuccess);
}

function c_EntityPhoneUSAValidateDetail(sText){
	sText=c_TrimNumberText(sText);
	if(sText.length<7)
		return(g_lcResultEntityPhoneUSAInvalid);
	if(sText.length<10)
		return(g_lcResultEntityPhoneUSAMissingAreaCode);
	if(sText.substr(0,1)=="0")
		return(g_lcResultEntityPhoneUSAInvalidAreaCode);
	if(sText.substr(0,1)=="1")
		return(g_lcResultEntityPhoneUSAInvalidAreaCode);
	if(sText.substr(0,3)=="555")
		return(g_lcResultEntityPhoneUSAInvalidAreaCode);
	if(sText.substr(3,1)=="0")
		return(g_lcResultEntityPhoneUSAInvalidPrefix);
	if(sText.substr(3,1)=="1")
		return(g_lcResultEntityPhoneUSAInvalidPrefix);
	if(sText.substr(3,3)=="555")
		return(g_lcResultEntityPhoneUSAInvalidPrefix);
	return(g_lcResultSuccess);
}

function c_EntityEmailFormat(sText){
	
	sText=sText.replace(/[..]+/g,".");
	sText=sText.replace(/\.@/g,"@");
	sText=c_TrimValidText(g_scEntityValidEmail,sText);
	sText=c_SizeText(sText,g_lcEntityEmailMax);
	sText=sText.toLowerCase();
	return(sText);
}

function c_EntityEmailValidate(sText){
	var iPos;
	var sTmp;
	var i;
	
	if(!c_IsValidText(g_scEntityValidEmail,sText))
		return(g_lcResultEntityEmailInvalid);
	sTmp=c_EntityEmailFormat(sText);
	sText=sText.toLowerCase();
	if(sTmp!=sText)
		return(g_lcResultEntityEmailInvalid);
	if(sText.length<g_lcEntityEmailMin)
		return(g_lcResultEntityEmailTooShort);
	if(sText.length>g_lcEntityEmailMax)
		return(g_lcResultEntityEmailTooLong);
	iPos=sText.indexOf("@");
	if(iPos<1)
		return(g_lcResultEntityEmailInvalid);
	sTmp=sText.substr(0,iPos);
	if(!c_IsValidText(g_scEntityValidEmailPrefix,sTmp))
		return(g_lcResultEntityEmailInvalid);
	sTmp=sText.substring(iPos+1,sText.length);
	if(!c_IsValidServerName(sTmp))
		return(g_lcResultEntityEmailInvalid);
	return(g_lcResultSuccess);
}

function c_IsValidServerName(sText){
	var i;
	var iDot;
	var bIsFound;
	if(sText.length<4)
		return(false);
	if(!c_IsValidText(g_scEntityValidEmailServer,sText))
		return(false);
	bIsFound=false;
	for(i=sText.length;(i>-1)&&(!bIsFound);i--)
		if(sText.charAt(i)=="."){
			bIsFound=true;
			iDot=i;
		}
	if(!bIsFound)
		return(false);
	if((iDot<sText.length-4)||(iDot>sText.length-3))
		return(false);
	for(i=sText.length;i>iDot;i--)
		if(!c_IsAlpha(sText.charAt(i)))
			return(false);
	if(sText.indexOf(".")==0)
		return(false);
	return(true);
}
