/* Web Developer Tool Button
 *   nanto_vi (TOYAMA Nao), 2006-12-30
 *
 * Adds a toolbar button that displays a pop-up menu of Web Develoepr.
 */

(function WebDeveloperToolButton() {

// Shortcut menus that are shown above ordinary menus
// Specify the value of id or oncommand attributes
var shortcuts = [
  { id: "webdeveloper-display-anchors-menu" },
  { command: "webdeveloper_viewJavaScript()" },
  { command: "webdeveloper_viewCSS()" },
  { id: "webdeveloper-edit-css-menu" },
  { command: "webdeveloper_editHTML()" },
  { id: "webdeveloper-dom-inspector-menu" }
];
// The toolbar you place this tool button in
var toolbar = document.getElementById("PersonalToolbar");
// The toolbar item you place this tool button before
// (null means you place this button at the last end of the toolbar.)
var afterItem = null;

var originalMenu = document.getElementById("webdeveloper-menu");

var toolbarButton = document.createElementNS(kXULNS, "toolbarbutton");
toolbarButton.id = "webdeveloper-toolbarbutton";
toolbarButton.className = "webdeveloper-statusbar-button";
toolbarButton.setAttribute("type", "menu");
toolbarButton.setAttribute("tooltiptext", originalMenu.getAttribute("label"));
toolbarButton.setAttribute("image", "chrome://webdeveloper/skin/buttons/button_small.png");

var mainPopup = originalMenu.firstChild.cloneNode(true);
var popupCommands = [];

var menusWithId = mainPopup.getElementsByAttribute("id", "*");
for (var i = 0, menuWithId; menuWithId = menusWithId[i]; i++)
  menuWithId.id = menuWithId.id.replace(/-menu$/, "-toolbutton");

var popups = mainPopup.getElementsByAttribute("onpopupshowing", "*");
// We always have to get the first item because popups are live.
for (var i = 0, popup; popup = popups[0]; i++) {
  popup.id = "webdeveloper-toolbutton-popup-" + i;
  popupCommands.push(
    popup.getAttribute("onpopupshowing")
      .replace(/'menu'/, "'toolbutton'")
      .replace(/\bthis\b/,
        "document.getElementById('webdeveloper-toolbutton-popup-" + i + "')"),
    ";");
  popup.removeAttribute("onpopupshowing");
}

if (shortcuts.length != 0)
  mainPopup.insertBefore(document.createElementNS(kXULNS, "menuseparator"),
                         mainPopup.firstChild);
for (var i = shortcuts.length, shortcut; shortcut = shortcuts[--i];) {
  var menu = ("id" in shortcut)
    ? document.getElementById(shortcut.id)
    : originalMenu.getElementsByAttribute("oncommand", shortcut.command)[0];
  var newMenu = menu.cloneNode(true);
  if (menu.id) {
    var toolbuttonId = menu.id.replace(/-menu$/, "-toolbutton");
    var newId = toolbuttonId + "-menu";
    newMenu.id = newId;
    popupCommands.push(
      "if (document.getElementById('", toolbuttonId, "').hasAttribute('checked'))",
      "  document.getElementById('", newId, "').setAttribute('checked', 'true');",
      "else document.getElementById('", newId, "').removeAttribute('checked');");
  }
  mainPopup.insertBefore(newMenu, mainPopup.firstChild);
}

mainPopup.setAttribute("onpopupshowing", popupCommands.join(""));
toolbarButton.appendChild(mainPopup);
toolbar.insertBefore(toolbarButton, afterItem);

})();
