/*
* Copyright (c) 2004 Lucid Technologies.
* All rights reserved.
*
* This software is the confidential and proprietary property of
* Lucid Technologies ('Confidential Information').  This Confidential
* Information and property shall only be used in strict accordance
* with the terms set forth in the Master Software License Agreement
* with Lucid Technologies.
*/

/*************************************************************
* Set global variables to use between validation methods
************************************************************/
var messagetmp = ""; // Temporary message storage
var isModified = false;
var targetpage = '';
var browserName = navigator.appName;
var browserVer = parseInt(navigator.appVersion);

var REQUIRED_BGCOLOR = "#FAFCCA";
var ERROR_BGCOLOR = "#EDBCBA";
var NORMAL_BGCOLOR = "white";
var REQD_CHK_BGCOLOR = "#8A6F4A";

/* Format CONSTANTS */
var NONE = 0;
var SOCIAL_SECURITY = 1;
var PHONE_NUMBER = 2;
var DATE = 3;
var CURRENCY = 4;
var NUMERIC = 5;
var ALPHA = 6;
var ALPHA_NUM = 7;
var ZIP_CODE = 8;
var EMAIL_ADDRESS = 9;
var TIME = 10;
var PASSWORD = 11;
/* End Format CONSTANTS */

/* Input Types */
var TEXT = "text";
var RADIO = "radio";
var CHECK = "checkbox";
/* End Input Types */

/*************************************************************
* LOG OUT CONFIRMATION
************************************************************/
function logOut() {
	if (confirm("Are you sure you want to logout?"))
	{ location = "index.jsp?logout"; }
}

/*************************************************************
* DELETE CONFIRMATION
************************************************************/
function confirmDelete(url) {
	//return confirm("Are you sure you want to delete this item"+
	//	((desc != null) ? " ("+desc+")" : "")+"?");
	var confirmed = confirm("Are you sure you want to permanently delete this record?");
	if (url && confirmed) location = url;
	else if (url == null) return confirmed;
	else return;
}

/******************************************************
* CSS DROP-DOWN MENU FUNCTIONS
*****************************************************/
function showIt(div) {
	var obj = document.getElementById(div);
	if (obj != null) obj.style.visibility = 'visible';
}
function hideIt(div) {
	var obj = document.getElementById(div);
	if (obj != null) obj.style.visibility = 'hidden';
}

/*************************************************************
* PAGE SCROLLING
************************************************************/
function toTop() { window.scrollTo(0, 0); }
function toBottom() { window.scrollTo(0, 6000); }

/******************************************************
* WINDOWS STATUS
*****************************************************/
function setStatusMsg(statusMsg)
{ window.status = (statusMsg != null) ? statusMsg : ''; }

/******************************************************
* Date/Time Methods
*****************************************************/
function year(date) { return parseInt(getYear(date)); }
function month(date) { return ((parseInt((m = getMonth(date))) == 0) ? parseInt(m.substring(1, 2)) : parseInt(m)) - 1; }
function day(date) { return (parseInt((d = getDay(date))) == 0) ? parseInt(d.substring(1, 2)) : parseInt(d); }
function dateObj(date) { return new Date(year(date), month(date), day(date)); }

function diff(date1, date2) { return ((date1 - date2) / 1000 / 60 / 60 / 24); }
function addDates(date, days) { return new Date(date.getTime() + (days * 24 * 60 * 60 * 1000)); }

function getMonthAbbr(month) {
	var allMonths = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
	for (var i = 1; i < 13; i++)
	{ if (month == i) return allMonths[i - 1]; }
	return null;
}

function formatTime(time) {
	var timeval = getHour(time) + ":" + getMinutes(time) + " " +
		getAP(time);
	return timeval;
}
function getHour(val) {
	if (val != null && val.length == 4) {
		var newval = parseInt(val.substring(0, 2));
		newval = (newval < 10) ? parseInt(val.substring(1, 2)) : newval;
		if (newval > 12) newval -= 12;
		if (newval == 0) newval = 12;
		return ((newval < 10) ? "0" + newval : newval);
	}
	else if (val != null && val.length >= 12) {
		var newval = parseInt(val.substring(8, 10));
		if (newval > 12) newval -= 12;
		if (newval == 0) newval = 12;
		return ((newval < 10) ? "0" + newval : newval);
	}
	return "";
}
function getMinutes(val) {
	if (val != null && val.length == 4) return val.substring(2, 4);
	else if (val != null && val.length >= 12) return val.substring(10, 12);
	return "";
}
function getAP(val) {
	if (val != null && val.length == 4) {
		var newval = parseInt(val.substring(0, 2));
		return ((newval >= 12) ? "PM" : "AM");
	}
	else if (val != null && val.length >= 12) {
		var newval = parseInt(val.substring(8, 10));
		return ((newval >= 12) ? "PM" : "AM");
	}
	return "AM";
}

function formatDate(date) {
	var dateval = getMonth(date) + "/" + getDay(date) + "/" +
		getYear(date);
	return dateval;
}

function getMonth(val) {
	if (val != null && val.length >= 8) return val.substring(4, 6);
	return "";
}
function getDay(val) {
	if (val != null && val.length >= 8) return val.substring(6, 8);
	return "";
}
function getYear(val) {
	if (val != null && val.length >= 8) return val.substring(0, 4);
	return "";
}

/******************************************************
* Add dollar amounts and handle the listed JavaScript issues we learned 'the hard way'.  For
* subtraction, simply negate 2nd arg (ie -1*y).
*
* - Replace numeric adds (x + y) with (x - (-1*y)) in order to prevent JavaScript
* from doing String append instead of the intended numeric addition.  So, 2 + 3 will
* equal 5 and not the string "2 + 3".
*
* - Use round() and divide/multiply by 100 to ensure results to 1/100 of a dollar (ie 2 decimal
* places).  This will avoid results like 986.11 + (-124) = 1186.11000000000001 (ie should be
* 1186.11).
******************************************************/
function addCurrency(op1, op2) {
	result = op1 - (-1 * op2);
	return (Math.round(result * 100) / 100);
}

/******************************************************
* Convert arg to dollar format (X.XX) or returns "" for invalid amounts.
*****************************************************/
function formatCurrency(pAmount) {
	var amountFormatted = "";

	// Convert to string
	var amount = "";
	if (typeof pAmount == "object") {
		amount = pAmount.toString();
	} else {
		amount = pAmount + "";
	}

	// Continue processing if valid number
	var amountNumber = new Number(amount);
	if (!isNaN(amountNumber)) {
		// Determine dollars
		var dollars = amount.substring(0, amount.indexOf(".")); // if no . returns empty value
		if (dollars.length == 0) {
			dollars = amount;
		}

		// Determine cents and format a result
		var cents = amount.substring(amount.indexOf(".") + 1); // if no . returns whole value
		if ((cents == amount) || (cents.length == 0)) {	// XXX or XXX.
			amountFormatted = dollars + ".00";
		} else if (cents.length == 1) {		// XXX.X
			amountFormatted = dollars + "." + cents + "0";
		} else if (cents.length == 2) {		// XXX.XX
			amountFormatted = amount;
		} else {
			// XXX.XXX...
		}
	}

	return amountFormatted;
}

/******************************************************
* AUTO-TAB FEATURE
*
* Insert the following code into a text field:
* .. onKeyUp="return autoTab(this, 2, event);" ..
* The number 2 represents the number of
* characters to be entered before it tabs over
*****************************************************/
var isNN = (navigator.appName.indexOf("Netscape") != -1); //TEST BROWSER
function autoTab(input, len, e) {
	var keyCode = (isNN) ? e.which : e.keyCode;
	var filter = (isNN) ? [0, 8, 9] : [0, 8, 9, 16, 17, 18, 37, 38, 39, 40, 46];

	if (input.value.length >= len && !containsElement(filter, keyCode)) {
		var t = (getIndex(input) + 1) % input.form.length;
		input.value = input.value.slice(0, len);
		input.form[t].focus();
		if (input.form[t].type == 'text')
		{ input.form[t].select(); }
	}

	function containsElement(arr, ele) {
		var found = false, index = 0;
		while (!found && index < arr.length) {
			if (arr[index] == ele) found = true;
			else index++;
		}
		return found;
	}

	function getIndex(input) {
		var index = -1, i = 0, found = false;
		while (i < input.form.length && index == -1) {
			if (input.form[i] == input) index = i;
			else i++;
		}
		return index;
	}
	return true;
}

/******************************************************
* openWin
*
* This method opens a new method with the specified
* size and url.
*****************************************************/
function openWin(URL, width, height, name) {
	var settings = "toolbar=0,location=0,statusbar=0,menubar=0,resizable=1";
	var windowname = (name != null) ? name : 'winPop';
	if (name == null) {
		if (URL.indexOf(".jsp") > -1) windowname = URL.substring(0, URL.indexOf(".jsp"));
		while (windowname.indexOf("/") > -1)
		{ windowname = windowname.substring(windowname.indexOf("/") + 1); }
		if (windowname.length > 20) windowname = windowname.substring(0, 20);
	}

	/** scrollbars */
	settings += ",scrollbars=1";

	/** dimensions for specific pages */
	if (false) settings += ",width=400,height=450";
	else {
		if (width == null) settings += ",width=450,height=500";
		else settings += ",width=" + width + ",height=" + height;
	}
	window.child = window.open(URL, windowname, settings);
	if (window.opener == null) window.opener = self;
	child.focus();
}

/******************************************************
* DATE SELECTOR
*
* This method opens the Quick Calendar date selector.
*****************************************************/
function dateSelector(object, newmonth, newyear, formname, idx) {
	newmonth = (newmonth == null) ? "" : newmonth;
	newyear = (newyear == null) ? "" : newyear;
	formname = (formname == null) ? "form" : formname;
	var params = "?object=" + object + "&newmonth=" + newmonth + "&newyear=" + newyear + "&formname=" + formname;
	if (idx != null) params += "&idx=" + idx;
	openWin('DateSelector.aspx' + params, '285', '350');
}

/*************************************************************
* NUMERIC Field Validator
************************************************************/
function chkNum(field_value, field_desc, numeric_only, icd) {
	if (numeric_only == null) numeric_only = false;
	if (icd == null) icd = false;
	if (field_value.length > 0) {
		var nmbs = "0123456789" + ((!numeric_only) ? "-." : "");
		nmbs += (icd) ? "VvEe" : "";
		var bad = 0;
		var str;

		for (var n = 0; n < field_value.length; n++) {
			str = field_value.substring(n, n + 1);
			if (nmbs.indexOf(str) < 0)
			{ bad++; }
		}

		if (bad > 0)
		{ return ("\n * " + field_desc + " has invalid characters"); }
		else return ("");
	}
	else return ("");
}

/*************************************************************
* ALPHA Field Validator
************************************************************/
function chkAlpha(field_value, field_desc) {
	field_value = field_value.toLowerCase();
	if (field_value.length > 0) {
		var nmbs = "abcdefghijklmnopqrstuvwxyz ";
		var bad = 0;
		var str;

		for (var n = 0; n < field_value.length; n++) {
			str = field_value.substring(n, n + 1);
			if (nmbs.indexOf(str) < 0)
			{ bad++; }
		}

		if (bad > 0)
		{ return ("\n * " + field_desc + " has invalid characters"); }
		else return ("");
	}
	else return ("");
}

/*************************************************************
* ALPHA-NUMERIC Field Validator
************************************************************/
function chkAlphaNum(field_value, field_desc) {
	field_value = field_value.toLowerCase();
	if (field_value.length > 0) {
		var nmbs = "-abcdefghijklmnopqrstuvwxyz0123456789. ";
		var bad = 0;
		var str;

		for (var n = 0; n < field_value.length; n++) {
			str = field_value.substring(n, n + 1);
			if (nmbs.indexOf(str) < 0)
			{ bad++; }
		}

		if (bad > 0)
		{ return ("\n * " + field_desc + " has invalid characters"); }
		else return ("");
	}
	else return ("");
}

/*************************************************************
* SSN Field Validator
************************************************************/
function chkSSN(name_of_field, field_desc, formname) {
	field_desc = (field_desc == null || field_desc.length < 1) ? name_of_field : field_desc;
	formname = (formname == null) ? "form" : formname;

	var SSN1 = eval("document." + formname + "." + name_of_field + "1");
	var SSN2 = eval("document." + formname + "." + name_of_field + "2");
	var SSN3 = eval("document." + formname + "." + name_of_field + "3");
	if (field_desc == name_of_field && SSN1.title.length > 0)
	{ field_desc = SSN1.title; }

	var isComplete = (SSN1.value.length > 0 ||
						SSN2.value.length > 0 ||
						SSN3.value.length > 0) ? true : false;
	messagetmp = "";
	if (isComplete) {
		messagetmp += chkNum(SSN1.value, field_desc, true);
		messagetmp += chkNum(SSN2.value, field_desc, true);
		messagetmp += chkNum(SSN3.value, field_desc, true);
		if (messagetmp.length < 1) {
			if (SSN1.value.length < 3 || SSN2.value.length < 2 || SSN3.value.length < 4)
			{ messagetmp += ("\n * " + field_desc + " has an incorrect number of digits"); }
		}
	}
	if (messagetmp.length > 0) {
		SSN1.style.background = ERROR_BGCOLOR;
		SSN2.style.background = ERROR_BGCOLOR;
		SSN3.style.background = ERROR_BGCOLOR;
	}
	return (messagetmp);
}

/*************************************************************
* PHONE Field Validator
************************************************************/
function chkPhone(name_of_field, field_desc, formname) {
	field_desc = (field_desc == null || field_desc.length < 1) ? name_of_field : field_desc;
	formname = (formname == null) ? "form" : formname;

	var area = eval("document." + formname + "." + name_of_field + "AC");
	var pref = eval("document." + formname + "." + name_of_field + "PRE");
	var suff = eval("document." + formname + "." + name_of_field + "SUF");
	var extn = (eval("document." + formname + "." + name_of_field + "EXT")) ? eval("document." + formname + "." + name_of_field + "EXT") : null;
	if (field_desc == name_of_field && area.title.length > 0)
	{ field_desc = area.title; }

	messagetmp = "";
	if (area.value.length > 0) messagetmp += chkNum(area.value, field_desc);
	if (pref.value.length > 0) messagetmp += chkNum(pref.value, field_desc);
	if (suff.value.length > 0) messagetmp += chkNum(suff.value, field_desc);
	if (extn != null && extn.value.length > 0) messagetmp += chkNum(extn.value, field_desc);

	if (messagetmp.length < 1) {
		if (area.value.length > 0 || pref.value.length > 0 || suff.value.length > 0) {
			if (area.value.length < 3 || pref.value.length < 3 || suff.value.length < 4)
			{ messagetmp += ("\n * " + field_desc + " has an incorrect number of digits."); }
		}
	}
	if (messagetmp.length > 0) {
		area.style.background = ERROR_BGCOLOR;
		pref.style.background = ERROR_BGCOLOR;
		suff.style.background = ERROR_BGCOLOR;
		extn.style.background = ERROR_BGCOLOR;
	}
	return (messagetmp);
}

/*************************************************************
* DATE Field Validator
************************************************************/
function chkDate(name_of_field, field_desc, formname, idx) {
	formname = (formname == null) ? "form" : formname;
	field_desc = (field_desc == null || field_desc.length < 1) ? name_of_field : field_desc;

	if (idx == null) idx = 0;
	var array = (eval("document." + formname + "." + name_of_field + "Month[" + idx + "]")) ? true : false;
	var arrayNxt = (eval("document." + formname + "." + name_of_field + "Month[" + (idx + 1) + "]")) ? true : false;
	messagetmp = "";

	var arrayVal = (array) ? "[" + idx + "]" : "";
	if (field_desc == name_of_field && eval("document." + formname + "." + name_of_field + "Month" + arrayVal + ".title") &&
		eval("document." + formname + "." + name_of_field + "Month" + arrayVal + ".title.length > 0"))
	{ field_desc = eval("document." + formname + "." + name_of_field + "Month" + arrayVal + ".title"); }

	var myDay = eval("document." + formname + "." + name_of_field + "Day" + arrayVal);
	var myMonth = eval("document." + formname + "." + name_of_field + "Month" + arrayVal);
	var myYear = eval("document." + formname + "." + name_of_field + "Year" + arrayVal);

	var now = new Date();
	var nowYear = "" + now.getYear();
	nowYear = parseInt(nowYear.substring(2));

	myDay.value = (myDay.value.length > 0 && myDay.value.length < 2) ? "0" + myDay.value : myDay.value;
	myMonth.value = (myMonth.value.length > 0 && myMonth.value.length < 2) ? "0" + myMonth.value : myMonth.value;
	myYear.value = (myYear.value.length > 0 && myYear.value.length == 2 && parseInt(myYear.value) < (nowYear + 3)) ? "20" + myYear.value :
		((myYear.value.length == 2 && parseInt(myYear.value) >= (nowYear + 3)) ? "19" + myYear.value :
		((myYear.value.length == 3) ? "BAD" : myYear.value));

	var myDayStr = myDay.value;
	var myMonthStr = myMonth.value;
	var myYearStr = myYear.value;

	var isComplete = (myDayStr.length > 0 || myMonthStr.length > 0 || myYearStr.length > 0);
	if (isComplete) {
		var allMonths = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
		for (var i = 1; i < 13; i++)
		{ if (myMonthStr == i) myMonthStr = allMonths[i - 1]; }

		var myDateStr = myDayStr + ' ' + myMonthStr + ' ' + myYearStr;
		var myDate = new Date(myDateStr);
		var myDate_string = myDate.toGMTString();
		var myDate_array = myDate_string.split(' ');

		if ((myDate_array[2] != myMonthStr) || (myYearStr.length == 4 && parseInt(myYearStr) < 1900)) {
			myDateStr = myMonthStr + ' ' + myDayStr + ", " + myYearStr;
			messagetmp += ('\n * ' + field_desc + ': ("' + myDateStr + '")');
		}
	}
	if (messagetmp.length > 0) {
		myDay.style.background = ERROR_BGCOLOR;
		myMonth.style.background = ERROR_BGCOLOR;
		myYear.style.background = ERROR_BGCOLOR;
	}
	if (arrayNxt && messagetmp.length == 0) return chkDate(name_of_field, name_of_field, formname, idx + 1);
	else return (messagetmp);
}

/*************************************************************
* CURRENCY Field Validator
************************************************************/
function chkCurrency(name_of_field, field_desc, formname) {
	formname = (formname == null) ? "form" : formname;
	field_desc = (field_desc == null || field_desc.length < 1) ? name_of_field : field_desc;
	if (field_desc == name_of_field && eval("document." + formname + "." + name_of_field + ".title.length > 0"))
	{ field_desc = eval("document." + formname + "." + name_of_field + ".title"); }

	var amt = eval("document." + formname + "." + name_of_field);

	messagetmp = "";
	if (amt.value.length > 0) {
		if (amt.value.substring(0, 1) == "$") amt.value = amt.value.substring(1, amt.value.length);
		messagetmp += chkNum(amt.value, field_desc);
	}

	if (messagetmp.length < 1 && amt.value.length > 0) {
		if (amt.value.indexOf(".") < 0)
		{ amt.value = amt.value + ".00"; }
		else {
			var amount = "";
			var dollar = amt.value.substring(0, amt.value.indexOf("."));
			var cents = amt.value.substring(amt.value.indexOf(".") + 1);
			if (cents.length > 2) {
				amount = "" + (Math.round(amt.value * 100) / 100);
				cents = amount.substring(amount.indexOf(".") + 1);
			}

			//if (cents.length > 2) messagetmp += "\n * "+field_desc+" is an incorrect dollar amount.";
			if (cents.length == 0) cents = "00";
			else if (cents.length < 2) cents = cents + "0";
			amount = dollar + "." + cents;

			if (messagetmp.length < 1) amt.value = amount;
		}
	}
	if (messagetmp.length > 0) { mt.style.background = ERROR_BGCOLOR; }
	return (messagetmp);
}

/*************************************************************
* TIME Field Validator
************************************************************/
function chkTime(name_of_field, field_desc, formname, idx) {
	formname = (formname == null) ? "form" : formname;
	field_desc = (field_desc == null || field_desc.length < 1) ? name_of_field : field_desc;

	if (idx == null) idx = 0;
	var array = (eval("document." + formname + "." + name_of_field + "HH[" + idx + "]")) ? true : false;
	var arrayNxt = (eval("document." + formname + "." + name_of_field + "HH[" + (idx + 1) + "]")) ? true : false;

	var arrayVal = (array) ? "[" + idx + "]" : "";
	if (field_desc == name_of_field && eval("document." + formname + "." + name_of_field + "HH" + arrayVal + ".title.length > 0"))
	{ field_desc = eval("document." + formname + "." + name_of_field + "HH" + arrayVal + ".title"); }

	var hour = eval("document." + formname + "." + name_of_field + "HH" + arrayVal + "");
	var minute = eval("document." + formname + "." + name_of_field + "MM" + arrayVal + "");

	messagetmp = "";
	if (hour.value.length > 0) messagetmp += chkNum(hour.value, field_desc);
	if (minute.value.length > 0) messagetmp += chkNum(minute.value, field_desc);

	if (messagetmp.length < 1 && hour.value.length > 0) {
		if (hour.value.length == 1) hour.value = "0" + hour.value;
		if (minute.value.length == 1) minute.value = "0" + minute.value;
		else if (minute.value.length == 0) minute.value = "00";

		var hourInt = parseInt(hour.value);
		var minuteInt = parseInt(minute.value);
		if (hourInt > 12) messagetmp += "\n * " + field_desc + " is an incorrect time.";
		else if (minuteInt > 59) messagetmp += "\n * " + field_desc + " is an incorrect time.";
	}
	if (messagetmp.length > 0) {
		hour.style.background = ERROR_BGCOLOR;
		minute.style.background = ERROR_BGCOLOR;
	}
	if (arrayNxt && messagetmp.length == 0) return chkTime(name_of_field, name_of_field, formname, idx + 1);
	else return (messagetmp);
}

/*************************************************************
* ZIPCODE Field Validator
************************************************************/
function chkZip(name_of_field, field_desc, formname) {
	formname = (formname == null) ? "form" : formname;
	field_desc = (field_desc == null || field_desc.length < 1) ? name_of_field : field_desc;

	var array = (eval("document." + formname + "." + name_of_field + "1[0]")) ? true : false;
	var arrayLng = (array) ? eval("document." + formname + "." + name_of_field + "1.length") : 1;

	messagetmp = "";
	for (var i = 0; i < arrayLng; i++) {
		var arrayVal = (array) ? "[" + i + "]" : "";
		var thismessage = "";

		var zip1 = eval("document." + formname + "." + name_of_field + "1" + arrayVal);
		var zip2 = eval("document." + formname + "." + name_of_field + "2" + arrayVal);
		if (field_desc == name_of_field && zip1.title.length > 0)
		{ field_desc = zip1.title; }

		if (zip1.value.length == 3) thismessage += chkAlphaNum(zip1.value, field_desc + ((array) ? " (Row " + (i + 1) + ")" : ""));
		else if (zip1.value.length > 0) thismessage += chkNum(zip1.value, field_desc + ((array) ? " (Row " + (i + 1) + ")" : ""));
		if (zip2.value.length == 3) thismessage += chkAlphaNum(zip2.value, field_desc + ((array) ? " (Row " + (i + 1) + ")" : ""));
		else if (zip2.value.length > 0) thismessage += chkNum(zip2.value, field_desc + ((array) ? " (Row " + (i + 1) + ")" : ""));

		if (thismessage.length < 1) {
			if (zip1.value.length != 3 || zip2.value.length != 3) {
				if ((zip1.value.length > 0 && zip1.value.length < 5) ||
					(zip2.value.length > 0 && zip2.value.length < 4)) {
					thismessage += ("\n * " + field_desc + ((array) ? " (Row " + (i + 1) + ")" : "") + " has an incorrect number of digits.");
				}
			}
		}
		if (thismessage.length > 0) { zip1.style.background = ERROR_BGCOLOR; zip2.style.background = ERROR_BGCOLOR; }
		messagetmp += thismessage;
	}
	return (messagetmp);
}

/*************************************************************
* EMAIL Field Validator
************************************************************/
function chkEmail(name_of_field, field_desc, formname) {
	formname = (formname == null) ? "form" : formname;
	field_desc = (field_desc == null || field_desc.length < 1) ? name_of_field : field_desc;
	if (field_desc == name_of_field && eval("document." + formname + "." + name_of_field + ".title.length > 0"))
	{ field_desc = eval("document." + formname + "." + name_of_field + ".title"); }

	var field = eval("document." + formname + "." + name_of_field);
	var field_value = field.value.toLowerCase();

	messagetmp = "";
	if (field_value.length > 0) {
		if (field_value.indexOf("@") <= 0 || field_value.indexOf(".") <= 0)
		{ messagetmp += ("\n * " + field_desc + " is an invalid email address"); }
		else {
			var nmbs = "abcdefghijklmnopqrstuvwxyz0123456789._@-+";
			var bad = 0;
			var str;

			for (var n = 0; n < field_value.length; n++) {
				str = field_value.substring(n, n + 1);
				if (nmbs.indexOf(str) < 0)
				{ bad++; }
			}

			if (bad > 0)
			{ messagetmp += ("\n * " + field_desc + " has invalid characters"); }
		}
	}
	if (messagetmp.length > 0) { field.style.background = ERROR_BGCOLOR; }
	return (messagetmp);
}

/*************************************************************
* PASSWORD Field Validator
************************************************************/
function chkPassword(name_of_field, field_desc, formname) {
	formname = (formname == null) ? "form" : formname;
	field_desc = (field_desc == null || field_desc.length < 1) ? name_of_field : field_desc;
	if (field_desc == name_of_field && eval("document." + formname + "." + name_of_field + ".title.length > 0"))
	{ field_desc = eval("document." + formname + "." + name_of_field + ".title"); }

	var field = eval("document." + formname + "." + name_of_field);
	var field_value = field.value.toLowerCase();

	messagetmp = "";
	if (field_value.length > 0 && field_value.length < 8) messagetmp += "\n * " + field_desc + " does not contain at least 8 characters";
	else if (field_value.length > 0) {
		var alpha = "abcdefghijklmnopqrstuvwxyz";
		var num = "0123456789";
		var bad = 0;
		var str;

		var hasAlpha = false;
		var hasNum = false;
		for (var n = 0; n < field_value.length; n++) {
			str = field_value.substring(n, n + 1);
			if (alpha.indexOf(str) > -1) hasAlpha = true;
			if (num.indexOf(str) > -1) hasNum = true;
			if (alpha.indexOf(str) < 0 && num.indexOf(str) < 0) { bad++; }
		}

		if (bad > 0) { messagetmp += ("\n * " + field_desc + " has invalid characters"); }
		else if (!hasAlpha || !hasNum) messagetmp += "\n * " + field_desc + " does not contain alpha and numeric characters";
	}
	if (messagetmp.length > 0) { field.style.background = ERROR_BGCOLOR; }
	return (messagetmp);
}

/*************************************************************
* REQUIRED Field Validator
************************************************************/
function chkRequired(name_of_field, input_type, format_type, field_desc, formname) {
	formname = (formname == null) ? "form" : formname;
	field_desc = (field_desc == null || field_desc.length < 1) ? name_of_field : field_desc;

	messagetmp = "";
	if (input_type == "text") {
		if (format_type == SOCIAL_SECURITY || format_type == ZIP_CODE) {
			var array = (eval("document." + formname + "." + name_of_field + "1[0]")) ? true : false;
			var arrayLng = (array) ? eval("document." + formname + "." + name_of_field + "1.length") : 1;
			for (var i = 0; i < arrayLng; i++) {
				var arrayVal = (array) ? "[" + i + "]" : "";

				if (eval("!document." + formname + "." + name_of_field + "1" + arrayVal + ".disabled")) {
					if ((format_type == ZIP_CODE) &&
						(eval("document." + formname + "." + name_of_field + "1" + arrayVal + ".value.length < 1"))) {
						if (field_desc == name_of_field && eval("document." + formname + "." + name_of_field + "1" + arrayVal + ".title.length > 0"))
						{ field_desc = eval("document." + formname + "." + name_of_field + "1" + arrayVal + ".title"); }
						messagetmp += ("\n * " + field_desc + ((array) ? " (Row " + (i + 1) + ")" : ""));
					}
					else if ((format_type == SOCIAL_SECURITY) &&
						(eval("document." + formname + "." + name_of_field + "1" + arrayVal + ".value.length < 1") ||
						 eval("document." + formname + "." + name_of_field + "2" + arrayVal + ".value.length < 1") ||
						 eval("document." + formname + "." + name_of_field + "3" + arrayVal + ".value.length < 1"))) {
						if (field_desc == name_of_field && eval("document." + formname + "." + name_of_field + "1" + arrayVal + ".title.length > 0"))
						{ field_desc = eval("document." + formname + "." + name_of_field + "1" + arrayVal + ".title"); }
						messagetmp += ("\n * " + field_desc + ((array) ? " (Row " + (i + 1) + ")" : ""));
					}
				}
			}
		}
		else if (format_type == PHONE_NUMBER) {
			if (eval("!document." + formname + "." + name_of_field + "AC.disabled") &&
			   (eval("document." + formname + "." + name_of_field + "AC.value.length < 1") ||
				eval("document." + formname + "." + name_of_field + "PRE.value.length < 1") ||
				eval("document." + formname + "." + name_of_field + "SUF.value.length < 1"))) {
				if (field_desc == name_of_field && eval("document." + formname + "." + name_of_field + "AC.title.length > 0"))
				{ field_desc = eval("document." + formname + "." + name_of_field + "AC.title"); }
				messagetmp += ("\n * " + field_desc);
			}
		}
		else if (format_type == DATE) {
			var array = (eval("document." + formname + "." + name_of_field + "Month[0]")) ? true : false;
			var arrayLng = (array) ? eval("document." + formname + "." + name_of_field + "Month.length") : 1;
			for (var i = 0; i < arrayLng; i++) {
				var arrayVal = (array) ? "[" + i + "]" : "";
				if (eval("!document." + formname + "." + name_of_field + "Month" + arrayVal + ".disabled") &&
				   (eval("document." + formname + "." + name_of_field + "Month" + arrayVal + ".value.length < 1") ||
					eval("document." + formname + "." + name_of_field + "Day" + arrayVal + ".value.length < 1") ||
					eval("document." + formname + "." + name_of_field + "Year" + arrayVal + ".value.length < 1"))) {
					if (field_desc == name_of_field || eval("document." + formname + "." + name_of_field + "Month" + arrayVal + ".title.length > 0"))
					{ field_desc = eval("document." + formname + "." + name_of_field + "Month" + arrayVal + ".title"); }
					messagetmp += ("\n * " + field_desc);
				}
			}
		}
		else if (format_type == TIME) {
			var array = (eval("document." + formname + "." + name_of_field + "HH[0]")) ? true : false;
			var arrayLng = (array) ? eval("document." + formname + "." + name_of_field + "HH.length") : 1;
			for (var i = 0; i < arrayLng; i++) {
				var arrayVal = (array) ? "[" + i + "]" : "";
				if (eval("!document." + formname + "." + name_of_field + "HH" + arrayVal + ".disabled") &&
				   (eval("document." + formname + "." + name_of_field + "HH" + arrayVal + ".value.length < 1"))) {
					if (field_desc == name_of_field || eval("document." + formname + "." + name_of_field + "HH" + arrayVal + ".title.length > 0"))
					{ field_desc = eval("document." + formname + "." + name_of_field + "HH" + arrayVal + ".title"); }
					messagetmp += ("\n * " + field_desc);
				}
			}
		}
		else {
			//alert("document."+formname+"."+name_of_field+"[0]");
			var array = (eval("document." + formname + "." + name_of_field + "[0]")) ? true : false;
			var arrayLng = (array) ? eval("document." + formname + "." + name_of_field + ".length") : 1;
			array = (array && eval("typeof document." + formname + "." + name_of_field + "[0].type") != "undefined");
			arrayLng = (array) ? eval("document." + formname + "." + name_of_field + ".length") : 1;
			for (var i = 0; i < arrayLng; i++) {
				var arrayVal = (array) ? "[" + i + "]" : "";
				if (eval("!document." + formname + "." + name_of_field + "" + arrayVal + ".disabled") &&
					(eval("document." + formname + "." + name_of_field + "" + arrayVal + ".value.length < 1"))) {
					if (field_desc == name_of_field || eval("document." + formname + "." + name_of_field + "" + arrayVal + ".title.length > 0"))
					{ field_desc = eval("document." + formname + "." + name_of_field + "" + arrayVal + ".title"); }
					messagetmp += ("\n * " + field_desc);
				}
			}
		}
	}
	else if (input_type == "radio") {
		var isChecked = true;
		var radio = eval("document." + formname + "." + name_of_field);
		for (var i = 0; i < radio.length; i++) {
			if (!radio[i].disabled) isChecked = false;
			if (radio[i].checked) { isChecked = true; break; }
		}
		if (field_desc == name_of_field && eval("document." + formname + "." + name_of_field + ".title.length > 0"))
		{ field_desc = eval("document." + formname + "." + name_of_field + ".title"); }
		if (!isChecked)
		{ messagetmp += ("\n * " + field_desc); }
	}
	else if (input_type == "checkbox") {
		var isChecked = false;
		if (checkbox = eval("document." + formname + "." + name_of_field)) {
			if (checkbox.disabled || checkbox.checked)
			{ isChecked = true; }
		}
		else if (eval("document." + formname + "." + name_of_field + "a")) {
			var letters = "abcdefghijklmnopqrstuvwxyz";
			var n = 0;
			while (checkbox = eval("document." + formname + "." + name_of_field + "" + letters.substring(n, n + 1))) {
				n++;
				if (checkbox.disabled || checkbox.checked)
				{ isChecked = true; }
			}
			if (field_desc == name_of_field && eval("document." + formname + "." + name_of_field + "" + letters.substring(n, n + 1) + ".title.length > 0"))
			{ field_desc = eval("document." + formname + "." + name_of_field + "" + letters.substring(n, n + 1) + ".title"); }
		}
		else {
			var n = 1;
			if (eval("document." + formname + "." + name_of_field + "" + 0)) n = 0;
			while (checkbox = eval("document." + formname + "." + name_of_field + "" + n)) {
				n++;
				if (checkbox.disabled || checkbox.checked)
				{ isChecked = true; }
			}
			if (field_desc == name_of_field && eval("document." + formname + "." + name_of_field + "" + 1 + ".title.length > 0"))
			{ field_desc = eval("document." + formname + "." + name_of_field + "" + 1 + ".title"); }
		}

		if (!isChecked)
		{ messagetmp += ("\n * " + field_desc); }
	}
	return (messagetmp);
}

/*************************************************************
* MAIN Form Validator
************************************************************/
function validateForm(params, formname) {
	/****************************************
	* CONSTANTS
	*
	* var NONE				= 0;
	* var SOCIAL_SECURITY 	= 1;
	* var PHONE_NUMBER 	= 2;
	* var DATE 			= 3;
	* var CURRENCY 		= 4;
	* var NUMERIC 			= 5;
	* var ALPHA 			= 6;
	* var ALPHA_NUM 		= 7;
	* var ZIP_CODE			= 8;
	* var EMAIL_ADDRESS	= 9;
	* var TIME				= 10;
	* var PASSWORD			= 11;
	***************************************/

	/****************************************
	* params[
	*	[
	*	String name_of_field,
	*	String input_type,
	*	Constant format_type,
	*	boolean required,
	*	Integer field_desc
	*	]
	*		 ]
	***************************************/
	var messagetxt = "";
	var messagereq = "";
	var messagedt = "";
	var messagefld = "";
	formname = (formname == null) ? "form" : formname;
	for (var i = 0; i < params.length; i++) {
		var name_of_field = params[i][0];
		var input_type = params[i][1];
		var format_type = params[i][2];
		var required = params[i][3];
		var field_desc = params[i][4];

		var chkttl = false;
		field_desc = (chkttl = (typeof field_desc == 'undefined' || field_desc == null || field_desc.length < 1)) ? name_of_field : field_desc;
		var ttl = eval("document." + formname + "." + name_of_field);
		if (input_type == "radio" && chkttl && ttl[0].title && ttl[0].title.length > 0)
		{ field_desc = eval("document." + formname + "." + name_of_field + "[0].title"); }
		else if (chkttl && ((ttl && ttl.title && ttl.title.length > 0) || (ttl && ttl[0] && ttl[0].title && ttl[0].title.length > 0))) {
			if (ttl[0]) field_desc = eval("document." + formname + "." + name_of_field + "[0].title");
			else field_desc = eval("document." + formname + "." + name_of_field + ".title");
		}

		if (required)
		{ messagereq += chkRequired(name_of_field, input_type, format_type, field_desc, formname); }
		if (format_type == DATE)
		{ messagedt += chkDate(name_of_field, field_desc, formname); }
		else if (format_type == CURRENCY)
		{ messagefld += chkCurrency(name_of_field, field_desc, formname); }
		else if (format_type == SOCIAL_SECURITY)
		{ messagefld += chkSSN(name_of_field, field_desc, formname); }
		else if (format_type == PHONE_NUMBER)
		{ messagefld += chkPhone(name_of_field, field_desc, formname); }
		else if (format_type == NUMERIC) {
			var fld = eval("document." + formname + "." + name_of_field);
			var isArr = (fld && fld[0]) ? true : false;
			var arrLng = (isArr) ? fld.length : 1;
			for (var j = 0, n = arrLng; j < n; j++) {
				var arrStr = (isArr) ? "[" + j + "]" : "";
				fld = (isArr) ? eval("document." + formname + "." + name_of_field + arrStr) : fld;
				messagetmp = chkNum(fld.value, field_desc);
				if (messagetmp.length > 0) fld.style.background = ERROR_BGCOLOR;
				messagefld += messagetmp;
			}
		}
		else if (format_type == ALPHA) {
			var fld = eval("document." + formname + "." + name_of_field);
			var isArr = (fld && fld[0]) ? true : false;
			var arrLng = (isArr) ? fld.length : 1;
			for (var j = 0, n = arrLng; j < n; j++) {
				var arrStr = (isArr) ? "[" + j + "]" : "";
				fld = (isArr) ? eval("document." + formname + "." + name_of_field + arrStr) : fld;
				messagetmp = chkAlpha(fld.value, field_desc);
				if (messagetmp.length > 0) fld.style.background = ERROR_BGCOLOR;
				messagefld += messagetmp;
			}
		}
		else if (format_type == ALPHA_NUM) {
			var fld = eval("document." + formname + "." + name_of_field);
			var isArr = (fld && fld[0]) ? true : false;
			var arrLng = (isArr) ? fld.length : 1;
			for (var j = 0, n = arrLng; j < n; j++) {
				var arrStr = (isArr) ? "[" + j + "]" : "";
				fld = (isArr) ? eval("document." + formname + "." + name_of_field + arrStr) : fld;
				messagetmp = chkAlphaNum(fld.value, field_desc);
				if (messagetmp.length > 0) fld.style.background = ERROR_BGCOLOR;
				messagefld += messagetmp;
			}
		}
		else if (format_type == ZIP_CODE)
		{ messagefld += chkZip(name_of_field, field_desc, formname); }
		else if (format_type == EMAIL_ADDRESS)
		{ messagefld += chkEmail(name_of_field, field_desc, formname); }
		else if (format_type == PASSWORD)
		{ messagefld += chkPassword(name_of_field, field_desc, formname); }
		else if (format_type == TIME)
		{ messagefld += chkTime(name_of_field, field_desc, formname); }
	}

	if (messagereq.length > 0)
	{ messagetxt += "\nTHE FOLLOWING FIELDS ARE REQUIRED:\n__________________________________\n" + messagereq; }
	if (messagedt.length > 0)
	{ messagetxt += "\n\nTHE FOLLOWING DATE FIELDS ARE INVALID:\n__________________________________\n" + messagedt; }
	if (messagefld.length > 0)
	{ messagetxt += "\n\nTHE FOLLOWING FIELDS ARE INVALID:\n__________________________________\n" + messagefld; }

	if (messagetxt.length > 0) {
		alert(messagetxt);
		return (false);
	}
	else return (true);
}

/*************************************************************
* SET REQUIRED
*
* This method is designed to loop through the specified
* param fields and colorize the ones indicated as required.
************************************************************/
function setRequired(params, formname, resetAll) {
	formname = (formname == null) ? "form" : formname;
	var form = eval("document." + formname);
	resetAll = (resetAll == null) ? false : resetAll;

	/** Loop through params checking for required fields */
	for (var i = 0; i < params.length; i++) {
		/** param vars */
		var name_of_field = params[i][0];
		var input_type = params[i][1];
		var format_type = params[i][2];
		var required = params[i][3];
		var field_desc = params[i][4];

		/** vars for array fields */
		var array = false;
		var arrayLng = -1;
		var arrayVal = "";

		/** form field objects */
		var field1 = null;
		var field2 = null;
		var field3 = null;
		var field4 = null;

		/** Check for required */
		var newBGColor = (required) ? REQUIRED_BGCOLOR : NORMAL_BGCOLOR;
		if (required || resetAll) {
			/** Set field vars based on format_type */
			if (input_type != "checkbox") {
				if (format_type == SOCIAL_SECURITY || format_type == ZIP_CODE) {
					field1 = (form[name_of_field + "1"]) ? form[name_of_field + "1"] : null;
					field2 = (form[name_of_field + "2"]) ? form[name_of_field + "2"] : null;
					field3 = (form[name_of_field + "3"]) ? form[name_of_field + "3"] : null;
				}
				else if (format_type == DATE) {
					field1 = (form[name_of_field + "Month"]) ? form[name_of_field + "Month"] : null;
					field2 = (form[name_of_field + "Day"]) ? form[name_of_field + "Day"] : null;
					field3 = (form[name_of_field + "Year"]) ? form[name_of_field + "Year"] : null;
				}
				else if (format_type == PHONE_NUMBER) {
					field1 = (form[name_of_field + "AC"]) ? form[name_of_field + "AC"] : null;
					field2 = (form[name_of_field + "PRE"]) ? form[name_of_field + "PRE"] : null;
					field3 = (form[name_of_field + "SUF"]) ? form[name_of_field + "SUF"] : null;
					field4 = (form[name_of_field + "EXT"]) ? form[name_of_field + "EXT"] : null;
				}
				else if (format_type == TIME) {
					field1 = (form[name_of_field + "HH"]) ? form[name_of_field + "HH"] : null;
					field2 = (form[name_of_field + "MM"]) ? form[name_of_field + "MM"] : null;
					field3 = (form[name_of_field + "AP"]) ? form[name_of_field + "AP"] : null;
				}
				else {
					field1 = (form[name_of_field]) ? form[name_of_field] : null;
				}

				/** Check for array */
				array = (field1 && field1[0]) ? true : false;
				if (field1[0] && field1.type && field1.type.indexOf("select") > 0) array = false;
				if (field1[0] && field1.options) arrayLng = field1.options.length;
				else arrayLng = (array) ? field1.length : 1;

				for (var x = 0; x < arrayLng; x++) {
					/** is select box */
					var isSel1 = (field1 && field1.options && field1.options[x]) ? true : false;
					var isSel2 = (field2 && field2.options) ? true : false;
					var isSel3 = (field3 && field3.options) ? true : false;
					var isSel4 = (field4 && field4.options) ? true : false;

					/** Check for array */
					var nField1 = (array && field1) ? (isSel1) ? field1.options[x] : field1[x] : (field1) ? field1 : null;
					var nField2 = (array && field2) ? (isSel2) ? field2.options[x] : field2[x] : (field2) ? field2 : null;
					var nField3 = (array && field3) ? (isSel3) ? field3.options[x] : field3[x] : (field3) ? field3 : null;
					var nField4 = (array && field4) ? (isSel4) ? field4.options[x] : field4[x] : (field4) ? field4 : null;

					/** Mark required fields */
					if (nField1) nField1.style.background = newBGColor;
					if (nField2) nField2.style.background = newBGColor;
					if (nField3) nField3.style.background = newBGColor;
					if (nField4) nField4.style.background = newBGColor;
				}
			}
			else {
				var isLetter = (form[name_of_field + "a"]) ? true : false;
				var letters = "abcdefghijklmnopqrstuvwxyz";
				var n = 0;
				var suffix = (isLetter) ? letters.substring(n, n + 1) : "" + n;
				var chk = null;
				while (chk = form[name_of_field + suffix]) {
					n++;
					suffix = (isLetter) ? letters.substring(n, n + 1) : "" + n;
					chk.style.background = newBGColor;
					/*
					chk.style.background = REQD_CHK_BGCOLOR; //newBGColor;
					chk.style.height = "16px";
					chk.style.width = "16px";
					*/
				}
			}
		}
	}
}

function doNothing() { }

function round(number, decimalDigits) {
	return Math.round(number * Math.pow(10, decimalDigits)) / Math.pow(10, decimalDigits);
}

var num_correct = 0;
function checkAnswer(fld, crrt)
	{
		//var form = document.getElementById("form1");
	var selected = 0;
	for (var i = 0; i < fld.length; i++) { if (fld[i].checked) { selected = i; break; } }
	if (mark = document.getElementById("checked_" + selected)) mark.style.visibility = 'visible';
	if (fld[crrt].checked) { num_correct++; }
	document.getElementById('answer_correct').style.display = 'block';
	return false;
	}
function resetAnswers() { num_correct = 0; }
function getResults()
	{
	var num = num_correct;
	resetAnswers();
	location = "Results.aspx?crt=" + num;
	}