var ajaxRequest;
//
function ajaxCall(strURL, xmlData, receiveFunction, blnAsync)
{
	if(typeof xmlData == 'undefined')
	{
		xmlData = null;
	}
	else if(typeof(xmlData) == 'object')
	{
		xmlData = getXmlString(xmlData);
	}
	if(typeof blnAsync == 'undefined')
	{
        blnAsync = true;
    }
	if (window.XMLHttpRequest)
	{
		// branch for native XMLHttpRequest object
		ajaxRequest = new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{
		// branch for IE6-/Windows ActiveX version
		ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	if (ajaxRequest)
	{   
	
		ajaxRequest.open("POST", strURL, blnAsync);
			    
//        ajaxRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        ajaxRequest.setRequestHeader("Content-length", xmlData.length);
        ajaxRequest.setRequestHeader("Connection", "close");	

		ajaxRequest.onreadystatechange = function()
											{
												// only if req shows "complete"
												if (ajaxRequest.readyState == 4)
												{
													// only if "OK"
													if (ajaxRequest.status == 200)
													{
														if(ajaxRequest.responseXML.documentElement != null)
														{
															var objResponse  = ajaxRequest.responseXML.documentElement;		
															if((typeof(receiveFunction) != 'undefined')&&(receiveFunction != ''))
															{
																eval(receiveFunction + '(objResponse)');																
															}
														}
													}
													else
													{
														var strErrorMessage = 'Ajax request failed, code (' + ajaxRequest.status + ')';
														raiseMessage('stoperror', strErrorMessage, '');
													}
												}
											}

		ajaxRequest.send(xmlData);
	}

}


/*


Example: 
	//ajaxSimpleSendRequest('~/page/system/ajax/mypage.aspx', 'myFunction', 'action', '', new ajaxArg('arg1','arg1value'), new ajaxArg('arg2','arg2value'));
	
Args:
	strURL					Required, the page that will handle the request.
	strReceiveFunction		Required, the function that you wish to receive the response. 
	strAction				Optional, the action parameter used in the Process method in the handling ajax page. 
	strReturnFunction		Optional, the function that the receive function will use for processing different actions. 
	argArray				Optional Array, additional argument list must be in the form of ajaxArg e.g. 
										new ajaxArg('arg1','arg1value'), new ajaxArg('arg2','arg2value')

*/
function ajaxSimpleSendRequest(strURL, strReceiveFunction, strAction, strReturnFunction)
{
	var xmlDoc = createXMLDOM();                   
	var xmlTable = xmlDoc.createElement('table');
	var xmlRow = xmlDoc.createElement('row');
	xmlDoc.appendChild(xmlTable);
	xmlTable.appendChild(xmlRow);

	strReturnFunction = (typeof(strReturnFunction) == 'undefined')?'':strReturnFunction;
	strAction = (typeof(strAction) == 'undefined')?'':strAction;
	

	AddNodeToXml(xmlDoc, xmlRow, 'action', strAction);
	AddNodeToXml(xmlDoc, xmlRow, 'return_function', strReturnFunction);

	var intArgLength = arguments.length;
	for(var intIndex = 4; intIndex < intArgLength; intIndex++)
	{
		var objArg = arguments[intIndex];
		if (objArg.getType() == 'ajaxArg')
		{
			AddNodeToXml(xmlDoc, xmlRow, objArg.Name, objArg.Value);
		}
	}
	
	ajaxCall(strURL, xmlDoc, strReceiveFunction);

}

function ajaxArg(strName, strValue)
{
	this.Name = strName;
	this.Value = strValue;
	this.getType = function()
	{
		return 'ajaxArg';
	}
}
ajaxArg.prototype.Name = '';
ajaxArg.prototype.Value = '';




// This function is now defunct.
function ajaxStateHandler()
{
	// only if req shows "complete"
	if (ajaxRequest.readyState == 4)
	{
		// only if "OK"
		if (ajaxRequest.status == 200)
		{
			//debugger;
			if(ajaxRequest.responseXML.documentElement != null)
			{
				var objResponse  = ajaxRequest.responseXML.documentElement;
				var strMethod    = objResponse.getElementsByTagName('method')[0].firstChild.data;
				var objStatus    = objResponse.getElementsByTagName('status')[0];
				var objResults    = objResponse.getElementsByTagName('result');
				var intResultCount = objResults.length;
				var intStatus = 0;
				var strErrorMessage =  '';
				
				if(objStatus != null)
				{
					intStatus = GetXmlNodeText(objStatus.getElementsByTagName('status')[0]);
					strErrorMessage = GetXmlNodeText(objStatus.getElementsByTagName('error_message')[0]);
				}
				
				if(intStatus == 0)
				{
				
					for(var intResultIndex = 0; intResultIndex < intResultCount; intResultIndex++)
					{
						var objResult = objResults[intResultIndex];
						eval(strMethod + '(objResult)');
					}
				}
				else
				{
					raiseMessage('stoperror', strErrorMessage, '');
				}
			}
		}
	}
}

function createXMLDOM()
{
	var xmlDoc;
	
	// code for IE
	if (window.ActiveXObject)
	{
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
	}// code for Mozilla, Firefox, Opera, etc.
	else if ((document.implementation) && (document.implementation.createDocument))
	{
		xmlDoc=document.implementation.createDocument("","",null);
	}
	else
	{
		alert('Your browser cannot handle this script');
	}
	xmlDoc.async=false;
	xmlDoc.load('<?xml version="1.0" encoding="ISO-8859-1" ?>');
	return(xmlDoc);
}



function AddNodeToXml(xmlDoc, xmlRow, strName, value)
{

	var xmlNewNode = xmlDoc.createElement(strName);
	xmlNewNode.appendChild(xmlDoc.createTextNode(value));
	xmlRow.appendChild(xmlNewNode);
	
}


