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