/*----------------------------------------------------------------------------\
|                         Intekron JXP Forms Management                       |
|-----------------------------------------------------------------------------|
|                       (mailto:support@intekron.com)                         |
|                  For Intekron (http://www.intekron.com/)                    |
|-----------------------------------------------------------------------------|
|                   Copyright (c) 2003-2008 Intekron Ltd.                     |
|-----------------------------------------------------------------------------|
| This software is provided "as is", without warranty of any kind, express or |
| implied, including  but not limited  to the warranties of  merchantability, |
| fitness for a particular purpose and noninfringement. In no event shall the |
| authors or  copyright  holders be  liable for any claim,  damages or  other |
| liability, whether  in an  action of  contract, tort  or otherwise, arising |
| from,  out of  or in  connection with  the software or  the  use  or  other |
| dealings in the software.                                                   |
\----------------------------------------------------------------------------*/

// Check Browsers
var ua		= navigator.userAgent;
var opera	= /opera [56789]|opera\/[56789]/i.test(ua);
var ie		= !opera && /MSIE/.test(ua);
var ie50	= ie && /MSIE 5\.[01234]/.test(ua);
var ie6		= ie && /MSIE [6789]/.test(ua);
var ieBox	= ie && (document.compatMode == null || document.compatMode != "CSS1Compat");
var moz		= !opera && /gecko/i.test(ua);
var nn6		= !opera && /netscape.*6\./i.test(ua);
/*******************************************************************************
  Page-level routines...
*******************************************************************************/
function AppLogout() {
	ShowWorking();
	if (confirm(sConfirmLogout)) {
		window.location = 'logout.jsp;jsessionid=' + sSessionID + '';
	}
	HideWorking();
}
var elDivHeader		= null;
var elDivContent	= null;
var elFramePopup	= null;
var elDivErrorText	= null;
var elDivGridStatus	= null;
var zDivs			= null;
var iHeaderHeight	= 0;
var iContentTop		= 0;
var iContentHeight	= 0;
function AppPageLoad() {
	ShowWorking();
	elDivHeader		= document.getElementById('divHeader');
	elDivContent	= document.getElementById('divContent');
	elFramePopup	= document.getElementById('ifrmPOPUP');
	elDivErrorText	= document.getElementById('divErrorText');
	elDivGridStatus	= document.getElementById('divGridStatus');
	zDivs			= document.getElementsByTagName('DIV');
	OnInit();
	AppPageResize();
	HideWorking();
}
function AppPageUnLoad() {
//	PopHelpStack();
}
//********************************************************************************
// POP HELP STACK
//********************************************************************************
function PopHelpStack() {
	var reqPopHelpStack;
	var url = '../PopHelpStack;jsessionid=' + sSessionID;
	if (window.XMLHttpRequest) {
		reqPopHelpStack = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		reqPopHelpStack = new ActiveXObject("Microsoft.XMLHTTP");
	}
	reqPopHelpStack.open("GET", url, true);
	reqPopHelpStack.onreadystatechange = function() {};
	reqPopHelpStack.send(null);
}
function AppPageResize() {
	iContentHeight	= Math.max(document.body.clientHeight - Math.max(elDivHeader?elDivHeader.offsetHeight:0,0), 0);
	if (elDivHeader) {
		iHeaderHeight = Math.max(elDivHeader.offsetHeight,0);
		elDivHeader.style.width = Math.max(document.body.clientWidth-(ie?0:8), 0);
	}

	if (elDivContent) {
		iContentTop = Math.max(iHeaderHeight, 0);
		elDivContent.style.top = iContentTop;
		elDivContent.style.height = Math.max(iContentHeight-(ie?1:0), 0);
		elDivContent.style.width = Math.max(document.body.clientWidth-(ie?0:10), 0);
	}

	if (elFramePopup) {
		elFramePopup.style.top  = Math.max((document.body.offsetHeight - (elFramePopup.offsetHeight+(ie?2:-2))) / 2, 0);
		elFramePopup.style.left = Math.max((document.body.offsetWidth  - (elFramePopup.offsetWidth+2))  / 2, 0);
	}

	if (elDivErrorText) {
		elDivErrorText.style.top  = Math.max((document.body.offsetHeight - (elDivErrorText.offsetHeight+2)) / 2, 0);
		elDivErrorText.style.left = Math.max((document.body.offsetWidth  - (elDivErrorText.offsetWidth+2))  / 2, 0);
	}

	if (zDivs) {
		for (x = 0; x < zDivs.length; x++) {
			var elDiv = zDivs[x];
			if (elDiv.id == 'divGridScroll') {
				elDiv.style.height = Math.max(iContentHeight - elDiv.offsetTop - 2, 0);
			}
			else if (elDiv.id == 'divGridContainer') {
				var elDivGridHead	= document.getElementById('head');
				elDiv.style.height = Math.max(document.body.offsetHeight - iContentTop - elDiv.offsetTop + elDivGridHead.offsetHeight, 0);
				elDiv.style.width = Math.max((document.body.offsetWidth),0);
			}
		}
	}
	
	OnResize();
}
function AppPageKeyDown() {
	var e = (ie ? event : Event);
	if (e) {
		if (e.keyCode==27) {
			OnCancel();
		}
		else if (e.keyCode==13) {
			OnEnter();
		}
	}
	return false;
}

/*******************************************************************************
  NITOBI Global Helpers...
*******************************************************************************/
var bNITOBIDirtyGrid = false;
function NITOBISave(theGrid) {
	theGrid.save();
	theGrid.clearSurfaces();
	theGrid.dataBind();
	bNITOBIDirtyGrid = false;
}
function NITOBIRefresh(theGrid) {
	theGrid.clearSurfaces();
	theGrid.dataBind();
	bNITOBIDirtyGrid = false;
}
function NITOBIInsertRow(theGrid) {
	theGrid.insertAfterCurrentRow();
	bNITOBIDirtyGrid = true;
}
function NITOBIDeleteRow(theGrid,bConfirm) {
	if (theGrid.getSelectedRows().length > 0) { 
		if (!bConfirm || confirm(sConfirmDelete)) {
			theGrid.deleteCurrentRow();
			bNITOBIDirtyGrid = true;
		}
	} else { 
		alert(sDeleteRowWarning);
	}
}
function NITOBIBeforeTabChange(eventArgs) {
	var bReturn = !isDirtyPage();
	return bReturn;
}
function NITOBIGenerateRecordKey(sClassID, sParentOID, sTypeID) {
	if (sClassID) {
		// Use the native cross-browser nitobi Ajax object 
		var myAjaxRequest = new nitobi.ajax.HttpRequest(); 
		// Define the url for your generatekey script 
		myAjaxRequest.handler = '../AddDBObject;jsessionid=' + sSessionID + '?CLASSID=' + sClassID + (sParentOID ? '&PARENTOID=' + sParentOID : '') + (sTypeID ? '&TYPEID=' + sTypeID : ''); 
		myAjaxRequest.async = false; 
		myAjaxRequest.get(); 
		// return the result to the grid
		sReturn = myAjaxRequest.httpObj.responseText;
		if (sReturn.length >= 7 && sReturn.substr(0,7) == 'invalid') {
			var zReturn = sReturn.split(sDelimiter);
			alert(zReturn[1]);
			return 0;
		}
		else {
			return sReturn;
		}
	}
	else {
		return 'a' + new Date().getTime();
	}
}
function NITOBIShowHandlerError() {
	var dataSource = myGrid.getDataSource();
	var errorMessage = dataSource.getHandlerError();
	if (errorMessage && errorMessage != 'null') {
		NITOBISetGridStatus('Error: ' + errorMessage);
		alert(errorMessage);
		NITOBIRefresh(myGrid);
	}
}
function NITOBIErrorHandler(evt) {
	NITOBISetGridStatus('Error: ' + evt.description);
	alert('Error: ' + evt.description);
}
function NITOBIOnAfterSave() {
	NITOBIRefresh(myGrid);
	myGrid.focus();
	NITOBISetGridStatus('Save Complete!');
	bNITOBIDirtyGrid = false;
}
function NITOBIOnAfterSaveNoRefresh() {
	myGrid.focus();
	NITOBISetGridStatus('Save Complete!');
	bNITOBIDirtyGrid = false;
}
function NITOBIOnAfterRefresh() {
	myGrid.focus();
	NITOBISetGridStatus('');
	bNITOBIDirtyGrid = false;
}
function NITOBISetGridStatus(sStatus) {
	if (elDivGridStatus) {
		elDivGridStatus.innerText = sStatus;
	}
}
function NITOBIOnModifed() {
	NITOBISetGridStatus('Grid Modified');
	bNITOBIDirtyGrid = true;
}
function NITOBIOnAfterPaging() {
	NITOBISetGridStatus('');
	bNITOBIDirtyGrid = false;
}
function GridColResize(eventargs,sKey) {
	var sColumnName = eventargs.column.getColumnName();
	var sWidth = eventargs.column.getWidth();
	setSessionVariable(sKey + 'COL' + sColumnName + 'SIZE', sWidth, svTypeString);
}
function GridColAfterSort(eventargs,sKey) {
	var sColumnName = eventargs.column.getColumnName();
	var sDirection = eventargs.column.getSortDirection();
	setSessionVariable(sKey + 'SORTCOL', sColumnName, svTypeString);
	setSessionVariable(sKey + 'SORTDIR', sDirection, svTypeString);
}

/*******************************************************************************
  Input validation routines...
*******************************************************************************/
var sDay;		// Value for Day after a successful isValidDate
var sMonth;		// Value for Month after a successful isValidDate
var sYear;		// Value for Year after a successful isValidDate
var iMonth;		// Index of Month after a successful isValidDate (Jan = 1)
// Test if a Date string is valid.  Returns True if it is.
function isValidDate(sDate) {
	var zMonths;
	var sTempDate	= sDate.toUpperCase();
	var sRE			= DatePattern.replace(/d/, '([0-3]?[0-9])').replace(/yyyy/, '([0-9][0-9][0-9][0-9])').replace(/yy/, '([0-9][0-9])');
	if (sRE.search(/MMMM/) >= 0) {
		sRE = sRE.replace(/MMMM/, '(' + MonthNames.toUpperCase() + ')');
		zMonths = MonthNames.split(sDelimiter);
	}
	else if (sRE.search(/MMM/) >= 0) {
		sRE = sRE.replace(/MMM/, '(' + MonthAbbreviations.toUpperCase() + ')');
		zMonths = MonthAbbreviations.split(sDelimiter);
	}
	else {
		sRE = sRE.replace(/M/, '([0-1]?[0-9])');
	}
	var re	= new RegExp(sRE);
	
	if (sTempDate.match(re)) {
		var sMatch1 = new String(RegExp.$1);
		var sMatch2 = new String(RegExp.$2);
		var sMatch3 = new String(RegExp.$3);
		// Where is the day?
		var iDayIndex = DatePattern.search(/d/);
		if (iDayIndex == 0) {
			sDay = sMatch1;sMatch1 = '';
		}
		else if (iDayIndex == DatePattern.length - 1) {
			sDay = sMatch3;sMatch3 = '';
		}
		else {
			sDay = sMatch2;sMatch2 = '';
		}
		// Where is the year?
		var iYearIndex = DatePattern.search(/yy/);
		if (iDayIndex == -1) {
			iYearIndex = DatePattern.search(/yyyy/);
		}
		if (iYearIndex == 0) {
			sYear = sMatch1;sMatch1 = '';
		}
		else if (iYearIndex == DatePattern.length - 2 || iYearIndex == DatePattern.length - 4) {
			sYear = sMatch3;sMatch3 = '';
		}
		else {
			sYear = sMatch2;sMatch2 = '';
		}
		sMonth = sMatch1.length > 0 ? sMatch1 : sMatch2.length > 0 ? sMatch2 : sMatch3;
		if (isNaN(sMonth)) {
			for (x = 0; x < zMonths.length; x++) {
				if (zMonths[x].toUpperCase() == sMonth) {
					sMonth = zMonths[x];
					iMonth = x + 1;
					break;
				}
			}
		}
		else {
			iMonth = Number(sMonth);
		}
		
		switch (iMonth) {
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:	// 31 days max...
				if (sDay > 31) return false;
				break;
			case 2:
				if (sYear % 4 != 0) {
					if (sDay > 28) return false;
				}
				else {
					if (sDay > 29) return false;
				}
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				if (sDay > 30) return false;
				break;
			default:
				return false;
				break;
		}
	} 
	else {
		return false;
	}
	return true;
}
//------------------------------------------------------------------------------
var sHours;
var sMinutes;
var sAMPM;
function isValidTime(sTime,bPartial) {
	sTime = new String(sTime);
	var sTempTime	= sTime.toUpperCase();
	var sRE1		= TimePattern.replace(/HH/g, '^([0-1][0-9])');
	var sRE2		= sRE1.replace(/h/g, '^([0-1]?[0-9])');
	var sRE3		= sRE2.replace(/mm/g, '([0-5][0-9])');
	var sRE4		= sRE3.replace(/ap/g, '(' + AmPmMarkers + ')');
	var re			= new RegExp(sRE4);
	
	if (sTempTime.match(re)) {
		sHours = new String(RegExp.$1);
		sMinutes = new String(RegExp.$2);
		sAMPM = new String(RegExp.$3);
		if (sMinutes > 59) return false;
		
		if (TimePattern.match(/HH/g)) {
			if (sHours > 23)  return false; 
		}
		else {
			if (sHours > 12) return false;
		}
	} 
	else {
		if (bPartial) {
			// Invalid Hours Match...
			var zNewSplit = sTempTime.split(TimeSeparator);
			for (x = 0; x < zNewSplit.length; x++) {
				alert(zNewSplit[x]);
			}
			return false;
		} 
		else {
			return false;
		}
	}
	return true;
}
//------------------------------------------------------------------------------
function isValidInteger(sInteger) {
	var reMinusSign = new RegExp(MinusSign);
	var sTempInteger = sInteger.replace(reMinusSign, '');
	var re = new RegExp('^([0-9]+|[0-9]{1,3}(' + GroupSeparator + '[0-9]{3})*)$');
	if (sTempInteger.match(re)) {
		return true;
	}
	else {
		return false;
	}
}
//------------------------------------------------------------------------------
function isValidCurrency(sCurrency) {
	var reMinusSign = new RegExp(MinusSign);
	var reCurrencySymbol = new RegExp('\\' + CurrencySymbol);
	var reGroupSeparator = new RegExp('\\' + GroupSeparator, 'ig');
	var reDecimalSeparator = new RegExp('\\' + DecimalSeparator);
	var sTempCurrency = sCurrency.replace(reMinusSign, '').replace(reCurrencySymbol, '').replace(reGroupSeparator, '').replace(reDecimalSeparator, '.').replace(/ /g, '');
	if (isNaN(sTempCurrency)) {
		return false;
	}
	else {
		return true;
	}
}
//------------------------------------------------------------------------------
function isValidFloat(sFloat) {
	var reMinusSign = new RegExp(MinusSign);
	var reGroupSeparator = new RegExp('\\' + GroupSeparator, 'ig');
	var reDecimalSeparator = new RegExp('\\' + DecimalSeparator);
	var sTempFloat = sFloat.replace(reMinusSign, '').replace(reGroupSeparator, '').replace(reDecimalSeparator, '.').replace(/ /g, '');
	if (isNaN(sTempFloat)) {
		return false;
	}
	else {
		return true;
	}
}
//------------------------------------------------------------------------------
function isValidDuration(sDuration) {
	if (DurationMode == 1) {
		var sNewDuration	= sDuration;
		var sRESeparator	= new RegExp('\\' + TimeSeparator, 'ig');
		var zArray			= sNewDuration.match(sRESeparator);
		var lIndexSeparator	= 0;
		var sDurationDays	= '';
		if (zArray != null) {
			if (zArray.length > 1) {		// We have a Days paramter
				lIndexSeparator	= sNewDuration.search(sRESeparator);
				sDurationDays	= sNewDuration.substr(0,lIndexSeparator);
				sNewDuration	= sNewDuration.substr(lIndexSeparator + 1,sNewDuration.length - lIndexSeparator + 1);
			}
		}
		lIndexSeparator = sNewDuration.search(sRESeparator);
		var sDurationHours = sNewDuration.substr(0,lIndexSeparator);
		var sDurationMinutes = sNewDuration.substr(lIndexSeparator + 1,sNewDuration.length - lIndexSeparator + 1);
		if (isValidInteger(sDurationHours) && isValidInteger(sDurationMinutes)) {
			return (parseInt(sDurationMinutes) < 60 && parseInt(sDurationMinutes) >= 0);
		}
		else {
			return false;
		}
	}
	else {
		return isValidFloat(sDuration);
	}
}
//******************************************************************************
// Output formatting routines...
//******************************************************************************
function formatDate(sDate) {
	if (isValidDate(sDate)) {
		var sReturn = '';
		sReturn = DatePattern.replace(/d/, sDay);
		sReturn = sReturn.replace(/yyyy/, sYear);
		sReturn = sReturn.replace(/yy/, sYear);

		if (sReturn.match(/MMMM/)) {
			sReturn = sReturn.replace(/MMMM/, sMonth);
		}
		else if (sReturn.match(/MMM/)) {
			sReturn = sReturn.replace(/MMM/g, sMonth);
		}
		else {
			sReturn = sReturn.replace(/M/g, sMonth);
		}
		return sReturn;
	}
	else {
		return sDate;
	}
}
//------------------------------------------------------------------------------
function formatTime(sTime) {
	if (isValidTime(sTime)) {
		var sReturn = '';
		sHours = sHours == '00' || sHours == '0' ? '12' : sHours;
		sHours = (sHours.length < 2 ? '0' + sHours : sHours);
		if (TimePattern.match(/HH/g)) {
			sReturn = TimePattern.replace(/HH/g, sHours);
		}
		else {
			sReturn = TimePattern.replace(/h/g, sHours);
		}
		sReturn = sReturn.replace(/mm/g, (sMinutes.length < 2 ? '0' + sMinutes : sMinutes));
		if (TimePattern.match(/ap/g)) {
			sReturn = sReturn.replace(/ap/g, sAMPM);
		}
		return sReturn;
	}
	else {
		return sTime;
	}
}
//------------------------------------------------------------------------------
function formatInteger(sInteger) {
	var bNegative = (sInteger.match(/\-/)) != null;
	var s = '';
	var ts = sInteger;
	for (var x = 0; x < ts.length; x++) {
		var lCode = ts.charCodeAt(x);
		if (lCode >= 48 && lCode <= 57) s += ts.substr(x,1);
		if (ts.substr(x,MinusSign.length) == MinusSign) s += '';
	}
	var num = Number(s);
	num = num.toString().replace(/\$|\,/g,'');
	if (isNaN(num)) num = '0';
	for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
		num = num.substring(0, num.length - (4 * i + 3)) + GroupSeparator + num.substring(num.length - (4 * i + 3));
	}
	return ((bNegative?MinusSign:'') + num);
}
//------------------------------------------------------------------------------
function formatCurrency(sCurrency) {
	sCurrency = new String(sCurrency);
	var bNegative = (sCurrency.match(/\-/)) != null;
	var reCurrencySymbol = new RegExp('\\' + CurrencySymbol);
	var reGroupSeparator = new RegExp('\\' + GroupSeparator, 'ig');
	var reDecimalSeparator = new RegExp('\\' + DecimalSeparator);
	var sTempCurrency = String(sCurrency).replace(/\-/, '').replace(reCurrencySymbol, '').replace(reGroupSeparator, '').replace(reDecimalSeparator, '.').replace(/ /g, '');
	if (isNaN(sTempCurrency)) sTempCurrency = '0';

	sTempCurrency = new String(Math.round(Number(sTempCurrency) * Math.pow(10,MaxCurrencyDecimal)) / Math.pow(10,MaxCurrencyDecimal));

	var lDecIndex = sTempCurrency.indexOf('.');
	var decimal = 0;
	var num = Number(sTempCurrency);
	if (lDecIndex >= 0) {
		decimal = sTempCurrency.substr(lDecIndex + 1);
		num = Number(sTempCurrency.substr(0, lDecIndex));
	}
	var sNum		= String(num);
	var sDecimal	= String(decimal);

	for (x = sDecimal.length; x < MinCurrencyDecimal; x++) {
		sDecimal += '0';
	}
	if (sDecimal.length > MaxCurrencyDecimal) sDecimal = sDecimal.substr(0, MaxCurrencyDecimal);
	
	sNum = Math.floor((num * (10 * MaxCurrencyDecimal) + 0.5) / (10 * MaxCurrencyDecimal)).toString();

	for (var i = 0; i < Math.floor((sNum.length - (1 + i)) / 3); i++) {
		sNum = sNum.substring(0, sNum.length - (4 * i + 3)) + GroupSeparator + sNum.substring(sNum.length - (4 * i + 3));
	}
	return (bNegative ? MinusSign : '') + CurrencySymbol + sNum + DecimalSeparator + sDecimal;
}
//------------------------------------------------------------------------------
function formatFloat(sFloat) {
	var sFloat = new String(sFloat);
	var bNegative = (sFloat.match(/\-/)) != null;
	var reGroupSeparator = new RegExp('\\' + GroupSeparator, 'ig');
	var reDecimalSeparator = new RegExp('\\' + DecimalSeparator);
	var sTempFloat = sFloat.replace(/\-/, '').replace(reGroupSeparator, '').replace(reDecimalSeparator, '.').replace(/ /g, '');
	if (isNaN(sTempFloat)) sTempFloat = '0';

	sTempFloat = new String(Math.round(Number(sTempFloat) * Math.pow(10,MaxFloatDecimal)) / Math.pow(10,MaxFloatDecimal));

	var lDecIndex = sTempFloat.indexOf('.');
	var decimal = 0;
	var num = Number(sTempFloat);
	if (lDecIndex >= 0) {
		decimal = sTempFloat.substr(lDecIndex + 1);
		num = Number(sTempFloat.substr(0, lDecIndex));
	}
	var sNum		= String(num);
	var sDecimal	= String(decimal);

	for (x = sDecimal.length; x < MinFloatDecimal; x++) {
		sDecimal += '0';
	}
	if (sDecimal.length > MaxFloatDecimal) sDecimal = sDecimal.substr(0, MaxFloatDecimal);
	
	sNum = Math.floor((num * (10 * MaxFloatDecimal) + 0.5) / (10 * MaxFloatDecimal)).toString();

	for (var i = 0; i < Math.floor((sNum.length - (1 + i)) / 3); i++) {
		sNum = sNum.substring(0, sNum.length - (4 * i + 3)) + GroupSeparator + sNum.substring(sNum.length - (4 * i + 3));
	}
	return (bNegative ? MinusSign : '') + sNum + DecimalSeparator + sDecimal;
}
//------------------------------------------------------------------------------
function formatDuration(sDuration) {
	if (DurationMode == 1) {
		var fNewDuration	= Math.abs(parseFloat(sDuration));
		var iDurHours		= parseInt(fNewDuration);
		var iDurMinutes		= Math.round((fNewDuration - iDurHours) * 60);
		var sDurHours		= String(iDurHours);
		var sDurMinutes		= String(iDurMinutes);
		return (
			(sDuration < 0 ? MinusSign : "") +					// Minus Sign
			(iDurHours < 10 ? "0" : "") +						// Hours
			sDurHours +
			TimeSeparator +
			(iDurMinutes < 10 ? "0" : "") +						// Minutes
			sDurMinutes
			);
	}
	else {
		return formatFloat(sDuration);
	}
}

//********************************************************************************
// Conversion Routines...
//********************************************************************************
function DateToYYYYMMDD(sDate) {
	if (isValidDate(sDate)) {
		return sYear + '-' + (iMonth < 10 ? '0' : '') + String(iMonth) + '-' + (sDay.length < 2 ? '0' : '') + sDay;
	}
	else {
		return sDate;
	}
}
//------------------------------------------------------------------------------
function DateToJSDate(sDate) {
	if (isValidDate(sDate)) {
		return new Date(Number(sYear), iMonth - 1, Number(sDay));
	}
	else {
		return sDate;
	}
}
//------------------------------------------------------------------------------
function TimeToHHMMSS(sTime) {
	if (isValidTime(sTime)) {
		if (TimePattern.match(/HH/g)) {
			if (sHours.length < 2) sHours = '0' + sHours;
		}
		else {
			var zAmPm = AmPmMarkers.split(sDelimiter);
			var iAmPm = 0;
			for (var x = 0; x < zAmPm.length; x++) {
				if (zAmPm[x].toUpperCase() == sAMPM.toUpperCase()) {
					iAmPm = x;
					break;
				}
			}
			if (iAmPm > 0 && Number(sHours) >= 1 && Number(sHours) <= 11) {
				sHours = Number(sHours) + 12;
			}
			else if (iAmPm == 0 && Number(sHours) == 12) {
				sHours = '00';
			}
			if (sHours.length < 2) sHours = '0' + sHours;
		}
		if (sMinutes.length < 2) sMinutes = '0' + sMinutes;
		
		return sHours + TimeSeparator + sMinutes + ':00';
	}
	else {
		return sTime;
	}
}
//------------------------------------------------------------------------------
function TimeToJSTime(sTime) {
	var sHHMMSS = TimeToHHMMSS(sTime);
	return new Date(2000,0,1,Number(sHHMMSS.substr(0,2)), Number(sHHMMSS.substr(3,2)));
}
//------------------------------------------------------------------------------
function TimeToMillis(sTime) {
	var sHHMMSS = TimeToHHMMSS(sTime);
	return (Number(sHHMMSS.substr(0,2)) + (Number(sHHMMSS.substr(3,2))/60)) * 60 * 60 * 1000;
}
//------------------------------------------------------------------------------
function StringToJSFloat(sFloat) {
	var reMinus = new RegExp('\\' + MinusSign);
	var bNegative = (sFloat.match(reMinus));
	var s = '';
	var ts = sFloat;
	for (var x = 0; x < ts.length; x++) {
		var lCode = ts.charCodeAt(x);
		if (lCode >= 48 && lCode <= 57) s += ts.substr(x,1);
		if (ts.substr(x,DecimalSeparator.length) == DecimalSeparator) s += '.';
		if (ts.substr(x,MinusSign.length) == MinusSign) s += '';
		if (ts.substr(x,CurrencySymbol.length) == CurrencySymbol) s += '';
	}
	var num = Number(s);
	if (isNaN(num)) num = 0;
	return bNegative ? num * -1 : num;
}
//------------------------------------------------------------------------------
function StringToJSInteger(sInteger) {
	var reMinus = new RegExp('\\' + MinusSign);
	var bNegative = (sInteger.match(reMinus));
	var s = '';
	var ts = sInteger;
	for (var x = 0; x < ts.length; x++) {
		var lCode = ts.charCodeAt(x);
		if (lCode >= 48 && lCode <= 57) s += ts.substr(x,1);
		if (ts.substr(x,DecimalSeparator.length) == DecimalSeparator) s += '.';
		if (ts.substr(x,MinusSign.length) == MinusSign) s += '';
		if (ts.substr(x,CurrencySymbol.length) == CurrencySymbol) s += '';
	}
	var num = Number(s);
	if (isNaN(num)) num = 0;
	return bNegative ? num * -1 : num;
}
//------------------------------------------------------------------------------
function YYYYMMDDToDate(sYYYYMMDD) {
	var sYear	= sYYYYMMDD.substr(0,4);
	var sMonth	= sYYYYMMDD.substr(sYYYYMMDD.length > 8 ? 5 : 4,2);
	var sDay	= sYYYYMMDD.substr(sYYYYMMDD.length > 8 ? 8 : 6,2);

	var sReturn = '';
	sReturn = DatePattern.replace(/d/, sDay);
	sReturn = sReturn.replace(/yyyy/, sYear);
	sReturn = sReturn.replace(/yy/, sYear.substr(2,2));

	var zMonths;
	if (sReturn.match(/MMMM/)) {
		zMonths = MonthNames.split(sDelimiter);
		sReturn = sReturn.replace(/MMMM/, zMonths[Number(sMonth)-1]);
	}
	else if (sReturn.match(/MMM/)) {
		zMonths = MonthAbbreviations.split(sDelimiter);
		sReturn = sReturn.replace(/MMM/g, zMonths[Number(sMonth)-1]);
	}
	else {
		sReturn = sReturn.replace(/M/g, sMonth);
	}
	return sReturn;
}
//------------------------------------------------------------------------------
function JSDateToDate(dtDate) {
	var sYYYY = String(dtDate.getFullYear());
	var sMM = String(dtDate.getMonth() + 1); sMM = (sMM.length < 2 ? '0' : '') + sMM;
	var sDD = String(dtDate.getDate()); sDD = (sDD.length < 2 ? '0' : '') + sDD;
	return YYYYMMDDToDate(sYYYY + '-' + sMM + '-' + sDD);
}
//------------------------------------------------------------------------------
function HHMMSSToTime(sHHMMSS) {
	var sHours		= sHHMMSS.substr(0,2);
	var sMinutes	= sHHMMSS.substr(3,2);
	var iAmPm		= Number(sHours) >= 12 ? 1 : 0;
	sHours = iAmPm == 0 && Number(sHours) == 0 ? '12' : sHours;
	sHours = (sHours.length < 2 ? '0' + sHours : sHours);
	var sReturn = '';
	if (TimePattern.match(/HH/g)) {
		sReturn = TimePattern.replace(/HH/g, sHours);
	}
	else {
		sHours = new String((iAmPm == 1 ? Number(sHours) != 12 ? Number(sHours) - 12 : sHours : sHours ));
		sHours = (sHours.length < 2 ? '0' + sHours : sHours);
		sReturn		= TimePattern.replace(/h/g, sHours);
	}
	sReturn = sReturn.replace(/mm/g, (sMinutes.length < 2 ? '0' + sMinutes : sMinutes));
	if (TimePattern.match(/ap/g)) {
		var zAmPm = AmPmMarkers.split(sDelimiter);
		sReturn = sReturn.replace(/ap/g, zAmPm[iAmPm]);
	}
	return sReturn;
}
//------------------------------------------------------------------------------
function JSTimeToTime(tmTime) {
	var sHH = String(tmTime.getHours()); sHH = (sHH.length < 2 ? '0' : '') + sHH;
	var sMM = String(tmTime.getMinutes()); sMM = (sMM.length < 2 ? '0' : '') + sMM;
	return HHMMSSToTime(sHH + TimeSeparator + sMM + ':00');
}
//------------------------------------------------------------------------------
function JSFloatToString(fFloat) {
	var sFloat = String(fFloat);
	if (fFloat < 0) {
		sFloat = sFloat.replace(/\-/, MinusSign);
	}
	sFloat = sFloat.replace(/\./, DecimalSeparator);
	return formatFloat(sFloat);
}
//------------------------------------------------------------------------------
function JSIntegerToString(iInteger) {
	var sInteger = String(iInteger);
	if (iInteger < 0) {
		sInteger = sInteger.replace(/\-/, MinusSign);
	}
	return formatInteger(sInteger);
}
//------------------------------------------------------------------------------
function DurationToJSFloat(sDuration) {
	if (DurationMode == 1) {
		var sNewDuration		= new String(sDuration);
		var sRESeparator		= new RegExp('\\' + TimeSeparator, 'ig');
		var zArray				= sNewDuration.match(sRESeparator);
		var lIndexSeparator		= 0;
		var fDurationDays		= 0;
		if (zArray != null) {
			if (zArray.length > 1) {		// We have a Days paramter
				lIndexSeparator	= sNewDuration.search(sRESeparator);
				fDurationDays	= parseFloat(sNewDuration.substr(0,lIndexSeparator));
				sNewDuration	= sNewDuration.substr(lIndexSeparator + 1,sNewDuration.length - lIndexSeparator + 1);
			}
		}

		lIndexSeparator		= sNewDuration.search(sRESeparator);
		var fDurationHours		= parseFloat(sNewDuration.substr(0,lIndexSeparator));
		var fDurationMinutes	= parseFloat(sNewDuration.substr(lIndexSeparator + 1,sNewDuration.length - lIndexSeparator + 1));
		return (fDurationDays * 24) + fDurationHours + (fDurationMinutes / 60);
	}
	else {
		return StringToJSFloat(sDuration);
	}
}
//------------------------------------------------------------------------------
function getDuration(dtStart, dtStop) {
	var lDiff = dtStop.getTime() - dtStart.getTime();
	lDiff = lDiff / 1000 / 60 / 60;
	lDiff = lDiff < 0 ? lDiff + 24 : lDiff;
	return lDiff;
}
//------------------------------------------------------------------------------
function Trim(TRIM_VALUE) {
	if(TRIM_VALUE.length < 1) {
		return"";
	}
	TRIM_VALUE = RTrim(TRIM_VALUE);
	TRIM_VALUE = LTrim(TRIM_VALUE);
	if(TRIM_VALUE=="") {
		return "";
	}
	else{
		return TRIM_VALUE;
	}
}
//------------------------------------------------------------------------------
function RTrim(VALUE) {
	var w_space = String.fromCharCode(32);
	var v_length = VALUE.length;
	var strTemp = "";
	if(v_length < 0) {
		return"";
	}
	var iTemp = v_length -1;
	while(iTemp > -1) {
		if(VALUE.charAt(iTemp) == w_space) {}
		else {
			strTemp = VALUE.substring(0,iTemp +1);
			break;
		}
		iTemp = iTemp-1;
	}
	return strTemp;
}
//------------------------------------------------------------------------------
function LTrim(VALUE) {
	var w_space = String.fromCharCode(32);
	if (v_length < 1) {
		return"";
	}
	var v_length = VALUE.length;
	var strTemp = "";
	var iTemp = 0;
	while (iTemp < v_length) {
		if (VALUE.charAt(iTemp) == w_space) {}
		else {
			strTemp = VALUE.substring(iTemp,v_length);
			break;
		}
		iTemp = iTemp + 1;
	}
	return strTemp;
}

//********************************************************************************
// System data...
//********************************************************************************
function getTimeNow() {
	var dtNow		= new Date();
	var sHours		= String(dtNow.getHours());
	var sMinutes	= String(dtNow.getMinutes());
	return HHMMSSToTime((sHours.length < 2 ? '0' : '') + sHours + TimeSeparator + (sMinutes.length < 2 ? '0' : '') + sMinutes + ':00');
}
//--------------------------------------------------------------------------
// Returns the Day Of the Week for specified date as follows:
//   0 - First day of Week
//   1 - Second day of Week, etc.
// This function is driven by the Locale.
//--------------------------------------------------------------------------
function dayOfWeek(intYear, intMonth, intDay) {
	var dtDate = new Date(intYear, intMonth, intDay);
	var intDOW = dtDate.getDay();
	intDOW = intDOW - Number(FirstDayOfWeek - 1);
	return (intDOW < 0 ? 6 - intDOW : intDOW);
}
//********************************************************************************
// Determine if all controls on the page are in a valid state...
//********************************************************************************
function isValidPage() {
	for (var x = 0; x < zControls.length; x++) {
		if (!zControls[x].isValid()) {
			if (zControls[x].isVisible()) {
				alert(sFormError);
				zControls[x].focus();
			}
			else {
				alert(sFormHiddenError + '::' + zControls[x].getID());		// DEBUG
			}
			return false;
		}
	}
	return true;
}
function isDirtyPage() {
	if (testDirtyPage()) {
		return !(confirm(sFormUnsavedChanges) == 1);
	}
	return false;
}
function testDirtyPage() {
	if (bNITOBIDirtyGrid) {
		return true;
	}
	else {
		for (var x = 0; x < zControls.length; x++) {
			if (zControls[x].isDirty()) {
				return true;
			}
		}
	}
	return false;
}
function max(v1, v2) {
	return (v1>v2?v1:v1==v2?v1:v2);
}
function min(v1, v2) {
	return (v1<v2?v1:v1==v2?v1:v2);
}
var zControls = new Array();

//********************************************************************************
// Menu Actions
//********************************************************************************
function JXPConfirm(sMsg, sArgs) {
	if (sArgs != null) {
		for (var x = 0; x < sArgs.length; x++) {
			var reArg = new RegExp('\\%' + (x+1), 'ig');
			sMsg = sMsg.replace(reArg, sArgs[x]);
		}
	}
	return confirm(sMsg);
}
function JXPConfirmDelete() {
	return confirm(sConfirmDelete);
}
//********************************************************************************
// Help System Support
//********************************************************************************
function ShowHelp() {
	var oWin = window.open('../help/frames.jsp;jsessionid=' + sSessionID + '','JXPHelp','resizable=yes,scrollbars=yes');
	oWin.focus();
	return true;
}
function ShowWorking() {
	var divWorking = document.getElementById('divWorking');
	if (divWorking) divWorking.style.display='block';
}
function HideWorking() {
	var divWorking = document.getElementById('divWorking');
	if (divWorking) divWorking.style.display='none';
}
//********************************************************************************
// Pop-up Window Support
//********************************************************************************
var popupReturnFunction	= null;
var popupReturnValue	= null;
function ShowPopUp(SRC, Width, Height, ReturnFunc) {
	if (!bInDesktop) {
		AppPageResize();
		ShowWorking();
		if (ReturnFunc) {
			popupReturnFunction = ReturnFunc;
		}
		else {
			popupReturnFunction = null;
			popupReturnValue = null;
		}
		elFramePopup.src = "about:blank";
		// BEGIN Animate...
			elFramePopup.style.width = Width;
			elFramePopup.style.height = Height;
			var newTop  = Math.max((document.body.offsetHeight - (elFramePopup.offsetHeight+2)) / 2, 0);
			var newLeft = Math.max((document.body.offsetWidth  - (elFramePopup.offsetWidth+2))  / 2, 0);
			elFramePopup.style.display = 'block';
			var finalWidth = elFramePopup.offsetWidth;
			var finalHeight = elFramePopup.offsetHeight;
			elFramePopup.style.width = 10;
			elFramePopup.style.height = 10;
			elFramePopup.style.top  = Math.max((document.body.offsetHeight - (elFramePopup.offsetHeight+2)) / 2, 0);
			elFramePopup.style.left = Math.max((document.body.offsetWidth  - (elFramePopup.offsetWidth+2))  / 2, 0);
			var lIncrement = Math.max(finalWidth, finalHeight) / 10;
			setTimeout('MovePopup("' + SRC + '","' + Width + '", "' + Height + '", ' + finalWidth + ', ' + finalHeight + ', ' + lIncrement + ', ' + lIncrement + ')',1);
		// END Animate...
	} else {
		parent.homeWindow.text = 'JXP';
		parent.homeWindow.sHref = SRC;
		parent.homeWindow.width = Width;
		parent.homeWindow.height = Height;
		parent.MyDesktop.createJXPWindow(parent.homeWindow);
	}
}
function MovePopup(SRC, Width, Height, ToWidth, ToHeight, Increment, Current) {
	if (Current < ToWidth || Current < ToHeight) {
		if (Current < ToWidth) {
			elFramePopup.style.width = Current;
		}
		if (Current < ToHeight) {
			elFramePopup.style.height = Current;
		}
		elFramePopup.style.top  = Math.max((document.body.offsetHeight - (elFramePopup.offsetHeight+2)) / 2, 0);
		elFramePopup.style.left = Math.max((document.body.offsetWidth  - (elFramePopup.offsetWidth+2))  / 2, 0);
		Current = Current + Increment;
		setTimeout('MovePopup("' + SRC + '","' + Width + '", "' + Height + '", ' + ToWidth + ', ' + ToHeight + ', ' + Increment + ', ' + Current + ')',1);
	}
	else {
		elFramePopup.style.width = Width;
		elFramePopup.style.height = Height;
		elFramePopup.src = SRC;
		AppPageResize();
	}
}
function OpenWindow(SRC) {
	window.open(SRC, "_new", 'resizable=yes');
}
function HidePopUp(Refresh) {
	if (Refresh) {
		window.location   = window.location.toString();
	}
	else {
		HideWorking();
		elFramePopup.style.display = 'none';
	}
}
function DoReportDesktop(sRPT, OID, bFromDate, bToDate, bUsers, bProjects, bClients, bSites, bEmployeeTypes, bSite, bDepartments, iBase, bShiftGroups, bStations) {
	// iBase (Entity): 0 - None; 1 - Project; 2 - Site
	var SRC		= '../reports/reportfilter.jsp;jsessionid=' + sSessionID + '?USRS=' + (bUsers?1:0) 
		+ '&DESKTOP=1'
		+ '&RPTOID=' + OID 
		+ '&FDT=' + (bFromDate?1:0) 
		+ '&TDT=' + (bToDate?1:0) 
		+ '&PJS=' + (bProjects?1:0) 
		+ '&CTS=' + (bClients?1:0) 
		+ '&STS=' + (bSites?1:0) 
		+ '&SAS=' + (bStations?1:0) 
		+ '&ETY=' + (bEmployeeTypes?1:0) 
		+ '&SIT=' + (bSite?1:0) 
		+ '&DPT=' + (bDepartments?1:0) 
		+ '&GRP=' + (bShiftGroups?1:0) 
		+ '&BASE=' + iBase 
		+ '&RPT=' + sRPT;
	reportFilter(SRC);
}
function DoReport(sRPT, OID, bFromDate, bToDate, bUsers, bProjects, bClients, bSites, bEmployeeTypes, bSite, bDepartments, iBase, bShiftGroups, bStations) {
	// iBase (Entity): 0 - None; 1 - Project; 2 - Site
	var width	= 730;
	var height	= 350;
	var SRC		= '../reports/reportfilter.jsp;jsessionid=' + sSessionID + '?USRS=' + (bUsers?1:0) 
		+ '&RPTOID=' + OID 
		+ '&FDT=' + (bFromDate?1:0) 
		+ '&TDT=' + (bToDate?1:0) 
		+ '&PJS=' + (bProjects?1:0) 
		+ '&CTS=' + (bClients?1:0) 
		+ '&STS=' + (bSites?1:0) 
		+ '&SAS=' + (bStations?1:0) 
		+ '&ETY=' + (bEmployeeTypes?1:0) 
		+ '&SIT=' + (bSite?1:0) 
		+ '&DPT=' + (bDepartments?1:0) 
		+ '&GRP=' + (bShiftGroups?1:0) 
		+ '&BASE=' + iBase 
		+ '&RPT=' + sRPT;
	ShowPopUp(SRC, width, height);
}
function DoReportXML(sRPT, sXMLDS, OID, bFromDate, bToDate, bUsers, bProjects, bClients, bSites, bEmployeeTypes, bSite, bDepartments, iBase, bShiftGroups, bStations) {
	DoReportXML1(sRPT, sXMLDS, "root/e", OID, bFromDate, bToDate, bUsers, bProjects, bClients, bSites, bEmployeeTypes, bSite, bDepartments, iBase, bShiftGroups, bStations);
}
function DoReportXML1(sRPT, sXMLDS, sXPATH, OID, bFromDate, bToDate, bUsers, bProjects, bClients, bSites, bEmployeeTypes, bSite, bDepartments, iBase, bShiftGroups, bStations) {
	// iBase (Entity): 0 - None; 1 - Project; 2 - Site
	var reQuestionMark = new RegExp('\\?', 'ig');
	var reEqualsSign = new RegExp('\\=', 'ig');
	var reAmpersand = new RegExp('\\&', 'ig');
	var reSlash = new RegExp('\\/', 'ig');
	sXMLDS = sXMLDS.replace(reQuestionMark, '@01').replace(reEqualsSign, '@02').replace(reAmpersand, '@03');
	var width	= 730;
	var height	= 350;
	var SRC		= '../reports/reportfilterXML.jsp;jsessionid=' + sSessionID + '?USRS=' + (bUsers?1:0) 
		+ '&XMLDS=' + sXMLDS 
		+ '&XPATH=' + sXPATH.replace(reSlash, '@04')
		+ '&RPTOID=' + OID 
		+ '&FDT=' + (bFromDate?1:0) 
		+ '&TDT=' + (bToDate?1:0) 
		+ '&PJS=' + (bProjects?1:0) 
		+ '&CTS=' + (bClients?1:0) 
		+ '&STS=' + (bSites?1:0) 
		+ '&SAS=' + (bStations?1:0) 
		+ '&ETY=' + (bEmployeeTypes?1:0) 
		+ '&SIT=' + (bSite?1:0) 
		+ '&DPT=' + (bDepartments?1:0) 
		+ '&GRP=' + (bShiftGroups?1:0) 
		+ '&BASE=' + iBase 
		+ '&RPT=' + sRPT;
	ShowPopUp(SRC, width, height);
}
function DoReportXMLDesktop(sRPT, sXMLDS, OID, bFromDate, bToDate, bUsers, bProjects, bClients, bSites, bEmployeeTypes, bSite, bDepartments, iBase, bShiftGroups, bStations) {
	DoReportXMLDesktop1(sRPT, sXMLDS, "root/e", OID, bFromDate, bToDate, bUsers, bProjects, bClients, bSites, bEmployeeTypes, bSite, bDepartments, iBase, bShiftGroups, bStations)
}
function DoReportXMLDesktop1(sRPT, sXMLDS, sXPATH, OID, bFromDate, bToDate, bUsers, bProjects, bClients, bSites, bEmployeeTypes, bSite, bDepartments, iBase, bShiftGroups, bStations) {
	// iBase (Entity): 0 - None; 1 - Project; 2 - Site
	var reQuestionMark = new RegExp('\\?', 'ig');
	var reEqualsSign = new RegExp('\\=', 'ig');
	var reAmpersand = new RegExp('\\&', 'ig');
	var reSlash = new RegExp('\\/', 'ig');
	sXMLDS = sXMLDS.replace(reQuestionMark, '@01').replace(reEqualsSign, '@02').replace(reAmpersand, '@03');
	var width	= 730;
	var height	= 350;
	var SRC		= '../reports/reportfilterXML.jsp;jsessionid=' + sSessionID + '?USRS=' + (bUsers?1:0) 
		+ '&DESKTOP=1'
		+ '&XMLDS=' + sXMLDS 
		+ '&XPATH=' + sXPATH.replace(reSlash, '@04')
		+ '&RPTOID=' + OID 
		+ '&FDT=' + (bFromDate?1:0) 
		+ '&TDT=' + (bToDate?1:0) 
		+ '&PJS=' + (bProjects?1:0) 
		+ '&CTS=' + (bClients?1:0) 
		+ '&STS=' + (bSites?1:0) 
		+ '&SAS=' + (bStations?1:0) 
		+ '&ETY=' + (bEmployeeTypes?1:0) 
		+ '&SIT=' + (bSite?1:0) 
		+ '&DPT=' + (bDepartments?1:0) 
		+ '&GRP=' + (bShiftGroups?1:0) 
		+ '&BASE=' + iBase 
		+ '&RPT=' + sRPT;
	reportFilterXML(SRC);
}
function getElementsById(sId) {
    var outArray = new Array();	
	if(typeof(sId)!='string' || !sId) {
		return outArray;
	};
	if(document.evaluate) {
		var xpathString = "//*[@id='" + sId.toString() + "']"
		var xpathResult = document.evaluate(xpathString, document, null, 0, null);
		while ((outArray[outArray.length] = xpathResult.iterateNext())) { }
		outArray.pop();
	}
	else if(document.all) {
		for(var i=0,j=document.all[sId].length;i<j;i+=1){
		outArray[i] =  document.all[sId][i];}
	} else if(document.getElementsByTagName) {
		var aEl = document.getElementsByTagName( '*' );	
		for(var i=0,j=aEl.length;i<j;i+=1) {
			if(aEl[i].id == sId ) {
				outArray.push(aEl[i]);
			};
		};	
	};
	return outArray;
}
//********************************************************************************
// AJAX Support
//********************************************************************************
var svTypeString	= 0;
var svTypeBoolean	= 1;
var svTypeDate		= 2;
var svTypeInteger	= 3;
var svTypeLong		= 4;
function setSessionVariable(sVarName, sVarValue, iType) {
	doAJAX('../SetSessVar;jsessionid=' + sSessionID + '?VARNAME=' + sVarName + '&VARVALUE=' + sVarValue + '&VARTYPE=' + iType, null);
}
function getSessionVariable(sVarName, iType, defValue) {
	var oReturn = defValue;
	var myAjaxRequest = new nitobi.ajax.HttpRequest(); 
	myAjaxRequest.handler = '../GetSessVar;jsessionid=' + sSessionID + '?VARNAME=' + sVarName + '&VARTYPE=' + iType;
	myAjaxRequest.async = false; 
	myAjaxRequest.get(); 
	var sReturn = myAjaxRequest.httpObj.responseText;
	if (sReturn != 'null') {
    	switch (iType) {
			case svTypeString:
				oReturn = sReturn;
				break;
			case svTypeBoolean:
				oReturn = Number(sReturn) == 1;
				break;
			case svTypeDate:
				oReturn = new Date(sReturn);
				break;
			case svTypeInteger:
			case svTypeLong:
				oReturn = Number(sReturn);
				break;
    	}
    }
    return oReturn;
}
function doAJAX(sURL, oReturnFunc) {
	var myAjaxRequest = new nitobi.ajax.HttpRequest(); 
	myAjaxRequest.handler = sURL;
	myAjaxRequest.async = false; 
	myAjaxRequest.get();
	if (myAjaxRequest.httpObj.status != 200) alert(myAjaxRequest.httpObj.responseText);
	if (oReturnFunc) oReturnFunc(myAjaxRequest.httpObj.responseText);
	return myAjaxRequest.httpObj.responseText;
}
function getAJAX(sURL, oReturnFunc) {
	var reqGetAJAX;
	if (window.XMLHttpRequest) {
		reqGetAJAX = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		reqGetAJAX = new ActiveXObject('Microsoft.XMLHTTP');
	}
	reqGetAJAX.open('GET', sURL, false);
	reqGetAJAX.onreadystatechange = function() {
	    if (reqGetAJAX.readyState == 4) {
	        if (reqGetAJAX.status == 200) {	// Successful...
	        	if (oReturnFunc != null) oReturnFunc(reqGetAJAX.responseText);
	        } else {							// Un-Successful...
	        	alert('AJAX GET Failed\nStatus: ' + reqGetAJAX.status + '\nError: ' + reqGetAJAX.responseText);
	        }
	    }
	};
	reqGetAJAX.send(null);
}
function postAJAX(sURL, sFormID, lOID, oReturnFunc) {
	ShowWorking();
	var reqPostAJAX;
	if (window.XMLHttpRequest) {
		reqPostAJAX = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		reqPostAJAX = new ActiveXObject('Microsoft.XMLHTTP');
	}
	reqPostAJAX.open('POST', sURL, false);
	reqPostAJAX.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	reqPostAJAX.onreadystatechange = function() {
	    if (reqPostAJAX.readyState == 4) {
	        if (reqPostAJAX.status == 200) {	// Successful...
	        	if (oReturnFunc != null) oReturnFunc(reqPostAJAX.responseText);
	        } else {							// Un-Successful...
	        	alert('AJAX POST Failed\nStatus: ' + reqPostAJAX.status + '\nError: ' + reqPostAJAX.responseText);
	        }
	        HideWorking();
	    }
	};
	reqPostAJAX.send('OID=' + lOID + '&' + GetFormData(document.getElementById(sFormID)));
}
function GetFormData(elForm) {
	var getstr = '';
	for (var i = 0; i < elForm.getElementsByTagName('input').length; i++) {
		if (elForm.getElementsByTagName('input')[i].type == 'hidden') {
			getstr += (getstr.length > 0 ? '&' : '') + elForm.getElementsByTagName('input')[i].name + '=' + encodeURI(elForm.getElementsByTagName('input')[i].value);
		}
	}
	return getstr;
}
