var xmlhttp	= false;
var xmlhttpPID		= 0;
var xmlhttpTimeOut	= 5000;
var xmlhttpStack	= new Array();
var xmlhttpXMLDocument = new Array();

if (!xmlhttp && window.ActiveXObject) {
	try {
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	} catch (e) {
		xmlhttp	= false;
	}
}

if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
	try {
		xmlhttp = new XMLHttpRequest();
	} catch (e) {
		xmlhttp	= false;
	}
}
if (!xmlhttp && window.createRequest) {
	try {
		xmlhttp = window.createRequest();
	} catch (e) {
		xmlhttp	= false;
	}
}

if (!xmlhttp) {
	location.href='message.php?brwsr';
}

function requestXML(params){

	if (params == true) {
		params	= xmlhttpStack.shift();
	}

	if (params == null) return;
	
	if (xmlhttpPID != 0){ // if busy
		id_stack	= Math.random();

		xmlhttpStack.push(params);
		return;
	}

	var url				= (params['url'] == null)?'':String(params['url']);
	var cache_request	= (params['cch'] == null)?'':String(params['cch']);
	var onLoadAction	= (params['onload'] == null)?'':String(params['onload']);
	var onFailedAction	= (params['onfailed'] == null)?'':params['onfailed'];
	var simple			= (params['simple'] == null)?false:params['simple'];

	var delay_stacked_requests	= 100;

	var x;
	if (xmlhttp) {

		xmlhttp.open("GET", url, true);
		xmlhttpPID	= Math.random();
		if (onFailedAction) 
		setTimeout('if (xmlhttpPID == '+String(xmlhttpPID)+') {requestTimeOut('+quote(url)+');'+onFailedAction+'}',xmlhttpTimeOut);

		xmlhttp.onreadystatechange	= function() {
			if (SessionExpired) return;

			if (xmlhttp.readyState==4) {
				
				pid	= xmlhttpPID;
				xmlhttpPID	= 0;

				if (!simple){

					if (xmlhttp.responseXML == null){
						xmlhttpPID	= 0;
						report('Not XML result! URL:'+url);
						eval(onFailedAction);
					} else {
	
						if (onLoadAction.length == 0){
							response		= xmlhttp.responseXML.documentElement;

							if (response.getElementsByTagName('onload')[0].firstChild)
								onLoadAction	= String(response.getElementsByTagName('onload')[0].firstChild.data);
							else report(url+' returned no onload event');
						
							if (onLoadAction.length > 0){
			
								params	= new Array;
								params['xml_document']		= 'xmlhttp.responseXML';
								params['xml_request_pid']	= pid;
			
								onLoadAction	= parseTemplate(onLoadAction,params);
							}
						}
		
						if (onLoadAction.length > 0) setTimeout(onLoadAction,100);
					}
				}

				if (xmlhttpStack.length > 0){
					setTimeout('requestXML(true);',delay_stacked_requests); // from stack
					return;
				}

			}
		}

		xmlhttp.send(null);

		return;
	}

}

function requestTimeOut(url){

	xmlhttpPID	= 0;
	enableFormButtons(true);
	report('Request timeout for '+url);

}
