/** menu.js *********************
 * ROLETOVE MENU - JavaScript   *
 * Projekt do WAP               *
 * Radovan Drlik                *
 * (xdrlik03@stud.fit.vutbr.cz) *
 ********************************/

/** Pouzivane promenne **/
var actContextMnu = null; //zobrazene kontextove menu
var inContextMnu = false; //priznak, zda se kurzor mysi nachazi nad kontextovym menu
var fncKey = "X";         //klavesa pouzivana v menu
var mnu_width = 150;      //sirka polozky v menu
var mouseX = 0;           //x-ova pozice kliknuti mysi
var mouseY = 0;           //y-ova pozice kliknuti mysi
var n=1;                  //identifikacni cislo polozky menu
var keyMnu = new Array(); //polozky menu reagujici na klavesnici
var actKeyMnuIt = 0;      //aktualni polozka

/** Inicializace - sbaleni vsech submenu a inicializace menu **/
window.onload = function() { collapseMenu(); initMenu();}


/** FUNKCE **/

 /*** INICIALIZACE ************************************************************/

  /**
   * Inicializace polozek menu pro pouziti.
   */
  function initMenu() {
    var div = document.getElementsByTagName('div');
    for (var i=0;i<div.length;i++) { //pruchod oddilu, uprava oddilu predstavujicich menu
      if (div[i].className==null) continue;
      switch (div[i].className) {
        case "menuLeft": //menu reagujici na klik
          initMenuLeft(div[i]);
          break;
        case "menuRight": //menu reagujici na klik praveho tlacitka
          initMenuRight(div[i]);
          break;

        case "menuOver": //menu reagujici na prejeti mysi
          initMenuOver(div[i]);
          break;

        case "menuContext": //kontextove menu
          initMenuContext(div[i]);
          break;

        case "menuKeyboard": //menu reagujici na stisk klavesy
          initMenuKeyboard(div[i]);
          break;

      }
    }

    /*Menu reagujici na klavesnici*/
    var fnc = new Function("e","var keyCode; if(window.event) keyCode=event.keyCode; else if(e.which) keyCode=e.which; if (keyCode==77||keyCode==109) {nextKeyMenuItem();return true;} else return true;");
    document.onkeydown = fnc;

  } //initMenu


  /**
   * Inicializace menu reagujiciho na kliknuti praveho tlacitka mysi.
   */
  function initMenuLeft(div) {
    var ul = div.getElementsByTagName('ul');
    for (var j=0;j<ul.length;j++) {
      var pom = ul[j];
      while (pom = pom.previousSibling) {
        if (pom.nodeName=="A") {
          //odkaz funguje jako prepinac - zobrazeno submenu/skryto submenu
          var fnc = new Function("toggleMenuItem('mnu"+n+"');return false;");
          ul[j].id = "mnu"+n; //id pouzito pro identifikaci polozky
          pom.onclick = fnc;
          pom.className = 'superItem'; //nastaveni tridy, znacici, ze obsahuje submenu
          n++;
          break;
        }
      }
    }
  }//initMenuLeft


  /**
   * Inicializace menu reagujiciho na kliknuti praveho tlacitka mysi.
   */
  function initMenuRight(div) {
    var ul = div.getElementsByTagName('ul');
    for (var j=0;j<ul.length;j++) {
      var pom = ul[j];
      while (pom = pom.previousSibling) {
        if (pom.nodeName=="A") {
         //odkaz funguje jako prepinac - zobrazeno submenu/skryto submenu
          var fnc = new Function("toggleMenuItem('mnu"+n+"');return false;");
          ul[j].id = "mnu"+n; //id pouzito pro identifikaci polozky
          pom.oncontextmenu = fnc;
          pom.className = 'superItem'; //nastaveni tridy, znacici, ze obsahuje submenu
          n++;
          break;
        }
      }
    }
  }//initMenuRight


  /**
   * Inicializace menu reagujiciho na prejeti mysi.
   */
  function initMenuOver(div) {
    var ul = div.getElementsByTagName('ul');
    for (var j=0;j<ul.length;j++) {
      var pom = ul[j];
      if (pom.parentNode.nodeName=="LI") {
       //polozka menu - pri prejeti mysi-zobrazeni submenu, pri opusteni skryti
        var fnc1 = new Function("openMenuItem('mnu"+n+"');return false;");
        var fnc2 = new Function("closeMenuItem('mnu"+n+"');return false;");
        ul[j].id = "mnu"+n; //id pouzito pro identifikaci polozky
        ul[j].style.width = mnu_width+"px"; //sirka menu
        /*Pozice menu*/
        ul[j].style.position = "absolute";
        ul[j].style.left = mnu_width-50+"px";
        pom.parentNode.onmouseover = fnc1;
        pom.parentNode.onmouseout = fnc2;

        var a = pom.parentNode.getElementsByTagName('a'); //vyhledani odkazu vedouciho na submenu
        if (a.length>0) a[0].className = 'superItem'; //nastaveni tridy, znacici, ze obsahuje submenu
        n++;
      }
    }
  }//initMenuOver


  /**
   * Inicializace kontextoveho menu.
   */
  function initMenuContext(div) {
    var mnuID = div.id;
    var refElem = document.getElementById("M"+mnuID);
    var ul = div.getElementsByTagName('ul');
    document.body.onmousedown = contextMouseDown; //registrace obsluhy kliknuti v dokumentu
    for (var j=0;j<ul.length;j++) {
      var pom = ul[j];
      if (pom.parentNode.nodeName=="LI") {
       //polozka menu - pri prejeti mysi-zobrazeni submenu, pri opusteni skryti
        var fnc1 = new Function("openMenuItem('mnu"+n+"');return false;");
        var fnc2 = new Function("closeMenuItem('mnu"+n+"');return false;");
        ul[j].id = "mnu"+n; //id pouzito pro identifikaci polozky
        ul[j].style.width = mnu_width+"px"; //sirka menu
        /*Pozice menu*/
        ul[j].style.position = "absolute";
        ul[j].style.left = mnu_width-50+"px";

        pom.parentNode.onmouseover = fnc1;
        pom.parentNode.onmouseout = fnc2;

        var a = pom.parentNode.getElementsByTagName('a'); //vyhledani odkazu vedouciho na submenu
        if (a.length>0) a[0].className = 'superItem'; //nastaveni tridy, znacici, ze obsahuje submenu
        n++;
      }
    }

    div.style.display='none';
    div.style.position='absolute';
    var fnc1=new Function("showContextMenu('"+mnuID+"'); return false;");
    refElem.oncontextmenu=fnc1;
    div.onmouseover = function() { inContextMnu = true; };
    div.onmouseout = function() { inContextMnu = false; };

  }//initMenuConext


  /**
   * Inicializace menu reagujici na klavesnici.
   */
  function initMenuKeyboard(div) {
    var ul = div.getElementsByTagName('ul');
    actKeyMnuIt=0;
    for (var j=0;j<ul.length;j++) {
      var pom = ul[j];
      while (pom = pom.previousSibling) {
        if (pom.nodeName=="A") {
         //odkaz funguje jako prepinac - zobrazeno submenu/skryto submenu
          var fnc = new Function("e","var keyCode; if(window.event) keyCode=event.keyCode; else if(e.which) keyCode=e.which; if (keyCode==fncKey.toUpperCase().charCodeAt(0)||keyCode==fncKey.toLowerCase().charCodeAt(0)) {toggleMenuItem('mnu"+n+"');return false;} else return true;");
          ul[j].id = "mnu"+n; //id pouzito pro identifikaci polozky
          keyMnu[actKeyMnuIt++] = pom;
          pom.onkeydown = fnc;
          pom.className = 'superItem'; //nastaveni tridy, znacici, ze obsahuje submenu
          n++;
          break;
        }
      }
    }
  }//initMenuKeyboard

 /*** /INICIALIZACE/ **********************************************************/


  /**
   * Funkce pro zabaleni vsech polozek menu.
   */
  function collapseMenu() {
    var div = document.getElementsByTagName('div');
    for (var i=0;i<div.length;i++) {
      if (!div[i].className) continue;
      switch (div[i].className) {
        case "menuLeft":
        case "menuRight":
        case "menuOver":
        case "menuContext":
        case "menuKeyboard":
          for (var j=0;j<div[i].childNodes.length;j++) {
            var act = div[i].childNodes[j];
            if (act.childNodes.length>0) {
              var nextUl = act.getElementsByTagName('ul');
              for(var k=0;k<nextUl.length;k++) {
                nextUl[k].style.display='none'; //skryti seznamu
              }
            }
          }
        break;
      }
    }
  } //collapseMenu


  /**
   * Funkce pro zobrazeni polozky menu.
   */
  function openMenuItem(id) {
    var elem = document.getElementById(id);
    if (elem) {
      elem.style.display='block'; //zobrazeni elementu
    }
    return false;
  } //openMenuItem


  /**
   * Funkce pro skryti polozky menu.
   */
  function closeMenuItem(id) {
    var elem = document.getElementById(id);
    var pomElem;
    if (elem) {
      elem.style.display='none'; //skryti zvoleneho prvku
      pomElem = elem.getElementsByTagName('ul');
      if (pomElem)
        for (var i=0;i<pomElem.length;i++) //skryti vsech podprvku
          pomElem[i].style.display='none';
    }
    return false;
  }//closeMenuItem


  /**
   * Funkce pro prepnuti mezi zobrazenou/skrytou polozkou menu.
   */
  function toggleMenuItem(id) {
    var elem = document.getElementById(id);
    if (elem && elem.style.display=='none') {
      openMenuItem(id);
    }
    else {
      closeMenuItem(id);
    }
    return false;
  } //toggleMenuItem


  /**
   * Funkce pro nastaveni focusu na polozku menu.
   */
  function setFocusToMenuItem(id) {
    var elem = document.getElementById(id);
    if (elem) {
      elem.focus();
    }
  } //setFocusToMenuItem


  /**
   * Posun na dalsi polozku menu ovladaneho klavesnici.
   */
  function nextKeyMenuItem() {
    if (keyMnu.length<=0) return;
    if (actKeyMnuIt>=keyMnu.length) actKeyMnuIt=0;
    keyMnu[actKeyMnuIt++].focus();
  }


 /** KONTEXTOVE MENU **/

  /**
   * Funkce pro zobrazeni kontextoveho menu.
   */
  function showContextMenu(id) {
    if (actContextMnu!=null) {
    //skryti minuleho kontextoveho menu
      actContextMnu.style.display='none';
    }
    var elem = document.getElementById(id);
    /*Pozice menu*/
    elem.style.left = mouseX + 'px';
    elem.style.top = mouseY + 'px';
    elem.style.display = 'block';

    actContextMnu=elem;
  }//showContextMenu


  /**
   * Funkce pro skryti kontextoveho menu.
   */
  function hideContextMenu(id) {
    var elem = document.getElementById(id);
    elem.style.display='none';
  } //hideContextMenu


  /**
   * Obsluha stisknuti tlacitka mysi.
   */
  function contextMouseDown(event) {
    /* Zjisteni a nastaveni pozice kliknuti */
    if (event == null)
      event = window.event;
    mouseX = event.clientX + (document.body.scrollLeft ? document.body.scrollLeft : document.documentElement.scrollLeft);
    mouseY = event.clientY + (document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop);

    if (!actContextMnu || inContextMnu) {
      return;
    }

    actContextMnu.style.display = 'none';
    actContextMnu = null;
  }

