function Browser() 
{
  //tests the browser
  var ua; 
  var s;
  var i;

  this.isIE    = false;  // Internet Explorer
  this.isNS    = false;  // Netscape
  this.version = null;

  ua = navigator.userAgent;

  s = "MSIE";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isIE = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  s = "Netscape6/";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  // Treat any other "Gecko" browser as NS 6.1.

  s = "Gecko";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = 6.1;
    return;
  }
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
function SendXml(sXml,sUrl)
{
	//generic send xml to server
	var oDoc = new ActiveXObject("MSXML2.DOMDocument.4.0");
	var oXmlHttp = new ActiveXObject("MSXML2.XMLHTTP.4.0");
	
	if (sXml != "")
		oDoc.loadXML(sXml);
	oXmlHttp.open("POST",sUrl,false);
	if (oDoc.xml != "")
		oXmlHttp.send(oDoc);
	else
		oXmlHttp.send()
	
	var sResponse = oXmlHttp.responseText;
	
	//modified by sai on 11/06/2002 to take care of session expired
	if (sResponse.indexOf("Session Expired") > 0){
		parent.document.location.href = "/reload.asp"
		return "";
	}
		
	oDoc = null;
	oXmlHttp = null;
	
	return sResponse;
}
function ReadQueryString(sUrl,sValue)
{
	//can read the out a querystring value
	var iStart = eval(sUrl.indexOf(sValue + "=") + sValue.length + 1);
	if (iStart != -1)
	{
		var iEnd = sUrl.indexOf("&",iStart);
		if(iEnd==-1)
			iEnd = sUrl.length
		var sResult = sUrl.substring(iStart,iEnd);
		return sResult;
	}
	return "";
}

function StringReplace(originalString,findText,replaceText,iAmount)
{
	//Replaces specified text; iAmount can be specified to limit the amount of changes made
	var pos = 0;
	var prepos = 0
	var preString;
	var postString;
	var iCtr = 0;
	var len = findText.length;
	pos = originalString.indexOf(findText);
	while(pos != -1)
	{	
		preString = originalString.substring(0, pos);
		postString = originalString.substring(pos + len, originalString.length);
		originalString = preString + replaceText + postString;
		
		iCtr = iCtr + 1
		prepos = pos + len
		if((iAmount != undefined) && (iAmount != "") && (iAmount != 0) && !(isNaN(iAmount)) && (iAmount >= iCtr))
			pos = -1;
		else
			pos = originalString.indexOf(findText, prepos);
	}
	return originalString;
}

function Blink(Field,Text)
{
	//when called by set interval it causes the text to blink in the field
	if(Field.innerText == "")
		Field.innerText = Text;
	else
		Field.innerText = "";
	return;
}

function addChar(Field,strChar,iLen)
{
	//when called by set interval it the char to be repeated until intLen times
	var strChars = new String(JSTrim(Field.innerText))
	if(strChars.length < iLen)
		Field.innerText = padString(strChars + strChar,iLen," ")
	else
		Field.innerText = padString(strChar,iLen," ")
	return;
}

function ChopLeadingZeros(iValue)
{
	//Trims out any leading zeroes
	var bChop = true;
	var sNum = iValue;
	while (bChop)
	{
		if (sNum.indexOf("0") == 0)
		{
			sNum = sNum.substring(1,sNum.length);
			bChop = true;
		}
		else
			bChop = false;
	}
	return parseInt(sNum);
}

function LoadChildren(sParentXml,sChildXml)
{
	//loads the child xml into the parent xml
	var oDocOld = new ActiveXObject("MSXML2.DOMDocument.4.0");
	var oDocNew = new ActiveXObject("MSXML2.DOMDocument.4.0");
	oDocOld.loadXML (sParentXml);
	if (oDocNew.loadXML(sChildXml) && (oDocNew.xml != ""))
	{
		var oNewNodes = oDocNew.selectNodes("//index");
		for (var iCtr = 0; iCtr <= (oNewNodes.length - 1); iCtr++)
		{
			var oNewIndex = oNewNodes.item(iCtr);
			var strIndexId = oNewIndex.selectSingleNode("@id").text;
			var oNewListNode = oNewIndex.selectSingleNode("list");
			
			var oOldIndex = oDocOld.selectSingleNode("//index[@id='" + strIndexId + "']")		
			if (oOldIndex != null)
			{
				var oOldListNode = oOldIndex.selectSingleNode("list")
				if (oOldListNode == null )
					oOldIndex.appendChild(oNewListNode);
				else
					oOldIndex.replaceChild(oNewListNode, oOldListNode);
				oOldListNode = null;
			}
			oOldIndex = null
			oNewListNode = null;
			oNewIndex = null;
		}
		oNewNodes = null;
		oDocNew = null;
		var sNewXml = oDocOld.xml;
		oDocOld = null;
		return sNewXml;
	}
	oDocNew = null;
	oDocOld = null;
	alert("Error loading lists based on value selected");
	return "";
}

function RemoveChildren(sParentXml,sChildXml)
{
	//Removes the child xml from the parent xml
	var oDocOld = new ActiveXObject("MSXML2.DOMDocument.4.0");
	var oDocNew = new ActiveXObject("MSXML2.DOMDocument.4.0");
	oDocOld.loadXML (sParentXml);
	if (oDocNew.loadXML(sChildXml))
	{
		if (oDocNew.xml != "")
		{
			var oNewNodes = oDocNew.firstChild.childNodes;
			var oOldNodes = oDocOld.selectNodes("//index");
			for (var iCtr = 0; iCtr <= (oNewNodes.length - 1); iCtr++)
			{
				var oNewIndex = oNewNodes.item(iCtr);
				var strIndexId = oNewIndex.attributes.getNamedItem("id").text;
				var oNewListNode = oNewIndex.firstChild;
					
				for (var iCtr2=0; iCtr2 <= (oOldNodes.length - 1); iCtr2++)
				{
				    var oOldIndex = oOldNodes.item(iCtr2);
				    if (oOldIndex.attributes.getNamedItem("id").text == strIndexId)
					{					        
				        var oOldListNode = oOldIndex.selectSingleNode('./list');
				        if (oOldListNode != null )
				        {
							for(var iCtr3 = 0;iCtr3 <= (oOldListNode.childNodes.length - 1); iCtr3++)
							{
								oOldListNode.removeChild(oOldListNode.childNodes.item(iCtr3));
								iCtr3 = iCtr3 - 1
							}
						}
						iCtr2 = oOldNodes.length - 1;
						oOldListNode = null;
						
				    }
				    oOldIndex = null;
				}
				oNewIndex = null;
				oNewListNode = null;
			}
			oNewNodes = null;
			oOldNodes = null;
			oDocNew = null;
			var sNewXml = oDocOld.xml;
			oDocOld = null;
			return sNewXml;
		}
	}
	oDocNew = null;
	oDocOld = null;
	alert("Error loading lists based on value selected");
	return "";
}

function Sleep(iWake)
{
	//waits until iWake has passed
	for(var iCtr=0;iCtr > iWake;iCtr++)
	{
	}
	return;
}

function ValidateKeys(DataType)
{
	//checks the value of the keys as they are entered
	
	var intPressedKey = window.event.keyCode
	switch(DataType){
	case "date":
	    if ( (intPressedKey >= 48 && intPressedKey <= 57)
	      || (intPressedKey == 13)
	      || (intPressedKey == 32)
	      || (intPressedKey == 45)
	      || (intPressedKey == globalDateSep.charCodeAt(0)) )
			searchcriterialchanged = true;
		else
			window.event.keyCode = 0;
		break;
	case "datetime":
	    if ( (intPressedKey >= 48 && intPressedKey <= 57)
	      || (intPressedKey == 13)
	      || (intPressedKey == 32)
	      || (intPressedKey == 45)
	      || (intPressedKey == globalDateSep.charCodeAt(0))
	      || (intPressedKey == globalTimeSep.charCodeAt(0)) ) {
			searchcriterialchanged = true;
			break;
	    }
	    if (globalTime12H) {
	        // Check for AM/PM and force uppercase
            if (intPressedKey == 65 || intPressedKey == 77 || intPressedKey == 80) {
                searchcriterialchanged = true;
                break;
            }
            if (intPressedKey == 97 || intPressedKey == 109 || intPressedKey == 112) {
                window.event.keyCode = intPressedKey - 32;
                searchcriterialchanged = true;
                break;
            }
	    }
	    window.event.keyCode = 0;
		break;
	case "integer":
		if ( (intPressedKey >= 48 && intPressedKey <= 57)
		  || (intPressedKey == 13)
		  || (intPressedKey == 45) )
			searchcriterialchanged = true;
		else
			window.event.keyCode = 0;
		break;
	case "float":
		if ( (intPressedKey >= 48 && intPressedKey <= 57)
		  || (intPressedKey == 13)
		  || (intPressedKey == 45)
		  || (intPressedKey == 46) )
			searchcriterialchanged = true;
		else
			window.event.keyCode = 0;
		break;
	case "currency":
		if ( (intPressedKey >= 48 && intPressedKey <= 57)
		  || (intPressedKey == 13)
		  || (intPressedKey == 45)
		  || (intPressedKey == 46)
		  || (intPressedKey == 36) )
			searchcriterialchanged = true;
		else
			window.event.keyCode = 0;
		break;
	default:
		searchcriterialchanged = true;
		break;
	}
	return;
}

function CheckValueChange(sParentXml,index,value){
	//checks if a value has changed from what the Parent Xml holds or not 
	var idx = new String(index);
	var sub_index = "value";
	var blnFound = true;
	if (sParentXml.length == 0) return false;
	if (idx.indexOf("wf_dt_") >= 0){
		sub_index = "workflow_datetime"
		index = idx.substring(6, index.length)
	}
	else if (idx.indexOf("wf_st_") >= 0){
		sub_index = "workflow_status"
		index = idx.substring(6, index.length)
	}
	var oDoc = new ActiveXObject("MSXML2.DOMDocument.4.0");
	oDoc.loadXML(sParentXml);
	var oNodes = oDoc.selectNodes("//indexes/index");
	for(var iCtr=0;iCtr <= (oNodes.length - 1);iCtr++){
		var oIndex = oNodes.item(iCtr);
		if (oIndex.attributes.getNamedItem("id").text == index){
			for (var lCtr=0;lCtr < oIndex.childNodes.length;lCtr++){
				if (oIndex.childNodes.item(lCtr).nodeName == sub_index){
					if (oIndex.childNodes.item(lCtr).text == value)
						blnFound = false;
				}
			}
		}
	}
	oIndex = null;
	oNodes = null;
	oDoc = null;
	return blnFound;
}

function JSTrim(iValue)
{
	//Trims out any leading zeroes
	var bChop = true;
	var sNum = iValue;
	if ((sNum == undefined) ||(sNum=="")||(sNum == "undefined"))
	{
		sNum = "";
		return sNum;
	}
	while (bChop)
	{
		if (sNum.indexOf(" ") == 0)
		{
			sNum = sNum.substring(1,sNum.length);
			bChop = true;
		}
		else
		{
			if (sNum.substring(sNum.length-1,sNum.Length)==" ")
			{
				sNum = sNum.substring(0,sNum.length - 1);
				bChop = true;
			}
			else
				bChop = false;
		}
	}
	return sNum;
}

function padString(strBase,intLen,strChar)
{	
	//pads a string with a given character if the string length is less than intLen
	if (strBase.length >= intLen)
		return strBase;
	else
		return strBase + createString(strChar,(intLen - strBase.length));
}

function createString(strChar,intLen)
{
	//returns a string of chars of the requested length
	var strNewString = new String()
	for(var iCtr = 1; iCtr < intLen; iCtr++)
		strNewString = strNewString + strChar
	return strNewString;
}

function lTrim(iValue)
{
	//Trims out any spaces from both the left and right
	var bChop = true;
	var sNum = iValue;
	if ((sNum == undefined) ||(sNum=="")||(sNum == "undefined"))
	{
		sNum = "";
		return sNum;
	}
	while (bChop)
	{
		if (sNum.indexOf(" ") == " ")
		{
			sNum = sNum.substring(1,sNum.length);
			bChop = true;
		}
		else
		{
			if (sNum.substring(sNum.length-1,sNum.Length)==" ")
			{
				sNum = sNum.substring(0,sNum.length - 1);
				bChop = true;
			}
			else
				bChop = false;
		}
	}
	return sNum;
}

function createSessionVariable(name,value)
{
	var strXml = '<variable><name>' + name + '</name><value>' + value + '</value></variable>';
	var strRet = SendXml(strXml,'/includes/SessionVariableCreator.asp')
	if (strRet.toLowerCase() == 'success')
	{
		return true;
	}
	else
	{
		return false;
	}
}

function createXMLSessionVariable(name,value){
	var strXml = '<variable><name>' + name + '</name><value>' + value + '</value></variable>';
	var strRet = SendXml(strXml,'/includes/XMLSessionVariableCreator.asp')
	if (strRet.toLowerCase() == 'success')
	{
		return true;
	}
	else
	{
		return false;
	}
}

function JSReplace(stringToSearch,searchString,replaceString,ignoreCase,replaceAll)
{
	var strFlags='';
	var strNewString = new String();
	
	if (ignoreCase != true)
	{
		ignoreCase = false;
	}
	if (replaceAll != true)
	{
		replaceAll = false;
	}
	if (ignoreCase)
	{
		strFlags = 'i';
	}
	if (replaceAll)
	{
		strFlags = 'g' + strFlags;
	}
	searchString = searchString.replace(/\\/gi,"\\\\")
	searchString = searchString.replace(/\*/gi,"\\*")
	searchString = searchString.replace(/\$/gi,"\\$")
	searchString = searchString.replace(/\+/gi,"\\+")
	searchString = searchString.replace(/\?/gi,"\\?")
	searchString = searchString.replace(/\./gi,"\\.")
	var regCommonExpression = new RegExp(searchString,strFlags)
	strNewString = stringToSearch.replace(regCommonExpression,replaceString);
	return strNewString;
}

function endSession()
{
	SendXml("","EndSession.asp")
}

function enterOnButton(button)
{
	if ((event.keyCode == 32)||(event.keyCode == 13))
	{
		event.keyCode = 0;
		button.click();
	}
}

function createXmlEscapedString(valueString)
{
	valueString = new String(valueString)
	var strRet = "concat(";
	var strPrev = "";
	var strNext = "";
	var intCharPos = valueString.indexOf("'");
	var intLastPos = -1;
	if (intCharPos == -1)
	{
		return "'" + valueString + "'";
	}
	while ((intCharPos != -1)&&(intCharPos <= valueString.length)&&(intCharPos > intLastPos))
	{
		strPrev = valueString.substring(intLastPos,intCharPos);
		strRet = strRet + "'" + strPrev + "',\"'\",";
		intLastPos = intCharPos + 1;
		intCharPos = valueString.indexOf("'",intLastPos);
		if ((intCharPos == -1)||(intCharPos > valueString.length)||(intCharPos <= intLastPos))
		{
			strNext = valueString.substring(intLastPos,valueString.length);
			strRet = strRet + "'" + strNext + "')"
		}
	}
	return strRet;
}

function ReplaceSpclChars(sValue)
{
	var sTemp
	sTemp = sValue;
	sTemp = JSReplace(sTemp,'–','-',true,true);  // careful, the one on the left is a "long dash" from Microsoft Word.
	sTemp = JSReplace(sTemp,'“','"',true,true);
	sTemp = JSReplace(sTemp,'”','"',true,true);
	sTemp = JSReplace(sTemp,'‘',"'",true,true);
	sTemp = JSReplace(sTemp,'’',"'",true,true);
	return sTemp;
}

//limit text in textarea controls - use this onKeyUp event
function textLimit(field, maxlen) 
{
	//if (field.value.length > maxlen + 1)
	//alert('your input has been truncated!');
	if (field.value.length > maxlen)
	{
		field.value = field.value.substring(0, maxlen);
	}	
}

function isXP()
{
	var strUserAgent = '';
	var strOS = '';
	var lngVersion = 0;
	
	try
	{
		strUserAgent = navigator.userAgent;
		if (/(Windows NT ([\d\.]+))/i.test(strUserAgent) ) {
			strOS = new String(RegExp.$1);
			lngVersion = new Number(RegExp.$2);
			//alert(strOS + '\n' + lngVersion);
		}
	}
	catch(errObject)
	{
		lngVersion = 0;
	}
			
	// 4.x is Win95/98/ME, 5.0 is Win2000, 5.1 is WinXP, 5.2 is Win2003, 6.0 is Vista
	if (lngVersion > 5)
		return true;
	else
		return false;
}

var libExportWin;
function callExport(sUrl) {

	var sFeatures = 'width=1,height=1,top=4000,left=4000,location=no,menu=no,resizable=no,scrollbars=no,status=no,titlebar=no,toolbar=no';

	// First make sure that some other frame doesn't already have an export window open
	// If they do, we might get the MSIE "for your protection" bar in the popup window.
	libExportWin = window.open('/blank.asp', 'gfrExport', sFeatures);
	libExportWin.close();

	// Now open it for real
	libExportWin = window.open(sUrl, 'gfrExport', sFeatures);
	try { libExportWin.resizeTo(1,1) } catch(e) {}
	try { libExportWin.moveTo(4000,4000) } catch(e) {}

}

function closeExport() {
	try {
		if (libExportWin != undefined && !libExportWin.closed) {
			libExportWin.close();
			if (!libExportWin.closed)
				window.setTimeout("closeExport()", 500);
		}
	}
	catch (e) { }
}

function callExport_OLD(sUrl) {

  var frm = document.getElementById('frmExport');
  if (frm == null) {
    frm = document.createElement('iframe');
    frm.id = 'frmExport';
    frm.src = 'javascript:';  // specify "empty" src, or else https will give a warning about Insecure Items On The Page
    frm.style.display = 'none';
    document.body.appendChild(frm);
  }
  window.frames('frmExport').location.replace(sUrl);
  frm = null;

}

function getLookupValuesCriteria(sFormField) {

	var strValue = document.getElementsByName(sFormField).item(0).value
	
	if (strValue == '')
		strValue = '*';
	
	var sValue = ''
	var newvalXML = ''
	
	var sValues = new String(strValue)
	
    var iStartIndex = 0
    var iEndIndex = 1
    var iNextIndex = 1
    var cntValues = 0
    
    while (iNextIndex != -1)
    {
		iNextIndex = sValues.indexOf('",', iStartIndex);
		if (iNextIndex == -1)
		{
		    sValue = sValues.substring(iStartIndex, sValues.length);
		    if (sValue.charAt(0) == '"') sValue = sValue.substr(1)
		    if (sValue.length >0)
		    {			            
				if (sValue.charAt(sValue.length-1) == '"') sValue = sValue.substr(0, sValue.length - 1)
				if (sValue.substring(sValue.length-1, sValue.length) != '*')
				{
					sValue += '*';
				}
				newvalXML += sValue 
			}	
		}
		else
		{      
			iEndIndex = iNextIndex;
			sValue = sValues.substring(iStartIndex+1, iEndIndex);
			if (sValue.substring(sValue.length-1, sValue.length) != '*')
			{
				sValue += '*';
			}
			newvalXML += sValue  + '",';
				
			iNextIndex = sValues.indexOf('"', iEndIndex+1);
			if (iNextIndex > -1) 
			iStartIndex = iNextIndex;
		}			
		cntValues++;
    }

    return newvalXML

}

function getXSL(url)
{
	var objXSLOut = new ActiveXObject("MSXML2.DOMDocument.4.0");
	objXSLOut.async = false;
	objXSLOut.loadXML(getXSLText(url));
	return objXSLOut;
}

function getXSLText(url)
{
	var objXSL = new ActiveXObject("MSXML2.XMLHTTP.4.0");
	objXSL.open("GET", url, false);
	objXSL.send();
	return objXSL.responseText;
}

function getXSLTextEx(strXSLPath)
{
	var oXML  =  new ActiveXObject("MSXML2.DOMDocument.4.0");
	oXML.async = false;

	oXML.loadXML(getXSLText(strXSLPath));

	try
	{
		replaceXSLInclude(oXML);
	}
	catch(e){alert(e.message);}

	return oXML.xml.replace(/\xA0/gi,"&#160;");
}

function replaceXSLInclude(oXML)
{
	oXML.setProperty("SelectionLanguage", "XPath");
	oXML.setProperty("SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");

	var oNodes = oXML.selectNodes("//xsl:include");
	var oPreviousNode = null;
	
	for (var i = 0; i < oNodes.length; i++)
	{
		var oNode= oNodes[i];	
		var oIncludeXML = new ActiveXObject("MSXML2.DOMDocument.4.0");
		
		oIncludeXML.async = false;
		try
		{
			oIncludeXML.loadXML(getXSLText(oNode.selectSingleNode("./@href").text));
			replaceXSLInclude(oIncludeXML);
			oIncludeXML.setProperty("SelectionLanguage", "XPath");
			oIncludeXML.setProperty("SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");

			oPreviousNode = oNode.nextSibling;
			var oParentNode = oNode.parentNode;
			var oTempNodes = oIncludeXML.selectNodes('/*/*'); 
			for (var j = 0; j < oTempNodes.length; j++)
			{
				var oTempNode = oTempNodes[j];
				oParentNode.insertBefore(oTempNode, oPreviousNode);
			}
			oParentNode.removeChild(oNode);
		}
		catch(e) 
		{
			alert(e.message);
		}
	}
}	

function trim(value)
{
	var ret = value;
	try
	{
		ret = ret.replace(/^\s+/, "").replace(/\s+$/, "");
	} catch(ex) {}
	return ret;
}

function cancelEvents(e)
{
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

function showtip(current,e,text) {
	if (document.all||document.getElementById) {
		thetitle=text.split('<br>')
		if (thetitle.length>1) {
			thetitles=''
			for (i=0;i<thetitle.length;i++)
				thetitles+=thetitle[i]
			current.title=thetitles
		} else {
			current.title=text
		}
	} else if (document.layers) {
		document.tooltip.document.write('<layer bgColor="white" style="border:1px solid black;font-size:12px;">'+text+'</layer>')
		document.tooltip.document.close()
		document.tooltip.left=e.pageX+5
		document.tooltip.top=e.pageY+5
		document.tooltip.visibility="show"
	}
}

function hidetip() {
	if (document.layers)
		document.tooltip.visibility="hidden"
}

