diff --git a/dist/jquery.contextMenu.js b/dist/jquery.contextMenu.js index 9d87010f..1ce412dc 100755 --- a/dist/jquery.contextMenu.js +++ b/dist/jquery.contextMenu.js @@ -12,7 +12,7 @@ * MIT License http://www.opensource.org/licenses/mit-license * GPL v3 http://opensource.org/licenses/GPL-3.0 * - * Date: 2016-10-25T14:21:57.013Z + * Date: 2016-10-25T14:23:53.059Z */ (function (factory) { @@ -1649,6 +1649,10 @@ // get proper options var context = o.context; $.each(menus, function (ns, o) { + + if (!o) { + return true; + } // Is this menu equest to the context called from if (!$(context).is(o.selector)) { diff --git a/dist/jquery.contextMenu.min.js b/dist/jquery.contextMenu.min.js index 401e369c..977ca5c5 100755 --- a/dist/jquery.contextMenu.min.js +++ b/dist/jquery.contextMenu.min.js @@ -12,7 +12,7 @@ * MIT License http://www.opensource.org/licenses/mit-license * GPL v3 http://opensource.org/licenses/GPL-3.0 * - * Date: 2016-10-25T14:21:57.013Z + * Date: 2016-10-25T14:23:53.059Z */ -!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){"use strict";function t(e){for(var t,n=e.split(/\s+/),a=[],o=0;t=n[o];o++)t=t.charAt(0).toUpperCase(),a.push(t);return a}function n(t){return t.id&&e('label[for="'+t.id+'"]').val()||t.name}function a(t,o,s){return s||(s=0),o.each(function(){var o,i,c=e(this),r=this,l=this.nodeName.toLowerCase();switch("label"===l&&c.find("input, textarea, select").length&&(o=c.text(),c=c.children().first(),r=c.get(0),l=r.nodeName.toLowerCase()),l){case"menu":i={name:c.attr("label"),items:{}},s=a(i.items,c.children(),s);break;case"a":case"button":i={name:c.text(),disabled:!!c.attr("disabled"),callback:function(){return function(){c.click()}}()};break;case"menuitem":case"command":switch(c.attr("type")){case void 0:case"command":case"menuitem":i={name:c.attr("label"),disabled:!!c.attr("disabled"),icon:c.attr("icon"),callback:function(){return function(){c.click()}}()};break;case"checkbox":i={type:"checkbox",disabled:!!c.attr("disabled"),name:c.attr("label"),selected:!!c.attr("checked")};break;case"radio":i={type:"radio",disabled:!!c.attr("disabled"),name:c.attr("label"),radio:c.attr("radiogroup"),value:c.attr("id"),selected:!!c.attr("checked")};break;default:i=void 0}break;case"hr":i="-------";break;case"input":switch(c.attr("type")){case"text":i={type:"text",name:o||n(r),disabled:!!c.attr("disabled"),value:c.val()};break;case"checkbox":i={type:"checkbox",name:o||n(r),disabled:!!c.attr("disabled"),selected:!!c.attr("checked")};break;case"radio":i={type:"radio",name:o||n(r),disabled:!!c.attr("disabled"),radio:!!c.attr("name"),value:c.val(),selected:!!c.attr("checked")};break;default:i=void 0}break;case"select":i={type:"select",name:o||n(r),disabled:!!c.attr("disabled"),selected:c.val(),options:{}},c.children().each(function(){i.options[this.value]=e(this).text()});break;case"textarea":i={type:"textarea",name:o||n(r),disabled:!!c.attr("disabled"),value:c.val()};break;case"label":break;default:i={type:"html",html:c.clone(!0)}}i&&(s++,t["key"+s]=i)}),s}e.support.htmlMenuitem="HTMLMenuItemElement"in window,e.support.htmlCommand="HTMLCommandElement"in window,e.support.eventSelectstart="onselectstart"in document.documentElement,e.ui&&e.widget||(e.cleanData=function(t){return function(n){var a,o,s;for(s=0;null!=n[s];s++){o=n[s];try{a=e._data(o,"events"),a&&a.remove&&e(o).triggerHandler("remove")}catch(i){}}t(n)}}(e.cleanData));var o=null,s=!1,i=e(window),c=0,r={},l={},u={},d={selector:null,appendTo:null,trigger:"right",autoHide:!1,delay:200,reposition:!0,classNames:{hover:"context-menu-hover",disabled:"context-menu-disabled",visible:"context-menu-visible",notSelectable:"context-menu-not-selectable",icon:"context-menu-icon",iconEdit:"context-menu-icon-edit",iconCut:"context-menu-icon-cut",iconCopy:"context-menu-icon-copy",iconPaste:"context-menu-icon-paste",iconDelete:"context-menu-icon-delete",iconAdd:"context-menu-icon-add",iconQuit:"context-menu-icon-quit",iconLoadingClass:"context-menu-icon-loading"},determinePosition:function(t){if(e.ui&&e.ui.position)t.css("display","block").position({my:"center top",at:"center bottom",of:this,offset:"0 5",collision:"fit"}).css("display","none");else{var n=this.offset();n.top+=this.outerHeight(),n.left+=this.outerWidth()/2-t.outerWidth()/2,t.css(n)}},position:function(e,t,n){var a;if(!t&&!n)return void e.determinePosition.call(this,e.$menu);a="maintain"===t&&"maintain"===n?e.$menu.position():{top:n,left:t};var o=i.scrollTop()+i.height(),s=i.scrollLeft()+i.width(),c=e.$menu.outerHeight(),r=e.$menu.outerWidth();a.top+c>o&&(a.top-=c),a.top<0&&(a.top=0),a.left+r>s&&(a.left-=r),a.left<0&&(a.left=0),e.$menu.css(a)},positionSubmenu:function(t){if(void 0!==t)if(e.ui&&e.ui.position)t.css("display","block").position({my:"left top",at:"right top",of:this,collision:"flipfit fit"}).css("display","");else{var n={top:0,left:this.outerWidth()};t.css(n)}},zIndex:1,animation:{duration:50,show:"slideDown",hide:"slideUp"},events:{show:e.noop,hide:e.noop},callback:null,items:{}},m={timer:null,pageX:null,pageY:null},p=function(e){for(var t=0,n=e;;)if(t=Math.max(t,parseInt(n.css("z-index"),10)||0),n=n.parent(),!n||!n.length||"html body".indexOf(n.prop("nodeName").toLowerCase())>-1)break;return t},f={abortevent:function(e){e.preventDefault(),e.stopImmediatePropagation()},contextmenu:function(t){var n=e(this);if("right"===t.data.trigger&&(t.preventDefault(),t.stopImmediatePropagation()),!("right"!==t.data.trigger&&"demand"!==t.data.trigger&&t.originalEvent||!(void 0===t.mouseButton||!t.data||"left"===t.data.trigger&&0===t.mouseButton||"right"===t.data.trigger&&2===t.mouseButton)||n.hasClass("context-menu-active")||n.hasClass("context-menu-disabled"))){if(o=n,t.data.build){var a=t.data.build(o,t);if(a===!1)return;if(t.data=e.extend(!0,{},d,t.data,a||{}),!t.data.items||e.isEmptyObject(t.data.items))throw window.console&&(console.error||console.log).call(console,"No items specified to show in contextMenu"),new Error("No Items specified");t.data.$trigger=o,h.create(t.data)}var s=!1;for(var i in t.data.items)if(t.data.items.hasOwnProperty(i)){var c;c=e.isFunction(t.data.items[i].visible)?t.data.items[i].visible.call(e(t.currentTarget),i,t.data):"undefined"==typeof i.visible||t.data.items[i].visible===!0,c&&(s=!0)}s&&h.show.call(n,t.data,t.pageX,t.pageY)}},click:function(t){t.preventDefault(),t.stopImmediatePropagation(),e(this).trigger(e.Event("contextmenu",{data:t.data,pageX:t.pageX,pageY:t.pageY}))},mousedown:function(t){var n=e(this);o&&o.length&&!o.is(n)&&o.data("contextMenu").$menu.trigger("contextmenu:hide"),2===t.button&&(o=n.data("contextMenuActive",!0))},mouseup:function(t){var n=e(this);n.data("contextMenuActive")&&o&&o.length&&o.is(n)&&!n.hasClass("context-menu-disabled")&&(t.preventDefault(),t.stopImmediatePropagation(),o=n,n.trigger(e.Event("contextmenu",{data:t.data,pageX:t.pageX,pageY:t.pageY}))),n.removeData("contextMenuActive")},mouseenter:function(t){var n=e(this),a=e(t.relatedTarget),s=e(document);a.is(".context-menu-list")||a.closest(".context-menu-list").length||o&&o.length||(m.pageX=t.pageX,m.pageY=t.pageY,m.data=t.data,s.on("mousemove.contextMenuShow",f.mousemove),m.timer=setTimeout(function(){m.timer=null,s.off("mousemove.contextMenuShow"),o=n,n.trigger(e.Event("contextmenu",{data:m.data,pageX:m.pageX,pageY:m.pageY}))},t.data.delay))},mousemove:function(e){m.pageX=e.pageX,m.pageY=e.pageY},mouseleave:function(t){var n=e(t.relatedTarget);if(!n.is(".context-menu-list")&&!n.closest(".context-menu-list").length){try{clearTimeout(m.timer)}catch(t){}m.timer=null}},layerClick:function(t){var n,a,o=e(this),s=o.data("contextMenuRoot"),c=t.button,r=t.pageX,l=t.pageY;t.preventDefault(),t.stopImmediatePropagation(),setTimeout(function(){var o,u="left"===s.trigger&&0===c||"right"===s.trigger&&2===c;if(document.elementFromPoint&&s.$layer&&(s.$layer.hide(),n=document.elementFromPoint(r-i.scrollLeft(),l-i.scrollTop()),s.$layer.show()),s.reposition&&u)if(document.elementFromPoint){if(s.$trigger.is(n)||s.$trigger.has(n).length)return void s.position.call(s.$trigger,s,r,l)}else if(a=s.$trigger.offset(),o=e(window),a.top+=o.scrollTop(),a.top<=t.pageY&&(a.left+=o.scrollLeft(),a.left<=t.pageX&&(a.bottom=a.top+s.$trigger.outerHeight(),a.bottom>=t.pageY&&(a.right=a.left+s.$trigger.outerWidth(),a.right>=t.pageX))))return void s.position.call(s.$trigger,s,r,l);n&&u&&s.$trigger.one("contextmenu:hidden",function(){e(n).contextMenu({x:r,y:l,button:c})}),null!=s&&null!=s.$menu&&s.$menu.trigger("contextmenu:hide")},50)},keyStop:function(e,t){t.isInput||e.preventDefault(),e.stopPropagation()},key:function(e){var t={};o&&(t=o.data("contextMenu")||{}),void 0===t.zIndex&&(t.zIndex=0);var n=0,a=function(e){""!==e.style.zIndex?n=e.style.zIndex:null!==e.offsetParent&&void 0!==e.offsetParent?a(e.offsetParent):null!==e.parentElement&&void 0!==e.parentElement&&a(e.parentElement)};if(a(e.target),!(n>t.zIndex)){switch(e.keyCode){case 9:case 38:if(f.keyStop(e,t),t.isInput){if(9===e.keyCode&&e.shiftKey)return e.preventDefault(),t.$selected&&t.$selected.find("input, textarea, select").blur(),void(null!=t.$menu&&t.$menu.trigger("prevcommand"));if(38===e.keyCode&&"checkbox"===t.$selected.find("input, textarea, select").prop("type"))return void e.preventDefault()}else if(9!==e.keyCode||e.shiftKey)return void(null!=t.$menu&&t.$menu.trigger("prevcommand"));break;case 40:if(f.keyStop(e,t),!t.isInput)return void(null!=t.$menu&&t.$menu.trigger("nextcommand"));if(9===e.keyCode)return e.preventDefault(),t.$selected&&t.$selected.find("input, textarea, select").blur(),void(null!=t.$menu&&t.$menu.trigger("nextcommand"));if(40===e.keyCode&&"checkbox"===t.$selected.find("input, textarea, select").prop("type"))return void e.preventDefault();break;case 37:if(f.keyStop(e,t),t.isInput||!t.$selected||!t.$selected.length)break;if(!t.$selected.parent().hasClass("context-menu-root")){var s=t.$selected.parent().parent();return t.$selected.trigger("contextmenu:blur"),void(t.$selected=s)}break;case 39:if(f.keyStop(e,t),t.isInput||!t.$selected||!t.$selected.length)break;var i=t.$selected.data("contextMenu")||{};if(i.$menu&&t.$selected.hasClass("context-menu-submenu"))return t.$selected=null,i.$selected=null,void i.$menu.trigger("nextcommand");break;case 35:case 36:return t.$selected&&t.$selected.find("input, textarea, select").length?void 0:((t.$selected&&t.$selected.parent()||t.$menu).children(":not(."+t.classNames.disabled+", ."+t.classNames.notSelectable+")")[36===e.keyCode?"first":"last"]().trigger("contextmenu:focus"),void e.preventDefault());case 13:if(f.keyStop(e,t),t.isInput){if(t.$selected&&!t.$selected.is("textarea, select"))return void e.preventDefault();break}return void("undefined"!=typeof t.$selected&&null!==t.$selected&&t.$selected.trigger("mouseup"));case 32:case 33:case 34:return void f.keyStop(e,t);case 27:return f.keyStop(e,t),void(null!=t.$menu&&t.$menu.trigger("contextmenu:hide"));default:var c=String.fromCharCode(e.keyCode).toUpperCase();if(t.accesskeys&&t.accesskeys[c])return void t.accesskeys[c].$node.trigger(t.accesskeys[c].$menu?"contextmenu:focus":"mouseup")}e.stopPropagation(),"undefined"!=typeof t.$selected&&null!==t.$selected&&t.$selected.trigger(e)}},prevItem:function(t){t.stopPropagation();var n=e(this).data("contextMenu")||{},a=e(this).data("contextMenuRoot")||{};if(n.$selected){var o=n.$selected;n=n.$selected.parent().data("contextMenu")||{},n.$selected=o}for(var s=n.$menu.children(),i=n.$selected&&n.$selected.prev().length?n.$selected.prev():s.last(),c=i;i.hasClass(a.classNames.disabled)||i.hasClass(a.classNames.notSelectable)||i.is(":hidden");)if(i=i.prev().length?i.prev():s.last(),i.is(c))return;n.$selected&&f.itemMouseleave.call(n.$selected.get(0),t),f.itemMouseenter.call(i.get(0),t);var r=i.find("input, textarea, select");r.length&&r.focus()},nextItem:function(t){t.stopPropagation();var n=e(this).data("contextMenu")||{},a=e(this).data("contextMenuRoot")||{};if(n.$selected){var o=n.$selected;n=n.$selected.parent().data("contextMenu")||{},n.$selected=o}for(var s=n.$menu.children(),i=n.$selected&&n.$selected.next().length?n.$selected.next():s.first(),c=i;i.hasClass(a.classNames.disabled)||i.hasClass(a.classNames.notSelectable)||i.is(":hidden");)if(i=i.next().length?i.next():s.first(),i.is(c))return;n.$selected&&f.itemMouseleave.call(n.$selected.get(0),t),f.itemMouseenter.call(i.get(0),t);var r=i.find("input, textarea, select");r.length&&r.focus()},focusInput:function(){var t=e(this).closest(".context-menu-item"),n=t.data(),a=n.contextMenu,o=n.contextMenuRoot;o.$selected=a.$selected=t,o.isInput=a.isInput=!0},blurInput:function(){var t=e(this).closest(".context-menu-item"),n=t.data(),a=n.contextMenu,o=n.contextMenuRoot;o.isInput=a.isInput=!1},menuMouseenter:function(){var t=e(this).data().contextMenuRoot;t.hovering=!0},menuMouseleave:function(t){var n=e(this).data().contextMenuRoot;n.$layer&&n.$layer.is(t.relatedTarget)&&(n.hovering=!1)},itemMouseenter:function(t){var n=e(this),a=n.data(),o=a.contextMenu,s=a.contextMenuRoot;return s.hovering=!0,t&&s.$layer&&s.$layer.is(t.relatedTarget)&&(t.preventDefault(),t.stopImmediatePropagation()),(o.$menu?o:s).$menu.children("."+s.classNames.hover).trigger("contextmenu:blur").children(".hover").trigger("contextmenu:blur"),n.hasClass(s.classNames.disabled)||n.hasClass(s.classNames.notSelectable)?void(o.$selected=null):void n.trigger("contextmenu:focus")},itemMouseleave:function(t){var n=e(this),a=n.data(),o=a.contextMenu,s=a.contextMenuRoot;return s!==o&&s.$layer&&s.$layer.is(t.relatedTarget)?("undefined"!=typeof s.$selected&&null!==s.$selected&&s.$selected.trigger("contextmenu:blur"),t.preventDefault(),t.stopImmediatePropagation(),void(s.$selected=o.$selected=o.$node)):void n.trigger("contextmenu:blur")},itemClick:function(t){var n,a=e(this),o=a.data(),s=o.contextMenu,i=o.contextMenuRoot,c=o.contextMenuKey;if(s.items[c]&&!a.is("."+i.classNames.disabled+", .context-menu-submenu, .context-menu-separator, ."+i.classNames.notSelectable)){if(t.preventDefault(),t.stopImmediatePropagation(),e.isFunction(s.callbacks[c])&&Object.prototype.hasOwnProperty.call(s.callbacks,c))n=s.callbacks[c];else{if(!e.isFunction(i.callback))return;n=i.callback}n.call(i.$trigger,c,i)!==!1?i.$menu.trigger("contextmenu:hide"):i.$menu.parent().length&&h.update.call(i.$trigger,i)}},inputClick:function(e){e.stopImmediatePropagation()},hideMenu:function(t,n){var a=e(this).data("contextMenuRoot");h.hide.call(a.$trigger,a,n&&n.force)},focusItem:function(t){t.stopPropagation();var n=e(this),a=n.data(),o=a.contextMenu,s=a.contextMenuRoot;n.hasClass(s.classNames.disabled)||n.hasClass(s.classNames.notSelectable)||(n.addClass([s.classNames.hover,s.classNames.visible].join(" ")).parent().find(".context-menu-item").not(n).removeClass(s.classNames.visible).filter("."+s.classNames.hover).trigger("contextmenu:blur"),o.$selected=s.$selected=n,o.$node&&s.positionSubmenu.call(o.$node,o.$menu))},blurItem:function(t){t.stopPropagation();var n=e(this),a=n.data(),o=a.contextMenu,s=a.contextMenuRoot;o.autoHide&&n.removeClass(s.classNames.visible),n.removeClass(s.classNames.hover),o.$selected=null}},h={show:function(t,n,a){var s=e(this),i={};if(e("#context-menu-layer").trigger("mousedown"),t.$trigger=s,t.events.show.call(s,t)===!1)return void(o=null);if(h.update.call(s,t),t.position.call(s,t,n,a),t.zIndex){var c=t.zIndex;"function"==typeof t.zIndex&&(c=t.zIndex.call(s,t)),i.zIndex=p(s)+c}h.layer.call(t.$menu,t,i.zIndex),t.$menu.find("ul").css("zIndex",i.zIndex+1),t.$menu.css(i)[t.animation.show](t.animation.duration,function(){s.trigger("contextmenu:visible")}),s.data("contextMenu",t).addClass("context-menu-active"),e(document).off("keydown.contextMenu").on("keydown.contextMenu",f.key),t.autoHide&&e(document).on("mousemove.contextMenuAutoHide",function(e){var n=s.offset();n.right=n.left+s.outerWidth(),n.bottom=n.top+s.outerHeight(),!t.$layer||t.hovering||e.pageX>=n.left&&e.pageX<=n.right&&e.pageY>=n.top&&e.pageY<=n.bottom||setTimeout(function(){t.hovering||null==t.$menu||t.$menu.trigger("contextmenu:hide")},50)})},hide:function(t,n){var a=e(this);if(t||(t=a.data("contextMenu")||{}),n||!t.events||t.events.hide.call(a,t)!==!1){if(a.removeData("contextMenu").removeClass("context-menu-active"),t.$layer){setTimeout(function(e){return function(){e.remove()}}(t.$layer),10);try{delete t.$layer}catch(s){t.$layer=null}}o=null,t.$menu.find("."+t.classNames.hover).trigger("contextmenu:blur"),t.$selected=null,t.$menu.find("."+t.classNames.visible).removeClass(t.classNames.visible),e(document).off(".contextMenuAutoHide").off("keydown.contextMenu"),t.$menu&&t.$menu[t.animation.hide](t.animation.duration,function(){t.build&&(t.$menu.remove(),e.each(t,function(e){switch(e){case"ns":case"selector":case"build":case"trigger":return!0;default:t[e]=void 0;try{delete t[e]}catch(n){}return!0}})),setTimeout(function(){a.trigger("contextmenu:hidden")},10)})}},create:function(n,a){function o(t){var n=e("");if(t._accesskey)t._beforeAccesskey&&n.append(document.createTextNode(t._beforeAccesskey)),e("").addClass("context-menu-accesskey").text(t._accesskey).appendTo(n),t._afterAccesskey&&n.append(document.createTextNode(t._afterAccesskey));else if(t.isHtmlName){if("undefined"!=typeof t.accesskey)throw new Error("accesskeys are not compatible with HTML names and cannot be used together in the same item");n.html(t.name)}else n.text(t.name);return n}void 0===a&&(a=n),n.$menu=e('').addClass(n.className||"").data({contextMenu:n,contextMenuRoot:a}),e.each(["callbacks","commands","inputs"],function(e,t){n[t]={},a[t]||(a[t]={})}),a.accesskeys||(a.accesskeys={}),e.each(n.items,function(s,i){var c=e('
  • ').addClass(i.className||""),r=null,l=null;if(c.on("click",e.noop),"string"!=typeof i&&"cm_separator"!==i.type||(i={type:"cm_seperator"}),i.$node=c.data({contextMenu:n,contextMenuRoot:a,contextMenuKey:s}),"undefined"!=typeof i.accesskey)for(var d,m=t(i.accesskey),p=0;d=m[p];p++)if(!a.accesskeys[d]){a.accesskeys[d]=i;var x=i.name.match(new RegExp("^(.*?)("+d+")(.*)$","i"));x&&(i._beforeAccesskey=x[1],i._accesskey=x[2],i._afterAccesskey=x[3]);break}if(i.type&&u[i.type])u[i.type].call(c,i,n,a),e.each([n,a],function(t,a){a.commands[s]=i,!e.isFunction(i.callback)||void 0!==a.callbacks[s]&&void 0!==n.type||(a.callbacks[s]=i.callback)});else{switch("cm_seperator"===i.type?c.addClass("context-menu-separator "+a.classNames.notSelectable):"html"===i.type?c.addClass("context-menu-html "+a.classNames.notSelectable):"sub"===i.type||(i.type?(r=e("").appendTo(c),o(i).appendTo(r),c.addClass("context-menu-input"),n.hasTypes=!0,e.each([n,a],function(e,t){t.commands[s]=i,t.inputs[s]=i})):i.items&&(i.type="sub")),i.type){case"cm_seperator":break;case"text":l=e('').attr("name","context-menu-input-"+s).val(i.value||"").appendTo(r);break;case"textarea":l=e('').attr("name","context-menu-input-"+s).val(i.value||"").appendTo(r),i.height&&l.height(i.height);break;case"checkbox":l=e('').attr("name","context-menu-input-"+s).val(i.value||"").prop("checked",!!i.selected).prependTo(r);break;case"radio":l=e('').attr("name","context-menu-input-"+i.radio).val(i.value||"").prop("checked",!!i.selected).prependTo(r);break;case"select":l=e('').attr("name","context-menu-input-"+s).appendTo(r),i.options&&(e.each(i.options,function(t,n){e("").val(t).text(n).appendTo(l)}),l.val(i.selected));break;case"sub":o(i).appendTo(c),i.appendTo=i.$node,c.data("contextMenu",i).addClass("context-menu-submenu"),i.callback=null,"function"==typeof i.items.then?h.processPromises(i,a,i.items):h.create(i,a);break;case"html":e(i.html).appendTo(c);break;default:e.each([n,a],function(t,a){a.commands[s]=i,!e.isFunction(i.callback)||void 0!==a.callbacks[s]&&void 0!==n.type||(a.callbacks[s]=i.callback)}),o(i).appendTo(c)}i.type&&"sub"!==i.type&&"html"!==i.type&&"cm_seperator"!==i.type&&(l.on("focus",f.focusInput).on("blur",f.blurInput),i.events&&l.on(i.events,n)),i.icon&&(e.isFunction(i.icon)?i._icon=i.icon.call(this,this,c,s,i):"string"==typeof i.icon&&"fa-"==i.icon.substring(0,3)?i._icon=a.classNames.icon+" "+a.classNames.icon+"--fa fa "+i.icon:i._icon=a.classNames.icon+" "+a.classNames.icon+"-"+i.icon,c.addClass(i._icon))}i.$input=l,i.$label=r,c.appendTo(n.$menu),!n.hasTypes&&e.support.eventSelectstart&&c.on("selectstart.disableTextSelect",f.abortevent)}),n.$node||n.$menu.css("display","none").addClass("context-menu-root"),n.$menu.appendTo(n.appendTo||document.body)},resize:function(t,n){var a;t.css({position:"absolute",display:"block"}),t.data("width",(a=t.get(0)).getBoundingClientRect?Math.ceil(a.getBoundingClientRect().width):t.outerWidth()+1),t.css({position:"static",minWidth:"0px",maxWidth:"100000px"}),t.find("> li > ul").each(function(){h.resize(e(this),!0)}),n||t.find("ul").addBack().css({position:"",display:"",minWidth:"",maxWidth:""}).outerWidth(function(){return e(this).data("width")})},update:function(t,n){var a=this;void 0===n&&(n=t,h.resize(t.$menu)),t.$menu.children().each(function(){var o,s=e(this),i=s.data("contextMenuKey"),c=t.items[i],r=e.isFunction(c.disabled)&&c.disabled.call(a,i,n)||c.disabled===!0;if(o=e.isFunction(c.visible)?c.visible.call(a,i,n):"undefined"==typeof c.visible||c.visible===!0,s[o?"show":"hide"](),s[r?"addClass":"removeClass"](n.classNames.disabled),e.isFunction(c.icon)&&(s.removeClass(c._icon),c._icon=c.icon.call(this,a,s,i,c),s.addClass(c._icon)),c.type)switch(s.find("input, select, textarea").prop("disabled",r),c.type){case"text":case"textarea":c.$input.val(c.value||"");break;case"checkbox":case"radio":c.$input.val(c.value||"").prop("checked",!!c.selected);break;case"select":c.$input.val(c.selected||"")}c.$menu&&h.update.call(a,c,n)})},layer:function(t,n){var a=t.$layer=e('
    ').css({height:i.height(),width:i.width(),display:"block"}).data("contextMenuRoot",t).insertBefore(this).on("contextmenu",f.abortevent).on("mousedown",f.layerClick);return void 0===document.body.style.maxWidth&&a.css({position:"absolute",height:e(document).height()}),a},processPromises:function(e,t,n){function a(e,t,n){void 0===n&&o(void 0),s(e,t,n)}function o(e,t,n){void 0===n?(n={error:{name:"No items and no error item",icon:"context-menu-icon context-menu-icon-quit"}},window.console&&(console.error||console.log).call(console,'When you reject a promise, provide an "items" object, equal to normal sub-menu items')):"string"==typeof n&&(n={error:{name:n}}),s(e,t,n)}function s(e,t,n){void 0!==t.$menu&&t.$menu.is(":visible")&&(e.$node.removeClass(t.classNames.iconLoadingClass),e.items=n,h.create(e,t,!0),h.update(e,t),t.positionSubmenu.call(e.$node,e.$menu))}e.$node.addClass(t.classNames.iconLoadingClass),n.then(a.bind(this,e,t),o.bind(this,e,t))}};e.fn.contextMenu=function(t){var n=this,a=t;if(this.length>0)if(void 0===t)this.first().trigger("contextmenu");else if(void 0!==t.x&&void 0!==t.y)this.first().trigger(e.Event("contextmenu",{pageX:t.x,pageY:t.y,mouseButton:t.button}));else if("hide"===t){var o=this.first().data("contextMenu")?this.first().data("contextMenu").$menu:null;o&&o.trigger("contextmenu:hide")}else"destroy"===t?e.contextMenu("destroy",{context:this}):e.isPlainObject(t)?(t.context=this,e.contextMenu("create",t)):t?this.removeClass("context-menu-disabled"):t||this.addClass("context-menu-disabled");else e.each(l,function(){this.selector===n.selector&&(a.data=this,e.extend(a.data,{trigger:"demand"}))}),f.contextmenu.call(a.target,a);return this},e.contextMenu=function(t,n){"string"!=typeof t&&(n=t,t="create"),"string"==typeof n?n={selector:n}:void 0===n&&(n={});var a=e.extend(!0,{},d,n||{}),o=e(document),i=o,u=!1;switch(a.context&&a.context.length?(i=e(a.context).first(),a.context=i.get(0),u=!e(a.context).is(document)):a.context=document,t){case"create":if(!a.selector)throw new Error("No selector specified");if(a.selector.match(/.context-menu-(list|item|input)($|\s)/))throw new Error('Cannot bind to selector "'+a.selector+'" as it contains a reserved className');if(!a.build&&(!a.items||e.isEmptyObject(a.items)))throw new Error("No Items specified");if(c++,a.ns=".contextMenu"+c,u||(r[a.selector]=a.ns),l[a.ns]=a,a.trigger||(a.trigger="right"),!s){var m="click"===a.itemClickEvent?"click.contextMenu":"mouseup.contextMenu",p={"contextmenu:focus.contextMenu":f.focusItem,"contextmenu:blur.contextMenu":f.blurItem,"contextmenu.contextMenu":f.abortevent,"mouseenter.contextMenu":f.itemMouseenter,"mouseleave.contextMenu":f.itemMouseleave};p[m]=f.itemClick,o.on({"contextmenu:hide.contextMenu":f.hideMenu,"prevcommand.contextMenu":f.prevItem,"nextcommand.contextMenu":f.nextItem,"contextmenu.contextMenu":f.abortevent,"mouseenter.contextMenu":f.menuMouseenter,"mouseleave.contextMenu":f.menuMouseleave},".context-menu-list").on("mouseup.contextMenu",".context-menu-input",f.inputClick).on(p,".context-menu-item"),s=!0}switch(i.on("contextmenu"+a.ns,a.selector,a,f.contextmenu),u&&i.on("remove"+a.ns,function(){e(this).contextMenu("destroy")}),a.trigger){case"hover":i.on("mouseenter"+a.ns,a.selector,a,f.mouseenter).on("mouseleave"+a.ns,a.selector,a,f.mouseleave);break;case"left":i.on("click"+a.ns,a.selector,a,f.click)}a.build||h.create(a);break;case"destroy":var x;if(u){var v=a.context;e.each(l,function(t,n){if(!e(v).is(n.selector))return!0;x=e(".context-menu-list").filter(":visible"),x.length&&x.data().contextMenuRoot.$trigger.is(e(n.context).find(n.selector))&&x.trigger("contextmenu:hide",{force:!0});try{l[n.ns].$menu&&l[n.ns].$menu.remove(),delete l[n.ns]}catch(a){l[n.ns]=null}return e(n.context).off(n.ns),!0})}else if(a.selector){if(r[a.selector]){x=e(".context-menu-list").filter(":visible"),x.length&&x.data().contextMenuRoot.$trigger.is(a.selector)&&x.trigger("contextmenu:hide",{force:!0});try{l[r[a.selector]].$menu&&l[r[a.selector]].$menu.remove(),delete l[r[a.selector]]}catch(g){l[r[a.selector]]=null}o.off(r[a.selector])}}else o.off(".contextMenu .contextMenuAutoHide"),e.each(l,function(t,n){e(n.context).off(n.ns)}),r={},l={},c=0,s=!1,e("#context-menu-layer, .context-menu-list").remove();break;case"html5":(!e.support.htmlCommand&&!e.support.htmlMenuitem||"boolean"==typeof n&&n)&&e('menu[type="context"]').each(function(){this.id&&e.contextMenu({selector:"[contextmenu="+this.id+"]",items:e.contextMenu.fromMenu(this)})}).css("display","none");break;default:throw new Error('Unknown operation "'+t+'"')}return this},e.contextMenu.setInputValues=function(t,n){void 0===n&&(n={}),e.each(t.inputs,function(e,t){switch(t.type){case"text":case"textarea":t.value=n[e]||"";break;case"checkbox":t.selected=!!n[e];break;case"radio":t.selected=(n[t.radio]||"")===t.value;break;case"select":t.selected=n[e]||""}})},e.contextMenu.getInputValues=function(t,n){return void 0===n&&(n={}),e.each(t.inputs,function(e,t){switch(t.type){case"text":case"textarea":case"select":n[e]=t.$input.val();break;case"checkbox":n[e]=t.$input.prop("checked");break;case"radio":t.$input.prop("checked")&&(n[t.radio]=t.value)}}),n},e.contextMenu.fromMenu=function(t){var n=e(t),o={};return a(o,n.children()),o},e.contextMenu.defaults=d,e.contextMenu.types=u,e.contextMenu.handle=f,e.contextMenu.op=h,e.contextMenu.menus=l}); +!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){"use strict";function t(e){for(var t,n=e.split(/\s+/),a=[],o=0;t=n[o];o++)t=t.charAt(0).toUpperCase(),a.push(t);return a}function n(t){return t.id&&e('label[for="'+t.id+'"]').val()||t.name}function a(t,o,s){return s||(s=0),o.each(function(){var o,i,c=e(this),r=this,l=this.nodeName.toLowerCase();switch("label"===l&&c.find("input, textarea, select").length&&(o=c.text(),c=c.children().first(),r=c.get(0),l=r.nodeName.toLowerCase()),l){case"menu":i={name:c.attr("label"),items:{}},s=a(i.items,c.children(),s);break;case"a":case"button":i={name:c.text(),disabled:!!c.attr("disabled"),callback:function(){return function(){c.click()}}()};break;case"menuitem":case"command":switch(c.attr("type")){case void 0:case"command":case"menuitem":i={name:c.attr("label"),disabled:!!c.attr("disabled"),icon:c.attr("icon"),callback:function(){return function(){c.click()}}()};break;case"checkbox":i={type:"checkbox",disabled:!!c.attr("disabled"),name:c.attr("label"),selected:!!c.attr("checked")};break;case"radio":i={type:"radio",disabled:!!c.attr("disabled"),name:c.attr("label"),radio:c.attr("radiogroup"),value:c.attr("id"),selected:!!c.attr("checked")};break;default:i=void 0}break;case"hr":i="-------";break;case"input":switch(c.attr("type")){case"text":i={type:"text",name:o||n(r),disabled:!!c.attr("disabled"),value:c.val()};break;case"checkbox":i={type:"checkbox",name:o||n(r),disabled:!!c.attr("disabled"),selected:!!c.attr("checked")};break;case"radio":i={type:"radio",name:o||n(r),disabled:!!c.attr("disabled"),radio:!!c.attr("name"),value:c.val(),selected:!!c.attr("checked")};break;default:i=void 0}break;case"select":i={type:"select",name:o||n(r),disabled:!!c.attr("disabled"),selected:c.val(),options:{}},c.children().each(function(){i.options[this.value]=e(this).text()});break;case"textarea":i={type:"textarea",name:o||n(r),disabled:!!c.attr("disabled"),value:c.val()};break;case"label":break;default:i={type:"html",html:c.clone(!0)}}i&&(s++,t["key"+s]=i)}),s}e.support.htmlMenuitem="HTMLMenuItemElement"in window,e.support.htmlCommand="HTMLCommandElement"in window,e.support.eventSelectstart="onselectstart"in document.documentElement,e.ui&&e.widget||(e.cleanData=function(t){return function(n){var a,o,s;for(s=0;null!=n[s];s++){o=n[s];try{a=e._data(o,"events"),a&&a.remove&&e(o).triggerHandler("remove")}catch(i){}}t(n)}}(e.cleanData));var o=null,s=!1,i=e(window),c=0,r={},l={},u={},d={selector:null,appendTo:null,trigger:"right",autoHide:!1,delay:200,reposition:!0,classNames:{hover:"context-menu-hover",disabled:"context-menu-disabled",visible:"context-menu-visible",notSelectable:"context-menu-not-selectable",icon:"context-menu-icon",iconEdit:"context-menu-icon-edit",iconCut:"context-menu-icon-cut",iconCopy:"context-menu-icon-copy",iconPaste:"context-menu-icon-paste",iconDelete:"context-menu-icon-delete",iconAdd:"context-menu-icon-add",iconQuit:"context-menu-icon-quit",iconLoadingClass:"context-menu-icon-loading"},determinePosition:function(t){if(e.ui&&e.ui.position)t.css("display","block").position({my:"center top",at:"center bottom",of:this,offset:"0 5",collision:"fit"}).css("display","none");else{var n=this.offset();n.top+=this.outerHeight(),n.left+=this.outerWidth()/2-t.outerWidth()/2,t.css(n)}},position:function(e,t,n){var a;if(!t&&!n)return void e.determinePosition.call(this,e.$menu);a="maintain"===t&&"maintain"===n?e.$menu.position():{top:n,left:t};var o=i.scrollTop()+i.height(),s=i.scrollLeft()+i.width(),c=e.$menu.outerHeight(),r=e.$menu.outerWidth();a.top+c>o&&(a.top-=c),a.top<0&&(a.top=0),a.left+r>s&&(a.left-=r),a.left<0&&(a.left=0),e.$menu.css(a)},positionSubmenu:function(t){if(void 0!==t)if(e.ui&&e.ui.position)t.css("display","block").position({my:"left top",at:"right top",of:this,collision:"flipfit fit"}).css("display","");else{var n={top:0,left:this.outerWidth()};t.css(n)}},zIndex:1,animation:{duration:50,show:"slideDown",hide:"slideUp"},events:{show:e.noop,hide:e.noop},callback:null,items:{}},m={timer:null,pageX:null,pageY:null},p=function(e){for(var t=0,n=e;;)if(t=Math.max(t,parseInt(n.css("z-index"),10)||0),n=n.parent(),!n||!n.length||"html body".indexOf(n.prop("nodeName").toLowerCase())>-1)break;return t},f={abortevent:function(e){e.preventDefault(),e.stopImmediatePropagation()},contextmenu:function(t){var n=e(this);if("right"===t.data.trigger&&(t.preventDefault(),t.stopImmediatePropagation()),!("right"!==t.data.trigger&&"demand"!==t.data.trigger&&t.originalEvent||!(void 0===t.mouseButton||!t.data||"left"===t.data.trigger&&0===t.mouseButton||"right"===t.data.trigger&&2===t.mouseButton)||n.hasClass("context-menu-active")||n.hasClass("context-menu-disabled"))){if(o=n,t.data.build){var a=t.data.build(o,t);if(a===!1)return;if(t.data=e.extend(!0,{},d,t.data,a||{}),!t.data.items||e.isEmptyObject(t.data.items))throw window.console&&(console.error||console.log).call(console,"No items specified to show in contextMenu"),new Error("No Items specified");t.data.$trigger=o,h.create(t.data)}var s=!1;for(var i in t.data.items)if(t.data.items.hasOwnProperty(i)){var c;c=e.isFunction(t.data.items[i].visible)?t.data.items[i].visible.call(e(t.currentTarget),i,t.data):"undefined"==typeof i.visible||t.data.items[i].visible===!0,c&&(s=!0)}s&&h.show.call(n,t.data,t.pageX,t.pageY)}},click:function(t){t.preventDefault(),t.stopImmediatePropagation(),e(this).trigger(e.Event("contextmenu",{data:t.data,pageX:t.pageX,pageY:t.pageY}))},mousedown:function(t){var n=e(this);o&&o.length&&!o.is(n)&&o.data("contextMenu").$menu.trigger("contextmenu:hide"),2===t.button&&(o=n.data("contextMenuActive",!0))},mouseup:function(t){var n=e(this);n.data("contextMenuActive")&&o&&o.length&&o.is(n)&&!n.hasClass("context-menu-disabled")&&(t.preventDefault(),t.stopImmediatePropagation(),o=n,n.trigger(e.Event("contextmenu",{data:t.data,pageX:t.pageX,pageY:t.pageY}))),n.removeData("contextMenuActive")},mouseenter:function(t){var n=e(this),a=e(t.relatedTarget),s=e(document);a.is(".context-menu-list")||a.closest(".context-menu-list").length||o&&o.length||(m.pageX=t.pageX,m.pageY=t.pageY,m.data=t.data,s.on("mousemove.contextMenuShow",f.mousemove),m.timer=setTimeout(function(){m.timer=null,s.off("mousemove.contextMenuShow"),o=n,n.trigger(e.Event("contextmenu",{data:m.data,pageX:m.pageX,pageY:m.pageY}))},t.data.delay))},mousemove:function(e){m.pageX=e.pageX,m.pageY=e.pageY},mouseleave:function(t){var n=e(t.relatedTarget);if(!n.is(".context-menu-list")&&!n.closest(".context-menu-list").length){try{clearTimeout(m.timer)}catch(t){}m.timer=null}},layerClick:function(t){var n,a,o=e(this),s=o.data("contextMenuRoot"),c=t.button,r=t.pageX,l=t.pageY;t.preventDefault(),t.stopImmediatePropagation(),setTimeout(function(){var o,u="left"===s.trigger&&0===c||"right"===s.trigger&&2===c;if(document.elementFromPoint&&s.$layer&&(s.$layer.hide(),n=document.elementFromPoint(r-i.scrollLeft(),l-i.scrollTop()),s.$layer.show()),s.reposition&&u)if(document.elementFromPoint){if(s.$trigger.is(n)||s.$trigger.has(n).length)return void s.position.call(s.$trigger,s,r,l)}else if(a=s.$trigger.offset(),o=e(window),a.top+=o.scrollTop(),a.top<=t.pageY&&(a.left+=o.scrollLeft(),a.left<=t.pageX&&(a.bottom=a.top+s.$trigger.outerHeight(),a.bottom>=t.pageY&&(a.right=a.left+s.$trigger.outerWidth(),a.right>=t.pageX))))return void s.position.call(s.$trigger,s,r,l);n&&u&&s.$trigger.one("contextmenu:hidden",function(){e(n).contextMenu({x:r,y:l,button:c})}),null!=s&&null!=s.$menu&&s.$menu.trigger("contextmenu:hide")},50)},keyStop:function(e,t){t.isInput||e.preventDefault(),e.stopPropagation()},key:function(e){var t={};o&&(t=o.data("contextMenu")||{}),void 0===t.zIndex&&(t.zIndex=0);var n=0,a=function(e){""!==e.style.zIndex?n=e.style.zIndex:null!==e.offsetParent&&void 0!==e.offsetParent?a(e.offsetParent):null!==e.parentElement&&void 0!==e.parentElement&&a(e.parentElement)};if(a(e.target),!(n>t.zIndex)){switch(e.keyCode){case 9:case 38:if(f.keyStop(e,t),t.isInput){if(9===e.keyCode&&e.shiftKey)return e.preventDefault(),t.$selected&&t.$selected.find("input, textarea, select").blur(),void(null!=t.$menu&&t.$menu.trigger("prevcommand"));if(38===e.keyCode&&"checkbox"===t.$selected.find("input, textarea, select").prop("type"))return void e.preventDefault()}else if(9!==e.keyCode||e.shiftKey)return void(null!=t.$menu&&t.$menu.trigger("prevcommand"));break;case 40:if(f.keyStop(e,t),!t.isInput)return void(null!=t.$menu&&t.$menu.trigger("nextcommand"));if(9===e.keyCode)return e.preventDefault(),t.$selected&&t.$selected.find("input, textarea, select").blur(),void(null!=t.$menu&&t.$menu.trigger("nextcommand"));if(40===e.keyCode&&"checkbox"===t.$selected.find("input, textarea, select").prop("type"))return void e.preventDefault();break;case 37:if(f.keyStop(e,t),t.isInput||!t.$selected||!t.$selected.length)break;if(!t.$selected.parent().hasClass("context-menu-root")){var s=t.$selected.parent().parent();return t.$selected.trigger("contextmenu:blur"),void(t.$selected=s)}break;case 39:if(f.keyStop(e,t),t.isInput||!t.$selected||!t.$selected.length)break;var i=t.$selected.data("contextMenu")||{};if(i.$menu&&t.$selected.hasClass("context-menu-submenu"))return t.$selected=null,i.$selected=null,void i.$menu.trigger("nextcommand");break;case 35:case 36:return t.$selected&&t.$selected.find("input, textarea, select").length?void 0:((t.$selected&&t.$selected.parent()||t.$menu).children(":not(."+t.classNames.disabled+", ."+t.classNames.notSelectable+")")[36===e.keyCode?"first":"last"]().trigger("contextmenu:focus"),void e.preventDefault());case 13:if(f.keyStop(e,t),t.isInput){if(t.$selected&&!t.$selected.is("textarea, select"))return void e.preventDefault();break}return void("undefined"!=typeof t.$selected&&null!==t.$selected&&t.$selected.trigger("mouseup"));case 32:case 33:case 34:return void f.keyStop(e,t);case 27:return f.keyStop(e,t),void(null!=t.$menu&&t.$menu.trigger("contextmenu:hide"));default:var c=String.fromCharCode(e.keyCode).toUpperCase();if(t.accesskeys&&t.accesskeys[c])return void t.accesskeys[c].$node.trigger(t.accesskeys[c].$menu?"contextmenu:focus":"mouseup")}e.stopPropagation(),"undefined"!=typeof t.$selected&&null!==t.$selected&&t.$selected.trigger(e)}},prevItem:function(t){t.stopPropagation();var n=e(this).data("contextMenu")||{},a=e(this).data("contextMenuRoot")||{};if(n.$selected){var o=n.$selected;n=n.$selected.parent().data("contextMenu")||{},n.$selected=o}for(var s=n.$menu.children(),i=n.$selected&&n.$selected.prev().length?n.$selected.prev():s.last(),c=i;i.hasClass(a.classNames.disabled)||i.hasClass(a.classNames.notSelectable)||i.is(":hidden");)if(i=i.prev().length?i.prev():s.last(),i.is(c))return;n.$selected&&f.itemMouseleave.call(n.$selected.get(0),t),f.itemMouseenter.call(i.get(0),t);var r=i.find("input, textarea, select");r.length&&r.focus()},nextItem:function(t){t.stopPropagation();var n=e(this).data("contextMenu")||{},a=e(this).data("contextMenuRoot")||{};if(n.$selected){var o=n.$selected;n=n.$selected.parent().data("contextMenu")||{},n.$selected=o}for(var s=n.$menu.children(),i=n.$selected&&n.$selected.next().length?n.$selected.next():s.first(),c=i;i.hasClass(a.classNames.disabled)||i.hasClass(a.classNames.notSelectable)||i.is(":hidden");)if(i=i.next().length?i.next():s.first(),i.is(c))return;n.$selected&&f.itemMouseleave.call(n.$selected.get(0),t),f.itemMouseenter.call(i.get(0),t);var r=i.find("input, textarea, select");r.length&&r.focus()},focusInput:function(){var t=e(this).closest(".context-menu-item"),n=t.data(),a=n.contextMenu,o=n.contextMenuRoot;o.$selected=a.$selected=t,o.isInput=a.isInput=!0},blurInput:function(){var t=e(this).closest(".context-menu-item"),n=t.data(),a=n.contextMenu,o=n.contextMenuRoot;o.isInput=a.isInput=!1},menuMouseenter:function(){var t=e(this).data().contextMenuRoot;t.hovering=!0},menuMouseleave:function(t){var n=e(this).data().contextMenuRoot;n.$layer&&n.$layer.is(t.relatedTarget)&&(n.hovering=!1)},itemMouseenter:function(t){var n=e(this),a=n.data(),o=a.contextMenu,s=a.contextMenuRoot;return s.hovering=!0,t&&s.$layer&&s.$layer.is(t.relatedTarget)&&(t.preventDefault(),t.stopImmediatePropagation()),(o.$menu?o:s).$menu.children("."+s.classNames.hover).trigger("contextmenu:blur").children(".hover").trigger("contextmenu:blur"),n.hasClass(s.classNames.disabled)||n.hasClass(s.classNames.notSelectable)?void(o.$selected=null):void n.trigger("contextmenu:focus")},itemMouseleave:function(t){var n=e(this),a=n.data(),o=a.contextMenu,s=a.contextMenuRoot;return s!==o&&s.$layer&&s.$layer.is(t.relatedTarget)?("undefined"!=typeof s.$selected&&null!==s.$selected&&s.$selected.trigger("contextmenu:blur"),t.preventDefault(),t.stopImmediatePropagation(),void(s.$selected=o.$selected=o.$node)):void n.trigger("contextmenu:blur")},itemClick:function(t){var n,a=e(this),o=a.data(),s=o.contextMenu,i=o.contextMenuRoot,c=o.contextMenuKey;if(s.items[c]&&!a.is("."+i.classNames.disabled+", .context-menu-submenu, .context-menu-separator, ."+i.classNames.notSelectable)){if(t.preventDefault(),t.stopImmediatePropagation(),e.isFunction(s.callbacks[c])&&Object.prototype.hasOwnProperty.call(s.callbacks,c))n=s.callbacks[c];else{if(!e.isFunction(i.callback))return;n=i.callback}n.call(i.$trigger,c,i)!==!1?i.$menu.trigger("contextmenu:hide"):i.$menu.parent().length&&h.update.call(i.$trigger,i)}},inputClick:function(e){e.stopImmediatePropagation()},hideMenu:function(t,n){var a=e(this).data("contextMenuRoot");h.hide.call(a.$trigger,a,n&&n.force)},focusItem:function(t){t.stopPropagation();var n=e(this),a=n.data(),o=a.contextMenu,s=a.contextMenuRoot;n.hasClass(s.classNames.disabled)||n.hasClass(s.classNames.notSelectable)||(n.addClass([s.classNames.hover,s.classNames.visible].join(" ")).parent().find(".context-menu-item").not(n).removeClass(s.classNames.visible).filter("."+s.classNames.hover).trigger("contextmenu:blur"),o.$selected=s.$selected=n,o.$node&&s.positionSubmenu.call(o.$node,o.$menu))},blurItem:function(t){t.stopPropagation();var n=e(this),a=n.data(),o=a.contextMenu,s=a.contextMenuRoot;o.autoHide&&n.removeClass(s.classNames.visible),n.removeClass(s.classNames.hover),o.$selected=null}},h={show:function(t,n,a){var s=e(this),i={};if(e("#context-menu-layer").trigger("mousedown"),t.$trigger=s,t.events.show.call(s,t)===!1)return void(o=null);if(h.update.call(s,t),t.position.call(s,t,n,a),t.zIndex){var c=t.zIndex;"function"==typeof t.zIndex&&(c=t.zIndex.call(s,t)),i.zIndex=p(s)+c}h.layer.call(t.$menu,t,i.zIndex),t.$menu.find("ul").css("zIndex",i.zIndex+1),t.$menu.css(i)[t.animation.show](t.animation.duration,function(){s.trigger("contextmenu:visible")}),s.data("contextMenu",t).addClass("context-menu-active"),e(document).off("keydown.contextMenu").on("keydown.contextMenu",f.key),t.autoHide&&e(document).on("mousemove.contextMenuAutoHide",function(e){var n=s.offset();n.right=n.left+s.outerWidth(),n.bottom=n.top+s.outerHeight(),!t.$layer||t.hovering||e.pageX>=n.left&&e.pageX<=n.right&&e.pageY>=n.top&&e.pageY<=n.bottom||setTimeout(function(){t.hovering||null==t.$menu||t.$menu.trigger("contextmenu:hide")},50)})},hide:function(t,n){var a=e(this);if(t||(t=a.data("contextMenu")||{}),n||!t.events||t.events.hide.call(a,t)!==!1){if(a.removeData("contextMenu").removeClass("context-menu-active"),t.$layer){setTimeout(function(e){return function(){e.remove()}}(t.$layer),10);try{delete t.$layer}catch(s){t.$layer=null}}o=null,t.$menu.find("."+t.classNames.hover).trigger("contextmenu:blur"),t.$selected=null,t.$menu.find("."+t.classNames.visible).removeClass(t.classNames.visible),e(document).off(".contextMenuAutoHide").off("keydown.contextMenu"),t.$menu&&t.$menu[t.animation.hide](t.animation.duration,function(){t.build&&(t.$menu.remove(),e.each(t,function(e){switch(e){case"ns":case"selector":case"build":case"trigger":return!0;default:t[e]=void 0;try{delete t[e]}catch(n){}return!0}})),setTimeout(function(){a.trigger("contextmenu:hidden")},10)})}},create:function(n,a){function o(t){var n=e("");if(t._accesskey)t._beforeAccesskey&&n.append(document.createTextNode(t._beforeAccesskey)),e("").addClass("context-menu-accesskey").text(t._accesskey).appendTo(n),t._afterAccesskey&&n.append(document.createTextNode(t._afterAccesskey));else if(t.isHtmlName){if("undefined"!=typeof t.accesskey)throw new Error("accesskeys are not compatible with HTML names and cannot be used together in the same item");n.html(t.name)}else n.text(t.name);return n}void 0===a&&(a=n),n.$menu=e('').addClass(n.className||"").data({contextMenu:n,contextMenuRoot:a}),e.each(["callbacks","commands","inputs"],function(e,t){n[t]={},a[t]||(a[t]={})}),a.accesskeys||(a.accesskeys={}),e.each(n.items,function(s,i){var c=e('
  • ').addClass(i.className||""),r=null,l=null;if(c.on("click",e.noop),"string"!=typeof i&&"cm_separator"!==i.type||(i={type:"cm_seperator"}),i.$node=c.data({contextMenu:n,contextMenuRoot:a,contextMenuKey:s}),"undefined"!=typeof i.accesskey)for(var d,m=t(i.accesskey),p=0;d=m[p];p++)if(!a.accesskeys[d]){a.accesskeys[d]=i;var x=i.name.match(new RegExp("^(.*?)("+d+")(.*)$","i"));x&&(i._beforeAccesskey=x[1],i._accesskey=x[2],i._afterAccesskey=x[3]);break}if(i.type&&u[i.type])u[i.type].call(c,i,n,a),e.each([n,a],function(t,a){a.commands[s]=i,!e.isFunction(i.callback)||void 0!==a.callbacks[s]&&void 0!==n.type||(a.callbacks[s]=i.callback)});else{switch("cm_seperator"===i.type?c.addClass("context-menu-separator "+a.classNames.notSelectable):"html"===i.type?c.addClass("context-menu-html "+a.classNames.notSelectable):"sub"===i.type||(i.type?(r=e("").appendTo(c),o(i).appendTo(r),c.addClass("context-menu-input"),n.hasTypes=!0,e.each([n,a],function(e,t){t.commands[s]=i,t.inputs[s]=i})):i.items&&(i.type="sub")),i.type){case"cm_seperator":break;case"text":l=e('').attr("name","context-menu-input-"+s).val(i.value||"").appendTo(r);break;case"textarea":l=e('').attr("name","context-menu-input-"+s).val(i.value||"").appendTo(r),i.height&&l.height(i.height);break;case"checkbox":l=e('').attr("name","context-menu-input-"+s).val(i.value||"").prop("checked",!!i.selected).prependTo(r);break;case"radio":l=e('').attr("name","context-menu-input-"+i.radio).val(i.value||"").prop("checked",!!i.selected).prependTo(r);break;case"select":l=e('').attr("name","context-menu-input-"+s).appendTo(r),i.options&&(e.each(i.options,function(t,n){e("").val(t).text(n).appendTo(l)}),l.val(i.selected));break;case"sub":o(i).appendTo(c),i.appendTo=i.$node,c.data("contextMenu",i).addClass("context-menu-submenu"),i.callback=null,"function"==typeof i.items.then?h.processPromises(i,a,i.items):h.create(i,a);break;case"html":e(i.html).appendTo(c);break;default:e.each([n,a],function(t,a){a.commands[s]=i,!e.isFunction(i.callback)||void 0!==a.callbacks[s]&&void 0!==n.type||(a.callbacks[s]=i.callback)}),o(i).appendTo(c)}i.type&&"sub"!==i.type&&"html"!==i.type&&"cm_seperator"!==i.type&&(l.on("focus",f.focusInput).on("blur",f.blurInput),i.events&&l.on(i.events,n)),i.icon&&(e.isFunction(i.icon)?i._icon=i.icon.call(this,this,c,s,i):"string"==typeof i.icon&&"fa-"==i.icon.substring(0,3)?i._icon=a.classNames.icon+" "+a.classNames.icon+"--fa fa "+i.icon:i._icon=a.classNames.icon+" "+a.classNames.icon+"-"+i.icon,c.addClass(i._icon))}i.$input=l,i.$label=r,c.appendTo(n.$menu),!n.hasTypes&&e.support.eventSelectstart&&c.on("selectstart.disableTextSelect",f.abortevent)}),n.$node||n.$menu.css("display","none").addClass("context-menu-root"),n.$menu.appendTo(n.appendTo||document.body)},resize:function(t,n){var a;t.css({position:"absolute",display:"block"}),t.data("width",(a=t.get(0)).getBoundingClientRect?Math.ceil(a.getBoundingClientRect().width):t.outerWidth()+1),t.css({position:"static",minWidth:"0px",maxWidth:"100000px"}),t.find("> li > ul").each(function(){h.resize(e(this),!0)}),n||t.find("ul").addBack().css({position:"",display:"",minWidth:"",maxWidth:""}).outerWidth(function(){return e(this).data("width")})},update:function(t,n){var a=this;void 0===n&&(n=t,h.resize(t.$menu)),t.$menu.children().each(function(){var o,s=e(this),i=s.data("contextMenuKey"),c=t.items[i],r=e.isFunction(c.disabled)&&c.disabled.call(a,i,n)||c.disabled===!0;if(o=e.isFunction(c.visible)?c.visible.call(a,i,n):"undefined"==typeof c.visible||c.visible===!0,s[o?"show":"hide"](),s[r?"addClass":"removeClass"](n.classNames.disabled),e.isFunction(c.icon)&&(s.removeClass(c._icon),c._icon=c.icon.call(this,a,s,i,c),s.addClass(c._icon)),c.type)switch(s.find("input, select, textarea").prop("disabled",r),c.type){case"text":case"textarea":c.$input.val(c.value||"");break;case"checkbox":case"radio":c.$input.val(c.value||"").prop("checked",!!c.selected);break;case"select":c.$input.val(c.selected||"")}c.$menu&&h.update.call(a,c,n)})},layer:function(t,n){var a=t.$layer=e('
    ').css({height:i.height(),width:i.width(),display:"block"}).data("contextMenuRoot",t).insertBefore(this).on("contextmenu",f.abortevent).on("mousedown",f.layerClick);return void 0===document.body.style.maxWidth&&a.css({position:"absolute",height:e(document).height()}),a},processPromises:function(e,t,n){function a(e,t,n){void 0===n&&o(void 0),s(e,t,n)}function o(e,t,n){void 0===n?(n={error:{name:"No items and no error item",icon:"context-menu-icon context-menu-icon-quit"}},window.console&&(console.error||console.log).call(console,'When you reject a promise, provide an "items" object, equal to normal sub-menu items')):"string"==typeof n&&(n={error:{name:n}}),s(e,t,n)}function s(e,t,n){void 0!==t.$menu&&t.$menu.is(":visible")&&(e.$node.removeClass(t.classNames.iconLoadingClass),e.items=n,h.create(e,t,!0),h.update(e,t),t.positionSubmenu.call(e.$node,e.$menu))}e.$node.addClass(t.classNames.iconLoadingClass),n.then(a.bind(this,e,t),o.bind(this,e,t))}};e.fn.contextMenu=function(t){var n=this,a=t;if(this.length>0)if(void 0===t)this.first().trigger("contextmenu");else if(void 0!==t.x&&void 0!==t.y)this.first().trigger(e.Event("contextmenu",{pageX:t.x,pageY:t.y,mouseButton:t.button}));else if("hide"===t){var o=this.first().data("contextMenu")?this.first().data("contextMenu").$menu:null;o&&o.trigger("contextmenu:hide")}else"destroy"===t?e.contextMenu("destroy",{context:this}):e.isPlainObject(t)?(t.context=this,e.contextMenu("create",t)):t?this.removeClass("context-menu-disabled"):t||this.addClass("context-menu-disabled");else e.each(l,function(){this.selector===n.selector&&(a.data=this,e.extend(a.data,{trigger:"demand"}))}),f.contextmenu.call(a.target,a);return this},e.contextMenu=function(t,n){"string"!=typeof t&&(n=t,t="create"),"string"==typeof n?n={selector:n}:void 0===n&&(n={});var a=e.extend(!0,{},d,n||{}),o=e(document),i=o,u=!1;switch(a.context&&a.context.length?(i=e(a.context).first(),a.context=i.get(0),u=!e(a.context).is(document)):a.context=document,t){case"create":if(!a.selector)throw new Error("No selector specified");if(a.selector.match(/.context-menu-(list|item|input)($|\s)/))throw new Error('Cannot bind to selector "'+a.selector+'" as it contains a reserved className');if(!a.build&&(!a.items||e.isEmptyObject(a.items)))throw new Error("No Items specified");if(c++,a.ns=".contextMenu"+c,u||(r[a.selector]=a.ns),l[a.ns]=a,a.trigger||(a.trigger="right"),!s){var m="click"===a.itemClickEvent?"click.contextMenu":"mouseup.contextMenu",p={"contextmenu:focus.contextMenu":f.focusItem,"contextmenu:blur.contextMenu":f.blurItem,"contextmenu.contextMenu":f.abortevent,"mouseenter.contextMenu":f.itemMouseenter,"mouseleave.contextMenu":f.itemMouseleave};p[m]=f.itemClick,o.on({"contextmenu:hide.contextMenu":f.hideMenu,"prevcommand.contextMenu":f.prevItem,"nextcommand.contextMenu":f.nextItem,"contextmenu.contextMenu":f.abortevent,"mouseenter.contextMenu":f.menuMouseenter,"mouseleave.contextMenu":f.menuMouseleave},".context-menu-list").on("mouseup.contextMenu",".context-menu-input",f.inputClick).on(p,".context-menu-item"),s=!0}switch(i.on("contextmenu"+a.ns,a.selector,a,f.contextmenu),u&&i.on("remove"+a.ns,function(){e(this).contextMenu("destroy")}),a.trigger){case"hover":i.on("mouseenter"+a.ns,a.selector,a,f.mouseenter).on("mouseleave"+a.ns,a.selector,a,f.mouseleave);break;case"left":i.on("click"+a.ns,a.selector,a,f.click)}a.build||h.create(a);break;case"destroy":var x;if(u){var v=a.context;e.each(l,function(t,n){if(!n)return!0;if(!e(v).is(n.selector))return!0;x=e(".context-menu-list").filter(":visible"),x.length&&x.data().contextMenuRoot.$trigger.is(e(n.context).find(n.selector))&&x.trigger("contextmenu:hide",{force:!0});try{l[n.ns].$menu&&l[n.ns].$menu.remove(),delete l[n.ns]}catch(a){l[n.ns]=null}return e(n.context).off(n.ns),!0})}else if(a.selector){if(r[a.selector]){x=e(".context-menu-list").filter(":visible"),x.length&&x.data().contextMenuRoot.$trigger.is(a.selector)&&x.trigger("contextmenu:hide",{force:!0});try{l[r[a.selector]].$menu&&l[r[a.selector]].$menu.remove(),delete l[r[a.selector]]}catch(g){l[r[a.selector]]=null}o.off(r[a.selector])}}else o.off(".contextMenu .contextMenuAutoHide"),e.each(l,function(t,n){e(n.context).off(n.ns)}),r={},l={},c=0,s=!1,e("#context-menu-layer, .context-menu-list").remove();break;case"html5":(!e.support.htmlCommand&&!e.support.htmlMenuitem||"boolean"==typeof n&&n)&&e('menu[type="context"]').each(function(){this.id&&e.contextMenu({selector:"[contextmenu="+this.id+"]",items:e.contextMenu.fromMenu(this)})}).css("display","none");break;default:throw new Error('Unknown operation "'+t+'"')}return this},e.contextMenu.setInputValues=function(t,n){void 0===n&&(n={}),e.each(t.inputs,function(e,t){switch(t.type){case"text":case"textarea":t.value=n[e]||"";break;case"checkbox":t.selected=!!n[e];break;case"radio":t.selected=(n[t.radio]||"")===t.value;break;case"select":t.selected=n[e]||""}})},e.contextMenu.getInputValues=function(t,n){return void 0===n&&(n={}),e.each(t.inputs,function(e,t){switch(t.type){case"text":case"textarea":case"select":n[e]=t.$input.val();break;case"checkbox":n[e]=t.$input.prop("checked");break;case"radio":t.$input.prop("checked")&&(n[t.radio]=t.value)}}),n},e.contextMenu.fromMenu=function(t){var n=e(t),o={};return a(o,n.children()),o},e.contextMenu.defaults=d,e.contextMenu.types=u,e.contextMenu.handle=f,e.contextMenu.op=h,e.contextMenu.menus=l}); //# sourceMappingURL=jquery.contextMenu.min.js.map diff --git a/dist/jquery.contextMenu.min.js.map b/dist/jquery.contextMenu.min.js.map index d0aa684e..d3f131aa 100644 --- a/dist/jquery.contextMenu.min.js.map +++ b/dist/jquery.contextMenu.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["jquery.contextMenu.min.js"],"names":["factory","define","amd","exports","require","jQuery","$","splitAccesskey","val","k","t","split","keys","i","charAt","toUpperCase","push","inputLabel","node","id","name","menuChildren","items","$children","counter","each","label","item","$node","this","nodeName","toLowerCase","find","length","text","children","first","get","attr","disabled","callback","click","undefined","icon","type","selected","radio","value","options","html","clone","support","htmlMenuitem","window","htmlCommand","eventSelectstart","document","documentElement","ui","widget","cleanData","orig","elems","events","elem","_data","remove","triggerHandler","e","$currentTrigger","initialized","$win","namespaces","menus","types","defaults","selector","appendTo","trigger","autoHide","delay","reposition","classNames","hover","visible","notSelectable","iconEdit","iconCut","iconCopy","iconPaste","iconDelete","iconAdd","iconQuit","iconLoadingClass","determinePosition","$menu","position","css","my","at","of","offset","collision","top","outerHeight","left","outerWidth","opt","x","y","call","bottom","scrollTop","height","right","scrollLeft","width","positionSubmenu","zIndex","animation","duration","show","hide","noop","hoveract","timer","pageX","pageY","zindex","$t","zin","$tt","Math","max","parseInt","parent","indexOf","prop","handle","abortevent","preventDefault","stopImmediatePropagation","contextmenu","$this","data","originalEvent","mouseButton","hasClass","build","built","extend","isEmptyObject","console","error","log","Error","$trigger","op","create","showMenu","hasOwnProperty","isFunction","currentTarget","Event","mousedown","is","button","mouseup","removeData","mouseenter","$related","relatedTarget","$document","closest","on","mousemove","setTimeout","off","mouseleave","clearTimeout","layerClick","target","root","$window","triggerAction","elementFromPoint","$layer","has","one","contextMenu","keyStop","isInput","stopPropagation","key","targetZIndex","getZIndexOfTriggerTarget","style","offsetParent","parentElement","keyCode","shiftKey","$selected","blur","$parent","itemdata","String","fromCharCode","accesskeys","prevItem","$s","$prev","prev","last","$round","itemMouseleave","itemMouseenter","$input","focus","nextItem","$next","next","focusInput","contextMenuRoot","blurInput","menuMouseenter","hovering","menuMouseleave","itemClick","contextMenuKey","callbacks","Object","prototype","update","inputClick","hideMenu","force","focusItem","addClass","join","not","removeClass","filter","blurItem","additionalZValue","layer","pos","createNameNode","$name","_accesskey","_beforeAccesskey","append","createTextNode","_afterAccesskey","isHtmlName","accesskey","className","$label","ak","aks","matched","match","RegExp","commands","hasTypes","inputs","prependTo","then","processPromises","_icon","substring","body","resize","nested","domMenu","display","getBoundingClientRect","ceil","minWidth","maxWidth","addBack","$item","insertBefore","promise","completedPromise","errorPromise","finishPromiseProcess","errorItem","bind","fn","operation","$o","context","isPlainObject","o","$context","_hasContext","ns","itemClickEvent","contextMenuItemObj","contextmenu:focus.contextMenu","contextmenu:blur.contextMenu","contextmenu.contextMenu","mouseenter.contextMenu","mouseleave.contextMenu","contextmenu:hide.contextMenu","prevcommand.contextMenu","nextcommand.contextMenu","$visibleMenu","fromMenu","setInputValues","getInputValues","element"],"mappings":"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","file":"jquery.contextMenu.min.js","sourcesContent":["/*!\n * jQuery contextMenu v2.2.5-dev - Plugin for simple contextMenu handling\n *\n * Version: v2.2.5-dev\n *\n * Authors: Björn Brala (SWIS.nl), Rodney Rehm, Addy Osmani (patches for FF)\n * Web: http://swisnl.github.io/jQuery-contextMenu/\n *\n * Copyright (c) 2011-2016 SWIS BV and contributors\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n * GPL v3 http://opensource.org/licenses/GPL-3.0\n *\n * Date: 2016-10-25T14:21:57.013Z\n */\n\n(function (factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as anonymous module.\n define(['jquery'], factory);\n } else if (typeof exports === 'object') {\n // Node / CommonJS\n factory(require('jquery'));\n } else {\n // Browser globals.\n factory(jQuery);\n }\n})(function ($) {\n\n 'use strict';\n\n // TODO: -\n // ARIA stuff: menuitem, menuitemcheckbox und menuitemradio\n // create structure if $.support[htmlCommand || htmlMenuitem] and !opt.disableNative\n\n // determine html5 compatibility\n $.support.htmlMenuitem = ('HTMLMenuItemElement' in window);\n $.support.htmlCommand = ('HTMLCommandElement' in window);\n $.support.eventSelectstart = ('onselectstart' in document.documentElement);\n /* // should the need arise, test for css user-select\n $.support.cssUserSelect = (function(){\n var t = false,\n e = document.createElement('div');\n\n $.each('Moz|Webkit|Khtml|O|ms|Icab|'.split('|'), function(i, prefix) {\n var propCC = prefix + (prefix ? 'U' : 'u') + 'serSelect',\n prop = (prefix ? ('-' + prefix.toLowerCase() + '-') : '') + 'user-select';\n\n e.style.cssText = prop + ': text;';\n if (e.style[propCC] == 'text') {\n t = true;\n return false;\n }\n\n return true;\n });\n\n return t;\n })();\n */\n\n /* jshint ignore:start */\n if (!$.ui || !$.widget) {\n // duck punch $.cleanData like jQueryUI does to get that remove event\n $.cleanData = (function (orig) {\n return function (elems) {\n var events, elem, i;\n for (i = 0; elems[i] != null; i++) {\n elem = elems[i];\n try {\n // Only trigger remove when necessary to save time\n events = $._data(elem, 'events');\n if (events && events.remove) {\n $(elem).triggerHandler('remove');\n }\n\n // Http://bugs.jquery.com/ticket/8235\n } catch (e) {}\n }\n orig(elems);\n };\n })($.cleanData);\n }\n /* jshint ignore:end */\n\n var // currently active contextMenu trigger\n $currentTrigger = null,\n // is contextMenu initialized with at least one menu?\n initialized = false,\n // window handle\n $win = $(window),\n // number of registered menus\n counter = 0,\n // mapping selector to namespace\n namespaces = {},\n // mapping namespace to options\n menus = {},\n // custom command type handlers\n types = {},\n // default values\n defaults = {\n // selector of contextMenu trigger\n selector: null,\n // where to append the menu to\n appendTo: null,\n // method to trigger context menu [\"right\", \"left\", \"hover\"]\n trigger: 'right',\n // hide menu when mouse leaves trigger / menu elements\n autoHide: false,\n // ms to wait before showing a hover-triggered context menu\n delay: 200,\n // flag denoting if a second trigger should simply move (true) or rebuild (false) an open menu\n // as long as the trigger happened on one of the trigger-element's child nodes\n reposition: true,\n\n // Default classname configuration to be able avoid conflicts in frameworks\n classNames : {\n hover: 'context-menu-hover', // Item hover\n disabled: 'context-menu-disabled', // Item disabled\n visible: 'context-menu-visible', // Item visible\n notSelectable: 'context-menu-not-selectable', // Item not selectable\n\n icon: 'context-menu-icon',\n iconEdit: 'context-menu-icon-edit',\n iconCut: 'context-menu-icon-cut',\n iconCopy: 'context-menu-icon-copy',\n iconPaste: 'context-menu-icon-paste',\n iconDelete: 'context-menu-icon-delete',\n iconAdd: 'context-menu-icon-add',\n iconQuit: 'context-menu-icon-quit',\n iconLoadingClass: 'context-menu-icon-loading'\n },\n\n // determine position to show menu at\n determinePosition: function ($menu) {\n // position to the lower middle of the trigger element\n if ($.ui && $.ui.position) {\n // .position() is provided as a jQuery UI utility\n // (...and it won't work on hidden elements)\n $menu.css('display', 'block').position({\n my: 'center top',\n at: 'center bottom',\n of: this,\n offset: '0 5',\n collision: 'fit'\n }).css('display', 'none');\n } else {\n // determine contextMenu position\n var offset = this.offset();\n offset.top += this.outerHeight();\n offset.left += this.outerWidth() / 2 - $menu.outerWidth() / 2;\n $menu.css(offset);\n }\n },\n // position menu\n position: function (opt, x, y) {\n var offset;\n // determine contextMenu position\n if (!x && !y) {\n opt.determinePosition.call(this, opt.$menu);\n return;\n } else if (x === 'maintain' && y === 'maintain') {\n // x and y must not be changed (after re-show on command click)\n offset = opt.$menu.position();\n } else {\n // x and y are given (by mouse event)\n offset = {top: y, left: x};\n }\n\n // correct offset if viewport demands it\n var bottom = $win.scrollTop() + $win.height(),\n right = $win.scrollLeft() + $win.width(),\n height = opt.$menu.outerHeight(),\n width = opt.$menu.outerWidth();\n\n if (offset.top + height > bottom) {\n offset.top -= height;\n }\n\n if (offset.top < 0) {\n offset.top = 0;\n }\n\n if (offset.left + width > right) {\n offset.left -= width;\n }\n\n if (offset.left < 0) {\n offset.left = 0;\n }\n\n opt.$menu.css(offset);\n },\n // position the sub-menu\n positionSubmenu: function ($menu) {\n if ($menu === undefined) {\n // When user hovers over item (which has sub items) handle.focusItem will call this.\n // but the submenu does not exist yet if opt.items is a promise. just return, will\n // call positionSubmenu after promise is completed.\n return;\n }\n if ($.ui && $.ui.position) {\n // .position() is provided as a jQuery UI utility\n // (...and it won't work on hidden elements)\n $menu.css('display', 'block').position({\n my: 'left top',\n at: 'right top',\n of: this,\n collision: 'flipfit fit'\n }).css('display', '');\n } else {\n // determine contextMenu position\n var offset = {\n top: 0,\n left: this.outerWidth()\n };\n $menu.css(offset);\n }\n },\n // offset to add to zIndex\n zIndex: 1,\n // show hide animation settings\n animation: {\n duration: 50,\n show: 'slideDown',\n hide: 'slideUp'\n },\n // events\n events: {\n show: $.noop,\n hide: $.noop\n },\n // default callback\n callback: null,\n // list of contextMenu items\n items: {}\n },\n // mouse position for hover activation\n hoveract = {\n timer: null,\n pageX: null,\n pageY: null\n },\n // determine zIndex\n zindex = function ($t) {\n var zin = 0,\n $tt = $t;\n\n while (true) {\n zin = Math.max(zin, parseInt($tt.css('z-index'), 10) || 0);\n $tt = $tt.parent();\n if (!$tt || !$tt.length || 'html body'.indexOf($tt.prop('nodeName').toLowerCase()) > -1) {\n break;\n }\n }\n return zin;\n },\n // event handlers\n handle = {\n // abort anything\n abortevent: function (e) {\n e.preventDefault();\n e.stopImmediatePropagation();\n },\n // contextmenu show dispatcher\n contextmenu: function (e) {\n var $this = $(this);\n\n // disable actual context-menu if we are using the right mouse button as the trigger\n if (e.data.trigger === 'right') {\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n // abort native-triggered events unless we're triggering on right click\n if ((e.data.trigger !== 'right' && e.data.trigger !== 'demand') && e.originalEvent) {\n return;\n }\n\n // Let the current contextmenu decide if it should show or not based on its own trigger settings\n if (e.mouseButton !== undefined && e.data) {\n if (!(e.data.trigger === 'left' && e.mouseButton === 0) && !(e.data.trigger === 'right' && e.mouseButton === 2)) {\n // Mouse click is not valid.\n return;\n }\n }\n\n // abort event if menu is visible for this trigger\n if ($this.hasClass('context-menu-active')) {\n return;\n }\n\n if (!$this.hasClass('context-menu-disabled')) {\n // theoretically need to fire a show event at \n // http://www.whatwg.org/specs/web-apps/current-work/multipage/interactive-elements.html#context-menus\n // var evt = jQuery.Event(\"show\", { data: data, pageX: e.pageX, pageY: e.pageY, relatedTarget: this });\n // e.data.$menu.trigger(evt);\n\n $currentTrigger = $this;\n if (e.data.build) {\n var built = e.data.build($currentTrigger, e);\n // abort if build() returned false\n if (built === false) {\n return;\n }\n\n // dynamically build menu on invocation\n e.data = $.extend(true, {}, defaults, e.data, built || {});\n\n // abort if there are no items to display\n if (!e.data.items || $.isEmptyObject(e.data.items)) {\n // Note: jQuery captures and ignores errors from event handlers\n if (window.console) {\n (console.error || console.log).call(console, 'No items specified to show in contextMenu');\n }\n\n throw new Error('No Items specified');\n }\n\n // backreference for custom command type creation\n e.data.$trigger = $currentTrigger;\n\n op.create(e.data);\n }\n var showMenu = false;\n for (var item in e.data.items) {\n if (e.data.items.hasOwnProperty(item)) {\n var visible;\n if ($.isFunction(e.data.items[item].visible)) {\n visible = e.data.items[item].visible.call($(e.currentTarget), item, e.data);\n } else if (typeof item.visible !== 'undefined') {\n visible = e.data.items[item].visible === true;\n } else {\n visible = true;\n }\n if (visible) {\n showMenu = true;\n }\n }\n }\n if (showMenu) {\n // show menu\n op.show.call($this, e.data, e.pageX, e.pageY);\n }\n }\n },\n // contextMenu left-click trigger\n click: function (e) {\n e.preventDefault();\n e.stopImmediatePropagation();\n $(this).trigger($.Event('contextmenu', {data: e.data, pageX: e.pageX, pageY: e.pageY}));\n },\n // contextMenu right-click trigger\n mousedown: function (e) {\n // register mouse down\n var $this = $(this);\n\n // hide any previous menus\n if ($currentTrigger && $currentTrigger.length && !$currentTrigger.is($this)) {\n $currentTrigger.data('contextMenu').$menu.trigger('contextmenu:hide');\n }\n\n // activate on right click\n if (e.button === 2) {\n $currentTrigger = $this.data('contextMenuActive', true);\n }\n },\n // contextMenu right-click trigger\n mouseup: function (e) {\n // show menu\n var $this = $(this);\n if ($this.data('contextMenuActive') && $currentTrigger && $currentTrigger.length && $currentTrigger.is($this) && !$this.hasClass('context-menu-disabled')) {\n e.preventDefault();\n e.stopImmediatePropagation();\n $currentTrigger = $this;\n $this.trigger($.Event('contextmenu', {data: e.data, pageX: e.pageX, pageY: e.pageY}));\n }\n\n $this.removeData('contextMenuActive');\n },\n // contextMenu hover trigger\n mouseenter: function (e) {\n var $this = $(this),\n $related = $(e.relatedTarget),\n $document = $(document);\n\n // abort if we're coming from a menu\n if ($related.is('.context-menu-list') || $related.closest('.context-menu-list').length) {\n return;\n }\n\n // abort if a menu is shown\n if ($currentTrigger && $currentTrigger.length) {\n return;\n }\n\n hoveract.pageX = e.pageX;\n hoveract.pageY = e.pageY;\n hoveract.data = e.data;\n $document.on('mousemove.contextMenuShow', handle.mousemove);\n hoveract.timer = setTimeout(function () {\n hoveract.timer = null;\n $document.off('mousemove.contextMenuShow');\n $currentTrigger = $this;\n $this.trigger($.Event('contextmenu', {\n data: hoveract.data,\n pageX: hoveract.pageX,\n pageY: hoveract.pageY\n }));\n }, e.data.delay);\n },\n // contextMenu hover trigger\n mousemove: function (e) {\n hoveract.pageX = e.pageX;\n hoveract.pageY = e.pageY;\n },\n // contextMenu hover trigger\n mouseleave: function (e) {\n // abort if we're leaving for a menu\n var $related = $(e.relatedTarget);\n if ($related.is('.context-menu-list') || $related.closest('.context-menu-list').length) {\n return;\n }\n\n try {\n clearTimeout(hoveract.timer);\n } catch (e) {\n }\n\n hoveract.timer = null;\n },\n // click on layer to hide contextMenu\n layerClick: function (e) {\n var $this = $(this),\n root = $this.data('contextMenuRoot'),\n button = e.button,\n x = e.pageX,\n y = e.pageY,\n target,\n offset;\n\n e.preventDefault();\n e.stopImmediatePropagation();\n\n setTimeout(function () {\n var $window;\n var triggerAction = ((root.trigger === 'left' && button === 0) || (root.trigger === 'right' && button === 2));\n\n // find the element that would've been clicked, wasn't the layer in the way\n if (document.elementFromPoint && root.$layer) {\n root.$layer.hide();\n target = document.elementFromPoint(x - $win.scrollLeft(), y - $win.scrollTop());\n root.$layer.show();\n }\n\n if (root.reposition && triggerAction) {\n if (document.elementFromPoint) {\n if (root.$trigger.is(target) || root.$trigger.has(target).length) {\n root.position.call(root.$trigger, root, x, y);\n return;\n }\n } else {\n offset = root.$trigger.offset();\n $window = $(window);\n // while this looks kinda awful, it's the best way to avoid\n // unnecessarily calculating any positions\n offset.top += $window.scrollTop();\n if (offset.top <= e.pageY) {\n offset.left += $window.scrollLeft();\n if (offset.left <= e.pageX) {\n offset.bottom = offset.top + root.$trigger.outerHeight();\n if (offset.bottom >= e.pageY) {\n offset.right = offset.left + root.$trigger.outerWidth();\n if (offset.right >= e.pageX) {\n // reposition\n root.position.call(root.$trigger, root, x, y);\n return;\n }\n }\n }\n }\n }\n }\n\n if (target && triggerAction) {\n root.$trigger.one('contextmenu:hidden', function () {\n $(target).contextMenu({ x: x, y: y, button: button });\n });\n }\n\n if (root != null && root.$menu != null) {\n root.$menu.trigger('contextmenu:hide');\n }\n }, 50);\n },\n // key handled :hover\n keyStop: function (e, opt) {\n if (!opt.isInput) {\n e.preventDefault();\n }\n\n e.stopPropagation();\n },\n key: function (e) {\n\n var opt = {};\n\n // Only get the data from $currentTrigger if it exists\n if ($currentTrigger) {\n opt = $currentTrigger.data('contextMenu') || {};\n }\n // If the trigger happen on a element that are above the contextmenu do this\n if (opt.zIndex === undefined) {\n opt.zIndex = 0;\n\t\t\t\t}\n var targetZIndex = 0;\n var getZIndexOfTriggerTarget = function (target) {\n\t\t\t\t\tif (target.style.zIndex !== '') {\n\t\t\t\t\t\ttargetZIndex = target.style.zIndex;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (target.offsetParent !== null && target.offsetParent !== undefined) {\n\t\t\t\t\t\t\tgetZIndexOfTriggerTarget(target.offsetParent);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (target.parentElement !== null && target.parentElement !== undefined) {\n\t\t\t\t\t\t\tgetZIndexOfTriggerTarget(target.parentElement);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n };\n getZIndexOfTriggerTarget(e.target);\n // If targetZIndex is heigher then opt.zIndex dont progress any futher.\n // This is used to make sure that if you are using a dialog with a input / textarea / contenteditable div\n // and its above the contextmenu it wont steal keys events\n if (targetZIndex > opt.zIndex) {\n return;\n\t\t\t\t}\n switch (e.keyCode) {\n case 9:\n case 38: // up\n handle.keyStop(e, opt);\n // if keyCode is [38 (up)] or [9 (tab) with shift]\n if (opt.isInput) {\n if (e.keyCode === 9 && e.shiftKey) {\n e.preventDefault();\n if(opt.$selected) {\n opt.$selected.find('input, textarea, select').blur();\n }\n if (opt.$menu != null) opt.$menu.trigger('prevcommand');\n return;\n } else if (e.keyCode === 38 && opt.$selected.find('input, textarea, select').prop('type') === 'checkbox') {\n // checkboxes don't capture this key\n e.preventDefault();\n return;\n }\n } else if (e.keyCode !== 9 || e.shiftKey) {\n if (opt.$menu != null) opt.$menu.trigger('prevcommand');\n return;\n }\n break;\n // omitting break;\n // case 9: // tab - reached through omitted break;\n case 40: // down\n handle.keyStop(e, opt);\n if (opt.isInput) {\n if (e.keyCode === 9) {\n e.preventDefault();\n if(opt.$selected) {\n opt.$selected.find('input, textarea, select').blur();\n }\n if (opt.$menu != null) opt.$menu.trigger('nextcommand');\n return;\n } else if (e.keyCode === 40 && opt.$selected.find('input, textarea, select').prop('type') === 'checkbox') {\n // checkboxes don't capture this key\n e.preventDefault();\n return;\n }\n } else {\n if (opt.$menu != null) opt.$menu.trigger('nextcommand');\n return;\n }\n break;\n\n case 37: // left\n handle.keyStop(e, opt);\n if (opt.isInput || !opt.$selected || !opt.$selected.length) {\n break;\n }\n\n if (!opt.$selected.parent().hasClass('context-menu-root')) {\n var $parent = opt.$selected.parent().parent();\n opt.$selected.trigger('contextmenu:blur');\n opt.$selected = $parent;\n return;\n }\n break;\n\n case 39: // right\n handle.keyStop(e, opt);\n if (opt.isInput || !opt.$selected || !opt.$selected.length) {\n break;\n }\n\n var itemdata = opt.$selected.data('contextMenu') || {};\n if (itemdata.$menu && opt.$selected.hasClass('context-menu-submenu')) {\n opt.$selected = null;\n itemdata.$selected = null;\n itemdata.$menu.trigger('nextcommand');\n return;\n }\n break;\n\n case 35: // end\n case 36: // home\n if (opt.$selected && opt.$selected.find('input, textarea, select').length) {\n return;\n } else {\n (opt.$selected && opt.$selected.parent() || opt.$menu)\n .children(':not(.' + opt.classNames.disabled + ', .' + opt.classNames.notSelectable + ')')[e.keyCode === 36 ? 'first' : 'last']()\n .trigger('contextmenu:focus');\n e.preventDefault();\n return;\n }\n break;\n\n case 13: // enter\n handle.keyStop(e, opt);\n if (opt.isInput) {\n if (opt.$selected && !opt.$selected.is('textarea, select')) {\n e.preventDefault();\n return;\n }\n break;\n }\n if (typeof opt.$selected !== 'undefined' && opt.$selected !== null) {\n opt.$selected.trigger('mouseup');\n }\n return;\n\n case 32: // space\n case 33: // page up\n case 34: // page down\n // prevent browser from scrolling down while menu is visible\n handle.keyStop(e, opt);\n return;\n\n case 27: // esc\n handle.keyStop(e, opt);\n if (opt.$menu != null) opt.$menu.trigger('contextmenu:hide');\n return;\n\n default: // 0-9, a-z\n var k = (String.fromCharCode(e.keyCode)).toUpperCase();\n if (opt.accesskeys && opt.accesskeys[k]) {\n // according to the specs accesskeys must be invoked immediately\n opt.accesskeys[k].$node.trigger(opt.accesskeys[k].$menu ? 'contextmenu:focus' : 'mouseup');\n return;\n }\n break;\n }\n // pass event to selected item,\n // stop propagation to avoid endless recursion\n e.stopPropagation();\n if (typeof opt.$selected !== 'undefined' && opt.$selected !== null) {\n opt.$selected.trigger(e);\n }\n },\n // select previous possible command in menu\n prevItem: function (e) {\n e.stopPropagation();\n var opt = $(this).data('contextMenu') || {};\n var root = $(this).data('contextMenuRoot') || {};\n\n // obtain currently selected menu\n if (opt.$selected) {\n var $s = opt.$selected;\n opt = opt.$selected.parent().data('contextMenu') || {};\n opt.$selected = $s;\n }\n\n var $children = opt.$menu.children(),\n $prev = !opt.$selected || !opt.$selected.prev().length ? $children.last() : opt.$selected.prev(),\n $round = $prev;\n\n // skip disabled or hidden elements\n while ($prev.hasClass(root.classNames.disabled) || $prev.hasClass(root.classNames.notSelectable) || $prev.is(':hidden')) {\n if ($prev.prev().length) {\n $prev = $prev.prev();\n } else {\n $prev = $children.last();\n }\n if ($prev.is($round)) {\n // break endless loop\n return;\n }\n }\n\n // leave current\n if (opt.$selected) {\n handle.itemMouseleave.call(opt.$selected.get(0), e);\n }\n\n // activate next\n handle.itemMouseenter.call($prev.get(0), e);\n\n // focus input\n var $input = $prev.find('input, textarea, select');\n if ($input.length) {\n $input.focus();\n }\n },\n // select next possible command in menu\n nextItem: function (e) {\n e.stopPropagation();\n var opt = $(this).data('contextMenu') || {};\n var root = $(this).data('contextMenuRoot') || {};\n\n // obtain currently selected menu\n if (opt.$selected) {\n var $s = opt.$selected;\n opt = opt.$selected.parent().data('contextMenu') || {};\n opt.$selected = $s;\n }\n\n var $children = opt.$menu.children(),\n $next = !opt.$selected || !opt.$selected.next().length ? $children.first() : opt.$selected.next(),\n $round = $next;\n\n // skip disabled\n while ($next.hasClass(root.classNames.disabled) || $next.hasClass(root.classNames.notSelectable) || $next.is(':hidden')) {\n if ($next.next().length) {\n $next = $next.next();\n } else {\n $next = $children.first();\n }\n if ($next.is($round)) {\n // break endless loop\n return;\n }\n }\n\n // leave current\n if (opt.$selected) {\n handle.itemMouseleave.call(opt.$selected.get(0), e);\n }\n\n // activate next\n handle.itemMouseenter.call($next.get(0), e);\n\n // focus input\n var $input = $next.find('input, textarea, select');\n if ($input.length) {\n $input.focus();\n }\n },\n // flag that we're inside an input so the key handler can act accordingly\n focusInput: function () {\n var $this = $(this).closest('.context-menu-item'),\n data = $this.data(),\n opt = data.contextMenu,\n root = data.contextMenuRoot;\n\n root.$selected = opt.$selected = $this;\n root.isInput = opt.isInput = true;\n },\n // flag that we're inside an input so the key handler can act accordingly\n blurInput: function () {\n var $this = $(this).closest('.context-menu-item'),\n data = $this.data(),\n opt = data.contextMenu,\n root = data.contextMenuRoot;\n\n root.isInput = opt.isInput = false;\n },\n // :hover on menu\n menuMouseenter: function () {\n var root = $(this).data().contextMenuRoot;\n root.hovering = true;\n },\n // :hover on menu\n menuMouseleave: function (e) {\n var root = $(this).data().contextMenuRoot;\n if (root.$layer && root.$layer.is(e.relatedTarget)) {\n root.hovering = false;\n }\n },\n // :hover done manually so key handling is possible\n itemMouseenter: function (e) {\n var $this = $(this),\n data = $this.data(),\n opt = data.contextMenu,\n root = data.contextMenuRoot;\n\n root.hovering = true;\n\n // abort if we're re-entering\n if (e && root.$layer && root.$layer.is(e.relatedTarget)) {\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n // make sure only one item is selected\n (opt.$menu ? opt : root).$menu\n .children('.' + root.classNames.hover).trigger('contextmenu:blur')\n .children('.hover').trigger('contextmenu:blur');\n\n if ($this.hasClass(root.classNames.disabled) || $this.hasClass(root.classNames.notSelectable)) {\n opt.$selected = null;\n return;\n }\n\n $this.trigger('contextmenu:focus');\n },\n // :hover done manually so key handling is possible\n itemMouseleave: function (e) {\n var $this = $(this),\n data = $this.data(),\n opt = data.contextMenu,\n root = data.contextMenuRoot;\n\n if (root !== opt && root.$layer && root.$layer.is(e.relatedTarget)) {\n if (typeof root.$selected !== 'undefined' && root.$selected !== null) {\n root.$selected.trigger('contextmenu:blur');\n }\n e.preventDefault();\n e.stopImmediatePropagation();\n root.$selected = opt.$selected = opt.$node;\n return;\n }\n\n $this.trigger('contextmenu:blur');\n },\n // contextMenu item click\n itemClick: function (e) {\n var $this = $(this),\n data = $this.data(),\n opt = data.contextMenu,\n root = data.contextMenuRoot,\n key = data.contextMenuKey,\n callback;\n\n // abort if the key is unknown or disabled or is a menu\n if (!opt.items[key] || $this.is('.' + root.classNames.disabled + ', .context-menu-submenu, .context-menu-separator, .' + root.classNames.notSelectable)) {\n return;\n }\n\n e.preventDefault();\n e.stopImmediatePropagation();\n\n if ($.isFunction(opt.callbacks[key]) && Object.prototype.hasOwnProperty.call(opt.callbacks, key)) {\n // item-specific callback\n callback = opt.callbacks[key];\n } else if ($.isFunction(root.callback)) {\n // default callback\n callback = root.callback;\n } else {\n // no callback, no action\n return;\n }\n\n // hide menu if callback doesn't stop that\n if (callback.call(root.$trigger, key, root) !== false) {\n root.$menu.trigger('contextmenu:hide');\n } else if (root.$menu.parent().length) {\n op.update.call(root.$trigger, root);\n }\n },\n // ignore click events on input elements\n inputClick: function (e) {\n e.stopImmediatePropagation();\n },\n // hide \n hideMenu: function (e, data) {\n var root = $(this).data('contextMenuRoot');\n op.hide.call(root.$trigger, root, data && data.force);\n },\n // focus \n focusItem: function (e) {\n e.stopPropagation();\n var $this = $(this),\n data = $this.data(),\n opt = data.contextMenu,\n root = data.contextMenuRoot;\n\n if ($this.hasClass(root.classNames.disabled) || $this.hasClass(root.classNames.notSelectable)) {\n return;\n }\n\n $this\n .addClass([root.classNames.hover, root.classNames.visible].join(' '))\n // select other items and included items\n .parent().find('.context-menu-item').not($this)\n .removeClass(root.classNames.visible)\n .filter('.' + root.classNames.hover)\n .trigger('contextmenu:blur');\n\n // remember selected\n opt.$selected = root.$selected = $this;\n\n // position sub-menu - do after show so dumb $.ui.position can keep up\n if (opt.$node) {\n root.positionSubmenu.call(opt.$node, opt.$menu);\n }\n },\n // blur \n blurItem: function (e) {\n e.stopPropagation();\n var $this = $(this),\n data = $this.data(),\n opt = data.contextMenu,\n root = data.contextMenuRoot;\n\n if (opt.autoHide) { // for tablets and touch screens this needs to remain\n $this.removeClass(root.classNames.visible);\n }\n $this.removeClass(root.classNames.hover);\n opt.$selected = null;\n }\n },\n // operations\n op = {\n show: function (opt, x, y) {\n var $trigger = $(this),\n css = {};\n\n // hide any open menus\n $('#context-menu-layer').trigger('mousedown');\n\n // backreference for callbacks\n opt.$trigger = $trigger;\n\n // show event\n if (opt.events.show.call($trigger, opt) === false) {\n $currentTrigger = null;\n return;\n }\n\n // create or update context menu\n op.update.call($trigger, opt);\n\n // position menu\n opt.position.call($trigger, opt, x, y);\n\n // make sure we're in front\n if (opt.zIndex) {\n var additionalZValue = opt.zIndex;\n // If opt.zIndex is a function, call the function to get the right zIndex.\n if (typeof opt.zIndex === 'function') {\n additionalZValue = opt.zIndex.call($trigger, opt);\n }\n css.zIndex = zindex($trigger) + additionalZValue;\n }\n\n // add layer\n op.layer.call(opt.$menu, opt, css.zIndex);\n\n // adjust sub-menu zIndexes\n opt.$menu.find('ul').css('zIndex', css.zIndex + 1);\n\n // position and show context menu\n opt.$menu.css(css)[opt.animation.show](opt.animation.duration, function () {\n $trigger.trigger('contextmenu:visible');\n });\n // make options available and set state\n $trigger\n .data('contextMenu', opt)\n .addClass('context-menu-active');\n\n // register key handler\n $(document).off('keydown.contextMenu').on('keydown.contextMenu', handle.key);\n // register autoHide handler\n if (opt.autoHide) {\n // mouse position handler\n $(document).on('mousemove.contextMenuAutoHide', function (e) {\n // need to capture the offset on mousemove,\n // since the page might've been scrolled since activation\n var pos = $trigger.offset();\n pos.right = pos.left + $trigger.outerWidth();\n pos.bottom = pos.top + $trigger.outerHeight();\n\n if (opt.$layer && !opt.hovering && (!(e.pageX >= pos.left && e.pageX <= pos.right) || !(e.pageY >= pos.top && e.pageY <= pos.bottom))) {\n /* Additional hover check after short time, you might just miss the edge of the menu */\n setTimeout(function () {\n if (!opt.hovering && opt.$menu != null) { opt.$menu.trigger('contextmenu:hide'); }\n }, 50);\n }\n });\n }\n },\n hide: function (opt, force) {\n var $trigger = $(this);\n if (!opt) {\n opt = $trigger.data('contextMenu') || {};\n }\n\n // hide event\n if (!force && opt.events && opt.events.hide.call($trigger, opt) === false) {\n return;\n }\n\n // remove options and revert state\n $trigger\n .removeData('contextMenu')\n .removeClass('context-menu-active');\n\n if (opt.$layer) {\n // keep layer for a bit so the contextmenu event can be aborted properly by opera\n setTimeout((function ($layer) {\n return function () {\n $layer.remove();\n };\n })(opt.$layer), 10);\n\n try {\n delete opt.$layer;\n } catch (e) {\n opt.$layer = null;\n }\n }\n\n // remove handle\n $currentTrigger = null;\n // remove selected\n opt.$menu.find('.' + opt.classNames.hover).trigger('contextmenu:blur');\n opt.$selected = null;\n // collapse all submenus\n opt.$menu.find('.' + opt.classNames.visible).removeClass(opt.classNames.visible);\n // unregister key and mouse handlers\n // $(document).off('.contextMenuAutoHide keydown.contextMenu'); // http://bugs.jquery.com/ticket/10705\n $(document).off('.contextMenuAutoHide').off('keydown.contextMenu');\n // hide menu\n if(opt.$menu){\n opt.$menu[opt.animation.hide](opt.animation.duration, function () {\n // tear down dynamically built menu after animation is completed.\n if (opt.build) {\n opt.$menu.remove();\n $.each(opt, function (key) {\n switch (key) {\n case 'ns':\n case 'selector':\n case 'build':\n case 'trigger':\n return true;\n\n default:\n opt[key] = undefined;\n try {\n delete opt[key];\n } catch (e) {\n }\n return true;\n }\n });\n }\n\n setTimeout(function () {\n $trigger.trigger('contextmenu:hidden');\n }, 10);\n });\n }\n },\n create: function (opt, root) {\n if (root === undefined) {\n root = opt;\n }\n // create contextMenu\n opt.$menu = $('
      ').addClass(opt.className || '').data({\n 'contextMenu': opt,\n 'contextMenuRoot': root\n });\n\n $.each(['callbacks', 'commands', 'inputs'], function (i, k) {\n opt[k] = {};\n if (!root[k]) {\n root[k] = {};\n }\n });\n\n if(!root.accesskeys){\n root.accesskeys = {};\n }\n\n function createNameNode(item) {\n var $name = $('');\n if (item._accesskey) {\n if (item._beforeAccesskey) {\n $name.append(document.createTextNode(item._beforeAccesskey));\n }\n $('')\n .addClass('context-menu-accesskey')\n .text(item._accesskey)\n .appendTo($name);\n if (item._afterAccesskey) {\n $name.append(document.createTextNode(item._afterAccesskey));\n }\n } else {\n if (item.isHtmlName) {\n // restrict use with access keys\n if (typeof item.accesskey !== 'undefined') {\n throw new Error('accesskeys are not compatible with HTML names and cannot be used together in the same item');\n }\n $name.html(item.name);\n } else {\n $name.text(item.name);\n }\n }\n return $name;\n }\n\n // create contextMenu items\n $.each(opt.items, function (key, item) {\n var $t = $('
    • ').addClass(item.className || ''),\n $label = null,\n $input = null;\n\n // iOS needs to see a click-event bound to an element to actually\n // have the TouchEvents infrastructure trigger the click event\n $t.on('click', $.noop);\n\n // Make old school string seperator a real item so checks wont be\n // akward later.\n // And normalize 'cm_separator' into 'cm_seperator'.\n if (typeof item === 'string' || item.type === 'cm_separator') {\n item = { type : 'cm_seperator' };\n }\n\n item.$node = $t.data({\n 'contextMenu': opt,\n 'contextMenuRoot': root,\n 'contextMenuKey': key\n });\n\n // register accesskey\n // NOTE: the accesskey attribute should be applicable to any element, but Safari5 and Chrome13 still can't do that\n if (typeof item.accesskey !== 'undefined') {\n var aks = splitAccesskey(item.accesskey);\n for (var i = 0, ak; ak = aks[i]; i++) {\n if (!root.accesskeys[ak]) {\n root.accesskeys[ak] = item;\n var matched = item.name.match(new RegExp('^(.*?)(' + ak + ')(.*)$', 'i'));\n if (matched) {\n item._beforeAccesskey = matched[1];\n item._accesskey = matched[2];\n item._afterAccesskey = matched[3];\n }\n break;\n }\n }\n }\n\n if (item.type && types[item.type]) {\n // run custom type handler\n types[item.type].call($t, item, opt, root);\n // register commands\n $.each([opt, root], function (i, k) {\n k.commands[key] = item;\n // Overwrite only if undefined or the item is appended to the root. This so it\n // doesn't overwrite callbacks of root elements if the name is the same.\n if ($.isFunction(item.callback) && (k.callbacks[key] === undefined || opt.type === undefined)) {\n k.callbacks[key] = item.callback;\n }\n });\n } else {\n // add label for input\n if (item.type === 'cm_seperator') {\n $t.addClass('context-menu-separator ' + root.classNames.notSelectable);\n } else if (item.type === 'html') {\n $t.addClass('context-menu-html ' + root.classNames.notSelectable);\n } else if (item.type === 'sub') {\n // We don't want to execute the next else-if if it is a sub.\n } else if (item.type) {\n $label = $('').appendTo($t);\n createNameNode(item).appendTo($label);\n\n $t.addClass('context-menu-input');\n opt.hasTypes = true;\n $.each([opt, root], function (i, k) {\n k.commands[key] = item;\n k.inputs[key] = item;\n });\n } else if (item.items) {\n item.type = 'sub';\n }\n\n switch (item.type) {\n case 'cm_seperator':\n break;\n\n case 'text':\n $input = $('')\n .attr('name', 'context-menu-input-' + key)\n .val(item.value || '')\n .appendTo($label);\n break;\n\n case 'textarea':\n $input = $('')\n .attr('name', 'context-menu-input-' + key)\n .val(item.value || '')\n .appendTo($label);\n\n if (item.height) {\n $input.height(item.height);\n }\n break;\n\n case 'checkbox':\n $input = $('')\n .attr('name', 'context-menu-input-' + key)\n .val(item.value || '')\n .prop('checked', !!item.selected)\n .prependTo($label);\n break;\n\n case 'radio':\n $input = $('')\n .attr('name', 'context-menu-input-' + item.radio)\n .val(item.value || '')\n .prop('checked', !!item.selected)\n .prependTo($label);\n break;\n\n case 'select':\n $input = $('')\n .attr('name', 'context-menu-input-' + key)\n .appendTo($label);\n if (item.options) {\n $.each(item.options, function (value, text) {\n $('').val(value).text(text).appendTo($input);\n });\n $input.val(item.selected);\n }\n break;\n\n case 'sub':\n createNameNode(item).appendTo($t);\n item.appendTo = item.$node;\n $t.data('contextMenu', item).addClass('context-menu-submenu');\n item.callback = null;\n\n // If item contains items, and this is a promise, we should create it later\n // check if subitems is of type promise. If it is a promise we need to create\n // it later, after promise has been resolved.\n if ('function' === typeof item.items.then) {\n // probably a promise, process it, when completed it will create the sub menu's.\n op.processPromises(item, root, item.items);\n } else {\n // normal submenu.\n op.create(item, root);\n }\n break;\n\n case 'html':\n $(item.html).appendTo($t);\n break;\n\n default:\n $.each([opt, root], function (i, k) {\n k.commands[key] = item;\n // Overwrite only if undefined or the item is appended to the root. This so it\n // doesn't overwrite callbacks of root elements if the name is the same.\n if ($.isFunction(item.callback) && (k.callbacks[key] === undefined || opt.type === undefined)) {\n k.callbacks[key] = item.callback;\n }\n });\n createNameNode(item).appendTo($t);\n break;\n }\n\n // disable key listener in \n if (item.type && item.type !== 'sub' && item.type !== 'html' && item.type !== 'cm_seperator') {\n $input\n .on('focus', handle.focusInput)\n .on('blur', handle.blurInput);\n\n if (item.events) {\n $input.on(item.events, opt);\n }\n }\n\n // add icons\n if (item.icon) {\n if ($.isFunction(item.icon)) {\n item._icon = item.icon.call(this, this, $t, key, item);\n } else {\n if ( typeof(item.icon) === 'string' && item.icon.substring(0,3) == 'fa-' ) {\n // to enable font awesome\n item._icon = root.classNames.icon + ' ' + root.classNames.icon + '--fa fa ' + item.icon;\n } else {\n item._icon = root.classNames.icon + ' ' + root.classNames.icon + '-' + item.icon;\n }\n }\n $t.addClass(item._icon);\n }\n }\n\n // cache contained elements\n item.$input = $input;\n item.$label = $label;\n\n // attach item to menu\n $t.appendTo(opt.$menu);\n\n // Disable text selection\n if (!opt.hasTypes && $.support.eventSelectstart) {\n // browsers support user-select: none,\n // IE has a special event for text-selection\n // browsers supporting neither will not be preventing text-selection\n $t.on('selectstart.disableTextSelect', handle.abortevent);\n }\n });\n // attach contextMenu to (to bypass any possible overflow:hidden issues on parents of the trigger element)\n if (!opt.$node) {\n opt.$menu.css('display', 'none').addClass('context-menu-root');\n }\n opt.$menu.appendTo(opt.appendTo || document.body);\n },\n resize: function ($menu, nested) {\n var domMenu;\n // determine widths of submenus, as CSS won't grow them automatically\n // position:absolute within position:absolute; min-width:100; max-width:200; results in width: 100;\n // kinda sucks hard...\n\n // determine width of absolutely positioned element\n $menu.css({position: 'absolute', display: 'block'});\n // don't apply yet, because that would break nested elements' widths\n $menu.data('width',\n (domMenu = $menu.get(0)).getBoundingClientRect ?\n Math.ceil(domMenu.getBoundingClientRect().width) :\n $menu.outerWidth() + 1); // outerWidth() returns rounded pixels\n // reset styles so they allow nested elements to grow/shrink naturally\n $menu.css({\n position: 'static',\n minWidth: '0px',\n maxWidth: '100000px'\n });\n // identify width of nested menus\n $menu.find('> li > ul').each(function () {\n op.resize($(this), true);\n });\n // reset and apply changes in the end because nested\n // elements' widths wouldn't be calculatable otherwise\n if (!nested) {\n $menu.find('ul').addBack().css({\n position: '',\n display: '',\n minWidth: '',\n maxWidth: ''\n }).outerWidth(function () {\n return $(this).data('width');\n });\n }\n },\n update: function (opt, root) {\n var $trigger = this;\n if (root === undefined) {\n root = opt;\n op.resize(opt.$menu);\n }\n // re-check disabled for each item\n opt.$menu.children().each(function () {\n var $item = $(this),\n key = $item.data('contextMenuKey'),\n item = opt.items[key],\n disabled = ($.isFunction(item.disabled) && item.disabled.call($trigger, key, root)) || item.disabled === true,\n visible;\n if ($.isFunction(item.visible)) {\n visible = item.visible.call($trigger, key, root);\n } else if (typeof item.visible !== 'undefined') {\n visible = item.visible === true;\n } else {\n visible = true;\n }\n $item[visible ? 'show' : 'hide']();\n\n // dis- / enable item\n $item[disabled ? 'addClass' : 'removeClass'](root.classNames.disabled);\n\n if ($.isFunction(item.icon)) {\n $item.removeClass(item._icon);\n item._icon = item.icon.call(this, $trigger, $item, key, item);\n $item.addClass(item._icon);\n }\n\n if (item.type) {\n // dis- / enable input elements\n $item.find('input, select, textarea').prop('disabled', disabled);\n\n // update input states\n switch (item.type) {\n case 'text':\n case 'textarea':\n item.$input.val(item.value || '');\n break;\n\n case 'checkbox':\n case 'radio':\n item.$input.val(item.value || '').prop('checked', !!item.selected);\n break;\n\n case 'select':\n item.$input.val(item.selected || '');\n break;\n }\n }\n\n if (item.$menu) {\n // update sub-menu\n op.update.call($trigger, item, root);\n }\n });\n },\n layer: function (opt, zIndex) {\n // add transparent layer for click area\n // filter and background for Internet Explorer, Issue #23\n var $layer = opt.$layer = $('
      ')\n .css({height: $win.height(), width: $win.width(), display: 'block'})\n .data('contextMenuRoot', opt)\n .insertBefore(this)\n .on('contextmenu', handle.abortevent)\n .on('mousedown', handle.layerClick);\n\n // IE6 doesn't know position:fixed;\n if (document.body.style.maxWidth === undefined) { // IE6 doesn't support maxWidth\n $layer.css({\n 'position': 'absolute',\n 'height': $(document).height()\n });\n }\n\n return $layer;\n },\n processPromises: function (opt, root, promise) {\n // Start\n opt.$node.addClass(root.classNames.iconLoadingClass);\n\n function completedPromise(opt,root,items) {\n // Completed promise (dev called promise.resolve). We now have a list of items which can\n // be used to create the rest of the context menu.\n if (items === undefined) {\n // Null result, dev should have checked\n errorPromise(undefined);//own error object\n }\n finishPromiseProcess(opt,root, items);\n };\n function errorPromise(opt,root,errorItem) {\n // User called promise.reject() with an error item, if not, provide own error item.\n if (errorItem === undefined) {\n errorItem = { \"error\": { name: \"No items and no error item\", icon: \"context-menu-icon context-menu-icon-quit\" } };\n if (window.console) {\n (console.error || console.log).call(console, 'When you reject a promise, provide an \"items\" object, equal to normal sub-menu items');\n }\n } else if(typeof errorItem === 'string'){\n\t\t\t\t\t\t errorItem = { \"error\": { name: errorItem } };\n\t\t\t\t\t }\n finishPromiseProcess(opt,root,errorItem);\n };\n function finishPromiseProcess(opt,root,items) {\n if(root.$menu === undefined || !root.$menu.is(':visible')){\n return;\n }\n opt.$node.removeClass(root.classNames.iconLoadingClass);\n opt.items = items;\n op.create(opt, root, true); // Create submenu\n op.update(opt, root); // Correctly update position if user is already hovered over menu item\n root.positionSubmenu.call(opt.$node, opt.$menu); // positionSubmenu, will only do anything if user already hovered over menu item that just got new subitems.\n };\n\n // Wait for promise completion. .then(success, error, notify) (we don't track notify). Bind the opt\n // and root to avoid scope problems\n promise.then(completedPromise.bind(this, opt, root), errorPromise.bind(this, opt, root));\n }\n };\n\n // split accesskey according to http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#assigned-access-key\n function splitAccesskey(val) {\n var t = val.split(/\\s+/),\n keys = [];\n\n for (var i = 0, k; k = t[i]; i++) {\n k = k.charAt(0).toUpperCase(); // first character only\n // theoretically non-accessible characters should be ignored, but different systems, different keyboard layouts, ... screw it.\n // a map to look up already used access keys would be nice\n keys.push(k);\n }\n\n return keys;\n }\n\n// handle contextMenu triggers\n $.fn.contextMenu = function (operation) {\n var $t = this, $o = operation;\n if (this.length > 0) { // this is not a build on demand menu\n if (operation === undefined) {\n this.first().trigger('contextmenu');\n } else if (operation.x !== undefined && operation.y !== undefined) {\n this.first().trigger($.Event('contextmenu', { pageX: operation.x, pageY: operation.y, mouseButton: operation.button }));\n } else if (operation === 'hide') {\n var $menu = this.first().data('contextMenu') ? this.first().data('contextMenu').$menu : null;\n if($menu){\n $menu.trigger('contextmenu:hide');\n }\n } else if (operation === 'destroy') {\n $.contextMenu('destroy', {context: this});\n } else if ($.isPlainObject(operation)) {\n operation.context = this;\n $.contextMenu('create', operation);\n } else if (operation) {\n this.removeClass('context-menu-disabled');\n } else if (!operation) {\n this.addClass('context-menu-disabled');\n }\n } else {\n $.each(menus, function () {\n if (this.selector === $t.selector) {\n $o.data = this;\n\n $.extend($o.data, {trigger: 'demand'});\n }\n });\n\n handle.contextmenu.call($o.target, $o);\n }\n\n return this;\n };\n\n // manage contextMenu instances\n $.contextMenu = function (operation, options) {\n\n if (typeof operation !== 'string') {\n options = operation;\n operation = 'create';\n }\n\n if (typeof options === 'string') {\n options = {selector: options};\n } else if (options === undefined) {\n options = {};\n }\n\n // merge with default options\n var o = $.extend(true, {}, defaults, options || {});\n var $document = $(document);\n var $context = $document;\n var _hasContext = false;\n\n if (!o.context || !o.context.length) {\n o.context = document;\n } else {\n // you never know what they throw at you...\n $context = $(o.context).first();\n o.context = $context.get(0);\n _hasContext = !$(o.context).is(document);\n }\n\n switch (operation) {\n case 'create':\n // no selector no joy\n if (!o.selector) {\n throw new Error('No selector specified');\n }\n // make sure internal classes are not bound to\n if (o.selector.match(/.context-menu-(list|item|input)($|\\s)/)) {\n throw new Error('Cannot bind to selector \"' + o.selector + '\" as it contains a reserved className');\n }\n if (!o.build && (!o.items || $.isEmptyObject(o.items))) {\n throw new Error('No Items specified');\n }\n counter++;\n o.ns = '.contextMenu' + counter;\n if (!_hasContext) {\n namespaces[o.selector] = o.ns;\n }\n menus[o.ns] = o;\n\n // default to right click\n if (!o.trigger) {\n o.trigger = 'right';\n }\n\n if (!initialized) {\n var itemClick = o.itemClickEvent === 'click' ? 'click.contextMenu' : 'mouseup.contextMenu';\n var contextMenuItemObj = {\n // 'mouseup.contextMenu': handle.itemClick,\n // 'click.contextMenu': handle.itemClick,\n 'contextmenu:focus.contextMenu': handle.focusItem,\n 'contextmenu:blur.contextMenu': handle.blurItem,\n 'contextmenu.contextMenu': handle.abortevent,\n 'mouseenter.contextMenu': handle.itemMouseenter,\n 'mouseleave.contextMenu': handle.itemMouseleave\n };\n contextMenuItemObj[itemClick] = handle.itemClick;\n // make sure item click is registered first\n $document\n .on({\n 'contextmenu:hide.contextMenu': handle.hideMenu,\n 'prevcommand.contextMenu': handle.prevItem,\n 'nextcommand.contextMenu': handle.nextItem,\n 'contextmenu.contextMenu': handle.abortevent,\n 'mouseenter.contextMenu': handle.menuMouseenter,\n 'mouseleave.contextMenu': handle.menuMouseleave\n }, '.context-menu-list')\n .on('mouseup.contextMenu', '.context-menu-input', handle.inputClick)\n .on(contextMenuItemObj, '.context-menu-item');\n\n initialized = true;\n }\n\n // engage native contextmenu event\n $context\n .on('contextmenu' + o.ns, o.selector, o, handle.contextmenu);\n\n if (_hasContext) {\n // add remove hook, just in case\n $context.on('remove' + o.ns, function () {\n $(this).contextMenu('destroy');\n });\n }\n\n switch (o.trigger) {\n case 'hover':\n $context\n .on('mouseenter' + o.ns, o.selector, o, handle.mouseenter)\n .on('mouseleave' + o.ns, o.selector, o, handle.mouseleave);\n break;\n\n case 'left':\n $context.on('click' + o.ns, o.selector, o, handle.click);\n break;\n /*\n default:\n // http://www.quirksmode.org/dom/events/contextmenu.html\n $document\n .on('mousedown' + o.ns, o.selector, o, handle.mousedown)\n .on('mouseup' + o.ns, o.selector, o, handle.mouseup);\n break;\n */\n }\n\n // create menu\n if (!o.build) {\n op.create(o);\n }\n break;\n\n case 'destroy':\n var $visibleMenu;\n if (_hasContext) {\n // get proper options\n var context = o.context;\n $.each(menus, function (ns, o) {\n\n // Is this menu equest to the context called from\n if (!$(context).is(o.selector)) {\n return true;\n }\n\n $visibleMenu = $('.context-menu-list').filter(':visible');\n if ($visibleMenu.length && $visibleMenu.data().contextMenuRoot.$trigger.is($(o.context).find(o.selector))) {\n $visibleMenu.trigger('contextmenu:hide', {force: true});\n }\n\n try {\n if (menus[o.ns].$menu) {\n menus[o.ns].$menu.remove();\n }\n\n delete menus[o.ns];\n } catch (e) {\n menus[o.ns] = null;\n }\n\n $(o.context).off(o.ns);\n\n return true;\n });\n } else if (!o.selector) {\n $document.off('.contextMenu .contextMenuAutoHide');\n $.each(menus, function (ns, o) {\n $(o.context).off(o.ns);\n });\n\n namespaces = {};\n menus = {};\n counter = 0;\n initialized = false;\n\n $('#context-menu-layer, .context-menu-list').remove();\n } else if (namespaces[o.selector]) {\n $visibleMenu = $('.context-menu-list').filter(':visible');\n if ($visibleMenu.length && $visibleMenu.data().contextMenuRoot.$trigger.is(o.selector)) {\n $visibleMenu.trigger('contextmenu:hide', {force: true});\n }\n\n try {\n if (menus[namespaces[o.selector]].$menu) {\n menus[namespaces[o.selector]].$menu.remove();\n }\n\n delete menus[namespaces[o.selector]];\n } catch (e) {\n menus[namespaces[o.selector]] = null;\n }\n\n $document.off(namespaces[o.selector]);\n }\n break;\n\n case 'html5':\n // if or are not handled by the browser,\n // or options was a bool true,\n // initialize $.contextMenu for them\n if ((!$.support.htmlCommand && !$.support.htmlMenuitem) || (typeof options === 'boolean' && options)) {\n $('menu[type=\"context\"]').each(function () {\n if (this.id) {\n $.contextMenu({\n selector: '[contextmenu=' + this.id + ']',\n items: $.contextMenu.fromMenu(this)\n });\n }\n }).css('display', 'none');\n }\n break;\n\n default:\n throw new Error('Unknown operation \"' + operation + '\"');\n }\n\n return this;\n };\n\n// import values into commands\n $.contextMenu.setInputValues = function (opt, data) {\n if (data === undefined) {\n data = {};\n }\n\n $.each(opt.inputs, function (key, item) {\n switch (item.type) {\n case 'text':\n case 'textarea':\n item.value = data[key] || '';\n break;\n\n case 'checkbox':\n item.selected = data[key] ? true : false;\n break;\n\n case 'radio':\n item.selected = (data[item.radio] || '') === item.value;\n break;\n\n case 'select':\n item.selected = data[key] || '';\n break;\n }\n });\n };\n\n// export values from commands\n $.contextMenu.getInputValues = function (opt, data) {\n if (data === undefined) {\n data = {};\n }\n\n $.each(opt.inputs, function (key, item) {\n switch (item.type) {\n case 'text':\n case 'textarea':\n case 'select':\n data[key] = item.$input.val();\n break;\n\n case 'checkbox':\n data[key] = item.$input.prop('checked');\n break;\n\n case 'radio':\n if (item.$input.prop('checked')) {\n data[item.radio] = item.value;\n }\n break;\n }\n });\n\n return data;\n };\n\n// find