/*	BUG B04558 NR 12/18/2008
	BUG B05518 NR 07/07/2009
	BUG B05684 NR 08/03/2009 (added addEvent function)
	BUG B06358 JV 01/25/2010 (modified simplerowdelete())
	BUG B06358 JV 01/25/2010 (added CharactersRemaining())
	BUG B06358 JV 02/11/2010 (modified CharactersRemaining() to work with span's instead of input's)
	BUG B06358 JV 03/04/2010 (isIE())
	BUG B06917 JV 03/15/2010 (ValidateHHMMSS())
	BUG B06917 JV 03/16/2010 validateHHMMSS no longer allows 24 as hour
	BUG B06384 GJM 03/15/2010
	BUG B06935 JV 03/31/2010
	BUG B06384 GJM 04/06/2010
	BUG B06384 GJM 04/09/2010
	BUG B07144 GJM 04/12/2010
	BUG B03654 GJM 04/12/2010
	BUG B07144 GJM 04/19/2010
	BUG B07210 JV 04/28/2010 changed wording on validate HHMMSS
	BUG B03654 GJM 05/03/2010
	BUG B07282 JV 05/03/2010
	BUG B07410 BH 06/29/2010 (added to HandleSubmit for payments to disable update button)
	BUG B07482 JV 07/15/2010 added cookie methods
	BUG B07609 GJM 07/21/2010
	BUG B07609 GJM 08/03/2010
	BUG B07753 JV 08/12/2010 (removerow and RestoreRows)
	BUG B06779 JV 08/12/2010 (Cookie enabled)
	BUG B06779 JV 08/12/2010 (Cookie enabled Modification)
	BUG B06779 JV 08/18/2010 (Cookie enabled Modification Again to work with ie8.0)
	BUG B06779 JV 08/25/2010 (Delete cookie after cookie test)
*/

function ClearForm() {
	/* ----------------- */
	/* Declare Variables */
	/* ----------------- */
	var intInputTagCount;
	var intSelectTagCount;
	var intTextboxCount;
	var i;
	/* -------------------- */
	/* Initialize Variables */
	/* -------------------- */
	intInputTagCount = 0;
	intSelectTagCount = 0;
	intTextboxCount = 0;
	/* -------------------- */
	/* Clear Textbox Values */
	/* -------------------- */
	i = 0;
	intInputTagCount = document.getElementsByTagName("input").length;
	for (i;i<intInputTagCount;i++) {
		var objInputElement;
		objInputElement = document.getElementsByTagName("input").item(i);
		if (objInputElement.type == "text") {
			objInputElement.value = "";
		}
	}
	/* ------------------------- */
	/* Set Dropdowns to Option 0 */
	/* ------------------------- */
	i = 0;
	intSelectTagCount = document.getElementsByTagName("select").length;
	for (i;i<intSelectTagCount;i++) {
		var objSelectElement;
		objSelectElement = document.getElementsByTagName("select").item(i);
		objSelectElement.selectedIndex = 0;
	}
}

function noenter() {
	return !(window.event && window.event.keyCode == 13); 
}

function UpdateBalance(strPaymentSectionID, strOrigItemTotal, strPaymentID, strLineItemID, strAlertsOn, strNewBalanceID, strLocalErrorID, strFooterErrorID, strRemainderDisplayID) {
	/* ----------------- */
	/* Declare Variables */
	/* ----------------- */
	var blnPerformCalc = new Boolean(false);
	var blnAlertsOn = new Boolean(false);
	var intInvoiceAmount;
	var intStartTotal;
	var intPaymentAmount;
	var intNewLineItemTotal;
	var intTruncatedAmount;
	var intSpanTagCount;
	var intInputCount;
	var intTextboxValue;
	var intAllocationSum;
	var i;
	var strInvoiceAmount;
	var strHasErrors;
	var strStartTotal;
	var strPaymentAmount;
	var strNewLineItemTotal;
	var strSpanID;
	var strInputID;
	var strTextboxValue;
	var objLineItemSpan;
	var objPaymentAmount;
	var objConfirmationBox;
	var objLocalError;
	var objFooterError;
	var objSpanElement;
	var objInputElement;
	var objRemainderDisplay;
	var objPaymentSectionField;
	/* -------------------- */
	/* Initialize Variables */
	/* -------------------- */
	objPaymentSectionField = document.getElementById(strPaymentSectionID);
	strInvoiceAmount = objPaymentSectionField.value;
	strInvoiceAmount = strInvoiceAmount.replace(/\$/g,"");
	strInvoiceAmount = strInvoiceAmount.replace(/,/g,"");
	intInvoiceAmount = Number(strInvoiceAmount);
	objLineItemSpan = document.getElementById(strLineItemID);
	objPaymentAmount = document.getElementById(strPaymentID);
	objLocalError = document.getElementById(strLocalErrorID);
	objFooterError = document.getElementById(strFooterErrorID);
	strStartTotal = strOrigItemTotal;
	strStartTotal = strStartTotal.replace(/\$/g,"");
	strStartTotal = strStartTotal.replace(/,/g,"");
	strPaymentAmount  = objPaymentAmount.value;
	strPaymentAmount = strPaymentAmount.replace(/\$/g,"");
	strPaymentAmount = strPaymentAmount.replace(/,/g,"");
	strSpanID = "";
	strHasErrors = "false";
	strTextboxValue = "";
	if (strAlertsOn != "False") {
		blnAlertsOn = true;
	}
	intPaymentAmount = Number(strPaymentAmount);
	intStartTotal = Number(strStartTotal);
	intSpanTagCount = 0;
	intInputCount = 0;
	intTextboxValue = 0;
	intAllocationSum = 0;
	i = 0;
	objRemainderDisplay = document.getElementById(strRemainderDisplayID);
	/* -------------------- */
	/* Reset Error Messages */
	/* -------------------- */
	intSpanTagCount = document.getElementsByTagName("span").length;
	for (i;i<intSpanTagCount;i++) {
		var objSpanElement;
		objSpanElement = document.getElementsByTagName("span").item(i);
		strSpanID = objSpanElement.id;
		if (strSpanID.match(/lblErrorFlag/)) {
			objSpanElement.style.display = "none";
		}
	}
	objFooterError.innerHTML = "&nbsp;";
	/* ---------------- */
	/* Input Validation */
	/* ---------------- */
	if (intPaymentAmount) {
		/* Payment must be a positive number. */
		if (intPaymentAmount<0) {
			if (blnAlertsOn == true) {
				objLocalError.style.display = "";
				objFooterError.innerHTML = "Payment must be a positive number.&nbsp;&nbsp;Click in the problem field above to re-enter the payment and clear this error message.";
			}
			strHasErrors = "true"
			blnPerformCalc = false;
		}else{
			/* Payment should not be greater than charge. */
			if (intPaymentAmount>intStartTotal) {
				if (blnAlertsOn == true) {
					objLocalError.style.display = "";
					objFooterError.innerHTML = "The payment entered exceeded the line item amount.&nbsp;&nbsp;Click in the problem field above to re-enter the payment and clear this error message.";
				}
				strHasErrors = "true"
				blnPerformCalc = false;
			}else{
				intTruncatedAmount = intPaymentAmount.toFixed(2);
				if (intPaymentAmount!=intTruncatedAmount) {
					if (blnAlertsOn == true) {
						objLocalError.style.display = "";
						objFooterError.innerHTML = "Please ensure that only two digits follow a decimal point when entering payments.&nbsp;&nbsp;Click in the problem field above to re-enter the payment and clear this error message.";
					}
					strHasErrors = "true"
					blnPerformCalc = false;
				}else{
					intPaymentAmount = intTruncatedAmount;
					blnPerformCalc = true;
				}
			}
		}
	}else{
		if (intPaymentAmount==0) {
			blnPerformCalc = false;
		}else{
			/* The payment entered was not a number. */
			if (blnAlertsOn == true) {
				objLocalError.style.display = "";
				objFooterError.innerHTML = "Please enter payments using numeric characters.&nbsp;&nbsp;Click in the problem field above to re-enter the payment and clear this error message.";
			}
			strHasErrors = "true"
			blnPerformCalc = false;
		}
	}
	/* -------------------------------------- */
	/* Perform Calculation and Update Display */
	/* -------------------------------------- */
	if (blnPerformCalc == true) {
		/* Update the Invoice Total in the Allocation Section */
		intNewLineItemTotal = intStartTotal - intPaymentAmount;
		intNewLineItemTotal = intNewLineItemTotal.toFixed(2);
		strNewLineItemTotal = String(intNewLineItemTotal);
		strNewLineItemTotal = addCommas(strNewLineItemTotal);
		strNewLineItemTotal = "$" + strNewLineItemTotal;
		objLineItemSpan.innerHTML = strNewLineItemTotal;
		UpdateTotal(strNewBalanceID);
		/* Update the amount left to distribute. */
		i = 0;
		intInputCount = document.getElementsByTagName("input").length;
		for (i;i<intInputCount;i++) {
			objInputElement = document.getElementsByTagName("input").item(i);
			strInputID = objInputElement.id;
			if (strInputID.match(/txtPayment/)) {
				strTextboxValue = objInputElement.value;
				strTextboxValue = strTextboxValue.replace(/\$/g,"");
				strTextboxValue = strTextboxValue.replace(/,/g,"");
				intTextboxValue = Number(strTextboxValue);
				intAllocationSum = intAllocationSum + intTextboxValue;
			}
		}
		intAllocationSum = intAllocationSum.toFixed(2);
		intAmountLeft = intInvoiceAmount - intAllocationSum;
		intAmountLeft = intAmountLeft.toFixed(2); // BUG B05518 NR 07/07/2009
		if (intAmountLeft<0) {
			intAmountLeft = Math.abs(intAmountLeft);
			strValidatedPayment = String(intAmountLeft);
			strValidatedPayment = addCommas(strValidatedPayment);
			strValidatedPayment = "<font color='aa0000;'>-$"+strValidatedPayment+"</font>";
		}else{
			strValidatedPayment = String(intAmountLeft);
			strValidatedPayment = addCommas(strValidatedPayment);
			strValidatedPayment = "$"+strValidatedPayment;
		}
		strAmountLeft = "Amount left to distribute: "+strValidatedPayment;
		objRemainderDisplay.innerHTML = strAmountLeft;
		strHasErrors = "false";
		return strHasErrors;
	}else{
		/* ------------ */
		/* Reset Values */
		/* ------------ */
		objLineItemSpan.innerHTML = strOrigItemTotal;
		objPaymentAmount.value = "$0.00";
		UpdateTotal(strNewBalanceID);
		return strHasErrors;
	}
}

function ValidatePayment(strPaymentInfoValue, strErrorID, strAlertsOn, strInvoiceBalance, strRemainderDisplayID) {
	/* ----------------- */
	/* Declare Variables */
	/* ----------------- */
	var objPaymentField;
	var objLocalError;
	var objRemainderDisplay;
	var objInputElement;
	var blnAlertsOn = new Boolean(false);
	var strPaymentInfoAmount;
	var strValidatedPayment;
	var strHasErrors;
	var strAmountLeft;
	var strInputID;
	var strTextboxValue;
	var intTextboxValue;
	var intInputCount;
	var intInvoiceBalance;
	var intPaymentInfoAmount;
	var intTruncatedAmount;
	var intAmountLeft;
	var intAllocationSum;
	var i;
	/* -------------------- */
	/* Initialize Variables */
	/* -------------------- */
	objPaymentField = document.getElementById(strPaymentInfoValue);
	objRemainderDisplay = document.getElementById(strRemainderDisplayID);
	strPaymentInfoAmount = objPaymentField.value;
	strPaymentInfoAmount = strPaymentInfoAmount.replace(/\$/g,"");
	strPaymentInfoAmount = strPaymentInfoAmount.replace(/,/g,"");
	intPaymentInfoAmount = Number(strPaymentInfoAmount);
	strInvoiceBalance = strInvoiceBalance.replace(/\$/g,"");
	strInvoiceBalance = strInvoiceBalance.replace(/,/g,"");
	intInvoiceBalance = Number(strInvoiceBalance);
	intTextboxValue = 0;
	intInputCount = 0;
	intTruncatedAmount = 0;
	intAmountLeft = 0;
	intAllocationSum = 0;
	i = 0;
	objLocalError = document.getElementById(strErrorID);
	if (strAlertsOn != "False") {
		blnAlertsOn = true;
	}
	strHasErrors = "false";
	strAmountLeft = "";
	strValidatedPayment = "";
	strInputID = "";
	strTextboxValue = "";
	/* ---------------- */
	/* Input Validation */
	/* ---------------- */
	if (intPaymentInfoAmount) {
		/* Payment must be a positive number. */
		if (intPaymentInfoAmount<0) {
			if (blnAlertsOn == true) {
				objLocalError.style.display = "";
				objLocalError.innerHTML = "Payment must be a positive number.";
			}
			strHasErrors = "true"
		}else{
			/* Payment should not be greater than the amount due. */
			if (intPaymentInfoAmount>intInvoiceBalance) {
				if (blnAlertsOn == true) {
					objLocalError.style.display = "";
					objLocalError.innerHTML = "The payment entered must not exceed the total amount due.";
				}
				strHasErrors = "true"
			}else{
				intTruncatedAmount = intPaymentInfoAmount.toFixed(2);
				if (intPaymentInfoAmount!=intTruncatedAmount) {
					if (blnAlertsOn == true) {
						objLocalError.style.display = "";
						objLocalError.innerHTML = "Please ensure that only two digits follow a decimal point when entering payments.";
					}
					strHasErrors = "true"
				}
			}
		}
	}else{
		if (intPaymentInfoAmount==0) {
			/* Payment must be greater than zero. */
			if (blnAlertsOn == true) {
				objLocalError.style.display = "";
				objLocalError.innerHTML = "Payment amount must be greater than zero.";
			}
			strHasErrors = "true"
		}else{
			/* The payment entered was not a number. */
			if (blnAlertsOn == true) {
				objLocalError.style.display = "";
				objLocalError.innerHTML = "Please enter payments using numeric characters.";
			}
			strHasErrors = "true"
		}
	}
	if (strHasErrors == "true") {
		objPaymentField.value = "$0.00";
		objRemainderDisplay.innerHTML = "&nbsp;"
	}else{
		intInputCount = document.getElementsByTagName("input").length;
		for (i;i<intInputCount;i++) {
			objInputElement = document.getElementsByTagName("input").item(i);
			strInputID = objInputElement.id;
			if (strInputID.match(/txtPayment/)) {
				strTextboxValue = objInputElement.value;
				strTextboxValue = strTextboxValue.replace(/\$/g,"");
				strTextboxValue = strTextboxValue.replace(/,/g,"");
				intTextboxValue = Number(strTextboxValue);
				intAllocationSum = intAllocationSum + intTextboxValue;
			}
		}
		intAllocationSum = intAllocationSum.toFixed(2);
		intAmountLeft = intTruncatedAmount - intAllocationSum;
		intAmountLeft = intAmountLeft.toFixed(2); // BUG B05518 NR 07/07/2009
		if (intAmountLeft<0) {
			intAmountLeft = Math.abs(intAmountLeft);
			strValidatedPayment = String(intAmountLeft);
			strValidatedPayment = addCommas(strValidatedPayment);
			strValidatedPayment = "<font color='aa0000;'>-$"+strValidatedPayment+"</font>";
		}else{
			strValidatedPayment = String(intAmountLeft);
			strValidatedPayment = addCommas(strValidatedPayment);
			strValidatedPayment = "$"+strValidatedPayment;
		}
		strAmountLeft = "Amount left to distribute: "+strValidatedPayment;
		objRemainderDisplay.innerHTML = strAmountLeft;
		objLocalError.style.display = "none";
		objLocalError.innerHTML = "&nbsp;";
	}
	return strHasErrors;
}

function HandleSubmit(strHasErrors,strFormID,strPaymentFieldID,strInvoiceBalance) {
	/* ----------------- */
	/* Declare Variables */
	/* ----------------- */
	var objForm;
	var objPaymentField;
	var objInputElement;
	var intPaymentAmount;
	var intInvoiceBalance;
	var intTotalRemaining;
	var intAmountAllocated;
	var intInputCount;
	var intTextboxValue;
	var i;
	var strTextboxValue;
	var strInputID;
	var strPaymentAmount;
	var strPaymentError;
	var strAllocatedError;
	/* -------------------- */
	/* Initialize Variables */
	/* -------------------- */
	objPaymentField = document.getElementById(strPaymentFieldID);
	strPaymentAmount = objPaymentField.value;
	strPaymentAmount = strPaymentAmount.replace(/\$/g,"");
	strPaymentAmount = strPaymentAmount.replace(/,/g,"");
	intPaymentAmount = Number(strPaymentAmount);
	strInvoiceBalance = strInvoiceBalance.replace(/\$/g,"");
	strInvoiceBalance = strInvoiceBalance.replace(/,/g,"");
	intInvoiceBalance = Number(strInvoiceBalance);
	intTotalRemaining = 0;
	i = 0;
	intInputCount = document.getElementsByTagName("input").length;
	for (i;i<intInputCount;i++) {
		objInputElement = document.getElementsByTagName("input").item(i);
		strInputID = objInputElement.id;
		if (strInputID.match(/txtPayment/)) {
			strTextboxValue = objInputElement.value;
			strTextboxValue = strTextboxValue.replace(/\$/g,"");
			strTextboxValue = strTextboxValue.replace(/,/g,"");
			intTextboxValue = Number(strTextboxValue);
			intTotalRemaining = intTotalRemaining + intTextboxValue;
		}
	}
	if (intTotalRemaining) {
		intAmountAllocated = intTotalRemaining.toFixed(2);
	}else{
		intAmountAllocated = 0;
	}
	strPaymentError = "";
	strAllocatedError = "";
	/* ---------------- */
	/* Final Validation */
	/* ---------------- */
	if (strHasErrors=="false") {
		/* Payment amount must be a number. */
		if (intPaymentAmount) {
			/* Payment amount must be greater than zero. */
			if (intPaymentAmount>0) {
				/* Payment amount must equal the amount allocated. */
				if (intPaymentAmount==intAmountAllocated) {
					objForm = document.getElementById(strFormID);
					document.FormName.Uinfo.disabled=true;
					document.FormName.Uinfo2.disabled=true;
					objForm.submit();
				}else{
					intPaymentAmount = intPaymentAmount.toFixed(2);
					strPaymentError = String(intPaymentAmount);
					strPaymentError = addCommas(strPaymentError);
					strPaymentError = "$" + strPaymentError;
					strAllocatedError = String(intAmountAllocated);
					strAllocatedError = addCommas(strAllocatedError);
					strAllocatedError = "$" + strAllocatedError;
					alert("Amount allocated ("+strAllocatedError+") does not equal the payment amount ("+strPaymentError+").");
				}
			}else{
				alert("Please enter a payment.");
			}
		}else{
			alert("Please enter a payment.");
		}
	}
}

function UpdateTotal(strNewBalanceID) {
	/* ----------------- */
	/* Declare Variables */
	/* ----------------- */
	var intSpanTagCount;
	var intSpanValue;
	var i;
	var intRunningTotal;
	var strSpanID;
	var strSpanValue;
	var strNewBalance;
	var objNewBalance;
	/* -------------------- */
	/* Initialize Variables */
	/* -------------------- */
	intSpanTagCount = 0;
	intRunningTotal = 0;
	intSpanValue = 0;
	i = 0;
	strSpanID = "";
	strSpanValue = "";
	strNewBalance = "";
	objNewBalance = document.getElementById(strNewBalanceID);
	/* ------------------------------------ */
	/* Loop through spans and update total. */
	/* ------------------------------------ */
	intSpanTagCount = document.getElementsByTagName("span").length;
	for (i;i<intSpanTagCount;i++) {
		var objSpanElement;
		objSpanElement = document.getElementsByTagName("span").item(i);
		strSpanID = objSpanElement.id;
		if (strSpanID.match(/lblBalField/)) {
			strSpanValue = objSpanElement.innerHTML;
			strSpanValue = strSpanValue.replace(/\$/g,"");
			strSpanValue = strSpanValue.replace(/,/g,"");
			intSpanValue = Number(strSpanValue);
			intRunningTotal += intSpanValue;		
		}
	}
	intRunningTotal = intRunningTotal.toFixed(2);
	strNewBalance = String(intRunningTotal);
	strNewBalance = addCommas(strNewBalance);
	strNewBalance = "$" + strNewBalance;
	objNewBalance.innerHTML = strNewBalance;
}

function addCommas(strNumber)  {
	x = strNumber.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

function IsNumeric(strInput,strRestrictions)  {
	/* -------------------------------------------------------------- */
	/* This function accepts two arguments, the user input string and */
	/* a string indicating the type of number that is expected.  This */
	/* should be one of the following:                                */
	/* 1) "none" - returns true for any number                        */
	/* 2) "integer" - returns true for any integer                    */
	/* 3) "plusint" - returns true for any positive integer           */
	/* -------------------------------------------------------------- */
	var intInput;
	var intTemp;
	intInput = Number(strInput)
	if (intInput)  {
		switch (strRestrictions)  {
			case "integer":
				intTemp = Math.round(intInput);
				if (intTemp == intInput)  {
					return true;
				} else {
					return false;
				}
				break;
			case "plusint":
				intTemp = Math.round(intInput);
				if (intTemp == intInput)  {
					if (intInput > 0)  {
						return true;
					} else {
						return false;
					}
				} else {
					return false;
				}
				break;
			default:
				return true;
		}				
	} else {
		return false;
	}
}

function LoadInMain(url,closeself,objTargetWindow,objSourceWindow)  {
	var objMain;
	objMain = objTargetWindow.parent.Body;
	objMain.location = url;
	objMain.focus();
	if (closeself)	{
		objSourceWindow.close();
	}
}

function AmIAPopup(objWindow)  {
	var objWindow;
	var objWindowTop;
	if (objWindow == window.top)  {
		return true;
	} else {
		return false;
	}
}

	/* -------------------------------------------------------------- */
	// Jan 31 2007
	// Show || Hide multiple elements
	// Parmeters: id(s) - if multiple separator is "/"
	// ex) show 1 element: onclick="show('wizard')" 
	// ex) hide multiple elements: onclick="show('wizard/wizard2')" 
	/* -------------------------------------------------------------- */
function show(ids){
	var arrIDs = ids.split("/");
	for(x=0; x<arrIDs.length; x++){
		if(arrIDs[x]!=""){
			document.getElementById(arrIDs[x]).style.display="";
		}
	}
}

function hide(ids){
	var arrIDs = ids.split("/");
	for(x=0; x<arrIDs.length; x++){
		if(arrIDs[x]!=""){
			document.getElementById(arrIDs[x]).style.display="none";
		}
	}
}

function clearInner(id){
	document.getElementById(id).innerHTML="";
}

function PopulateDDL(arrItems, strInputID)
{
	/*******
	* This function fills a select list with
	* options based on the array provided.
	*******/
		
	for (var i = 0; i < arrItems.length; i++)
	{
		var objDropDownList = document.getElementById(strInputID);
		var objOption = new Option(arrItems[i], arrItems[i], false, false);
		
		//add the new option to the selection box
		objDropDownList.options[i] = objOption;
	}
}

function PopulateDDL2(arrItems, arrValues, strInputID)
{
	/*******
	* This function fills a select list with
	* options and values based on the parallel arrays provided.
	*******/
		
	for (var i = 0; i < arrItems.length; i++)
	{
		var objDropDownList = document.getElementById(strInputID);
		var objOption = new Option(arrItems[i], arrValues[i], false, false);
		
		//add the new option to the selection box
		objDropDownList.options[i] = objOption;
	}
}

function TextareaInsertText(TextareaID, TextToInsert) 
{
	var objTextarea = document.getElementById(TextareaID);
	var strNewText = TextToInsert;
	var objInsertLocation;
			
	if (document.selection) 
	{	
		//Code for Internet Explorer
		objTextarea.focus();
		objInsertLocation = document.selection.createRange();
		objInsertLocation.text = strNewText;
	}
	else if (objTextarea.selectionStart || objTextarea.selectionStart == 0) 
	{
		//Code for Mozilla & Others
		var objStartPosition = objTextarea.selectionStart;
		var objEndPosition = objTextarea.selectionEnd;
		objTextarea.value = objTextarea.value.substring(0, objStartPosition)
		+ strNewText
		+ objTextarea.value.substring(objEndPosition, objTextarea.value.length);
	} else {
		//Failsafe
		objTextarea.value += strNewText;
	}
}

	/*******
	* This function checks all the checkbox when master checkbox is checked
	* also Unchekcs when master is unchecked. self should be 'this' and ids shoud be like 'id1/id2'
	*******/

function checkSection(self, ids){
		var arrIDs = ids.split("/");
		for(x=0; x<arrIDs.length; x++){
			if(arrIDs[x]!=""){
				
				if(self.checked==true){
					object = document.getElementById(arrIDs[x]).checked = true 
				}
				else{
					object = document.getElementById(arrIDs[x]).checked = false
				}
			}
		}				
	}
	
/*******
* This function updates the value for the given input control.
*******/
	
function SetInputValue(strInputID, strValue){
	var objHiddenField = document.getElementById(strInputID);
	objHiddenField.value = strValue;
	return true;
}

function UpdateFormPostAction(strFormID, strActionURL){
	var objForm = document.getElementById(strFormID);	
	objForm.action = strActionURL;
}

/*******
* This function make Ajax call to get HTML block
*******/
function getHTML(url, div_id, param, evalscript)
{	if(evalscript ==  null){
		evalscript = false
	}
	document.getElementById(div_id).innerHTML = "<span style='font-size:12px;'><img src='/Images/indicator.gif'/> Loading...</span>"
	var myAjax = new Ajax.Updater(
	div_id, 
	url, {
		method: 'get', 
		parameters: param,
		evalScripts: evalscript
	}
	);
}

/*******
* Date functions 1
return true if it is date
*******/
function isDate(p_Expression){
	return !isNaN(new Date(p_Expression));		// <<--- this needs checking
}

/*******
* Date functions 2. eturns a date to which a specified time interval has been added.
*******/
function dateAdd(p_Interval, p_Number, p_Date){
	if(!isDate(p_Date)){return "invalid date: '" + p_Date + "'";}
	if(isNaN(p_Number)){return "invalid number: '" + p_Number + "'";}	
	
	var intDaysInMS = 86400000;
	var intTemp = 0;
	var strDate = "";

	p_Number = new Number(p_Number);
	var dt = new Date(p_Date);
	
	switch(p_Interval.toLowerCase()){
		case "yyyy": {// year
			dt.setFullYear(dt.getFullYear() + p_Number);
			break;
		}
		case "q": {		// quarter
			dt.setMonth(dt.getMonth() + (p_Number*3));
			break;
		}
		case "m": {		// month
			dt.setMonth(dt.getMonth() + p_Number);
			break;
		}
		case "d":		// day
			intTemp = p_Number*intDaysInMS;
			strDate = dt.toString();
			intTemp = Date.parse(strDate) + intTemp;
			intTemp = intTemp/1000;
			dt = new Date(1970,0,1,0,0,intTemp);
			break;
		case "y":		// day of year
		case "w": {		// weekday
			dt.setDate(dt.getDate() + p_Number);
			break;
		}
		case "ww": {	// week of year
			dt.setDate(dt.getDate() + (p_Number*7));
			break;
		}
		case "h": {		// hour
			dt.setHours(dt.getHours() + p_Number);
			break;
		}
		case "n": {		// minute
			dt.setMinutes(dt.getMinutes() + p_Number);
			break;
		}
		case "s": {		// second
			dt.setSeconds(dt.getSeconds() + p_Number);
			break;
		}
		case "ms": {		// second
			dt.setMilliseconds(dt.getMilliseconds() + p_Number);
			break;
		}
		default: {
			return "invalid interval: '" + p_Interval + "'";
		}
	}
	
	return dt;
}

/*******
* Date functions 3. Returns the specified part of a given date.
*******/
function datePart(p_Interval, p_Date, p_firstdayofweek, p_firstweekofyear){
	if(!isDate(p_Date)){return "invalid date: '" + p_Date + "'";}
	var dtPart = new Date(p_Date);
	switch(p_Interval.toLowerCase()){
		case "yyyy": return dtPart.getFullYear();
		case "q": return parseInt(dtPart.getMonth()/3)+1;
		case "m": return dtPart.getMonth()+1;
		case "y": return dateDiff("y", "1/1/" + dtPart.getFullYear(), dtPart);			// day of year
		case "d": return dtPart.getDate();
		case "w": return dtPart.getDay();	// weekday
		case "ww":return dateDiff("ww", "1/1/" + dtPart.getFullYear(), dtPart);		// week of year
		case "h": return dtPart.getHours();
		case "n": return dtPart.getMinutes();
		case "s": return dtPart.getSeconds();
		case "ms":return dtPart.getMilliseconds();	// millisecond	// <-- extension for JS, NOT available in VBScript
		default: return "invalid interval: '" + p_Interval + "'";
	}
}
/*******
* Date functions 4. Returns the number of intervals between two dates.
*******/
function dateDiff(p_Interval, p_Date1, p_Date2, p_firstdayofweek, p_firstweekofyear){
	if(!isDate(p_Date1)){return "invalid date: '" + p_Date1 + "'";}
	if(!isDate(p_Date2)){return "invalid date: '" + p_Date2 + "'";}
	var dt1 = new Date(p_Date1);
	var dt2 = new Date(p_Date2);

	// get ms between dates (UTC) and make into "difference" date
	var iDiffMS = dt2.valueOf() - dt1.valueOf();
	var dtDiff = new Date(iDiffMS);

	// calc various diffs
	var nYears  = dt2.getUTCFullYear() - dt1.getUTCFullYear();
	var nMonths = dt2.getUTCMonth() - dt1.getUTCMonth() + (nYears!=0 ? nYears*12 : 0);
	var nQuarters = parseInt(nMonths/3);	//<<-- different than VBScript, which watches rollover not completion
	
	var nMilliseconds = iDiffMS;
	var nSeconds = parseInt(iDiffMS/1000);
	var nMinutes = parseInt(nSeconds/60);
	var nHours = parseInt(nMinutes/60);
	var nDays  = parseInt(nHours/24);
	var nWeeks = parseInt(nDays/7);


	// return requested difference
	var iDiff = 0;		
	switch(p_Interval.toLowerCase()){
		case "yyyy": return nYears;
		case "q": return nQuarters;
		case "m": return nMonths;
		case "y": 		// day of year
		case "d": return nDays;
		case "w": return nDays;
		case "ww":return nWeeks;		// week of year	// <-- inaccurate, WW should count calendar weeks (# of sundays) between
		case "h": return nHours;
		case "n": return nMinutes;
		case "s": return nSeconds;
		case "ms":return nMilliseconds;	// millisecond	// <-- extension for JS, NOT available in VBScript
		default: return "invalid interval: '" + p_Interval + "'";
	}
}

/*******
* This function handles Auto Reminder Creation
*******/
// 1. as user type it updates object value to id2 value (onKeyUp event)
function copy_value(object, id2) 
{	document.getElementById(id2).value = object.value
}

// 2. on leavint Expiration Date field, it will calculate Reminder Date (onBlur event)
function calc_RemDate(days_id, exp_date_id, rem_date_id, err_span_id){  // `BUG B03715 GJM 06/25/2008
	var days = document.getElementById(days_id).value;
	var expDate = document.getElementById(exp_date_id).value;
	if (expDate == "") return;
	expDate = expDate.replace(/-/g,"/");                                          
	var arrExpDate=expDate.split("/");
	var today = new Date();
	var diffDays = dateDiff('d', today, expDate);
	var dYear=arrExpDate[arrExpDate.length-1];                                         //`BUG B03715 GJM 07/10/2008 ---------- BEGIN ----------
	if(dYear.length==2 || arrExpDate.length<3){
		document.getElementById(err_span_id).innerHTML = "<br>Invalid date; must be mm/dd/yyyy format";
		return false;
	}else{
		var dMonth=arrExpDate[0];
		var dDays=arrExpDate[1];
		if(dMonth>12 || dMonth<1 || dDays>31 || dDays<1){
			document.getElementById(err_span_id).innerHTML = "<br>Invalid date; must be mm/dd/yyyy format";
			return false;
		}else{                                                                         //`BUG B03715 GJM 07/10/2008 ---------- END ----------
			if(diffDays<0){
				if (document.getElementById(rem_date_id).value!=="") {
					document.getElementById(rem_date_id).value = "";
					document.getElementById(err_span_id).innerHTML = "<br>Expiration Date is older than today";
				}
				return false;
			}
			else{
				var remDate = dateAdd('d', -days, expDate);
				newRemDate = datePart('m', remDate) + "/" + datePart('d', remDate) + "/" + datePart('yyyy', remDate);
				document.getElementById(rem_date_id).value = newRemDate;
				document.getElementById(err_span_id).innerHTML = "";
				return true;
			}
		}
	}
}

function create_reminder(object, rem_key_id, txt_exp_date_id, exp_date_id, days_id, rem_date_id, err_span_id){
	document.getElementById(exp_date_id).value = document.getElementById(txt_exp_date_id).value
	if(calc_RemDate(days_id, exp_date_id, rem_date_id, err_span_id)){         // `BUG B03806 GJM 07/03/2008
		document.getElementById(rem_key_id).value = "-1" // change it to -1 from 0
		object.innerHTML = "<br>Reminder will be created when Update Info is clicked"
	}
}

/*  ****************************************************
			! This Function Requires prototype
			! id = "errMsg" is is required for error message display
			! if blnSubmit is set to true then Form will Submit
			BUG B01984 NR 07/24/2007
 /  **************************************************** */
function send_email(to_id,cc_id,bcc_id,subject_id,body_id, blnSubmit){
			var mail_to = document.getElementById(to_id).value
			var cc = document.getElementById(cc_id).value
			var bcc = document.getElementById(bcc_id).value
			var subject = document.getElementById(subject_id).value
			var body = document.getElementById(body_id).value
			var go = true
			
			// ======== Required Fields Check ===========
			var errMsg = ""
			if(mail_to == ""){
				go = false;
				errMsg = "Please enter To address"
			}else if(subject == ""){
				go = false;
				errMsg = "Please enter To Subject"
			}
			
			if (go){
				// BUG B04069 NR 08/20/2008 ----------- BEGIN -----------
				// ======== Replace linefeed characters with %0A in BODY ===========
				// var linefeed = String.fromCharCode(10)
				// body = body.gsub(linefeed,"%0A") // using prototype function
				// ======== Replace quote characters with %22 in BODY ===========
				// var linefeed = String.fromCharCode(34)
				// body = body.gsub(linefeed,"%22")
				body = encodeURI(body); 
				// BUG B04069 NR 08/20/2008 ----------- END -----------
				// ======== Replace quote characters with %22 in Subject ===========
				var linefeed = String.fromCharCode(34)
				subject = subject.gsub(linefeed,"%22")
			
				// ======== Create Mail To URL ===========
				var block = "mailto:" + mail_to + "?"
				if(cc != ""){
					block = block + "cc=" + cc + "&"
				}
				if(bcc != ""){
					block = block + "bcc=" + bcc + "&"
				}
					block = block + "subject=" + subject + "&body=" + body
			
					window.location.href = block
					// give one secound to submit form so that Safari will respond
					if(blnSubmit){
						document.getElementById('btnSnedViaLocal').value = "Send_EMail_via"
						setTimeout('document.forms[0].submit()',1000)    // 1 sec. later
					}
			} else{
				document.getElementById('errMsg').innerHTML = errMsg
				return false;
			}
			
}	// end of function send_email

/*  ****************************************************
			Refrehs Parent Window
 /  **************************************************** */
function reloadParent(){
	window.location.href=window.location.href
}

function GoToURL(NewURL) { 
	window.location = NewURL; 
}

/*******
* toggleView: Toggle View (Hide and Show)
- toggle_obj_id: id of the object to hide and show
- clickable_obj_id: id of the clickable object to trigger this function
- txtShow_for_clickable: text to display for clickable Ojbect when the object is hidden (ie: "Show", "... Read More")
- txtHide_for_clickable: text to display for clickable Ojbect when the object is shown (ie: "Hide")
*******/

function toggleView(toggle_obj_id, clickable_obj_id, txtShow_for_clickable, txtHide_for_clickable){
	var clickableObject = document.getElementById(clickable_obj_id)
	if(clickableObject.innerHTML == txtShow_for_clickable){ // if Read More... then	
		show(toggle_obj_id); // show text
		clickableObject.innerHTML = txtHide_for_clickable; // change the text to Hide
	}
	else{
		hide(toggle_obj_id);
		clickableObject.innerHTML = txtShow_for_clickable;
	}
}
/* ********************************************************
            E-FIle Flow Handler
            Bug B02751 BH 02/11/2008
/  ******************************************************** */
function controlFlow(command, flowClass, removeValue){
	var arrClasses = flowClass.split(",");
		
	for(x=0; x<arrClasses.length; x++){
		class_Name = StripSpace(arrClasses[x])
		var arrObjects = GetElementsByClassName(document, 'input', class_Name);
		var RecordCount = arrObjects.length;
		for(y=0; y<RecordCount; y++){
			if(command=="disable"){
				arrObjects[y].disabled = true;
				if (removeValue == true){
					arrObjects[y].value = "";
				}
				if(arrObjects[y].type == "radio")
					if(arrObjects[y].checked == true)
						arrObjects[y].checked = false;
			}else{
				arrObjects[y].disabled = false;	
			}
					
		}				
	}
}

/* ********************************************************
            E-FIle Flow Handler Part2 (GetElementByClassName)
            Bug B02751 BH 03/18/2008
/  ******************************************************** */
function GetElementsByClassName(oElm, strTagName, strClassName){
		    var arrElements = (strTagName == "*" && oElm.all)? oElm.all :
		        oElm.getElementsByTagName(strTagName);
		    var arrReturnElements = new Array();
		    strClassName = strClassName.replace(/\-/g, "\\-");
		    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
		    var oElement;
		    for(var i=0; i<arrElements.length; i++){
		        oElement = arrElements[i];     
		        if(oRegExp.test(oElement.className)){
		            arrReturnElements.push(oElement);
		        }   
		    }
		    return (arrReturnElements)
}

function StripSpace(value){
	value = (value).replace(/^\s*|\s*$/g,'');
	return value;
}
          
/* ********************************************************
            Visibility Controler
            Hide/Show section
            requires prototype.js
/ ******************************************************** */
function toggleVisibility(headerObj, contentId, sid, args){
	var divElem = document.getElementById(contentId);
	divElem.innerHTML = "<span style='font-size:12px; padding:5px;'>Loading...</span>"
	if(headerObj.alt == "right arrow")  {	// hide to show
		headerObj.src = "/Images/arrow_down.png";
		headerObj.alt = "down arrow";
		headerObj.title = "click here to close this section";
		var param = "show=" + contentId;
	}else{
		headerObj.src = "/Images/arrow_right.png";
		headerObj.alt = "right arrow";
		headerObj.title = "click here to open this section";
		var param = "hide=" + contentId;
	}
	var url = "/4DCGI/Web_Menu/" + sid + "/1010/" + args + "?" + param;
	//getHTML(url, contentId, param)
	new Ajax.Request(url, {
  		method: 'get',
  		onSuccess: function(transport) {
  			divElem.innerHTML = transport.responseText
  		}
	}); 
}

/* ********************************************************
            submit form using JavaScript
            when to use: when you want to have input submit value to be different from actual submit btn name
            Requires: prototype.js
/ ******************************************************** */
function Utl_SubmitForm(formName,submitValue, hiddenInputId){
	$(hiddenInputId).value=submitValue;
	$(FormName).submit();
}

/* ********************************************************
            create new I-94 record
            when to use: anywhere there's a new I-94
            usage: put "New I-94" button on page with common.js linked and
            			put in sort number as parameter (if field name is
            			s1201/Field/20:7/Mixed, put in "s1200").  This will
            			reset the key to -1 and clear all fields named "s1201..."
/ ******************************************************** */
function CreateNewI94(BaseSort,btnID){
	var Key = BaseSort;
	var BaseSort = BaseSort.substr(0,4) + "";
	var PlusOne = BaseSort + "1";
	var AllFields;
	if (document.getElementsByTagName("input")) {
		AllFields = document.getElementsByTagName("input");
		for (EachField in AllFields){
			var daField = AllFields[EachField];
			if(daField.name){
				if(daField.name.substr(0,4)==BaseSort){
					var daType = daField.type;
					switch (daType){
						case "hidden":
							if(daField.name.substr(0,5)==Key){
								document.getElementsByName(daField.name)[0].value="-1";
							}
							break;
						case "radio":
							daField.checked = false;
							break;
						default:
							if(daField.name.substr(0,5)==PlusOne){
								document.getElementsByName(daField.name)[0].value="";
							}
							break;
					}
				}
			}
			document.getElementById(btnID.id).disabled=true;
		}
	}
}

/* ********************************************************
            toggle check/uncheck checkboxes - select/deselect
			BUG B04558 NR 12/18/2008
/ *********************************************************/
function toggleAllCheckboxes(toggleObj){
	var chkBoxes = document.getElementsByTagName('input');
	for (var i = 0; i < chkBoxes.length; i++){
		if((chkBoxes[i].type == "checkbox") && (chkBoxes[i].disabled == false)){
			if (toggleObj.checked) chkBoxes[i].checked =  true;
			else  chkBoxes[i].checked =  false;
			
		}
	}
}
/***********************************************************
*        addInputRows - used to dynamically add rows to table of inputs     *
*		BUG B04642 GJM 5/14/2009											  *
************************************************************/
function addInputRows(base,insert){
	var daName;
	var daType;
	var i;
	var x;
	var len;
	var daNumbers = '0123456789';
	var maxcounter=window[base+'maxcounter'];
	var maxrows=window[base+'maxrows'];
	if (window[base+'counter']>=maxcounter){
		return false;
	}
	if (window[base+'rows']>=maxrows){
		return false;
	}
	var removeCounter=window[base+'counter'];
	window[base+'rows']++;	
	var daGroup = document.getElementById(base).cloneNode(true);
	daGroup.id = '';
	daGroup.style.display = '';
	var daInputs = daGroup.getElementsByTagName("input");
	var daSelects = daGroup.getElementsByTagName("select");
	var daTextAreas = daGroup.getElementsByTagName("textarea");	
	var daDivs = daGroup.getElementsByTagName("div"); //Need this to ensure autocompletes work correctly
	var arrInputs = new Array();
	var arrTableFields = new Array();
	var arrSortNums = new Array();
	len = daInputs.length;
	for (i=0; i<len; i++) {
		arrInputs.push(daInputs[i]);
	}
	len = daSelects.length;
	for (i=0; i<len; i++) {
		arrInputs.push(daSelects[i]);
	}
	len = daTextAreas.length;
	for (i=0; i<len; i++) {
		arrInputs.push(daTextAreas[i]);
	}	
	for (i=0;i<arrInputs.length;i++) {
		daName = arrInputs[i].name;
		daType = Left(daName,5);
		var tempTable = daName.substring(6);
		daTable='';
		for (x=0;x<tempTable.length;x++){
			if(daNumbers.indexOf(tempTable.charAt(x)) != -1){
				daTable+=tempTable.charAt(x);
			}else{
				x=tempTable.length; //exit loop
			}
		}
		if(daType == 'TABLE'){ //preps sort numbers for use
			arrTableFields.push(daType+'/'+daTable);
			arrSortNums.push(window[base+'counter']);
			daName = 's'+window[base+'counter']+"/"+daName;
			window[base+'counter']++;
			arrTableFields.push('FIELD/'+daTable);
			arrSortNums.push(window[base+'counter']);
			window[base+'counter']++;			
		}else{
			for (x=0;x<arrTableFields.length;x++){
				if(arrTableFields[x].toLowerCase()==(daType+'/'+daTable).toLowerCase()){
					daName='s'+arrSortNums[x]+'/'+daName;
					x=arrTableFields.length;
				}
			}
		}
		arrInputs[i].name = daName;
		if(arrInputs[i].id != ''){ //make sure we don't have duplicate IDs
			if(arrInputs[i].id=="bRemove"){
				arrInputs[i].id="s"+removeCounter;
			}else{
			arrInputs[i].id = arrInputs[i].id+window[base+'rows'];
			}
		}
		arrInputs[i].className = arrInputs[i].className.replace(/fv_hidden/gi,"fv");
	}				
	for (i=0; i<daDivs.length; i++) {
		daDivs[i].id+=window[base+'rows'];
	}	
	/*for (i=0;i<daSelects.length;i++) {
		daName = daSelects[i].name;
		daSelects[i].name = "s"+window[base+'counter']+"/"+daName;
	}*/
	var insertHere = document.getElementById(insert);
	insertHere.parentNode.insertBefore(daGroup,insertHere);
}		
function clearTableRowContents(daRow){
	var daKids = document.getElementById(daRow).childNodes;
		//for (i=0;i<daKids.length;i++) {
		//	daKids[i].innerHTML=''
		//}
	return true;
}
function RemoveRow(daButton,tag){
	if(document.getElementById(tag+"_delete")){
		if(isIE()){
			document.getElementById(tag+"_delete").value+=daButton.parentNode.parentNode.childNodes[0].childNodes[0].value+"|";
		}
		else{
			document.getElementById(tag+"_delete").value+=daButton.parentNode.parentNode.childNodes[1].childNodes[1].value+"|";
		}
	}
	daButton.parentNode.parentNode.parentNode.removeChild(daButton.parentNode.parentNode);
	window[tag+'rows']--;
}

function RestoreRows(daButton,tag){
	alert("Form is refreshing, thank you for your patience.");
	if(document.getElementById(tag+"_delete")){
		document.getElementById(tag+"_delete").value="";
	}
	submitFormfromBtn(daButton, "Update Info");
}

/* ********************************************************
            Figures Amount on charges
			BUG B04446 BH 05/07/2009
			BUG B00755 BH 05/07/2009 (added rounding)
/ *********************************************************/
function calc_Amount(){
	var units = document.getElementById('Quantity_id').value;
	var price = document.getElementById('Price_id').value;
	var char_1 = price.substring(0,1)
	
	if (char_1 == "$"){
		price = price.substring(1)
		}
		
	var amount = (units*price);
			
    amount = Math.round(amount*100)/100;
    
	document.getElementById('Amount_id').value = amount	
}
/********************************
*        Misc string functions                  *
*		BUG B04642 GJM 5/14/2009	  *
********************************/
function Left(str, n){
	if (n <= 0)
	    return "";
	else if (n > String(str).length)
	    return str;
	else
	    return String(str).substring(0,n);
}
function Right(str, n){
    if (n <= 0)
       return "";
    else if (n > String(str).length)
       return str;
    else {
       var iLen = String(str).length;
       return String(str).substring(iLen, iLen - n);
    }
}

function KeyPressed(e){
	var daKey;
	if (window.event){
		return window.event.keyCode;
	}else if (e){
		return e.which;
	}else{
		return 0;
	}	
}

/********************************
*     Blob Table functions      *
*     BUG B03654 GJM 7/23/2009  *
********************************/
function simpleRowAdd(daID){
	var daName;
	var daType;
	var i;
	var x;
	var len;
	var daTable = document.getElementById(daID).tBodies[0];
	var daNode = daTable.rows[1].cloneNode(true);
	daNode.style.display = '';
	var daInputs = daNode.getElementsByTagName("input");
	var daSelects = daNode.getElementsByTagName("select");
	var daTextAreas = daNode.getElementsByTagName("textarea");	
	var daDivs = daNode.getElementsByTagName("div");
	var daSpans = daNode.getElementsByTagName("span");
	var arrInputs = new Array();
	var arrTableFields = new Array();
	len = daInputs.length;
	for (i=0; i<len; i++) {
		arrInputs.push(daInputs[i]);
	}
	len = daSelects.length;
	for (i=0; i<len; i++) {
		arrInputs.push(daSelects[i]);
	}
	len = daTextAreas.length;
	for (i=0; i<len; i++) {
		arrInputs.push(daTextAreas[i]);
	}	
	len = daDivs.length; /* BUG B07144 GJM 04/14/2010 -----------BEGIN----------- */
	for (i=0; i<len; i++) {
		arrInputs.push(daDivs[i]);
	}
	len = daSpans.length;
	for (i=0; i<len; i++) {
		arrInputs.push(daSpans[i]);
	}	
	var arrAC_IDs = new Array();
	var arrAC_Datas = new Array(); /* BUG B07144 GJM 04/14/2010 ----------END---------- */
	for (i=0;i<arrInputs.length;i++) {
		arrInputs[i].name = arrInputs[i].name + '_' + (daTable.rows.length -2);
		if(arrInputs[i].id != ""){ /* BUG B06384 GJM 04/09/2010 ----------- IF STATEMENT ----------- */
			var daOrigId = arrInputs[i].id;
			arrInputs[i].id = arrInputs[i].id + '_' + (daTable.rows.length -2);
			if(arrInputs[i].className == 'autoComplete'){ /* BUG B07144 GJM 04/14/2010 ----------- IF STATEMENT ----------- */
				daRegex=new RegExp("data\\.(.*?);[^;]*?"+daOrigId,"i");
				var daArray=document.body.innerHTML.match(daRegex);
				arrAC_IDs.push(arrInputs[i].id);
				arrAC_Datas.push(daArray[1]);
			}
			if(arrInputs[i].className.indexOf("autocomplete")>0){ /* BUG B07609 GJM 07/30/2010 ---------- IF STATEMENT ---------- */
				arrAC_IDs.push(arrInputs[i].id);
				var daSource = $j('#'+daOrigId).autocomplete("option","source");
				arrAC_Datas.push(daSource);
			}
		}		
	}
	daTable.insertBefore(daNode, document.getElementById(daID+'_baseline'))
	for(i=0;i<arrAC_IDs.length;i++){ /* BUG B07144 GJM 04/14/2010 ----------- FOR LOOP ----------- */
		$j('#'+arrAC_IDs[i]).autocomplete({source: arrAC_Datas[i]});	 /* BUG B07609 GJM 07/30/2010 ---------- BEGIN ---------- 
		window["arrItems"+arrAC_IDs[i]]=data[arrAC_Datas[i]];
		window["list"+arrAC_IDs[i]]=new Autocompleter.Local(arrAC_IDs[i].replace("div","txt"),arrAC_IDs[i],window["arrItems"+arrAC_IDs[i]],{fullSearch:true});  BUG B07609 GJM 07/30/2010 ---------- END ---------- */		
	}
	//daTable.insertChild(daNode);
}

function simpleRowDelete(daID){
	var daTable = document.getElementById(daID);
	var lastRow = daTable.rows.length;
	var daText=""; /* BUG B07144 GJM 04/12/2010 ----------BEGIN---------- */
	if(lastRow == 4){
		for(i=0;i<daTable.rows[0].cells.length ;i++){
			daText=daTable.rows[lastRow-2].cells[i].innerHTML;
			daText=daText.replace(/value=[\'"]?.*?[\'"\s]/gi,"value=''"); /* BUG B07144 GJM 04/19/2010 ----------BEGIN---------- */
			daText=daText.replace(/(selected|checked)(=[\"']?(selected|checked|true)[\"']?)?/gi,""); 
			daTable.rows[lastRow-2].cells[i].innerHTML=daText; /* BUG B07144 GJM 04/12/2010 ----------END---------- */
		}
		daTable.rows[lastRow-2].style.display="none"; /* BUG B06384 GJM 04/09/2010 */
	}
	else{
		if (lastRow > 4){
			daTable.deleteRow(lastRow - 2);
		}
	}
}


/********************************
* 	function: 	submitFormfromBtn(this, buttonName)
*	purpose: 	call from onclick on input type button
*					pass btnName as expected name by server
* 	BUG B05675 NR 7/23/2009  *
********************************/
function submitFormfromBtn(btnObj, btnName){
	var hiddenInput = document.createElement('input');
	hiddenInput.setAttribute('type', 'hidden');
	hiddenInput.setAttribute('value', btnName);
	hiddenInput.setAttribute('name', 'bUpdate');
	btnObj.parentNode.appendChild(hiddenInput);
	document.forms[0].submit();
}

/********************************
* function: fireEvent(elementName,event)
* purpose: simulates an actual event on
*               an element, firing any href and
*               onClick/onChange/onBlur events
* BUG B03654 GJM 09/03/2009
********************************/
function fireEvent(elementName,event){
	if(elementName){
		if(document.getElementById(elementName)){ // BUG B03654 GJM 04/12/2010 ----------- IF WRAPPER ------------
			var element=document.getElementById(elementName);
			if (document.createEventObject){
				var evt = document.createEventObject();
				return element.fireEvent('on'+event,evt);
			}else{
				var evt = document.createEvent('HTMLEvents');
				evt.initEvent(event, true, true );
				return !element.dispatchEvent(evt);
			}
		}
	}
}

/********************************
* function: CharactersRemaining(textfield_ID, labelfield_ID, max)
* purpose: Limit and display characters remaining of a text field.
* BUG B06358 JV 02/04/2010
********************************/
function CharactersRemaining(textfield_ID, labelfield_ID, max){
	if(document.getElementById(textfield_ID).value.length > max){
		document.getElementById(textfield_ID).value=document.getElementById(textfield_ID).value.substring(0, max);
	}else{
		document.getElementById(labelfield_ID).innerHTML = max - document.getElementById(textfield_ID).value.length;
	}
}
/********************************
* function: isIE()
* purpose: Returns true if browser is Microsoft Internet Explorer.
* BUG B06358 JV 03/04/2010
********************************/
function isIE(){
	var browser = navigator.appName;
	if(browser=="Microsoft Internet Explorer"){
		return true;
	}
	return false;
}

/********************************
* function: ValidateHHMMSS()
* purpose: Display alert if input field not in the format of HH:MM:SS with valid max values of 23:59:59.
(exception on hour, possible 24 IF min/sec are 0's)
* BUG B06917 JV 03/15/2010
********************************/

function ValidateHHMMSS(time_id){
	var daText;
	var arrText;
	var hour;
	var minute;
	var second;
	daText = time_id;
	daText = document.getElementById(time_id).value;
	arrText = daText.split(":");
	if(arrText.length != 3){
		//alert("Please enter time in format HH:MM:SS");
		alert("Time format is HH:MM:SS. Valid range is 00:00:00 - 23:59:59.");
		return false;
	}else{
		hour = parseInt(arrText[0]);
		minute = parseInt(arrText[1]);
		second = parseInt(arrText[2]);
		if((second < 0) || (second > 59)){
			//alert("Time format is HH:MM:SS. Please enter valid seconds (0-59)");
			alert("Time format is HH:MM:SS. Valid range is 00:00:00 - 23:59:59.");
			return false;
		}
		if((minute < 0) || (minute > 59)){
			//alert("Time format is HH:MM:SS. Please enter valid minutes (0-59)");
			alert("Time format is HH:MM:SS. Valid range is 00:00:00 - 23:59:59.");
			return false;
		}
		if((hour < 0) ||  (hour > 23 )){
			//alert("Time format is HH:MM:SS. Please enter valid Hour (0-24). Time cannot be greater than 23:59:59.");
			alert("Time format is HH:MM:SS. Valid range is 00:00:00 - 23:59:59.");
			return false;
		}
	}
	return true;
}

/********************************
* function: getSelectedValues(element_name)
* purpose: Get the value of the element by its name
* BUG B06384 GJM 02/11/2010
********************************/
function getSelectedValues(daName){
	if(daName){
		var arrElems=document.getElementsByName(daName);
		if(arrElems.length>0){
			var x;
			if(arrElems[0].type=='radio'){
				for(x=0;x<arrElems.length;x++){
					if(arrElems[x].checked==true){
						return arrElems[x].value;
					}
				}
				//alert('radio');
			}else if(arrElems[0].type=='checkbox'){
				var arrSelected=new Array();
				for(x=0;x<arrElems.length;x++){
					if(arrElems[x].checked==true){
						arrSelected.push(arrElems[x].value);
					}
				}
				return arrSelected;
			}else if(arrElems[0].type=='select-one'){
				var returnVal='';
				for(x=0;x<arrElems.length;x++){
					returnVal=returnVal+arrElems[x].options[arrElems[x].selectedIndex].value;
				}
				return returnVal;
			}else if(arrElems[0].type=='select-multiple'){
				var arrSelected=new Array();
				for(x=0;x<arrElems[0].options.length;x++){
					if(arrElems[0].options[x].selected==true){
						arrSelected.push(arrElems[0].options[x].value);
					}
				}
				return arrSelected;	
			}else if((arrElems[0].type=='text') || (arrElems[0].type=='textarea')){
				var returnVal='';
				for(x=0;x<arrElems.length;x++){
					returnVal=returnVal+arrElems[x].value;
				}
				return returnVal;	
			}else{
				return '';
			}
		}else{
			return '';
		}
	}else{
		return '';
	}
	return'';/* BUG B07282 JV 05/03/2010 */
}

/********************************
* function: setSelectedValues(element_name)
* purpose: Set the value of the element by its name
* BUG B06384 GJM 02/19/2010
********************************/
function setSelectedValues(daName,daVal){
	if(daName){
		var arrElems=document.getElementsByName(daName);
		if(arrElems.length>0){
			var x;
			if(arrElems[0].type=='radio'){
				for(x=0;x<arrElems.length;x++){
					if(arrElems[x].value==daVal){
						arrElems[x].checked=true;
						x=arrElems.length;
					}
				}
			}else if(arrElems[0].type=='checkbox'){
				for(x=0;x<arrElems.length;x++){
					if(arrElems[x].value==daVal){
						arrElems[x].checked=true;
					}
				}
			}else if(arrElems[0].type=='select-one'){
				for(x=0;x<arrElems.length;x++){
					for(var y=0;y<arrElems[x].options.length;y++){
						if(arrElems[x].options[y].value==daVal){
							arrElems[x].options[y].selected=true;
							y=arrElems[x].options.length;
						}
					}
				}
			}else if(arrElems[0].type=='select-multiple'){
				for(x=0;x<arrElems[0].options.length;x++){
					for(var y=0;y<arrElems[x].options.length;y++){
						if(arrElems[x].options[y].value==daVal){
							arrElems[x].options[y].selected=true;
						}
					}
				}
			}else{
				for(x=0;x<arrElems.length;x++){
					arrElems[x].value=daVal;
				}
			}
		}
	}
}
/********************************
* function: indexOf(obj, fromIndex)
* purpose: Find In Array function for JS 
	(this is only needed in the case of IE6)
* BUG B06384 GJM 02/23/2010
********************************/
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function (obj, fromIndex) {
    if (fromIndex == null) {
        fromIndex = 0;
    } else if (fromIndex < 0) {
        fromIndex = Math.max(0, this.length + fromIndex);
    }
    for (var i = fromIndex, j = this.length; i < j; i++) {
        if (this[i] === obj)
            return i;
    }
    return -1;
  };
}

/********************************
* function: getAllInputsFromElem(daElem,sortMe)
* purpose: Gathers all form elements
*				from a particular element
* BUG B06384 GJM 03/03/2010
********************************/
	function getAllInputsFromElem(daElem,sortMe){
		var i;
		var daInputs=daElem.getElementsByTagName('input');
		var daSelects=daElem.getElementsByTagName('select');
		var daTextAreas=daElem.getElementsByTagName('textarea');
		var arrInputs = new Array();
		for (i=0; i<daInputs.length; i++) {
			arrInputs.push(daInputs[i]);
		}
		for (i=0; i<daSelects.length; i++) {
			arrInputs.push(daSelects[i]);
		}
		for (i=0; i<daTextAreas.length; i++) {
			arrInputs.push(daTextAreas[i]);
		}
		if(sortMe){
			arrInputs.sort();
		}
		return arrInputs;
	}

/********************************
* function: addTable(daMainId,daTableId,maxElems)
* purpose: Adds a table (built by UTL_Build_JS_Table_Adder)
* BUG B06384 GJM 03/03/2010
* BUG B06384 GJM 04/06/2010 (significant rewrite)
********************************/	
	function addTable(daMainId,daTableId,maxElems){
		var tInputNum;
		var daElem=document.getElementById(daTableId);
		var arrInputs=getAllInputsFromElem(daElem);
		var arrAutocompletes=new Array();
		daElem=document.getElementById(daMainId);
		var arrAllInputs=getAllInputsFromElem(daElem);		
		if((arrAllInputs.length/arrInputs.length)>maxElems){
			alert('Maximum number of rows is '+maxElems);
		}else{
			var arrNums=new Array();
			for(var i=0;i<arrInputs.length;i++){
				tInputNum=(arrInputs[i].name.split("/")[0]).split("s")[1];
				if(IsNumeric(tInputNum)){
					arrNums.push(tInputNum);
				}
				if(arrInputs[i].className.indexOf("autocomplete")>0){
					arrAutocompletes.push(arrInputs[i].id);
				}
			}
			arrNums.sort();
			var minSort=Number(arrNums[0]);
			var maxSort=Number(arrNums[arrNums.length-1]);
			var daStep=(maxSort-minSort)+1;
			var arrNums=new Array();
			for(var i=0;i<arrAllInputs.length;i++){
				tInputNum=(arrAllInputs[i].name.split("/")[0]).split("s")[1];
				if(IsNumeric(tInputNum)){
					arrNums.push(tInputNum);
				}
			}
			arrNums.sort();
			var newBase=Number(arrNums[arrNums.length-1])+1;
			var tempDiv = document.createElement("div");
			document.body.appendChild(tempDiv);
			var daNode = document.getElementById(daTableId).cloneNode(true);
			tempDiv.appendChild(daNode);
			tempHTML = tempDiv.innerHTML;
			var daRegex;
			for(var i=daStep;i>=0;i--){
				daRegex=new RegExp("s"+(minSort+i),"ig");
				tempHTML=tempHTML.replace(daRegex,"s"+(newBase+i));
			}
			tempHTML=tempHTML.replace(/(id=[\"']?.*?)([\"'\s])/gi,"$1"+newBase+"$2"); /* BUG B07144 GJM 04/19/2010 */
			/* BUG B07144 GJM 04/12/2010 ---------- BEGIN -----------
			tempHTML=tempHTML.replace(/selected(\=["'].*?["'])?/ig,"");
			tempHTML=tempHTML.replace(/checked(\=["'].*?["'])?/ig,"");
			tempHTML=tempHTML.replace(/value\=["']Remove["']/ig,"val='Remove'");
			tempHTML=tempHTML.replace(/value\=["'].*?["']/ig,"value=''");
			tempHTML=tempHTML.replace(/val\=["']Remove["']/ig,"value='Remove'");
			BUG B07144 GJM 04/12/2010 -----------END----------- */
			daRegex=new RegExp(daTableId,"ig");
			tempHTML=tempHTML.replace(daRegex,daTableId+newBase);
			tempDiv.innerHTML=tempHTML;
			var daNode=tempDiv.firstChild.cloneNode(true);
			daNode.id=daTableId+newBase;
			daNode.style.display="";
			document.getElementById(daMainId).insertBefore(daNode,document.getElementById(daMainId).lastChild);
			if(tempHTML.indexOf("autoComplete")>0){ /* BUG B07144 GJM 04/12/2010 -----------BEGIN----------- */
				var daDiv=tempHTML.match(/<div[^<]*?autoComplete.*?>/gi);
				for(i=0;i<daDiv.length;i++){
					var daID=daDiv[i].match(/=[\"']?(div.*?)[\"'\s]/i); /* BUG B07144 GJM 04/19/2010 */
					daRegex=new RegExp("data\\.(.*?);[^;]*?"+daID[1].replace(newBase,""),"i");
					var daArray=document.body.innerHTML.match(daRegex);
					window["arrItems"+newBase+i]=data[daArray[1]];
					window["list"+newBase+i]=new Autocompleter.Local(daID[1].replace("div","txt"),daID[1],window["arrItems"+newBase+i],{fullSearch:true});
				}
			} /* BUG B07144 GJM 04/12/2010 -----------END----------- */
			if(tempHTML.indexOf("autocomplete")>0){ /* BUG B07609 GJM 07/30/2010 ---------- IF STATEMENT ---------- */
				var daInput=tempHTML.match(/<input[^<]*?autocomplete.*?>/gi);
				for(i=0;i<daInput.length;i++){
					var daID=daInput[i].match(/txt.*?\b/i);
					var daSource = $j('#'+arrAutocompletes[i]).autocomplete("option","source");
					$j('#'+daID[0]).autocomplete({source: daSource});		
				}				
			}
			tempDiv.parentNode.removeChild(tempDiv);
		}
	}

/********************************
* function: removeTable(daMainId,daTableId)
* purpose: Removes a table (built by UTL_Build_JS_Table_Adder)
* BUG B06384 GJM 03/03/2010
* BUG B07609 GJM 07/21/2010
********************************/	
function removeTable(daMainId,daTableId){
		//var daElem=document.getElementById(daTableId);
		//daElem.removeNode(true);
		if(document.getElementById(daMainId+"_delete") && document.getElementById("key_"+daTableId)){ //BUG B07609 GJM 07/21/2010
			document.getElementById(daMainId+"_delete").value+=document.getElementById("key_"+daTableId).value+"|"; //BUG B07609 GJM 07/21/2010
		}
		document.getElementById(daMainId).removeChild(document.getElementById(daTableId));
		var daElem=document.getElementById(daMainId);
		var arrInputs=getAllInputsFromElem(daElem,true);
		var arrNames=new Array();
		for(var i=0;i<arrInputs.length;i++){
			arrNames.push((arrInputs[i].name.split("/")[0]).split("s")[1]);
		}
		arrNames.sort();
		var minSort=Number((arrInputs[0].name.split("/")[0]).split("s")[1]);
		var maxSort=Number((arrInputs[arrInputs.length-1].name.split("/")[0]).split("s")[1]);
		var lastFound=0;
		for(var i=minSort;i<=maxSort;i++){
			if(arrNames.indexOf(i+"",lastFound)>=0){
				lastFound=arrNames.indexOf(i+"");
			}else{
				lastFound+=1;
				for(var x=lastFound;x<=arrNames.length;x++){
					if(Number(arrNames[x])>i){
						lastFound=x;
					}
				}
				var daRegex=new RegExp(arrNames[lastFound],"ig");
				arrNames[lastFound]=i+"";
				document.getElementById(daMainId).innerHTML.replace(daRegex,arrNames[lastFound]);
			}
		}
	}
/********************************
* function: radioButtonRevealElem(txtRdoName,txtElemID)
* purpose: Hide/show element based on radio button value=1 for yes
* BUG B06384 GJM 03/18/2010
* BUG B06384 GJM 04/08/2010
********************************/	
	function radioButtonRevealElem(txtRdoName,txtElemID){
		var daVal=getSelectedValues(txtRdoName);
		var daBlock=document.getElementById(txtElemID);
		if(daVal=="1"){ /* BUG B03654 GJM 05/03/2010 (corrected to text value comparison) */
			daBlock.style.display="";
		}else{
			daBlock.style.display="none";
		}
		if(window.enableValidation){ /* BUG B06384 GJM 04/08/2010 ---------- IF WRAPPER ---------- */
			hideShowValidationClasses(txtElemID,(daVal!="1"));/* BUG B07282 JV 05/03/2010 (corrected to text value comparison) */
		}
	}


/********************************
* function: createCookie(name,value,days)
* purpose: Create a cookie file, Params are the name of the cookie (what you can retrieve as later), the value
* to be stored for the cookie, and the amount of days until the cookie expires
* Code for following 3 methods from tutorial www.quirksmode.org/js/cookies.html
* BUG B07482 JV 07/15/2010
********************************/	
function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}
/********************************
* function: readCookie(name)
* purpose: You pass in the name you created the cookie with, and it returns the value, or null
* BUG B07482 JV 07/15/2010
********************************/	
function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}
/********************************
* function: eraseCookie(name)
* purpose: This "overwrites" the cookie with the name passed in, with one that expires yesterday, so browser deletes it
* BUG B07482 JV 07/15/2010
********************************/	
function eraseCookie(name) {
	createCookie(name,"",-1);
}


/********************************
* function: isCookieEnabled()
* purpose: Returns true if users have cookies turned on, or false if off
* BUG B06779 JV 08/12/2010
********************************/	
function isCookieEnabled(){
	/*if(navigator.cookieEnabled){
		cookieEnabled=true;
	}else{
		cookieEnabled=false;
	}
	cookieEnabled=false;*/
	/*if not IE4+ nor NS6+*/
	/*if (typeof navigator.cookieEnabled=="undefined" && !cookieEnabled){ 
		document.cookie="test";*/
	eraseCookie("LLX");
	createCookie("LLX","test",1);
	if(readCookie("LLX")=="test"){/*(document.cookie.indexOf("test")!=-1){*/
		cookieEnabled=true;
	}else{
		cookieEnabled=false;
	}
	/*}*/
	eraseCookie("LLX");
	return cookieEnabled;
}