(function ($) {
    /**
     * Tab栏控件
     *
     * @class FS.QuickTab
     * @extends FR.Widget
     * @since 8.0
     *
     * @cfg {JSON} options 配置属性
     * @cfg {String} options.baseCls        控件基础类
     * @cfg {String} options.style          控件主题样式
     * @cfg {Number} options.tabWidth       Tab宽度
     * @cfg {Number} options.tabHeight      Tab高度,目前框架暂不支持此配置项,慎用
     * @cfg {Number} options.dropBoxWidth   Tab弹出按钮框宽度
     * @cfg {Boolean} options.isCollapsible 是否可收起
     * @cfg {String} options.hasHomepageBtn 是否需显示首页按钮
     *
     * @cfg {Function} [options.onCreateTab]      创建Tab标签时的操作,可修改标签样式(全局)
     * @cfg {Function} [options.onSelectTab]      选中每个Tab页面时的操作,可修改内容(全局)
     * @cfg {Function} [options.onCloseTab]      关闭每个Tab页面时的操作(全局)
     * @cfg {Function} [options.afterLoadTab]     加载每个Tab页面时的操作(全局)
     */
    FS.QuickTab = FR.extend(FR.Widget, {
        NAV: {
            'BACK': 0,
            'MORE': 1,
            'ITEM': 2,
            'HOMEPAGE': 3,
            'MOREITEM': 4,
            'CLOSEALL': 5,
            'CLOSEOTHER': 6
        },

        _defaultConfig: function () {
            return $.extend(FS.QuickTab.superclass._defaultConfig.apply(this, arguments), {
                baseCls: 'fs-tab',
                style: 'alpha',
                tabWidth: 150,
                tabHeight: 30,
                dropBoxWidth: 150,
                isCollapsible: true,
                hasHomepageBtn: false,
                onCreateTab: null,
                onSelectTab: null,
                onCloseTab: null,
                afterLoadTab: null
            });
        },

        _init: function () {
            FS.QuickTab.superclass._init.apply(this, arguments);
            this.element.addClass(this.options.style);
            // 悬浮元素区
            this.$float = $('<div class="fs-tab-float"/>').css({
                'z-Index': FR.widget.opts.zIndex++
            }).appendTo(this.element);
            // Tab栏按钮
            this.$btns = this._createBtns();
            // 内容区遮罩
            this.$contentMask = this._createContentMask().hide().appendTo(this.element);
            // 内容区
            this.$content = $('<div class="fs-tab-content"/>').appendTo(this.element);
            // 缓存当前 tab 栏中已加载的对应 entry,务必与 $tabs 中顺序一致
            this.loadedEntries = [];
            this._createHomepageBtn();
            this._bindBtnEvts();
            this.visibleTabCount = 0;
            this.currentTabWidth = this.options.tabWidth;
            this.dropdownLeft = Math.floor((this.options.tabWidth - this.options.dropBoxWidth) / 2);
            this.doResize();
            // 展开状态
            this.isExpand = true;
            if (this.options.isCollapsible === true) {
                this.setExpand(false);
                this.isExpand = false;
                this.element.hide();
            }
        },

        _resizeTabs: function () {
            var self = this;
            var width = this.element.width(),
                height = this.element.height();
            // 自适应缩放tab栏
            var tabBarWidth = width - 40;
            // 计算tab区域尺寸
            if (this.options.isCollapsible) {
                tabBarWidth -= 60;
            }
            if (this.options.hasHomepageBtn) {
                tabBarWidth -= 60;
            }
            this.$tabs.width(tabBarWidth);
            var tabs = this.$tabs.children();
            // 宽度只缩不增
            var visibleTabCount = Math.floor(tabBarWidth / this.options.tabWidth) + 1;
            var tabWidth = this.options.tabWidth;
            if (tabs.length >= visibleTabCount) {
                tabWidth = Math.floor(tabBarWidth / visibleTabCount);
            }
            this.visibleTabCount = visibleTabCount;
            // 缩放操作
            if (tabWidth !== this.currentTabWidth) {
                this.dropdownLeft = Math.floor((tabWidth - this.options.dropBoxWidth) / 2);
                $.each(tabs, function (i, tab) {
                    $(tab).outerWidth(tabWidth);
                    // 调整文本标题宽度
                    $(".fs-tab-item-label", $(tab)).outerWidth(tabWidth - 20);
                });
                this.currentTabWidth = tabWidth;
            }
            // 内容区域缩放
            this.$content.width(width).height(height - this.options.tabHeight);
            this.fireEvent("resize", {width : width, height : height - this.options.tabHeight});
            // 尝试对当前已选中标签执行
            var $selectedTab = this._getSelectedTab();
            if ($selectedTab !== null) {
                this._doSelectTab($selectedTab)
            }
        },

        _createContentMask: function () {
            var self = this;
            return $('<div class="fs-tab-content-mask"/>').click(
                function (e) {
                    if (self._isMenuExpanded()) {
                        // 如果Tab菜单弹出,则先收起
                        self._expandMenu(false);
                        e.stopEvent();
                    }
                }).css({
                    'z-Index': FR.widget.opts.zIndex++
                });
        },

        _createBtns: function () {
            var self = this;
            var $btns = $('<div class="fs-tab-btns fui-seb"/>').appendTo(this.element);
            // 返回目录按钮
            if (this.options.isCollapsible) {
                $('<div class="fs-tab-back fui-bsb nav-btn"/>')
                    .append($('<i class="icon-tab-dashboard"/>'))
                    .data('NAV', this.NAV.BACK)
                    .appendTo($btns);
            }
            // 首页
            if (this.options.hasHomepageBtn) {
                $('<div class="fs-tab-homepage fui-seb nav-btn"/>')
                    .append($('<i class="icon-tab-home"/>'))
                    .data('NAV', this.NAV.HOMEPAGE)
                    .appendTo($btns);
            }
            // tab标签
            this.$tabs = $('<ul class="fs-tab-names"/>')
                .appendTo($btns);
            //更多tab下拉按钮
            $('<div class="fs-tab-more nav-btn"/>')
                .append($('<i class="icon-tab-menu"/>'))
                .data('NAV', this.NAV.MORE)
                .appendTo($btns);
            // 菜单
            this.$menu = $('<div class="fs-tab-menu-wrapper fui-bcb lower"/>').css({
                'top': this.options.tabHeight
            }).hide().appendTo(this.$float);
            var menuOptions = $('<div class="fs-tab-menu-options">').appendTo(this.$menu);
            // 关闭所有
            $('<div class="fs-tab-menu-item nav-btn"/>').append(
                $('<span/>').text(FR.i18nText("FS-Frame-Close_All"))
            ).data('NAV', this.NAV.CLOSEALL).appendTo(menuOptions);
            // 关闭其他
            $('<div class="fs-tab-menu-item nav-btn"/>').append(
                $('<span/>').text(FR.i18nText("FS-Frame-Close_Other_Tabs"))
            ).data('NAV', this.NAV.CLOSEOTHER).appendTo(menuOptions);
            this.$menuItems = $('<ul class="fs-tab-menu-items"/>')
                .appendTo(this.$menu);
            return $btns;
        },

        _bindBtnEvts: function () {
            var NAV = this.NAV, self = this;
            var doProxy = function (event) {
                var target = event.target;
                var type = event.type;
                var $obj = $(target).closest('.nav-btn');
                if ($obj && $obj.length > 0) {
                    var navitype = $obj.data('NAV');
                    if (type === 'mouseover') {
                        switch (navitype) {
                            case NAV.CLOSEALL:
                            case NAV.CLOSEOTHER:
                            case NAV.MOREITEM:
                                $obj.addClass('fui-fbc fui-bsb');
                                break;
                            default :
                                break;
                        }
                        $('.icon-tab-close', $obj).show();
                    } else if (type === 'mouseout') {
                        switch (navitype) {
                            case NAV.CLOSEALL:
                            case NAV.CLOSEOTHER:
                            case NAV.MOREITEM:
                                $obj.removeClass('fui-fbc fui-bsb');
                                break;
                            default :
                                break;
                        }
                        $('.icon-tab-close', $obj).hide();
                    } else if (type === 'click') {
                        switch (navitype) {
                            case NAV.BACK:
                                //返回
                                self.setExpand(!self.isExpanded());
                                self._expandMenu(false);
                                break;
                            case NAV.HOMEPAGE:
                                // 首页按钮
                                self.setExpand(true);
                                self._doSelectHomepage();
                                break;
                            case NAV.MOREITEM:
                            case NAV.ITEM:
                                //打开指定标签
                                if ($obj.hasClass("fs-tab-menu-item")) {
                                    $obj = self._findLoadedTabFromEntry($obj.data('ENTRY'));
                                }
                                self._doSelectTab($obj);
                                self.setExpand(true);
                                self._expandMenu(false);
                                break;
                            case NAV.MORE:
                                //更多下拉标签
                                self._expandMenu(true);
                                break;
                            case NAV.CLOSEALL:
                                //关闭所有
                                self._doCloseAllTabs();
                                self._expandMenu(false);
                                break;
                            case NAV.CLOSEOTHER:
                                self._doCloseOtherTabs();
                                self._expandMenu(false);
                                break;
                            default:
                                break;
                        }
                    }
                }
            };
            this.$btns.unbind();
            this.$btns.bind('click', doProxy)
                .bind('mouseover', doProxy)
                .bind('mouseout', doProxy);
            this.$float.unbind();
            this.$float.bind('click', doProxy)
                .bind('mouseover', doProxy)
                .bind('mouseout', doProxy);
        },

        _doSelectTab: function ($tab) {
            var idx = this._getTabIndex($tab);
            if (idx < 0) {
                return;
            }
            // 选中Tab时的操作
            var entry = this._getTabEntry($tab);
            var $content = $tab.data('CONTENT');
            if (FR.applyFunc(this, entry.onSelect, [$tab, $content, entry], false) === false) {
                FR.applyFunc(this, this.options.onSelectTab, [$tab, $content, entry], false);
            }
            // 将被隐藏的 tab 移动至可显示的最后一个
            var lastIndex = this.visibleTabCount - 1;
            if (idx > lastIndex) {
                this._moveTabByIndex(idx, lastIndex)
            }
            // 设置选中状态
            if (!$tab.hasClass('select')) {
                $('.select', this.$btns).removeClass('select fui-bsb');
                $tab.addClass('select fui-bsb');
            }
            // 展示内容
            if ($content && $content.is(":hidden")) {
                $('.fs-tab-content-item', this.$content).hide();
                $content.show();
            }
            this._refreshMenu();
        },

        _doCloseTab: function ($tab) {
            var self = this;
            var idx = this._getTabIndex($tab);
            var $selectedTab = this._getSelectedTab();
            var selectedIdx = this._getTabIndex($selectedTab);
            var $content = $tab.data('CONTENT');
            if ($content) {
                // 检查并确认是否关闭标签页
                var entry = this._getTabEntry($tab);
                var doNotClose = FR.applyFunc(this, entry.onClose, [$tab, $content, entry], false);
                if (!doNotClose) {
                    doNotClose = FR.applyFunc(this, this.options.onCloseTab, [$tab, $content, entry], false);
                }
                // 关闭标签页
                if (!doNotClose && this._needToClose($content)) {
                    $content.detach();
                } else {
                    // 未确认关闭,继续保留
                    return;
                }

            }
            var callback = function () {
                // 移除Tab
                var index = self._getTabIndex($tab);
                $tab.remove();
                self.loadedEntries.splice(index, 1);
                if (self.loadedEntries.length === 0) {
                    if (self.options.hasHomepageBtn) {
                        // 选择首页
                        self._doSelectHomepage();
                    } else {
                        // 没有可选Tab时隐藏
                        var hideFn = function () {
                            if (self.loadedEntries.length === 0) {
                                self.element.hide();
                            }
                        };
                        self.setExpand(false, hideFn)
                    }
                }
                self._refreshMenu();
            };
            // 移除下拉按钮
            $(".fs-tab-item-dropdown-wrapper", self.$float).remove();
            // 执行关闭操作
            $tab.animate({
                width: '-=' + this.options.tabWidth
            }, 'fast', callback);

            // 重新选中Tab
            var $target = null;
            if (idx !== selectedIdx) {
                // 之前选中的Tab
                $target = $selectedTab;
            } else if (idx + 1 < this.loadedEntries.length) {
                // 后方有可选Tab
                $target = this._getTabByIndex(idx + 1)
            } else {
                // 前一项Tab
                $target = this._getTabByIndex(this.loadedEntries.length - 2);
            }
            this._doSelectTab($target);
        },

        _needToClose: function (frame) {
            if (frame.length > 0 && frame[0].contentWindow) {
                // ifame 直接关闭
                if (frame[0].nodeName === "IFRAME") {
                    return true;
                }
                var win = frame[0].contentWindow;
                var beforeUnload = win.onbeforeunload || (win.document && win.document.body.onbeforeunload);
                // 关闭前检查标签页内容
                if ($.isFunction(beforeUnload)) {
                    var info = beforeUnload.call();
                    if (info) {
                        var confirm = window.confirm(info + "\n" + FR.i18nText('FS-Frame-Sure_To_Leave'));
                        if (!confirm) {
                            return false;
                        }
                    }
                }
            }
            return true;
        },

        _doCloseAllTabs: function () {
            var self = this;
            $.each(this.$tabs.children(), function (index, tab) {
                self._doCloseTab($(tab));
            })
        },

        /**
         * 关闭当前的选中的tab选项页
         */
        closeActiveTab: function () {
            //711开放的接口兼容.
            this._doCloseTab(this._getSelectedTab())
        },

        _doCloseOtherTabs: function () {
            var self = this;
            var $selected = this._getSelectedTab();
            $.each(this.$tabs.children(), function (index, tab) {
                if ($selected.context !== tab) {
                    self._doCloseTab($(tab));
                }
            })
        },

        _getSelectedTab: function () {
            var $tab = null;
            $.each(this.$tabs.children(), function (i, tab) {
                if ($(tab).hasClass('select')) {
                    $tab = $(tab);
                    return false;
                }
            });
            return $tab;
        },

        _getTabIndex: function ($tab) {
            if (FR.isNull($tab)) {
                return -1;
            }
            return $.inArray($tab.get(0), this.$tabs.children());
        },

        _getTabByIndex: function (idx) {
            return $(this.$tabs.children().get(idx));
        },

        _getTabEntry: function ($tab) {
            return this.loadedEntries[this._getTabIndex($tab)];
        },

        _moveTabByIndex: function (from, to) {
            var tabs = this.$tabs.children();
            tabs.splice(to, 0, tabs.splice(from, 1)[0]);
            this.$tabs.append(tabs);
            this.loadedEntries.splice(to, 0, this.loadedEntries.splice(from, 1)[0]);
        },

        _addNewTabFromEntry: function (entry) {
            var self = this;
            var $tab = $('<li class="fs-tab-item nav-btn"/>')
                .data('NAV', this.NAV.ITEM)
                .hover(function () {
                    $(".fs-tab-item-dropdown-wrapper", self.$float).remove();
                    if ($(this).hasClass('select') && self.isExpanded()) {
                        var wrapperOffset = {
                            top: self.options.tabHeight,
                            left: $(this).offset().left - self.element.offset().left
                        };
                        var $wrapper = self._createTabDropdownWrapper(entry).offset(wrapperOffset).appendTo(self.$float);
                        $wrapper.data('TAB', $(this))
                    }
                }, function () {

                }).appendTo(this.$tabs);
            $tab.outerWidth(this.currentTabWidth);
            var $label = $('<div class="fs-tab-item-label">').outerWidth(this.currentTabWidth - 20).append(
                $('<span/>').text(entry.text).attr('title', entry.text)
            ).appendTo($tab);
            // 关闭按钮
            $('<i class="icon-tab-close"/>')
                .click(function (e) {
                    self._doCloseTab($(this).closest(".fs-tab-item"));
                    // 屏蔽选中操作
                    e.stopEvent();
                }).hide()
                .appendTo($label);
            if (FR.applyFunc(this, entry.onCreate, [$tab, entry], false) === false) {
                FR.applyFunc(this, this.options.onCreateTab, [$tab, entry], false);
            }
            // 缓存entry供刷新使用
            this.loadedEntries.push(entry);
            this._resizeTabs();
            this._doSelectTab($tab);
            return $tab;
        },

        _createHomepageBtn: function () {
            var self = this;
            if (this.options.hasHomepageBtn) {
                var url = FS.config.homePageUrl;
                var $btn = $(".fs-tab-homepage.nav-btn", this.$btns);
                $btn.hover(function () {
                    $(".fs-tab-item-dropdown-wrapper", self.$float).remove();
                    if ($(this).hasClass('select') && self.isExpanded()) {
                        var wrapperOffset = {
                            top: self.options.tabHeight,
                            left: $(this).offset().left - self.element.offset().left - 45
                        };
                        var $wrapper = self._createTabDropdownWrapper().offset(wrapperOffset)
                            .addClass('homepage-drop').appendTo(self.$float);
                        $wrapper.data('TAB', $(this));
                    }
                }, function () {

                });
                $('.fs-tab-content-item', this.$content).hide();
                // 设置首页内容
                this.setExpand(true, function () {
                    var $content;
                    if (FS.isPlatForm()) {
                        $content = $('<div class="fs-tab-content-item platform-bg"/>')
                            .append($('<div class="platform-fg"/>')).appendTo(self.$content);
                    } else {
                        $content = $('<iframe class="fs-tab-content-item"/>').attr(
                            'src', encodeURI(FS.Trans._dealWithSrc(url))
                        ).appendTo(self.$content);
                    }
                    $btn.data('CONTENT', $content);
                    self._doSelectHomepage();
                });
            }
        },

        _doSelectHomepage: function () {
            var $btn = $(".fs-tab-homepage.nav-btn", this.$btns);
            // 设置选中状态
            if (!$btn.hasClass('select')) {
                $('.select', this.$btns).removeClass('select fui-bsb');
                $btn.addClass('select fui-bsb');
            }
            // 展示内容
            var content = $btn.data('CONTENT');
            if (content && content.is(":hidden")) {
                $('.fs-tab-content-item', this.$content).hide();
                content.show();
            }
        },

        _createTabDropdownWrapper: function (entry) {
            var self = this;
            var isStarred = false;
            // 根据是否具有entry.id判断tab是否为管理页面
            if (entry && entry.id) {
                isStarred = this._isEntryStarred(entry);
            }
            var btnCount = 1;
            // 容器
            var $wrapper = $('<div class="fs-tab-item-dropdown-wrapper"/>').css({
                'left': entry ? this.dropdownLeft : 0,
                'z-Index': FR.widget.opts.zIndex++
            });
            // 根据是否具有entry.id判断tab是否为管理页面
            if (entry && !entry.isModule && entry.showFavorite !== 'no') {
                btnCount++;
            }
            // 下拉菜单内容
            var $drop = $('<div class="fs-tab-item-dropdown"/>').appendTo($wrapper);
            $('<span class="arrow"/>').appendTo($wrapper);
            // 刷新按钮
            this._createRefreshBtn().appendTo($drop);
            // 收藏按钮
            if (btnCount > 1) {
                $drop.addClass("double-size");
                $('<span class="splitter"/>').appendTo($drop);
                this._createStarBtn(isStarred).appendTo($drop);
            }
            // 绑定删除下拉菜单事件
            var doRemove = function (e) {
                if (!$(e.target).closest('.fs-tab-item-dropdown-wrapper').length > 0
                    && !$(e.target).closest('.nav-btn.select').length > 0) {
                    $(".fs-tab-item-dropdown-wrapper", self.$float).remove();
                    $('body').unbind();
                }
            };
            $('body').bind('mouseover', doRemove);
            return $wrapper;
        },

        _isEntryStarred: function (entry) {
            var isStarred = false;
            $.each(FS.Control.getFavoriteNodes(), function (index, node) {
                if (node.entry.id === entry.id) {
                    isStarred = true;
                    return false;
                }
            });
            return isStarred;
        },

        _getFavoriteNodeByEntry: function (entry) {
            var target = null;
            $.each(FS.Control.getFavoriteNodes(), function (index, node) {
                if (node.entry.id === entry.id) {
                    target = node;
                    return false;
                }
            });
            return target;
        },

        _createDropdownBtn: function (config) {
            var self = this;
            return $('<div class="fs-tab-item-dropdown-btn"/>')
                .addClass(config.btnCls).append($('<i/>').addClass(config.iconCls))
                .append($('<span/>').text(config.text)).click(function (e) {
                    var $tab = $(this).closest(".fs-tab-item-dropdown-wrapper").data('TAB');
                    var entry = self.loadedEntries[self._getTabIndex($tab)];
                    config.op(e, $tab, entry);
                });
        },

        _createRefreshBtn: function () {
            var self = this;
            var config = {
                'btnCls': "dropdown-refresh",
                'iconCls': "icon-tab-refresh",
                'text': FR.i18nText('FS-Frame-Button_Refresh'),
                'op': function (e, $tab) {
                    self._refreshTab($tab);
                    // 点击刷新隐藏下拉按钮
                    $(".fs-tab-item-dropdown-wrapper", $tab).eq(0).hide();
                }
            };
            return this._createDropdownBtn(config);
        },

        _refreshTab: function ($tab, src) {
            var $content = $tab.data('CONTENT');
            var completeFn = $tab.data('COMPLETE');
            if ($content && $content.size() > 0) {
                var frame = $content[0];
                if (frame && frame.src) {
                    // 刷新iframe,支持跨域
                    frame.src = src || frame.src;
                    FR.applyFunc(self, completeFn, [$content], false);
                } else if ($(frame).hasClass("fs_design_container")) {
                    // 刷新管理页面
                    var entry = this._getTabEntry($tab);
                    entry.contentEl.children().remove();
                    this._loadPlainPaneFromEntry(entry, $tab);
                }
            }
        },

        _createStarBtn: function (isStarred) {
            var self = this;
            var starCfg = {
                'btnCls': "dropdown-star",
                'iconCls': "icon-tab-star",
                'op': function (e, $tab, entry) {
                    // 按钮点击操作
                    var target = e.target;
                    var $btn = $(target).closest('.fs-tab-item-dropdown-btn');
                    if (!entry && !entry.id) {
                        e.stopEvent();
                        return;
                    }
                    if ($btn && $btn.length > 0) {
                        var starred = $btn.data('isStarred');
                        if (starred === true) {
                            // 取消收藏
                            var node = self._getFavoriteNodeByEntry(entry);
                            if (node !== null) {
                                FS.Control.removeFavoriteNode(node.id, function () {
                                    self._replaceStarBtn(!starred);
                                });
                            }
                        } else {
                            // 收藏
                            FS.Control.addFavoriteNode(entry, function () {
                                self._replaceStarBtn(!starred);
                            });
                        }

                    }
                    // 屏蔽选中操作
                    e.stopEvent();
                }
            };
            starCfg.text = isStarred ? FR.i18nText('FS-Frame-Button_Unstar') : FR.i18nText('FS-Frame-Button_Star');
            var $btn = this._createDropdownBtn(starCfg);
            $('.icon-tab-star', $btn).html(isStarred ? '\ue603' : '\ue61e');
            $btn.data("isStarred", isStarred);
            return $btn;
        },

        _replaceStarBtn: function (isStarred) {
            var $btn = this.$float.find(".dropdown-star");
            if ($btn.data("isStarred") !== isStarred) {
                var $icon = $('.icon-tab-star', $btn);
                var $label = $('span', $btn);
                if (isStarred) {
                    // 取消收藏
                    $icon.html('\ue603');
                    $label.text(FR.i18nText('FS-Frame-Button_Unstar'));
                } else {
                    // 收藏
                    $icon.html('\ue61e');
                    $label.text(FR.i18nText('FS-Frame-Button_Star'));
                }
                $btn.data("isStarred", isStarred);
            }
        },

        _findLoadedTabFromEntry: function (entry) {
            var self = this;
            var $tab = null;
            $.each(self.loadedEntries, function (i, loadedEntry) {
                if (self._compareEntry(entry, loadedEntry)) {
                    $tab = $(self.$tabs.children()[i]);
                    return false;
                }
            });
            return $tab;
        },

        /**
         * 比较生成 tab 的两个 entry 是否为同一个
         * @private
         * @param e1 第一个entry
         * @param e2 第二个entry
         * @returns {boolean} 两个 entry 是否为同一个
         */
        _compareEntry: function (e1, e2) {
            if (FR.isNull(e1) || FR.isNull(e2)) {
                return e1 == undefined && e2 == undefined || e1 == null && e2 == null
            }
            if (e1 === e2) {
                return true;
            } else if (typeof e1 == 'object' && typeof e2 == 'object') {
                if (e1.text === e2.text) {
                    // 标题一致
                    return true;
                } else if (!FR.isNull(e1.id) && e1.id === e2.id) {
                    // id 一致
                    return true;
                }
            }
            return false;
        },

        _expandMenu: function (expand, duration) {
            var isExpand = this._isMenuExpanded();
            if (expand === isExpand) {
                return;
            }
            duration = duration || 50;
            if (expand) {
                this.$contentMask.show();
                this.$menu.css({
                    'z-Index': FR.widget.opts.zIndex++
                }).slideDown(duration);
            } else {
                this.$contentMask.hide();
                this.$menu.slideUp(duration);
            }
        },

        _isMenuExpanded: function () {
            return this.$menu.is(":visible");
        },

        _refreshMenu: function () {
            var self = this;
            var menuEntries = this.loadedEntries.slice(this.visibleTabCount);
            this.$menu.children('.slimScrollDiv').detach();
            this.$menu.children('.fs-tab-menu-items').detach();
            this.$menuItems = $('<div class="fs-tab-menu-items"/>')
                .appendTo(this.$menu);
            var maxHeight = this.element.height() - 100;
            var itemsHeight = 0;
            $.each(menuEntries, function (index, entry) {
                itemsHeight += 30;
                var $menuItem = self._addMenuItemFromEntry(entry);
                self.$menuItems.append($menuItem);
            });
            if (itemsHeight > maxHeight) {
                this.$menuItems.slimScroll({
                    position: 'relative',
                    height: maxHeight + 'px'
                })
            }
        },

        _addMenuItemFromEntry: function (entry) {
            var self = this;
            var $menuItem = $('<a class="fs-tab-menu-item nav-btn"/>')
                .data('NAV', this.NAV.MOREITEM)
                .data('ENTRY', entry)
                .appendTo(this.$menuItems);
            $('<span/>').text(entry.text)
                .attr('title', entry.text)
                .appendTo($menuItem);
            $('<i class="icon-tab-close"/>')
                .click(function (e) {
                    var $item = $(this).closest(".fs-tab-menu-item");
                    var $tab = self._findLoadedTabFromEntry($item.data('ENTRY'));
                    self._doCloseTab($tab);
                    // 屏蔽选中操作
                    e.stopEvent();
                }).hide()
                .appendTo($menuItem);
            return $menuItem;
        },

        _loadIframePaneFromEntry: function (entry, $tab) {
            var url, timeStamp = "", self = this;
            this.element.show();
            if (entry.src) {
                url = entry.src;
            } else if (entry.bilink) {
                url = entry.bilink;
            } else if (entry.url) {
                url = entry.url;
                FR.ajax({
                    async: false,
                    data: {
                        serverID : FS.serverID
                    },
                    url: FR.servletURL + '?op=fs_main&cmd=entry_report&id=' + entry.id + '&isTree=true',
                    complete: function (res, status) {
                        timeStamp = (url.indexOf('?') > -1 ? '&' : '?') + 'fr_check_url=' + res.responseText;
                    }
                });
            }
            var src = url ? url + timeStamp : '?op=fs_main&cmd=entry_report&id=' + entry.id;
            if (entry.bi_edit) {
                src += "&edit=_bi_edit_";
            }
            if(FS.serverID){
                src += ("&serverID=" + FS.serverID);
            }

            $('.fs-tab-content-item', this.$content).hide();
            this.setExpand(true, function () {
                var $content = $('<iframe class="fs-tab-content-item"/>').attr(
                    'src', encodeURI(src)
                ).appendTo(self.$content);
                $tab.data('CONTENT', $content);
                $tab.data('COMPLETE', entry.afterLoad);
                self._doSelectTab($tab);
                // 执行后续事件
                if (FR.applyFunc(self, entry.afterLoad, [$tab, $content, entry], false) === false) {
                    FR.applyFunc(self, self.options.afterLoadTab, [$tab, $content, entry], false);
                }
            });
        },

        _loadPlainPaneFromEntry: function (entry, $tab) {
            var self = this;
            this.element.show();
            $('.fs-tab-content-item', this.$content).hide();
            this.setExpand(true, function () {
                var $content = $('<div class="fs-tab-content-item"/>');
                if (entry.contentEl) {
                    $content = entry.contentEl.addClass('fs-tab-content-item').appendTo(self.$content);
                }
                $tab.data('CONTENT', $content);
                $tab.data('COMPLETE', entry.afterLoad);
                self._doSelectTab($tab);
                // 执行后续事件
                if (FR.applyFunc(self, entry.afterLoad, [$tab, $content, entry], false) === false) {
                    FR.applyFunc(self, self.options.afterLoadTab, [$tab, $content, entry], false);
                }
            });
        },

        ////// TabPane 开放的 API ////////

        /**
         * 调整Tab面板尺寸
         * @param give 新的尺寸
         */
        doResize: function (give) {
            if (give) {
                this.element.width(give.width)
                    .height(give.height);
            }
            this._resizeTabs(give);
        },

        /**
         * 获取Tab面板状态是否已展开
         * @returns {Boolean} tab面板是否已展开
         */
        isExpanded: function () {
            return this.isExpand;
        },

        /**
         * 设置Tab面板展开状态
         * @param {Boolean} expand 展开标志: True -> 展开, False -> 收起
         * @param {Function} callback 展开完成后的回调
         */
        setExpand: function (expand, callback) {
            if (this.isExpand == expand) {
                FR.applyFunc(this, callback, [], false);
                return;
            }
            // 始终展开则直接隐藏
            if (!expand && !this.options.isCollapsible) {
                this.element.hide();
                return;
            }
            // 展开被隐藏
            if (expand && this.element.is(":hidden") && this.loadedEntries.length > 0) {
                this.element.show();
            }
            this.isExpand = expand;
            var top = 0;
            if (!expand) {
                top = this.element.height() - this.options.tabHeight;
            }
            this.element.animate({
                top: top
            }, 'fast', callback);
            // 改变弹出菜单位置
            if (expand) {
                this.$menu.css({'top': this.options.tabHeight});
                this.$contentMask.css({'top': 0});
            } else {
                this.$menu.css({'top': -this.$menu.height() - 2});
                this.$contentMask.css({'top': this.options.tabHeight - document.body.clientHeight});
            }
        },

        /**
         * 向Tab栏添加项目
         *
         * @param {Object} entry Tab项对应的entry对象
         * @param [entry.text]  标签页的标题,是为了兼容title属性而存在的
         * @param [entry.title] 标签页的标题
         * @param [entry.src] 标签页的内容指向的地址
         * @param [entry.onCreate]  创建Tab标签时的操作,可修改标签样式
         * @param [entry.onSelect]  选中每个Tab页面时的操作,可修改内容
         * @param [entry.onClose]    关闭每个Tab页面时的操作
         * @param [entry.afterLoad]  加载每个Tab页面时的操作
         */
        addItem: function (entry) {
            // 兼容title参数
            if (!entry.text) {
                entry.text = entry.title;
            }
            var $tab = this._findLoadedTabFromEntry(entry);
            if ($tab === null) {
                $tab = this._addNewTabFromEntry(entry);
            } else {
                this._doSelectTab($tab);
                this._refreshTab($tab, entry.src);
                this.setExpand(true);
                return;
            }
            if (entry.isModule) {
                // 加载模块
                var designContainer = $("<div/>").addClass('fs_design_container');
                entry.contentEl = designContainer;
                FS.Design.initOP();
                var initOP = FS.Design.op;
                entry.afterLoad = function () {
                    if (initOP[entry.id]) {
                        initOP[entry.id].apply(FS.Design, [designContainer]);
                    }
                };
                this._loadPlainPaneFromEntry(entry, $tab);
            } else if (entry.contentEl) {
                this._loadPlainPaneFromEntry(entry, $tab);
            } else {
                this._loadIframePaneFromEntry(entry, $tab);
            }
        }
    });
})(jQuery);