//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();
	//<EMBED SRC='error.wav' LOOP=FALSE AUTOSTART=TRUE HIDDEN=TRUE MASTERSOUND>
}

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)
{
	e = e || event;
	if(isInternetExplorer())
	{//it is IE
		e.returnValue = false;
		e.cancelBubble = true;
	}
	else
	{//it could be firefox
		e.preventDefault();
		e.stopPropagation();
	}
	return false;
}
function clearSelect(id)
{
	var sb = get(id);
	if (sb.options)
	{
		try
		{
			sb.options.length = 0;
		}
		catch (nevermind)
		{		
		}
		for(var i=sb.options.length - 1;i>=0;i--)
	    {
			sb.options[i] = null;
		}
	}
}
function colorTable(tbl,firstVisibleTrOne)
{
	var cn = firstVisibleTrOne ? 1 : 0;
	for (var i=0;i<tbl.rows.length;i++)
	{
		var tr = tbl.rows[i];
		if (tr.style.display=="none")
			continue;
		tr.className = "tr" + (cn %2);
		cn++;
	}
}
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])
		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) || o.style.display=="none")
				continue;
			o.focus();
			return;
		}
		catch (nevermind)
		{	
		}
	}
}

function get(id)
{
	var o = document.getElementById(id);
	if (o != null)
		return o;
	alert("Element " + id + " not found.");
	return null;
}

function getIfExists(id)
{
	return document.getElementById(id);
}

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;
	if (o.type=="radio")
	{
		var a = document.getElementsByName(o.name);
		for (var i=0;i<a.length;i++)
		{
			if (a[i].checked)
				return a[i].value;
		}
	}	
	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 "";
	}
	else
	{
		hide(sName);
		return "none";
	}
}

var _httpReq;
var _httpUrl;
var _httpCallback;
if (isInternetExplorer()) 
{
	_httpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
	_httpReq = new XMLHttpRequest();
} 

function httpAsync(method,url,callBack) 
{
	try
	{
		if (! isInternetExplorer()) 
			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 (isInternetExplorer())
		{		
			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 insertAtCaret(areaId,text) 
{ 
	var txtarea = typeof(areaId) == "string" ? document.getElementById(areaId) : areaId; 
	var scrollPos = txtarea.scrollTop; 
	var strPos = 0; 
	var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? "ff" : (document.selection ? "ie" : false ) ); 
	if (br == "ie") 
	{
		txtarea.focus(); 
		var range = document.selection.createRange(); 
		range.moveStart ('character', -txtarea.value.length); 
		strPos = range.text.length; 
	} 
	else if (br == "ff") 
		strPos = txtarea.selectionStart; 
	var front = (txtarea.value).substring(0,strPos); 
	var back = (txtarea.value).substring(strPos,txtarea.value.length); 
	txtarea.value=front+text+back; 
	strPos = strPos + text.length; 
	if (br == "ie") 
	{ 
		txtarea.focus(); 
		var range = document.selection.createRange(); 
		range.moveStart ('character', -txtarea.value.length); 
		range.moveStart ('character', strPos); 
		range.moveEnd ('character', 0); range.select(); 
	} 
	else if (br == "ff") 
	{ 
		txtarea.selectionStart = strPos; 
		txtarea.selectionEnd = strPos; 
		txtarea.focus(); 
	} 
	txtarea.scrollTop = scrollPos; 
} 
function isDate(sd)
{
	try
	{
		if (isNaN(new Date(sd)))
		{
			window.status = "invalid date: " + sd;
			return false;
		}
	}
	catch (e)
	{
		return false;
	}
	return true;
}

function isInternetExplorer()
{
	return (window.ActiveXObject != null); 
}
var mobileAgents = ["iphone;","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
	var padTimes = Math.max(0,nLen - sVal.length);
	var sNew="";
	for (var i=0;i<padTimes;i++)
	{
		sNew += chFill;
	}
	return sNew + sVal;
}

function ltrim(s)
{
	s = " " + s;
	var str = 0;
	while (s.charAt(str) == " " && str < s.length)
		str++;
	return str < s.length ? s.substr(str) : "";
}
//
function mdhm()
{
	var d = new Date();
	var w_m_d_y = d.toDateString().split(" ");
	return w_m_d_y[1] + " " + w_m_d_y[2] + "," + lpad(d.getHours(),"0",2) + ":" + lpad(d.getMinutes(),"0",2);
}
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 replaceAll(v,srch,rep)
{
	if (srch.length) 
	{
		for (var i=0;i<srch.length;i++)
		{
			var s = srch[i];			
			var r = rep;
			if (rep.length)
				r = rep[i];
			while (v.indexOf(s) > -1)
				v = v.replace(s,r);
		}
	}
	else
	{
		while (v.indexOf(srch) > -1)
			v = v.replace(srch,rep);
	}
	return v;
}
function replaceLast(ele,srch,rep)
{
	var s = ele.value == undefined ? ele.innerHTML : ele.value;
	var x = s.lastIndexOf(srch);
	if (x > -1)
	{
		s = s.substring(0,x) + rep + s.substring(x+1);
		if (ele.value==undefined)
			ele.innerHTML = s;
		else
			ele.value = s;
	}	
}
function resetTableColors(tblId)
{
	var x=0;
	var tbl = get(tblId);
	for (var i=0;i<tbl.rows.length;i++)
	{
		if (tbl.rows[i].style.display != "none")
		{
			tbl.rows[i].className = "tr" + (x%2);
			x++;
		}
	}
}
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 scrollIntoView(container,element)
{	
	var eh = element.height || 16;
	var ch = container.clientHeight || container.height;
	if (element.offsetTop < container.scrollTop
	|| element.offsetTop + eh > container.scrollTop + ch)
	{
		container.scrollTop = element.offsetTop;
	}
}
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 ses()
{
	var hash = sessionStorage;
	if (hash == null)
	{
		var parent = window.ActiveXObject ? window : navigator;
		if (parent["irutil"]==null)
		{
			parent["irutil"] = {};
		}
		hash = parent["irutil"];
	}
	return hash;
}
function sesGet(k)
{
	return ses()[k];
}
function sesSet(k,v)
{
	ses()[k] = v;
}
function set(id,val)
{
	setValue(id,val);
}
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.href=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/*boolean cond*/)
{
	if (arguments!=null)
	{
		if (arguments.length>1)
		{//condition mode
			if (arguments[1])
				show(sName);
			else
				hide(sName);
			return;
		}
	}
	//toggle mode
	return hideShow(sName);
}
function submitFormZero(sExtraParms)
{
	var frm = document.forms[0];
	if (null == frm)
	{
		window.status = "submitForm: no form.";
	}
	else
	{
		if (sExtraParms + "" > "")
		{
			if (frm.action.indexOf("?")==-1)
				frm.action += "?";
			else
				frm.action += "&";
			frm.action += sExtraParms;
		}
		document.forms[0].submit();
	}
}
function swapRows(tbl,source,target)
{
	if (source==target)
		return;
	if (tbl.moveRow)
	{
		tbl.moveRow(source,target);
	}
	else
	{
		try
		{
			var tb = tbl.tBodies[0];
			var trS = tbl.rows[source];
			var trT = tbl.rows[target];
			if (source == target+1)
			{
				tb.insertBefore(trS,trT);
			}
			else if (target == source + 1)
			{
				tb.insertBefore(trT,trS);
			}
			else
			{
				var tmp = tb.replaceChild(trS,trT);
				if (typeof(trS) == "undefined")
				{
					tb.insertBefore(tmp,trS);
				}
				else
				{
					tb.appendChild(tmp);
				}
			}
		}
		catch (e)
		{
			window.console.log("swapRows(" + source + "," + target + ") : " + e);
		}
	}		
}
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)
{
	var a = get(anchorId);
	if (get(spanId).style.display=="none")
	{
		show(spanId);
		replaceLast(a,"+","-");
		if (a.value)
			a.value = a.value.replace("+","-")
		else
			a.innerHTML = a.innerHTML.replace("+","-");
	}
	else
	{
		hide(spanId);
		replaceLast(a,"-","+");		
	}
}
function toggleSame(obj)
{//check/uncheck all checkboxes with same name prefix as obj passed
	if (typeof(obj)=="string")
		obj = get(obj);
	toggleAll(obj.id,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 += encodeURIComponent(arguments[i]);
			and = "&";
		}
	}
    return s;
}
function val(id)
{
	return getValue(id);
}
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 (isInternetExplorer())
		return xNodeText(c[0]);
	if (c[0].tagName.toUpperCase()==childName.toUpperCase())
		return c[0].textContent;//chrome
	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 (isInternetExplorer())
	{
		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 (isInternetExplorer())
	{
		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 (isInternetExplorer())
		{
			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);
}
function ymd(dt)
{
	return dt.getUTCFullYear() 
		+ "-" 
		+ right("0" + (dt.getMonth()+1),2) 
		+  "-"
		+ right("0" + (dt.getDate()),2);
}
