var sto, scaled = false, listed = false, fakesto = false;

if(window.globalStorage) // Gecko 1.8.1+
   sto = window.globalStorage[window.location.host];
if(window.localStorage) // current HTML 5
   sto = window.localStorage;
if(!sto) // DOM 0
{
   sto = {removeItem: function(x) {delete this[x];}}
   fakesto = true;
   //aEL(window, "unload", savedata);
}

if(loadcookie(sto) && !fakesto)
   document.cookie = "fakesto=;expires=" + (new Date()).toGMTString();

function c(x)
{
   if(x.firstChild.data.match(/\s*!!!\s*/)) return "chkchkchk"; // hackhackhack
   return x.firstChild.data.toLowerCase().replace(/[^a-z0-9]/g, "");
}
function load(e)
{
   aEL(document.body, "click", click);

   var a, p = document.getElementsByTagName("P")[0];

   a = document.createElement("A");
   a.id = "scalea";
   a.href = "";
   aEL(a, "click", scale);
   a.appendChild(document.createTextNode("scale"));
   p.appendChild(document.createTextNode(" / "));
   p.appendChild(a);

   a = document.createElement("A");
   a.id = "lista";
   a.href = "";
   aEL(a, "click", list);
   a.appendChild(document.createTextNode("my list"));
   p.appendChild(document.createTextNode(" / "));
   p.appendChild(a);

   if(sto)
   {
      rest(document.getElementsByTagName("TD"));
      rest(document.getElementsByTagName("SPAN"));
      if(!("_unscaled" in sto))
         scale();
      if("_scaled" in sto)
         sto.removeItem("_scaled");
   }
}
function loadcookie(sto)
{
   var i, j, bits;
   var cookies = document.cookie.split(";");
   for(i = 0; i < cookies.length; ++i)
   {
      if(cookies[i].substr(0, 8) != "fakesto=")
         continue;

      bits = cookies[i].split("/");
      for(j = 0; j < bits.length; ++j)
         sto[bits[j]] = 1;

      return true;
   }
   return false;
}
function savedata()
{
   // this is supposed to just happen onunload, but opera is being annoying
   // and not firing that, so instead let's do it all the time!

   if(!sto || !fakesto) return;

   var bits = [];
   var exp = new Date(new Date() - -500*24*60*60*1000).toGMTString();
   for(var k in sto)
      if(sto[k] == 1)
         bits.push(k);

   document.cookie = "fakesto=" + bits.join("/") + ";domain=" +
                     window.location.host + ";expires=" + exp;
}
function scale(e)
{
   var i, dur, factor = 3; // px per minute
   var l = document.getElementsByTagName("TD");
   for(i = 0; i < l.length; ++i)
   {
      if(scaled)
         l[i].style.width = "";
      else if((dur = l[i].getAttribute("data-dur")))
         l[i].style.width = (dur * factor - 1) + "px";
   }

   var l = document.getElementsByTagName("TABLE");
   for(i = 0; i < l.length; ++i)
      l[i].className = scaled ? "" : "scaled";

   if(sto)
   {
      if(scaled)
         sto._unscaled = 1;
      else
         sto.removeItem("_unscaled");
      savedata();
   }

   document.getElementById("scalea").firstChild.data = (scaled ? "scale" : "unscale");

   scaled = !scaled;
   if(e)
   {
      if("preventDefault" in e)
         e.preventDefault();
      if("target" in e)
         e.target.blur();
   }
   return false;
}
function list(e)
{
   listed = !listed;
   var listal = document.getElementById("lista").firstChild;
   if(listed)
   {
      var days = document.getElementsByTagName("DIV");
      var obs, items, ilist, j, li, txt, stage;
      for(var i = 0; i < days.length; ++i)
      {
         items = [];
         obs = days[i].getElementsByTagName("*");
         for(j = 0; j < obs.length; ++j)
            if(obs[j].className == "sel")
               items.push(obs[j]);

         if("className" in days[i].lastChild && days[i].lastChild.className == "list")
         {
            ilist = days[i].lastChild;
            while(ilist.firstChild)
               ilist.removeChild(ilist.firstChild);
         }
         else
         {
            ilist = document.createElement("UL");
            ilist.className = "list";
            days[i].appendChild(ilist);
         }

         items.sort(listitemsort);
         for(j = 0; j < items.length; ++j)
         {
            txt = "";
            if(items[j].title) txt += items[j].title + " ";
            txt += items[j].firstChild.data;
            if(items[j].tagName == "TD")
            {
               stage = items[j].parentNode.firstChild.firstChild.data;
               txt += "(" + stage.replace(/(^\s|\s$)/g, "") + ")";
            }

            li = document.createElement("LI");
            li.appendChild(document.createTextNode(txt));
            ilist.appendChild(li);
         }
      }

      document.body.className = "listed";
      listal.data = "chart";
   }
   else
   {
      document.body.className = "";
      listal.data = "my list";
   }

   if("preventDefault" in e)
      e.preventDefault();
   if("target" in e)
      e.target.blur();
   return false;
}
function listitemsort(a, b)
{
   var atime = a.title ? Number(a.title.substr(0, 4)) : 9999;
   var btime = b.title ? Number(b.title.substr(0, 4)) : 9999;

   if(atime < 600) atime += 2400;
   if(btime < 600) btime += 2400;

   return atime - btime;
}
function rest(l)
{
   for(var i = 0; i < l.length; ++i)
   {
      if(l[i].className == "empty" || l[i].parentNode.className == "time")
         continue;

      if(c(l[i]) in sto)
         l[i].className = "sel";
   }
}
function click(e)
{
   var target = e.target ? e.target : e.srcElement;

   if(target.tagName != "TD" && target.tagName != "SPAN")
      return;
   if(target.className == "empty" || target.parentNode.className == "time")
      return;

   if(target.className)
   {
      target.className = "";
      if(sto)
         sto.removeItem(c(target));
   }
   else
   {
      target.className = "sel";
      if(sto)
         sto[c(target)] = 1;
   }
   savedata();
}
function aEL(node, ev, fn)
{
   if(node.addEventListener)
      node.addEventListener(ev, fn, false);
   else if(node.attachEvent)
      node.attachEvent("on" + ev, function(){return fn(window.event);});
}
aEL(window, "load", load);
