﻿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 {
            try { Dea.Get(tab_panel.tabs[tab_panel.currentTab].tabId).focus(); } catch (nofocus) { }
        }
    }
}

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);
} 
