var DropdownMenu = new Object();

// =========================================================
// Initialization
// =========================================================
DropdownMenu.Init = function(htmlObject)
{
    // inherit some basic functionality
    Menu.Inherit(this, "Dropdown", htmlObject);
    this.Expanded = new Object();
    
    this.MenuCount = 0;
    
    this.SplitContent(Navigator.Hierarchy);
    
    // show menu
    this.Show(Navigator.Hierarchy);
}

DropdownMenu.SplitContent = function(menuitems)
{
    if (menuitems == null) return;
    
    for(var i = 0; i < menuitems.length; i++)
    {
        var menuitem = menuitems[i];
        
        if (this.IsRelevant(menuitem)){
            if(menuitem.DocumentUrl != null && menuitem.IsOwner == "false" && (this.HasRelevantMenuitems(menuitem.Children) > 0)){
                Navigator.Split(menuitem, MenuType.None);
            }
            this.SplitContent(menuitem.Children);
        }
    }
}

DropdownMenu.Show = function(menuitems)
{
    this.CreateMenu(menuitems);
}

DropdownMenu.CreateMenu = function(menuitems, level)
{
    var result = "";
    if (level == null) level = 0;
    
    if (level >= this.MenuCount)
    { 
        // create new menu
        var levelId = this.LevelId(level);
        var classes = this.Style + '_menu ';
        
        if (level != 0) classes = this.Style + '_submenu';
        
        result += '<div id="' + this.SubmenuId(level) + '" class="' + classes + '">';
            
        result += this.CreateMenuContent(menuitems, levelId);
        result += '</div>';

        this.MenuCount++;

        $(this.HtmlObject).append(result);
        
        var menuObject = $("#" + this.SubmenuId(level));
        menuObject.bind("mouseenter", function(){ DropdownMenu.DontClose(); } );
        menuObject.bind("mouseleave", function(){ DropdownMenu.PrepareClose(); } );
    } else {
        // update existing menu
        var menuObject = $("#" + this.SubmenuId(level));
        menuObject.html(this.CreateMenuContent(menuitems, levelId));
    }
}

DropdownMenu.CreateMenuContent = function(menuitems, levelId)
{
    var result = "";
    
    for (var i in menuitems)
    {
        var menuitem = menuitems[i];

        result += '<div id="' + this.NodeId(menuitem) + '" class="' + this.GetNodeClasses(menuitem) + '">';
        
        if (this.HasContent(menuitem))
        {
            result += '<a id="' + this.ButtonId(menuitem) + '" class="' + this.GetButtonClasses(menuitem) + '" ' +
                'href="' + Navigator.GetDeepLink(menuitem) + '" onclick="Navigator.OpenId(\'' + menuitem.Id + '\');  return false;">' + menuitem.Title + '</a>';
        } else if (this.CountRelevantMenuitems(menuitem.Children) > 0)
        {
            result += '<a id="' + this.ButtonId(menuitem) + '" class="' + this.GetButtonClasses(menuitem) + '" ' +
            'href="#" onclick="DropdownMenu.Open(\'' + menuitem.Id + '\'); return false;">' + menuitem.Title + '</a>';
        } else 
        {
            result += '<a id="' + this.ButtonId(menuitem) + '" class="' + this.GetButtonClasses(menuitem) + '" ' +
                '>' + menuitem.Title + '</a>';
        }
      
        result += '</div>';
    }
    
    return result;    
}

DropdownMenu.GetButtonClasses = function (menuitem)
{
    var level = this.GetLevel(menuitem);
    var levelId = this.GetLevelId(menuitem);
    
    var classes = this.Style + '_button';
    classes += ' ' + this.Style + '_' + levelId + '_button';
    if (level >= 1) classes += ' ' + this.Style + '_submenu_button';
    
    if (this.HasContent(menuitem)){
        classes += ' ' + this.Style + '_link';
        classes += ' ' + this.Style + '_' + levelId + '_link';
        if (level >= 1) classes += ' ' + this.Style + '_submenu_link';
        
        if (menuitem.Id == this.ActiveId){
            classes += ' ' + this.Style + '_link_active';
            classes += ' ' + this.Style + '_' + levelId + '_link_active';
            if (level >= 1) classes += ' ' + this.Style + '_submenu_link_active';
        }
    }
    
    if (this.CountRelevantMenuitems(menuitem.Children) > 0){
        classes += ' ' + this.Style + '_parent';
        classes += ' ' + this.Style + '_' + levelId + '_parent';
        if (level >= 1) classes += ' ' + this.Style + '_submenu_parent';

        if (menuitem.Expanded === true){
            classes += ' ' + this.Style + '_button_expanded';
            classes += ' ' + this.Style + '_' + levelId + '_button_expanded';
            if (level >= 1) classes += ' ' + this.Style + '_submenu_button_expanded';
        }
    }
    
    return classes;
}

DropdownMenu.GetNodeClasses = function (menuitem)
{
    var level = this.GetLevel(menuitem);
    var levelId = this.GetLevelId(menuitem);
    
    var classes = this.Style + '_node';
    classes += ' ' + this.Style + '_' + levelId + '_node';
    if (level >= 1) classes += ' ' + this.Style + '_submenu_node';
    
    if (menuitem.Filtered == true){
        classes += ' ' + this.Style + '_node_' + Navigator.GetFilterType();
        classes += ' ' + this.Style + '_' + levelId + '_node_' + Navigator.GetFilterType();
        if (level >= 1) classes += ' ' + this.Style + '_submenu_node_' + Navigator.GetFilterType();
    }
    
    return classes;
}

DropdownMenu.GetExpanderClasses = function(menuitem)
{
    var level = this.GetLevel(menuitem);
    var levelId = this.GetLevelId(menuitem);
    
    var classes = this.Style + '_expander';
    classes += ' ' + this.Style + '_' + levelId + '_expander';
    if (level >= 1) classes += ' ' + this.Style + '_submenu_expander';
    
    if (menuitem.Expanded === true){
        classes += ' ' + this.Style + '_expander_expanded';
        classes += ' ' + this.Style + '_' + levelId + '_expander_expanded';
        if (level >= 1) classes += ' ' + this.Style + '_submenu_expander_expanded';
    }
    
    return classes;
}

DropdownMenu.ButtonId = function(menuitem)
{
    return (this.Id + '_button_' + menuitem.Id);
}

DropdownMenu.NodeId = function(menuitem)
{
    return (this.Id + '_node_' + menuitem.Id);
}

DropdownMenu.ExpanderId = function(menuitem)
{
    return (this.Id + '_expander_' + menuitem.Id);
}

DropdownMenu.SubmenuId = function(level)
{
    if (level == null || level == 0) return this.Id + "_main";
    return (this.Id + '_submenu' + level);
}

DropdownMenu.LevelId = function(level)
{
    if (level == null || level == 0) var levelId = "main";
    else var levelId = 'submenu' + level;

    return levelId;
}

DropdownMenu.GetLevel = function(menuitem)
{
    var level = 0;
    
    while (menuitem.Id != Navigator.RootId && menuitem.Parent != null)
    {
        level++;
        menuitem = menuitem.Parent;
    }
    
    return level;    
}

DropdownMenu.GetLevelId = function(menuitem)
{
    return this.LevelId(this.GetLevel(menuitem));
}


DropdownMenu.UpdateItem = function(menuitem, opened)
{
    var menuButton = document.getElementById(this.ButtonId(menuitem));

    // update state
    if (opened === true)
    {
        // highlight menuitem
        this.ActiveId = menuitem.Id;
    } else if (opened === false)
    {
        this.ActiveId = "";
    }

    // update classes for menuitem
    if (menuButton != null) menuButton.className = this.GetButtonClasses(menuitem);
}

DropdownMenu.Open = function(menuitemId)
{
    var menuitem = Navigator.Menuitems[menuitemId];
    if (menuitem == null) alert("can't open submenu of menuitem '" + menuitemId + "'");
    this.OpenMenuitem(menuitem);
}

DropdownMenu.OpenMenuitem = function(menuitem)
{
    // get level of the menuitem
    var level = this.GetLevel(menuitem);
    
    if (menuitem.Expanded === true) // if menuitem was expanded, close it
    {
        this.CloseSubmenus(level + 1);
    } else 
    {
        // close all submenus above the level
        this.CloseSubmenus(level + 2);
        this.OpenSubmenu(menuitem, level + 1);
    }
}

DropdownMenu.CloseSubmenus = function(level)
{
    var submenu = document.getElementById(this.SubmenuId(level));
    
    while (submenu != null)
    {
        // hide menu
        submenu.style.display = "none";
        
        // collapse old expanded item
        if (this.Expanded[level] != null)
        {
            this.Expanded[level].Expanded = false;
            this.UpdateItem(this.Expanded[level]);
            this.Expanded[level] = null;
        }
        
        // find next menu
        level++;
        submenu = document.getElementById(this.SubmenuId(level));
    }
}

DropdownMenu.OpenSubmenu = function(menuitem, level)
{
    if (level <= this.MenuCount)
    {
        // collapse old expanded item
        if (this.Expanded[level] != null)
        {
            this.Expanded[level].Expanded = false;
            this.UpdateItem(this.Expanded[level]);
        }
    }
    
    // create new menu
    this.CreateMenu(menuitem.Children, level);
    
    // show menu
    subMenu = document.getElementById(this.SubmenuId(level));
    subMenu.style.display = "";
 
    // expand new item
    this.Expanded[level] = menuitem;
    menuitem.Expanded = true;
    this.UpdateItem(menuitem);

    // move menu to correct spot
    var coords = this.GetMenuCoordinates(menuitem, level);
    
    subMenu.style.left = String(coords.X) + "px";
    subMenu.style.top = String(coords.Y) + "px";
}

DropdownMenu.GetCoordinates = function(object)
{
    var offset = object.offset();

    return { "X": offset.left, "Y": offset.top };
}

DropdownMenu.GetMenuCoordinates = function(menuitem, level)
{
    var menuButton = $("#" + this.NodeId(menuitem));
    
    var coords = this.GetCoordinates(menuButton);
    
    if (level == 1)
    {
        coords.Y += menuButton.height();
    } else if (level > 1)
    {
        coords.X += menuButton.width();
    }
    
    return coords;
}

/*
    Called whenever a the focus of a menuitem is removed
*/
DropdownMenu.PrepareClose = function()
{
    if (this.AutoClose != null) window.clearTimeout(this.AutoClose);
    
    this.AutoClose = window.setTimeout("DropdownMenu.CloseAllSubmenus();", 200);
    this.DoClose = true;
}

DropdownMenu.CloseAllSubmenus = function()
{
    this.AutoClose = null;
    
    if (this.DoClose === true){
        DropdownMenu.CloseSubmenus(1);
    }
}

/*
    Called whenever a menuitem is focused upon
*/
DropdownMenu.DontClose = function()
{
    this.DoClose = false;
}