adding all weblabels from weblabels.fsf.org
[weblabels.fsf.org.git] / defectivebydesign.org / 20130322 / files-new-min / crm.fsf.org / jquery.contextMenu.js
CommitLineData
5a920362 1// jQuery Context Menu Plugin\r
2//\r
3// Version 1.01\r
4//\r
5// Cory S.N. LaViska\r
6// A Beautiful Site (http://abeautifulsite.net/)\r
7//\r
8// More info: http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/\r
9//\r
10// Terms of Use\r
11//\r
12// This plugin is dual-licensed under the GNU General Public License\r
13// and the MIT License and is copyright A Beautiful Site, LLC.\r
14//\r
15( function($) {\r
16 $.extend($.fn, {\r
17 \r
18 contextMenu: function(o, callback) {\r
19 // Defaults\r
20 if( o.menu == undefined ) return false;\r
21 if( o.inSpeed == undefined ) o.inSpeed = 150;\r
22 if( o.outSpeed == undefined ) o.outSpeed = 75;\r
23 // 0 needs to be -1 for expected results (no fade)\r
24 if( o.inSpeed == 0 ) o.inSpeed = -1;\r
25 if( o.outSpeed == 0 ) o.outSpeed = -1;\r
26 // Loop each context menu\r
27 $(this).each( function() {\r
28 var el = $(this);\r
29 var offset = $(el).offset();\r
30 // Add contextMenu class\r
31 $('#' + o.menu).addClass('contextMenu');\r
32 // Simulate a true right click\r
33 $(this).mousedown( function(e) {\r
34 var evt = e;\r
35 // move contextmenu elements to end of DOM so that they get positioned correctly\r
36 $(".contextMenu").addClass('crm-contextmenu').remove().appendTo('body');\r
37\r
38 evt.stopPropagation();\r
39 $(this).mouseup( function(e) {\r
40 e.stopPropagation();\r
41 var srcElement = $(this);\r
42 $(this).unbind('mouseup');\r
43 if( evt.button == 2 ) {\r
44 // Hide context menus that may be showing\r
45 $(".contextMenu").hide();\r
46 // Get this context menu\r
47 var menu = $('#' + o.menu);\r
48 \r
49 if( $(el).hasClass('disabled') ) return false;\r
50 \r
51 // Detect mouse position\r
52 var d = {}, x, y;\r
53 if( self.innerHeight ) {\r
54 d.pageYOffset = self.pageYOffset;\r
55 d.pageXOffset = self.pageXOffset;\r
56 d.innerHeight = self.innerHeight;\r
57 d.innerWidth = self.innerWidth;\r
58 } else if( document.documentElement &&\r
59 document.documentElement.clientHeight ) {\r
60 d.pageYOffset = document.documentElement.scrollTop;\r
61 d.pageXOffset = document.documentElement.scrollLeft;\r
62 d.innerHeight = document.documentElement.clientHeight;\r
63 d.innerWidth = document.documentElement.clientWidth;\r
64 } else if( document.body ) {\r
65 d.pageYOffset = document.body.scrollTop;\r
66 d.pageXOffset = document.body.scrollLeft;\r
67 d.innerHeight = document.body.clientHeight;\r
68 d.innerWidth = document.body.clientWidth;\r
69 }\r
70 (e.pageX) ? x = e.pageX : x = e.clientX + d.scrollLeft;\r
71 (e.pageY) ? y = e.pageY : y = e.clientY + d.scrollTop;\r
72 \r
73 // Show the menu\r
74 $(document).unbind('click');\r
75 $(menu).css({ top: y, left: x }).fadeIn(o.inSpeed);\r
76 // Hover events\r
77 $(menu).find('A').mouseover( function() {\r
78 $(menu).find('LI.hover').removeClass('hover');\r
79 $(this).parent().addClass('hover');\r
80 }).mouseout( function() {\r
81 $(menu).find('LI.hover').removeClass('hover');\r
82 });\r
83 \r
84 // Keyboard\r
85 $(document).keypress( function(e) {\r
86 switch( e.keyCode ) {\r
87 case 38: // up\r
88 if( $(menu).find('LI.hover').size() == 0 ) {\r
89 $(menu).find('LI:last').addClass('hover');\r
90 } else {\r
91 $(menu).find('LI.hover').removeClass('hover').prevAll('LI:not(.disabled)').eq(0).addClass('hover');\r
92 if( $(menu).find('LI.hover').size() == 0 ) $(menu).find('LI:last').addClass('hover');\r
93 }\r
94 break;\r
95 case 40: // down\r
96 if( $(menu).find('LI.hover').size() == 0 ) {\r
97 $(menu).find('LI:first').addClass('hover');\r
98 } else {\r
99 $(menu).find('LI.hover').removeClass('hover').nextAll('LI:not(.disabled)').eq(0).addClass('hover');\r
100 if( $(menu).find('LI.hover').size() == 0 ) $(menu).find('LI:first').addClass('hover');\r
101 }\r
102 break;\r
103 case 13: // enter\r
104 $(menu).find('LI.hover A').trigger('click');\r
105 break;\r
106 case 27: // esc\r
107 $(document).trigger('click');\r
108 break\r
109 }\r
110 });\r
111 \r
112 // When items are selected\r
113 $('#' + o.menu).find('A').unbind('click');\r
114 $('#' + o.menu).find('LI:not(.disabled) A').click( function() {\r
115 $(document).unbind('click').unbind('keypress');\r
116 $(".contextMenu").hide();\r
117 // Callback\r
118 if( callback ) callback( $(this).attr('href').substr(1), $(srcElement), {x: x - offset.left, y: y - offset.top, docX: x, docY: y} );\r
119 return false;\r
120 });\r
121 \r
122 // Hide bindings\r
123 setTimeout( function() { // Delay for Mozilla\r
124 $(document).click( function() {\r
125 $(document).unbind('click').unbind('keypress');\r
126 $(menu).fadeOut(o.outSpeed);\r
127 return false;\r
128 });\r
129 }, 0);\r
130 }\r
131 });\r
132 });\r
133 \r
134 // Disable text selection\r
135 if( $.browser.mozilla ) {\r
136 $('#' + o.menu).each( function() { $(this).css({ 'MozUserSelect' : 'none' }); });\r
137 } else if( $.browser.msie ) {\r
138 $('#' + o.menu).each( function() { $(this).bind('selectstart.disableTextSelect', function() { return false; }); });\r
139 } else {\r
140 $('#' + o.menu).each(function() { $(this).bind('mousedown.disableTextSelect', function() { return false; }); });\r
141 }\r
142 // Disable browser context menu (requires both selectors to work in IE/Safari + FF/Chrome)\r
143 $(el).add($('UL.contextMenu')).bind('contextmenu', function() { return false; });\r
144 \r
145 });\r
146 return $(this);\r
147 },\r
148 \r
149 // Disable context menu items on the fly\r
150 disableContextMenuItems: function(o) {\r
151 if( o == undefined ) {\r
152 // Disable all\r
153 $(this).find('LI').addClass('disabled');\r
154 return( $(this) );\r
155 }\r
156 $(this).each( function() {\r
157 if( o != undefined ) {\r
158 var d = o.split(',');\r
159 for( var i = 0; i < d.length; i++ ) {\r
160 $(this).find('A[href="' + d[i] + '"]').parent().addClass('disabled');\r
161 \r
162 }\r
163 }\r
164 });\r
165 return( $(this) );\r
166 },\r
167 \r
168 // Enable context menu items on the fly\r
169 enableContextMenuItems: function(o) {\r
170 if( o == undefined ) {\r
171 // Enable all\r
172 $(this).find('LI.disabled').removeClass('disabled');\r
173 return( $(this) );\r
174 }\r
175 $(this).each( function() {\r
176 if( o != undefined ) {\r
177 var d = o.split(',');\r
178 for( var i = 0; i < d.length; i++ ) {\r
179 $(this).find('A[href="' + d[i] + '"]').parent().removeClass('disabled');\r
180 \r
181 }\r
182 }\r
183 });\r
184 return( $(this) );\r
185 },\r
186 \r
187 // Disable context menu(s)\r
188 disableContextMenu: function() {\r
189 $(this).each( function() {\r
190 $(this).addClass('disabled');\r
191 });\r
192 return( $(this) );\r
193 },\r
194 \r
195 // Enable context menu(s)\r
196 enableContextMenu: function() {\r
197 $(this).each( function() {\r
198 $(this).removeClass('disabled');\r
199 });\r
200 return( $(this) );\r
201 },\r
202 \r
203 // Destroy context menu(s)\r
204 destroyContextMenu: function() {\r
205 // Destroy specified context menus\r
206 $(this).each( function() {\r
207 // Disable action\r
208 $(this).unbind('mousedown').unbind('mouseup');\r
209 });\r
210 return( $(this) );\r
211 }\r
212 \r
213 });\r
214})(jQuery);\r