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){
	asyncRequest(url,fun,'GET',null,null);
}
////////////////////////////////////////////////////////////////////////////////
function asyncRequest(url,fun,method,headers,content){
	var xhr;
	var response;
	var meth=(method==undefined)?'GET':method;
	
	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 {
										//alert('response:'+response+':');
										eval(fun(response));
									}
								} else {
									alert("There was a problem retrieving results:\n\n" + xhr.status+" "+xhr.statusText);
								}
							}
						}
					}
				;
				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;                                        
			}                              	
		} catch(err) {
			alert("Error sending async request.\n\nMethod: "+meth+"\nURL: "+url+"\n\nError:"+err.toString());
		}
	}
}
////////////////////////////////////////////////////////////////////////////////
function syncRequest(url){
	var xhr;
	var response;
	if (xhr=createXmlHttpRequestObject()) {
		xhr.open("GET",url,false);
		xhr.send(null);
		if(response=getXMLHTTPResponse(xhr)){
		  xhr=null;
		  return response;
		}
	}
}
////////////////////////////////////////////////////////////////////////////////
function syncRequestJson(url){
	var response=syncRequest(url);
  if(response==undefined){
		return null;
	}
	return eval(response);
}
////////////////////////////////////////////////////////////////////////////////
function data2array(data){
  if(data==" ") return new Array();
	var a=data.split('\n');
	var a1=new Array(a.length);
  for(i=0;i<a.length;i++){
		a1[i]=a[i].split('|');
	}
	return a1;
}
////////////////////////////////////////////////////////////////////////////////
function ajaxSelect(sql,async,handler,rows,cols){
	var url_suffix=(rows==1)?((cols==1)?"11":"1"):((cols==1)?"1col":"");
	var url="select"+url_suffix+".php";
  if(url_suffix==""){
	  if(typeof sql=="string"){
		  sql=new Array(sql);
		}
	  for(var i=0;i<sql.length;i++){
			url=url+(i==0?'?':'&')+encodeURIComponent('stmt[]')+'='+encodeURIComponent(sql[i]);
		}
	}
	else{
		url=url+'?stmt='+encodeURIComponent(sql);
	}
	//alert(url);
	if(async){
		asyncRequest(url,handler);
	}
	else{
		return syncRequestJson(url);
	}
}
////////////////////////////////////////////////////////////////////////////////
function syncSelect11(sql,fun){
	return ajaxSelect(sql,false,fun,1,1);
}
////////////////////////////////////////////////////////////////////////////////
function asyncSelect(sql,fun){
  if(typeof sql=="string")
  sql=new Array(sql);
  var url="select.php";
  for(var i=0;i<sql.length;i++){
		url=url+(i==0?'?':'&')+encodeURIComponent('stmt[]')+'='+encodeURIComponent(sql[i]);
	}
	//alert(url);
	asyncRequest(url,fun);
}
////////////////////////////////////////////////////////////////////////////////
