﻿var soapFunction = "";
var soapReturnArray = false;
var traceText = "";
var count = 0;
var xmlDoc = null;

function SoapInvoke(url, soapAction, soapFunctionCall, soapFunction, returnArray)
{
	var soapRequest = "";
	var request = new XMLHttpRequest();
	var result = null;
	var node = null;
	var nodeList = null;
	
	soapReturnArray = returnArray;
	top.SoapFunctionTest = soapFunction;
	
	soapRequest = "<?xml version=\"1.0\"?>";
	soapRequest += "<soap:Envelope";
	soapRequest += " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
	soapRequest += " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"";
	soapRequest += " xmlns:soapEnc=\"http://schemas.xmlsoap.org/soap/encoding/\""; 
	soapRequest += " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"";
	soapRequest += " soap:encodingStyle=\"http://www.w3.org/2001/12/soap-encoding\">";
	soapRequest += "<soap:Body>";
	soapRequest += soapFunctionCall;
	soapRequest += "</soap:Body>";
	soapRequest += "</soap:Envelope>";
	
	request.open("POST", url, false);
	request.setRequestHeader("SOAPAction", soapAction);
	request.setRequestHeader("Content-Type", "text/xml; charset=UTF-8");
	
	request.send(soapRequest);

	xmlDoc = request.responseXML;
	//alert(xmlDoc.xml)
	
	nodeList = xmlDoc.getElementsByTagName("faultcode");
	
	
	if(nodeList.length > 0)
	{
		
		resultArray = new Array();
		resultArray[soapFunction+"Result"] = false;
	}
	else
	{
		resultArray = new Array();
		nodeList = xmlDoc.getElementsByTagName(soapFunction + "Response")
		if(nodeList.length > 0 && nodeList.item(0).attributes.getNamedItem("href") != null)
			ParseResponse(GetElementById("multiRef", nodeList.item(0).attributes.getNamedItem("href").nodeValue.replace("#","")), resultArray);
		else
		{
			nodeList = xmlDoc.getElementsByTagName(soapFunction + "Response")
			
			if(nodeList.length > 0)
			{
			    ParseResponse(nodeList.item(0), resultArray);
			}
			else
			{
				nodeList = xmlDoc.getElementsByTagName(soapFunction + "Result")
				
				if(nodeList.length == 0)
				{
					resultArray = new Array();
					resultArray["error"] = true;
					resultArray["description"] = "No response object in the XML result";
				}
			}	
		}
	}
	return resultArray;
}
function ParseResponse(element, ar, oneLevelOnly)
{
	var node = null;
	var extra = "";
	var useIndex = false;
	var nodeId = null;
	var childNodes = null;
	var oneLevel = false;
	
	var elementsOnly = GetChildNodes(element);
	
	for(var i=0;i < elementsOnly.length; i++)
	{
		node = elementsOnly[i];
		childNodes = GetChildNodes(node)
		if(i+1 < elementsOnly.length && node.nodeName == elementsOnly[i+1].nodeName && !useIndex)
		{
			useIndex = true;
		}
		
		    
		if((node.attributes != null && node.attributes.getNamedItem("href") != null) || (childNodes.length > 0) && !oneLevelOnly && !oneLevelOnly)
		{
		    this.count++;
			
			if(useIndex)
			{
				ar[ar.length] = new Array();
				
				if(childNodes.length > 0)
					ParseResponse(node, ar[ar.length-1]);
				else
					ParseResponse(GetElementById("multiRef", node.attributes.getNamedItem("href").nodeValue.replace("#","")), ar[ar.length-1], oneLevel);
			}
			else
			{
				ar[node.nodeName] = new Array();
		
				if(childNodes.length > 0)
					ParseResponse(node, ar[node.nodeName]);
				else
					ParseResponse(GetElementById("multiRef", node.attributes.getNamedItem("href").nodeValue.replace("#","")), ar[node.nodeName], oneLevel);
			}
		}
		else
		{
			if(node.firstChild)
			{
				if(useIndex)
					ar[ar.length] = node.firstChild.nodeValue;
				else
					ar[node.nodeName] = node.firstChild.nodeValue;
			}
			else
			{
				if(ar)
				if(useIndex)
					ar[ar.length] = "";
				else
					ar[node.nodeName] = "";
			}
		}
	}
}
function GetElementById(name, id)
{
	var element = null;
	var nodeList = xmlDoc.getElementsByTagName(name);
	
	for(var i = 0; i < nodeList.length; i++)
	{
		if(nodeList.item(i).attributes)
		{
			if(nodeList.item(i).attributes.getNamedItem("id").nodeValue == id)
			{
				element = nodeList.item(i);
				break;
			}
		}
	}
	
	return element;
}

function GetChildNodes(element)
{
	var elementsOnly = new Array();
	var node = null;
	
	for(var i = 0; i < element.childNodes.length; i++)
	{
		node = element.childNodes.item(i);
		
		if(node.nodeType == 1)
		{
			elementsOnly[elementsOnly.length] = node;
		}
	}
	
	return elementsOnly;
}
