﻿function TabPanel(id, emsDataId, selectedTab, tabClick) { 
    this.id = id; 
    this.tabs = []; 
    this.emsDataId = emsDataId;
    if(selectedTab) {
        this.currentTab = selectedTab; 
    } else {
       this.currentTab = 0; 
    }
    if(tabClick) {
        this.tabClick = tabClick;
    }
    this.lastKeycode = 0; 
    this.loading = true;
} 

TabPanel.prototype.init = function () { 
    this.node = Dea.Get(this.id); 
    var obj = this;
    Dea.browser.addEvent(this.node, "click", function (event) {handleTabPanelClickEvent(event, obj); }, false); 
    Dea.browser.addEvent(this.node, "keydown", function (event) {handleTabPanelKeyDownEvent(event, obj); }, true); 
    Dea.browser.addEvent(this.node, "keypress", function (event) {handleTabPanelKeyPressEvent(event, obj); }, true); 

    for(var i = 0; i < this.tabs.length; i++) {
        this.tabs[i].init();
        if(this.tabClick) {
            this.tabs[i].on_click = this.tabClick;
        }
        
    }
    selectTabPanel(this, this.currentTab); 
    this.loading = false;
}; 

TabPanel.prototype.add = function (obj) { 
    this.tabs[this.tabs.length] = obj; 
}; 

function Tab (tabId, panelId, liId) { 
    this.tabId = tabId; 
    this.panelId = panelId;
    this.liId = liId;
    this.nodeLastFocus = null; 
} 

Tab.prototype.init = function () { 
};

function nextTabPanel (tab_panel) { 
    if (tab_panel.currentTab < (tab_panel.tabs.length - 1)) { 
        selectTabPanel(tab_panel, tab_panel.currentTab + 1); 
    } 
} 

function previousTabPanel (tab_panel) { 
    if(tab_panel.currentTab > 0) { 
        selectTabPanel(tab_panel, tab_panel.currentTab - 1); 
    }
}

Tab.prototype.select = function(isInitialLoad, suppressOnClick) {
    Dea.Css.addClass(this.tabId, "selected");
    Dea.Css.addClass(this.liId, "selected");
    Dea.setDisplay(this.panelId, "block");
    Dea.Get(this.tabId).tabIndex = 0;
    if (this.on_click && isInitialLoad === false) {
        if (!suppressOnClick || suppressOnClick === false) {
            this.on_click();
        }
    }
}

Tab.prototype.unselect = function () {
    Dea.Css.removeClass(this.tabId, "selected");
    Dea.Css.removeClass(this.liId, "selected");
    Dea.setDisplay(this.panelId, "none");
    Dea.Get(this.tabId).tabIndex = -1;
}


function selectTabPanel(tab_panel, index, suppressOnClick) { 
    if ((index >= 0) && (index < tab_panel.tabs.length)) { 
        if(Dea.Get(tab_panel.emsDataId)) {
            Dea.Get(tab_panel.emsDataId).value = index;
        }
        tab_panel.tabs[tab_panel.currentTab].unselect();
        tab_panel.currentTab = index;
        tab_panel.tabs[tab_panel.currentTab].select(tab_panel.loading, suppressOnClick);
    
       
        // Get control with last focus 
        if (tab_panel.tabs[tab_panel.currentTab].nodeLastFocus) {
            tab_panel.tabs[tab_panel.currentTab].nodeLastFocus.focus(); 
        } else {
            Dea.Get(tab_panel.tabs[tab_panel.currentTab].tabId).focus(); 
        }
    }
} 

function indexOfNodeInTabList (node_target, tab_panel) { 
    var flag = -1; 
    for(var i = 0; i < tab_panel.tabs.length; i++) { 
        if (node_target == Dea.Get(tab_panel.tabs[i].tabId)) { 
            flag = i; 
        }
    }  
    return flag; 
} 

function nextTab (node_target, tab_panel) { 
    var index = indexOfNodeInTabList(node_target, tab_panel); 
    if ((index >= 0) && ( index < (tab_panel.tabs.length - 1))) { 
        index++; 
        selectTabPanel(tab_panel, index); 
        Dea.Get(tab_panel.tabs[index].tabId).focus(); 
    } // endif 
} 

function previousTab (node_target, tab_panel) { 
    var index = indexOfNodeInTabList( node_target, tab_panel); 
    if (index > 0) { 
        index--; 
        selectTabPanel(tab_panel, index); 
        Dea.Get(tab_panel.tabs[index].tabId).focus(); 
    } // endif 
} 

function isNodeInTabList (node_target, tab_panel) { 
    var flag = false; 
    for(var i = 0; !flag && (i < tab_panel.tabs.length); i++) { 
        if (node_target == Dea.Get(tab_panel.tabs[i].tabId)) { 
            flag = true; 
        } 
    }  
    return flag; 
} 

/** 
* handleTabPanelKeyDownEvent 
* This function helps stop TAB, PAGEDOWN and PAFEUP propagation 
* 
* @param ( event object ) event 
* @param ( TabPanel object) tab_panel is the TabPanel object associated with the event 
* @return boolean false if the event was used by Tab Panel, otherwisee true 
*/ 

function handleTabPanelKeyPressEvent(event, tab_panel) { 
    var e = event || window.event; 
    switch( e.keyCode ) { 
        case Dea.Keys.PAGEUP: 
        case Dea.Keys.PAGEDOWN: 
            if (e.ctrlKey && !e.altKey && !e.shiftKey) { 
                return Dea.browser.stopPropagation(e); 
            } // endif 
            break; 
        case Dea.Keys.TAB: 
            if (e.ctrlKey && !e.altKey) { 
                return Dea.browser.stopPropagation(e); 
            } // endif 
            break; 
    } 
} 

/** 
* handleTabPanelKeyDownEvent 
* Keyboard commands for the Tab Panel 
* 
* @param ( event object ) event 
* @param ( TabPanel object) tab_panel is the TabPanel object associated with the event 
* @return boolean false if the event was used by Tab Panel, otherwisee true 
*/ 

function handleTabPanelKeyDownEvent(event, tab_panel) { 
    var e = event || window.event; 
    // Save information about a modifier key being pressed 
    // May want to ignore keyboard events that include modifier keys 
    var no_modifier_pressed_flag = !e.ctrlKey && !e.shiftKey && !e.altKey; 
    var control_modifier_pressed_flag = e.ctrlKey && !e.shiftKey && !e.altKey; 

    switch (e.keyCode) { 
        case Dea.Keys.LEFT: 
        case Dea.Keys.UP: 
            if (isNodeInTabList(Dea.browser.target(e), tab_panel) && no_modifier_pressed_flag) { 
                previousTab(Dea.browser.target(e), tab_panel); 
                return Dea.browser.stopPropagation(event); 
            } 
            break; 
        case Dea.Keys.RIGHT: 
        case Dea.Keys.DOWN: 
            if (isNodeInTabList(Dea.browser.target(e), tab_panel) && no_modifier_pressed_flag) { 
                nextTab(Dea.browser.target(e), tab_panel); 
                return Dea.browser.stopPropagation(e); 
            } 
            break; 
        case Dea.Keys.PAGEDOWN: 
            if (control_modifier_pressed_flag) { 
                nextTabPanel( tab_panel );       
               return Dea.browser.stopPropagation(e); 
            } 
           break; 
        case Dea.Keys.PAGEUP: 
            if (control_modifier_pressed_flag){         
                previousTabPanel( tab_panel ); 
                return Dea.browser.stopPropagation(e); 
            } 
            break; 
        case Dea.Keys.HOME: 
            if (no_modifier_pressed_flag) { 
               selectTabPanel( tab_panel, 0 ); 
               return Dea.browser.stopPropagation(e);         
            } 
        case Dea.Keys.END: 
            if (no_modifier_pressed_flag) { 
                selectTabPanel(tab_panel, (tab_panel.tabs.length - 1)); 
                return Dea.browser.stopPropagation(e);         
            } 
        case Dea.Keys.TAB: 
            if (e.ctrlKey && !e.altKey) { 
                if (e.shiftKey) {
                    previousTabPanel(tab_panel);       
                } else {
                    nextTabPanel (tab_panel); 
                }
                return Dea.browser.stopPropagation(e); 
            } 
            break; 
    } 
    return true; 
} 

function handleTabPanelClickEvent(event, tab_panel) { 
    var e = event || window.event; 
    var index = indexOfNodeInTabList( Dea.browser.target(e), tab_panel); 
    if (index >= 0) { 
        selectTabPanel( tab_panel, index ); 
        Dea.Get(tab_panel.tabs[index].tabId).focus(); 
        return false; 
    }
    return true; 
}


function handleInputFocusEvent(event, tab) { 
    var e = event || window.event; 
    tab.nodeLastFocus = Dea.browser.target(e); 
} 
