2008-07-10 23:57:46 +00:00
|
|
|
/*
|
|
|
|
* ContextMenu - jQuery plugin for right-click context menus
|
|
|
|
*
|
|
|
|
* Author: Chris Domigan
|
|
|
|
* Contributors: Dan G. Switzer, II
|
|
|
|
* Parts of this plugin are inspired by Joern Zaefferer's Tooltip plugin
|
|
|
|
*
|
|
|
|
* Dual licensed under the MIT and GPL licenses:
|
|
|
|
* http://www.opensource.org/licenses/mit-license.php
|
|
|
|
* http://www.gnu.org/licenses/gpl.html
|
|
|
|
*
|
|
|
|
* Version: r2
|
|
|
|
* Date: 16 July 2007
|
|
|
|
*
|
|
|
|
* For documentation visit http://www.trendskitchens.co.nz/jquery/contextmenu/
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
(function($) {
|
|
|
|
|
|
|
|
var menu, shadow, trigger, content, hash, currentTarget;
|
|
|
|
var defaults = {
|
|
|
|
menuStyle: {
|
|
|
|
listStyle: 'none',
|
|
|
|
padding: '1px',
|
|
|
|
margin: '0px',
|
|
|
|
backgroundColor: '#fff',
|
|
|
|
border: '1px solid #999',
|
|
|
|
width: '100px'
|
|
|
|
},
|
|
|
|
itemStyle: {
|
|
|
|
margin: '0px',
|
|
|
|
color: '#000',
|
|
|
|
display: 'block',
|
|
|
|
cursor: 'default',
|
|
|
|
padding: '3px',
|
|
|
|
border: '1px solid #fff',
|
|
|
|
backgroundColor: 'transparent'
|
|
|
|
},
|
|
|
|
itemHoverStyle: {
|
|
|
|
border: '1px solid #0a246a',
|
|
|
|
backgroundColor: '#b6bdd2'
|
|
|
|
},
|
|
|
|
eventPosX: 'pageX',
|
|
|
|
eventPosY: 'pageY',
|
|
|
|
shadow : true,
|
|
|
|
onContextMenu: null,
|
|
|
|
onShowMenu: null
|
|
|
|
};
|
|
|
|
|
|
|
|
$.fn.contextMenu = function(id, options) {
|
|
|
|
if (!menu) { // Create singleton menu
|
|
|
|
menu = $('<div id="jqContextMenu"></div>')
|
|
|
|
.hide()
|
|
|
|
.css({position:'absolute', zIndex:'500'})
|
|
|
|
.appendTo('body')
|
|
|
|
.bind('click', function(e) {
|
|
|
|
e.stopPropagation();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (!shadow) {
|
|
|
|
shadow = $('<div></div>')
|
|
|
|
.css({backgroundColor:'#000',position:'absolute',opacity:0.2,zIndex:499})
|
|
|
|
.appendTo('body')
|
|
|
|
.hide();
|
|
|
|
}
|
|
|
|
hash = hash || [];
|
|
|
|
hash.push({
|
|
|
|
id : id,
|
|
|
|
menuStyle: $.extend({}, defaults.menuStyle, options.menuStyle || {}),
|
|
|
|
itemStyle: $.extend({}, defaults.itemStyle, options.itemStyle || {}),
|
|
|
|
itemHoverStyle: $.extend({}, defaults.itemHoverStyle, options.itemHoverStyle || {}),
|
|
|
|
bindings: options.bindings || {},
|
|
|
|
shadow: options.shadow || options.shadow === false ? options.shadow : defaults.shadow,
|
|
|
|
onContextMenu: options.onContextMenu || defaults.onContextMenu,
|
|
|
|
onShowMenu: options.onShowMenu || defaults.onShowMenu,
|
|
|
|
eventPosX: options.eventPosX || defaults.eventPosX,
|
|
|
|
eventPosY: options.eventPosY || defaults.eventPosY
|
|
|
|
});
|
|
|
|
|
|
|
|
var index = hash.length - 1;
|
|
|
|
$(this).bind('contextmenu', function(e) {
|
|
|
|
// Check if onContextMenu() defined
|
|
|
|
var bShowContext = (!!hash[index].onContextMenu) ? hash[index].onContextMenu(e) : true;
|
|
|
|
if (bShowContext) display(index, this, e, options);
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
|
|
|
|
function display(index, trigger, e, options) {
|
|
|
|
var cur = hash[index];
|
2009-12-15 01:17:17 +00:00
|
|
|
var top = e[cur.eventPosY];
|
|
|
|
var left = e[cur.eventPosX];
|
2008-07-10 23:57:46 +00:00
|
|
|
content = $('#'+cur.id).find('ul:first').clone(true);
|
|
|
|
content.css(cur.menuStyle).find('li').css(cur.itemStyle).hover(
|
|
|
|
function() {
|
|
|
|
$(this).css(cur.itemHoverStyle);
|
|
|
|
},
|
|
|
|
function(){
|
|
|
|
$(this).css(cur.itemStyle);
|
|
|
|
}
|
|
|
|
).find('img').css({verticalAlign:'middle',paddingRight:'2px'});
|
|
|
|
|
|
|
|
// Send the content to the menu
|
|
|
|
menu.html(content);
|
|
|
|
|
|
|
|
// if there's an onShowMenu, run it now -- must run after content has been added
|
|
|
|
// if you try to alter the content variable before the menu.html(), IE6 has issues
|
|
|
|
// updating the content
|
|
|
|
if (!!cur.onShowMenu) menu = cur.onShowMenu(e, menu);
|
|
|
|
|
|
|
|
$.each(cur.bindings, function(id, func) {
|
|
|
|
$('#'+id, menu).bind('click', function(e) {
|
|
|
|
hide();
|
|
|
|
func(trigger, currentTarget);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2009-12-15 01:17:17 +00:00
|
|
|
|
|
|
|
if( top + menu.height() > $(window).height() ) top = top - menu.height();
|
|
|
|
if( left + menu.width() > $(window).width() ) left = left - menu.width();
|
|
|
|
menu.css({'left':left,'top':top}).show();
|
2008-07-10 23:57:46 +00:00
|
|
|
if (cur.shadow) shadow.css({width:menu.width(),height:menu.height(),left:e.pageX+2,top:e.pageY+2}).show();
|
2011-01-15 17:00:52 +00:00
|
|
|
|
|
|
|
setTimeout( function() { // Delay for Mozilla
|
|
|
|
$(document).click( function() {
|
|
|
|
$(document).unbind('click');
|
|
|
|
hide();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
}, 0);
|
2008-07-10 23:57:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function hide() {
|
|
|
|
menu.hide();
|
|
|
|
shadow.hide();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Apply defaults
|
|
|
|
$.contextMenu = {
|
|
|
|
defaults : function(userDefaults) {
|
|
|
|
$.each(userDefaults, function(i, val) {
|
|
|
|
if (typeof val == 'object' && defaults[i]) {
|
|
|
|
$.extend(defaults[i], val);
|
|
|
|
}
|
|
|
|
else defaults[i] = val;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
})(jQuery);
|
|
|
|
|
|
|
|
$(function() {
|
|
|
|
$('div.contextMenu').hide();
|
|
|
|
});
|