Ajax = {
  call:function(module,service,params) {
    var ax = new Ajax.__relay();
    params = params || {};
    params.onfinish = params.onfinish || Function();
    params.get = params.get || {};
    params.post = params.post || {};
    ax.connect(
      'index.php?module=' + module + '&service=' + service + '&' + Ajax.processParams(params.get),
      'POST',Ajax.processParams(params.post),
      params.onfinish,
      true
    );
  },
  update:function(target,module,service,params) {
    var ax = new Ajax.__relay();
    params = params || {};
    params.onfinish = params.onfinish || function(r) {
      if (x = $(target)) {
        x.innerHTML = r;
      }
    }
    params.get = params.get || {};
    params.post = params.post || {};
    params.post['__NO_JSON_RESPONSE__'] = "1";
    ax.connect(
      'index.php?module=' + module + '&service=' + service + '&' + Ajax.processParams(params.get),
      'POST',Ajax.processParams(params.post),
      params.onfinish,
      false
    );
  },
  processParams:function(p) {
    var x = new Array();
    for (var i in p) {
      x.push(encodeURIComponent(i) + "=" + encodeURIComponent(p[i]));
    }
    return x.join("&");
  },
  __relay:function() {
    var xmlhttp,bComplete = false;
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (e) {
        try { 
          xmlhttp = new XMLHttpRequest();
        }
        catch (e) {
          xmlhttp = false;
        }
      }
    }
    if (!xmlhttp) {
      return null;
    }
    this.connect = function(sURL,sMethod,sVars,fnDone,execute) {
      if (!xmlhttp) {
        return false;
      }
      bComplete = false;
      sMethod = sMethod.toUpperCase();
      try {
        if (sMethod == "GET") {
          xmlhttp.open(sMethod,sURL + "?" + sVars,true);
          sVars = "";
        }
        else {
          xmlhttp.open(sMethod,sURL,true);
          xmlhttp.setRequestHeader("Method","POST " + sURL + " HTTP/1.1");
          xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        }
        xmlhttp.onreadystatechange = function() {
          if (xmlhttp.readyState == 4 && !bComplete) {
            bComplete = true;
            if (execute) {
              fnDone(eval(xmlhttp.responseText));
            }
            else {
              fnDone(xmlhttp.responseText);
            }
          }
        };
        xmlhttp.send(sVars);
      }
      catch(z) { 
        return false;
      }
      return true;
    };
    return this;
  }
}
