//*
// This file will have common JS functions for validating data entered on forms.
//*

function validData_IsEmail(a_sEmail) {

var l_sChr,l_sState,l_iState,l_dPos

    if (a_sEmail.length >= 5) {
	
		if (-1 != validData_InStr(a_sEmail, " "))
		{
			return (false);
		}

		l_iState = 0;
		l_dPos = 0;
		    
		l_sChr = a_sEmail.substring( 0, 1);

		while(l_sChr != ""){
            if (l_iState ==  0){
                if (l_sChr != "@" )
                    l_iState = 1;                
	        }
            else if (l_iState == 1){
                if (l_sChr == "@")
                    l_iState = 2;
            }
            else if (l_iState == 2){            
                if (l_sChr != "." ){
                    l_iState = 3;
				}
			}
            else if (l_iState == 3){            
                if (l_sChr == "." )
                    l_iState = 4;
			}
            else if (l_iState == 4){            
                l_iState = 5;
			}
            l_dPos = l_dPos + 1;
            l_sChr = a_sEmail.substring( l_dPos, l_dPos+1);
		}
		
        if (l_iState == 5 ) return true;
	}
	
    return false;
}

function validData_IsInteger(a_sNumVal) 
{
	var isValid = validData_IsANumber(true, a_sNumVal);
	
	if ((true != isValid) || (a_sNumVal.length > 9) ) 
	{
		return false;
	}
	return true;
}

function validData_IsANumber(a_bInteger, a_sNumVal) 
{
	var nLength = a_sNumVal.length;
	var isValid = true;
	var bFndDot = false;
	var bFndDigit = false;
	var c;
	var i;
	
	if (0 >= nLength)
	{
		return (false);
	}
	for (i = 0; (i < nLength) && (true == isValid); i++)
	{
		c = a_sNumVal.charAt(i);
		if (-1 != "0123456789".indexOf(c) )
		{
			bFndDigit = true;
		}
		else
		if ("-" == c)
		{
			if (0 != i)
			{
				isValid = false;
			}
		}
		else
		if ("." == c)
		{
			if (true == a_bInteger)
			{
				isValid = false;
			}
			else
			{
				if (false == bFndDot)
				{
					bFndDot = true;
				}
				else
				{
					isValid = false;
				}
			}
		}
		else
		{
			isValid = false;
		}
	}
	
	// There's gotta be 1 digit at least
	if (false == bFndDigit)
	{
		isValid = false;
	}
	
	return (isValid);
}


function validData_InStr (a_sString, a_cCharacter)
{
	var i
	for (i = 0; i < a_sString.length; i++)
	{
		if (a_sString.charAt (i) == a_cCharacter)
		{
			return (i);
		}
	}
	
	return (-1);
}


function validData_TrimString(a_sStr) {
	// remove leading spaces from any text-based inputs before validating
	while ((a_sStr.length > 0) && (a_sStr.charAt(0) == ' ') ) 
	{
		a_sStr = a_sStr.substring(1, a_sStr.length);
	}

	while ((a_sStr.length > 0) && (a_sStr.charAt(a_sStr.length - 1) == ' ') ) 
	{
		a_sStr = a_sStr.substring(0, a_sStr.length - 1);
	}
			
	return a_sStr;
}


function validData_IsDateUS(a_sDate) {

	var l_oDate;

	// remove leading/trailing spaces first
	a_sDate = validData_TrimString(a_sDate);  
	if (validData_InStr(a_sDate, " ") != -1)	return false;

	sDateString = a_sDate;
	iLength = a_sDate.length;
	//alert("length:" + iLength);

	iFirstDivPos = sDateString.indexOf("/");
	sMonthPart = sDateString.substring(0,iFirstDivPos);
	//alert(sMonthPart);
		
	sDateString = a_sDate.substring(iFirstDivPos + 1, iLength);
	iSecondDivPos = sDateString.indexOf("/");
	sDatePart = sDateString.substring(0,iSecondDivPos);
	//alert(sDatePart);
		
	sDateString = sDateString.substring(iSecondDivPos + 1, iLength);
	sYearPart = sDateString.substring(0,iLength);
	//alert(sYearPart);


	if ( sYearPart.length == 4 || sYearPart.length == 2 )  {

		l_oDate = validData_IsDate(sDatePart,sMonthPart,sYearPart);

		if (l_oDate) return l_oDate;
	}	 
	
	return false;
	
}


function validData_IsDate (a_sDay, a_sMonth, a_sYear) {
	
	var l_iYear, l_iMonth, l_iDay;

	// '0000' is an invalid year
	if (a_sYear == "0000")  return false;

	// 5/4/00 AC: check for the following erroneous years:
	// -0; -000; +0; +000; 0.00 (or months/days like +1)
	// by ensuring that all of the characters are digits
	if (!validData_DigitsOnly(a_sDay) || !validData_DigitsOnly(a_sMonth) || !validData_DigitsOnly(a_sYear))
		return false;
	
	// no negative years allowed...
	if (Number(a_sYear) < 0)  return false;

	// years before 1753 not allowed (SQL Server restriction)...
	if ((Number(a_sYear) < 1753) && (Number(a_sYear) >= 100)) return false;
	
	l_iYear = validData_Y2K(Number(a_sYear));
	l_iMonth = Number(a_sMonth)-1;
	l_iDay = Number(a_sDay);
	
	var test = new Date(l_iYear, l_iMonth, l_iDay); 
	//alert (test.getYear());
	//window.alert ("Year: " + l_iYear + " Month: " + l_iMonth + " Day: " + l_iDay + "\n" + "Test: " + test + "\nYear: " + test.getYear() + " Month: " + test.getMonth() + " day: " + test.getDate());
	
	// 8/3/00 AC
	// date.getYear appears to behave differently on different versions
	// of Javascript (see validData_JSYear and validData_JSVersion below)
	//if ( (validData_Y2K(test.getYear()) == l_iYear) &&    
	if ( (validData_JSYear(test) == l_iYear) &&    
		 (l_iMonth == test.getMonth()) &&         
		 (l_iDay == test.getDate()) )        
		//return true;
			return test;
 
	else        
		return false;
}



function validData_Y2K(a_iNumber) { 
		
	if (a_iNumber < 100)
		return (a_iNumber < 50) ? a_iNumber + 2000 : a_iNumber + 1900;
		//return (a_iNumber < 50) ? "20" & a_iNumber : a_iNumber + 1900;
	else
		return a_iNumber;
}

function validData_JSYear(a_oDate) {

	var l_iYear;
	l_iYear = a_oDate.getYear();
	
	//special ie5 case
	if (validData_JSVersion() == 1.5)
		return l_iYear;
	else if (validData_JSVersion() > 1.2) 
		return (l_iYear + 1900);
	else
		return (l_iYear < 100) ? l_iYear + 1900: l_iYear;
}


function validData_DigitsOnly(a_sStr) 
{
	var nLength = a_sStr.length;
	var c;
	var i;

	for (i = 0; (i < nLength); i++)
	{
		c = a_sStr.charAt(i);
		if (validData_InStr("0123456789", c) == -1) return false;

	}
	
	return true;
}



function validData_JSVersion() {

var is_js = 1.0; // lowest possible value

// convert all characters to lowercase to simplify testing
var agt=navigator.userAgent.toLowerCase();
var is_major = parseInt(navigator.appVersion);
var is_minor = parseFloat(navigator.appVersion);

var is_ie = (agt.indexOf("msie") != -1);

var is_nav = ((agt.indexOf('mozilla')!=-1) && (
				agt.indexOf('spoofer')==-1) && 
				(agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1) && (agt.indexOf('webtv')==-1));

var is_nav4 = (is_nav && (is_major == 4));		
var is_nav5 = (is_nav && (is_major == 5));

var is_ie4 = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")==-1) );
var is_ie5 = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1) );

if ((is_nav4 && (is_minor <= 4.05)) || is_ie4) is_js = 1.2
else if ((is_nav4 && (is_minor > 4.05))) is_js = 1.3
else if (is_nav5) is_js = 1.4;	
//special case again for ie5
else if (is_ie5) is_js = 1.5;
return is_js;			
				
}




function validData_TrimString(a_sStr) {
	// remove leading spaces from any text-based inputs before validating
	while ((a_sStr.length > 0) && (a_sStr.charAt(0) == ' ') ) 
	{
		a_sStr = a_sStr.substring(1, a_sStr.length);
	}

	// 5/4/00 AC: also remove trailing spaces...
	while ((a_sStr.length > 0) && (a_sStr.charAt(a_sStr.length - 1) == ' ') ) 
	{
		a_sStr = a_sStr.substring(0, a_sStr.length - 1);
	}
			
	return a_sStr;
}

function validData_FromTo (a_sFromVal, a_sToVal, a_sType) {
	
	var l_oFromDate, l_oToDate ; 
	
	// 5/4/00 AC: prepare values for display in error msgs...
	a_sFromVal = validData_TrimString(a_sFromVal);
	a_sToVal = validData_TrimString(a_sToVal);
	
	// check for a valid 'range' type
	// 4/4/00 AC: "number" is actually used within tblMetaData to
	// indicate integers 
	if ((a_sType != "date") && (a_sType != "time") && (a_sType != "number") && (a_sType != "integer") && (a_sType != "real") && (a_sType != "money"))
		return true;

	// validate numeric range
	// 4/4/00 AC: "number" is actually used within tblMetaData to
	// indicate integers 
	if ((a_sType == "number") || (a_sType == "integer") || (a_sType == "real") || (a_sType == "money")) {
		if (parseFloat(a_sFromVal) > parseFloat(a_sToVal)) {
			return false;	
		}
	}
	
	// validate (US) date range
	if (a_sType == "date")  {
		l_oFromDate = new Date( a_sFromVal );
		l_oToDate = new Date( a_sToVal ) ; 

		if (l_oFromDate.getYear() > l_oToDate.getYear() )
			return false;
		
		if (l_oFromDate.getYear() == l_oToDate.getYear()) 
		{ 
			if( l_oFromDate.getMonth() > l_oToDate.getMonth() )
				return false ; 
			else if( l_oFromDate.getMonth() == l_oToDate.getMonth() ) 
			{ 
				if( l_oFromDate.getDate() > l_oToDate.getDate() )
					return false ; 
				else
					return true ; 
			}
		}
	}

	
	// validate hh:mm range (24hr clock)
	if (a_sType == "time")  {
		
		l_oFromDate = new Date( a_sFromVal );
		l_oToDate = new Date( a_sToVal ) ; 
		
		if (l_oFromDate.getHours() < l_oToDate.getHours()) 	
			return true;	

		if (l_oFromDate.getHours() == l_oToDate.getHours()) {
			if (l_oFromDate.getMinutes() <= l_oToDate.getMinutes()) 
				return true;
		}
		return false;
	}

	return true;
		
}


function stripSpaces(address) {    
    while (address.substring(0,1) == ' ')
		 address = address.substring(1);
		 
    while (address.substring(address.length-1,address.length) == ' ') 
		address = address.substring(0,address.length-1);
    
    return address;
}



function validData_FormatMoney(n) {    
   return n.toLocaleString();
}