// XmlRequest JScript source code
function XmlRequest(serverPage, styleSheet)
{
	this.ServerPage = serverPage; // relative virtual path from root to xmlhttp aspx
	this.StyleSheet = styleSheet; // relative virtual path from root to xsl
	//this.ApplicationPath = applicationPath;
	this.Debug = false;
}

XmlRequest.prototype.ExecuteIntoSelect =
function (xmlRequest, element)
{
	var httpRequest;
	
	if ((httpRequest = this.ExecuteRequest(xmlRequest)) != null)
		return this.FillList(httpRequest, element);
	else
		return -1;
}

XmlRequest.prototype.ExecuteIntoSelectEx =
function (xmlRequest, element, s)
{
	var httpRequest;
	
	if ((httpRequest = this.ExecuteRequest(xmlRequest)) != null)
		return this.FillListEx(httpRequest, element, s);
	else
		return -1;
}

XmlRequest.prototype.Execute =
function (xmlRequest)
{
	var httpRequest;
	
	if ((httpRequest = this.ExecuteRequest(xmlRequest)) != null)
		return XmlHttpResponse(httpRequest, thisform.body, false);
	else
		return -1;
}

XmlRequest.prototype.ExecuteNonQuery =
function (xmlRequest)
{
	this.ExecuteRequest(xmlRequest);
}

// Returns the return value attribute
XmlRequest.prototype.ExecuteScalar =
function (xmlRequest, resultDiv)
{
	var httpRequest;
	
	if ((httpRequest = this.ExecuteRequest(xmlRequest)) != null)
	{
		if (XmlHttpResponse(httpRequest, resultDiv, false) == 0)
			return responseReturnValue(httpRequest);
	}
	return null;
}

XmlRequest.prototype.TransformToElement =
function (targetDiv, requestXML)
{
	var xsltDocument,
		xmlDocument;
	
	try
	{
		if ((xmlDocument = this.LoadXMLFromURL(requestXML)) != null)
		{
			if ((xsltDocument = this.LoadStyleSheet()) != null)
			{
				this.TransformNodeToElement(targetDiv, xmlDocument, xsltDocument);
			}
		}
	}
	catch (exception)
	{
		targetDiv.innerHTML = exception.message;
	}
}

XmlRequest.prototype.CreateXmlHttpObject = 
function ()
{
	try
	{
		return XmlHttpObject();
	}
	catch (missing_include_file)
	{
		alert("Must include XmlHttpResponse.js");
	}
	return null;
}

XmlRequest.prototype.ExecuteRequest = 
function (xmlRequest) 
{ 
	var httpRequest;
	
	if ((httpRequest = this.CreateXmlHttpObject()) != null)
	{
		httpRequest.open("POST", this.ServerPage, false); 
		httpRequest.send(xmlRequest); 
		/**************************************/
		if (this.Debug)
			alert(httpRequest.responseText);
		/**************************************/
		if (httpRequest.status != 200)
			alert(httpRequest.status + ": " + httpRequest.statusText);
	}
	return httpRequest;
} 

XmlRequest.prototype.LoadXMLFromURL = 
function (xmlRequest) 
{ 
	var httpRequest;
	
	if ((httpRequest = this.ExecuteRequest(xmlRequest)) != null)
		return httpRequest.responseXML; 
	else
		return null;
} 

XmlRequest.prototype.LoadStyleSheet =
function ()
{
	var xsltObject;
	
	if ((xsltObject = this.CreateXmlHttpObject()) != null)
	{
		xsltObject.open("GET", this.StyleSheet, false);
		xsltObject.send(null);
		if (xsltObject.status == 200)
			return xsltObject.responseXML;
		else
			alert(xsltObject.responseText);
	}
	return null;
}

XmlRequest.prototype.TransformNodeToElement = 
function (targetDiv, responseXML, xslRef)
{
	var output;
	
	try
	{
		output = responseXML.transformNode(xslRef);
		if (this.Debug == true)
			alert(output);
		targetDiv.innerHTML = output;
	}
	catch (mozilla)
	{
		var processor,
			fragment,
			old;

		if (this.Debug == true)
			alert(mozilla.message);
			
		processor = new XSLTProcessor();
		processor.importStylesheet(xslRef);
		
		fragment = processor.transformToFragment(responseXML, document);
		// First empty div, otherwise fragment is appended. Removing 
		// does not work yet. Is workaround.
		targetDiv.innerHTML = "";
		targetDiv.appendChild(fragment);
	}
}

XmlRequest.prototype.FillList = 
function (request, select)
{
	var option,
		count,
		list;

	count = 0;
	if ((list = selectNodes(request.responseXML, "select/option")) != null)
	{
		count = list.length;
		// Remove all items from the list
		select.options.length = 0;
		for (var i = 0; i < count; i++)
		{
			select.options.add(
				new Option(
					evaluateXPath(list[i], "description"), 
					evaluateXPath(list[i], "id")
					)
				);
		}
	}
	return count;
}

XmlRequest.prototype.FillListEx = 
function (request, select, s)
{
	var option,
		count,
		list;

	count = 0;
	if ((list = selectNodes(request.responseXML, "select/option")) != null)
	{
		count = list.length;
		// Remove all items from the list
		select.options.length = 0;
		for (var i = 0; i < count; i++)
		{
			select.options.add(
				new Option(
						evaluateXPath(list[i], s.description), 
						evaluateXPath(list[i], s.id)
					)
				);
		}
	}
	return count;
}

XmlRequest.prototype.ExecuteWithMessages = 
function (xml) 
{
	var httpRequest,
		response,
		message,
		errors;
	
	try
	{
		message = null;
		if ((httpRequest = this.ExecuteRequest(xml)) != null)
		{
			if ((errors = responseErrors(httpRequest)) != 0)
				message = evaluateXPath(httpRequest.responseXML, "response/error");
			else if ((response = responseMessage(httpRequest)) != "")
				message = response;
		}
	}
	catch (exception)
	{
		document.body.innerHTML = exception.message;
	}
	return message;
}
