/*
 * Las funciones getenv_() y setenv_() imitan las funciones estándar de
 * C, usando las cookies como "entorno de variables".
 */
function getenv_(varName)
{
  // Get the cookie
  var cookies = document.cookie.split('; ');

  // Parse the cookies: get the stored time
  for (var loop=0; loop < cookies.length; loop++)
  {
    var entry = cookies[loop].split('=');
    // Get the cookie time stamp
    if (entry[0].toString() == varName)
    {
      return entry[1].toString();
    }
  }
  return null;
}

function setenv_(varName, varValue)
{
  document.cookie = varName.toString() + '=' + varValue.toString() + ';';
}

/**
 * Objeto MenuItem escrito con un estilo de JavaScript más actual.
 */

function MenuItem (url, text)
{
  this.init (url, text);
}

MenuItem.prototype =
{
  init : function (url, text)
  {
    this.href = url;
    this.text = text;
  },
  
  /** MenuItem.write
   *
   * Escribe un elemento de menu en el código HTML de la página.
   * El aspecto de los elementos de menú pueden personalizarse a traves
   * de los bloques DIV de clase menu-item.
   */
  write : function (doc)
  {
    var s= '<div class="menu-item"><a href="' +
         this.href +
         '" target="bodytext">' +
         this.text + 
         '</a></div>';
    doc.write (s);
  }
}


/** menu_write
 ** Menu.write
 *
 * Escribe el menú en el código HTML. La forma en que se muestra el menú
 * dependerá del estado de visibilidad del menu (0 ó 1).
 * El aspecto puede personalizarse a traves de los bloques DIV de clase
 * menu-title, que controla el aspecto del titulo del menú, mientras que
 * DIV.menu representa el menu propiamente dicho.
 */
function menu_write (doc)
{
  var s;
  
  s ='<div class="menu-title"><a href="index.html" onclick="return change_menu_state(';
  s += "'" + this.id + "'" + ')"><img src="';
  if (this.state == 0)
  {
    s += 'img/btn-plus.png" alt="[+]';
  }
  else
  {
    s += 'img/btn-minus.png" alt="[-]';
  }
  s += '" id="img-' + this.id;
  s += '" style="border: 0;"/></a>&nbsp;';
  
  if (this.href != null)
  {
    s += '<a target="bodytext" onclick="return set_menu_state(';
    s += "'" + this.id + "'" + ',1)" href="';
    s += this.href + '">' + this.text + '</a>';
  }
  else
  {
    s+= this.text;
  }
  s += '</div><div class="menu" id="'
  s += this.id + '" style="display: ';
  
  // El estado del menu dependerá de aparezca el id en la URL
  if (this.state)
  {
    s += 'block';
  }
  else
  {
    s += 'none';
  }

  s+= ';">';
  
  doc.write (s);
  
  for (var i=0; i < this.items.length; i++)
  {
    this.items[i].write (doc);
  }
  doc.write ("</div>");
}

/** menu_set_display_mode
 ** Menu.setDisplayMode
 *
 * Fija el estado de visibilidad del menú: de desplegado (1) u oculto (0).
 */
function menu_set_display_mode (state)
{
  var s;

  this.state = state;
  if (this.state)
    s = 'block';
  else
    s = 'none';

  document.getElementById (this.id).style.display = s;

  var img = document.getElementById ("img-" + this.id);
  if (this.state == 0)
  {
    img.src = 'img/btn-plus.png';
  }
  else
  {
    img.src = 'img/btn-minus.png';
  }
}

/** menu_change_state
 ** Menu.changeState
 *
 * Cambia el estado de visibilidad del menú: de desplegado u oculto.
 */
function menu_change_state ()
{
  this.setDisplayMode (1-this.state);
}

/** Menu (id, text, url, ...)
 *
 * Constructor de un objeto Menu, caracterizado por el ID que se le pasa
 * y el texto que se mostrará al dibujar el menú. La URL solo se utiliza
 * si se pasa algo diferente a 'null'
 *
 * Se utiliza la URL de la ventana que crea el menú para localizar el
 * estado de presentación inicial del menú: si está presenta la variable
 * 'menu_bar_state', esta debe ser una lista de id's separados por comas.
 * Si el ID del menú que se está creando está en esta lista, entonces el
 * menú debe crearse en estado desplegado, en otro caso sus elementos
 * estarán ocultos.
 *
 * A los argumentos 'id' y 'text' le pueden seguir más argumentos, puestos
 * por pares, para crear inmediatamente los primeros elementos del menú.
 * Cada par de cadenas serán: (1) la URL al ejecutar cuando se active el
 * el elemento y (2) el texto que se mostrará como enlace.
 */
function Menu (id, text, url)
{
  this.text = text;
  this.id = id;
  this.href = url;
  this.state = 0;
  this.items = new Array();

  this.write = menu_write;
  this.setDisplayMode = menu_set_display_mode;
  this.changeState = menu_change_state;

  // Si el id de menu está en la variable menuBarState, marcarlo como
  // visible
  var menuBarState = getenv_("menuBarState");
  if (menuBarState && menuBarState.length > 0)
  {
    var j = menuBarState.indexOf (this.id);
    this.state = (j>=0);
  }
  
  var j = 0;
  var i = 4; // los tres primeros argumentos son id, text y url
  while (i < Menu.arguments.length)
  {
    this.items[j] = new MenuItem (Menu.arguments[i-1], Menu.arguments[i]);
    
    // siguiente
    ++j;
    i += 2;
  }
}

/** menu_bar_write
 ** MenuBar.write
 *
 * Escribe los elementos de menú en codigo HTML
 * El aspecto del panel de menú puede personalizarse a traves de los
 * bloques DIV de clase menu-bar.
 */
function menu_bar_write (doc)
{
  doc.write ('<div class="menu-bar">');
  for (var i=0; i < this.items.length; i++)
  {
    this.items[i].write (doc);
  }
  doc.write ('</div>');
}

/** menu_bar_append
 ** MenuBar.append
 *
 * Añade un menú adicional a la barra de menúes. El nuevo elemento irá
 * detrás de los ya incorporados.
 */
function menu_bar_append (menu)
{
  var i;
  
  i = this.items.length;
  this.items[i] = menu;
}

/** menu_bar_get_element_by_id
 ** MenuBar.getElementById
 *
 * Devuelve el objeto del menu con el ID que se le pasa, o 'null' si no
 * existe ningún menú con el id indicado.
 */
function menu_bar_get_element_by_id (id)
{
  for (var i=0; i < this.items.length; i++)
  {
    if (this.items[i].id == id)
      return this.items[i];
  }
  return null;
}

/** menu_bar_get_state_string
 ** MenuBar.getStateString
 *
 * Devuelve una cadena de texto que representa el estado de despliegue
 * de los submenus.La cadena está formada por todos los ID's de menúes
 * que se encuentran desplegados separados por comas. Si no hay ninguno
 * se devuelve una cadena vacía.
 */
function menu_bar_get_state_string()
{
  var s;
  var k;
  
  s = "";
  k = false;
  for (var i=0; i < this.items.length; i++)
  {
    if (this.items[i].state)
    {
      if (k)
      {
        s += ',';
      }
      s += this.items[i].id;
      k = true;
    }
  }
  return s;
}

/** MenuBar
 *
 * Constructor de un objeto MenuBar
 */
function MenuBar()
{
  this.items = new Array();
  
  this.write = menu_bar_write;
  this.append = menu_bar_append;
  this.getElementById = menu_bar_get_element_by_id;
  this.getStateString = menu_bar_get_state_string;
}

function change_bodytext_height()
{
  var iframe = document.getElementById ("bodytext");
  iframe.style.height = (window.innerHeight - 152) + "px";
  
}

function change_menu_state (id)
{
  var submenu;
  var stateString;

  
  submenu = menu.getElementById (id);
  //if (submenu == null) return false;
  submenu.changeState();

  stateString = menu.getStateString();
  if (stateString.length > 0)
  {
    setenv_("menuBarState", stateString);
  }
  else
  {
    setenv_("menuBarState", "");
  }

  return false;
}

function set_menu_state (id, state)
{
  var submenu;
  var stateString;

  submenu = menu.getElementById (id);
  submenu.setDisplayMode (state);

  stateString = menu.getStateString();
  if (stateString.length > 0)
  {
    setenv_("menuBarState", stateString);
  }
  else
  {
    setenv_("menuBarState", "");
  }
  return true;

}

