﻿/* ********************************************************** */
/* ECBCalculatorTab declaration                               */        
/* ********************************************************** */
var ECBCalculatorTab = function(spec) {
    // Private properties/methods.
    var 
        position = spec.index + 1,
        validationGroupCount = spec.validationGroupCount,
        tab4ActiveIndex = 1,
        that = {};

    // Public properties/methods.
    that.index = spec.index;
    that.wasLoaded = false;

    // Validate a tab.
    that.validate = function(validateHiddenControls) {
        var result = true, i, validationGroup;
        var validationGroupTemplate = 'T{0}P{1}_ValidationGroup';
        if (position === 4) {
            validationGroup = validationGroupTemplate.replace('{0}', position);
            validationGroup = validationGroup.replace('{1}', ECBCalculator.tab4ActiveIndex);
            if (ASPxClientEdit.ValidateGroup(validationGroup, validateHiddenControls) === false) {
                result = false;
            }
            // Validation Electricity consumption
            if (ASPxClientEdit.ValidateGroup('T4P5_ValidationGroup', validateHiddenControls) === false) {
                result = false;
            }            
        }
        else {
            for (i = 0; i < validationGroupCount; i += 1) {
                validationGroup = validationGroupTemplate.replace('{0}', position);
                validationGroup = validationGroup.replace('{1}', i + 1);
                if (ASPxClientEdit.ValidateGroup(validationGroup, validateHiddenControls) === false) {
                    result = false;
                }
            }
        }
        return result;
    };

    // Return constructed object.
    return that;
};

/* ********************************************************** */
/* ECBCalculatorTabManager declaration                     */        
/* ********************************************************** */
var ECBCalculatorTabManager = function() {
    // Private properties/methods.
    var 
        that = {},
        tabs = [],
        loadedTabs = 0,
        loadedQuestionnaireTabs = 0,
        activeTab;

    // Returns a tab from the managed collection.
    var getTab = function(index) {
        return tabs[index];
    };

    // Sets the active tab.
    var setActiveTab = function(index) {
        var tab = getTab(index);
        if (tab) {
            activeTab = tab;
            if (activeTab.wasLoaded === false) {
                activeTab.wasLoaded = true;
                loadedTabs++;
                if (index <= 3) {
                    loadedQuestionnaireTabs++;
                }
            }
            var previousButton = typeof (_tabNavigatorPreviousButton) != "undefined" ? _tabNavigatorPreviousButton : null;
            if (previousButton != null) {
                previousButton.SetEnabled((index > 0) &&
                               _calculatorTabControl.tabs[index - 1].GetEnabled());
            }
            var nextButton = typeof (_tabNavigatorNextButton) != "undefined" ? _tabNavigatorNextButton : null;
            if (nextButton != null) {
                nextButton.SetEnabled(index < tabs.length - 2 &&
                           _calculatorTabControl.tabs[index + 1].GetEnabled());
            }
        }
    };

    // Adds a tab to the managed collection.
    var addTab = function(tab) {
        tabs.push(tab);
    };

    // Navigates to the passed tab.
    var navigateTo = function(newIndex) {
        var newTab = _calculatorTabControl.GetTab(newIndex);
        _calculatorTabControl.SetActiveTab(newTab);
    };

    // Navigates to the next tab.
    var navigateToNext = function() {
        if (activeTab && activeTab.index < tabs.length - 1) {
            navigateTo(activeTab.index + 1);
            setTimeout('window.scrollTo(0, 0)', 500);
        }
    };

    // Navigates to the previous tab.
    var navigateToPrevious = function() {
        if (activeTab && activeTab.index > 0) {
            navigateTo(activeTab.index - 1);
            setTimeout('window.scrollTo(0, 0)', 500);
        }
    };

    // Determines whether all tabs have been loaded into memory.
    var areAllTabsLoaded = function() {
        return (tabs.length === loadedTabs);
    };

    // Determines whether all questionnaire spcific tabs have been loaded into memory.
    var areQuestionnaireTabsLoaded = function() {
        return (loadedQuestionnaireTabs === 4);
    };

    // Validates all loaded tabs.
    var validateAllTabs = function() {
        var result = true, tab, i;
        for (i = 0; i < tabs.length; i++) {
            tab = tabs[i];
            if (tab && tab.wasLoaded === true) {
                if (result === true) {
                    result = tab.validate(false);
                }
                else {
                    tab.validate(false);
                }
            }
        }
        return result;
    }

    // Validates the currently active tab.
    var validateActiveTab = function() {
        var result = true;
        if (activeTab) {
            result = activeTab.validate(false);
        }
        return result;
    }

    // Public properties/methods.
    that.areAllTabsLoaded = areAllTabsLoaded;
    that.areQuestionnaireTabsLoaded = areQuestionnaireTabsLoaded;
    that.addTab = addTab;
    that.getTab = getTab;
    that.setActiveTab = setActiveTab;
    that.navigateToNext = navigateToNext;
    that.navigateToPrevious = navigateToPrevious;
    that.navigateTo = navigateTo;
    that.validateAllTabs = validateAllTabs;
    that.validateActiveTab = validateActiveTab;

    // Return constructed object.
    return that;
};

/* ********************************************************** */
/* Extend calculator                                          */        
/* ********************************************************** */
(function () {

    // Add the tab manager to the calculator.
    if (!ECBCalculator.tabManager) {
        ECBCalculator.tabManager = ECBCalculatorTabManager();
    }
        
    /* ********************************************************** */
    /* On active tab changed event handler                       */        
    /* ********************************************************** */
    if (typeof ECBCalculator.onActiveTabChanged !== 'function') {
        ECBCalculator.onActiveTabChanged = function (s, e) { 
            ECBCalculator.tabManager.setActiveTab(e.tab.index);
        };
    }

    /* ********************************************************** */
    /* On active tab changed event handler                       */        
    /* ********************************************************** */
    if (typeof ECBCalculator.onTabLoaded !== 'function') {
        ECBCalculator.onTabLoaded = function (s, e) { 
            ECBCalculator.renderUI();
            GuiController.refreshUI();
        };
    }
        
})();