/*
	File:    email.js
    Purpose: This js file contains Javascript functions that various applications call to validate form input
*/

var arrErrors = new Array();
var arrFields = new Array();

// FUNCTION to add an error to the error array
function errormsg(whmsg,whfld)
	{	
	arrErrors[arrErrors.length] = whmsg;
	arrFields[arrFields.length] = whfld;
	}

// FUNCTION TO VALIDATE IF FIELD REQUIRED, AND LENGTH MIN and MAX.   Replace RegEx trims leading/trailing spaces.
function checklength(TEXT,MIN,MAX)
	{
	TEXT = TEXT.replace(/^\s*|\s*$/g, ""); 
	if (MIN==undefined)	MIN=1;
	if (MAX==undefined) MAX=6000;
	if (TEXT.length < MIN || TEXT.length > MAX) return false;
	return true;
	}

// FUNCTION TO VALIDATE NUMERIC RANGE
function checkrange(TEXT,MIN,MAX,REQD)
	{
	//check if required
	if (TEXT.length == 0)
		{
		return (REQD == undefined)  
		}
	if (MIN==undefined)	MIN=0;
	if (MAX==undefined) MAX=99999999999999;
	var whval = parseFloat(TEXT);
	if (whval < parseFloat(MIN) || whval > parseFloat(MAX)) return false;
	return true;
}

//FUNCTION TO VALIDATE EMAIL
function checkemail(TEXT,REQD)
	{
	TEXT.replace(/^\s*|\s*$/g, ""); 
	//check if required
	if (TEXT.length == 0)
		{
		return (REQD == undefined)  
		}

	if (TEXT.length > 0)
		{
		var RE = /^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$/;
		if (!RE.test(TEXT)) return false;
		}
	return true;
	}

//FUNCTION TO VALIDATE US STATE
function checkstate(TEXT,REQD)
	{
	TEXT.replace(/^\s*|\s*$/g, ""); 
	//check if required
	if (TEXT.length == 0)
		{
		return (REQD == undefined)  
		}
	if (TEXT.length == 1) return false;
	txt = TEXT.toUpperCase();
	var states = "AL AK AZ AR CA CO CT DE DC FL GA HI ID IL IN IA KS KY LA ME MD MA MI MS MN MO MT NE NM NV NH NJ NM NY NC ND OH OK OR PA RI SC SD TN TX UT VT VA WA WV WI WY";
	return (states.indexOf(txt) != -1)
	}

// FUNCTION TO VALIDATE TIME
function checktime(TEXT,REQD)
	{
	TEXT.replace(/^\s*|\s*$/g, ""); 
	//check if required
	if (TEXT.length == 0)
		{
		return (REQD == undefined)  
		}
	else
		{
		RE = /^\d{1,2}[:]\d{2}([:]\d{2})?( [aApP][mM]?)?$/
		if (!RE.test(TEXT)) return false;
		}
	return true
	}	


// FUNCTION to set the passed-in radio field (whradio) to the passed in value (whval)
function chkradio(whradio, whval)
	{
	for (var cnt = 0; cnt < whradio.length; cnt++)
		{
		if (whradio[cnt].value == whval)
			{
			whradio[cnt].checked = true
			}
		}
	}		

// FUNCTION to set the passed-in drop down field (whselect) to the passed in value (whval)
function chkselect(whselect, whval)
	{
	a_val = whval.split(',')
	whelem = document.getElementById(whselect)
	for (var cnt = 0; cnt < whelem.length; cnt++)
		{
		for (var i = 0; i < a_val.length; i++)
			{
			if (a_val[i] == whelem[cnt].value) { whelem[cnt].selected = true }
			}
		}
	}		

//This function will store the id of the checkbox in the field that you specify
function gbchkboxval(whobj,whfld)
	{
	whobjh	= document.getElementById(whfld)
	whobjh.value = (whobj.checked == true) ? whobjh.value + whobj.id + '|' : whobjh.value.replace(whobj.id+'|','');
	}

//This fuction goes and checks a group of checkboxes based on the value
function gbchkboxchk(whval)
	{
	whobja	= whval.split('|')
	for (var i = 0; i < whobja.length; i++)
		{
		whcb = document.getElementById(whobja[i])
		if (whcb == '[object]') { whcb.checked = true }
		}
	}
	

// FUNCTION to only allow numeric digits.   allowDecimal & allowNegative governs whether user can enter decimal or hyphen
function Numeric(obj, e, allowDecimal, allowNegative)
	{
	var key;
	var isCtrl = false;
	var keychar;
	var reg;
		
	if(window.event)
	{
		key = e.keyCode;
		isCtrl = window.event.ctrlKey
	}
	else if(e.which)
	{
		key = e.which;
		isCtrl = e.ctrlKey;
	}
	
	if (isNaN(key)) return true;
	
	keychar = String.fromCharCode(key);
	
	if (key == 8 || key == 13 || isCtrl) return true;

	reg = /\d/;

	var isFirstN = allowNegative ? keychar == '-' && obj.value.indexOf('-') == -1 : false;
	var isFirstD = allowDecimal ? keychar == '.' && obj.value.indexOf('.') == -1 : false;
	
	return isFirstN || isFirstD || reg.test(keychar);
	}

// FUNCTION to clear various fields - pass in a comma delimited list of field ID's
function clearFields(fields)
{
	var MyArray = new Array()
	MyArray = fields.split(',')
	var i=0
	while (i<MyArray.length)
		{
		f = eval("document.getElementById('" + MyArray[i] + "')");
		f.value = '';
		i+=1;
		}
}


//Round a number to a given number of decimal places
//parameters - value to pad, character to use in pad, ending length
function myround(number,X) 
	{
	// rounds number to X decimal places, defaults to 2
	X = (!X ? 2 : X);
	money	= Math.round(number*Math.pow(10,X))/Math.pow(10,X)+'';
	newval	= money.split(".");
	dollars	= newval[0]; 
	cents	= (!newval[1]) ? padright('0','0',X*1):padright(newval[1],'0',X*1)
	return (X=='0') ? dollars : dollars + "." + cents
	} 

//pad left
//parameters - value to pad, character to use in pad, ending length
function padleft(val, ch, num, ab)
	{
	if (ab == 'Y' && val == '') {return ''};
    var re = new RegExp(".{" + num + "}$");
    var pad = "";
    if (!ch) ch = " ";
        do  {
        pad += ch;
        }while(pad.length < num);
    return re.exec(pad + val);
    }
	
//pad right
//parameters - value to pad, character to use in pad, ending length
function padright(val, ch, num, ab)
	{
	if (ab == 'Y' && val == '') {return ''};
    var re = new RegExp("^.{" + num + "}");
	var pad = "";
	if (!ch) ch = " ";
	do {
		pad += ch;
		} while (pad.length < num);
	return re.exec(val + pad);
	}	
// function to set location.href = value of field
function goto(fld)
	{
	if (fld.value != '')
		{
		location.href=fld.value;
		}
	}
	

// FUNCTION TO VALIDATE DATE FIELDS ON SUBMIT
function checkdate(TEXT,REQD) 
	{
		TEXT = TEXT.replace(/^\s*|\s*$/g, ""); 		
		//check if required
		if (TEXT.length == 0)
			{
			return (REQD == undefined)  
			}
		var strDate = TEXT;
		var strDateArray,strDay,strMonth,strYear,intday,intMonth,intYear;
		var booFound = false;
		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";
		if (strDate.length < 1) 
			{
			return true;
			}
		if (strDate.length < 6) 
			{
			err = 1;
			return false;
			}
		for (intElementNr = 0; intElementNr < strSeparatorArray.length; 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) 
			{
			l_yeartonum = (strYear*1)
			if (l_yeartonum > '49') 
				{
				strYear = '19' + strYear;
				}
			else
				{
				strYear = '20' + strYear;
				}
			}
		strTemp = strDay;
		strDay = strMonth;
		strMonth = strTemp;
		intday = parseInt(strDay, 10);
		if (isNaN(intday)) 
			{
			err = 2;
			return false;
			}
		intMonth = parseInt(strMonth, 10);
		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 = parseInt(strYear, 10);
		if (intYear < 1900 || intYear > 2100)
			{
			err = 4;
			return false;
			}
		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;
					}
				}
			}
		return true;
	}

	
// the next 3 functions validate the date on the blur event
function dateblur(objName)
	{
		var datefield = objName
		datefield.value = datefield.value.replace(/ /g,'');
		if (dateblurcheck(datefield) == false)
		{
			alert("'" + datefield.value + "' is an invalid date.");
			datefield.select();
			setTimeout( (function() { datefield.focus() }),1);
		}
		return true;
	}

function dateblurcheck(objName) 
	{
		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;
			}
		if (strDate.length < 6) 
			{
			err = 1;
			return false;
			}
		for (intElementNr = 0; intElementNr < strSeparatorArray.length; 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) 
			{
			if (strYear > '49') 
				{
				strYear = '19' + strYear;
				}
			else
				{
				strYear = '20' + strYear;
				}
			}
		strTemp = strDay;
		strDay = strMonth;
		strMonth = strTemp;
		intday = parseInt(strDay, 10);
		if (isNaN(intday)) 
			{
			err = 2;
			return false;
			}
		intMonth = parseInt(strMonth, 10);
		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 = parseInt(strYear, 10);
		if (intYear < 1900 || intYear > 2100)
			{
			err = 4;
			return false;
			}
		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;
					}
				}
			}
		datefield.value = intMonth + "/" + intday+"/" + 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;
	}
