﻿if (typeof PostenCos == "undefined") {
    window.PostenCos = {};
}
PostenCos.TabWidget = function (opts) {
    var self = this;

    this.tabCount = -1;
    this.MAX_TAB_COUNT = opts.maxTabCount;
    this._addElement = null;
    this._allTabHandles = null;
    this._allTabContentPanels = null;
    this._tabElemGroups = [];

    this.updateAddVisibility = function () {
        if (this.tabCount == this.MAX_TAB_COUNT)
            this._addElement.hide();
        else
            this._addElement.show();
    };

    this.showTab = function (num) {
        var tabg = this._tabElemGroups[num - 1];
        tabg.handle.show();
        tabg.handleLink.click();
    };

    this.syncTabName = function (num) {
        var tabg = this._tabElemGroups[num - 1];
        if (opts.editMode) {
            var name = tabg.nameInput.val();
            var oldName = tabg.handleLink.text();
            if (!tabg.handleLink.data("isBlank") || name != oldName) {
                var isBlank = (name == "");
                tabg.handleLink.text(isBlank ? "-" : name);
                tabg.handleLink.data("isBlank", isBlank ? "yes" : "no");
            }
        }
        else {
            var name = tabg.handleLink.text().replace(/(\s|\u00A0)/g, "");
            var isBlank = ("" + name == "");
            tabg.handleLink.data("isBlank", isBlank ? "yes" : "no");
        }
    };

    this.removeTab = function (pos) {
        var visibleTabNums = [];
        for (var num = pos; num <= this.MAX_TAB_COUNT; num++) {
            var tabg = this._tabElemGroups[num - 1];
            if (tabg.handle.is(":visible"))
                visibleTabNums.push(num);
        };
        var formElems = [];
        for (var arIdx in visibleTabNums) {
            var num = visibleTabNums[arIdx];
            formElems.push({
                tabNum: num,
                tabg: self._tabElemGroups[num - 1]
            });
        };

        for (var arIdx = 0; arIdx < formElems.length - 1; arIdx++) {
            formElems[arIdx].tabg.nameInput.val(formElems[arIdx + 1].tabg.nameInput.val());
            formElems[arIdx].tabg.contentInput.val(formElems[arIdx + 1].tabg.contentInput.val());
            formElems[arIdx].tabg.handleLink.text(formElems[arIdx + 1].tabg.handleLink.text());
        }
        var last = formElems[formElems.length - 1];
        last.tabg.nameInput.val("");
        last.tabg.contentInput.val("");
        this._tabElemGroups[this.tabCount - 1].handle.hide();
        this.tabCount--;
        if (last.tabNum == pos) {
            this.showTab(pos - 1);
        }
    };

    this.init = function () {
        // Find controls, save refs
        // CUSTOMIZE THIS for your own layout
        // --------------------
        this._addElement = jQuery(opts.tabAddSelector);
        this._allTabHandles = jQuery(opts.tabSelector);
        this._allTabContentPanels = jQuery(opts.tabContentSubSelector);
        for (var num = 1; num <= this.MAX_TAB_COUNT; num++) {
            var tabElemGroup = {};
            tabElemGroup.handle = this._allTabHandles.eq(num - 1);
            tabElemGroup.handleLink = jQuery("a", tabElemGroup.handle);
            tabElemGroup.contentPanel = jQuery(this._allTabContentPanels[num - 1]);
            tabElemGroup.removeLink = jQuery(opts.tabRemoveSubSelector, tabElemGroup.contentPanel);

            tabElemGroup.nameInput = jQuery(opts.tabNameInputSubSelector, tabElemGroup.contentPanel);
            tabElemGroup.contentInput = jQuery(opts.tabContentInputSubSelector, tabElemGroup.contentPanel);
            this._tabElemGroups.push(tabElemGroup);
        };
        // --------------------

        for (var num = 1; num <= this.MAX_TAB_COUNT; num++) {
            var tabg = this._tabElemGroups[num - 1];
            tabg.handleLink.data("num", num);
            tabg.handleLink.click(function () {
                var num = jQuery(this).data("num");
                var tabg = self._tabElemGroups[num - 1];
                self._allTabContentPanels.hide();
                self._allTabHandles.removeClass(opts.selectedClass);
                tabg.contentPanel.show();
                tabg.handle.addClass(opts.selectedClass);
                //  window.location.hash = JQuery(this).attr("href");
                //return false;

            });

            tabg.removeLink.data("num", num);
            tabg.removeLink.click(function () {
                if (self.tabCount > 1) {
                    var num = jQuery(this).data("num");
                    self.removeTab(num);
                    self.updateAddVisibility();
                }
                return false;
            });

            tabg.nameInput.data("num", num);
            tabg.nameInput.keyup(function () {
                var num = jQuery(this).data("num");
                self.syncTabName(num);
            });
        }
        this._addElement.click(function () {
            if (self.tabCount < self.MAX_TAB_COUNT) {
                self.tabCount++;
                self.showTab(self.tabCount);
                self.syncTabName(self.tabCount);
                self.updateAddVisibility();
            }
            return false;
        });

        // Determine initial tab count
        // and init UI
        // --------------------
        for (var num = 1; num <= this.MAX_TAB_COUNT; num++) {
            var tabg = this._tabElemGroups[num - 1];
            this.syncTabName(num);
            var noContent;
            if (this.editMode)
                noContent = tabg.nameInput.val() == "" && tabg.contentInput.val() == "";
            else
                noContent = (tabg.handleLink.data("isBlank") == "yes");
            if (self.tabCount == -1 && noContent) {
                self.tabCount = num - 1;
                break;
            }
        }
        if (this.tabCount == -1) {
            this.tabCount = this.MAX_TAB_COUNT;
        }
        if (this.tabCount == 0)
            this.tabCount = 1;
        this._allTabHandles.hide();
        for (var num = 1; num <= this.tabCount; num++) {
            this.showTab(num);
        }
        this.showTab(1);
        if (opts.editMode) {
            this.updateAddVisibility();
            jQuery(opts.tabRemoveSubSelector, this._allTabContentPanels).show();
        }
        else {
            this._addElement.hide();
            jQuery(opts.tabRemoveSubSelector, this._allTabContentPanels).hide();
            if (this.tabCount == 1) {
                this._allTabHandles.hide();
            }
        }
        // --------------------
    };
};

