// constants
var ENABLE = "ENABLE";
var DISABLE = "DISABLE";
var SHOW = "SHOW";
var HIDE = "HIDE";
var CLEAR = "CLEAR";
var SETVALUE = "SETVALUE";

var ON = "ON";
var OFF = "OFF";

var g_arrCtrlPair = new Array();

// srcState can be ON or OFF or a value
// targetState can be ENABLE, DISABLE, CLEAR, HIDE, SHOW, 'SETVALUE'
function DepCtrlPair(srcID, srcState, targetID, targetState)
{
	this.srcID = srcID;
	this.srcState = srcState;
	this.targetID = targetID;
	this.targetState = targetState;
	
	if (arguments[4])
	{	this.extra = arguments[4];	}
	else
	{	this.extra = "";	}
}

function LinkCtrls(srcID, srcState, targetID, targetState)
{
	var ncount;

	// create array of dependent controls if none exist beforehand
	if (!g_arrCtrlPair[srcID])
	{	g_arrCtrlPair[srcID] = new Array();	}

	if (g_arrCtrlPair[srcID].length)
	{	ncount = g_arrCtrlPair[srcID].length;	}
	else
	{	ncount = 0;	}
	
	if (arguments[4])
	{
		g_arrCtrlPair[srcID][ncount] = new DepCtrlPair(srcID, srcState, targetID, targetState, arguments[4]);
	}
	else
	{
		g_arrCtrlPair[srcID][ncount] = new DepCtrlPair(srcID, srcState, targetID, targetState);
	}
}

function InitCtrlPairs()
{
	for (id in g_arrCtrlPair)
	{	toggleCtrl(id);	}
}

function toggleCtrl(src)
{	var ctrl, target, srcID;
	var sSrcState;
	var rule, isOn;

	if (src.id)	// object passed in 
	{	ctrl = src;
		srcID = src.id;
	}
	else	// name passed in
	{	ctrl = document.getElementById(src);
		srcID = src;
	}

	if (!ctrl)		// invalid ctrl reference, so don't process
	{	return;	}

	if (!g_arrCtrlPair[srcID])	// array element does not exist
	{	return;	}
	
	// run rule for each dependent ctrl
	for (i=0; i<g_arrCtrlPair[srcID].length; i++)
	{	
		var execRule;
		
		rule = g_arrCtrlPair[srcID][i];

		if (isRadioType(ctrl))
		{	isOn = ctrl.checked;	}
		else
		{	ctrl.value = ms_trim(ctrl.value);
			isOn = (ctrl.value != "");
		}

		// check if a rule needs to be run
		var execRule = (rule.srcState == ON && isOn) || (rule.srcState == OFF && !isOn);
		execRule = execRule || (rule.srcState == ctrl.value);
		
		if (execRule == true)
		{
			switch(rule.targetState)
			{	case ENABLE:
					disableCtrl(rule.targetID, false);
					break;
				case DISABLE:
					disableCtrl(rule.targetID, true);
					break;
				case SHOW:
					displayCtrl(rule.targetID, true);				
					break;
				case HIDE:
					displayCtrl(rule.targetID, false);
					break;
				case CLEAR:
					clearCtrl(rule.targetID);
					break;
				case SETVALUE:
					setValue(rule.targetID, rule.extra);
					break;
				
				default:
					alert("Rule: " + rule.targetState + " is unknown!");
					break;
			}
		}

	}//for
}

function disableCtrl(ctrlID, bDisable)
{
	var obj;
	
	if (ctrlID.id)
	{	obj = ctrlID;	}
	else
	{	obj = document.getElementById(ctrlID);	}
	
	if (!obj)
	{	return;	}
	
	if (bDisable)
	{	
		obj.disabled = true;
		
		if (obj.type != "radio")
		{	clearCtrl(ctrlID);	}

		if (!isRadioType(obj))
		{	obj.style.backgroundColor = "lightgrey";	}
	}
	else
	{	obj.disabled = false;

		if (!isRadioType(obj))
		{	obj.style.backgroundColor = "white";	}
	}
}

function clearCtrl(ctrlID)
{
	var ctrl = document.getElementById(ctrlID);
	
	if (!ctrl)
	{	return;	}

	if (isRadioType(ctrl))
	{	ctrl.checked = false;	}
	else
	{	ctrl.value = "";	}
}

function isRadioType(ctrl)
{	var isRadio = false;

	if (!ctrl)
	{	return false;	}

	switch(ctrl.type)
	{
		case "radio":
		case "checkbox":
			isRadio = true;
			break;
		default:
			isRadio = false;
			break;	
	}
	
	return isRadio;
}

function displayCtrl(ctrlID, bShow)
{
	var ctrl = document.getElementById(ctrlID);

	if (!ctrl)
	{	return;	}

	if (bShow == true)
	{	//ctrl.style.visibility = "visible";	
		ctrl.style.display = "inline";
	}
	else
	{	//ctrl.style.visibility = "hidden";	
		ctrl.style.display = "none";
	}
}

function setValue(ctrlID, txt)
{
	var ctrl = document.getElementById(ctrlID);

	if (!ctrl)
	{	return;	}

	if (ctrl.type)	// is a ctrl
	{	ctrl.value = txt;	}
	else
	{	ctrl.innerHTML = txt;	}	// is a generic element
}


function ms_trim(s)
{	s += ""		// will convert to string if necessary
    var m = s.match(/^\s*(\S+(\s+\S+)*)\s*$/);
    return (m == null) ? "" : m[1];
}

// ---- error object ----
function ErrorMsgs()
{
	this.hasErrors = false;
	this.Errors = new Array();

	// -------------------------------------------
	var fn = " var errMsg = '', crlf = ''; ";
	fn += " for(var i=0; i<this.Errors.length; i++) { ";
	fn += " errMsg += crlf + '- ' + this.Errors[i]; ";
	fn += " crlf = '\\n'; ";
	fn += " } ";
	fn += "alert(errMsg); ";
	this.showErrors = new Function(fn);

	// -------------------------------------------
	fn = " this.Errors.push(msg);";
	fn += " this.hasErrors = (this.Errors.length > 0); ";
	this.add = new Function("msg", fn);

	// -------------------------------------------
	fn = " this.Errors.pop();";
	fn += " this.hasErrors = (this.Errors.length > 0); ";
	this.remove = new Function("msg", fn);
}

// *******************************************************************
// --- to handle dates that are spread across 3 ctrls (dd-MMM-yyyy) ---
// *******************************************************************
function assembleDate(yrID, mthID, dyID)
{
	var frm = document.forms[0];
	
	if (frm[yrID])
	{	ctrlYr = frm[yrID];	}
	else if (yrID.type)
	{	ctrlYr = yrID;	}

	ctrlYr.value = ms_trim(ctrlYr.value);
	yr = ctrlYr.value;

	if (frm[dyID])
	{	ctrlDy = frm[dyID];	}
	else if (dyID.type)
	{	ctrlDy = dyID;	}
	
	ctrlDy.value = ms_trim(ctrlDy.value);
	dy = ctrlDy.value;

	if (frm[mthID])
	{	ctrlMth = frm[mthID];	}
	else if (mthID.type)
	{	ctrlMth = mthID;	}

	mth = ctrlMth.value;		// is a select box - no need to trim value

	if (yr=="" && mth=="" && dy=="")	// if blank date do not format
	{	return "";	}
	else
	{	return mth + "/" + dy + "/" + yr;	}
}

function formatDate(year, month, day)
{
	year = ms_trim(year);
	month = ms_trim(month);
	day = ms_trim(day);
	
	
	year = padLeft(year, "0", 4);
	month = padLeft(month, "0", 2);
	day = padLeft(day, "0", 2);

	fdate = month + "/" + day + "/" + year; 	

	return fdate;
}

function isValidDate(theDate)
{
	var arr;
	
	theDate = ms_trim(theDate);
	
	if (theDate == "")		// blank dates are valid
	{	return true;	}
	
	arr = theDate.split("/");

	if (arr.length != 3)	// has MM, dd, and YYYY
	{	return false;	}
	
	for(var i=0; i<3; i++)
	{	if (isNaN(arr[i]))
		{	return false;	}

		if (arr[i]==0 || arr[i]=="")
		{	return false;	}
	}
	
	var year, month, day;
	
	month = arr[0];
	day = arr[1];
	year = arr[2];

	if (Number(year) < 1753)	// does not recognize any dates earlier than Jan 1, 1753
	{	return false;	}
	
	var testDate = new Date(year, month-1, day);

	// if months do not match then the day value caused an overflow
	//   so date is invalid
	if ( testDate.getMonth()+1 != Number(month) )
	{	return false;	}
	else
	{	return true;	}	
}

// return value > 0, dt1 is later than dt2
// return value < 0, dt2 is later than dt1
// return value = 0, dt1 and dt2 the same
function compareDates(dt1, dt2)
{
	var val1 = Date.parse(dt1);
	var val2 = Date.parse(dt2);
	
	if (isNaN(val1) || isNaN(val2))
	{	return 0; }
	else
	{	return val1 - val2;	}
}

function padLeft(src, padChar, outputLen)
{	var len;

	padChar = padChar.substring(0,1);
	src = ms_trim(src);
	len = src.length;

	for (var i=0; i<outputLen-len; i++)
	{	src = padChar + src;	}

	return src;
}


function setDateCtrls(srcVal, yrID, mthID, dyID)
{	var frm = document.forms[0];
	var arr;
	
	ctrlYr = document.getElementById(yrID);
	ctrlMth = document.getElementById(mthID);
	ctrlDy = document.getElementById(dyID);
	
	arr = srcVal.split("/");

	ctrlYr.value = "";
	ctrlMth.value = "";
	ctrlDy.value = "";
	
	if (arr.length == 3)	// has MM, dd, and YYYY
	{
		ctrlYr.value = arr[2];
		// note: need to match value exactly to option so 0's in front need to be 
		//		stripped off
		ctrlMth.value = Number(arr[0]);
		ctrlDy.value = arr[1];
	}
}

// --- links the value of one ctrl to another	%>
function setValueLink(src, target)
{
	var frm = document.forms[0];
	var val;
	
	if (frm[src])
	{	src = frm[src];	}
	
	if (frm[target])
	{	target = frm[target];	}
	
	val = ms_trim(src.value);
	val = val.toUpperCase();
	
	src.value = val;
	target.value = val;
}

// --- get value for group of radio buttons ---
function getRadioVal(grpName)
{
	var grp = document.forms[0][grpName];
	var val="";

	for(var i=0; i<grp.length; i++)
	{	if (grp[i].checked)
		{
			val = grp[i].value;
			break;
		}
	}

	return val;
}

