//please,please,please keep in alpha order
function addAndSelect(selectBoxId,newValue,newText)
{
	var sb = get(selectBoxId);	
	addOption(sb,newValue,newText);
	sb.selectedIndex = sb.options.length - 1;
	sb.focus();
}

function addEvent(obj, evType, fn, useCapture)
{
	if (obj.addEventListener)
	{ 
		obj.addEventListener(evType, fn, useCapture); 
	} 
	else if (obj.attachEvent)
	{ 
		obj.attachEvent("on"+evType,fn); 
	} 
} 

function addOption(selectObj,value,text)
{
	var opt = document.createElement("OPTION");
	opt.value = value;
	opt.text = text;	
	selectObj.options.add(opt);
}
function arr_indexOf(arr,val)
{
	if (val == null || arr == null || arr.length==undefined)
		return -1;
	for (var i=0;i<arr.length;i++)
	{
		if (arr[i]==val)
			return i;
	}
	return -1;
}
function beep()
{
	if (document.applets["BeepApplet"])
		BeepApplet.beep();
}

function beepMsg(sMessage)
{//if BeepApplet is available, beep and set status, else alert
	if (document.applets["BeepApplet"] == null)
	{
		alert(sMessage);
	}
	else
	{
		window.status = sMessage;
		beep();
	}
}
function cancelEvent(e)
{
	if (e==null&&event!=null)
		e = event;
	if(isIE())
	{//it is IE
		e.returnValue = false;
		e.cancelBubble = true;
	}
	else
	{//it could be firefox
		e.preventDefault();
		e.stopPropagation();
	}
	return false;
}

function confirmEvent(e,msg)
{
	if (! window.confirm(msg))
		return cancelEvent(e);
	return true;
}

function exists(sName)
{
	try
	{
		o = document.getElementById(sName);
		if (o != null)
			return true;
	}
	catch (e)
	{
	}
	return false;
}
function focusOnFirstControl()
{
	if (null == document.forms[0])
	{
		window.status = "focusOnFirstControl: form not created yet.";
		return;
	}
	for (var i=0;i<document.forms[0].elements.length;i++)
	{
		var o = document.forms[0].elements[i];
		try
		{
			if (-1 < "hiddenbuttonsubmit".indexOf(o.type))
				continue;
			o.focus();
			window.status = "";
			return;
		}
		catch (e)
		{			
			window.status = "focusOnFirstControl:" + e;
		}
	}
	window.status = "focusOnFirstControl: no suitable target.";
}

function get(sName)
{
	var o = document.getElementById(sName);
	if (o != null)
		return o;
	alert("Element " + sName + " not found.");
	return null;
}

function getDocBase()
{
	return document.URL.substring(0,document.URL.lastIndexOf("/") + 1);
}

function getLocationHash()
{
	var a = location.hash.substr(1).split("?");
	return a[0];
}
function getValue(sName)
{
	var o = get(sName);
	if (o.value==undefined)
		return o.innerHTML;
	return o.value;
}
function getValueNum(sName)
{
	return num(getValue(sName));
}
function hide(sName)
{
	get(sName).style.display="none";
}

function hideShow(sName)
{
	var cur = get(sName).style.display;
	if (cur == "none")
	{
		show(sName);
		return "inline";
	}
	else
	{
		hide(sName);
		return "none";
	}
}

var _httpReq;
var _httpUrl;
var _httpCallback;
if (isIE()) 
{
	_httpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
	_httpReq = new XMLHttpRequest();
} 

function httpAsync(method,url,callBack) 
{
	try
	{
		if (! isIE()) 
			netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");		
		_httpCallback=callBack;
		_httpReq.onreadystatechange = httpAsyncProc;
		_httpUrl = url;
		if (0 > url.indexOf("?"))
		{
			url = url + "?submissionTime=" + new Date();
		}
		else
		{
			url = url + "&submissionTime=" + new Date();
		}
		_httpReq.open(method, url, true);
		_httpReq.send(null);
	}
	catch (e)
	{
		alert("httpAsync: " + e);
	}
}

function httpAsyncProc() 
{
    if (_httpReq.readyState == 4) 
    {
        if (_httpReq.status == 200) 
		{
			_httpCallback();
        } 
	else 
	{
          alert ( "Failure  getting " + _httpUrl);
        }
    }
}
function httpGet(url) 
{
	try
	{
		httpSync("GET",url);
		return httpResponse();
	}
	catch (e)
	{
		alert("httpGet: " + e);
	}
}
function httpGetXml(url) 
{
	try
	{
		httpSync("GET",url);
		if (isIE())
		{		
			if (_httpReq.responseXML)
				return _httpReq.responseXML;
			var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
			var dat = httpResponse();
			xmlDoc.loadXml(dat);
			return xmlDoc.getDocumentElement();
		}
		else
		{
			if (_httpReq.responseXML)
				return _httpReq.responseXML.childNodes[0];
			var parser = new DOMImplementation();
			parser.preserveWhiteSpace = true;
			var domDoc = parser.loadXML(httpResponse());
			return domDoc.getDocumentElement();
		}
	}
	catch (e)
	{
		alert("httpGetXml: " + e);
	}
}
function httpResponse()
{
	return _httpReq.responseText;
}
function httpSync(method,url) 
{
	try
	{
		wait(true);
		if (0 > url.indexOf("?"))
		{
			url = url + "?submissionTime=" + new Date();
		}
		else
		{
			url = url + "&submissionTime=" + new Date();
		}
		_httpReq.open(method, url, false);
		_httpReq.send(null);
	}
	catch (e)
	{
		alert("httpSync: " + e);
	}
	wait(false);
}
function isDate(sd)
{
	if (isNaN(new Date(sd)))
	{
		window.status = "invalid date: " + sd;
		return false;
	}		
	return true;
}

function isIE()
{
	return (window.ActiveXObject != null); 
}
var mobileAgents = ["blazer;","palm;","handspring;","nokia;","kyocera;",
                "samsung;","motorola;","smartphone;","windows ce;",
                "blackberry;","wap;","sonyericsson;","playstation portable;",
                "lg;","mmp;","opwv;","symbian;","epoc;"];
function isMobileDevice()
{
	try
	{ 
		var alc = navigator.userAgent.toLowerCase();
		for (var i=0;i<mobileAgents.length;i++)
		{
			if (alc.indexOf(mobileAgents[i])>-1)
				return true;
		}
	}
	catch (ex)
	{
		alert("isMobileDevice: " + ex);
	}
	return false;
}
function isTrue(v)
{
	if (v==null)
		return false;
	if (isNaN(v))
	{
		v = v + "  ";//coerce to string
		return left(v,1)=="t"||left(v,1)=="y"||left(v,2)=="on"||left(v,7)=="checked";
	}
	return Number(v) != 0;
}
function left(s,len)
{
	s = s + "";
	if (s.length<len)
		return s;
	return s.substr(0,len);
}
function lpad(sVal,chFill,nLen)
{
	sVal += "";//coerce to a string
	while (sVal.length <= nLen)
	{
		sVal = chFill + sVal;
	}
	return sVal.substring(sVal.length - nLen, sVal.length);
}

function ltrim(s)
{
	s = " " + s;
	var str = 0;
	while (s.charAt(str) == " " && str < s.length)
		str++;
	return str < s.length ? s.substr(str) : "";
}
function num(v)
{
	if (v == undefined || isNaN(v))
		return 0;
	return Number(v);
}
function numericInput(obj,allowDecimal,allowNegative,errorMsg)
{
	if (! allowNegative && event.keyCode==45)
		event.keyCode = 77;//forces an error
	if (! allowDecimal && event.keyCode==46)
		event.keyCode = 77;//forces an error
	if (event.keyCode != 45 && event.keyCode != 46 && (event.keyCode < 48 || event.keyCode > 57))
	{
		beepMsg(errorMsg);
		event.returnValue = false;
	}
	else
	{
		var v = obj.value;
		if (v==null)
			v = "";
		if (v.length >0)
		{
			if (event.keyCode==45)
				v += "-";
			else if (event.keyCode==46)
				v += ".";
			else
				v += (event.keyCode - 48);
			if (isNaN(v))
			{
				beepMsg(errorMsg);
				event.returnValue = false;
			}
		}
	}
}

function pickDateShow(pickerID)
{//for use with TimePick applet & BaseController.pickTime
	var tp=document.applets[pickerID];
	if (tp.width == 1)
	{
		tp.refreshDate();
		tp.width=182;
		tp.height=128;
	}
	else
	{
		tp.width = 1;
		tp.height = 1;
	}
}

function pickTimeHandler(pickerID,receiverID,newValue)
{//for use with TimePick applet & BaseController.pickTime	
	document.forms[0].elements[receiverID].value = newValue;
	pickDateShow(pickerID);
}

function pickTimeShow(pickerID)
{//for use with TimePick applet & BaseController.pickTime
	var tp=document.applets[pickerID];
	if (tp.width == 1)
	{
		tp.refreshDate();
		tp.width=182;
		tp.height=144;
	}
	else
	{
		tp.width = 1;
		tp.height = 1;
	}
}
function resizeApplet(nAppletIndex,nWidth,nHeight)
{
	if (nAppletIndex < document.applets.length)
	{
		var app=document.applets[nAppletIndex];
		if (app != null)
		{
			app.width=nWidth;
			app.height=nHeight;
		}
	}
}
function right(s,len)
{
	s = s + "";
	if (s.length<len)
		return s;
	return s.substr(s.length - len);
}
function roundFraction(dValue,nFraction)
{
    return Math.round(dValue * nFraction + (dValue>0?.001:0-.001)) / nFraction;
}
function rtrim(s)
{
	s = s + " ";
	var len = s.length;
	while (s.charAt(len) == " " && len > 0)
		len--;
	return len == 0 ? "" : s.substr(0,len-1);
}

function selectAll(objId) 
{   
	try
	{	
		var obj = get(objId);
		if (obj.value > "")
		{
		    if(obj.createTextRange) 
			{//IE style   
				obj.createTextRange().select();   
			} 
			else if(obj.selectionStart) 
			{//Gecko style   
		        obj.focus();   
		        obj.setSelectionRange(0,obj.value.length);   
			}
		}
	}
	catch (e)
	{
		window.status = "Failed to set caret position - " + e;
	}
}  
function setCaretPos(obj, pos) 
{   
	try
	{	
	    if(obj.createTextRange) 
		{//IE style   
			var range = obj.createTextRange();   
	        range.move("character", pos);   
	        range.select();   
		} 
		else if(obj.selectionStart) 
		{//Gecko style   
	        obj.focus();   
	        obj.setSelectionRange(pos, pos);   
		}   	
	}
	catch (e)
	{
		window.status = "Failed to set caret position - " + e;
	}
}  
function setLocation(url)
{
	location=url;
}
function setValue(sName,val)
{
	var obj = get(sName);
	if (undefined == obj.value)
		obj.innerHTML = val;
	else
		obj.value = val;
}
function show(sName)
{
	get(sName).style.display="";
}

function showHide(sName)
{
	return hideShow(sName);
}
function toggleAll(sPfx,bVal)
{//check/uncheck all checkboxes with a name prefix
	var eles =document.forms[0].elements;
    for (i=0; i < eles.length; i++)
    {        
        var ele = eles[i];
        if (ele.name.length > sPfx.length)
        {
            var pfxi = ele.name.substring(0,sPfx.length);
            if (pfxi == sPfx)
                ele.checked = bVal;
        }
    }
}

function toggleBlock(anchorId,spanId)
{
	if (get(spanId).style.display=="none")
	{
		show(spanId);
		get(anchorId).innerHTML = get(anchorId).innerHTML.replace("+","-");
	}
	else
	{
		hide(spanId);
		get(anchorId).innerHTML = get(anchorId).innerHTML.replace("-","+");		
	}
}
function toggleSame(obj)
{//check/uncheck all checkboxes with same name prefix as obj passed
	toggleAll(obj.name,obj.checked);
}
function trim(s)
{
	return ltrim(rtrim(s));
}
function url( /* varargs */)
{
	if (arguments==null || arguments.length==0)
	{
		alert("you must supply arguments to url()");
		return "";
	}
	var s=arguments[0];
	if (arguments.length>1)
	{
		var and="?";
		if (s.indexOf("?")>0)
			and = "&";
		for (var i=1; i<arguments.length;i++ )
		{
			if (i % 2 == 1)
				s += and;
			else
				s += "=";
			s += arguments[i];
			and = "&";
		}
	}
    return s;
}
function wait(bOn)
{	
	document.body.style.cursor = bOn ? "wait" : "default";
}
function writeln(msg)
{
	document.write(msg + "<br>");
}
function xChildText(node,childName)
{
	var c = node.getElementsByTagName(childName);
	if (! c)
		return "?" + childName + "?";
	if (isIE())
		return xNodeText(c[0]);
	return xNodeText(c[0].firstChild);
}
function xDump(node)
{
	var s="";
	s += "\nnodeName=" + node.nodeName;
	s += "\nnodetext=" + xNodeText(node); 
	s += "\nkids=" + node.childNodes.length; 
	for (var i=0;i<node.childNodes.length;i++ )
	{
		var k = node.childNodes[i];
		s += "\nk[" + i + "] " + k.nodeName + "=" + xNodeText(k);
	}
	alert(s);
}
function xGetTopTag(islandName)
{
	if (isIE())
	{
		return get(islandName).XMLDocument;
	}
    else
    {
	   return get(islandName).childNodes[0];
	}
}
function xIsElement(node)
{
	return node.nodeType == 1;
}
function xNodeText(node)
{
	if (! node)
		return "null";	
	if (isIE())
	{
		return node.text;
	}
	else
	{
		var t;
		if (node.firstChild)
			t = node.firstChild.textContent;
		else	
			t = trim(node.textContent);
		if (left(t,7) == "[CDATA[" && right(t,2) == "]]")
		{
			return t.substring(7,t.length - 2);
		}		
		return t;
	}
}
function xpFind(parentNode,expr)
{//returns an array of nodes from passed node
	try
	{
		if (isIE())
		{
			var r = parentNode.selectNodes(expr);
			return r && r.length>0 ? r : null;
		}
	   else
	   {
			var nl = document.evaluate(expr, parentNode, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE,null); 
			var ret = new Array();
			var i=0;
			var node = nl.iterateNext();
			while (node) 
			{               
				ret[i++] = node;
				node = nl.iterateNext(); 
			}
			return ret.length > 0 ? ret : null;
		}
	}
	catch (e)
	{
		alert("xpFind - " + e + "\nexpr='" + expr + "'");
	}
}
function xpFindFirst(parentNode,expr)
{//returns an array of nodes from passed node
	var nl = xpFind(parentNode,expr);
	return nl != null && nl.length > 0 ? nl[0] : "?" + expr + "?";
}
function xpFindFromTop(islandName,expr)
{//returns an array of nodes from top node
	return xpFind(xGetTopTag(islandName),expr);
}
