var isIE = (typeof(window.showModalDialog)=='undefined' ? false : true);

function getIEVersion()
{
	var ua = window.navigator.userAgent;
	var i = ua.indexOf('MSIE ');

	if (i > 0)
		// if IE, return version number
		return parseInt(ua.substring(i + 5, ua.indexOf('.', i)), 10);
	else
		// if another browser, return 0
		return 0;
}

function trim(text)
{
	if (text) return text.replace(/^\s+|\s+$/g, '');
}

function getNonBreakText(text)
{
	return text.replace(/ /g, '&nbsp;');
}

function getAttributeValue(value)
{
	return value.toString().replace(/"/g, '&quot;');
}

function getLabel(n, label, labels)
{
	if (n == 1)
		return n + ' ' + label;
	else
		return n + ' ' + (labels ? labels : label + 's');
}

function getFrame(sName)
{
	var h = window;
	while (h.name != sName && h.parent != h) h = h.parent;
	return h;
}

function getFunctionName(oFunction)
{
	if (oFunction) return oFunction.toString().match(/^function\s+(\w+).+/)[1];
	return '';
}



function editHTML(oField, oPreview, nVID)
{
	var bValueSource = (typeof(oField.value) != 'undefined')
	var val = (bValueSource ? oField.value : oField.innerHTML);

	var aParams = new Array();
	var i = 0;
	var s = 0;

	while (s < val.length)
	{
		aParams[i++] = val.substr(s, 4096);
		s += 4096;
	}

	var sResult = window.showModalDialog('/include/pop_EditHTML.asp' + (nVID ? '?VID=' + nVID : ''),
		aParams, 'help:no;status:no;resizable:yes;scroll:no;dialogHeight:370px;dialogWidth:498px');

	if (sResult != null && sResult != val)
	{
		if (bValueSource) oField.value = sResult;

		if (oPreview)
		{
			try
			{
				oPreview.innerHTML = sResult;
			}
			catch(e)
			{
				oPreview.innerHTML = '<font color="red">HTML error! Please correct.</font>';
			}
		}
		return true;
	}
	return false;
}

function renderHTMLControl(sName, sValue, sFrameAttributes, sOnChangeHandler)
{
	return (
		'<input type="hidden" name="' + sName + '"' +
			(typeof(sValue) == 'undefined' || sValue == null ? '' : ' value="' + getAttributeValue(sValue) + '"') +
			(sOnChangeHandler ? ' onpropertychange="' + sOnChangeHandler + '"' : '') + '>' +
		'<iframe name="htmlControlPreviewFrame" src="/include/controls/htmlControlPreview.html"' +
			(sFrameAttributes ? ' ' + sFrameAttributes : '') + '></iframe>');
}

function setHTMLControlValue(oControl, sValue)
{
	oControl.value = sValue;
	oControl.nextSibling.src = oControl.nextSibling.src;
}

function reloadHTMLPreviewFrames(oContainer, bForce)
{
	var oFrames = oContainer.getElementsByTagName('iframe');
	for (var i = 0; i < oFrames.length; ++i)
		if (oFrames[i].name == 'htmlControlPreviewFrame' && (bForce || oFrames[i].style.pixelHeight == 0))
			oFrames[i].src = oFrames[i].src;
}



function validDate(nMonth, nDay, nYear) {
	var dDate = new Date(nYear, nMonth-1, nDay)
	if (dDate.getMonth()!=nMonth-1)
		return false;
	else
		return true;
}

function checkDigit(hasDecimal)
{
	if (event.keyCode == 46)
		return (hasDecimal ? true : false);
	else
		return (event.keyCode >= 48 && event.keyCode <= 57);
}

function checkChar()
{
	// letters, space, apostrophe, hyphen
	return ((event.keyCode >= 65 && event.keyCode <= 90) ||
		(event.keyCode >= 97 && event.keyCode <= 122) ||
		event.keyCode == 32 ||
		event.keyCode == 39 ||
		event.keyCode == 45);
}

function checkAlfaNumeric() {
	return ((event.keyCode >= 65 && event.keyCode <= 90) || (event.keyCode >= 97 && event.keyCode <= 122) ||
		 (event.keyCode >= 48 && event.keyCode <= 57));
}



function getNotNegative(n)
{
	return n = (n<0 ? 0 : n);
}


function getObj(name)
{
	if (document.getElementsByName)
	{
		var objects = document.getElementsByName(name);
		if (objects.length) return objects[0]; 
	}

	if (document.getElementById)
		return document.getElementById(name);
	else if (document.all)
		return document.all[name];
	else if (document.layers)
		return document.layers[name];
	else
		return null;
}

// to be used instead of oControl.disabled=true/false to retain the posted value when submitting the form
function disableTextBox(oControl, bDisable)
{
	oControl.readOnly = bDisable;
	oControl.style.backgroundColor = (bDisable ? 'buttonface' : 'window');
}

// to be used instead of oControl.disabled
function isTextBoxDisabled(oControl)
{
	return oControl.readOnly;
}

function getOptionChecked(oOptions)
{
	if (oOptions.length)
	{
		for (var i = 0; i < oOptions.length; ++i)
			if (oOptions[i].checked) return i;
	}
	else if (oOptions.checked)
		return 0;

	return -1;
}

function setOptionChecked(oOptions, sValue)
{
	for (var i = 0; i < oOptions.length; ++i)
		if (oOptions[i].value == sValue)
		{
			oOptions[i].checked = true;
			break;
		}
}

function isOptionChecked(oOptions)
{
	return (getOptionChecked(oOptions) >= 0);
}

function isValidText(value)
{
	return !(/^\s*$/.test(value));
}

function isValidInt(value)
{
	var n = parseInt(value, 10);
	return !isNaN(n) && n == parseFloat(value);
}

function isValidID(value)
{
	var n = parseInt(value, 10);
	return !isNaN(n) && n > 0 && n == parseFloat(value);
}

function isValidFloat(value)
{
	var n = parseFloat(value);
	return !isNaN(n);
}

function isPositiveNumber(value, bAllowZero)
{
	var n = parseFloat(value);
	return !isNaN(n) && (n > 0 || (bAllowZero && n == 0));
}

function isNumberInRange(value, nMin, nMax)
{
	var n = parseFloat(value);
	return !isNaN(n) && n >= nMin && n <= nMax;
}

function isValidMoneyAmount(value, bAllowZero)
{
	if (!/^\d+(\.\d{1,2})?$/.test(value))
		return false;
	else if (bAllowZero)
		return true;
	else
		return (parseFloat(value) != 0);
}

function isValidTime(value)
{
	return /^\d{1,2}:\d{1,2} [A|P]M$/.test(value);
}

function isValidEmail(value)
{
	if (isValidText(value))
		return /^\s*\w+((\&|\-|\.|')\w+)*@(\w+(\-\w+)*\.)+\w{2,4}\s*$/.test(value);
	else
		return false;
}

var VALID_PASSWORD_FORMAT = 'at least 6 characters, including at least 1 digit';

function isValidPassword(value)
{
	return value.length >= 6 && /^\S*\d\S*$/.test(value);
}

function isUSA(CountryName) {
	return (CountryName=='United States')
}


function isCanada(CountryName) {
	return (CountryName=='Canada')
}

function toggleCountry(oCountry, oState, oProvince)
{
	if (isUSA(oCountry[oCountry.selectedIndex].text))
	{
		oState.disabled = false;
		oProvince.disabled = true;
	}
	else if(isCanada(oCountry[oCountry.selectedIndex].text))
	{
		oState.disabled = true;
		oProvince.disabled = false;
	}
	else
	{
		oState.disabled = true;
		oProvince.disabled = true;
	}
}

function getAddress(Address1, Address2, City, State, Province, Zip, Country)
{
	return (Address1 + ', ' + (isValidText(Address2) ? Address2 + ', ' : '') + City + ', ' + 
		(State=='' ? '' : State+' ') + (Province=='' ? '' : Province+' ') + 
		Zip + ', ' + Country);
}

function getCustomer(nVID, nCompanyID, nContactID, nOnSiteContactID)
{
	var sURL = '/VenueAdmin/Users/pop_SelectCustomer.asp?VID=' + nVID +
		(typeof(nCompanyID) == 'undefined' ? '' : '&ID=0' + nCompanyID) +
		(typeof(nContactID) == 'undefined' ? '' : '&UID=0' + nContactID) +
		(typeof(nOnSiteContactID) == 'undefined' ? '' : '&OnSiteUID=0' + nOnSiteContactID);

	return window.showModalDialog(sURL, null, 'help:no;status:no;resizable:yes;dialogHeight:500px;dialogWidth:700px;');
}

function viewCustomer(nVID, nCompanyID)
{
	var sURL = '/VenueAdmin/Users/pop_SelectCustomer.asp?VID=' + nVID + '&ID='+ nCompanyID + '&view=1';

	return window.showModalDialog(sURL, null, 'help:no;status:no;resizable:yes;dialogHeight:320px;dialogWidth:240px;');
}

function viewUser (nUID, nVID)
{
	if (nVID)
		window.showModalDialog('/VenueAdmin/Users/pop_ViewUser.asp?VID=' + nVID + '&UID=' + nUID, null, 'help:no;status:no;resizable:yes;dialogHeight:442px;dialogWidth:600px;');
	else
		window.showModalDialog('/MasterAdmin/Users/pop_ViewUser.asp?UID=' + nUID, null, 'help:no;status:no;resizable:yes;dialogHeight:382px;dialogWidth:600px;');
}

function getCCKey()
{
	return window.showModalDialog('/include/pop_CCKey.asp',
		null, 'help:no;status:no;resizable:yes;scroll:no;dialogHeight:140px;dialogWidth:350px');
}

function showCCData(nVID, nID, sObjectType, nObjectID)
{
	var height, width;

	if (sObjectType == 'BEOID')
	{
		height = 170;
		width = 380;
	}
	else
	{
		height = 128;
		width = 320;
	}

	window.open('/VenueAdmin/pop_CCData.asp' +
		'?VID=' + nVID + '&ID=' + nID + '&' + sObjectType + '=' + nObjectID,
		null, 'width=' + width + ',height=' + height +
		',location=no,menubar=no,toolbar=no,scrollbars=no,resizable=yes');
}


function addCCData(nVID, sObjectType, nObjectID)
{
	var height = 280;
	var width = 400;

	return window.showModalDialog('/VenueAdmin/addCCData.asp' +
		'?VID=' + nVID + '&' + sObjectType + '=' + nObjectID, null, 
		'help:no;status:no;resizable:no;scroll:no;dialogHeight:' +height+ 'px;dialogWidth:' +width+ 'px');
}


function setDate(obj, objText)
{
	var returnValue = window.showModalDialog('/include/pop_Calendar.htm', obj.value,
		'help:no;status:no;resizable:no;scroll:no;dialogHeight:253px;dialogWidth:185px');

	if (returnValue)
	{
		var dtOld = getDateFromString(obj.value);
		var dtNew = getDateFromString(returnValue);

		if (dtOld != dtNew)
		{
			obj.value = returnValue;
			if (objText)
				objText.innerHTML = getNonBreakText(formatDateLong(dtNew));
			else
				obj.nextSibling.innerHTML = getNonBreakText(formatDateLong(dtNew));

			return true
		}
	}
	return false;
}


function setTime(obj, objText)
{
	var returnValue = window.showModalDialog('/include/pop_TimeSelector.htm', obj.value,
		'help:no;status:no;resizable:no;scroll:no;dialogHeight:128px;dialogWidth:620px');

	if (returnValue && returnValue != obj.value)
	{
		obj.value = returnValue;
		if (objText)
			objText.innerHTML = getNonBreakText(returnValue);
		else
			obj.nextSibling.innerHTML = getNonBreakText(returnValue);
	}
	return returnValue;
}

function setTimeDef(dtDefault, oLink, oHidden)
{
	if (!oLink) oLink = event.srcElement;
	if (!oHidden) oHidden = oLink.previousSibling;

	var returnValue = window.showModalDialog('/include/pop_TimeSelector.htm',
		isValidTime(oHidden.value) ? oHidden.value : dtDefault,
		'help:no;status:no;resizable:no;scroll:no;dialogHeight:128px;dialogWidth:620px');

	if (returnValue && returnValue != oHidden.value)
	{
		oHidden.value = returnValue;
		oLink.innerHTML = getNonBreakText(returnValue);
	}
	return returnValue;
}



function getDateFromString(sDateTime)
{
	return new Date(sDateTime);
}

function getTimeFromString(sTime)
{
	var nHour = parseInt(sTime.substring(0, sTime.indexOf(":")), 10);
	if (isNaN(nHour) || nHour < 1 || nHour > 12)
		nHour = 12;

	var nMinute = parseInt(sTime.substring(sTime.indexOf(":") + 1, sTime.lastIndexOf(' ')), 10);
	if (isNaN(nMinute) || nMinute < 0 || nMinute >= 60)
		nMinute = 0;
	else if (nMinute % 5 != 0)
		nMinute = Math.floor(nMinute / 5) * 5;

	var sAMPM = sTime.substring(sTime.lastIndexOf(' ') + 1, sTime.length);
	if (sAMPM == 'PM')
		nHour = nHour+12;

	return new Array(nHour, nMinute);
}

function getDateTimeFromTimeString(sTime)
{
	var d = new Date();
	var aTime = getTimeFromString(sTime);
	d.setHours(aTime[0],aTime[1]);
	return d;
}

function formatDate(dtValue)
{
	return (dtValue.getMonth() + 1) + '/' + dtValue.getDate() + '/' + dtValue.getFullYear();
}

function formatDateLong(dtValue, bFullMonthName)
{
	var aMonth

	if (bFullMonthName)
		aMonth = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
	else
		aMonth = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');

	return aMonth[dtValue.getMonth()] + ' ' + dtValue.getDate() + ', ' + dtValue.getFullYear();
}

function formatTime(dtValue, bIncludeSeconds)
{
	var hours = dtValue.getHours();

	return (hours > 12 ? hours - 12 : (hours == 0 ? 12 : hours)) + ':' + padN2(dtValue.getMinutes()) +
		(bIncludeSeconds ? ':' + padN2(dtValue.getSeconds()) : '') + ' ' + (hours < 12 ? 'AM' : 'PM');
}

function formatDateTime(dtValue)
{
	return formatDate(dtValue) + ' ' + formatTime(dtValue);
}

function getLocalTimeString()
{
	return formatDateTime(new Date());
}



function padN2(n)
{
	return (n < 10 ? '0' : '') + n.toString();
}

function roundNumber(n, decimals)
{
	var nPower = Math.pow(10, decimals);

	// shift decimal point to right, round and shift to left
	return Math.round(n * nPower) / nPower;
}

function roundAmount(n)
{
	return Math.round(n * 100) / 100;
}

function formatNumber(n, decimals, delimiter)
{
	var result = '';
	var s;
	var i, j;

	if (decimals == null)
		s = n.toString();
	else
	{
		try
		{
			s = n.toFixed(decimals);
		}
		catch (e) // toFixed() is supported by IE 5.5 or higher, convert using round()
		{
			s = roundNumber(n, decimals).toString();

			if (decimals) // must be decimals
			{
				// determine number of existing decimals
				i = s.lastIndexOf('.');

				if (i >= 0)
					i = s.length - i - 1;
				else
				{
					s += '.';
					i = 0;
				}

				// add missing decimals
				while (i++ < decimals) s += '0';
			}
		}
	}

	// locate decimal part
	i = s.lastIndexOf('.');

	if (i == -1)
		i = s.length;
	else
	{
		result = s.substr(i);

		if (result.length > 6 && decimals == null) // there are 6 decimals or more
		{
			result = formatNumber(n, 3, delimiter); // limit to 3 if decimals not specified
			i = 0;

			// remove trailing zeros
			while (result.substr(result.length - 1, 1) == '0')
			{
				result = result.substr(0, result.length - 1);
				++i;
			}

			if (i < 3)
				return result;
			else // remove decimal point if all decimals removed
				return result.substr(0, result.length - 1);
		}
	}

	// add delimiters between every 3 digits
	if (!delimiter) delimiter = ',';
	j = (n < 0 ? 4 : 3);
	while (i > j) result = delimiter + s.substr((i -= 3),3) + result;
	return s.substr(0,i) + result;
}



var currencyAmountMergeField = '{Amount}';
var customCurrencyFormatBE = '$' + currencyAmountMergeField;
//
function formatCurrencyBE(nValue, nDecimal)
{
	if (typeof(nDecimal) == 'undefined') nDecimal = 2;

	if (nValue >= 0)
		return customCurrencyFormatBE.replace(currencyAmountMergeField, formatNumber(nValue, nDecimal));
	else
		return '-' + customCurrencyFormatBE.replace(currencyAmountMergeField, formatNumber(-nValue, nDecimal));
}

function currencyPrefixBE()
{
	return customCurrencyFormatBE.substring(0, customCurrencyFormatBE.indexOf(currencyAmountMergeField));
}

function currencySuffixBE()
{
	return customCurrencyFormatBE.substr(
		customCurrencyFormatBE.indexOf(currencyAmountMergeField) + currencyAmountMergeField.length);
}



function assignPredefinedOption(oTextBox, nEnumType, nWidth, nHeight)
{
	var result = window.showModalDialog('/include/pop_predefOptions.asp?type=' + nEnumType,
		null, 'help:no;status:no;resizable:yes;scroll:yes;' +
		'dialogWidth:' + (nWidth ? nWidth : 200) + 'px;' +
		'dialogHeight:' + (nHeight ? nHeight : 400) + 'px');

	if (result)
	{
		oTextBox.value = result;
		oTextBox.focus();
	}
}

// ***** BEO selection utils *****

// Dependency: sorting.js

function selectBEOs(nVID, nType, aBEOs)
{
	return window.showModalDialog('/include/pop_SelectBEOs.asp?VID=' + nVID + '&type=' + nType,
		aBEOs, 'help:no;status:no;resizable:yes;scroll:no;dialogHeight:600px;dialogWidth:800px');
}

function addBEOs(nVID, nType, nTableID, oTable, OnRenderBEOLine, OnGetBEOControl)
{
	var aBEOs = [];
	var i;

	if (!OnGetBEOControl)
		OnGetBEOControl = function(nRow)
		{
			var n = oTable.rows[nRow].cells.length;
			return oTable.rows[nRow].cells[n-1].children[1];
		};

	for (i = 0; i < oTable.rows.length; ++i)
		aBEOs.push(parseInt(OnGetBEOControl(i).value, 10));

	var oBEOs = selectBEOs(nVID , nType, aBEOs);

	if (!oBEOs) return false;

	clearSTable(nTableID);

	if (!OnRenderBEOLine)
		OnRenderBEOLine = function(oBEO)
		{
			addSTableRow(nTableID,
				oBEO.BEOID,
				formatTabDateTime(oBEO.Time),
				oBEO.Event,
				oBEO.Function,
				oBEO.Location,
				oBEO.Company,
				oBEO.Contact,
				oBEO.Amount,
				'<a href="#" onclick="return removeBEOLine(' + nTableID + ');">Remove</a>' +
					'<input type="hidden" name="BEOID" value="' + oBEO.BEOID + '">');	
		};

	for (i = 0; i < oBEOs.length; ++i)
		OnRenderBEOLine(oBEOs[i]);

	renderSTable(nTableID);

	return true;
}

function removeBEOLine(nTableID)
{
	var oRow = event.srcElement.parentElement.parentElement;
	deleteSTableRow(nTableID, oRow.sectionRowIndex);
	return false;
}

// ***** End of BEO selection utils *****



// ***** Invoice selection utils *****

// Dependency: sorting.js

function formatInvoiceID(id)
{
	var s = id.toString();
	return 'BI' + '0000000000000'.substring(0, 13 - s.length) + s;
}

function viewInvoice(nVID, nID)
{
	window.open('/VenueAdmin/Billing/ViewBilling.asp?VID=' + nVID + '&Doc=Invoice&DocID=' + nID,
		'Invoice' + nID, 'width=640,height=480,location=no,menubar=no,toolbar=no,scrollbars=yes,resizable=yes');
}

function selectInvoices(nVID, nType, aInvoices)
{
	return window.showModalDialog('/include/pop_SelectInvoices.asp?VID=' + nVID + '&type=' + nType,
		aInvoices, 'help:no;status:no;resizable:yes;scroll:no;dialogHeight:600px;dialogWidth:800px');
}

function addInvoices(nVID, nType, nTableID, oTable, OnRenderInvoiceLine, OnGetInvoiceControl)
{
	var aInvoices = [];
	var i;

	if (!OnGetInvoiceControl)
		OnGetInvoiceControl = function(nRow)
		{
			var n = oTable.rows[nRow].cells.length;
			return oTable.rows[nRow].cells[n-1].children[1];
		};

	for (i = 0; i < oTable.rows.length; ++i)
		aInvoices.push(parseInt(OnGetInvoiceControl(i).value, 10));

	var oInvoices = selectInvoices(nVID , nType, aInvoices);

	if (!oInvoices) return false;

	clearSTable(nTableID);

	if (!OnRenderInvoiceLine)
		OnRenderInvoiceLine = function(oInvoice)
		{
			addSTableRow(nTableID,
				formatInvoiceID(oInvoice.ID) + '|javascript:viewInvoice(' + nVID + ', ' + oInvoice.ID + ');',
				formatTabDate(oInvoice.DateGenerated),
				oInvoice.Customer + ', ' + oInvoice.Contact,
				oInvoice.Event,
				oInvoice.ServiceArea,
				oInvoice.Location,
				oInvoice.Amount,
				'<a href="#" onclick="return removeInvoiceLine(' + nTableID + ');">Remove</a>' +
					'<input type="hidden" name="ID" value="' + oInvoice.ID + '">');	
		};

	for (i = 0; i < oInvoices.length; ++i)
		OnRenderInvoiceLine(oInvoices[i]);

	renderSTable(nTableID);

	return true;
}

function removeInvoiceLine(nTableID)
{
	var oRow = event.srcElement.parentElement.parentElement;
	deleteSTableRow(nTableID, oRow.sectionRowIndex);
	return false;
}

// ***** End of invoice selection utils *****



function getEvent(nVID, nType, sParamIn, sParamOut)
{
	var sParams = '';

	if (nType) sParams += '&type=' + nType;
	if (sParamIn) sParams += '&in=' + sParamIn;
	if (sParamOut) sParams += '&out=' + sParamOut;

	return window.showModalDialog('/include/pop_ChooseEvent.asp?VID=' + nVID + sParams,
		'', 'help:no;status:no;resizable:yes;dialogWidth:800px;dialogHeight:600px');
}

function getVenueEvent(nVID, oParams)
{
	var aEvents = getEvent(nVID, oParams.type, oParams.paramIn, oParams.paramOut)

	if (aEvents)
	{
		if (oParams.id) oParams.id.value = '';
		if (oParams.no) oParams.no.value = '';

		if (aEvents.length == 0)
		{
			if (oParams.container) oParams.container.innerHTML = '[none]';
		}
		else
		{
			if (oParams.container)
			{
				if (!oParams.delimiter) oParams.delimiter = (aEvents.length == 1 ? '' : '<li>');
				var sNames = '';
			}

			for (var i = 0; i < aEvents.length; ++i)
			{
				if (oParams.id) oParams.id.value += (i == 0 ? '' : ', ') + aEvents[i].id;
				if (oParams.no) oParams.no.value += (i == 0 ? '' : ', ') + aEvents[i].no;

				if (oParams.container)
				{
					sNames += oParams.delimiter + aEvents[i].name +
						' <small>(' + aEvents[i].startDate + ')</small>';
				}
			}
			if (oParams.container) oParams.container.innerHTML = sNames;
		}
		return true;
	}
	else
		return false;
}



// ***** Menu item selection utils *****

function selectMenuItems(nVID, nType, sParams, aItems)
{
	return window.showModalDialog(
		'/include/pop_SelectMenuItems.asp?VID=' + nVID + '&type=' + nType + (sParams ? '&' : '') + sParams,
		aItems ? aItems : [],
		'help:no;status:no;resizable:yes;scroll:no;dialogHeight:480px;dialogWidth:640px');
}

function getMenuItems(nVID, nType, oTable, sHiddenControlName)
{
	var aItems = [];
	var i;

	for (i = 0; i < oTable.rows.length; ++i)
	{
		var oCells = oTable.rows[i].cells;
		aItems.push({
			ID: parseInt(oCells[0].children[0].value, 10),
			item: oCells[1].innerText
			});
	}

	var aSelection = selectMenuItems(nVID, nType, "multiple=on", aItems);

	if (!aSelection) return false;

	while (oTable.rows.length) oTable.deleteRow(0);

	if (!sHiddenControlName) sHiddenControlName = 'MIID';

	for (i = 0; i < aSelection.length; ++i)
	{
		var oRow = oTable.insertRow();
		var oCell;
		var oInput;

		oCell = oRow.insertCell();
		oInput = document.createElement('<input type="hidden" name="' + sHiddenControlName + '">');
		oInput.value = oInput.defaultValue = aSelection[i].ID;
		oCell.appendChild(oInput);

		oCell = oRow.insertCell();
		oCell.align = 'left';
		oCell.innerText = aSelection[i].item;
	}

	return true;
}

// ***** End of menu item selection utils *****



function popupHelp(sChapter)
{
	var url = '/include/pop_help.asp?page=' + window.location.pathname + '&chapter=' + sChapter;
	window.open(url, null, 'location=no,menubar=no,toolbar=no,resizable=yes,scrollbars=yes,status=no,width=500,height=550,left=20');
}


// --- HL functions ---
var aHLControls = [];

function highlightControl(oControl, sHLColor, sRestoreColor)
{
		oControl.style.color = (sHLColor ? sHLColor : 'red');
		aHLControls.push(oControl);
		window.setTimeout('restoreHLControl("' + (sRestoreColor ? sRestoreColor : 'blue') + '");', 2000);
}

function restoreHLControl(sRestoreColor)
{
	aHLControls[0].style.color = sRestoreColor;
	aHLControls.shift();
}
// --- END of HL functions ---





function moveTableRow(bDown, oTable, onMoveRowCheck, onNotMoveRowCheck)
{
	var bMoved = false;
	var iCurrent;
	var iNext;
	var nStep;
	var nEnd;

	if (!oTable) oTable = document.getElementById('objSortableTable');
	if (oTable.rows.length < 2) return false;

	if (bDown)
	{
		iCurrent = oTable.rows.length - 2;
		nStep = -1;
		nEnd = -1;
	}
	else
	{
		iCurrent = 1;
		nStep = 1;
		nEnd = oTable.rows.length;
	}

	if (!onMoveRowCheck)
		onMoveRowCheck = function(oRow)
		{
			return oRow.cells[0].children[0].checked;
		}

	if (!onNotMoveRowCheck)
		onNotMoveRowCheck = function(oRow)
		{
			return !onMoveRowCheck(oRow);
		}

	while (iCurrent != nEnd)
	{
		if (onMoveRowCheck(oTable.rows[iCurrent]))
		{
			iNext = iCurrent - nStep;
			if (onNotMoveRowCheck(oTable.rows[iNext]))
			{
				oTable.rows[iCurrent].swapNode(oTable.rows[iNext]);
				bMoved = true;
			}
		}
		iCurrent += nStep;
	}

	return bMoved;
}



//	-- Filter functions --
function renderFilterTrigger(sTriggerName, bChecked, sContainerID)
{
	var oContainer = document.getElementById(sContainerID);
	if (!oContainer) oContainer = document.forms[0];

	var oInput = document.createElement(
		'<input type=checkbox name="' + sTriggerName + '" id="' + sTriggerName + '">');

	oInput.checked = oInput.defaultChecked = bChecked;

	if (oContainer.childNodes.length)
		oContainer.insertBefore(oInput, oContainer.childNodes[0]);
	else
		oContainer.appendChild(oInput);
}

function synchFilterTrigger(sTriggerID)
{
	var oTrigger = document.getElementById(sTriggerID);
	if (oTrigger) oTrigger.checked = true;
}

function isFilterValueEmpty(sControlName, sControlLabel)
{
	if (!isValidText(document.getElementById(sControlName).value))
	{
		window.alert(sControlLabel + ' must be specified')
		return true;
	}
	return false;
}

function isFilterOptionSelected(sControlName, sControlLabel)
{
	var oControl = document.getElementsByName(sControlName);
	if (oControl.length && oControl[0].selectedIndex >= 0)
		return true;
	else
	{
		window.alert(sControlLabel + ' must be selected');
		return false;
	}
}
//	-- END of Filter functions --


function findParentNodeByTagName(o, sTagName)
{
	if (o.tagName == sTagName)
		return o;
	else if (o.parentNode)
		return findParentNodeByTagName(o.parentNode, sTagName);
	else
		return null;
}

function findParentNodeById(o, id)
{
	if (o.id == id)
		return o;
	else if (o.parentNode)
		return findParentNodeById(o.parentNode, id);
	else
		return null;
}

function setImageControlImage(oUploadImg, oExistImg, oImg, sFolder)
{
	var sImgsrc = '';
	if (oUploadImg.value!='')
		sImgsrc = oUploadImg.value;
	else if (oExistImg.value!='')
		sImgsrc = sFolder + oExistImg.value;
	
	oImg.src = sImgsrc;
	oImg.style.display=(sImgsrc!='' ? 'block' : 'none');
}
