      // Ajax stuff
      function makeRequest(url, responseFunction, return_xml) {

        if (window.XMLHttpRequest) { // Mozilla, Safari,...
          http_request = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) { // IE
          http_request = new ActiveXObject("Microsoft.XMLHTTP");
        }

        if (!http_request) {
          return(false);
        }

        http_request.onreadystatechange = function() {

          if (http_request.readyState == 4) {
            if (http_request.status == 200) {
              if (return_xml) {
                eval(responseFunction + '(http_request.responseXML)');
              }
              else {
                eval(responseFunction + '(http_request.responseText)');
              }
            }
          }
          else {
            //alert('Not ready yet');
          }
        }


        http_request.open('GET', url, true);
        http_request.send(null);
      }




function getResource(uri, data_callback, error_callback, timeout) {
    var tryAgain = function () {
      getResource(uri, data_callback, error_callback, timeout);
    }

    var r = new XMLHttpRequest();
    var timer = setTimeout(
        function() {
            r.abort();
            r.onreadystatechange = null;
            setTimeout(tryAgain, timeout);
        },
        timeout);

    r.open("GET", uri, true);
    r.onreadystatechange = function() {
        if (r.readyState != 4) {
            // Ignore non-loaded readyStates
            // ...will timeout if do not get to "Loaded"
            return;
        }
        clearTimeout(timer);  // readyState==4, no more timer
        if (r.status==200) {  // "OK status"
              data_callback(r.responseText);
        }
        else if (r.status==304) {
            // "Not Modified": No change to display
        }
        else if (r.status >= 400 && r.status < 500) {
            // Client error, probably bad URI
            error_callback(r)
        }
        else if (r.status >= 500 && r.status < 600) {
            // Server error, try again after delay
            setTimeout(tryAgain, timeout);
        }
        else {
            error_callback(r);
        }
    }
    r.send(null);
    return r;
}
