versionTracker = 0;
updater = false;
updateTimeout = 3;
updatedBoxes = false;
baseUrl = "";
continuousUpdate = false;

function XHR () {
  try {
    return new XMLHttpRequest();
  } catch (err) {
    return new ActiveXObject('Microsoft.XMLHTTP');
  }
}

function decorateTableBox (table, update_url) {
  var th = table.getElementsByTagName("TH")[0];
  if (! th)
    return;
  th.style.backgroundRepeat = "no-repeat";
  th.style.backgroundPosition = "center right";
  th.style.backgroundImage = "url('" + baseUrl + "img/bits/load.png')";
  th.onclick = function () {
    updateBox(table, update_url);
  };
}

function updateBox (table, update_url) {
  var th = table.getElementsByTagName("TH")[0];
  th.style.backgroundImage = "url('" + baseUrl + "img/bits/loading.gif')";

  var request = XHR();
  request.open("GET", baseUrl + "metabox.php?boxes" + 
	       versionTracker++ + "=" + update_url, 
	       true);
  request.setRequestHeader("Content-Type",
                           "application/x-www-form-urlencoded");
  if (! updatedBoxes)
    updatedBoxes = new Array();

  updatedBoxes[table.id] = true;
  if (! updater) {
    if (continuousUpdate)
      updater = setInterval(updateBoxes, 15000);
    updateTimeout = 60;
  }
 
  request.onreadystatechange = function() {
    var done = 4, ok = 200;
    if (request.readyState == done && request.status == ok) {
      if (request.responseText) {
	if (! table)
	  return;

	var id = table.id;
	var parent = table.parentNode;
	if (! parent)
	  return;

	while (parent.childNodes.length > 0) 
	  parent.removeChild(parent.firstChild);
	parent.innerHTML = request.responseText;
	table = parent.getElementsByTagName("TABLE")[0];
	if (! table)
	  return;

	table.id = id;

	decorateTableBox(table, update_url);
      }
    }
  };
  request.send("hello");
}

function refreshImages (object) {
  var images = object.getElementsByTagName("IMG");
  for (var i = 0; i < images.length; i++) {
    var image = images[i];
    if (image.src.indexOf("?") != -1)
      image.src = image.src + "&v=" + versionTracker++;
  }
}

function decorateBox (id, update_url) {
  var table = document.getElementById(id);
  decorateTableBox(table, update_url);
}

function decorateBoxes () {
  var tables = document.getElementsByTagName("TABLE");
  for (var i = 0; i < tables.length; i++) {
    var table = tables[i];
    if (table.id.substring(0, 11) == "updatetable") {
      decorateTableBox(table, table.getAttribute("data"));
    }
  }

  var top = document.getElementById("topupdate");
  if (continuousUpdate && top) {
    top.style.backgroundRepeat = "no-repeat";
    top.style.backgroundPosition = "center right";
    top.style.backgroundImage = "url('" + baseUrl + "img/bits/load.png')";
    top.onclick = function () {
      startUpdatePage(top);
    };
  }
}

function startUpdatePage (top) {
  updatedBoxes = false;
  top.style.backgroundImage = "url('" + baseUrl + "img/bits/loading.gif')";
  updateBoxes();
  top.onclick = function () {
    stopUpdatePage(top);
  };
  if (! updater) {
    updater = setInterval(updateBoxes, 15000);
    updateTimeout = 60;
  }
}

function stopUpdatePage (top) {
  if (! top)
    return;

  top.style.backgroundImage = "url('" + baseUrl + "img/bits/load.png')";
  top.onclick = function () {
    startUpdatePage(top);
  };
  if (updater) {
    clearInterval(updater);
    updater = false;
  }
}

function updateBoxes () {
  var tables = document.getElementsByTagName("TABLE");
  var boxes = new Array();
  var count = 0;
  var url = "";

  for (var i = 0; i < tables.length; i++) {
    var table = tables[i];
    if (table.id.substring(0, 11) == "updatetable") {
      if (updatedBoxes && ! updatedBoxes[table.id])
	continue;
      boxes[count++] = table;
      var bit = "boxes" + versionTracker++ + "=" + table.getAttribute("data");
      if (url == "")
	url = bit;
      else
	url = url + "&" + bit;
      var th = table.getElementsByTagName("TH")[0];
      th.style.backgroundImage = "url('" + baseUrl + "img/bits/loading.gif')";
    }
  }

  var request = XHR();
  request.open("GET", baseUrl + "metabox.php?" + url, true);
  request.setRequestHeader("Content-Type",
                           "application/x-www-form-urlencoded");
 
  request.onreadystatechange = function() {
    if (request.readyState == 4 && request.status == 200) {
      if (request.responseText) {
	var allHtml = request.responseText.split("<!-- separator -->");
	for (var i = 0; i < count; i++) {
	  var table = boxes[i];
	  var html = allHtml[i];

	  if (! table)
	    return;

	  var id = table.id;
	  var width = table.offsetWidth;

	  var parent = table.parentNode;
	  if (! parent)
	    return;

	  while (parent.childNodes.length > 0) 
	    parent.removeChild(parent.firstChild);
	  parent.innerHTML = html;
	  table = parent.getElementsByTagName("TABLE")[0];
	  if (! table)
	    return;

	  table.id = id;
	  if (table.offsetWidth < width)
	    table.width = width;

	  decorateTableBox(table, table.getAttribute("data"));
	}
      }
    }
  };
  request.send("hello");
  if (updater && updateTimeout-- < 0)
    stopUpdatePage(document.getElementById("topupdate"));
}

function insertBox (update_url) {
  if (baseUrl == "")
    baseUrl = "http://penny.netfonds.no/";
  var request =  XHR();
  request.open("GET", baseUrl + "metabox.php?boxes" + 
	       versionTracker++ + "=" + update_url, 
	       false);
  request.setRequestHeader("Content-Type",
                           "application/x-www-form-urlencoded");
  request.onreadystatechange = function() {
    if (request.readyState == 4 && request.status == 200) {
      if (request.responseText) {
	document.write(request.responseText);
	if (continuousUpdate)
	  decorateTableBox(table, update_url);
      }
    }
  };
  request.send("hello");
}
