forked from s-yadav/contextMenu.js
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontextMenu.min.js
More file actions
8 lines (8 loc) · 10.3 KB
/
contextMenu.min.js
File metadata and controls
8 lines (8 loc) · 10.3 KB
1
2
3
4
5
6
7
8
/*
*contextMenu.js v 1.4.1
*Author: Sudhanshu Yadav
*s-yadav.github.com
*Copyright (c) 2013-2015 Sudhanshu Yadav.
*Dual licensed under the MIT and GPL licenses
*/
!function(e,n,t,i){"use strict";e.single=function(){var n=e({});return function(e){return n[0]=e,n}}(),e.fn.contextMenu=function(n,t,i){a[n]?t&&(t instanceof Array||"string"==typeof t||t.nodeType||t.jquery||(i=t,t=null)):(i=t,t=n,n="popup"),t instanceof Array&&"update"!=n&&(n="menu");var r=i;return e.inArray(n,["menu","popup","close","destroy"])>-1?(i=o.optionOtimizer(n,i),this.each(function(){var o=e(this);r=e.extend({},e.fn.contextMenu.defaults,i),r.baseTrigger||(r.baseTrigger=o),a[n].call(o,t,r)})):a[n].call(this,t,r),this},e.fn.contextMenu.defaults={triggerOn:"click",subMenuTriggerOn:"hover click",displayAround:"cursor",mouseClick:"left",verAdjust:0,horAdjust:0,top:"auto",left:"auto",closeOther:!0,containment:n,winEventClose:!0,position:"auto",closeOnClick:!0,onOpen:function(){},afterOpen:function(){},onClose:function(){}};var a={menu:function(e,n){e=o.createMenuList(this,e,n),o.contextMenuBind.call(this,e,n,"menu")},popup:function(n,t){e(n).addClass("iw-contextMenu"),o.contextMenuBind.call(this,n,t,"popup")},update:function(n,t){var a=this;t=t||{},this.each(function(){var r=e(this),u=r.data("iw-menuData");u||(a.contextMenu("refresh"),u=r.data("iw-menuData"));var c=u.menu;if("object"==typeof n)for(var s=0;s<n.length;s++){var l=n[s].name,d=n[s].disable,f=n[s].fun,m=n[s].img,g=n[s].title,p=n[s].className,h=c.children("li").filter(function(){return e(this).contents().filter(function(){return 3==this.nodeType}).text()==l}),v=n[s].subMenu;if(d!=i&&(d?h.addClass("iw-mDisable"):h.removeClass("iw-mDisable")),f&&h.unbind("click.contextMenu").bind("click.contextMenu",f),g!=i&&h.attr("title",g),p!=i&&h.attr("class",p),m){var w=h.find(".iw-mIcon");w.length?w[0].src=m:h.prepend('<img src="'+m+'" align="absmiddle" class="iw-mIcon" />')}v&&h.contextMenu("update",v)}o.onOff(c);var M=t.triggerOn;if(M){r.unbind(".contextMenu"),M=M.split(" ");for(var x=[],s=0,b=M.length;b>s;s++)x.push(M[s]+".contextMenu");r.bind(x.join(" "),o.eventHandler)}u.option=e.extend({},u.option,t),r.data("iw-menuData",u)})},refresh:function(){var n=this.filter(function(){return!!e(this).data("iw-menuData")}).data("iw-menuData"),t=this.filter(function(){return!e(this).data("iw-menuData")});n.option.baseTrigger=this,o.contextMenuBind.call(t,n.menuSelector,n.option)},open:function(n,t){t=t||{};var i=t.event||e.Event("click");t.top&&(i.clientY=t.top),t.left&&(i.clientX=t.left),this.each(function(){o.eventHandler.call(this,i)})},close:function(){var e=this.data("iw-menuData");e&&o.closeContextMenu(e.option,this,e.menu,null)},value:function(e){var n=this.data("iw-menuData");return n[e]?n[e]:n.option?n.option[e]:null},destroy:function(){var n=this,t=n.data("iw-menuData").menuId,i=e(".iw-contextMenu[menuId="+t+"]"),a=i.data("iw-menuData");a&&(1==a.noTrigger?i.hasClass("iw-created")?i.remove():(i.removeClass("iw-contextMenu "+t).removeAttr("menuId").removeData("iw-menuData"),i.find("li.iw-mTrigger").contextMenu("destroy")):(a.noTrigger--,i.data("iw-menuData",a)),n.unbind(".contextMenu").removeClass("iw-mTrigger").removeData("iw-menuData"))}},o={contextMenuBind:function(n,t,i){var a=this,r=e(n),u=r.data("iw-menuData");if(0!=r.length||(r=a.find(n),0!=r.length)){"menu"==i&&o.menuHover(r);var c=t.baseTrigger;if(u)u.noTrigger++,r.data("iw-menuData",u);else{var s;c.data("iw-menuData")?s=c.data("iw-menuData").menuId:(s=Math.ceil(1e5*Math.random()),c.data("iw-menuData",{menuId:s}));var l=r.clone();l.appendTo("body"),u={menuId:s,menuWidth:l.outerWidth(!0),menuHeight:l.outerHeight(!0),noTrigger:1,trigger:a},r.data("iw-menuData",u).attr("menuId",s),l.remove()}a.addClass("iw-mTrigger").data("iw-menuData",{menuId:u.menuId,option:t,menu:r,menuSelector:n,method:i});var d=t.triggerOn;-1!=d.indexOf("hover")&&(d=d.replace("hover","mouseenter"),-1!=c.index(a)&&c.add(r).bind("mouseleave.contextMenu",function(n){0==e(n.relatedTarget).closest(".iw-contextMenu").length&&e('.iw-contextMenu[menuId="'+u.menuId+'"]').fadeOut(100)})),a.delegate("input,a,.needs-click","click",function(e){e.stopImmediatePropagation()}),d=d.split(" ");for(var f=[],m=0,g=d.length;g>m;m++)f.push(d[m]+".contextMenu");a.bind(f.join(" "),o.eventHandler),r.bind("click mouseenter",function(e){e.stopPropagation()}),r.delegate("li","click",function(n){t.closeOnClick&&!e.single(this).hasClass("iw-has-submenu")&&o.closeContextMenu(t,a,r,n)})}},eventHandler:function(i){i.preventDefault();var a=e(this),r=a.data("iw-menuData"),u=r.menu,c=u.data("iw-menuData"),s=r.option,l=s.containment,d={trigger:a,menu:u},f=l==n,m=-1==s.baseTrigger.index(a);!m&&s.closeOther&&e(".iw-contextMenu").css("display","none"),u.find(".iw-mSelected").removeClass("iw-mSelected"),s.onOpen.call(this,d,i);var g,p,h,v,w=e(l),M=w.innerHeight(),x=w.innerWidth(),b=0,C=0,k=c.menuHeight,y=c.menuWidth,D=0,O=0,T=g=parseInt(s.verAdjust),I=p=parseInt(s.horAdjust);if(f||(b=w.offset().top,C=w.offset().left,"static"==w.css("position")&&w.css("position","relative")),"cursor"==s.displayAround)D=f?i.clientX:i.clientX+e(n).scrollLeft()-C,O=f?i.clientY:i.clientY+e(n).scrollTop()-b,h=O+k,v=D+y,h>M&&(0>O-k?k-O>h-M?(O=M-k,g=-1*g):(O=0,g=0):(O-=k,g=-1*g)),v>x&&(0>D-y?y-D>v-x?(D=x-y,p=-1*p):(D=0,p=0):(D-=y,p=-1*p));else if("trigger"==s.displayAround){var A=a.outerHeight(!0),E=a.outerWidth(!0),H=f?a.offset().left-w.scrollLeft():a.offset().left-C,S=f?a.offset().top-w.scrollTop():a.offset().top-b,j=E;D=H+E,O=S,h=O+k,v=D+y,h>M&&(0>O-k?k-O>h-M?(O=M-k,g=-1*g):(O=0,g=0):(O=O-k+A,g=-1*g)),v>x&&(0>D-y?y-D>v-x?(D=x-y,p=-1*p,j=-E):(D=0,p=0,j=0):(D=D-y-E,p=-1*p,j=-E)),"top"==s.position?(O=S-k,g=T,D-=j):"left"==s.position?(D=H-y,p=I):"bottom"==s.position?(O=S+A,g=T,D-=j):"right"==s.position&&(D=H+E,p=I)}var z={position:f||m?"fixed":"absolute",display:"inline-block",height:"",width:""};if("auto"!=s.left&&(D=o.getPxSize(s.left,x)),"auto"!=s.top&&(O=o.getPxSize(s.top,M)),!f){var P=a.offsetParent().offset();m?(D=D+C-e(n).scrollLeft(),O=O+b-e(n).scrollTop()):(D-=C-P.left,O-=b-P.top)}z.left=D+p+"px",z.top=O+g+"px",u.css(z),s.afterOpen.call(this,d,i),0==a.closest(".iw-contextMenu").length&&(e(".iw-curMenu").removeClass("iw-curMenu"),u.addClass("iw-curMenu"));var L={trigger:a,menu:u,option:s,method:r.method};e("html").unbind("click",o.clickEvent).click(L,o.clickEvent),e(t).unbind("keydown",o.keyEvent).keydown(L,o.keyEvent),s.winEventClose&&e(n).bind("scroll resize",L,o.scrollEvent)},scrollEvent:function(e){o.closeContextMenu(e.data.option,e.data.trigger,e.data.menu,e)},clickEvent:function(n){var t=n.data.trigger.get(0);t!==n.target&&0==e(n.target).closest(".iw-contextMenu").length&&o.closeContextMenu(n.data.option,n.data.trigger,n.data.menu,n)},keyEvent:function(n){n.preventDefault();var t=n.data.menu,i=n.data.option,a=n.keyCode;if(27==a&&o.closeContextMenu(i,n.data.trigger,t,n),"menu"==n.data.method){var r=e(".iw-curMenu"),u=r.children("li:not(.iw-mDisable)"),c=u.filter(".iw-mSelected"),s=u.index(c),l=function(e){o.selectMenu(r,e);var t=e.data("iw-menuData");t&&o.eventHandler.call(e[0],n)},d=function(){l(u.filter(":first"))},f=function(){l(u.filter(":last"))},m=function(){l(u.filter(":eq("+(s+1)+")"))},g=function(){l(u.filter(":eq("+(s-1)+")"))},p=function(){var e=c.data("iw-menuData");if(e){o.eventHandler.call(c[0],n);var t=e.menu;t.addClass("iw-curMenu"),r.removeClass("iw-curMenu"),r=t,u=r.children("li:not(.iw-mDisable)"),c=u.filter(".iw-mSelected"),d()}},h=function(){var e=r.data("iw-menuData").trigger,n=e.closest(".iw-contextMenu");0!=n.length&&(r.removeClass("iw-curMenu").css("display","none"),n.addClass("iw-curMenu"))};switch(a){case 13:c.click();break;case 40:s==u.length-1||0==c.length?d():m();break;case 38:0==s||0==c.length?f():g();break;case 33:d();break;case 34:f();break;case 37:h();break;case 39:p()}}},closeContextMenu:function(i,a,r,u){e(t).unbind("keydown",o.keyEvent),e("html").unbind("click",o.clickEvent),e(n).unbind("scroll resize",o.scrollEvent),e(".iw-contextMenu").css("display","none"),e(t).focus(),i.onClose.call(this,{trigger:a,menu:r},u)},getPxSize:function(e,n){return isNaN(e)?-1!=e.indexOf("%")?parseInt(e)*n/100:parseInt(e):e},selectMenu:function(e,n){var t=e.find("li.iw-mSelected"),i=t.find(".iw-contextMenu");0!=i.length&&t[0]!=n[0]&&i.fadeOut(100),t.removeClass("iw-mSelected"),n.addClass("iw-mSelected")},menuHover:function(n){Date.now();n.children("li").bind("mouseenter.contextMenu click.contextMenu",function(){e(".iw-curMenu").removeClass("iw-curMenu"),n.addClass("iw-curMenu"),o.selectMenu(n,e(this))})},createMenuList:function(t,i,a){var r=a.baseTrigger,u=Math.floor(1e4*Math.random());if("object"==typeof i&&!i.nodeType&&!i.jquery){var c=e('<ul class="iw-contextMenu iw-created iw-cm-menu" id="iw-contextMenu'+u+'"></ul>');if(e.each(i,function(n,t){var i=t.name,u=t.fun||function(){},s=t.subMenu,l=t.img||"",d=t.title||"",f=t.className||"",m=t.disable,g=e('<li title="'+d+'" class="'+f+'">'+i+"</li>");l&&g.prepend('<img src="'+l+'" align="absmiddle" class="iw-mIcon" />'),m&&g.addClass("iw-mDisable"),s||g.bind("click.contextMenu",function(e){u.call(this,{trigger:r,menu:c},e)}),c.append(g),s&&(g.addClass("iw-has-submenu").append('<div class="iw-cm-arrow-right" />'),o.subMenu(g,s,r,a))}),-1==r.index(t[0]))t.append(c);else{var s=a.containment==n?"body":a.containment;e(s).append(c)}return o.onOff(e("#iw-contextMenu"+u)),"#iw-contextMenu"+u}if(0!=e(i).length){var l=e(i);return l.removeClass("iw-contextMenuCurrent").addClass("iw-contextMenu iw-cm-menu iw-contextMenu"+u).attr("menuId","iw-contextMenu"+u).css("display","none"),l.find("ul").each(function(){var n=e(this),t=n.parent("li");t.append('<div class="iw-cm-arrow-right" />'),n.addClass("iw-contextMenuCurrent"),o.subMenu(t,".iw-contextMenuCurrent",r,a)}),o.onOff(e(".iw-contextMenu"+u)),".iw-contextMenu"+u}},subMenu:function(e,n,t,i){e.contextMenu("menu",n,{triggerOn:i.subMenuTriggerOn,displayAround:"trigger",position:"auto",mouseClick:"left",baseTrigger:t,containment:i.containment})},onOff:function(n){n.find(".iw-mOverlay").remove(),n.find(".iw-mDisable").each(function(){var n=e(this);n.append('<div class="iw-mOverlay"/>'),n.find(".iw-mOverlay").bind("click mouseenter",function(e){e.stopPropagation()})})},optionOtimizer:function(n,t){return t?("menu"==n&&(t.mouseClick||(t.mouseClick="right")),"right"==t.mouseClick&&"click"==t.triggerOn&&(t.triggerOn="contextmenu"),-1!=e.inArray(t.triggerOn,["hover","mouseenter","mouseover","mouseleave","mouseout","focusin","focusout"])&&(t.displayAround="trigger"),t):void 0}}}(jQuery,window,document);