  function getHttpRequest() {
    try {
      return new XMLHttpRequest();
    }
    catch (e) {
      return new ActiveXObject("Microsoft.XMLHTTP");
    }
  }

  function toQueryString(arguments) {
    if (arguments == null) return null;

    var qs = new String();
    for (var key in arguments) {
      if (validKey(key)) {
        var value = arguments[key];
        qs += key+"="+value+"&";
      }
    }
    return qs.substring(0, qs.length - 1);
  }

  function parseQueryString(queryString) {
    var parameters = new Object();

    var nameValues = queryString.split("&");
    if (nameValues) {
      for (var i=0; i<nameValues.length; i++) {
        var nameValue = nameValues[i];
        var tmp = nameValue.split("=");
        if (tmp) {
          parameters[tmp[0]] = tmp[1];
        }
      }
    }

    return parameters;
  }

  function sendText(url, arguments) {
    var xmlHttp = getHttpRequest();
    xmlHttp.open("POST", url, false);
    xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlHttp.send(toQueryString(arguments));
    if (xmlHttp.status != 200) {
      die(new Error("Got http response:"+xmlHttp.status+" "+xmlHttp.statusText+" URL:"+url+"?"+toQueryString(arguments)));
    }
    return xmlHttp.responseText;
  }

  function json(url, arguments) {
    return eval("(" + sendText(url, arguments) + ")");
  }

