function AJAXAction(url, callback) {
  var req = init();
  if (req != null)
    req.onreadystatechange = processRequest;
      
  function init() {
    var http_request = null;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType) {
        http_request.overrideMimeType('text/xml');
      }
    }
    else if (window.ActiveXObject) { // IE
      try {
        http_request = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch (e) {
        try {
          http_request = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e) {
          return null;
        }
      }
    }
    return http_request;
  }
  
  this.doGet = function() {
    // make a HTTP GET request to the URL asynchronously
    if (req != null) {
      req.open("GET", url, true);
      req.send(null);
    }
  }
  
  this.doPost = function(parameter) {
    // make a HTTP POST request to the URL asynchronously
    if (req != null) {
      req.open('POST', url, true);
      req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      req.setRequestHeader("Content-length", parameter.length);
      req.setRequestHeader("Connection", "close");
      req.send(parameter);
    }
  }
  
  function processRequest () {
    // readyState of 4 signifies request is complete
    if (req != null && req.readyState == 4) {
    // status of 200 signifies sucessful HTTP call
      if (req.status == 200) {
        if (callback) {
          callback(req.responseText);
		    }
      }
    }
  }
}

/* Usage
function validateUserId() { 
  var target = document.getElementById("userid"); 
  var url = "validate?id=" + encodeURIComponent(target.value); 
  var ajax = new AJAXInteraction(url, validateCallback); 
  ajax.doGet(); 
}

function validateCallback(responseXML) {
  // see "The Callback Function" below for more details
} 
*/
