////////////////////////////////////////////////////////////////////////////////
function createXmlHttpRequestObject()
{
	var xmlHttp;
	// this should work for all browsers except IE6 and older
	try
	{
		xmlHttp = new XMLHttpRequest();
	}
	catch(e)
	{
		// assume IE7 or older
		var XmlHttpVersions = new Array(
			"MSXML2.XMLHTTP.7.0",
			"MSXML2.XMLHTTP.6.0",
			"MSXML2.XMLHTTP.5.0",
			"MSXML2.XMLHTTP.4.0",
			"MSXML2.XMLHTTP.3.0",
			"MSXML2.XMLHTTP",
			"Microsoft.XMLHTTP"
		);
		// try every prog id until one works
		for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)
		{
			try
			{
				// try to create XMLHttpRequest object
				xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
			}
			catch (e) {}
		}
	}
	// return the created object or display an error message
	if (xmlHttp)                                                   	
		return xmlHttp;
	else
		alert("Error creating the XMLHttpRequest object.");     	
}
////////////////////////////////////////////////////////////////////////////////
function getXMLHTTPResponse(xh){
  var retval=null;
	if(xh){
		if (xh.readyState == 4) {
			// only if HTTP status is "OK"
			if (xh.status == 200) {
				var response=xh.responseText;
				// server error?
				if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0)
					alert("Error: " + response);
				//else if (response.length == 0)
				//	alert("Error: zero-length response from server");
				else {
				  retval=response;
				}
			} else {
				alert("There was a problem retrieving search results:\n" +xh.status+" "+xh.statusText);
			}
		}
	}
	return retval;
}
////////////////////////////////////////////////////////////////////////////////
function asyncRequest(url,fun){
	asyncRequestJson(url,fun,'GET',null,null);
}
////////////////////////////////////////////////////////////////////////////////
function asyncRequestJson(url,fun,method,headers,content){
	var xhr;
	var response;
	var meth=((method==undefined||method==''))?'GET':method;
	//alert("Sending async request.\n\nMethod: "+meth+"\nURL: "+url);
	
	if (xhr=createXmlHttpRequestObject()) {
		try {
			if (xhr.readyState == 4 || xhr.readyState == 0){
				xhr.onreadystatechange = 
					function(){
						if(xhr){
							if (xhr.readyState == 4) {
								// only if HTTP status is "OK"
								if (xhr.status == 200) {
									var response=xhr.responseText;
									// server error?
									if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0){
										alert("Error: " + response);
										return null;
									}
									//else if (response.length == 0){
									else {
										try{
											//alert('response:'+response+':\n');
											if(response===''){
											  var retval=fun();
											}
											else{
												var retval=fun(eval("("+response+")"));
											}
								    	eval('('+retval+')');
										}
										catch(err){
								    	alert('Error applying function to ajax response: '+err.name+'\n\nResponse:\n'+response);
										}
									}
								} else {
									alert(
										"There was a problem retrieving results"
										+"\n\n"+xhr.status+" "+xhr.statusText
										+"\n\n"+method+" "+url
										//+"\n"+headers
										+"\n"+content
									);
								}
							}
						}
					}
				;
				xhr.open(meth,url,true);
				if(headers){
		    	for(i=0;i<headers.length;i++){
		      	xhr.setRequestHeader(headers[i][0],headers[i][1]);
					}
				}
				xhr.send(content);
				return xhr;                                        
			}
			else{
	    	alert("Invalid state of XmlHttpRequest: "+xhr.readyState);
			}                              	
		} catch(err) {
			alert("Error sending async request.\n\nMethod: "+meth+"\nURL: "+url+"\n\nError:"+err.toString());
		}
	}
}
////////////////////////////////////////////////////////////////////////////////

