// Javier Troconis

// Array to store multiple XMLHTTP asynchronous calls
var xmlRequestArray = new Array();


// XmlRequestObject Getter
function GetXmlRequestObject()
{
	if (window.XMLHttpRequest != null)
		return new XMLHttpRequest();
	else
	{
	//  Microsoft xmlHttp object types
		var msXMLObjectTypes = new Array("MSXML2.xmlhttp.5.0","MSXML2.xmlhttp.4.0","MSXML2.xmlhttp.3.0","MSXML2.xmlhttp","Microsoft.xmlhttp");
		for(i=0; msXMLObjectTypes.length > i; ++i)
		{
			try
			{
				return new ActiveXObject(msXMLObjectTypes[i]);
			}	
			catch(e){}
		}
	}
}

function PairedParamsSerializer(params)
{
   	if(params != null)
    {
		var serializedParams = new String();
   	  	for(i=0; params.length > i; ++i)
   	  	{
   	  	 	if(serializedParams.length > 0)
   	   			serializedParams = serializedParams.concat("&");
   	  		serializedParams = serializedParams.concat(params[i].pName + "=" + params[i].pValue);
   	  	}
   	  	return serializedParams;
   	}
   	return null;
}

function DoASPNETPageCallBack(serverObjectUrl, httpMethod, serverMethodName, returnContentType, clientEventHandler, clientEventHandlerParams, isAsynchronous, serverParams)
{
		var xmlRequest = GetXmlRequestObject();
		if(xmlRequest != null)
		{
			var serializedServerData = null;
			switch(httpMethod)
			{
				case "POST" :
				{
					xmlRequest.open(httpMethod, serverObjectUrl, isAsynchronous);
					serializedServerData = (serverParams != null)? serverParams.join("&") : null;
				}break;
				case "GET" :
				{
				
				}break;
			}
			xmlRequest.setRequestHeader("RemoteMethod", serverMethodName);
			xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			CallBackProcessor(xmlRequest, serializedServerData, isAsynchronous, clientEventHandler, clientEventHandlerParams);
		}
}

function DoWebServiceCallBack(serverObjectUrl, httpMethod, serverMethodName, returnContentType, clientEventHandler, clientEventHandlerParams, isAsynchronous, serverParams)
{
	var xmlRequest = GetXmlRequestObject();
	if(xmlRequest != null)
	{
		var serializedServerData = null;
		switch(httpMethod)
		{
			case "POST" :
			{
				serializedServerData = PairedParamsSerializer(serverParams);
				xmlRequest.open(httpMethod, serverObjectUrl + "/" + serverMethodName, isAsynchronous);
   	  			xmlRequest.setRequestHeader("Content-Length", (serializedServerData == null)? "0" : serializedServerData.length);
			}break;
			case "GET" :
			{
				serializedServerData = PairedParamsSerializer(serverParams);
				xmlRequest.open(httpMethod, serverObjectUrl + "/" + serverMethodName + (serializedServerData == null)? null : "?" + serializedServerData, isAsynchronous, clientEventHandler, clientEventHandlerParams);
			}break;
			case "SOAP" :
			{
				
			}break;	
		}
		xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		CallBackProcessor(xmlRequest, serializedServerData, isAsynchronous, clientEventHandler, clientEventHandlerParams);
	}
}

function CallBackProcessor(xmlRequest, serializedServerData, isAsynchronous, clientEventHandler, clientEventHandlerParams)
{
	try
	{
		xmlRequest.send(serializedServerData);
		if(isAsynchronous)
		{
			var index = xmlRequestArray.length;
 			xmlRequestArray[index] = {xmlRequest: xmlRequest, index : index};
   	 		xmlRequestArray[index].xmlRequest.onreadystatechange = MakeOnReadyStateChangeHandler(xmlRequestArray[index], clientEventHandler, clientEventHandlerParams);
		}
		else
		{
			clientEventHandler(xmlRequest, clientEventHandlerParams);
		}
	}
	catch(e)
	{
		alert('CallBackProcessorException: ' + e);
	}
}



// Asynchronous controller to ensure end of callback
function MakeOnReadyStateChangeHandler(object, clientEventHandler, clientEventHandlerParams)
{
	return function()
	{
 		if (object.xmlRequest.readyState == 4 && (object.xmlRequest.status == 200 || object.xmlRequest.status == 201))
 		{	
 			clientEventHandler(object.xmlRequest, clientEventHandlerParams);
 	  		xmlRequestArray = RemoveArrayItemByIndex(xmlRequestArray, object.index);
 		}
 	}
}

// Function to populate a dropdown list - plus add a default value // Kai Cubicek
function PopulateDDLplus(xmlRequest, elementId)
{
 	var options = xmlRequest.responseXML.getElementsByTagName("option");
 	if(options)
 	{ // - start if
 		var isMSIE = navigator.appVersion.indexOf("MSIE") != -1;
 		elementId.length = null;
 		document.forms[0][elementId.id].options[0] =  new Option("--Please-Select--", "0");
 		for(i=0; options.length > i; ++i)
 		{
 			valueNode = options[i].getElementsByTagName("value")[0];
 			keyNode = options[i].getElementsByTagName("key")[0]; 				
 			
 			if(isMSIE)
 			{
 				strValue = valueNode.text;
 				strKey = keyNode.text;
 			}
 			else
 			{
 				strValue = valueNode.textContent;
 				strKey = keyNode.textContent;
 			}
 			var option = new Option(strValue, strKey);
 			document.forms[0][elementId.id].options[i+1] = new Option(strValue, strKey);
 		}
 	}
}

// Function to populate a dropdown list
function PopulateDDL(xmlRequest, elementId)
{
 	var options = xmlRequest.responseXML.getElementsByTagName("option");
 	if(options)
 	{
 		var isMSIE = navigator.appVersion.indexOf("MSIE") != -1;
 		elementId.length = null;
 		for(i=0; options.length > i; ++i)
 		{
 			valueNode = options[i].getElementsByTagName("value")[0];
 			keyNode = options[i].getElementsByTagName("key")[0]; 				
 			if(isMSIE)
 			{
 				strValue = valueNode.text;
 				strKey = keyNode.text;
 			}
 			else
 			{
 				strValue = valueNode.textContent;
 				strKey = keyNode.textContent;
 			}
 			var option = new Option(strValue, strKey);
 			document.forms[0][elementId.id].options[i] = new Option(strValue, strKey);						
 		}
 	}
}



// Function to inject html into a html element
function RenderHtml(xmlRequest, elementId)
{
	elementId.innerHTML = xmlRequest.responseText;
}

// Helper function to remove processed asynchronous xmlRequests from the xmlRequestArray array
function RemoveArrayItemByIndex(array, index)
{ 
    return array.slice(0,index-1).concat(array.slice(index+1)); 
} 
