/**
 * UI hookup
 */

const REFRESHRATE = 1 * 60;       // How often to pull new data in seconds.

var menuItems = [
  { 
    text: "View", 
    submenu: {
      id: "viewmenu", 
      itemdata: [
        {
          text: "Timing Info",
          onclick: { fn: function() { Config.toggleValue("showTimes"); } }
        },
        {
          text: "Inline Results",
          onclick: { fn: function() { Config.toggleValue("showInline"); } }
        }
      ]
    }
  },
  { 
    text: "Settings", 
    submenu: {  
      id: "settingsmenu", 
      itemdata: [
        {
          text: "Load",
          onclick: { fn: function() { Config.loadConfig(); } }
        },
        {
          text: "Save",
          onclick: { fn: function() { Config.saveConfig(); } }
        },
        {
          text: "Reset",
          onclick: { fn: function() { Config.resetConfig(); } }
        }
      ] 
    }
  }
];

var TindermergeUI = {
  columns: [],                    // Reporting columns.

  displayHours: 12,               // Number of hours currently visible.
  totalHours: 24,                 // Total number of hours to cache.
  tree: "Firefox",
  treeState: null,
  checkinColumn: null,
  timeColumn: null,

  init: function() {
    try {
      if ("console" in window && "log" in console)
        YAHOO.widget.Logger.enableBrowserConsole();
      new YAHOO.widget.LogReader();
  
      var menubar = new YAHOO.widget.MenuBar("menubar");
      menubar.addItems(menuItems);
      menubar.render(document.body);
      Config.loadConfig();
  
      subscribe(Tindermerge.Tree.machineAdded, this.machineAdded, this, true);
      subscribe(Tindermerge.Tree.loadCompleted, this.loadCompleted, this, true);
      subscribe(Tindermerge.Tree.timeChanged, this.timeChanged, this, true);
      subscribe(Tindermerge.Tree.treeChanged, this.treeChanged, this, true);
      subscribe(Config.configChanged, this.configChanged, this, true);
      this.configChanged("", ["*"]);

      this.timeColumn = new Tindermerge.UI.DisplayColumn(document.getElementById("time"));
      this.checkinColumn = new Tindermerge.UI.DisplayColumn(document.getElementById("checkins"));

      Tindermerge.Tree.init(this.tree, null, this.displayHours, this.totalHours);
      var url = "/shared/scripts/proxy/tinderbox.mozilla.org/" + this.tree + "/quickparse.txt";
      YAHOO.log("Requesting tree status from " + url, "wire", "TindermergeUI");
      YAHOO.util.Connect.asyncRequest('GET', url, this.stateCallback, null);
    }
    catch (e) {
      YAHOO.log(e, "error", "TindermergeUI");
    }
  },

  updateState: function(state) {
    this.treeState = state;
    YAHOO.util.Dom.removeClass(document.body, "tree-open");
    YAHOO.util.Dom.removeClass(document.body, "tree-closed");
    YAHOO.util.Dom.addClass(document.body, "tree-" + state);
  },

  stateCallback: {
    success: function(request) {
      try {
        var lines = request.responseText.split("\n");
        if (lines.length == 0)
          return;
        var parts = lines[0].split("|");
        if (parts.length != 4 || parts[0] != "State" || parts[1] != TindermergeUI.tree)
          return;
        TindermergeUI.updateState(parts[3]);
      }
      catch (e) {
        YAHOO.log(e, "error", "TindermergeUI");
      }
    },
  
    failure: function(request) {
    }
  },

  configChanged: function(key) {
    if (key == "*" || key == "showTimes") {
      if (Config.getValue("showTimes", false))
        YAHOO.util.Dom.addClass(document.body, "showtimes");
      else
        YAHOO.util.Dom.removeClass(document.body, "showtimes");
    }

    if (key == "*" || key == "showInline") {
      if (Config.getValue("showInline", false))
        YAHOO.util.Dom.addClass(document.body, "showinline");
      else
        YAHOO.util.Dom.removeClass(document.body, "showinline");
    }
  },

  machineAdded: function(machine) {
    if (!machine.isPerformance())
      this.columns.push(new Tindermerge.UI.ReportColumn(machine));
  },

  treeChanged: function(tree) {
    for (var i = 0; i < this.columns.length; i++)
      this.columns[i].destroy();
    this.columns = [];

    // Load the bonsai data
    var url = "/shared/scripts/proxy/bonsai.mozilla.org/cvsquery.cgi?module=" + tree.currentModule;
    url += "&date=explicit&mindate=" + Math.floor(tree.minTime);
    url += "&maxdate=" + Math.ceil(tree.maxTime);
    YAHOO.log("Requesting checkins from " + url, "wire", "TindermergeUI");
    YAHOO.util.Connect.asyncRequest('GET', url, this.bonsaiCallback, null);
  },

  timeChanged: function(tree) {
    this.checkinColumn.updateTime(tree.minTime, tree.maxTime);

    var current = document.getElementById("currentTime");
    current.innerHTML = getDisplayDate(tree.maxTime);
    var region = YAHOO.util.Dom.getRegion(current);
    var max = tree.maxTime - (region.bottom - region.top) * TIMESCALE;
    var min = tree.minTime;
    this.timeColumn.updateTime(min, max);
    max = Math.floor((max - 5 * 60) / (15 * 60)) * 15 * 60;

    if (!this.timeColumn.newestItem) {
      while (max > min) {
        this.timeColumn.addItem(new Tindermerge.UI.TimeIndex(max));
        max -= (15 * 60);
      }
    }
    else {
      var addCount = 0;
      while (this.timeColumn.newestItem.time < max)
        this.timeColumn.addItem(new Tindermerge.UI.TimeIndex(this.timeColumn.newestItem.time + (15 * 60)));
      YAHOO.log("Added " + addCount + " time indexes", "info", "TindermergeUI");
    }

    if (tree.currentModule) {
      // Load the bonsai data
      var url = "/shared/scripts/proxy/bonsai.mozilla.org/cvsquery.cgi?module=" + tree.currentModule;
      if (this.checkinColumn.newestItem)
        url += "&date=explicit&mindate=" + Math.floor(this.checkinColumn.newestItem.time);
      else
        url += "&date=explicit&mindate=" + Math.floor(tree.minTime);
      url += "&maxdate=" + Math.ceil(tree.maxTime);
      YAHOO.log("Requesting checkins from " + url, "wire", "TindermergeUI");
      YAHOO.util.Connect.asyncRequest('GET', url, this.bonsaiCallback, null);
    }
  },

  updateHeader: function() {
    var burning = 0;
    var missing = 0;
    var failed = 0;
    var name = this.treeState.toUpperCase();
    for (var i = 0; i < this.columns.length; i++) {
      this.columns[i].updateHeader();
      if (YAHOO.util.Dom.hasClass(this.columns[i].headerDisplay, "busted"))
        burning++;
      else if (YAHOO.util.Dom.hasClass(this.columns[i].headerDisplay, "missing"))
        missing++;
      else if (YAHOO.util.Dom.hasClass(this.columns[i].headerDisplay, "testfailed"))
        failed++;
    }
    if (missing > 0)
      name += " " + missing + "M";
    if (burning > 0)
      name += " " + burning + "B";
    if (failed > 0)
      name += " " + failed + "F";
    document.title = name;
    
    if (burning > 0)
      status = "busted";
    else if (failed > 0)
      status = "testfailed";
    else if (this.treeState.toLowerCase() == "closed")
      status = "closed";
    else
      status = "success";

    var icon = document.getElementById("favicon");
    var head = icon.parentNode;
    head.removeChild(icon);
    
    icon = document.createElement("link");
    icon.setAttribute("id", "favicon");
    icon.setAttribute("rel", "icon");
    icon.setAttribute("type", "image/png");
    icon.setAttribute("href", "icons/" + status + ".png");
    head.appendChild(icon);
  },

  refreshView: function() {
    Tindermerge.Tree.refreshData();
    var url = "/shared/scripts/proxy/tinderbox.mozilla.org/" + this.tree + "/quickparse.txt";
    YAHOO.log("Requesting tree status from " + url, "wire", "TindermergeUI");
    YAHOO.util.Connect.asyncRequest('GET', url, this.stateCallback, null);
  },

  loadCompleted: function() {
    this.updateHeader();
    setTimeout(function() { TindermergeUI.refreshView(); }, REFRESHRATE * 1000);
  },

  bonsaiCallback: {
    success: function(request) {
      try {
        var text = request.responseText;

        var pos = text.indexOf("<TD WIDTH=47% VALIGN=TOP");
        var addCount = 0;
        while (pos >= 0) {
          var commentStart = text.indexOf(">", pos) + 1;
          var commentEnd = text.indexOf("\n</tr>", commentStart);

          var start = text.lastIndexOf("<tr>\n<TD width=2%>", commentStart) + 55;
          var end = text.indexOf("</font>", start);
          var time = getBonsaiDate(text.substring(start, end));

          if (time < Tindermerge.Tree.minTime)
            break;

          if (time <= Tindermerge.Tree.maxTime) {
            var comment = text.substring(commentStart, commentEnd);

            var start = text.indexOf(" >", end) + 2;
            var end = text.indexOf("</a>", start);
            var who = text.substring(start, end);

            addCount++;
            TindermergeUI.checkinColumn.addItem(new Tindermerge.UI.Checkin(time, who, comment));
          }
          pos = text.indexOf("<TD WIDTH=47% VALIGN=TOP", commentEnd + 6);
        }
        YAHOO.log("Added " + addCount + " new checkins", "info", "TindermergeUI");
      }
      catch (e) {
        YAHOO.log(e, "error", "TindermergeUI");
      }
    },

    failure: function(request) {
    }
  }
};

YAHOO.util.Event.onDOMReady(TindermergeUI.init, TindermergeUI, true);

