//////////////////////////////////////////////////////////////////////////////////////
String.prototype.trim = function() {
	return this.replace(/^\s*/,"").replace(/\s*$/,"");
}

String.prototype.pad = function(l, s, t){
	return s || (s = " "), (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length)
		+ 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2))
		+ this + s.substr(0, l - t) : this;
};

var padLeft = 0;
var padRight = 1;
var padCenter = 2;
//////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////
//window.onerror = genErrHandler;

function genErrHandler(sMsg, sURL, iLnNo) {
	alert('An error occurred while attempting to process your request.\nPlease contact your web site administrator.\n\nError: ' + sMsg + '\nLine: ' + iLnNo);
	return true;
}
//////////////////////////////////////////////////////////////////////////////////////
 
//////////////////////////////////////////////////////////////////////////////////////
var sUserAgentU = navigator.userAgent.toUpperCase();
var bIsIE = ('Microsoft Internet Explorer' == navigator.appName);
var bIsMobile = (bIsIE && (-1 < sUserAgentU.indexOf('WINDOWS CE')));
var bIsNS = (!bIsIE && 'Netscape' == navigator.appName);
var bIsFireFox = (bIsNS && (-1 < sUserAgentU.indexOf('FIREFOX') || -1 < sUserAgentU.indexOf('PHOENIX') || -1 < sUserAgentU.indexOf('FIREBIRD') || -1 < sUserAgentU.indexOf('GRANPARADISO')));
var bIsMac = (-1 < navigator.appVersion.toUpperCase().indexOf('MAC'));
var bIsSafari = (!bIsIE && !bIsFireFox && (-1 < sUserAgentU.indexOf('SAFARI')));
//var bIsWindowsSafari = (bIsSafari && !bIsMac);
var bIsOpera = (!bIsIE && !bIsFireFox && !bIsSafari && (-1 < sUserAgentU.indexOf('OPERA')));
var bIsKonqueror = (!bIsIE && !bIsFireFox && !bIsSafari && !bIsOpera && (-1 < sUserAgentU.indexOf('KONQUEROR')));
var iDPIMult = (bIsIE && screen.deviceXDPI) ? (screen.deviceXDPI / screen.logicalXDPI) : 1;
var sStatusBarText = '';
var bDebug = false;
var m_arrImgCache = new Array();

var g_sAsterisNumber = '1-877-7ASTERIS';
//////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////
if (bIsIE)
	document.onselectstart = disableSelect;
else {
	document.onmousedown = disableSelect;
	document.onclick = enableSelect;
}

function disableSelect(evt) {
	var objElement = (bIsIE) ? event.srcElement : evt.target;

	if (objElement) {
		var sTag = objElement.tagName.toUpperCase();
		if ('INPUT' != sTag && 'SELECT' != sTag && 'TEXTAREA' != sTag) return false;
	}
}

function enableSelect(evt) {
	return true;
}
//////////////////////////////////////////////////////////////////////////////////////

function getBrowserVer() {
	var sBrowserVer = '0';
	var iMark;	

	if (bIsIE) {
		iMark = sUserAgentU.indexOf('MSIE');
		sBrowserVer = sUserAgentU.substring(iMark + 5, sUserAgentU.indexOf(';', iMark));
	}
	else if (bIsFireFox) {
		iMark = sUserAgentU.indexOf('FIREFOX/');
		var iLen = 8;
		
		if (-1 == iMark) {
			iMark = sUserAgentU.indexOf('PHOENIX/');
			if (-1 == iMark) {
				iMark = sUserAgentU.indexOf('FIREBIRD/');
				if (-1 == iMark) {
					iMark = sUserAgentU.indexOf('GRANPARADISO/');
					iLen = 13;
				}
				else
					iLen = 9;
			}
		}

		if (-1 < iMark) sBrowserVer = sUserAgentU.substring(iMark + iLen);
	}
	else if (bIsSafari) {
		iMark = sUserAgentU.indexOf('SAFARI/');
		sBrowserVer = sUserAgentU.substring(iMark + 7);
		iVersion = parseInt(sBrowserVer);
		if (412 == iVersion)
			sBrowserVer = '2.0';
		else if (419 == iVersion)
			sBrowserVer = '2.0.4';
		else if (521 == iVersion)
			sBrowserVer = '3.0';
	}
	else if (bIsOpera) {
		iMark = sUserAgentU.indexOf('OPERA');
		sBrowserVer = sUserAgentU.substring(iMark + 6, sUserAgentU.indexOf(' ', iMark));
	}
	else if (bIsKonqueror) {
		iMark = sUserAgentU.indexOf('KONQUEROR/');
		sBrowserVer = sUserAgentU.substring(iMark + 10, sUserAgentU.indexOf(';', iMark));
	}

	return sBrowserVer;
}

function setButtonStyles() {
	try {
		var arrInputs = document.getElementsByTagName('INPUT');
		var iNumInputs = arrInputs.length;
		var sType;

		for ( var i = 0; i < iNumInputs; i++ ) {
			sType = arrInputs[i].type.toUpperCase();
			if ( 'BUTTON' == sType || 'SUBMIT' == sType ) {
				arrInputs[i].origClass = arrInputs[i].className;
				arrInputs[i].onmousedown = setBtnStyleDown;
				arrInputs[i].onmouseup = setBtnStyleUp;
			}
		}
	}
	catch (e) { }
}

function setBtnStyleDown(evt) {
	var objElement = (bIsIE) ? event.srcElement : evt.target;

	if (objElement && objElement.origClass)
		objElement.className = objElement.origClass + 'Down';
}

function setBtnStyleUp(evt) {
	var objElement = (bIsIE) ? event.srcElement : evt.target;

	if (objElement && objElement.origClass)
		objElement.className = objElement.origClass;
}

function cancelEvent(evt) {
	if (bIsIE) {
		event.cancelBubble = true;
		event.returnValue = false;
	}
	else if (evt) {
		evt.stopPropagation();
		evt.returnValue = false;
	}
}

function getObjectByID(sObjID) {
	var objRet = null;

	try {
		if (sObjID) {
			if (document.getElementById)
				objRet = document.getElementById(sObjID);
			else if (document.all)
				objRet = eval('document.all.' + sObjID);
			else
				objRet = eval('document.' + sObjID);
		}
	}
	catch (e) { }

	return objRet;
}

function getContainerTable(objElement) {
	var objTable = objElement;

	while (objTable && ('TABLE' != objTable.tagName.toUpperCase())) {
		objTable = objTable.parentNode;
	}

	return objTable;
}

function getParentElement(objChild, sParentTagName) {
	//if (objChild.tagName.toUpperCase() == sParentTagName.toUpperCase()) return objChild;

	var objParent = objChild.parentNode;
	var sTagName;

	sParentTagName = sParentTagName.toUpperCase();

	while (objParent) {
		if ('BODY' == sTagName) {
			objParent = null;
			break;
		}
		else if (objParent.tagName) {
			sTagName =  objParent.tagName.toUpperCase();

			if (sParentTagName == sTagName) break;
		}

		objParent = objParent.parentNode;
	}

	return objParent;
}

function getNextChildByTagName(objParent, sChildTagName) {
	var iNumChildren = (objParent ? objParent.childNodes.length : 0);
	var objChild = null;
	
	if (sChildTagName) {
		sChildTagName = sChildTagName.toUpperCase();

		for (var i = 0; i < iNumChildren; i++) {
			if (objParent.childNodes[i].tagName && objParent.childNodes[i].tagName.toUpperCase() == sChildTagName) {
				objChild = objParent.childNodes[i];
				break;
			}
		}
	}

	return objChild;
}

function isChildElement(objChildElement, objParentElement, bNullIsAChild) {
	var bIsChild = false;

	if (objParentElement) {
		if (!objChildElement)
			bIsChild = (bNullIsAChild) ? true : false;
		else {
			var objCheck = objChildElement.parentNode;

			while (objCheck) {
				if (objCheck == objParentElement) {
					bIsChild = true;
					break;
				}
				objCheck = objCheck.parentNode;
			}
		}
	}

	return bIsChild;
}

function getCSSClassByName(sClassName)
{
// Note: only returns the first CSS rule found - other with a like name may exist.
// Otis -- fix this by creating an instance of a classed HTML element?
	try
	{
		var sClassLower = sClassName.toLowerCase();
		var iNumCSS = document.styleSheets.length;
		var iNumRules, iNumProps;
		var iCSSCount, iRuleCount;
		var objCSS, objCSSRules, objRule, objProp;

		for (iCSSCount = 0; iCSSCount < iNumCSS; iCSSCount++) {
			objCSS = document.styleSheets[iCSSCount];
			objCSSRules = (objCSS.cssRules) ? objCSS.cssRules : objCSS.rules;
			iNumRules = objCSSRules.length;

			for (iRuleCount = 0; iRuleCount < iNumRules; iRuleCount++) {
				objRule = objCSSRules[iRuleCount];
				if (sClassLower == objRule.selectorText.toLowerCase()) return objRule;
			}
		}
	}
	catch (e) { }

	return null;
}

function getCSSPropValue(sClassName, sProperty)
{
// This function duplicates the code in getCSSClassByName, but can find
// property values that might exist in multiple-definition classes.
	var objValue = '';

	try
	{
		var sClassLower = sClassName.toLowerCase();
		var iNumCSS = document.styleSheets.length;
		var iNumRules, iNumProps;
		var iCSSCount, iRuleCount;
		var objCSS, objCSSRules, objRule, objProp;

		for (iCSSCount = 0; iCSSCount < iNumCSS; iCSSCount++) {
			objCSS = document.styleSheets[iCSSCount];
			objCSSRules = (objCSS.cssRules) ? objCSS.cssRules : objCSS.rules;
			iNumRules = objCSSRules.length;

			for (iRuleCount = 0; iRuleCount < iNumRules; iRuleCount++) {
				objRule = objCSSRules[iRuleCount];
				if (sClassLower == objRule.selectorText.toLowerCase()) {
					objProp = getStylePropValue(objRule, sProperty.toLowerCase());
					if (objProp) return objProp;
				}
			}
		}
	}
	catch (e) { }

	return objValue;
}

function getStylePropValue(objElement, sProperty)
{
	var objValue = '';
	
	if (objElement && sProperty) {
		try 
		{
			objValue = objElement.style[getCamelCase(sProperty)];

			if (!objValue && document.defaultView) {
				objValue = document.defaultView.getComputedStyle(objElement, null).getPropertyValue(sProperty);
			}
		}
		catch (e) { }
	}

	return objValue;
}

function copyStyleObject(objSrc, objDest) {
	if (objSrc && objDest) {
		var objStyle = objSrc.style; //document.defaultView.getComputedStyle(objToRound, null);
		var iNumCSSProps = objStyle.length;
		for (var i = 0; i < iNumCSSProps; i++ ) {
			objDest.style.setProperty(objStyle[i], objStyle.getPropertyValue(objStyle[i]), objStyle.getPropertyPriority(objStyle[i]));
//alert(objDest.style[objStyle[i]]);
}
	}

	return objDest;
}

function doImgLinkOver(objAnchor) {
	try {
		if (objAnchor) {
			if (!objAnchor.linkImg) objAnchor.linkImg = objAnchor.childNodes[0];

			if (!objAnchor.sbText) {
				objAnchor.sbText = (objAnchor.childNodes[0].alt.length) ? objAnchor.childNodes[0].alt : ' ';
				//objAnchor.childNodes[0].alt = '';
			}

			//objAnchor.linkImg.origSrc = objAnchor.linkImg.src;
			//if (!objAnchor.linkImg.overSrc) objAnchor.linkImg.overSrc = getMouseOverSrc(objAnchor.linkImg.src);
			//objAnchor.linkImg.src = objAnchor.linkImg.overSrc;
			window.status = objAnchor.sbText;
			return true;
		}
	}
	catch (e) { }
}

function doImgLinkOut(objAnchor) {
	try {
		//if (objAnchor) objAnchor.linkImg.src = objAnchor.linkImg.origSrc;
		window.status = '';
	}
	catch (e) { }
}

function getMouseOverSrc(sImgSrc) {
	var sOverSource = '';

	if (sImgSrc) sOverSource = sImgSrc.substr(0, sImgSrc.indexOf('.gif')) + '_O.gif';

	return sOverSource;
}

function getActivePageSrc(sImgSrc) {
	var sActiveSource = '';

	if (sImgSrc) sActiveSource = sImgSrc.substr(0, sImgSrc.indexOf('.gif')) + '_Sel.gif';

	return sActiveSource;
}

function doItemLinkOver(objAnchor) {
	if (objAnchor) {
		with (objAnchor) {
			var objChildText = childNodes[0];
			if (objAnchor.childNodes[0].tagName) objChildText = objChildText.childNodes[0];
			origText = objChildText.nodeValue;
			objChildText.nodeValue = '::' + origText.substr(1) + ' ::';
		}
	}
}

function doItemLinkOut(objAnchor) {
	if (objAnchor) {
		with (objAnchor) {
			var objChildText = childNodes[0];
			if (objAnchor.childNodes[0].tagName) objChildText = objChildText.childNodes[0];
			if (origText) { objChildText.nodeValue = origText; }
		}
	}
}

function getTotalOffset(oObj, sDistanceTo) {
	var iDistance;
	var bFindBottom = (sDistanceTo == "bottom");
	var bFindRight = (sDistanceTo == "right");
	var bFindLeft = (sDistanceTo == "left" || bFindRight);
	var bFindTop = (sDistanceTo == "top" || bFindBottom);

	if (bFindRight)
		iDistance = oObj.offsetWidth;
	else if (bFindBottom)
		iDistance = oObj.offsetHeight;
	else
		iDistance = 0;

	//if (bIsIE) oObj = oObj.offsetParent
	while ('object' == typeof(oObj) && 'BODY' != oObj.tagName.toUpperCase()) {
		if (bDebug) alert(oObj.tagName + ' (ID=' + oObj.id + ') [' + sDistanceTo + '] ==> ' + (bFindTop ? oObj.offsetTop : oObj.offsetLeft));
		iDistance += bFindTop ? oObj.offsetTop : oObj.offsetLeft;
		oObj = oObj.offsetParent;
	}

	return iDistance;
}

/////////////////////////////////////////////////// Graphic Buttons ///////////////////////////////////////////////////
function initImageButton(objImg) {
	try {
		var iMark = objImg.src.indexOf('.gif');
		if (-1 < iMark) {
			var sSrcBase = objImg.src.substring(0, iMark);
			var iIndex = m_arrImgCache.length;

			m_arrImgCache[iIndex] = new Image;
			objImg.origSrc = m_arrImgCache[iIndex++].src = objImg.src;
			
			m_arrImgCache[iIndex] = new Image;
			objImg.overSrc = m_arrImgCache[iIndex++].src = sSrcBase + 'Over.gif';

			
			m_arrImgCache[iIndex] = new Image;
			objImg.downSrc = m_arrImgCache[iIndex].src = sSrcBase + 'Down.gif';
		}

		objImg.onmouseover = doBtnOver;
		objImg.onmouseout = doBtnOut;
		objImg.onmousedown = doBtnDown;
		objImg.onmouseup = doBtnUp;
		objImg.ondrag = doBtnDrag;
	}
	catch (e) { }
}

function doBtnOver(evt) {
	var objImg = (bIsIE) ? event.srcElement : evt.target;

	if (objImg && objImg.overSrc) objImg.src = objImg.overSrc;
}

function doBtnOut(evt) {
	var objImg = (bIsIE) ? event.srcElement : evt.target;

	if (objImg && objImg.origSrc) objImg.src = objImg.origSrc;
}

function doBtnDown(evt) {
	var objImg = (bIsIE) ? event.srcElement : evt.target;

	if (objImg && objImg.downSrc) objImg.src = objImg.downSrc;
}

function doBtnUp(evt) {
	var objImg = (bIsIE) ? event.srcElement : evt.target;

	if (objImg && objImg.overSrc) objImg.src = objImg.overSrc;
}

function doBtnDrag(evt) {
	((bIsIE) ? event : evt).returnValue = false;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var iDPIMult = (screen && screen.deviceXDPI) ? (screen.deviceXDPI / screen.logicalXDPI) : 1;
var iDeviceXDPI = (screen && screen.deviceXDPI) ? screen.deviceXDPI : 96;
//alert(iDeviceXDPI);
//var iBrowserTitleBarWidth = 0, iBrowserTitleBarHeight = 0;

function openModalDialog(sURL, sWinName, vArgs, iWidth, iHeight) {
	if (window.showModalDialog) {
		//var bSetBorderDims = (objTop.iBrowserTitleBarWidth) ? false : true;

		//iWidth = (iWidth + iBrowserTitleBarWidth) * iDPIMult;
		//iHeight = (iHeight + iBrowserTitleBarHeight) * iDPIMult;

		//if (bSetBorderDims) sURL += '&getBorderDims=Yes';
		sURL += (-1 == sURL.indexOf('?') ? '?' : '&') + 'cachePrevent=' + getRandomNum();
		return window.showModalDialog(sURL, vArgs, 'dialogWidth:' + iWidth  + 'px; dialogHeight:' + iHeight + 'px; scroll:no; status:no; help:no;');
	}
	else
		return window.open(sURL, sWinName, 'width=' + iWidth + ',height=' + iHeight + ',modal=yes');
		//window.open(sURL, sWinName, 'width=' + iWidth + ',height=' + iHeight + ',dependent,alwaysRaised,modal=yes');
}

function getFilePath(sFullPath) {
	var sFilePathOut = sFullPath;

	var iSlashIndex = sFullPath.lastIndexOf('/');
	if (-1 < iSlashIndex) sFilePathOut = sFullPath.substr(0, iSlashIndex); 
		
	return sFilePathOut;
}

function getRelativePath(sFullPath) {
	var sRelativePath = sFullPath;
	var sFullPathL = sFullPath.toLowerCase();
	var sLocation = getFilePath(window.location.href).toLowerCase();

	if (sLocation.length < sFullPath.length) {
		var iStart = sFullPathL.indexOf(sLocation);
		if (-1 < iStart) sRelativePath = sFullPath.substr(sLocation.length + 1);
	}
		
	return sRelativePath;
}

function getFileName(sFullPath) {
	var sFileNameOut = sFullPath;

	var iSlashIndex = sFullPath.lastIndexOf('/');
	if (-1 < iSlashIndex) sFileNameOut = sFullPath.substr(iSlashIndex + 1); 
		
	return sFileNameOut;
}

function getFileNameWithoutExtension(sFileName) {
	var sFileNameOut = getFileName(sFileName);

	var iDotIndex = sFileNameOut.lastIndexOf('.');
	if (-1 == iDotIndex) iDotIndex = sFileNameOut.length;
	sFileNameOut = sFileNameOut.substr(0, iDotIndex);

	return sFileNameOut;
}

function getFileExtension(sFileName) {
	sFileName = getFileName(sFileName);

	var iDotIndex = sFileName.lastIndexOf('.');
	if (-1 == iDotIndex) iDotIndex = sFileName.length;

	return sFileName.substr(iDotIndex);
}

function getRandomNum() {
	return Math.round((Math.random() * 19999) + 1);
}

function getIntVal(ValIn)
{
	var iOut = parseInt(ValIn);
	if (isNaN(iOut)) iOut = 0;
	return iOut;
}

function getCamelCase(s) {
	for(var exp = getCamelCase.exp; exp.test(s); s = s.replace(exp, RegExp.$1.toUpperCase()) );
	return s;
}
getCamelCase.exp = /-([a-z])/;

function formatCurrency(sValue) {
	sValue = sValue.toString().replace(/\$|\,/g,'');
	if(isNaN(sValue)) sValue = '0';

	var bPositive = (sValue == (sValue = Math.abs(sValue)));
	sValue = Math.floor(sValue * 100 + 0.50000000001);
	var sCents = sValue % 100;
	sValue = Math.floor(sValue / 100).toString();
	if(sCents < 10) sCents = '0' + sCents;

	for (var i = 0; i < Math.floor((sValue.length - (i + 1)) / 3); i++)
		sValue = sValue.substring(0, sValue.length - (4 * i + 3)) + ',' + sValue.substring(sValue.length - (4 * i + 3));

	return ((bPositive) ? '' : '-') + '$' + sValue + '.' + sCents;
}

function formatNumber(sValue, iNumDecimalPlaces) {
	sValue = sValue.toString().replace(/\$|\,/g,'');
	if(isNaN(sValue)) sValue = '0';

	var sFloor = Math.floor(sValue * 100.0).toString();

	if (1 > iNumDecimalPlaces || 0 == sFloor)
		sValue = sFloor;
	else {
		sValue = (sValue * 100.0 + 0.00000000001).toString();
		var iDecMark = sValue.indexOf('.');
		var iTotalLen = sFloor.length + iNumDecimalPlaces + 1;

		if (-1 < iDecMark) {
			if (sValue.length - iDecMark < iNumDecimalPlaces)
				sValue = sValue.pad(iTotalLen, '0', padRight);
			else {
				var iExp = Math.round((parseFloat(sValue) - sFloor) * Math.pow(10, iNumDecimalPlaces));

				if (0 == iExp) {
					sValue = sFloor + '.';
					sValue = sValue.pad(sValue.length + iNumDecimalPlaces, '0', padRight);
				}
				else
					sValue = sFloor + '.' + Math.round((parseFloat(sValue) - sFloor) * Math.pow(10, iNumDecimalPlaces));
			}
		}
	} 

	return sValue;
}

function formatPercent(sValue, iNumDecimalPlaces) {
	return formatNumber(sValue, iNumDecimalPlaces) + '%';
}

