﻿/// <reference name="MicrosoftAjax.js"/>
Type.registerNamespace("bokCM.Ajax");

bokCM.Ajax.Tabs = function(element) {
    this._innerDivs = Array();
    this._controlLis;
    this._element = element;
    this._defaultTab;
    this._selectedTab;
    this._controlPrefix;
    this._screenPrefix;
    this._selectedTabClassName;
    
    this._onTabClickHandler = null;
}

bokCM.Ajax.Tabs.prototype = {
    get_defaultTab: function()
    {
        return this._defaultTab;
    },
    set_defaultTab: function(value)
    {
        this._defaultTab = value;
    },
    get_controlPrefix: function()
    {
        return this._controlPrefix;
    },
    set_controlPrefix: function(value)
    {
        this._controlPrefix = value;
    },
    get_screenPrefix: function()
    {
        return this._screenPrefix;
    },
    set_screenPrefix: function(value)
    {
        this._screenPrefix = value;
    },
    get_selectedTabClassName: function()
    {
        return this._selectedTabClassName;
    },
    set_selectedTabClassName: function(value)
    {
        this._selectedTabClassName = value;
    },
    
    add_onTabClick: function(handler)
    {
        this.get_events().addHandler('onTabClick', handler);
    },
    remove_onTabClick: function(handler)
    {
        this.get_events().removehandler("onTabClick", handler);
    },
    
    add_onInnerTabLink: function(handler)
    {
        this.get_events().addHandler("onInnerTabLink", handler);
    },
    remove_onInnerTabLink: function(handler)
    {
        this.get_events().removehandler("onInnerTabLink", handler);
    },

    initialize: function() {
        bokCM.Ajax.Tabs.callBaseMethod(this, 'initialize');

        this._getControlLis();
        this._getInnerDivs();
        this._wireInnerLinks();

        if (this._defaultTab == null || this._defaultTab == "")
        {
            this._toggleScreen(this._innerDivs[0], true);
        }
        else
        {
            try
            {
                this._toggleScreen($get(this._defaultTab), true);
            }
            catch(e)
            {
                this._toggleScreen(this._innerDivs[0], true);
            }
        }
    },
    dispose: function() {  
    
        $clearHandlers(this._element);
    
        bokCM.Ajax.Tabs.callBaseMethod(this, 'dispose');
    },
    _wireInnerLinks: function()
    {
        for(var i=0; i<this._innerDivs.length; i++)
        {
            this._walkElement(this._innerDivs[i]);
        } 
    },
    _getControlLis: function()
    {
        if (Sys.Browser.agent == Sys.Browser.InternetExplorer)
        {
            this._controlLis = this._element.childNodes[0].childNodes
        }
        else
        {
            this._controlLis = this._element.childNodes[1].childNodes
        }
        
        for (var i=0; i<this._controlLis.length; i++)
        {
            _onTabClickHandler = Function.createDelegate(this, this.onTabClick);
        
            var item = this._controlLis[i]
            if (item.nodeName == "LI")
            {
                $addHandler(item, "click", _onTabClickHandler);
            }
        } 
    },
    _getInnerDivs: function()
    {       
        for(var i=0; i<this._element.childNodes.length; i++)
        {
            if (this._element.childNodes[i].nodeName == "DIV")
            {
                var div = this._element.childNodes[i];
                Array.add(this._innerDivs, div);
                this._toggleScreen(div, false);
            }
        }
    },
    _toggleScreen: function(div, display)
    {
        var divName = div.id.replace(this._screenPrefix, "");
        var tabControl = $get(this._controlPrefix + divName);
        var tabScreen = $get(this._screenPrefix + divName);
    
        if (display)
        {
            tabScreen.style.visibility = 'visible';
            tabScreen.style.display = 'block';
            
            if (tabControl != null)
            {
                tabControl.className = this._selectedTabClassName;
            }
            
            this._selectedTab = tabScreen;
        }
        else
        {
            tabScreen.style.visibility = 'hidden';
            tabScreen.style.display = 'none';
            
            if (tabControl != null)
            {
                tabControl.className = "";
            }
        }
    },
    _walkElement: function(element)
    {
        for(var j=0; j<element.childNodes.length; j++)
        {
            var childNode = element.childNodes[j];
            if (childNode.nodeName == "A")
            {
                try{
                    if (childNode.href == "")
                    {
                        var _onInnerTabLinkHandler = Function.createDelegate(this, this.onInnerTabLink);
                        
                        $addHandler(childNode, "click", _onInnerTabLinkHandler);
                    }
                }
                catch(e)
                {
                    
                }
            }
            else if (childNode.childNodes.length > 0)
            {
                this._walkElement(childNode);
            }
        }
    },
    onTabClick: function(e)
    {
        this._toggleScreen(this._selectedTab, false);
        
        var screenToDisplay = e.target.id.replace(this._controlPrefix, this._screenPrefix);
        
        this._toggleScreen($get(screenToDisplay), true);
        
        var handler = this.get_events().getHandler("onTabClick"); 
              
        if (handler != null)    
        {    
            handler(this, Sys.EventArgs.Empty);    
        }   
    },
    onInnerTabLink: function(e)
    {
        var target = e.target;
        
        var screenToDisplay = null;
        
        for(var i=0; i<e.target.attributes.length; i++)
        {
            if (e.target.attributes[i].nodeName == "goto")
            {
                screenToDisplay = e.target.attributes[i].value.replace(this._controlPrefix, this._screenPrefix);
                break;
            }
        }
        
        if (screenToDisplay != null)
        {
            this._toggleScreen(this._selectedTab, false);
            this._toggleScreen($get(screenToDisplay), true);
        }
        
    
        var handler = this.get_events().getHandler("onInnerTabLink");
        
        if (handler != null)
        {
            handler(this, Sys.EventArgs.Empty);
        }
    }
}

bokCM.Ajax.Tabs.registerClass('bokCM.Ajax.Tabs', Sys.UI.Control);

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();