// reloader.js -- reload a browser page when the server is updated
// Except for portions noted below, the contenst of this file is
// Copyright (C)2003 by Chris Houser <chouser@bluweb.com> and
// Distributed under the GNU General Public License

var statexml, oldv, vuri, syncdelay, loadtime;

function getelem(tagname, keykey, keyval)
{
  var elems = document.getElementsByTagName(tagname);
  for (var i = 0; i < elems.length; i++) {
    var elem = elems.item(i);
    if (elem.getAttribute(keykey) == keyval) {
      return elem;
    }
  }
  alert("Didn't find <" + tagname + ' ' + keykey + '="' + keyval + '" />');
  return null;
}

function report(str)
{
  var cd = document.getElementById('checkdate');
  if (cd) {
    var strNode = document.createTextNode(str);
    cd.replaceChild(strNode, cd.firstChild);
  }
}

function loaded()
{
  var delay = 0;
  if (!statexml.documentElement) {
    // This is some kind of sparatic IE error.  Try reloading the XML
    // version file soon.
    delay = syncdelay / 4;
  }
  else {
    var newv = statexml.documentElement.firstChild.data;
    if (oldv != newv) {
      if (parseInt(oldv) > parseInt(newv)) {
        report("Failed. Version file too old; perhaps using cached version.");
        delay = syncdelay / 4;
      }
      else if (new Date() - loadtime < syncdelay * 1000 / 2) {
        report("Failed. Sync needed too soon; perhaps using cached page.");
      }
      else {
        document.location.reload();
      }
    }
    else {
      // update the check time
      report((new Date()).toLocaleString());
      delay = syncdelay;
    }
  }
  if (delay)
    setTimeout(checkstate, delay * 1000);
}

function checkstate()
{
  // add a timestamp to the query to help defeat the browser cache
  var stamp = new Date().getTime().toString(36);
  statexml.load(vuri + '?' + stamp);
}

function startreloader() {
  // Thanks to ppk@xs4all.nl for help with the IE support below.
  // http://www.xs4all.nl/~ppk/js/importxml.html
  statexml = null;
  if (document.implementation && document.implementation.createDocument)
  {
    statexml = document.implementation.createDocument('', 'v', null);
    statexml.addEventListener('load', loaded, false);
  }
  else if (window.ActiveXObject)
  {
    statexml = new ActiveXObject("Microsoft.XMLDOM");
    statexml.onreadystatechange = function () {
      if (statexml.readyState == 4) loaded()
    };
  }
  loadtime = new Date();
  if (statexml) {
    oldv = getelem('meta', 'name', 'version').getAttribute('content');
    syncdelay = getelem('meta', 'name', 'syncdelay').getAttribute('content');
    vuri = getelem('link', 'rel', 'latestversion').getAttribute('href');
    checkstate();
  }
}

