/* * Context.js * Copyright Jacob Kelley * MIT License * * Modified by Joshua Christman */ context = (function () { var options = { fadeSpeed: 100, filter: function ($obj) { // Modify $obj, Do not return }, above: 'auto', left: 'auto', preventDoubleContext: true, compress: false }; function initialize(opts) { options = jQuery.extend({}, options, opts); jQuery(document).on('click', function () { jQuery('.dropdown-context').fadeOut(options.fadeSpeed, function(){ jQuery('.dropdown-context').css({display:''}).find('.drop-left').removeClass('drop-left'); }); }); if(options.preventDoubleContext){ jQuery(document).on('contextmenu', '.dropdown-context', function (e) { e.preventDefault(); }); } jQuery(document).on('mouseenter', '.dropdown-submenu', function(){ var $sub = jQuery(this).find('.dropdown-context-sub:first'), subWidth = $sub.width(), subLeft = $sub.offset().left, collision = (subWidth+subLeft) > window.innerWidth; if(collision){ $sub.addClass('drop-left'); } }); } function updateOptions(opts){ options = jQuery.extend({}, options, opts); } function buildMenu(data, id, subMenu) { var subClass = (subMenu) ? ' dropdown-context-sub' : '', compressed = options.compress ? ' compressed-context' : '', $menu = jQuery(''); return buildMenuItems($menu, data, id, subMenu); } function buildMenuItems($menu, data, id, subMenu, addDynamicTag) { var linkTarget = ''; for(var i = 0; i'; $menu.append(header); } else if (typeof data[i].menu_item_src !== 'undefined') { var funcName; if (typeof data[i].menu_item_src === 'function') { if (data[i].menu_item_src.name === "") { // The function is declared like "foo = function() {}" for (var globalVar in window) { if (data[i].menu_item_src == window[globalVar]) { funcName = globalVar; break; } } } else { funcName = data[i].menu_item_src.name; } } else { funcName = data[i].menu_item_src; } $menu.append('
  • '); } else { if (typeof data[i].href == 'undefined') { data[i].href = '#'; } if (typeof data[i].target !== 'undefined') { linkTarget = ' target="'+data[i].target+'"'; } if (typeof data[i].subMenu !== 'undefined') { var sub_menu = '' $sub = (sub_menu); } else { var element = ''; if (typeof data[i].icon !== 'undefined') element += ' '; element += data[i].text + ''; $sub = jQuery(element); } if (typeof data[i].action !== 'undefined') { $action = data[i].action; $sub .find('a') .addClass('context-event') .on('click', createCallback($action)); } $menu.append($sub); if (typeof data[i].subMenu != 'undefined') { var subMenuData = buildMenu(data[i].subMenu, id, true); $menu.find('li:last').append(subMenuData); } } if (typeof options.filter == 'function') { options.filter($menu.find('li:last')); } } return $menu; } function addContext(selector, data) { if (typeof data.id !== 'undefined' && typeof data.data !== 'undefined') { var id = data.id; $menu = jQuery('body').find('#dropdown-' + id)[0]; if (typeof $menu === 'undefined') { $menu = buildMenu(data.data, id); jQuery('body').append($menu); } } else { var d = new Date(), id = d.getTime(), $menu = buildMenu(data, id); jQuery('body').append($menu); } jQuery(selector).on('contextmenu', function (e) { e.preventDefault(); e.stopPropagation(); currentContextSelector = jQuery(this); jQuery('.dropdown-context:not(.dropdown-context-sub)').hide(); $dd = jQuery('#dropdown-' + id); $dd.find('.dynamic-menu-item').remove(); // Destroy any old dynamic menu items $dd.find('.dynamic-menu-src').each(function(idx, element) { var menuItems = window[jQuery(element).data('src')](jQuery(selector)); $parentMenu = jQuery(element).closest('.dropdown-menu.dropdown-context'); $parentMenu = buildMenuItems($parentMenu, menuItems, id, undefined, true); }); if (typeof options.above == 'boolean' && options.above) { $dd.addClass('dropdown-context-up').css({ top: e.pageY - 20 - jQuery('#dropdown-' + id).height(), left: e.pageX - 13 }).fadeIn(options.fadeSpeed); } else if (typeof options.above == 'string' && options.above == 'auto') { $dd.removeClass('dropdown-context-up'); var autoH = $dd.height() + 12; if ((e.pageY + autoH) > jQuery('html').height()) { $dd.addClass('dropdown-context-up').css({ top: e.pageY - 20 - autoH, left: e.pageX - 13 }).fadeIn(options.fadeSpeed); } else { $dd.css({ top: e.pageY + 10, left: e.pageX - 13 }).fadeIn(options.fadeSpeed); } } if (typeof options.left == 'boolean' && options.left) { $dd.addClass('dropdown-context-left').css({ left: e.pageX - $dd.width() }).fadeIn(options.fadeSpeed); } else if (typeof options.left == 'string' && options.left == 'auto') { $dd.removeClass('dropdown-context-left'); var autoL = $dd.width() - 12; if ((e.pageX + autoL) > jQuery('html').width()) { $dd.addClass('dropdown-context-left').css({ left: e.pageX - $dd.width() + 13 }); } } }); } function destroyContext(selector) { jQuery(document).off('contextmenu', selector).off('click', '.context-event'); } return { init: initialize, settings: updateOptions, attach: addContext, destroy: destroyContext }; })(); var createCallback = function(func) { return function(event) { func(event, currentContextSelector) }; } currentContextSelector = undefined;