
function ltrim ( s )
{
	return s.replace( /^\s*/, "" )
}

function rtrim ( s )
{
	return s.replace( /\s*$/, "" );
}

function trim ( s )
{
	return rtrim(ltrim(s));
}

// returns NaN if not an integer, otherwise integer
function toInt (str)
{
	// strip off leading zeros (leading 0 causes parseInt to treat number as octal
	str = str.replace(/^0+/, '');
	
	var i = parseInt(str); // note something like 200ABC will return 200

	if (isNaN(i))
		return Number.NaN;
		
	// strip out non-integer digits
	str = str.replace(/[0-9]/g, '');
	if (str.length > 0) 
		return Number.NaN;

	return i;
}

function checkNumberInt(strng, required) 
{
	var error="";

	error = isEmpty(strng);
	if (error.length > 0)
	{
		if (required == true)
		{
			return error;
		}
		else
		{
			return ""; // empty value is valid if not required
		}
	}
	if (isNaN(toInt(strng.value)))
	{
	       error = strng.id + " is not a valid number.\n";
	}
	return error;    
}

function checkEmail (strng, required) 
{
	var error="";

	error = isEmpty(strng);
	if (error.length > 0)
	{
		if (required == true)
		{
			return error;
		}
		else
		{
			return ""; // empty value is valid if not required
		}
	}


	if (!isValidEmailAddress(strng.value))
	{
	       error = strng.id + " is not a valid email address.\n";
	}
	return error;    
}

// takes a string
function isValidEmailAddress(strng) 
{
	var error="";
	var emailFilter=/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9])+$/;
	if (!(emailFilter.test(strng))) 
	{ 
		return false; // not a valid email address.
	}
	else 
	{
		//test email for illegal characters
		var illegalChars= /[\(\)\<\>\,\;\:\\\"\[\]]/;
		if (strng.match(illegalChars)) 
		{
			return false; // contains illegal characters
		}
	}
	return true;    
}


// phone number - strip out delimiters and check for 10 digits

function checkPhone(strng, required) 
{
	var error = "";
	
	error = isEmpty(strng);
	if (error.length > 0)
	{
		if (required == true)
		{
			return error;
		}
		else
		{
			return ""; // empty value is valid if not required
		}
	}

	var stripped = strng.value.replace(/[\(\)\.\-\ ]/g, ''); //strip out acceptable non-numeric characters
	stripped = stripped.replace(/[0-9]/g, ''); //strip out numeric characters
	if (stripped.length > 0) 
	{
		error = strng.id + " is not a valid phone number.\n";
	}
	return error;
}


// zip code - strip out dash and check for 6 or 10 digits
function checkZip(strng, required) 
{
	var error = "";
	
	error = isEmpty(strng);
	if (error.length > 0)
	{
		if (required == true)
		{
			return error;
		}
		else
		{
			return ""; // empty value is valid if not required
		}
	}

	var stripped = trim(strng.value);
	if (stripped.length != 5)
	{
		if ((stripped.length != 10) || (stripped.charAt(5) != '-'))
		{
			return strng.id + " is not a valid zip code\n";
		}
		else
		{
			stripped = stripped.replace(/\-/, ''); //strip out single dash
		}
	}

	stripped = stripped.replace(/[0-9]/g, ''); //strip out numeric characters
	if (stripped.length > 0) 
	{
		error = strng.id + " is not a valid zip code.\n";
	}
	return error;
}

// SSN
function checkSSN(strng, required) 
{
	var error = "";
	error = isEmpty(strng);
	if (error.length > 0)
	{
		if (required == true)
		{
			return error;
		}
		else
		{
			return ""; // empty value is valid if not required
		}
	}
    var ssn = strng.value;
    var matchArr = ssn.match(/^(\d{3})-?\d{2}-?\d{4}$/);
    var numDashes = ssn.split('-').length - 1;
    if (matchArr == null || ((numDashes != 2) && (numDashes != 0)))
    {
        error = strng.id + " is not a valid social security number.\n";
    }
    else 
    {
        if (parseInt(matchArr[1],10)==0) 
        {
            //alert("Invalid SSN: SSN's can't start with 000.");
            error = strng.id + " is not a valid social security number.\n";
        }
    }
    return error;
}

function checkCurrency(strng, required) 
{
	var error = "";
	error = isEmpty(strng);
	if (error.length > 0)
	{
		if (required == true)
		{
			return error;
		}
		else
		{
			return ""; // empty value is valid if not required
		}
	}
    var strValue = strng.value;
    objRegExp = /\)|\(|[,]|[$]/g;
    var strValue_Temp = strValue.replace(objRegExp,'');
    
    if (isNumeric(strValue_Temp))
    {
        //BEGINS with NUMBER AND NUMBER = 1,000,000 | 1.99 . . . 
        objRegExp = /^([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(\.[0-9][0-9])?$|^([0-9]?\.)([0-9][0-9])$/;
        if (objRegExp.test(strValue))
        {
            return "";
        }
        //BEGINS with $ AND NUMBER = 1,000,000 | 1.99 . . . 
        objRegExp = /^(\${1})([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(\.[0-9][0-9])?$|^(\${1}[0-9]?\.)([0-9][0-9])$/;
        if (objRegExp.test(strValue))
        {
            return "";
        }		
        //BEGINS with $- AND NUMBER = 1,000,000 | 1.99 . . . 
        objRegExp = /^(\${1}[-]{1})([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(\.[0-9][0-9])?$|^(\${1}[-]{1}[0-9]?\.)([0-9][0-9])$/;
        if (objRegExp.test(strValue))
        {
            return "";
        }		
        //BEGINS with -$ AND NUMBER = 1,000,000 | 1.99 . . . 
        objRegExp = /^([-]{1}\${1})([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(\.[0-9][0-9])?$|^([-]{1}\${1}[0-9]?\.)([0-9][0-9])$/;
        if (objRegExp.test(strValue))
        {
            return "";
        }	
        //BEGINS with - AND NUMBER = 1,000,000 | 1.99 . . . 
        objRegExp = /^([-]{1})([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(\.[0-9][0-9])?$|^([-]{1}[0-9]?\.)([0-9][0-9])$/;
        if (objRegExp.test(strValue))
        {
            return "";
        }		
        //BEGINS with ( ENDS WITH ) AND NUMBER = 1,000,000 | 1.99 . . . 
        objRegExp = /^(\({1})([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)((\.[0-9][0-9]\){1})$|(\){1})$)|^(\({1}\.{1})([0-9][0-9]\){1})$/;
        if (objRegExp.test(strValue))
        {
            return "";
        }		
        //BEGINS with ($ ENDS WITH ) AND NUMBER = 1,000,000 | 1.99 . . . 
        objRegExp = /^(\({1}\${1})([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)((\.[0-9][0-9]\){1})$|(\){1})$)|^(\(\${1}{1}\.{1})([0-9][0-9]\){1})$/;
        if (objRegExp.test(strValue))
        {
            return "";
        }	
        //BEGINS with $( ENDS WITH ) AND NUMBER = 1,000,000 | 1.99 . . . 
        objRegExp = /^(\${1}\({1})([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)((\.[0-9][0-9]\){1})$|(\){1})$)|^(\${1}\({1}\.{1})([0-9][0-9]\){1})$/;
        if (objRegExp.test(strValue))
        {
            return "";
        }					
    }
    return strng.id + " is not a valid dollar number.\n";
}
                                
function isNumeric(strValue)
{
    var objRegExp = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/; 

    //check for numeric characters 
    return objRegExp.test(strValue);
}

// non-empty textbox
function isEmpty(strng) 
{
	var error = "";
	if (!isFilled(strng))
	{
		error = strng.id + " must be filled in.\n"
	}
	return error;	  
}

function isFilled(strng) 
{
	return _isFilled(strng.value);
}

function _isFilled(strng) 
{
	return ((strng != null) && (trim(strng).length > 0));
}


// was textbox altered
function isDifferent(strng1,strng2) 
{
	var error = ""; 
	if (strng1.value != strng2.value) 
	{
		error = strng1.id + " and " + strng2.id + " are different.\n";
	}
	return error;
}

// exactly one radio button is chosen

function checkRadio(checkvalue) 
{
	var error = "";
	if (!(checkvalue)) 
	{
       error = "an option must be selected.\n";
    }
	return error;
}

// valid selector from dropdown list

function checkDropdown(choice) 
{
	var error = "";
    if (choice == 0) 
    {
		error = "an option must be chosen.\n";
    }    
	return error;
}    


/*
Got this from: http://javascript.internet.com/forms/val-date.html.
Original:  Mike Welagen (welagenm@hotmail.com)

The following date formats are accepted:
mm-dd-yyyy, mm/dd/yyyy, mm.dd.yyyy, mm dd yyyy, 
mmm dd yyyy, mmddyyyy, m-d-yyyy, m/d/yyyy, m.d.yyyy, 
m d yyyy, mmm d yyyy, m-d-yy, m/d/yy, m.d.yy, m d yy, 
mmm d yy (yy is 20yy) 

(Accepted EU formats just switch month and day) 
*/
function checkDate(strng, required) 
{
	var error="";

	error = isEmpty(strng);
	if (error.length > 0)
	{
		if (required == true)
		{
			return error;
		}
		else
		{
			return ""; // empty value is valid if not required
		}
	}
	if (chkdate(strng) == false) 
	{
	       error = strng.id + " is not a valid date.\n";
	}
	return error;
}

function chkdate(objName) 
{
	var strDatestyle = "US"; //United States date style
	//var strDatestyle = "EU";  //European date style
	var strDate;
	var strDateArray;
	var strDay;
	var strMonth;
	var strYear;
	var intday;
	var intMonth;
	var intYear;
	var booFound = false;
	var datefield = objName;
	var strSeparatorArray = new Array("-"," ","/",".");
	var intElementNr;
	var err = 0;
	var strMonthArray = new Array(12);
	strMonthArray[0] = "Jan";
	strMonthArray[1] = "Feb";
	strMonthArray[2] = "Mar";
	strMonthArray[3] = "Apr";
	strMonthArray[4] = "May";
	strMonthArray[5] = "Jun";
	strMonthArray[6] = "Jul";
	strMonthArray[7] = "Aug";
	strMonthArray[8] = "Sep";
	strMonthArray[9] = "Oct";
	strMonthArray[10] = "Nov";
	strMonthArray[11] = "Dec";
	strDate = datefield.value;
	if (strDate.length < 1) 
	{
		return true;
	}
	for (intElementNr = 0; (intElementNr < strSeparatorArray.length) && !booFound; intElementNr++) 
	{
		if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) 
		{
			strDateArray = strDate.split(strSeparatorArray[intElementNr]);
			if (strDateArray.length != 3) 
			{
				err = 1;
				return false;
			}
			else 
			{
				strDay = strDateArray[0];
				strMonth = strDateArray[1];
				strYear = strDateArray[2];
			}
			booFound = true;
		}
	}
	if (booFound == false) 
	{
		if (strDate.length>5) 
		{
			strDay = strDate.substr(0, 2);
			strMonth = strDate.substr(2, 2);
			strYear = strDate.substr(4);
		}
	}
	if (strYear.length == 2) 
	{
		strYear = '20' + strYear;
	}
	// US style
	if (strDatestyle == "US") 
	{
		strTemp = strDay;
		strDay = strMonth;
		strMonth = strTemp;
	}
	intday = toInt(strDay);
	if (isNaN(intday)) 
	{
		err = 2;
		return false;
	}
	
	intMonth = toInt(strMonth);
	if (isNaN(intMonth)) 
	{
		for (i = 0;i<12;i++) 
		{
			if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) 
			{
				intMonth = i+1;
				strMonth = strMonthArray[i];
				i = 12;
			}
		}
		if (isNaN(intMonth)) 
		{
			err = 3;
			return false;
		}
	}
	intYear = toInt(strYear);
	if (isNaN(intYear)) 
	{
		err = 4;
		return false;
	}
	if (intMonth>12 || intMonth<1) 
	{
		err = 5;
		return false;
	}
	if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) 
	{
		err = 6;
		return false;
	}
	if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) 
	{
		err = 7;
		return false;
	}
	if (intMonth == 2) 
	{
		if (intday < 1) 
		{
			err = 8;
			return false;
		}
		if (LeapYear(intYear) == true) 
		{
			if (intday > 29) 
			{
				err = 9;
				return false;
			}
		}
		else 
		{
			if (intday > 28) 
			{
				err = 10;
				return false;
			}
		}
	}


	/* convert to a more readable or desireable form */
//	if (strDatestyle == "US") 
	{
		//datefield.value = intMonth-1 + "/" + intday+"/" + strYear;
		// MM/DD/YYYY
		datefield.value = ((intMonth<10) ? "0" : "") + intMonth  + "/" + 
				  ((intday<10) ? "0" : "") + intday + "/" + strYear;
	}
/*
	else 
	{
		datefield.value = intday + " " + strMonthArray[intMonth-1] + " " + strYear;
	}
*/
	return true;
}
	
function LeapYear(intYear) 
{
	if (intYear % 100 == 0) 
	{
		if (intYear % 400 == 0) { return true; }
	}
	else 
	{
		if ((intYear % 4) == 0) { return true; }
	}
	return false;
}

function checkDateRange(from, to) 
{
	if (Date.parse(from.value) <= Date.parse(to.value)) 
	{
		alert("The dates are valid.");
	}
	else 
	{
		if (from.value == "" || to.value == "") 
			alert("Both dates must be entered.");
		else 
			alert("To date must occur after the from date.");
	}
}

