function getXmlHttpPrefix()
{
  if (getXmlHttpPrefix.prefix) return getXmlHttpPrefix.prefix;

  var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
  var activeXObj;

  for (var i = 0; i < prefixes.length; i++) {
    try {
      activeXObj = new ActiveXObject(prefixes[i] + ".XmlHttp");
      return getXmlHttpPrefix.prefix = prefixes[i];
    } catch (ex) {
    }
  }

  throw new Error("Could not find an installed XML parser");
}

function XHR() {
}

XHR.READY_STATE_UNINITIALIZED = 0;
XHR.READY_STATE_LOADING = 1;
XHR.READY_STATE_LOADED = 2;
XHR.READY_STATE_INTERACTIVE = 3;
XHR.READY_STATE_COMPLETED = 4;

XHR.newInstance = function () {
  try {
    if (window.XMLHttpRequest) {
      var req = new XMLHttpRequest();
      if (req.readyState == null) {
        req.readyState = XHR.READY_STATE_LOADING;
        req.addEventListener("load", function () {
          req.readyState = XHR.READY_STATE_COMPLETED;
          if (typeof req.onreadystatechange == "function") {
              req.onreadystatechange();
          }
        }, false);
      }

      return req;
    }

    if (window.ActiveXObject) {
      return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
    }
  } catch (ex) {
  }
  throw new Error("Your browser does not support XmlHttp objects");
}

XHR.request = function(uri, options, requestCount, startTime) {
  var xhr = XHR.newInstance();

  var uniqueURI = uri+(uri.indexOf("?") > 0 ? "&" : "?")+"timestamp="+(new Date()).getTime();

  xhr.open("GET", uniqueURI, true);
  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
      try {
        if ( xhr.status != 200 ) {
          if ( options.onFailure ) options.onFailure(xhr);
        } else if ( options.onSuccess ) {
          options.onSuccess(xhr, requestCount, startTime);
        }
      } catch ( error ) {
        if ( options.onFailure ) options.onError(xhr, error);
      }
    }
  }
  xhr.send(null);
}
