var TreeMenu = new Object();


// =========================================================
// Initialization
// =========================================================
/*
    Inheritance simulation
*/
TreeMenu.Inherit = function(object, type, htmlObject){
    for(var key in this){
        if (object[key] == null) object[key] = this[key];
    }

    Menu.Inherit(object, type, htmlObject);
}

/*
    Initializes the tree menu
*/
TreeMenu.Init = function(htmlObject)
{
    // inherit some basic functionality
    Menu.Inherit(this, "Tree", htmlObject);
    
    // show menu
    this.Show(Navigator.Hierarchy);
}

TreeMenu.Show = function(menuitems)
{
    var html = this.CreateInterface(menuitems);
    this.HtmlObject.innerHTML = html;
}

TreeMenu.CreateInterface = function(menuitems)
{
    var result = '';

    for (var i = 0; i < menuitems.length; i++)
    {
        var menuitem = menuitems[i];

        if (this.IsRelevant(menuitem))
        {
            // create state
            if (menuitem.Expanded == null) menuitem.Expanded = Settings.OpenTree;
            
            result += '<div id="' + this.NodeId(menuitem) + '" class="' + this.GetMenuitemClasses(menuitem) + '">';

            // create menu toggle
            if (this.HasRelevantMenuitems(menuitem.Children) === true)
            {
                result += '<a id="' + this.ToggleId(menuitem) + '" onclick="' + this.MenuName() + '.Toggle(\'' + menuitem.Id + '\');" class="' + this.GetToggleClasses(menuitem) + '"></a>';
            }

            // create menuitem
            if (menuitem.DocumentUrl != null || menuitem.IsOwner == true){
                result += '<a href="' + Navigator.GetDeepLink(menuitem) + '" onclick="Navigator.OpenId(\'' + menuitem.Id + '\'); return false;" id="' + this.ButtonId(menuitem) + '" class="' + this.GetButtonClasses(menuitem) + '">' + menuitem.Title + '</a>';
            } else {
                result += '<a id="' + this.ButtonId(menuitem) + '" class="' + this.GetButtonClasses(menuitem) + '">' + menuitem.Title + '</a>';
            }

            // create submenu
            if (this.HasRelevantMenuitems(menuitem.Children) === true)
            {
                if (menuitem.Expanded === true) result += '<div id="' + this.SubmenuId(menuitem) + '" class="' + this.Style + '_submenu">';
                else result += '<div id="' + this.SubmenuId(menuitem) + '" class="' + this.Style + '_submenu" style="display: none;">';
                result += this.CreateInterface(menuitem.Children);
                result += '</div>';
            }

            result += '</div>';
        }
    }
    
    return result;
}

// =========================================================
// Actions
// =========================================================
/*
    Toggles the submenu of the specified menuitem.
*/
TreeMenu.Toggle = function(menuitemId)
{
    var menuitem = Navigator.Menuitems[menuitemId];
    
    var submenu = document.getElementById(this.SubmenuId({Id: menuitemId}));
    var toggleObject = document.getElementById(this.ToggleId({Id: menuitemId}));

    if (menuitem.Expanded == true)
    {
        menuitem.Expanded = false;
        toggleObject.className = this.GetToggleClasses(menuitem);
        submenu.style.display = 'none';
    }
    else
    {
        menuitem.Expanded = true;
        toggleObject.className = this.GetToggleClasses(menuitem);
        submenu.style.display = '';
    }
}

/*
    opened = true => Highlights the active menuitem  
    opened = false => Removes highlight from the previously active menuitem
*/
TreeMenu.UpdateItem = function(menuitem, opened)
{
    var menuButton = document.getElementById(this.ButtonId(menuitem));

    // update state
    if (opened == true)
    {
        //alert("opened item: " + this.Id + " " + menuitem.Id);
        // highlight menuitem
        this.ActiveId = menuitem.Id;

        // open tree
        var item = menuitem;
        while (item != null)
        {
            if (menuitem.Expanded === false) this.Toggle(item.Id);
            item = item.Parent;
        }

        //scroll here?
        if (this.NeedsScrolling == true)
        {
            this.ScrollMenuitemInView(menuitem);
        }

    } else if (opened == false)
    {
        this.ActiveId = "";
    }

    // update classes for menuitem
    if (menuButton != null) menuButton.className = this.GetButtonClasses(menuitem);
}

TreeMenu.UpdateAllItems = function()
{
    this.UpdateMenuitems(Navigator.Hierarchy);
}

TreeMenu.UpdateMenuitems = function(menuitems)
{
    for (var i in menuitems)
    {
        var menuitem = menuitems[i];

        if (this.IsRelevant(menuitem))
        {
            var htmlObject = document.getElementById(this.NodeId(menuitem));
            htmlObject.className = this.GetMenuitemClasses(menuitem);
            if (menuitem.Children != null) this.UpdateMenuitems(menuitem.Children);
        }
    }
}

// =========================================================
// Menuitem information
// =========================================================
TreeMenu.GetButtonClasses = function(menuitem)
{
    var classes = this.Style + '_menuitem';
    
    if (menuitem.Content != null || menuitem.Url != null) classes += ' ' + this.Style + '_link';
    if (menuitem.Id == this.ActiveId) classes += ' ' + this.Style + '_link_active';

    return classes;
}

TreeMenu.GetToggleClasses = function(menuitem)
{
    var classes = this.Style + '_toggle';
    if (menuitem.Expanded === true){
        classes += ' ' + this.Style + '_toggle_opened';
    } else {
        classes += ' ' + this.Style + '_toggle_closed';
    }

    return classes;
}

TreeMenu.GetMenuitemClasses = function(menuitem)
{
    var classes = this.Style + '_node';
    if (menuitem.Filtered === true){
        classes += ' ' + this.Style + '_node_' + Navigator.GetFilterType();
    }

    return classes;
}

TreeMenu.MenuName = function()
{
    return "TreeMenu";
}

TreeMenu.NodeId = function(menuitem)
{
    return (this.Id + '_node_' + menuitem.Id);
}

TreeMenu.ToggleId = function(menuitem)
{
    return (this.Id + '_toggle_' + menuitem.Id);
}

TreeMenu.ButtonId = function(menuitem)
{
    return (this.Id + '_button_' + menuitem.Id);
}

TreeMenu.SubmenuId = function(menuitem)
{
    return (this.Id + '_submenu_' + menuitem.Id);
}