function sendAsyncRequest(url, method, postData, callbackFunc, errorFunc, callbackParams) {
  if (method.toLowerCase() != "post") {
    method = "get";
    postData = null;
  }

  var req = false;
  // branch for native XMLHttpRequest object
  if (window.XMLHttpRequest && !(window.ActiveXObject)) {
    try {
      req = new XMLHttpRequest();
    } catch (e) {
      req = false;
    }
    // branch for IE/Windows ActiveX version
  } else if (window.ActiveXObject) {
    try {
      req = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        req = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        req = false;
      }
    }
  }
  if (req) {
    req.onreadystatechange = function() {
      // only if req shows "loaded"
      if (req.readyState == 4) {
        try {
          // only if "OK"
          if (req.status == 200) {
            callbackFunc(req.responseText, req.responseXML, callbackParams);
          } else {
            errorFunc(req.status, req.statusText, callbackParams);
          }
        } catch (e) {
        }
      }
    };
    req.open(method, url, true);
    req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    req.send(postData);
  }
}
