//////////////////////////////////////////////////////////////////////
//  Menu.js
//////////////////////////////////////////////////////////////////////

/* Implements a dynamic menu through JavaScript and CSS.
 * 
 * Features:
 * - expandible/collapsible
 * - selectable
 */

//////////////////////////////////////////////////////////////////////
//  Menu management
//////////////////////////////////////////////////////////////////////

function getAllSubmenus(menu){
    var nodes = menu.getElementsByTagName("UL");
    return nodes;
}

function getAllMenuItems(menu){
    var nodes = menu.getElementsByTagName("LI");
    return nodes;
}

function getAllMenuLinks(menu){
    var nodes = menu.getElementsByTagName("A");
    return nodes;
}

function expandMenu(menu){
    var nodes = getAllSubmenus(menu);
    for(i=0; i < nodes.length; i++) {
        var node = nodes.item(i);
        showMenuItem(node);
    }
}

function collapseMenu(menu){
    var nodes = getAllSubmenus(menu);
    for(i=0; i < nodes.length; i++) {
        var node = nodes.item(i);
        if(node !== menu) hideMenuItem(node);
    }
}

function unselectMenu(menu){

    var nodes, node;
    nodes = getAllMenuItems(menu);
    for(i=0; i < nodes.length; i++) {
        node = nodes.item(i);
        deactivateMenuItem(node);
    }

    nodes = getAllMenuLinks(menu);
    for(i=0; i < nodes.length; i++) {
        node = nodes.item(i);
        deactivateMenuItem(node);
    }
}

function isMenuItemVisible(node){
    return (node.style.display=="block");
}

function showMenuItem(node){
    node.style.display="block";
}

function hideMenuItem(node){
    node.style.display="none";
}

function isMenuItemActive(node){
    return (node.className=="active");
}

function activateMenuItem(node){
    node.className="active";
}

function deactivateMenuItem(node){
    node.className="";
}

function selectNavMenu(id){
    var node = document.getElementById(id);
    var nodeLink = node.firstChild;
    unselectMenu(navMenu);
    activateMenuItem(node);
    activateMenuItem(nodeLink);
}

function selectTabsMenu(id){
    var node = document.getElementById(id);
    activateMenuItem(node);
}

function selectSubMenu(id){
    var node = document.getElementById(id);
    activateMenuItem(node);
}

function selectMenu(id){

    /* Get node relationships */
    var node = document.getElementById(id);
    var nodeLink = node.firstChild;
    var topMenuUL = getTopMenuItem(node);  /* cerco il menu di I livello */
    var topMenuLI = topMenuUL.parentNode;
    var topMenuSubmenus = topMenuUL.getElementsByTagName("UL");
    /*
    debug("selectMenu("+id+")");
    debug("  node="+dumpNode(node));
    debug("  nodeLink="+dumpNode(nodeLink.parentNode));
    debug("  topMenuUL="+dumpNode(topMenuUL));
    debug("  topMenuLI="+dumpNode(topMenuLI));
    */

    /* Main menu actions:
        - collapse all items
        - unselect all items
     */
    unselectMenu(mainMenu);
    collapseMenu(mainMenu);
	
    /* Related node actions:
        - show      1st level menu and related submenus
        - highlight 1st level menu link
     */
    showMenuItem(topMenuUL);
    for (i=0; i < topMenuSubmenus.length; i++) {
        var m = topMenuSubmenus.item(i);
        showMenuItem(m);
        //debug("  --- topMenuSubmenus = "+dumpNode(m));
    }
    activateMenuItem(nodeLink);

    /* Current node actions:
        - highlight selected node
     */
    activateMenuItem(topMenuLI);
}

/* Returns 1st level menu related to the node */
function getTopMenuItem(node) {
    var lastUL = node;
    var curNode = node;
    var t = "";

    /* Node is already at 1st level */
    if (curNode.parentNode === mainMenu) {
        var ul = getChildNodesByTagName(curNode, "UL");
        if (ul.length) lastUL = ul[0];
        t = lastUL.id;
    }

    /* Browse up UL tags until 1st level UL (mainMenu) */
    while (curNode.parentNode !== mainMenu) {
        curNode = curNode.parentNode;
        if (curNode.tagName=="UL") {
            lastUL = curNode;
            t = lastUL.id + " < " + t;
        }
    }
    //debug(t);
    return lastUL;
}

//////////////////////////////////////////////////////////////////////
//  Debug
//////////////////////////////////////////////////////////////////////

function dumpNode(node) {
    if (node.tagName)
        return '<'+node.tagName+' id='+quote(node.id)+'>';
        //return '<'+node.tagName+' id='+quote(node.id)+' class='+quote(node.className)+'>';
    else
        return '';
}

function dumpNodes(nodes) {
    var t = '';
    for(i=0; i < nodes.length; i++)
        t += '\n'+dumpNode(nodes[i]);
    return t;
}
