--- /dev/null
+/*
+ * 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];
+ 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);
+ });
+ });
+
+ 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();
+ }
+
+ // 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();
+});
\ No newline at end of file