///
/*
* jerichotab
* version: release-2.0.1 (05/13/2009)
* @ jQuery v1.3.*
*
* Licensed under the GPL:
* http://gplv3.fsf.org
*
* Copyright 2008, 2009 Jericho [ thisnamemeansnothing[at]gmail.com ]
========================================
#example:
========================================
========================================
#API:
#$.fn.initJerichoTab(Function):
*renderTo(String): the tab render to('#sample')
*uniqueId(String): the tab's id(It must be unique)
*tabs(Array): the tabs will be initialized, whose items will be formated as follows:
{
**title(String): the tab title text
**iconImg(String): the tab icon that displayed from title text,
**closeable(Boolean): the switch that controls whether the tab can be closed (true as default)
}
*activeTabIndex(Int): the tab you'd like to select after loading(0 as default)
*contentHeight(Int): height of the content div tag
*contentCss(Object): the same as style sheet
*loadOnce(Boolean): the switch controls if load tab content at the first time(true as default)
*tabWidth(Int): width of each tab(150 as default)
#$.fn.jerichoTab.addTab(Function):
*tabId(String); the unique tab Id(Unused, private)
*tabFirer(JQuery Object): the object that makes tab shown in a special way
*title(String): the tab title text
*data(Object): the tab data to load,including:
**dataType:type of data,
**dataLink:data link
#example(must use as suited):
##formtag:
*dataType:'formtag',
//***use the html tags in this page
*dataLink:'#example'
//***id of the tag you'd like to display in this tab
##iframe:
*dataType:'iframe',
//***use the iframe to load another page
*dataLink:''
//***such as 'iframetemplates/iframe.htm'
//***the relative url of the page you'd like to display in this tab,
//***and jerichoTab will use an iframe to load it
###html:
*dataType:'html',
//*** load data from html url
*dataLink:''
// *** the relative url of your html page
##ajax:
*dataType:'ajax',
//***use ajax to load data with asynchronous operations
*dataLink:''
//*** yes,u can write down your ajax handler url and then jerichotab'll make a callback,
//*** so the responseText will be displayed in the content holder(u can use html tags in your server callback datas)
*onLoadCompleted(Function): fired after the data has been loaded
*iconImg(String): the tab icon that displayed below title text(relative to...),
*closeable(Boolean): set whether the tab can be closed(true as default)
========================================
*/
//; (function($) {
$.extend($.fn, {
initJerichoTab: function(setting) {
var opts = $.fn.extend({
//the container of jerichotab(is required, a jQuery format selector String as '.container' or '#container')
renderTo: null,
//the unique id of jerichotab(is required and unique, not null)
uniqueId: null,
//format your tab data like this: [{title:'',iconImg:'',closeable:true},{title:'',iconImg:'',closeable:true}]
//it's an Array...
tabs: [],
//when the jerichotab has been loaded, the tab you'ld like to display first(start at 0, and 0 as default)
activeTabIndex: 0,
//the style sheet of tab content
contentCss: {
'height': '500px'
},
//if you set this property as true, the data'll be loaded only at the first time when users click the tab
//in other times jerichotab only swich it's css(display property) from 'none' to 'block'
loadOnce: true,
//the tab width (150 as default)
tabWidth: 110,
//set an ajaxload effect, jerichotab has provided two choices: 'usebg' | 'righttag'
//'usebg': control if set a big loading gif in the contentholder
//'righttag': this will set a small loading gif in the right top of contentholder
loader: 'righttag',
//两边滑块宽度
slidersWidth: 19,
//标题高度
titleHeight: 26
}, setting);
//initialize the jerichotab
function createJerichoTab() {
//make sure that a container and uniqueId were provided
if (opts.renderTo == null) { alert('you must set the \'renderTo\' property\r\t--JeirchoTab'); return; }
if (opts.uniqueId == null) { alert('you must set the \'uniqueId\' property\r\t--JeirchoTab'); return; }
if ($('#' + opts.uniqueId).length > 0) { alert('you must set the \'uniqueId\' property as unique\r\t--JeirchoTab'); return; }
//the jerichotab html tree:
/*
*/
var jerichotab = $('')
.appendTo($(opts.renderTo));
//apply contentcss to the contentholder
$('.tab_content>.content', jerichotab).css(opts.contentCss);
//fill data
$.fn.jerichoTab = {
master: jerichotab,
tabWidth: opts.tabWidth,
tabPageWidth: $('.tab_pages', jerichotab).width(),
slidersWidth: opts.slidersWidth,
loader: opts.loader,
loadOnce: opts.loadOnce,
tabpage: $('.tab_pages>.tabs>ul', jerichotab),
addTab: function(tabsetting) {
//set as the unique tab id and tabFirer tag
tagGuid = (typeof tagGuid == 'undefined' ? 0 : tagGuid + 1);
var curIndex = tagGuid;
//this function will be open to all users for them to add tab at any time
var ps = $.fn.extend({
//if there is a DOM that cause the tab to be added to tabpages,
//you should pass it to jerichotab, in which way tab'll only be activated when
//user click the DOM next time
tabFirer: null,
title: '新增页签'+(curIndex+1),
//the dataType and dataLink were suited as:
//1.formtag:
// dataType:'formtag',
// --use the html tags in this page
// dataLink:'#example'
// --id of the tag you'ld like to display in this tab
//2.iframe:
// dataType:'iframe',
// --use the iframe to load another page
// dataLink:''
// --such as 'iframetemplates/iframe.htm', set
// --the relative url of the page u'ld like to display in this tab,
// --and jerichoTab will use an iframe to load it
//3.html:
// dataType:'html',
// --load html tags from a url
// dataLink:''
// --the relative url of your html page
//4.ajax:
// dataType:'ajax',
// --use the ajax to load datas with asynchronous operations
// dataLink:''
// --yes,u can write down your ajax handler url and jerichotab'll make a callback,
// --so the responseText will be displayed in the content holder(u can use html tags in your server callback datas)
data: { dataType: '', dataLink: '' },
//set the tab icon of each(relative to...)
iconImg: '',
//whether this tab can be closed(ture as default)
closeable: true,
//this function will be fired after all data has been loaded
onLoadCompleted: null,
// the tab's name
name:''
}, tabsetting);
//window.console && console.log('%o', tabsetting);
//check whether the tabFirer exists or not, and that it has an attribute['jerichotabindex'], then set the tab that tabFirer was connected activated
//otherwise attach the jerichotabindex' attribute
if (ps.tabFirer != null) {
var jerichotabindex = ps.tabFirer.attr('jerichotabindex');
if (typeof jerichotabindex != 'undefined' && $('#jerichotab_' + jerichotabindex).length > 0)
return $.fn.setTabActive(jerichotabindex).adaptSlider().loadData();
ps.tabFirer.attr('jerichotabindex', curIndex);
}
// set name
if(ps.name == ''){
ps.name = ps.title;
}
//newTab html tree:
/*
*/
/*var newTab = $('' +
'' +
(ps.iconImg == '' ? '' : '
') +
'
' + ps.title.cut(opts.tabWidth / 10 - 1) + '
' +
'
' + (ps.closeable ? '
' : '') + '
' +
'
' +
'
' +
'')*/
var newTab = $('' +
'' +
(ps.iconImg == '' ? '' : '
') +
'
' + ps.title.cut(opts.tabWidth / 10 - 1) + '
' +
'
' + (ps.closeable ? '
' : '') + '
' +
'
' +
'
' +
'').appendTo($.fn.jerichoTab.tabpage).css('opacity', '0').applyHover()
.applyCloseEvent().animate({ 'opacity': '1', width: opts.tabWidth }, 100, function() {
$.fn.setTabActive(curIndex);
});
//use an Array named "tabHash" to restore the tab information
tabHash = (typeof tabHash == 'undefined' ? [] : tabHash);
tabHash.push({
index: curIndex,
tabFirer: ps.tabFirer,
tabId: 'jerichotab_' + curIndex,
holderId: 'jerichotabholder_' + curIndex,
iframeId: 'jerichotabiframe_' + curIndex,
onCompleted: ps.onLoadCompleted
});
return newTab.applySlider();
},
closeCurrentTab: function(tabsetting) {
$('.tab_selected .tab_close>a').click();
/*var ps = $.fn.extend({
name:'',
activeTabName:'',
isReaload: false
}, tabsetting);
$.fn.jerichoTab.tabpage.children('li[name='+ps.name+']').remove();
var isLoad = 0;
if(ps.activeTabName != ''){
var lis = $.fn.jerichoTab.tabpage.children('li');
for(var i=0;i 0) ? ($.fn.jerichoTab.slidersWidth * 2) : 0);
$(".tabs", $.fn.jerichoTab.master).width($.fn.jerichoTab.tabPageWidth).applySlider().adaptSlider();
var fixHeight = -2;
//if (Metronic.isIE8()){
// fixHeight = 25;
//}
$('#jerichotab_contentholder').height($(opts.renderTo).height() - opts.titleHeight - 5 - fixHeight);
$(".jericho_tab iframe").height($(".jericho_tab").parent().height() - opts.titleHeight - fixHeight);
};
$(window).resize(function() {
$.fn.jerichoTab.resize();
})
//window.console && console.log('width :' + $.fn.jerichoTab.tabpage.width());
},
//activate the tag(orderkey is the tab order, start at 1)
setTabActiveByOrder: function(orderKey) {
var lastTab = $.fn.jerichoTab.tabpage.children('li').filter('.tab_selected');
if (lastTab.length > 0) lastTab.swapTabEnable();
return $('#jericho_tabs').filter(':nth-child(' + orderKey + ')').swapTabEnable();
},
//activate the tag(orderKey is the tagGuid of each tab)
setTabActive: function(orderKey) {
var lastTab = $.fn.jerichoTab.tabpage.children('li').filter('.tab_selected');
if (lastTab.length > 0) lastTab.swapTabEnable();
return $('#jerichotab_' + orderKey).swapTabEnable();
},
addEvent: function(e, h) {
var target = this.get(0);
if (target.addEventListener) {
target.addEventListener(e, h, false);
} else if (target.attachEvent) {
target.attachEvent('on' + e, h);
}
},
//create an iframe in the contentholder to load pages
buildIFrame: function(src) {
return this.each(function() {
var onComleted = null, jerichotabiframe = '';
for (var tab in tabHash) {
if (tabHash[tab].holderId == $(this).attr('id')) {
onComleted = tabHash[tab].onCompleted;
jerichotabiframe = tabHash[tab].iframeId;
break;
}
}
src += (src.indexOf('?') == -1 ? '?' : '&') + 'tabPageId=' + jerichotabiframe;
var iframe = $('')
.css({ width: '100%', height: $(this).parent().height(), border: 0 }).appendTo($(this));
//add a listener to the load event
$('#' + jerichotabiframe).addEvent('load', function() {
//if onComlete(Function) is not null, then release it
!!onComleted ? onComleted(arguments[1]) : true;
$.fn.removeLoader();
});
});
},
//load data from dataLink
//use the following function after each tab was activated
loadData: function(flag) {
return this.each(function() {
$('.jericho_tab .tab_selected').css('background-color', $('body').css('background-color'));
//show ajaxloader first
$('#jerichotab_contentholder').showLoader();
var onComleted = null, holderId = '', tabId = '';
//search information in tabHash
for (var tab in tabHash) {
if (tabHash[tab].tabId == $(this).attr('id')) {
onComleted = tabHash[tab].onCompleted;
holderId = '#' + tabHash[tab].holderId;
tabId = '#' + tabHash[tab].tabId;
break;
}
}
var dataType = $(this).attr('dataType');
var dataLink = $(this).attr('dataLink');
//if dataType was undefined, nothing will be done
if (typeof dataType == 'undefined' || dataType == '' || dataType == 'undefined') { removeLoading(); return; }
//hide the rest contentholders
$('#jerichotab_contentholder').children('div[class=curholder]').attr('class', 'holder').css({ 'display': 'none' });
var holder = $(holderId);
if (holder.length == 0) {
//if contentholder DOM hasn't been created, create it immediately
holder = $('').appendTo($('#jerichotab_contentholder'));
//load data into holder
load(holder);
}
else {
holder.attr('class', 'curholder').css({ 'display': 'block' });
if ($.fn.jerichoTab.loadOnce && !flag){
removeLoading();
} else {
holder.html('');
load(holder);
}
}
function load(c) {
switch (dataType) {
case 'formtag':
//clone html DOM elements in the page
$(dataLink).css('display', 'none');
var clone = $(dataLink).clone(true).appendTo(c).css('display', 'block');
removeLoading(holder);
break;
case 'html':
//load HTML from page
holder.load(dataLink + '?t=' + Math.floor(Math.random()), function() {
removeLoading(holder);
});
break;
case 'iframe':
//use iframe to load a website
holder.buildIFrame(dataLink, holder);
break;
case 'ajax':
//load a remote page using an HTTP request
$.ajax({
url: dataLink,
data: { t: Math.floor(Math.random()) },
error: function(r) {
holder.html('数据加载失败!');
removeLoading(holder);
},
success: function(r) {
holder.html(r);
removeLoading(holder);
}
});
break;
}
}
function removeLoading(h) {
!!onComleted ? onComleted(h) : true;
$.fn.removeLoader();
}
});
},
//attach the slider event to every tab,
//so users can slide the tabs when there are too much tabs
attachSliderEvent: function() {
return this.each(function() {
var me = this;
$(me).hover(function() {
$(me).swapClass('jericho_slider' + $(me).attr('pos') + '_enable', 'jericho_slider' + $(me).attr('pos') + '_hover');
}, function() {
$(me).swapClass('jericho_slider' + $(me).attr('pos') + '_hover', 'jericho_slider' + $(me).attr('pos') + '_enable');
}).mouseup(function() {
//filter the sliders in order to prevent users from sliding`
if ($(me).is('[slide=no]')) return;
//get the css(left) of tabpage(ul elements)
var offLeft = parseInt($.fn.jerichoTab.tabpage.css('left'));
//the max css(left) of tabpage
var maxLeft = tabHash.length * $.fn.jerichoTab.tabWidth - $.fn.jerichoTab.tabPageWidth + ($.fn.jerichoTab.slidersWidth * 2);
switch ($(me).attr('pos')) {
case 'left':
//slide to the left side
if (offLeft + $.fn.jerichoTab.tabWidth < 0)
$.fn.jerichoTab.tabpage.animate({ left: offLeft + $.fn.jerichoTab.tabWidth }, 100);
else
$.fn.jerichoTab.tabpage.animate({ left: 0 }, 100, function() {
$(me).attr({ 'slide': 'no', 'class': 'jericho_sliders jericho_sliderleft_disable' });
});
$('.jericho_sliders[pos=right]').attr({ 'slide': 'yes', 'class': 'jericho_sliders jericho_sliderright_enable' });
break;
case 'right':
//slide to the right side
if (offLeft - $.fn.jerichoTab.tabWidth > -maxLeft)
$.fn.jerichoTab.tabpage.animate({ left: offLeft - $.fn.jerichoTab.tabWidth }, 100);
else
$.fn.jerichoTab.tabpage.animate({ left: -maxLeft }, 100, function() {
$(me).attr({ 'slide': 'no', 'class': 'jericho_sliders jericho_sliderright_disable' });
});
$('.jericho_sliders[pos=left]').attr({ 'slide': 'yes', 'class': 'jericho_sliders jericho_sliderleft_enable' });
break;
}
});
});
},
//create or activate the slider to tabpage
applySlider: function() {
return this.each(function() {
if (typeof tabHash == 'undefined' || tabHash.length == 0) return;
//get the offwidth of tabpage
var offWidth = tabHash.length * $.fn.jerichoTab.tabWidth - $.fn.jerichoTab.tabPageWidth + ($.fn.jerichoTab.slidersWidth * 2);
if (tabHash.length > 0 && offWidth > 0) {
//make sure that the parent Div of tabpage was fixed(position:relative)
//so jerichotab can control the display position of tabpage by using 'left'
$.fn.jerichoTab.tabpage.parent().css({ width: $.fn.jerichoTab.tabPageWidth - ($.fn.jerichoTab.slidersWidth * 2) });
//auto grow the tabpage(ul) width and reset 'left'
$.fn.jerichoTab.tabpage.css({ width: offWidth + $.fn.jerichoTab.tabPageWidth - ($.fn.jerichoTab.slidersWidth * 2) })
.animate({ left: -offWidth }, 0, function() {
//append 'jerichosliders' to the tabpageholder if 'jerichoslider' has't been added
if ($('.jericho_sliders').length <= 0) {
var s = 'onclick="if(document.selection && document.selection.empty) {document.selection.empty();}else if(window.getSelection) {var sel = window.getSelection();sel.removeAllRanges();}"';
$.fn.jerichoTab.tabpage.parent()
.before($(''));
$.fn.jerichoTab.tabpage.parent()
.after($(''));
$('.jericho_sliders').attachSliderEvent();
}
//$('.jericho_sliders').adaptSlider();
});
}
else if (tabHash.length > 0 && offWidth <= 0) {
//remove 'jerichosliders' whether the tabs were not go beyond the capacity of tabpageholder
$('.jericho_sliders').remove();
$.fn.jerichoTab.tabpage.parent().css({ width: $.fn.jerichoTab.tabPageWidth });
$.fn.jerichoTab.tabpage.css({ width: -offWidth + $.fn.jerichoTab.tabPageWidth })
.animate({ left: 0 }, 0);
}
});
},
//make sure that the slider will be adjusted quickly to the tabpage after tab 'clicking' or tab 'initializing'
adaptSlider: function() {
return this.each(function() {
if ($('.jericho_sliders').length > 0) {
var offLeft = parseInt($.fn.jerichoTab.tabpage.css('left'));
var curtag = '#', index = 0;
for (var t in tabHash) {
if (tabHash[t].tabId == $(this).attr('id')) {
curtag += tabHash[t].tabId;
index = parseInt(t);
break;
}
}
//set the tabpage width
var tabWidth = $.fn.jerichoTab.tabPageWidth - ($.fn.jerichoTab.slidersWidth * 2);
//calculate the distance from the left side of tabpage
var space_l = $.fn.jerichoTab.tabWidth * index + offLeft;
//calculate the distance from the right side of tabpage
var space_r = $.fn.jerichoTab.tabWidth * (index + 1) + offLeft;
//window.console && console.log(space_l + '||' + space_r);
function setSlider(pos, enable) {
$('.jericho_sliders[pos=' + pos + ']').attr({ 'slide': (enable ? 'yes' : 'no'), 'class': 'jericho_sliders jericho_slider' + pos + '_' + (enable ? 'enable' : 'disable') });
}
//slider to right to check whether it's a tab nearby left slider
if ((space_l < 0 && space_l > -$.fn.jerichoTab.tabWidth) && (space_r > 0 && space_r < $.fn.jerichoTab.tabWidth)) {
//left
$.fn.jerichoTab.tabpage.animate({ left: -$.fn.jerichoTab.tabWidth * index }, 0, function() {
if (index == 0) setSlider('left', false);
else setSlider('left', true);
setSlider('right', true);
});
}
//slider to left to check whether it's a tab nearby right slider
if ((space_l < tabWidth && space_l > tabWidth - $.fn.jerichoTab.tabWidth) && (space_r > tabWidth && space_r < tabWidth + $.fn.jerichoTab.tabWidth)) {
//right
$.fn.jerichoTab.tabpage.animate({ left: -$.fn.jerichoTab.tabWidth * (index + 1) + tabWidth }, 0, function() {
if (index == tabHash.length - 1) setSlider('right', false);
else setSlider('left', true);
setSlider('left', true);
});
}
}
});
},
//apply event to the close anchor
applyCloseEvent: function() {
return this.each(function() {
var me = this;
$('.tab_close>a', this).click(function(e) {
//prevents further propagation of the current event.
e.stopPropagation();
if ($(this).length == 0) return;
//remove tab from tabpageholder
$(me).animate({ 'opacity': '0', width: '0px' }, 100, function() {
//make the previous tab selected whether the removed tab was selected
var lastTab = $.fn.jerichoTab.tabpage.children('li').filter('.tab_selected');
if (lastTab.attr('id') == $(this).attr('id')) {
if($(this).prev().text() != ''){
$(this).prev().swapTabEnable().loadData();
}else{
$(this).next().swapTabEnable().loadData();
}
}
//clear the information of the removed tab from tabHash
for (var t in tabHash) {
if (tabHash[t].tabId == $(me).attr('id')) {
if (tabHash[t].tabFirer != null)
tabHash[t].tabFirer.removeAttr('jerichotabindex');
tabHash.splice(t, 1);
}
}
//adapt slider
$(me).applySlider().remove();
//remove contentholder
$('#jerichotabholder_' + $(me).attr('id').replace('jerichotab_', '')).remove();
})
});
$(this).RightMenu('jerichotabmenu',{menuList:[
{menuName:"刷新当前",clickEvent:"$('.tab_selected').loadData(true);"},
{menuName:"关闭其它",clickEvent:"$('.tab_unselect .tab_close>a').click();"
+"setTimeout('$.fn.jerichoTab.resize();setTimeout(\\\'$.fn.jerichoTab.resize();"
+"setTimeout(\\\\\\'$.fn.jerichoTab.resize();\\\\\\',1000);\\\',500);',500);"}
]});
});
},
//apply the "hover" effect and "onSelect" event
applyHover: function() {
return this.each(function() {
$(this).hover(function() {
if ($(this).hasClass('tab_unselect')) $(this).addClass('tab_unselect_h');
}, function() {
if ($(this).hasClass('tab_unselect_h')) $(this).removeClass('tab_unselect_h');
}).mouseup(function() {
if ($(this).hasClass('tab_selected')) return;
//select this tab and hide the last selected tab
var lastTab = $.fn.jerichoTab.tabpage.children('li').filter('.tab_selected');
lastTab.attr('class', 'jericho_tabs tab_unselect');
$('#jerichotabholder_' + lastTab.attr('id').replace('jerichotab_', '')).css({ 'display': 'none' });
$(this).attr('class', 'jericho_tabs tab_selected').loadData().adaptSlider();
});
});
},
//switch the tab between the selected mode and the unselected mode, or v.v...
swapTabEnable: function() {
return this.each(function() {
if ($(this).hasClass('tab_selected'))
$(this).swapClass('tab_selected', 'tab_unselect');
else if ($(this).hasClass('tab_unselect'))
$(this).swapClass('tab_unselect', 'tab_selected');
});
},
//change class from css1 to css2 of DOM
swapClass: function(css1, css2) {
return this.each(function() {
$(this).removeClass(css1).addClass(css2);
})
},
//if it takes a long time to load the data, show a loader to ui
showLoader: function() {
return this.each(function() {
switch ($.fn.jerichoTab.loader) {
case 'usebg':
//add a circular loading gif picture to the background of contentholder
$(this).addClass('loading');
break;
case 'righttag':
//add a small loading gif picture and a banner to the right top corner of contentholder
if ($('#jerichotab_contentholder>.righttag').length == 0)
$('正在加载...
').appendTo($(this));
else
$('#jerichotab_contentholder>.righttag').css({ display: 'block' });
break;
}
});
},
//remove the loader
removeLoader: function() {
switch ($.fn.jerichoTab.loader) {
case 'usebg':
$('#jerichotab_contentholder').removeClass('loading');
break;
case 'righttag':
$('#jerichotab_contentholder>.righttag').css({ display: 'none' });
break;
}
}
});
//})(jQuery);
String.prototype.cut = function(len) {
var position = 0;
var result = [];
var tale = '';
for (var i = 0; i < this.length; i++) {
if (position >= len) {
tale = '...';
break;
}
if (this.charCodeAt(i) > 255) {
position += 2;
result.push(this.substr(i, 1));
}
else {
position++;
result.push(this.substr(i, 1));
}
}
return result.join("") + tale;
}
/*
* 右键菜单,示例:$(this).RightMenu('myMenu2',{menuList:[{menuName:"菜单1",menuclass:"1",clickEvent:"divClick(1)"}]});
*/
$(function(){
document.oncontextmenu=function(){return false;}//屏蔽右键
document.onmousemove=mouseMove;//记录鼠标位置
});
var mx=0,my=0;
function mouseMove(ev){Ev=ev||window.event;var mousePos=mouseCoords(Ev);mx=mousePos.x;my=mousePos.y;}
function mouseCoords(ev){
if(ev.pageX||ev.pageY){return{x:ev.pageX,y:ev.pageY};}
return{x:ev.clientX,y:ev.clientY+$(document).scrollTop()};
}
$.fn.extend({RightMenu: function(id,options){
options = $.extend({menuList:[]},options);
var menuCount=options.menuList.length;
if (!$("#"+id)[0]){
var divMenuList="