/*
 * ============================================================================
 * Project maven-homepage-plugin
 * Copyright (c) 2006-2007 by Andre Winkler. All rights reserved.
 * ============================================================================
 * $Id: menu.js 635 2007-01-13 00:24:00Z andrewinkler $
 * Version: $LastChangedRevision: 635 $ $LastChangedDate: 2007-01-13 01:24:00 +0100 (Sat, 13 Jan 2007) $
 * Author:  by Andre Winkler, $LastChangedBy: andrewinkler $
 */

/**
 * Ein Objekt zur Verwaltung des Menu-Zustands.
 */
function MenuManager() {
  this.menuDisplay = new Set();
}

/**
 * Ein Menu-Item hinzufuegen.
 *
 * @param item Die ID des Menu-Items
 *
 * @private
 */
MenuManager.prototype.add = function(item) {
  this.menuDisplay.add(item);
}

/**
 * Ein Menu-Item entfernen.
 *
 * @param item die ID des Menu-Items
 *
 * @private
 */
MenuManager.prototype.remove = function(item) {
  this.menuDisplay.remove(item);
}

/**
 * Erstellt aus dem Menu-Zustand einen HttpRequest Parameter.
 *
 * @return Ein String der den Menu-Zustand kodiert.
 */
MenuManager.prototype.serialize = function() {
  var value = "";
  for (var i = 0; i < this.menuDisplay.size(); i++) {
    var item = encodeURIComponent(this.menuDisplay.get(i));
    value = value + item + ",";
  }

  if (this.menuDisplay.size() > 0) {
    value = value.slice(0, value.length - 1);
  }

  return "menu=" + value;
}

/**
 * Erstellt aus einem HttpRequest Parameter den Menu-Zustand.
 *
 * @param httpRequest Ein String, der den Menu-Zustand kodiert.
 */
MenuManager.prototype.deserialize = function(httpRequest) {
  var param = httpRequest.getParam("menu");
  if (param) {
    var menuItems = param.split(",");
    for (var i = 0; i < menuItems.length; i++) {
      if (menuItems[i] != "") {
        this.setMenuDisplayBlock(menuItems[i]);
      }
    }
  }
}

/**
 * Fordert den Menu-Zustand 'block' (sichtbar) fuer ein Menu-Item an.
 *
 * @param elementID Die ID des Menu-Items.
 */
MenuManager.prototype.setMenuDisplayBlock = function(elementId) {
  var node = document.getElementById(elementId);
  if (node != null) {
    node.style.display = "block";
    this.add(elementId);
  }
}

/**
 * Fordert den Menu-Zustand 'none' (unsichtbar) fuer ein Menu-Item an.
 *
 * @param elementID Die ID des Menu-Items.
 */
MenuManager.prototype.setMenuDisplayNone = function(elementId) {
  var node = document.getElementById(elementId);
  if (node != null) {
    node.style.display = "none";
    this.remove(elementId);
  }
}

/**
 * Wechselt die Sichbarkeit eines Menu-Elements.
 *
 * @param elementId Die ID des DOM Elements, dessen Sichbarkeit geaendert wird.
 */
MenuManager.prototype.switchMenuDisplay = function(elementId) {
  var node = document.getElementById(elementId);
  if (node != null && node.style.display == "block") {
    this.setMenuDisplayNone(elementId);
  } else if (node != null && node.style.display == "none") {
    this.setMenuDisplayBlock(elementId);
  }
}

/**
 * Oeffnet eine Referenz. Der Menuzustand wird als HttpRequest Parameter
 * kodiert und mit gesendet.
 *
 * @param href Die zu oeffnende Seite.
 * @param wndw Referenz auf das Window Objekt.
 *
 * @todo Dies koennte in eine globale Methode ausgelagert werden. Alle Zustaende
 *     wuerden in dieser Methode kodiert werden. Registrierung?!?
 */
MenuManager.prototype.openHref = function(href, wndw) {
  try {
    var params = this.serialize();
    /* alert("Open HRef: " + String(href + "?" + params)); */
    wndw.location.href = href + "?" + params;
  } catch (e) {
    /* TODO: Irgendwas dagegen machen? */
  }
}

/**
 * Oeffnet eine Referenz. Der Menuzustand wird als HttpRequest Parameter
 * kodiert und mit gesendet. Bevor dies passiert, wird der Zustand eines
 * Menu-Items ausgetauscht (Menu-Klick, aufklappen, Seite oeffnen).
 *
 * @param elementId elementID Die ID des Menu-Items.
 * @param href Die zu oeffnende Seite.
 * @param wndw Referenz auf das Window Objekt.
 */
MenuManager.prototype.switchMenuDisplayAndOpenHref = function(elementId, href, wndw) {
  this.switchMenuDisplay(elementId);
  this.openHref(href, wndw);
}

MenuManager.prototype.debug = function() {
  var value = "";
  for (var i = 0; i < this.menuDisplay.size(); i++) {
    value = value + this.menuDisplay.get(i) + ",";
  }
  return "menu=" + value;
}
