﻿

function TabGroup(iTabBaseId, iContentBaseId, iCount)
{
    var This = this;

    // Data members
    This.Tabs = [];
    This.ActiveTabIndex = null;

    // Events
    This.OnActivated = new EventHandler();

    // Methods
    This.Add = function(iTab)
    {
        iTab.Group = This;
        iTab.Index = This.Tabs.length;
        This.Tabs.push(iTab);
    }

    This.Activate = function(iIndex)
    {
        if (iIndex != This.ActiveTabIndex)
        {
            if (This.ActiveTabIndex != null)
                This.Tabs[This.ActiveTabIndex].Deactivate();
            This.ActiveTabIndex = iIndex;
            This.Tabs[This.ActiveTabIndex].Activate();
            This.OnActivated.Invoke(This.Tabs[This.ActiveTabIndex].Value);
        }
    }

    // Initialize
    {
        if (iCount)
        {
            for (var i = 0; i < iCount; i++)
                This.Add(new Tab(iTabBaseId + '-' + i, new Content(iContentBaseId + '-' + i)), i);
            This.Activate(0);
        }
    }
    
}


function Tab(iId, iContent)
{
    var This = this;
    
    // Implements
    Implements(This, Button, iId);

    // Data members
    This.Group = null;
    This.Index = null;
    This.Contents = [];

    // Events
    This.OnActivate = new EventHandler();
    This.OnDeactivate = new EventHandler();

    // Methods
    This.Activate = function()
    {
        This.SetStyle('active');
        for (var i = 0; i < This.Contents.length; i++)
            This.Contents[i].Show();        
        This.OnActivate.Invoke();
    }

    This.Deactivate = function()
    {
        This.SetStyle(null);
        for (var i = 0; i < This.Contents.length; i++)
            This.Contents[i].Hide();        
        This.OnDeactivate.Invoke();
    }
    
    This.AddContent = function(iContent)
    {
        This.Contents.push(iContent);
    }

    // Initialize
    {
        This.OnClick.Add(function() { This.Group.Activate(This.Index); });

        if (iContent)
        {
            This.AddContent(iContent);
            iContent.Hide();   
        }
    }

}

