(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);