var TabMenu = new Object();

// =========================================================
// Initialization
// =========================================================
/*
    Initializes the tab menu
*/
TabMenu.Init = function(htmlObject)
{
    // inherit some basic functionality
    Menu.Inherit(this, "Tab", htmlObject);
    
    // show menu
    this.Show(Navigator.Hierarchy);
    this.ResizeTabs();
    window.onresize = function(){ TabMenu.ResizeTabs(); Navigator.ResizeTabMenu(); }
}

TabMenu.Show = function(menuitems)
{
    var html = this.CreateInterface(menuitems);
    this.HtmlObject.innerHTML = html;
}

TabMenu.CreateInterface = function(menuitems)
{
    var result = '';

    // add tabs
    for (var i = 0; i < menuitems.length; i++)
    {
        var menuitem = menuitems[i];
        
        if (this.IsRelevant(menuitem))
        {
            if (this.HasContent(menuitem))
            {
                result += '<a href="' + Navigator.GetDeepLink(menuitem) + '" onclick="Navigator.OpenId(\'' + menuitem.Id + '\'); return false;" id="' + this.TabId(menuitem) + '" class="' + this.GetButtonClasses(menuitem) + '">' + menuitem.Title + '</a>';
            } else {
                result += '<a id="' + this.TabId(menuitem) + '" class="' + this.GetButtonClasses(menuitem) + '">' + menuitem.Title + '</a>';
            }
        }
    }
    
    return result;
}

// =========================================================
// Actions
// =========================================================
/*
    opened = true => Highlights the active menuitem  
    opened = false => Removes highlight from the previously active menuitem
*/
TabMenu.UpdateItem = function(menuitem, opened)
{
    if (menuitem.Type != "Tab") return;
    
    var menuButton = document.getElementById(this.TabId(menuitem));

    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);
}

/*
    Resizes all tabs
*/
TabMenu.ResizeTabs = function()
{
    // get sizes
    var tabs = this.CalculateTabSizes();
    var menuitems = Navigator.Hierarchy;
    
    var sizeIndex = 0;
    
    // change the sizes
    for (i in menuitems)
    {
        var menuitem = menuitems[i];
        if (this.IsRelevant(menuitem)){
            var obj = $("#" + this.TabId(menuitem));
            var padding = obj.outerWidth(true)- obj.width();
            obj.width(tabs[sizeIndex] - padding);
            sizeIndex++;
        }
    }    
}

/*
    Calculates the sizes of each individual tab and returns them in an array
*/
TabMenu.CalculateTabSizes = function()
{
    var menuitems = Navigator.Hierarchy;
    
    // get minimum tabsizes
    if (this.TabSizes == null){
        var sizes = new Array();
        for (var i = 0; i < menuitems.length; i++)
        {
            var menuitem = menuitems[i];
            
            if (this.IsRelevant(menuitem)){
                var obj = $("#" + this.TabId(menuitem));
                sizes.push(obj.outerWidth(true));
            }
        }
        
        this.TabSizes = sizes;
    }
    
    // calculate new line widths
    var maxLineWidth = $("#" + this.HtmlObject.id).width();
    
    var lineWidth = 0;
    var tabs = new Array();
    var allTabs = new Array();
    
    for (var i = 0; i < this.TabSizes.length; i++)
    {
        var min = this.TabSizes[i];
        
        // wrap up line
        if (lineWidth + min > maxLineWidth && tabs.length != 0){ 
            var remains = maxLineWidth - lineWidth;
            for (var j = 0; j < tabs.length; j++){
                if (remains <= 0) allTabs.push(tabs[j]);
                else {
                    var add = Math.round(remains / (tabs.length - j));
                    allTabs.push(tabs[j] + add);
                    remains -= add;
                }
            }
            lineWidth = 0;
            tabs = new Array();
        }
        
        // next tab
        lineWidth += min;
        tabs.push(min);
    }
    
    // wrap up line
    if (tabs.length > 0){ 
        var remains = maxLineWidth - lineWidth;
        for (var j = 0; j < tabs.length; j++){
            if (remains <= 0) allTabs.push(tabs[j]);
            else {
                var add = Math.round(remains / (tabs.length - j));
                allTabs.push(tabs[j] + add);
                remains -= add;
            }
        }
    }    
    
    return allTabs;
}

/*
    Updates the classes of the tabs
*/
TabMenu.UpdateAllItems = function()
{
    this.UpdateMenuitems(Navigator.Hierarchy, false);
}

/*
    overrule to shorten the code for lower menu items in the hierarchy. once 1 is true, all are filtered below
*/
TabMenu.UpdateMenuitems = function(menuitems, overruledProperties)
{
    for (var i = 0; i < menuitems.length; i++)
    {
        var menuitem = menuitems[i];

        if (this.IsRelevant(menuitem))
        {
            var htmlObject = document.getElementById(this.TabId(menuitem));

            htmlObject.className = this.GetButtonClasses(menuitem);
            if (menuitem.Children != null) this.UpdateMenuitems(menuitem.Children, menuitem.Filtered);
        }
    }
}

TabMenu.GetButtonClasses = function(menuitem)
{
    var classes = this.Style;
    if (this.HasContent(menuitem)) classes += ' ' + this.Style + '_link';
    if (menuitem.Id == this.ActiveId) classes += ' ' + this.Style + '_link_active';
    if (menuitem.Filtered == true){
        classes += ' ' + this.Style + '_' + Navigator.GetFilterType();
    }

    return classes;
}

TabMenu.TabId = function(menuitem)
{
    return (this.Id + '_' + menuitem.Id);
}
