﻿//var RPC_HANDLER_PAGE =  window.location.protocol + "//" + window.location.hostname + ":" + window.location.port + "/RPC_Handler.aspx";	
var RPC_HANDLER_PAGE = "/_layouts/RPCHandler.ashx";

function HandleMethodsForNonIE()
{
	if( document.implementation.hasFeature("XPath", "3.0") )
	{
		XMLDocument.prototype.selectNodes = function(cXPathString, xNode)
		{
			if( !xNode ) { xNode = this; } 

			var oNSResolver = document.createNSResolver(document.documentElement)
			var aItems = this.evaluate(cXPathString, xNode, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
			var aResult = [];
			for( var i = 0; i < aItems.snapshotLength; i++)
			{
				aResult[i] =  aItems.snapshotItem(i);
			}
			
			return aResult;
		}
		
		XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode)
		{
			if( !xNode ) { xNode = this; } 

			var xItems = this.selectNodes(cXPathString, xNode);
			if( xItems.length > 0 )
			{
				return xItems[0];
			}
			else
			{
				return null;
			}
			
		}

		Element.prototype.selectNodes = function(cXPathString)
		{
			if(this.ownerDocument.selectNodes)
			{
				return this.ownerDocument.selectNodes(cXPathString, this);
			}
			else{throw "For XML Elements Only";}
		}

		Element.prototype.selectSingleNode = function(cXPathString)
		{	
			if(this.ownerDocument.selectSingleNode)
			{
				return this.ownerDocument.selectSingleNode(cXPathString, this);
			}
			else{throw "For XML Elements Only";}
		}
		
		Node.prototype.__defineGetter__("xml", _Node_getXML);
	}
}
function _Node_getXML() 
{
    //create a new XMLSerializer
    var objXMLSerializer = new XMLSerializer();
   
    //get the XML string
    var strXML = objXMLSerializer.serializeToString(this);
    
    //return the XML string
    return strXML;
}
	/***********************************************
	 porpuse:  build the xml string for the RPC request
	 inputs :	1.class name
				2.method name
				3.array of parameters
				4.namespace ( if ommitted - default namespace used)
				5.assembly name ( if ommitted - default assembly name used)
	 return:   string of the request (xml)
	 comments:
	***********************************************/
	function GetRpcXmlString(sClassName,sMethodName,arrParams,sNamespace,sAssemblyName)
	{
		
		var oRequestXmlDoc;
		if (window.ActiveXObject) 
		{ 
			try
			{
				oRequestXmlDoc = new ActiveXObject("MSXML2.DomDocument");
			}
			catch(e)
			{
				alert("Your browser does not support or disabled ActiveX");	
				return;
			}
		}
		//for other browsers
		else if (document.implementation && document.implementation.createDocument)
		{ 
			
			try
			{
				oRequestXmlDoc = document.implementation.createDocument("","",null);
				HandleMethodsForNonIE();
			}
			catch(e)
			{
				alert("Your browser does not support or disabled ActiveX");	
				return;
			}
			
		} 
		
		var oRootElement;
		var oElement;
		var iParametersCount=0;
		var i,j;
		var oParamElement;
		var oArrayItemElement;
		var sXMLRequest;
		var oAttribute;
		var oTextNode;
		
		// build the root
		oRootElement = oRequestXmlDoc.createElement("RPC");
		oRequestXmlDoc.appendChild(oRootElement);
		
		// build the method name node
		oElement = oRequestXmlDoc.createElement("MethodName");
		oTextNode = oRequestXmlDoc.createTextNode(sMethodName);
		//oElement.text = sMethodName;
		oElement.appendChild(oTextNode);
		oRootElement.appendChild(oElement);
		
		// build the class name node
		oElement = oRequestXmlDoc.createElement("ClassName");
		oTextNode = oRequestXmlDoc.createTextNode(sClassName);
		oElement.appendChild(oTextNode);
		//oElement.text = sClassName;
		oRootElement.appendChild(oElement);
		
		// build the namespace node
		oElement = oRequestXmlDoc.createElement("Namespace");
		oTextNode = oRequestXmlDoc.createTextNode(sNamespace);
		oElement.appendChild(oTextNode);
		//oElement.text = sNamespace;
		oRootElement.appendChild(oElement);
		
		// build the Assembly Name node
		oElement = oRequestXmlDoc.createElement("AssemblyName");
		oTextNode = oRequestXmlDoc.createTextNode(sAssemblyName);
		oElement.appendChild(oTextNode);
		//oElement.text = sAssemblyName;
		oRootElement.appendChild(oElement);
		
		// build the params node
		oElement = oRequestXmlDoc.createElement("Parameters");
		oRootElement.appendChild(oElement);

		if (arrParams != null)
		{
			iParametersCount = arrParams.length; 
			
			//run over all the passed parameters
			for (i=0; i < iParametersCount ; i++) 
			{	
				oParamElement = oRequestXmlDoc.createElement("Param");
				
				//if the element is empty - pass empty string 
				if (typeof(arrParams[i]) == "undefined")
				{
					oTextNode = oRequestXmlDoc.createTextNode("");
					oParamElement.appendChild(oTextNode);
					//oParamElement.text = "";
				}
				else if (typeof(arrParams[i]) == "object")
				{
					//let's see whether this object is an array
					if (arrParams[i].length != null){
						
						oAttribute = oRequestXmlDoc.createAttribute("IsArray");
						oAttribute.value = "1";
						
						oParamElement.attributes.setNamedItem(oAttribute);
					
						//get all the elements of the array
						for (j=0;j<arrParams[i].length;j++)
						{
							oArrayItemElement = oRequestXmlDoc.createElement("ArrayItem");
							oTextNode = oRequestXmlDoc.createTextNode(arrParams[i][j]);
							oArrayItemElement.appendChild(oTextNode);
							//oArrayItemElement.text = arrParams[i][j];
							oParamElement.appendChild(oArrayItemElement);
						}
					}
				}
				else
				{
					oTextNode = oRequestXmlDoc.createTextNode(arrParams[i]);
					oParamElement.appendChild(oTextNode);
					//oParamElement.text = arrParams[i]; 	
				}
				oElement.appendChild(oParamElement);
			}
		}

		sXMLRequest = oRequestXmlDoc.xml;


		//sXMLRequest = "<RPC><MethodName>LoginUser</MethodName><ClassName>CInternetUserUI</ClassName><Namespace>Taldor.Taasuka.UI</Namespace><AssemblyName>Taldor.Taasuka.UI.dll</AssemblyName><Parameters><Param>423</Param><Param>432</Param><Param>2</Param><Param></Param></Parameters></RPC>";
		return sXMLRequest;
	}
	
	
	function GetTextValue(oNode)
	{
		// for IE
		if (window.ActiveXObject) 
		{
			return oNode.text; 
		}
		//for other browsers
		else if (document.implementation && document.implementation.createDocument)
		{ 
			return oNode.textContent;
		}
	}
	/***********************************************
	 porpuse:  execute the server function 
	 inputs :	1.Class name
				2.Method name
				3.Parameters array
				4.Array which will hold the return value in location 0,
					and all the values of ref parameters in the following locations.					
				5.Namespace ( if omitted default namespace used)
				6.Assembly name ( if omitted default namespace used)

	 return:   string contains the error message ( if any error occured)
				otherwise if call was successfull - empty string will return
	 comments:
	***********************************************/
	function XMLRPC(ClassName,MethodName,arrParams,arrReturnParams,Namespace,AssemblyName)
	{
	
		try{
			
			var strRequestXML;
			var oXmlhttp;
			var oResponseXML;
			var oXmlDoc;
			var oErrorCodeElement;
			var oErrorDescElement;
			var oReturnValueElement;
			var i;
			var sRpcError;
			var oNodeListRefParams;
			var oNodeRefParam;
			var oArrayItemElement;
			var iArrayItemsCount;
			
			// get the xml string of the request
			strRequestXML = GetRpcXmlString(ClassName,MethodName,arrParams,Namespace,AssemblyName);
			
			// Create the XMLHTTP object
			//for IE
			if (window.ActiveXObject) 
			{ 
				try
				{
					oXmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
				}
				catch(e)
				{
					alert("Your browser does not support or disabled ActiveX");	
					return;
				}
			}
			//for other browsers
			else if(window.XMLHttpRequest) 
			{ 
				try
				{
					oXmlhttp = new XMLHttpRequest();
					HandleMethodsForNonIE(); 
				}
				catch(e)
				{
					alert("Your browser does not support or disabled ActiveX");	
					return;
				}
			} 

			oXmlhttp.open("POST", RPC_HANDLER_PAGE, false);
			
			oXmlhttp.send (strRequestXML);
			
			//get the response
			oResponseXML = oXmlhttp.responseXML;
			

			//Load it to xml DOM
			if (window.ActiveXObject) 
			{ 
				try
				{
					oXmlDoc = new ActiveXObject("MSXML2.DomDocument");
					oXmlDoc.loadXML(oResponseXML.xml);
			
					//check if xml loaded sucessfully
					if (oXmlDoc.parseError.errorCode != 0)
					{
						sRpcError = oXmlDoc.parseError.errorCode + " " + oXmlDoc.parseError.reason;
						return sRpcError;
					}
					
				}
				catch(e)
				{
					alert("Your browser does not support or disabled ActiveX");	
					return;
				}
			}
			//for other browsers
			else if (document.implementation && document.implementation.createDocument)
			{ 
				try
				{
					oXmlDoc = document.implementation.createDocument("","",null);
					//alert(oResponseXML.xml);
					var parser = new DOMParser();
					oXmlDoc = parser.parseFromString(oResponseXML.xml, "text/xml");
					
				}
				catch(e)
				{
					alert("Your browser does not support or disabled ActiveX");	
					return;
				}
			} 
			
			
//			alert(oXmlDoc.xml);			
			// check if we got an error from the server
			oNodeErrorCode = oXmlDoc.selectSingleNode("//RPR/Error/Code")
//			alert(GetTextValue(oNodeErrorCode));
			if (GetTextValue(oNodeErrorCode) != "" && GetTextValue(oNodeErrorCode) != "0") 
			{
				oNodeErrorDesc = oXmlDoc.selectSingleNode("//RPR/Error/Desc");
				sRpcError = GetTextValue(oNodeErrorDesc);
				return sRpcError;
			}
			
			//get the return value of the function called on the server
			oReturnValueNode = oXmlDoc.selectSingleNode("//RPR/ReturnValue")
			arrReturnParams[0] = GetDataFromNode(oReturnValueNode);

			//extract all the values of ref parameters from the method into the
			//arrReturnParams array from the position 1 and up
			oNodeListRefParams = oXmlDoc.selectNodes("//RPR/RefParams/RefParam");
			for (i=0;i<oNodeListRefParams.length;i++)
			{
				oNodeRefParam = oNodeListRefParams[i];
				
				arrReturnParams[i+1] = GetDataFromNode(oNodeRefParam);
			}

			return "";	
		}
		catch(e)
		{
			sRpcError = e.message + "  " + e.description;
			return sRpcError;
		}	
}	

function GetDataFromNode(oDataNode)
{
	var RetVal;
	var arrValues;
	var i;
	
	//if this node has ArrayItem nodes - it means it's an array
	if (oDataNode.selectNodes("ArrayItem").length > 0)
	{
		//*************** Copy all the elements into array ********
		arrValues = new Array();
	
		for (i=0; i < oDataNode.selectNodes("ArrayItem").length; i++)
		{
			arrValues[i] = GetTextValue(oDataNode.childNodes[i]);
		}
		//*****************
		
		RetVal = arrValues;
	}
	else
	{
		RetVal = GetTextValue(oDataNode);
	}
	
	return RetVal;
}

	