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.6 KB
/
Copy pathcontextMenu.min.js
File metadata and controls
8 lines (8 loc) · 10.6 KB
1
2
3
4
5
6
7
8
/*
*contextMenu.js v 1.0.3
*Author: Sudhanshu Yadav
*s-yadav.github.com
*Copyright (c) 2013 Sudhanshu Yadav.
*Dual licensed under the MIT and GPL licenses
*/
(function(e,t,n,r){e.fn.contextMenu=function(t,n,r){"use strict";if(!i[t]){r=n;n=t;t="popup"}else if(n!=null){if(!(n instanceof Array||typeof n==="string"||n.nodeType||n.jquery)){r=n;n=null}}if(n instanceof Array&&t!="update"){t="menu"}var o=r;if(t!="update"){r=s.optionOtimizer(t,r);var o=e.extend({},e.fn.contextMenu.defaults,r);if(!o.baseTrigger){o.baseTrigger=this}}i[t].call(this,n,o);return this};e.fn.contextMenu.defaults={triggerOn:"click",displayAround:"cursor",mouseClick:"left",verAdjust:0,horAdjust:0,top:"auto",left:"auto",containment:t,winEventClose:true,sizeStyle:"auto",position:"auto",onOpen:function(e,t){},afterOpen:function(e,t){},onClose:function(e,t){}};var i={menu:function(t,n){var r=e(this);t=s.createMenuList(r,t,n);s.contextMenuBind.call(this,t,n,"menu")},popup:function(t,n){e(t).addClass("iw-contextMenu");s.contextMenuBind.call(this,t,n,"popup")},update:function(t,n){this.each(function(){var r=e(this),i=r.data("iw-menuData"),o=i.menu;if(typeof t==="object"){for(var u=0;u<t.length;u++){var a=t[u].name,f=t[u].disable,l=o.children("li").filter(function(){return e(this).contents().filter(function(){return this.nodeType==3}).text()==a}),c=t[u].subMenu;if(f=="true"){l.addClass("iw-mDisable")}else{l.removeClass("iw-mDisable")}if(c){l.contextMenu("update",c)}}}s.onOff(o);i.option=e.extend({},i.option,n);r.data("iw-menuData",i);var h=i.option.triggerOn;if(n){if(h!=n.triggerOn){trigger.unbind(".contextMenu");trigger.bind(h+".contextMenu",s.eventHandler)}}})},refresh:function(){var t=this.filter(function(){return e(this).data("iw-menuData")!=null}).data("iw-menuData"),n=this.filter(function(){return e(this).data("iw-menuData")==null});s.contextMenuBind.call(n,t.menuSelector,t.option)},value:function(t){var n=e(this).data("iw-menuData");if(n[t]){return n[t]}else if(n.option){return n.option[t]}return null},destroy:function(){this.each(function(){var t=e(this),n=t.data("iw-menuData").menuId,r=e(".iw-contextMenu[menuId="+n+"]"),i=r.data("iw-menuData");if(i.noTrigger==1){if(r.hasClass("iw-created")){r.remove()}else{r.removeClass("iw-contextMenu "+cur.attr["menuId"]).removeAttr("menuId").removeData("iw-menuData");r.find("li.iw-mTrigger").contextMenu("destroy")}}else{i.noTrigger--;r.data("iw-menuData",i)}t.unbind(".contextMenu").removeClass("iw-mTrigger").removeData("iw-menuData")})}};var s={contextMenuBind:function(t,n,r){var i=this,o=e(t),u=o.data("iw-menuData");if(o.length==0){o=i.find(t);if(o.length==0){return}}if(r=="menu"){s.menuHover(o)}var a=n.baseTrigger;if(a.index(i)!=-1){o.addClass("iw-curMenu")}if(!u){var f;if(!a.data("iw-menuData")){f=Math.ceil(Math.random()*1e5);a.data("iw-menuData",{menuId:f})}else{f=a.data("iw-menuData").menuId}var l=o.clone();l.appendTo("body");u={menuId:f,menuWidth:l.outerWidth(true),menuHeight:l.outerHeight(true),noTrigger:1,trigger:i};o.data("iw-menuData",u).attr("menuId",f);l.remove()}else{u.noTrigger++;o.data("iw-menuData",u)}i.addClass("iw-mTrigger").data("iw-menuData",{menuId:u.menuId,option:n,menu:o,menuSelector:t,method:r});if(n.triggerOn=="hover"){var c="mouseenter";if(a.index(i)!=-1){a.add(o).bind("mouseleave.contextMenu",function(t){if(e(t.relatedTarget).closest(".iw-contextMenu").length==0){e('.iw-contextMenu[menuId="'+u.menuId+'"]').hide(100)}})}}else{var c=n.triggerOn}i.bind(c+".contextMenu",s.eventHandler);o.bind("click mouseenter",function(e){e.stopPropagation()})},eventHandler:function(r){r.preventDefault();var i=e(this),o=i.data("iw-menuData"),u=o.menu,a=u.data("iw-menuData"),f=o.option,l=f.containment,c={trigger:i,menu:u},h=l==t,p=f.baseTrigger.index(i)==-1;if(!p){e(".iw-contextMenu").css("display","none")}f.onOpen.call(this,c,r);var d=e(l);cHeight=d.innerHeight(),cWidth=d.innerWidth(),cTop=0,cLeft=0,menuHeight=a.menuHeight,menuWidth=a.menuWidth,va=verAdjust=parseInt(f.verAdjust),ha=horAdjust=parseInt(f.horAdjust);if(!h){cTop=d.offset().top;cLeft=d.offset().left;if(d.css("position")=="static"){d.css("position","relative")}}if(f.sizeStyle=="auto"){menuHeight=Math.min(menuHeight,cHeight);menuWidth=Math.min(menuWidth,cWidth);menuWidth=menuWidth+20}if(f.displayAround=="cursor"){var v=h?r.clientX:r.clientX+e(t).scrollLeft()-cLeft,m=h?r.clientY:r.clientY+e(t).scrollTop()-cTop;var g=m+menuHeight,y=v+menuWidth;if(g>cHeight){if(m-menuHeight<0){if(g-cHeight<menuHeight-m){m=cHeight-menuHeight;va=-1*va}else{m=0;va=0}}else{m=m-menuHeight;va=-1*va}}if(y>cWidth){if(v-menuWidth<0){if(y-cWidth<menuWidth-v){v=cWidth-menuWidth;ha=-1*ha}else{v=0;ha=0}}else{v=v-menuWidth;ha=-1*ha}}}else if(f.displayAround=="trigger"){var b=i.outerHeight(true),w=i.outerWidth(true),E=h?i.offset().left-d.scrollLeft():i.offset().left-cLeft,S=h?i.offset().top-d.scrollTop():i.offset().top-cTop,v=E+w,m=S,x=w;var g=m+menuHeight,y=v+menuWidth;if(g>cHeight){if(m-menuHeight<0){if(g-cHeight<menuHeight-m){m=cHeight-menuHeight;va=-1*va}else{m=0;va=0}}else{m=m-menuHeight+b;va=-1*va}}if(y>cWidth){if(v-menuWidth<0){if(y-cWidth<menuWidth-v){v=cWidth-menuWidth;ha=-1*ha;x=-w}else{v=0;ha=0;x=0}}else{v=v-menuWidth-w;ha=-1*ha;x=-w}}if(f.position=="top"){menuHeight=Math.min(a.menuHeight,S);m=S-menuHeight;va=verAdjust;v=v-x}else if(f.position=="left"){menuWidth=Math.min(a.menuWidth,E);v=E-menuWidth;ha=horAdjust}else if(f.position=="bottom"){menuHeight=Math.min(a.menuHeight,cHeight-S-b);m=S+b;va=verAdjust;v=v-x}else if(f.position=="right"){menuWidth=Math.min(a.menuWidth,cWidth-E-w);v=E+w;ha=horAdjust}}var T=u.outerWidth(true)-u.width(),N=u.outerHeight(true)-u.height();var C={position:h||p?"fixed":"absolute",display:"inline-block",height:"",width:"","overflow-y":menuHeight!=a.menuHeight?"auto":"hidden","overflow-x":menuWidth!=a.menuWidth?"auto":"hidden"};if(f.sizeStyle=="auto"){C.height=menuHeight-N+"px";C.width=menuWidth-T+"px"}if(f.left!="auto"){v=s.getPxSize(f.left,cWidth)}if(f.top!="auto"){m=s.getPxSize(f.top,cHeight)}if(!h){var k=i.offsetParent().offset();if(p){v=v+cLeft-e(t).scrollLeft();m=m+cTop-e(t).scrollTop()}else{v=v-(cLeft-k.left);m=m-(cTop-k.top)}}C.left=v+ha+"px";C.top=m+va+"px";u.css(C);f.afterOpen.call(this,c,r);s.tempTextBox();if(!i.is("input,select,textarea")&&o.method=="menu"){e("#iw-tempTxt").focus()}if(i.closest(".iw-contextMenu").length==0){e(".iw-curMenu").removeClass("iw-curMenu");u.addClass("iw-curMenu")}e(n.documentElement).unbind("keyup",s.keyEvent);e(n).unbind("click",s.clickEvent);var L={trigger:i,menu:u,option:f,method:o.method};e(n).click(L,s.clickEvent);e(n.documentElement).keyup(L,s.keyEvent);if(f.winEventClose){e(t).bind("scroll resize",L,s.scrollEvent)}},scrollEvent:function(e){s.closeContextMenu(e.data.option,e.data.trigger,e.data.menu,e)},clickEvent:function(t){var n=t.data.trigger.get(0);if(n!==t.target&&e(t.target).closest(".iw-contextMenu").length==0){s.closeContextMenu(t.data.option,t.data.trigger,t.data.menu,t)}},keyEvent:function(t){var n=t.data.menu,r=t.data.option,i=t.keyCode;if(i==27){s.closeContextMenu(r,t.data.trigger,n,t)}if(t.data.method=="menu"){var o=e(".iw-curMenu"),u=o.children("li:not(.iw-mDisable)"),a=u.filter(".iw-mSelected"),f=u.index(a),l=function(e){a.removeClass("iw-mSelected");e.addClass("iw-mSelected")},c=function(){l(u.filter(":first"))},h=function(){l(u.filter(":last"))},p=function(){l(u.filter(":eq("+(f+1)+")"))},d=function(){l(u.filter(":eq("+(f-1)+")"))},v=function(){var e=a.data("iw-menuData");if(e){a.triggerHandler("mouseenter.contextMenu");var t=e.menu;t.addClass("iw-curMenu");o.removeClass("iw-curMenu");o=t;u=o.children("li:not(.iw-mDisable)");a=u.filter(".iw-mSelected");c()}},m=function(){var e=o.data("iw-menuData").trigger;var t=e.closest(".iw-contextMenu");if(t.length!=0){o.removeClass("iw-curMenu").css("display","none");t.addClass("iw-curMenu")}};switch(i){case 13:a.click();break;case 40:f==u.length-1||a.length==0?c():p();break;case 38:f==0||a.length==0?h():d();break;case 33:c();break;case 34:h();break;case 37:m();break;case 39:v();break}}},closeContextMenu:function(r,i,o,u){e(n.documentElement).unbind("keyup",s.keyEvent);e(n).unbind("click",s.clickEvent);e(t).unbind("scroll resize",s.scrollEvent);e(".iw-contextMenu").hide();e(n).focus();e("#iw-tempTxt").remove();r.onClose.call(this,{trigger:i,menu:o},u)},getPxSize:function(e,t){if(!isNaN(e)){return e}if(e.indexOf("%")!=-1){return parseInt(e)*t/100}else{return parseInt(e)}},menuHover:function(t){t.children("li").bind("mouseenter",function(n){e(".iw-curMenu").removeClass("iw-curMenu");t.addClass("iw-curMenu");var r=t.find("li.iw-mSelected"),i=r.find(".iw-contextMenu");if(i.length!=0&&r[0]!=this){i.hide(100)}r.removeClass("iw-mSelected");e(this).addClass("iw-mSelected")})},createMenuList:function(n,r,i){var o=i.baseTrigger,u=Math.floor(Math.random()*1e4);if(typeof r=="object"&&!r.nodeType&&!r.jquery){var a=e('<ul class="iw-contextMenu iw-created iw-cm-menu" id="iw-contextMenu'+u+'"></ul>');for(var f=0;f<r.length;f++){var l=r[f].name,c=r[f].fun,h=r[f].subMenu,p=r[f].img||"",d=r[f].title||l,v=r[f].disable,m=e('<li title="'+d+'">'+l+"</li>");if(p!=null&&p!=""){m.prepend('<img src="'+p+'" align="absmiddle" class="iw-mIcon" />')}if(v=="true"){m.addClass("iw-mDisable")}m.bind("click",c);a.append(m);if(h){m.append('<div class="iw-cm-arrow-right" />');s.subMenu(m,h,o,i)}}if(o.index(n[0])==-1){n.append(a)}else{var g=i.containment==t?"body":i.containment;e(g).append(a)}s.onOff(e("#iw-contextMenu"+u));return"#iw-contextMenu"+u}else if(e(r).length!=0){var y=e(r);y.removeClass("iw-contextMenuCurrent").addClass("iw-contextMenu iw-cm-menu iw-contextMenu"+u).attr("menuId","iw-contextMenu"+u).css("display","none");y.find("ul").each(function(t,n){var r=e(this),u=r.parent("li");u.append('<div class="iw-cm-arrow-right" />');r.addClass("iw-contextMenuCurrent");s.subMenu(u,".iw-contextMenuCurrent",o,i)});s.onOff(e(".iw-contextMenu"+u));return".iw-contextMenu"+u}},subMenu:function(e,t,n,r){e.contextMenu("menu",t,{triggerOn:"hover",displayAround:"trigger",position:"auto",baseTrigger:n,containment:r.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()})})},tempTextBox:function(){var t=e('<input type="text" id="iw-tempTxt" />');t.css({position:"fixed",bottom:"0px",width:"1px","font-size":"1px",outline:"none",border:"0px",left:"0px",opacity:".1",padding:"0px"});e("body").append(t)},optionOtimizer:function(e,t){if(!t){return}if(e=="menu"){if(!t.mouseClick){t.mouseClick="right"}}if(t.mouseClick=="right"&&t.triggerOn=="click"){t.triggerOn="contextmenu"}if(["hover","mouseenter","mouseover","mouseleave","mouseout","focusin","focusout"].indexOf(t.triggerOn)!=-1){t.displayAround="trigger"}return t}}})(jQuery,window,document)