

// Rozbalovací menu

// prepinace
var preserve_state = 1;
var toggle = 0; // if true: toggle else: close others, open this

// ulozeni stavu
var state_mask;


function init_menu()
// inicializuje menu
/*
close_mask .. seznam uzlu ke sbaleni (typicky neterminaly)
open_mask .. seznam uzlu k rozbaleni (ma prednost pred state_mask)
state_mask .. seznam uzlu k rozbaleni (ukladany do cookie)
*/
{
	if (!document.getElementById('emenu')) return;

	state_mask = 0;
  set_vis_root(1);  // js-odkryti
	if (toggle) {
    set_vis_mask(close_mask, 0);
  }
  else {
    var root = document.getElementById('broot');
    showKids(0, root, true);
  }

  if (open_mask != 0) {
    set_vis_mask(open_mask, 1);
  }
  else {
    state_mask = load_state();
    set_vis_mask(state_mask, 1);
  }

  save_state(state_mask);
}


function openAll()
{
  showKids(1, document.getElementById('broot'), true);
  save_state(state_mask);
}


function closeAll()
{
  showKids(0, document.getElementById('broot'), true);
  save_state(state_mask);
}


function set_vis_root(vis)
// nastavi viditelnost menu
{
  body = document.getElementById('emenu');
  body.style.display = vis ? 'block' : 'none';
}


function set_vis_mask(mask, vis)
// nastavi viditelnost neterminalu urcenych maskou
{
  if (mask == 0) return;
  for (i = 0; i < 32; i++) {
  	if ((1 << i) & mask)
      set_vis(i, vis);
  }
}


function set_vis(id, vis)
// nastavi viditelnost uzlu
{
  head = document.getElementById('h' + id);
  body = document.getElementById('b' + id);

  if (!head || !body) return;

  head.className = vis ? 'op' : 'cl';
  body.style.display = vis ? 'block' : 'none';

  if (vis)
    state_mask = state_mask |  (1 << id);
  else
    state_mask = state_mask & ~(1 << id);
}


function get_vis(id)
// zjisti viditelnost uzlu
{
  body = document.getElementById('b' + id);
  return (body.style.display != 'none');
}


function click(id)
// prepne viditelnost uzlu
{
	if (toggle) {
	  set_vis(id, !get_vis(id));
  }
  else {
  	var elem = document.getElementById('b' + id);

  	if (get_vis(id)) {
  		// alert("attempt to close");
      showKids(0, elem.parentNode.parentNode, true); // close
    }
    else {
      showKids(0, elem.parentNode.parentNode, true); // close
      showKids(1, elem.parentNode, false); // open
    }
  
  }
  save_state(state_mask);
}

function showKids(vis, elem, recurse) {
  var i, kid;
  for (i = 0; i < elem.childNodes.length; i++) {
    kid = elem.childNodes[i];
    if (kid.tagName == 'UL' || kid.tagName == 'ul') {
      set_vis(kid.id.substring(1), vis);
    }
    if (recurse) {
      showKids(vis, kid, recurse);
    }
  }
}

// *** //

function load_state()
// nacte stav menu z cookie
{
  return preserve_state ? GetCookie('menuState') : null;
}


function save_state(mask)
// ulozi stav menu do cookie
{
  if (preserve_state)
    SetCookie('menuState', mask);
}


