
var request = null;

/* Wrapper function for constructing a request object
   Parameters:
   reqType: The HTTP request type, such as GET or POST.
   url: The URL of the server program.
   asynch: Whether to send the request asynchronously or not.
   respHandle: The name of the function that will handle the response.
   Any fifth parameters, represented as arguments[4], are the data a
   POST request is designed to send. */
function httpRequest(reqType, url, asynch, respHandle) {
  // Mozilla-based browsers
  if (window.XMLHttpRequest) {
    request = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    request = new ActiveXObject("Msxmls.XMLHTTP");
    if (! request) {
      request = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }

  // very unlikely, but we test for a null request
  // if neither ActiveXObject was initialized
  if (request) {
    // if the reqType parameter is POST, then the
    // 5th argument to the function is the POSTed data
    if (reqType.toLowerCase() != "post") {
      initReq(reqType, url, asynch, respHandle);
    } else {
      // the POSTed data
      var args = arguments[4];
      if (args != null && args.length > 0) {
	initReq(reqType, url, asynch, respHandle, args);
      }
    }
  } else {
    alert("Your browser does not permit the use of all " +
	  "of this application's features!");
  }
}

/* Initialize a request object that is already constructed */
function initReq(reqType, url, asynch, respHandle) {
  try {
    /* Specify the function that will handle the HTTP response */
    request.onreadystatechange = respHandle;
    request.open(reqType, url, asynch);
    
    // if the reqType parameter is POST, then the
    // 5th parameter to the function is the POSTed data
    if (reqType.toLowerCase() == "post") {
      request.setRequestHeader("Content-Type",
			       "application/x-www-form-urlencoded; charset=UTF-8");
      request.send(arguments[4]);
    } else {
      request.send(null);
    }
  } catch (errv) {
    alert( "The application cannot contact " +
	   "the server at the moment. " +
	   "Please try again later.\n" +
	   "Error detail: " + errv.message);
  }
}
