
//selectNodes does not exist in Firefox, so we must improvise
//from: http://km0ti0n.blunted.co.uk/mozXPath.xap
if( document.implementation.hasFeature("XPath", "3.0") ) 
{ 
	// prototying the XMLDocument 
	XMLDocument.prototype.selectNodes = function(cXPathString, xNode) 
	{ 
		if( !xNode ) { xNode = this; }
		var oNSResolver = this.createNSResolver(this.documentElement) 
		var aItems = this.evaluate(cXPathString, xNode, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null) 
		var aResult = [];
		for( var i = 0; i < aItems.snapshotLength; i++) 
		{ 
			aResult[i] = aItems.snapshotItem(i);
		} 
		return aResult;
	} 
	// prototying the Element 
	Element.prototype.selectNodes = function(cXPathString) 
	{ 
		if(this.ownerDocument.selectNodes) 
		{ 
			return this.ownerDocument.selectNodes(cXPathString, this);
		} 
		else
		{
			throw "For XML Elements Only";
		} 
	} 
} 

/***** Generic *****/
function pauseExecution(milliseconds)
{
	date = new Date();
	var curDate = null;
	do 
	{ 
		curDate = new Date(); 
	}
	while((curDate - date) < milliseconds);
} 

function handleHotKey(e) 
{
	if (!e) 
	{
		e = event;
	}
	if (e.keyCode == 27)	//ESCAPE
	{ 
		hideDialog();
	}
}

/***** Positional *****/
function getHeight() 
{
	var height = 0;
	if (document.height) 
	{
		height = document.height;
	}
	else {
		if (document.body) 
		{
			var sh = (document.body.scrollHeight) ? document.body.scrollHeight : 0;
			var oh = (document.body.offsetHeight) ? document.body.offsetHeight : 0;
			height = (sh > oh) ? sh : oh;
		}
	}
	return height;
}

function getWidth() 
{
	var width = 0;
	if (document.width) 
	{
		width = document.width;
	}
	else 
	{
		if (document.body) 
		{
			var sh = (document.body.scrollWidth) ? document.body.scrollWidth : 0;
			var oh = (document.body.offsetWidth) ? document.body.offsetWidth : 0;
			width = (sh > oh) ? sh : oh;
		}
	}
	return width;
}

function positionCenter(el) 
{
	el.style.top = (getScrollTop() + 100) + 'px';
	el.style.left = ((screen.availWidth / 3.5) + getScrollLeft()) + 'px';
}

function getScrollTop() 
{
	if (document.documentElement && document.documentElement.scrollTop)
	{
		return document.documentElement.scrollTop;
	}
	else if (document.body)
	{
		return document.body.scrollTop;
	}
	else if (window.pageYOffset)
	{
		return window.pageYOffset;
	}
}

function getParentScrollTop()
{
	if (parent.document.documentElement && parent.document.documentElement.scrollTop)
	{
		return parent.document.documentElement.scrollTop;
	}
	else if (parent.document.body)
	{
		return parent.document.body.scrollTop;
	}
	else if (parent.window.pageYOffset)
	{
		return parent.window.pageYOffset;
	}
}

function getScrollLeft() {
	if (document.documentElement && document.documentElement.scrollLeft)
		return document.documentElement.scrollLeft;
	else if (document.body)
		return document.body.scrollLeft;
	else if (window.pageXOffset)
		return window.pageXOffset;
}

function getScreenWidth() 
{
	if (document.documentElement && document.documentElement.clientWidth)
	{
		return document.documentElement.clientWidth;
	}
	else if (document.body)
	{
		return document.body.clientWidth;
	}
}

function getScreenHeight() 
{
	if (document.documentElement && document.documentElement.clientHeight)
	{
		return document.documentElement.clientHeight;
	}
	else if (document.body)
	{
		return document.body.clientHeight;
	}
}

function getOffsetWidth(el) 
{
	if (el)
	{
		return el.offsetWidth;
	}
	return 0;
}

function getOffsetHeight(el) 
{
	if (el)
	{
		return el.offsetHeight;
	}
}

function getOffsetLeft(el) 
{
	var left = 0;
	var curEl = el;
	while (curEl != null) 
	{
		left += curEl.offsetLeft;
		curEl = curEl.offsetParent;
	}
	return left;
}

function getOffsetTop(el) 
{
	var top = 0;
	var curEl = el;
	while (curEl != null) 
	{
		top += curEl.offsetTop;
		curEl = curEl.offsetParent;
	}
	return top;
}

function getOffsetX(el)
{
	if (el.offsetX) return el.offsetX;
	if (el.layerX) return el.layerX;
	return 0;
}

function getOffsetY(el)
{
	if (el.offsetY) return el.offsetY;
	if (el.layerY) return el.layerY;
	return 0;
}

function positionFromLeftEdge(iframeId, el, width, height)
{
	var iframe = parent.document.getElementById(iframeId);
	var centerWell = document.getElementById("centerwell");
	var parentScrollTopPx = getParentScrollTop();
	var topPx = 0;
	
	el.style.left = (centerWell.offsetLeft + getScrollLeft()) + 'px';
		
	if(parentScrollTopPx <= iframe.offsetTop)
	{
		topPx = iframe.offsetTop + 10;
	}
	else if((parentScrollTopPx + height) > (eplansIframe.offsetTop + iframe.clientHeight))
	{
		topPx = iframe.clientHeight - height - 80;
	}
	else
	{
		topPx = parentScrollTopPx - 80;		
	}

	el.style.top = topPx + 'px';
}

function positionFromBottomLeftCenterWell(el, width, height)
{
	var centerWidth = 0;
	var leftWidth = 0;
	
	var centerWell = document.getElementById("centerwell");
	var leftWell = document.getElementById("leftwell");
	
	if (leftWell) 
	{
		leftWidth = leftWell.offsetWidth;
	}
	
	if (centerWell) 
	{
		centerWidth = centerWell.offsetWidth;
	}

	var relWidth = centerWidth + leftWidth;
	
	el.style.left = (relWidth - width - 20 + getScrollLeft()) + 'px';
	el.style.top = (getScreenHeight() - height - 60 + getScrollTop()) + 'px';
}

function positionEl(el, anchor)
{
	if (!anchor && !anchor.style && !el && !el.style ) return;
	var posLeft = getOffsetLeft(anchor);
	var posTop = getOffsetTop(anchor);
	if (!isNaN(posLeft))
	{
		el.style.left = posLeft + 'px';
	}
	if (!isNaN(posTop))
	{
		el.style.top = posTop + 'px';
	}
}

function positionElById(id, e)
{
	positionEl(getEl(id), e);
}

/***** Element Reference *****/
function getEl(id) 
{
	var obj;
	if (document.getElementById) 
	{
		obj = document.getElementById(id);
	} 
	else if (document.all) 
	{
		obj = eval("document.all." + id);
	} 
	return obj;
}

function getElsByName(name) 
{
	var obj;
	if (document.getElementsByName) 
	{
		obj = document.getElementsByName(name);
	}
	return obj;
}

function getParentEl(id)
{
	var element;
	if (parent.window.document.getElementById) 
	{
		element = parent.window.document.getElementById(id);
	}
	else 
	{
		if (parent.window.document.all) 
		{
			element = parent.window.document.all[id];
		}
	}
	return element;
}

function getParentElement(el)
{
	if (el && el.parentNode) return el.parentNode;
	if (el && el.parentElement) return el.parentElement;
	return null;
}

function getFormElements(el)
{
	if (typeof(el.form) != "undefined") 
	{ 
		return el.form.elements;
	}
	else 
	{
		if(document.forms[0] != undefined)
		{
			return document.forms[0].elements;
		}
		else
		{
			return null;
		}
	}
}

function resizeIframeDialog() {
	if (parent == window) {return false};
	var ifrm;
	if (parent.window.document.getElementById) 
	{
		ifrm = parent.window.document.getElementById("dialogWin");
	}
	else if (parent.window.document.all) 
	{
			ifrm = parent.window.document.all["dialogWin"];
	}
	if (parent && parent.setDialogTitle) 
	{
		parent.setDialogTitle(document.title);
	}
}

/***** Controls *****/
function getRadioVal(name) 
{
	var els = getElsByName(name);
	if (els) 
	{
		for (var i=0; i<els.length; i++) 
		{
			if (els[i] && els[i].checked) 
			{
				return els[i].value;
			}
		}
	}
	return null;
}

function hasNumericValue(el) 
{
	return (el && el.value != '' && !isNaN(el.value));
}

function getFloatValue(el, defaultVal) 
{
	if (el && hasNumericValue(el)) 
	{
		return parseFloat(el.value);
	}
	else 
	{
		return parseFloat(defaultVal);
	}
}

function getCurrencyValue(el) 
{
	return parseFloat(getFloatValue(el, 0.00).toFixed(2));
}

function getCurrencyDisplay(el) 
{
	return formatCurrency(getCurrencyValue(el));
}

/***** Formatting *****/
function formatCurrency(val) 
{
	var formattedVal = val.toString();
	if (formattedVal.indexOf('.') < 0) formattedVal += '.00';
	return '$' + formatComma(formattedVal);
}

function formatComma(val) 
{
	var vals = val.toString().split('.', 2);
	var wholePart = vals[0];
	var decimalPart = vals[1];
	if (typeof(decimalPart) != 'undefined' && decimalPart != '') 
	{
		if (wholePart.length > 3) 
		{
			return formatComma(wholePart.substring(0, wholePart.length - 3)) + ',' + wholePart.substring(wholePart.length - 3) + '.' + decimalPart;
		}
		else 
		{
			return wholePart + '.' + decimalPart;
		}
	}
	else 
	{
		if (wholePart.length > 3) 
		{
			return formatComma(wholePart.substring(0, wholePart.length - 3)) + ',' + wholePart.substring(wholePart.length - 3);
		}
		else 
		{
			return wholePart;
		}
	}
}

function phoneKeyUpMask(e)
{
	if (!e) 
	{
		e = event;
	}

	var control = (e.target) ? e.target : e.srcElement;

	var delimLocs = new Array('3', '7');
	var delim = '-';
	var i;
	var j;
	var currVal = control.value;
	
	for(i = 0; i < delimLocs.length; i++)
	{
		for(j=0; j <currVal.length; j++)
		{
			if(j == delimLocs[i])
			{
				if(currVal.substring(j, j+1) != delim)
				{
					currVal = currVal.substring(0, j) + delim + currVal.substring(j, currVal.length);
				}
			}
		}
	}
	
	control.value = currVal;
}

/***** Cookies *****/
function getCookie (cookiename) 
{
	var val = document.cookie.match ( cookiename + '=(.*?)(;|$)' );
 
	if (val)
	{
		return unescape(val[1]);
	}
	else
	{
		return null;
	}
}

function setCookie (cname, cval, cexpires, cpath, cdomain) 
{
	var cookieStr = cname + "=" + cval + ";"
	
	if (cexpires)
	{
		cookieStr = cookieStr + "expires=" + cexpires + ";"
	}
	
	if (cpath)
	{
		cookieStr = cookieStr + "path=" + cpath + ";"
	}
	
	if (cdomain)
	{
		cookieStr = cookieStr + "domain=" + cdomain + ";"
	}
	
	document.cookie = cookieStr;
}

/***** Negotiate Selects *****/
var bLoaded = true;

function negotiateSelects(topEl, activate, keepHidden) 
{
	negotiateElements('select', topEl, activate, keepHidden);
}

function negotiateElements(tagName, topEl, activate, keepHidden) 
{
	var allEls = document.getElementsByTagName(tagName);
	for (var i=0; i<allEls.length; i++) 
	{
		if (activate) 
		{
			if (topEl != allEls[i]) 
			{
				if (checkOverlap(topEl, allEls[i])) 
				{
					hideEl(allEls[i]);
				}
				else 
				{
					if (!keepHidden) showEl(allEls[i]);
				}
			}
		}
		else 
		{
			showEl(allEls[i]);
		}
	}
}

function checkOverlap(topEl, bottomEl) 
{
	var dims1 = getDimensions(topEl);
	var dims2 = getDimensions(bottomEl);
	if (overlap(dims1, dims2)) 
	{
		return true;
	}
	else 
	{
		return false;
	}
}

function getDimensions(el) 
{
	var points = new Array();	
	points[0] = getOffsetLeft(el);					//left
	points[1] = points[0] + getOffsetWidth(el);		//right
	points[2] = getOffsetTop(el);					//top
	points[3] = points[2] + getOffsetHeight(el);	//bottom
	return points;
}

function overlap(dims1, dims2) 
{
	if (((dims1[0] > dims2[0] && 
		  dims1[1] > dims2[0] && 
		  dims1[0] > dims2[1] && 
		  dims1[1] > dims2[1]) ||
		 (dims1[0] < dims2[0] && 
		  dims1[1] < dims2[0] && 
		  dims1[0] < dims2[1] && 
		  dims1[1] < dims2[1])) ||
	    ((dims1[2] > dims2[2] &&
		  dims1[3] > dims2[2] &&
		  dims1[2] > dims2[3] &&
		  dims1[3] > dims2[3]) ||
		 (dims1[2] < dims2[2] &&
		  dims1[3] < dims2[2] &&
		  dims1[2] < dims2[3] &&
		  dims1[3] < dims2[3]))) {
			return false;	
	}
	else 
	{
		return true;
	}
}

function showEl(obj) 
{
	if (!obj) return;
	if (document.getElementById) 
	{
		if (obj.style)
		{
			obj.style.visibility = "visible";
		}
	} 
	else if (document.all) 
	{
		if (obj.style)
		{
			obj.style.visibility = "visible";
		}
	} 
}

function showElById(id)
{
	showEl(getEl(id));
}

function hideEl(obj) 
{
	if (!obj) return;
	if (document.getElementById) 
	{
		if (obj.style)
		{
			obj.style.visibility = "hidden";
		}
	} 
	else if (document.all) 
	{
		if (obj.style)
		{
			obj.style.visibility = "hidden";
		}
	} 
}

function hideElById(id)
{
	hideEl(getEl(id));
}

/***** Parent *****/
function refreshParent() 
{
	if (parent == window) return false;	
	parent.location = parent.location;
}

function setParentUrl(url) 
{
	if (parent == window) return false;	
	parent.location = url;
}

/***** Initialization *****/
function initControl (controlId, signal, functionHandler) 
{
	var formControl = null;
	
	if (document == controlId) 
	{
		formControl = document;
	}
	
	if ("window" == controlId) 
	{
		formControl = window;
	}
	
	if (null == formControl) 
	{	
		if (document.getElementById) 
		{
			formControl = document.getElementById(controlId);
		}
		else if (top.document.all) 
		{
			formControl = document.all[controlId];
		}
	}
	
	// abort since there is nothing to attach
	if (!formControl) 
	{
		return;
	}

	if (document.addEventListener) 
	{
		formControl.addEventListener(signal, functionHandler, true);
	}
	else if (document.attachEvent) 
	{
		formControl.attachEvent("on" + signal, functionHandler);
	}
	else if (document.all) 
	{
		var sigHandler = eval(formControl + ".on" + signal)
		sigHandler = functionHandler;
	}
}
