/*
* 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 false;
}
function confirmAjaxDelete(url, params, id)
{
	//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) getAjaxContent(url, params, id);
	else if (url == null) return confirmed;
	else return false;
}

/******************************************************
* CSS DROP-DOWN MENU FUNCTIONS
*****************************************************/
var crrtTab = null;
function switchTab(id, group)
{
	// get parts to determine 1st in set
	var parts = id.split("_");
	var key = parts[0];
	var index = parts[1];

	// set default
	if (group == null) group = 0;
	if (crrtTab == null)
	{
		crrtTab = new Array();
		crrtTab[group] = key + "_" + 1;
	}

	// deactivate previous
	var old = document.getElementById(crrtTab[group]);
	if (old) old.className = "none";

	// activate current
	if (index)
	{
		var div = document.getElementById(id);
		div.className = "active";
		crrtTab[group] = id;
	}
}

/******************************************************
* Calendar day selection
*****************************************************/
var crrtCal;
function calClick(cal)
{
	if (crrtCal) document.getElementById(crrtCal).className = 'day';
	document.getElementById(cal).className = 'active';
	crrtCal = cal;
}

/******************************************************
* CSS DROP-DOWN MENU FUNCTIONS
*****************************************************/
function showCell(id1, id2)
{
	if (id2 != null)
	{
		var old = document.getElementById(id2);
		old.style.display = "none";
	}
	var ele = document.getElementById(id1);
	var css = (ele.toString().indexOf("TableRow") > 0) ? "table-row" : "table-cell";
	ele.style.display = css;
}
function showMenu(idx)
{
	var ele = document.getElementById("sub"+idx);
	var is_vis = !(ele.style.display != 'block');
	ele.style.display = (!is_vis) ? "block" : "none";

	var a = document.getElementById("nav"+idx);
	a.style.backgroundPosition = (is_vis) ? "left top" : "left bottom";
}
var crrt = null, idx = null;
function show(div)
{
	if (crrt != null) hide(crrt);
	crrt = div;
	var obj = document.getElementById(div);
	if (obj != null) obj.style.visibility = 'visible';
}
function hide(div, num)
{
	var obj = document.getElementById(div);
	if (obj != null) obj.style.visibility = 'hidden';
}
function showIt(div, num)
{
	if (num != null) idx = num;
	if (crrt == null && div.indexOf("_") > 0) crrt = div.split("_")[0] + "_0";
	if (crrt != null) hideIt(crrt);
	crrt = div;
	var obj = document.getElementById(div);
	if (obj != null) obj.style.display = 'block';
	//if (obj != null) obj.style.visibility = 'visible';
}
function hideIt(div, num)
{
	var obj = document.getElementById(div);
	//if (obj != null) obj.style.visibility = 'hidden';
	if (obj != null) obj.style.display = 'none';
}
function next(name, num, max)
{
	var ele = null;
	if (idx == null) idx = 0;
	var i = idx + num;
	if (i < 0) i = max - 1;
	else if (i == max) i = 0;
	if (crrt == null) crrt = name + "_0";
	showIt(name + "_" + i);
	idx = i;
}

function expand(row)
{
	var src = ['images/plus.gif', 'images/minus.gif'];
	var i = 1;
	var img = document.getElementById(row);
	img.src = (img.alt == 'Expand') ? src[1] : src[0];
	while (tr = document.getElementById(row + "_" + i))
	{
		tr.style.display = (img.alt == 'Expand') ? '' : 'none';
		i++;
	}
	img.alt = (img.alt == 'Expand') ? 'Collapse' : 'Expand';
	setCookie(row, img.alt);
}

function expandList(row, params)
{
	var src = ['images/plus.gif', 'images/minus.gif'];
	var i = 1;
	var img = document.getElementById(row);
	img.src = (img.alt == 'Expand') ? src[1] : src[0];
	while (tr = document.getElementById(row + "_" + i))
	{
		tr.style.display = (img.alt == 'Expand') ? '' : 'none';
		i++;
	}
	if (img.alt == "Expand") getAjaxContent("GradebookList.aspx", params, row + "_1");
	img.alt = (img.alt == 'Expand') ? 'Collapse' : 'Expand';
}

/******************************************************
 * Content Expander
 *
 * This method expands and collapses expandable and
 * collapsable windows.
 *****************************************************/
function expander(img)
	{
	if (img == null) return;

	var is_exp = (img.alt == "Expand");
	var i = 0;
	var obj = null;

	// header
	if ((obj = document.getElementById(img.id + "_head")) != null)
		{
		obj.className = (is_exp) ? "container" : "container_cropped";
		}

	// other child windows/elements
	while ((obj = document.getElementById(img.id+'_'+i)) != null)
	    {
	    obj.style.display = (is_exp) ? "" : "none";
	    i++;
	    }

	img.style.backgroundPosition = (is_exp) ? "left bottom" : "left top";
	img.alt = (is_exp) ? "Collapse" : "Expand";

	// set cookie
	setCookie(img.id, ((is_exp) ? "1" : "0"), 1);
	}
function expandWindows(name, mode) {
	if (mode == null || mode == undefined) mode = 0;
    var c = getCookie(name);
    if (c == null || c == undefined || c.length == 0) return;
    var obj = document.getElementById(name);
    if (c != mode  && obj != null && obj != undefined) expander(obj);
    }

/*************************************************************
* JS Cookies
************************************************************/
function setCookie(name, value, expires)
{
	var exp = new Date();
	exp.setDate(exp.getDate() + expires);
	document.cookie = name + "=" + escape(value) + ((expires != null && expires != undefined) ? ";expires=" + exp.toUTCString() : "");
}
function getCookie(name)
{
	if (document.cookie.length > 0)
	{
		var c_start = document.cookie.indexOf(name + "=");
		if (c_start != -1)
		{
			c_start = c_start + name.length + 1;
			c_end = document.cookie.indexOf(";", c_start);
			if (c_end == -1) c_end = document.cookie.length;
			return unescape(document.cookie.substring(c_start, c_end));
		}
	}
	return "";
}

/*************************************************************
* AJAX Methods
************************************************************/
function getNewHttpRequest()
{
	var obj;
	try
	{
		// For Internet Explorer.
		obj = new ActiveXObject('Microsoft.XMLHTTP');
	}
	catch (e)
	{
		try
		{
			// Gecko-based browsers, Safari, and Opera.
			obj = new XMLHttpRequest();
		}
		catch (e)
		{
			// Browser supports Javascript but not XMLHttpRequest.
			obj = false;
		}
	}
	return obj;
}

function getAjaxResponse(url, params) {
	var request = getNewHttpRequest();
	request.open("POST", url, true);
	request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	request.setRequestHeader("Content-length", params.length);
	request.setRequestHeader("Connection", "close");
	request.onreadystatechange = function() {
		if (request.readyState == 4 && request.status == 200) {
			return request.responseText;
		} else return "AJAX Response Failure";
	}
	request.send(params);
}

function getAjaxContent(url, params, id, params2)
{
	if (id)
	{
		var div = document.getElementById(id);
		if (div) div.innerHTML = "<img src=\"images/loading.gif\" height=15 alt=\"Loading\" />";
	}

	var request = getNewHttpRequest();
	request.open("POST", url, true);
	request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	request.setRequestHeader("Content-length", params.length);
	request.setRequestHeader("Connection", "close");
	request.onreadystatechange = function() {
		if (request.readyState == 4 && request.status == 200) {
			if (id) {
				var div = document.getElementById(id);
				if (div) {
					var resp = request.responseText;
					div.innerHTML = resp;

					var js_start = "<script type=\"text/javascript\">";
					var js_end = "</script>";
					var tmp = resp.substring(resp.indexOf(js_start));
					while (tmp.indexOf(js_start) >= 0) {
						tmp = tmp.substring(tmp.indexOf(js_start) + js_start.length);
						var js = tmp.substring(0, tmp.indexOf(js_end));
						//alert(js);
						eval(js);
						//var scripts = t_document.scripts; //$$('#widget script'); // look up the script tags in the widget HTML
						//alert(scripts.length);
						//for (var i = 0; i < scripts.length; i++) {
						//eval(scripts[i].innerHTML);   // for each script tag, evaluate its contents
					}

					if (params2) GetProfileStarter(params2);
				}
			}
		}
	}
	request.send(params);
}

function getAjaxFrame(url, frame_id) {
	if (frame_id) {
		var iframe = document.getElementById(frame_id);
		if (iframe) {
			iframe.src = "about:blank";
			iframe.src = url;
		}
	}
}

var user_id = null;
function GetProfile(params1, params2, id)
{
	if (id != null && id != undefined) user_id = id;
	getAjaxContent('GradebookProfile.aspx', params1, 'ajax_content', params2);
}
function GetProfileStarter(params)
{
	getAjaxContent("MyPageCerts.aspx", params, "ajax_prof_content");
}

function AddFavorite(params)
{
	var ajax = document.getElementById("ajax_favs");
	ajax.style.visibility = 'visible';
	getAjaxContent("Favorite.aspx", params, "ajax_favs_body");
}
function AddUserSub(params, name)
{
	var ajax = document.getElementById("ajax_mgr");
	ajax.style.visibility = 'visible';
	ajax.innerHTML = name + " Added";
	getAjaxContent("MgrUserSubs.aspx", params);
}
function AddCertTest(params, name)
{
	var ajax = document.getElementById("ajax_mgr");
	ajax.style.visibility = 'visible';
	getAjaxContent("MgrCertTests.aspx", params);
	ajax.innerHTML = name + " Added";
}

var open_div = null;
function OpenAjax(box, params, require_user)
{
	if (open_div != null) CloseAjax(open_div);
	if (require_user == null || require_user == undefined) require_user = false;
	if (require_user && user_id == null)
	{
		alert("Please select a user for this action.");
		return;
	}
	if (user_id != null && user_id != undefined) params += "&userID=" + user_id;
	document.getElementById("ajax").style.visibility = 'visible';
	document.getElementById("ajax_bg").style.display = '';
	document.getElementById("ajax_bg").style.height = "150%";
	document.getElementById("ajax_" + box).style.display = '';
	var pg = (box == "test") ? "Test" : "AjaxVideo";
	pg = (box == "address") ? "MyAddress" : pg;
	pg = (box == "social") ? "MySocial" : pg;
	pg = (box == "note") ? "Note" : pg;
	pg = (box == "news") ? "NewsAdd" : pg;
	if (box == "news") getAjaxFrame(pg + ".aspx?" + params, "i" + box);
	else getAjaxContent(pg + ".aspx", params, "ajax_" + box);
	open_div = box;
}
function CloseAjax(box)
{
	document.getElementById("ajax").style.visibility = 'hidden';
	document.getElementById("ajax_bg").style.height = "auto";
	document.getElementById("ajax_bg").style.display = 'none';
	var div = document.getElementById("ajax_" + box);
	div.style.display = 'none';
	if (box != "news") div.innerHTML = '';
}

/*************************************************************
* 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(".aspx") > -1) windowname = URL.substring(0, URL.indexOf(".aspx"));
		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(field, date, form)
{
	form = (form == null) ? "aspnetForm" : form;
	var params = "?field=" + field + "&form=" + form;
	if (date != null) params += "&date=" + date;
	openWin('DateSelector.aspx' + params, '160', '190');
}

/*************************************************************
* 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";
					*/
				}
			}
		}
	}
}

// null function
function doNothing() { }

// number formatter/rounder
function round(number, decimalDigits)
{
	return Math.round(number * Math.pow(10, decimalDigits)) / Math.pow(10, decimalDigits);
}

// document viewer
function ViewDoc(target, id, path)
{
	target.location = 'DocumentDetails.aspx?documentID=' + id;
}

// test answer checker
var num_correct = 0;
function checkAnswer(idx, 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_" + idx + "_" + selected)) mark.style.display = '';
	if (fld[crrt].checked)
	{
		num_correct++;
		document.getElementById('answer_correct_' + idx).style.display = '';
		document.getElementById("btn_check_" + idx).style.display = 'none';
		document.getElementById("btn_next_" + idx).style.display = '';
	}
	else
	{
		document.getElementById("btn_check_" + idx).style.display = 'none';
		document.getElementById("btn_again_" + idx).style.display = '';
		document.getElementById("answer_wrong_" + idx).style.display = '';
	}
	return false;
}
function resetQuestion(idx, fld)
{
	for (var i = 0; i < fld.length; i++)
	{
		fld[i].checked = false;
		document.getElementById("checked_" + idx + "_" + i).style.display = 'none';
	}
	document.getElementById("btn_check_" + idx).style.display = '';
	document.getElementById("btn_again_" + idx).style.display = 'none';
	document.getElementById("answer_correct_" + idx).style.display = 'none';
	document.getElementById("answer_wrong_" + idx).style.display = 'none';
	return false;
}

function nextQuestion(crrtIdx, idx)
{
	if (crrtIdx != null) document.getElementById("question_" + crrtIdx).style.display = 'none';
	document.getElementById("question_" + idx).style.display = '';
	return false;
}
function resetAnswers() { num_correct = 0; }

function getResults(id)
{
	//var num = num_correct;
	//resetAnswers();
	getAjaxContent("TestResults.aspx", "testID=" + id, "ajax_test");
	return false;
	//location = "Results.aspx?crt=" + num;
}

// submit a form with the Enter button
// this is a workaround for an IE bug
function SubmitEnter(form, e)
{
	var characterCode = null;
	if (e && e.which)
	{
		e = e;
		characterCode = e.which;
	}
	else
	{
		e = event;
		characterCode = e.keyCode;
	}
	if (characterCode == 13)
	{
		if (form) form.submit();
		return false;
	}
	else return true;
}

function sendNote(form, type)
{
	// user id
	var id = (form.dd_theirID != undefined) ? form.dd_theirID : form.hdn_theirID;
	if (form.dd_theirID != undefined && form.dd_theirID.selectedIndex == 0)
	{
		alert("You must first select a colleague.");
		return;
	}

	// privacy level
	var priv = "";
	if (form.privacy)
	{
		for (var i = 0; i < form.privacy.length; i++)
		{
			var chk = form.privacy[i];
			if (!chk.checked) continue;
			priv = "&privacy=" + chk.value;
			break;
		}
	}

	// category
	var cat_id = (form.dd_noteCategoryID != undefined && form.dd_noteCategoryID.selectedIndex > 0) ?
		form.dd_noteCategoryID.value : null;

	// note
	var note = form.txt_note.value;
	var parms = "type=" + type + priv + "&txt_note=" + escape(note);
	parms += "&theirID=" + ((id) ? id.value : 0);
	parms += (cat_id != null) ? "&noteCategoryID=" + cat_id : "";

	// send note
	if (form.hdn_replyTo != undefined) parms += "&replyTo=" + form.hdn_replyTo.value;
	var div = (form.autoclose.value == "true") ? null : "ajax_note";
	getAjaxContent('Note.aspx', parms, div);
	if (div == null) CloseAjax('note');
}

var read = null;
function readNote(idx, id)
{
	expand(idx);
	if (read == null) read = new Array(1000000);
	if (read[id]) { }
	else
	{
		getAjaxContent("Notes.aspx", "noteID=" + id);
		read[id] = true;
	}
}

// add image to another element
function addImage(src, div)
{
	var newImg = document.createElement("img");
	newImg.style.margin = "5px";

	if (div == undefined) div = "thumbnails";
	document.getElementById(div).appendChild(newImg);
	if (newImg.filters)
	{
		try { newImg.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 0; }
		catch (e)
		{
			// If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.
			newImg.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + 0 + ')';
		}
	}
	else newImg.style.opacity = 0;

	newImg.onload = function() { fadeIn(newImg, 0); };
	newImg.src = src;
}

// fade an image or element in from invis
function fadeIn(element, opacity)
{
	var reduceOpacityBy = 5;
	var rate = 30; // 15 fps

	if (opacity < 100)
	{
		opacity += reduceOpacityBy;
		if (opacity > 100) opacity = 100;

		if (element.filters)
		{
			try { element.filters.item("DXImageTransform.Microsoft.Alpha").opacity = opacity; }
			catch (e)
			{
				// If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.
				element.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')';
			}
		}
		else element.style.opacity = opacity / 100;
	}

	if (opacity < 100)
	{
		setTimeout(function() { fadeIn(element, opacity); }, rate);
	}
}

// slider
var crrt_pos = 0;
var max_pos = 0;
function slide(pos, max) {
	var div = document.getElementById('scroller');
	if (max == null || max == undefined) max = 1;
	var width = 776;
	var rate = (-pos) * 20;
	var to_pos = crrt_pos + ((-pos) * width);
	max_pos = -((width * max) - width);
	//alert("rate="+rate+", from="+crrt_pos+", to="+to_pos);

	if (to_pos <= 0 && to_pos >= max_pos) slideOver(div, crrt_pos, to_pos, rate);
}
function slideOver(div, from, to, rate) {
	if ((rate < 0 && from >= to) || (rate > 0 && from <= to)) {
		//alert("from="+from+", to="+to);
		from += rate;
		div.style.left = from+"px";
		window.setTimeout(function() { slideOver(div, from, to, rate); }, 5);
	} else {
		//alert("crrt=" + crrt_pos);
		crrt_pos = to;
		div.style.left = to+"px";
	}
}
