function FullPath(url)
{
	return window.location.href.replace(window.location.pathname, url);
}

// The code used here is iMac 2.0.4 / Safari compliant
function responseRecordID(request)
{
	return parseInt(request.responseXML.firstChild.attributes.getNamedItem("record_id").nodeValue, 10);
}
	
// The code used here is iMac 2.0.4 / Safari compliant
function responseErrors(request)
{
	return parseInt(request.responseXML.firstChild.attributes.getNamedItem("errors").nodeValue, 10);
}

// The code used here is iMac 2.0.4 / Safari compliant
function responseReturnValue(request)
{
	return request.responseXML.firstChild.attributes.getNamedItem("returnvalue").nodeValue;
}

function responseMessage(request)
{
	var nsResolver,
		evaluator,
		message, 
		results,
		xmlDoc;
	
	if (typeof(request.responseXML.text) != "undefined")
		message = request.responseXML.text;
	else
	{
		evaluator = new XPathEvaluator();
		xmlDoc = request.responseXML;
		nsResolver = evaluator.createNSResolver(xmlDoc.ownerDocument == null ? xmlDoc.documentElement : xmlDoc.ownerDocument.documentElement);
		results = evaluator.evaluate("response/message", xmlDoc, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
		message = results.singleNodeValue.firstChild.nodeValue; 
    }
    return message;
}

function responseError(request)
{
	var nsResolver,
		evaluator,
		message, 
		results,
		xmlDoc;
	
	if (typeof(request.responseXML.text) != "undefined")
		message = request.responseXML.text;
	else
	{
		evaluator = new XPathEvaluator();
		xmlDoc = request.responseXML;
		nsResolver = evaluator.createNSResolver(xmlDoc.ownerDocument == null ? xmlDoc.documentElement : xmlDoc.ownerDocument.documentElement);
		results = evaluator.evaluate("response/error", xmlDoc, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
		message = results.singleNodeValue.firstChild.nodeValue; 
    }
    return message;
}

function XmlHttpResponseID(xmlHttp, object, append)
{
	var styleSheet,
		innerHTML,
		recordID,
		errors,
		url;
	
	if (xmlHttp.status != 200)
	{
		if (object)
			object.style.backgroundColor = "white";
		innerHTML = xmlHttp.responseText;
		recordID = -1;
	}
	else
	{
		if ((styleSheet = XmlHttpObject()) != null)
		{
			url = FullPath(sVRoot + "/RS/Common/Client/IE/XmlHttpResponse.xsl");
			styleSheet.open("GET", url, false);
			styleSheet.send();
			if (styleSheet.status == 200)
			{
				innerHTML = TransformNode(xmlHttp.responseXML, styleSheet.responseXML);
				// attribute MUST exist
				if ((errors = responseErrors(xmlHttp)) == 0)
					recordID = responseRecordID(xmlHttp);
				else
					recordID = -1;
			}
			else
			{
				if (object)
					object.style.backgroundColor = "white";
				innerHTML = styleSheet.responseText;
				recordID = -1;
			}
		}
	}
	if (object && append)
		object.innerHTML += innerHTML;
	else
		object.innerHTML = innerHTML;

	return recordID;
}

function XmlHttpResponse(xmlHttp, object, append)
{
	var styleSheet,
		innerHtml,
		errors,
		url;
		
	if (xmlHttp.status == 200)
	{
		if ((errors = responseErrors(xmlHttp)) > 0)
		{
			if ((styleSheet = XmlHttpObject()) != null)
			{
				url = FullPath(sVRoot + "/RS/Common/Client/IE/XmlHttpResponse.xsl");
				styleSheet.open("GET", url, false);
				styleSheet.send(null);
				if (styleSheet.status == 200)
					innerHtml = TransformNode(xmlHttp.responseXML, styleSheet.responseXML);
				else
					innerHtml = styleSheet.responseText;
			}
		}
		else
			innerHtml = ""; //xmlHttp.responseXML.responseText;
		if (object && innerHtml.length != 0)
		{
			if (append)
				object.innerHTML += innerHtml;
			else
				object.innerHTML = innerHtml;
		}
	}
	else
	{
		if (object)
		{
			object.style.backgroundColor = "white";
			if (append)
				object.innerHTML += xmlHttp.responseText;
			else
				object.innerHTML = xmlHttp.responseText;
		}
		errors = 1;
	}
	return errors;
}

function XmlHttpObject()
{
	var xmlHttp;
	try
	{
		xmlHttp = new XMLHttpRequest();
	}
	catch (e)
	{
		try
		{
			xmlHttp = new ActiveXObject("MSXML2.XmlHttp");
		}
		catch (e)
		{
			try
			{
				xmlHttp = new ActiveXObject("Microsoft.XmlHttp");
			}
			catch (e)
			{
				xmlHttp = null;
			}
		}
	}
	return xmlHttp;
}

function TransformNode(responseXML, xslRef) 
{
	try
	{
		return responseXML.transformNode(xslRef);
	}
	catch (mozilla)
	{
		var processor,
			fragment;
			
		processor = new XSLTProcessor();
		processor.importStylesheet(xslRef);
		
		fragment = processor.transformToDocument(responseXML);
		return fragment.documentElement.innerHTML; 
	}
}

function TransformResponse(responseXML, xsltPath)
{
	var xsltObject;
	
	if ((xsltObject = XmlHttpObject()) != null)
	{
		xsltObject.open("GET", xsltPath, false);
		xsltObject.send(null);
		if (xsltObject.status == 200)
			return TransformNode(responseXML, xsltObject.responseXML);
		else
			return responseXML.responseText;
	}
}

function TransformToElement(div, responseXML, xsltPath)
{
	var xsltObject;
	
	if ((xsltObject = XmlHttpObject()) != null)
	{
		xsltObject.open("GET", xsltPath, false);
		xsltObject.send(null);
		if (xsltObject.status == 200)
			TransformNodeToElement(div, responseXML, xsltObject.responseXML);
		else
			div.innerHTML = responseXML.responseText;
	}
}

function TransformNodeToElement(div, responseXML, xslRef) 
{
	try
	{
		div.innerHTML = responseXML.transformNode(xslRef);
	}
	catch (mozilla)
	{
		var processor,
			fragment;
			
		processor = new XSLTProcessor();
		processor.importStylesheet(xslRef);
		
		fragment = processor.transformToFragment(responseXML, document);
		div.appendChild(fragment);
	}
}

function GetFirstError(xml)
{
	var node;
	
	if ((node = xml.selectSingleNode("//errors/@count")) != null)
	{
		if (parseInt(node.text, 10) > 0)
			return doc.xml;
	}
	return null;
}

function selectNodes(contextNode, xpath)
{
	try
	{
		return contextNode.selectNodes(xpath);
	}
	catch (mozilla)
	{
		var document,
			resolver,
			result,
			node,
			list;

		if (contextNode.nodeType != 9)
			document = contextNode.ownerDocument;
		else
			document = contextNode;
		resolver = document.createNSResolver(document.documentElement);
		result = document.evaluate(xpath, contextNode, resolver, 0, null);
		list = [];
		while (node = result.iterateNext()) 
			list.push(node);
		return list;
	}
}

function evaluateXPath(contextNode, xpath)
{
	var value = null;
	try
	{
		var node;
		if ((node = contextNode.selectSingleNode(xpath)) != null)
			value = node.text;
	}
	catch (mozilla)
	{
		var document;
		if (contextNode.nodeType != 9)
			document = contextNode.ownerDocument;
		else
			document = contextNode;
		value = document.evaluate(xpath, contextNode, null, 
			2, null).stringValue;
	}
	return value;
}

