function xml_request(url, data) {
  var req = xml_http_request_object();
  req.open("POST", url, false);
  req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
  req.send((data ? data + "&" : "")+"_=");
  return req.responseText || "";
}

function xml_get_request_dom(url, data) {
  var req = xml_http_request_object();
  req.open("GET", url, false);
  req.send(null);

  return req.responseXML.documentElement;

}

function xml_request_dom(url, data) {
  var req = xml_http_request_object();
  req.open("POST", url, false);
  req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
  req.send((data ? data + "&" : "")+"_=");
  return req.responseXML.documentElement;
}

function xml_request_dom_async(url, data, callback ) {
  var ro = xml_http_request_object();
  ro.onreadystatechange = callback;
  ro.open("POST", url, true);
  ro.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
  ro.send((data ? data + "&" : "")+"_=");

  return ro;
}

function xml_check_request( req ) {
  return (req && req.readyState == 4 && req.status == 200);
}


function xml_http_request_object() {
  var req = false;
  try {
    req = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      req = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      req = false;
    }
  }

  if (!req && typeof XMLHttpRequest!='undefined') {
    req = new XMLHttpRequest();
  }

  return req;
}



function AjaxHandler ( cb, URI, param ) {
  this.callback = cb;
  this.req_new = true;
  this.URI = URI;
  this.param = param;
  this.req = null;
  
  this.handle = function () {
	//alert( xml_check_request( this.req) );
	if (!xml_check_request( this.req ) || !this.req_new ) {
	  return;
	} 
	this.req_new = false;
	this.callback( this.req );
  }
  
  this.req = xml_request_dom_async( this.URI, this.param, this.handle.bind(this) );
}
