133 lines
4.1 KiB
JavaScript
133 lines
4.1 KiB
JavaScript
/*
|
|
Fork of some unlicensed library found somewhere, don't hesitate to
|
|
patch it directly.
|
|
*/
|
|
(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) {
|
|
menu=$('<div id="jqContextMenu" class="openerp"></div>').hide().css({
|
|
position:'absolute',
|
|
zIndex:'2000'
|
|
}).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;
|
|
var callback = function(e) {
|
|
var bShowContext=(!!hash[index].onContextMenu)?hash[index].onContextMenu(e):true;
|
|
if(bShowContext)
|
|
display(index,this,e,options);
|
|
return false;
|
|
};
|
|
if (!options.noRightClick) {
|
|
$(this).bind('contextmenu', callback);
|
|
}
|
|
if (options.leftClickToo || options.noRightClick) {
|
|
$(this).click(callback);
|
|
}
|
|
return this
|
|
};
|
|
function display(index,trigger,e,options) {
|
|
var cur=hash[index];
|
|
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'
|
|
});
|
|
menu.html(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)
|
|
})
|
|
});
|
|
menu.css({
|
|
'left':e[cur.eventPosX],
|
|
'top':e[cur.eventPosY]
|
|
}).show();
|
|
if(cur.shadow)
|
|
shadow.css({
|
|
width:menu.width(),
|
|
height:menu.height(),
|
|
left:e.pageX+2,
|
|
top:e.pageY+2
|
|
}).show();
|
|
$(document).one('click',hide)
|
|
}
|
|
|
|
function hide() {
|
|
menu.hide();
|
|
shadow.hide()
|
|
}
|
|
|
|
$.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()
|
|
});
|