/*
 *	TITLE:	global.js
 *	VER:	1.0
 *  AUTHOR:	David Pattison
 *	DATE:	10/03/2004
 */

/*
 * Global variables
 */
QueryString.keys = new Array();
QueryString.values = new Array();
var bPostComplete=true;

/*
 * Return value from &KEY=VALUE pair
 */
function QueryString(key)
{
	var value = null;
	for (var ii=0;ii<QueryString.keys.length;ii++)
	{
		if (QueryString.keys[ii]==key)
		{
			value = QueryString.values[ii];
			break;
		}
	}
	return value;
}

/*
 * Break query string into &KEY=VALUE pairs
 */
function QueryString_Parse()
{
	var query = window.location.search.substring(1);
	var pairs = query.split("&");
	
	for (var ii=0;ii<pairs.length;ii++)
	{
		var pos = pairs[ii].indexOf('=');
		if (pos >= 0)
		{
			var argname = pairs[ii].substring(0,pos);
			var value = pairs[ii].substring(pos+1);
			QueryString.keys[QueryString.keys.length] = argname;
			QueryString.values[QueryString.values.length] = value;		
		}
	}
}

/*
 * Add xml in specified file as a root node
 * if root node already exists, add it as a child node
 * in xmlRef 
 */
function xmlClone(strXmlPath, xmlRef)
{
	var xmlNewNode;
	try
	{
		var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		var xmlNode;
		var xmlRoot;
		
		xmlDoc.async="false";
		xmlDoc.load(strXmlPath);
	     		
		if( xmlDoc.parseError != 0 )
		{
			throw xmlDoc.parseError;
		}

		xmlRoot = xmlDoc.documentElement;
	 
		// If xml is empty, load at root
		// otherwise load at child.
		if( xmlRef.firstChild == null )
		{
			xmlRef.load(xmlDoc);
			xmlNewNode=xmlRef.documentElement;
		}
		else
		{
			xmlNewNode=xmlRoot.cloneNode(true);
			xmlNode = xmlRef.documentElement;	
			xmlNode.appendChild(xmlNewNode);
		}
 	}
	catch(err)
	{
	}
	return xmlNewNode;
}

/*
 * Prompt to confirm element delete
 * Assumptions: The delete actions is originated from an event which 
 * is tied a record in a table
 */
function ConfirmDelete(xmlRef, strElement)
{
	try
	{
		var xmlSel = GetSelObject(xmlRef, strElement);
		if (xmlSel != null)
		{
			var strSelName = xmlSel.firstChild.nodeTypedValue;
			var nConfirm = confirm(GetLocaleMessage("DELCONF", strSelName));

			if( nConfirm == true)
			{
				return xmlSel;
			}
			else
			{
				InsertMessage("DELCAN", strSelName);
			}
		}
		else
		{
			alert(GetLocaleMessage("DEPNULL", "delete"));
			InsertMessage("DEPNULL", "delete");
		}
	}
	catch(err)
	{
		LocaleAlertMessage("doConfirmDelete()", err);
	}
	return null;
}

/*
 * copy server entry
 */
function doCopy(xmlRef, strElement)
{
	try
	{
		// get the existing value
		var xmlSel = GetSelObject(xmlRef, strElement);
		var text="<server>";
		text = text + "<name>" + xmlSel.selectSingleNode("name").nodeTypedValue +"</name>";
		text = text + "<addr>" + xmlSel.selectSingleNode("addr").nodeTypedValue +"</addr>";
		text = text + "<port>" + xmlSel.selectSingleNode("port").nodeTypedValue +"</port>";
		text = text + "</server>";
		
		// Create a new node with existing value
		var xmlNew = new ActiveXObject("Microsoft.XMLDOM");
		xmlNew.loadXML(text);

		// add the new node to the list
		var xmlRoot = xmlRef.documentElement;
		xmlRoot.appendChild(xmlNew.documentElement);

		InsertMessage("CPYOK", xmlSel.selectSingleNode("name").nodeTypedValue);
	}
	catch(err)
	{
		LocaleAlertMessage("doCopy()", err);
	}

	return null;
}

/*
 * POST xmlRef to the server for processing
 * return post status
 */
 
function doPostXml(xmlRef, bAsync, fComplete)
{
	var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	
    // don't allow multiple posts if there is already an asynchronous post in
    // progress, except if this is a synchronous request
    if( bAsync && !bPostComplete )
	{
		InsertMessage("DEPCAN", "" );
		return;
	}
	
	function UpdatePostStatus()
	{
		var xmlResponse=xmlHttp.ResponseXml;
		
		if (xmlHttp.readyState == 4)
		{
			if( xmlHttp.status != 200 )
			{
				InsertMessage("ERROR", xmlHttp.statusText );
			}
			if (xmlStatus != null )
			{
				InsertXMLMessage(xmlResponse);
			}
			document.body.style.cursor = "";
			bPostComplete=true;
			
			if( fComplete!=null )
			{
				fComplete(xmlResponse);
			}
		}
		else
		{ 
			bPostComplete=false;
			document.body.style.cursor = "wait";
		}
	}

	try
	{
		xmlHttp.Open("POST", "PostXml.asp", bAsync);
		xmlHttp.onreadystatechange = UpdatePostStatus;
		xmlHttp.Send(xmlRef);
	}
	catch(err)
	{
		LocaleAlertMessage("doPostXml()", err);
	}
}

/*
 * return element selected from a detail row
 */
function GetSelObject(xmlRef, strElement)
{
	var xmlSelObject=null;
	var xmlSelNodes=null;
	try
	{
		var xmlRoot = xmlRef.documentElement;
		var nRecord = GetSelByNumber();
		
		if( nRecord >= 0 )
		{
			xmlSelNodes=xmlRoot.getElementsByTagName(strElement);
			if (xmlSelNodes.length > 0)
			{
				xmlSelObject = xmlSelNodes(nRecord);
			}
		}
	}
	catch(err)
	{
		LocaleAlertMessage("GetSelObject()", err);
	}
	return xmlSelObject;
}

/*
 * return detail occurance selected
 */
function GetSelByNumber()
{
	var nRecNumber;
	try
	{
		var eElement = event.srcElement;
		nRecNumber = eElement.recordNumber - 1;
		
		if( nRecNumber < 0 )
		{
			nRecNumber=-1;
		}
	}
	catch(err)
	{
		LocaleAlertMessage("GetSelByNumber()", err);
		nRecNumber=-1;
	}
	return nRecNumber;
}

/*
 * Insert string/value pair into status xml
 */
function AddStatusElement(strFrom, strMsg, strText)
{
	try
	{
		if( xmlStatus != null )
		{
			var xmlRoot=xmlStatus.documentElement;
	
			var newElement=xmlStatus.createElement("status");
			var newFromText=xmlStatus.createElement("from");
			var newMsgText=xmlStatus.createElement("message");
			var newMsgTag=xmlStatus.createElement("tag");
	
			newFromText.nodeTypedValue=strFrom;
			newMsgTag.nodeTypedValue=strMsg;
			newMsgText.nodeTypedValue=strText;
	
			newElement.appendChild(newMsgTag);
			newElement.appendChild(newMsgText);
			newElement.appendChild(newFromText);
	
			// replace empty elements, otherwise insert
			var xmlFirstStatus=xmlRoot.firstChild;
			var strFirstFrom=xmlFirstStatus.selectSingleNode("from").nodeTypedValue;
	
			if( strFirstFrom != "" )
			{
				xmlRoot.insertBefore(newElement, xmlFirstStatus);
			}
			else
			{
				xmlRoot.replaceChild(newElement, xmlFirstStatus);
			}
		}
	}
	catch(err)
	{
		LocaleAlertMessage("AddStatusElement()", err);
	}
}

/*
 * Insert Load msg tag from Local table and add to status xml
 */
function InsertMessage(strFrom, strMsg)
{
	try
	{
		if( xmlStatus != null )
		{
			var strText=GetLocaleMessage(strFrom, strMsg);
			AddStatusElement(strFrom, strMsg, strText);
		}
	}
	catch(err)
	{
		LocaleAlertMessage("InsertMessage()", err);
	}
}

/*
 * Copy status msg from Local table and add to status xml
 */
function InsertXMLMessage(xmlDoc)
{
	try
	{		
		if( xmlStatus != null )
		{
			var xmlRoot  = xmlStatus.documentElement;
		
			if( xmlDoc.documentElement != null )
			{
				var xmlNodes = xmlDoc.documentElement.selectNodes("status");
		
				// scan each message
				for (ii=0; ii<xmlNodes.length; ii++)
				{
					var xmlMsgNode=xmlNodes[ii];
					var strMsgId=xmlMsgNode.selectSingleNode("from").nodeTypedValue;
					var strMsgTag=xmlMsgNode.selectSingleNode("tag").nodeTypedValue;

					InsertMessage(strMsgId, strMsgTag);
				}
				NavigatePage("FIRST", tblStatus);
			}
		}
	}
	catch(err)
	{
		LocaleAlertMessage("InsertXMLMessage()", err);
	}
	
}

/*
 * Display a localised alert message
 */
function LocaleAlertMessage(strFuncName, err)
{
	var strMsg=GetLocaleMessage("ERROR", strFuncName);
	alert(strMsg+" : "+err.description);
}

/*
 * Navigation buttons on tblStatus
 */
function NavigatePage(strType, tblData)
{
	try
	{
		switch(strType.toUpperCase())
		{
			case "FIRST":
				tblData.firstPage();
				break;

			case "LAST":
				tblData.lastPage();
				break;

			case "NEXT":
				tblData.nextPage();
				break;

			case "PREVIOUS":
				tblData.previousPage();
				break;
		}
	}
	catch (err) 
	{
		//LocaleAlertMessage("NavigatePage()", err);
	}
}

/*
 * catch right click event and warn user
 * only needed if we want to hide the source code

function rtclickcheck(keyp)
{
	var mymessage = "Source view is disabled";
	if (document.layers && keyp.which != 1)
	{
		alert(mymessage);
		return false;
	}

	if (document.all && event.button != 1)
	{ 
		alert(mymessage);
		return false;
	}
}

if (document.layers)
{
	document.captureEvents(Event.MOUSEDOWN);
}

document.onmousedown = rtclickcheck;
 */
QueryString_Parse();
