function xmlRequestSend(url, post_data, user_data, event_handler)
{
  function xmlRequestHandler()
  {
    if(xml_request.readyState == 4)
      {
	var success = false;

	if(xml_request.status == 200)
	  {
	    success = true;
	  }

	if(xml_event_handler)
	  {
	    xml_event_handler(xml_user_data, xml_request, success);
	  }
	else
	  {
	    if(success)
	      {
		alert('no xml event handler set');
	      }
	    else
	      {
		alert('xml request (' + xml_url + ') failed: ' + xml_request.statusText +
		      '\n' + xml_request.responseText);
	      }
	  }
      }
  }

  var xml_url             = url;
  var xml_post_data       = post_data;
  var xml_user_data       = user_data;
  var xml_event_handler   = event_handler;
  var xml_request         = null;

  // branch for native XMLHttpRequest object
  if(window.XMLHttpRequest)
    {
      xml_request = new XMLHttpRequest();
    }
  // branch for IE/Windows ActiveX version
  else if(window.ActiveXObject)
    {
      xml_request = new ActiveXObject("Microsoft.XMLHTTP");
    }

  if(xml_request)
    {
      if(xmlRequestHandler)
	{
	  xml_request.onreadystatechange = xmlRequestHandler;
	}
      
      xml_request.open("POST", xml_url, true);
      xml_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      var key;
      var post_str = "";
      var glue_str = "";
      for(key in xml_post_data)
	{
	  post_str = post_str + glue_str + encodeURI(key) + "=" + encodeURI(xml_post_data[key]);
	  glue_str = "&";
	}
      xml_request.send(post_str);
    }
  
  return xml_request;
}

