//------------------------
// Global Active Id
//------------------------
var activeId = "";
var globalMenu = "";

var globalMenus = Array(10);
var globalMenusIdx = 0;

//------------------------
// Class Menu
//------------------------
function Menu () {
    this.items = Menu.arguments || Array();
    this.name="";
    this.top="";
    this.element=null;
    this.draw = drawMenu;
    // Methods
    this.isVisible = isVisibleMenu;
    this.isActive = isActiveMenu;
    this.setName = setNameMenu;
    this.setActive = setActiveMenu;
    this.redraw = redrawMenu;
    this.show = showMenu;
    this.addItem = addItem;
    this.addItems = addItems;

    // PrintHTML("resultat", "new Menu()<br/>");
}

//------------------------
// Class Item
//------------------------
function Item ( id, text, url, menu ) {
    this.id = id;
    this.text = text;
    this.url = url;
    this.menu = menu;
    this.name="";
    this.top="";
    this.expanded = false;
    this.selected = false;
    // Methods
    this.draw = drawItem;
    this.isVisible = isVisibleItem;
    this.isActive = isActiveItem;
    this.setName = setNameItem;
    this.setActive = setActiveItem;
    this.addMenu = addMenu;
    // PrintHTML("resultat", "new Item("+id+","+text+","+url+","+menu+")<br/>");
}

function addMenu( menu ) {
    this.menu = menu;
}

function addItem( item ) {
    this.items[ this.items.length ] = item;
}

function addItems( items ) {
    this.items = items;
}

// Menu.isVisible()
//   retorna true si jo o algun fill som desplegats o actius
//
function isVisibleMenu() {
    for(var i=0; i<this.items.length; i++)
    {
        if( this.items[i].isVisible() )
            return true;
    }
    return false;
}

// Item.isVisible()
//   retorna true si jo o algun fill som desplegats o actius
//
function isVisibleItem() {
    if( this.selected || this.expanded )
        return true;
    if( this.menu )
        return this.menu.isVisible();
    return false;
}

// Menu.isActive()
//   retorna true si jo o algun fill som actius
//
function isActiveMenu() {
    for(var i=0; i<this.items.length; i++)
    {
        if( this.items[i].isActive() )
            return true;
    }
    return false;
}

// Item.isActive()
//   retorna true si algun fill o jo actius
//
function isActiveItem() {
    if( this.selected )
        return true;
    if( this.menu )
        return this.menu.isActive();
    return false;
}

// Menu.setActive(id)
//   marca com actiu el fill amb aquesta id
//
function setActiveMenu(id) {
    for(var i=0; i<this.items.length; i++)
    {
        this.items[i].setActive(id);
    }
}

// Item.setActive(id)
//   marca com actiu aquest node o el seu fill que tingui aquesta id.
//   inicialitza els selecteds, per replegar els menus no visibles.
//
function setActiveItem(id) {
    if( this.id != id )
        this.selected = false;
    else
        this.selected = true;

    if( this.menu )
        this.menu.setActive(id);
}

// Menu.setName
//
function setNameMenu(name, top) {
    this.name = name;
    if(top)
        this.top = top;
    else
        this.top = name;
    for(var i=0; i<this.items.length; i++)
    {
        this.items[i].setName(this.name+".items["+i+"]", this.top);
    }
}

// Item.setName
//
function setNameItem(name, top) {
    this.name = name;
    this.top = top;
    if(this.menu)
        this.menu.setName(this.name+".menu", this.top);
}

// Menu.draw()
//
function drawMenu() {
    var menuHTML = "";

    if(this.top == this.name)
        menuHTML = "<ul class=\"menu-bar\">";
    else
        menuHTML = "<ul>";

    for(var i=0; i < this.items.length; i++)
    {
        menuHTML += this.items[i].draw();
    }

    return menuHTML+"</ul>";
}

// Menu.redraw()
//
function redrawMenu() {
    DrawHTML( this.element, this.draw() );
}

// Menu.show()
//
function showMenu(elementName) {
    this.element = elementName;
    this.redraw();
}

// Item.draw()
//
function drawItem() {
    var menuHTML = "";
    var drawTable = false;
    var linkAnchor = "";

    if(this.menu && !this.isActive())
        drawTable = true;

    if( this.url ) {
        linkAnchor = "<a href=\""+ this.url +"\">"+ this.text + "</a>";
    } else {
        if( drawTable ) {
            if( this.isVisible() )
                linkAnchor = "<a href=\"#\" onClick=\"return change("+ this.name +","+ this.top +",false);\">"+ this.text +"</a>";
            else
                linkAnchor = "<a href=\"#\" onClick=\"return change("+ this.name +","+ this.top +",true);\">"+ this.text +"</a>";
        } else
            linkAnchor = "<a href=\"javascript:void(0);\">"+ this.text + "</a>";
    }


    menuHTML += "<li id=\""+ this.id +"\">";

    if( this.selected )
        menuHTML += "<strong>";


    if( drawTable ) {
        menuHTML += "<table class=\"submenu-table\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">";
        menuHTML += "<tr><td class=\"submenu-link\">";
    }

    menuHTML += linkAnchor;

    if(drawTable) {
        menuHTML += "</td><td class=\"submenu-unexpanded\">";
        if( this.isVisible() )
            menuHTML += "<a href=\"#\" onClick=\"return change("+ this.name +","+ this.top +",false);\">^</a>";
        else
            menuHTML += "<a href=\"#\" onClick=\"return change("+ this.name +","+ this.top +",true);\">&gt;</a>";
        menuHTML += "</td><tr></table>";
    }

    if( this.selected )
        menuHTML += "</strong>";

    if(this.menu && this.isVisible() )
        menuHTML += this.menu.draw();

    menuHTML += "</li>";

    // alert( menuHTML );
    return menuHTML;
}


function DrawHTML(id, content, classname)
{
    var c = document.getElementById ? document.getElementById(id)
        : document.all ? document.all[id]
        : document.layers ? document.layers[id] : null;
//        : document.layers ? document[id+'Outer'].document[id+'Inner'] : null;
    if( !c ) {
        alert( "Can't find '"+id+"' element in document");
        return;
    }

    if (document.layers) {
        var spanStr = (classname) ? '<span class="'+classname+'">' : '<span>';
        c.document.write(spanStr + content + '</span>');
        c.document.close();
    } else {
        if (document.all || document.getElementById) {
            c.innerHTML = content;
            if (classname)
            {
                c.className = classname;
            }
        }
    }
}

function PrintHTML(id, content)
{
    var c = document.getElementById ? document.getElementById(id)
        : document.all ? document.all[id]
        : document.layers ? document.layers[id] : null;
    if( !c ) {
        alert( "Can't find '"+id+"' element in document");
        return;
    }

    if (document.all || document.getElementById) {
        c.innerHTML += content;
    }
}

function change( menu, top, visible )
{
    menu.expanded = visible;
    top.redraw();
    return false;
}

// Busquem els LI i retornem els Items
function domparseGetAnchorText(c) {
    var i, child;
    
    for(i=0; i < c.childNodes.length; i++) {
        child = c.childNodes.item(i);
        if( child.nodeName == "A" ) {
            return child.firstChild.nodeValue;
        }
    }

    return "noText";
}

function domparseGetAnchorUrl(c) {
    var i, child;
    
    for(i=0; i < c.childNodes.length; i++) {
        child = c.childNodes.item(i);
        if( child.nodeName == "A" ) {
            return child.href;
        }
    }

    return null;
}


// Busquem un UL i retornem el menu que conte
function domparseMenu(c) {
    var i, child;
    
    var element = null;
    
    for(i=0; i < c.childNodes.length; i++) {
        child = c.childNodes.item(i);
        if( child.nodeName == "UL" ) {
            element = new Menu();
            element.addItems( domparseItems(child) );
            return element;
        } 
    }
    
    return element;
}

// Busquem els LI i retornem els Items
function domparseItems(c) {
    var i, child;
    
    var items=Array();
    
    for(i=0; i < c.childNodes.length; i++) {
        child = c.childNodes.item(i);
        if( child.nodeName == "LI" ) {
            var id=child.id;
            var text=domparseGetAnchorText(child);
            var url=domparseGetAnchorUrl(child);;
            var menu=domparseMenu(child);
            
            items[ items.length ] = new Item(id, text, url, menu);
        } 
    }
    
    return items;
}

function StartMenu( activeId, menuId ) {
    var menu = null;
    var c = document.getElementById ? document.getElementById(menuId)
        : document.all ? document.all[menuId]
        : document.layers ? document.layers[menuId] : null;
    
    if(!c)
    {
        alert("No trobo el id");
        return;
    }

    menu = domparseMenu(c);

    if(!menu) {
        alert(menu+"No hi ha menu");
        return;
    }

    globalMenus[ globalMenusIdx ] = menu;

    menu.setName("globalMenus["+globalMenusIdx+"]"); // Hack: nom del objecte creat amb "new Menu(...)"
    globalMenusIdx++;

    menu.setActive( activeId ); // Element Actiu
    menu.show( menuId ); // Id del <div> del menu principal
}

