function ja_heartbeat_initRequest() {
    if (window.XMLHttpRequest) {
        return new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        isIE = true;
        return new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        return false;
    }
}

function ja_heartbeat_update() {
    var url = "/ping?" + new Date().getTime();
    var req = ja_heartbeat_initRequest();
    if (req) {
      req.onreadystatechange = function() {
          if (req.readyState == 4) {
              if (req.status == 200) {
                  //window.alert('ping!');
              }
          }
      };
      req.open("GET", url, true);
      req.send(null);
    }
}

function ja_heartbeat(delay) {
    window.setTimeout('ja_heartbeat_update(); ja_heartbeat(' + delay + ');', delay);
}

