Chris@1115
|
1 var contextMenuObserving;
|
Chris@1115
|
2 var contextMenuUrl;
|
Chris@0
|
3
|
Chris@1115
|
4 function contextMenuRightClick(event) {
|
Chris@1115
|
5 var target = $(event.target);
|
Chris@1115
|
6 if (target.is('a')) {return;}
|
Chris@1115
|
7 var tr = target.parents('tr').first();
|
Chris@1115
|
8 if (!tr.hasClass('hascontextmenu')) {return;}
|
Chris@1115
|
9 event.preventDefault();
|
Chris@1115
|
10 if (!contextMenuIsSelected(tr)) {
|
Chris@1115
|
11 contextMenuUnselectAll();
|
Chris@1115
|
12 contextMenuAddSelection(tr);
|
Chris@1115
|
13 contextMenuSetLastSelected(tr);
|
Chris@1115
|
14 }
|
Chris@1115
|
15 contextMenuShow(event);
|
Chris@1115
|
16 }
|
Chris@0
|
17
|
Chris@1115
|
18 function contextMenuClick(event) {
|
Chris@1115
|
19 var target = $(event.target);
|
Chris@1115
|
20 var lastSelected;
|
Chris@0
|
21
|
Chris@1115
|
22 if (target.is('a') && target.hasClass('submenu')) {
|
Chris@1115
|
23 event.preventDefault();
|
Chris@1115
|
24 return;
|
Chris@1115
|
25 }
|
Chris@1115
|
26 contextMenuHide();
|
Chris@1115
|
27 if (target.is('a') || target.is('img')) { return; }
|
Chris@1115
|
28 if (event.which == 1 || (navigator.appVersion.match(/\bMSIE\b/))) {
|
Chris@1115
|
29 var tr = target.parents('tr').first();
|
Chris@1115
|
30 if (tr.length && tr.hasClass('hascontextmenu')) {
|
Chris@1115
|
31 // a row was clicked, check if the click was on checkbox
|
Chris@1115
|
32 if (target.is('input')) {
|
Chris@1115
|
33 // a checkbox may be clicked
|
Chris@1115
|
34 if (target.attr('checked')) {
|
Chris@1115
|
35 tr.addClass('context-menu-selection');
|
Chris@1115
|
36 } else {
|
Chris@1115
|
37 tr.removeClass('context-menu-selection');
|
Chris@1115
|
38 }
|
Chris@1115
|
39 } else {
|
Chris@1115
|
40 if (event.ctrlKey || event.metaKey) {
|
Chris@1115
|
41 contextMenuToggleSelection(tr);
|
Chris@1115
|
42 } else if (event.shiftKey) {
|
Chris@1115
|
43 lastSelected = contextMenuLastSelected();
|
Chris@1115
|
44 if (lastSelected.length) {
|
Chris@1115
|
45 var toggling = false;
|
Chris@1115
|
46 $('.hascontextmenu').each(function(){
|
Chris@1115
|
47 if (toggling || $(this).is(tr)) {
|
Chris@1115
|
48 contextMenuAddSelection($(this));
|
Chris@1115
|
49 }
|
Chris@1115
|
50 if ($(this).is(tr) || $(this).is(lastSelected)) {
|
Chris@1115
|
51 toggling = !toggling;
|
Chris@1115
|
52 }
|
Chris@1115
|
53 });
|
Chris@0
|
54 } else {
|
Chris@1115
|
55 contextMenuAddSelection(tr);
|
Chris@0
|
56 }
|
Chris@0
|
57 } else {
|
Chris@1115
|
58 contextMenuUnselectAll();
|
Chris@1115
|
59 contextMenuAddSelection(tr);
|
Chris@0
|
60 }
|
Chris@1115
|
61 contextMenuSetLastSelected(tr);
|
Chris@1115
|
62 }
|
Chris@1115
|
63 } else {
|
Chris@1115
|
64 // click is outside the rows
|
Chris@1115
|
65 if (target.is('a') && (target.hasClass('disabled') || target.hasClass('submenu'))) {
|
Chris@1115
|
66 event.preventDefault();
|
Chris@0
|
67 } else {
|
Chris@1115
|
68 contextMenuUnselectAll();
|
Chris@0
|
69 }
|
Chris@0
|
70 }
|
Chris@0
|
71 }
|
Chris@0
|
72 }
|
Chris@0
|
73
|
Chris@1115
|
74 function contextMenuCreate() {
|
Chris@1115
|
75 if ($('#context-menu').length < 1) {
|
Chris@1115
|
76 var menu = document.createElement("div");
|
Chris@1115
|
77 menu.setAttribute("id", "context-menu");
|
Chris@1115
|
78 menu.setAttribute("style", "display:none;");
|
Chris@1115
|
79 document.getElementById("content").appendChild(menu);
|
Chris@1115
|
80 }
|
Chris@1115
|
81 }
|
Chris@1115
|
82
|
Chris@1115
|
83 function contextMenuShow(event) {
|
Chris@1115
|
84 var mouse_x = event.pageX;
|
Chris@1115
|
85 var mouse_y = event.pageY;
|
Chris@1115
|
86 var render_x = mouse_x;
|
Chris@1115
|
87 var render_y = mouse_y;
|
Chris@1115
|
88 var dims;
|
Chris@1115
|
89 var menu_width;
|
Chris@1115
|
90 var menu_height;
|
Chris@1115
|
91 var window_width;
|
Chris@1115
|
92 var window_height;
|
Chris@1115
|
93 var max_width;
|
Chris@1115
|
94 var max_height;
|
Chris@1115
|
95
|
Chris@1115
|
96 $('#context-menu').css('left', (render_x + 'px'));
|
Chris@1115
|
97 $('#context-menu').css('top', (render_y + 'px'));
|
Chris@1115
|
98 $('#context-menu').html('');
|
Chris@1115
|
99
|
Chris@1115
|
100 $.ajax({
|
Chris@1115
|
101 url: contextMenuUrl,
|
Chris@1115
|
102 data: $(event.target).parents('form').first().serialize(),
|
Chris@1115
|
103 success: function(data, textStatus, jqXHR) {
|
Chris@1115
|
104 $('#context-menu').html(data);
|
Chris@1115
|
105 menu_width = $('#context-menu').width();
|
Chris@1115
|
106 menu_height = $('#context-menu').height();
|
Chris@1115
|
107 max_width = mouse_x + 2*menu_width;
|
Chris@1115
|
108 max_height = mouse_y + menu_height;
|
Chris@1115
|
109
|
Chris@1115
|
110 var ws = window_size();
|
Chris@1115
|
111 window_width = ws.width;
|
Chris@1115
|
112 window_height = ws.height;
|
Chris@1115
|
113
|
Chris@1115
|
114 /* display the menu above and/or to the left of the click if needed */
|
Chris@1115
|
115 if (max_width > window_width) {
|
Chris@1115
|
116 render_x -= menu_width;
|
Chris@1115
|
117 $('#context-menu').addClass('reverse-x');
|
Chris@1115
|
118 } else {
|
Chris@1115
|
119 $('#context-menu').removeClass('reverse-x');
|
Chris@1115
|
120 }
|
Chris@1115
|
121 if (max_height > window_height) {
|
Chris@1115
|
122 render_y -= menu_height;
|
Chris@1115
|
123 $('#context-menu').addClass('reverse-y');
|
Chris@1115
|
124 } else {
|
Chris@1115
|
125 $('#context-menu').removeClass('reverse-y');
|
Chris@1115
|
126 }
|
Chris@1115
|
127 if (render_x <= 0) render_x = 1;
|
Chris@1115
|
128 if (render_y <= 0) render_y = 1;
|
Chris@1115
|
129 $('#context-menu').css('left', (render_x + 'px'));
|
Chris@1115
|
130 $('#context-menu').css('top', (render_y + 'px'));
|
Chris@1115
|
131 $('#context-menu').show();
|
Chris@1115
|
132
|
Chris@1115
|
133 //if (window.parseStylesheets) { window.parseStylesheets(); } // IE
|
Chris@1115
|
134
|
Chris@1115
|
135 }
|
Chris@1115
|
136 });
|
Chris@1115
|
137 }
|
Chris@1115
|
138
|
Chris@1115
|
139 function contextMenuSetLastSelected(tr) {
|
Chris@1115
|
140 $('.cm-last').removeClass('cm-last');
|
Chris@1115
|
141 tr.addClass('cm-last');
|
Chris@1115
|
142 }
|
Chris@1115
|
143
|
Chris@1115
|
144 function contextMenuLastSelected() {
|
Chris@1115
|
145 return $('.cm-last').first();
|
Chris@1115
|
146 }
|
Chris@1115
|
147
|
Chris@1115
|
148 function contextMenuUnselectAll() {
|
Chris@1115
|
149 $('.hascontextmenu').each(function(){
|
Chris@1115
|
150 contextMenuRemoveSelection($(this));
|
Chris@1115
|
151 });
|
Chris@1115
|
152 $('.cm-last').removeClass('cm-last');
|
Chris@1115
|
153 }
|
Chris@1115
|
154
|
Chris@1115
|
155 function contextMenuHide() {
|
Chris@1115
|
156 $('#context-menu').hide();
|
Chris@1115
|
157 }
|
Chris@1115
|
158
|
Chris@1115
|
159 function contextMenuToggleSelection(tr) {
|
Chris@1115
|
160 if (contextMenuIsSelected(tr)) {
|
Chris@1115
|
161 contextMenuRemoveSelection(tr);
|
Chris@1115
|
162 } else {
|
Chris@1115
|
163 contextMenuAddSelection(tr);
|
Chris@1115
|
164 }
|
Chris@1115
|
165 }
|
Chris@1115
|
166
|
Chris@1115
|
167 function contextMenuAddSelection(tr) {
|
Chris@1115
|
168 tr.addClass('context-menu-selection');
|
Chris@1115
|
169 contextMenuCheckSelectionBox(tr, true);
|
Chris@1115
|
170 contextMenuClearDocumentSelection();
|
Chris@1115
|
171 }
|
Chris@1115
|
172
|
Chris@1115
|
173 function contextMenuRemoveSelection(tr) {
|
Chris@1115
|
174 tr.removeClass('context-menu-selection');
|
Chris@1115
|
175 contextMenuCheckSelectionBox(tr, false);
|
Chris@1115
|
176 }
|
Chris@1115
|
177
|
Chris@1115
|
178 function contextMenuIsSelected(tr) {
|
Chris@1115
|
179 return tr.hasClass('context-menu-selection');
|
Chris@1115
|
180 }
|
Chris@1115
|
181
|
Chris@1115
|
182 function contextMenuCheckSelectionBox(tr, checked) {
|
Chris@1115
|
183 tr.find('input[type=checkbox]').attr('checked', checked);
|
Chris@1115
|
184 }
|
Chris@1115
|
185
|
Chris@1115
|
186 function contextMenuClearDocumentSelection() {
|
Chris@1115
|
187 // TODO
|
Chris@1115
|
188 if (document.selection) {
|
Chris@1115
|
189 document.selection.clear(); // IE
|
Chris@1115
|
190 } else {
|
Chris@1115
|
191 window.getSelection().removeAllRanges();
|
Chris@1115
|
192 }
|
Chris@1115
|
193 }
|
Chris@1115
|
194
|
Chris@1115
|
195 function contextMenuInit(url) {
|
Chris@1115
|
196 contextMenuUrl = url;
|
Chris@1115
|
197 contextMenuCreate();
|
Chris@1115
|
198 contextMenuUnselectAll();
|
Chris@1115
|
199
|
Chris@1115
|
200 if (!contextMenuObserving) {
|
Chris@1115
|
201 $(document).click(contextMenuClick);
|
Chris@1115
|
202 $(document).contextmenu(contextMenuRightClick);
|
Chris@1115
|
203 contextMenuObserving = true;
|
Chris@1115
|
204 }
|
Chris@1115
|
205 }
|
Chris@1115
|
206
|
Chris@0
|
207 function toggleIssuesSelection(el) {
|
Chris@1115
|
208 var boxes = $(el).parents('form').find('input[type=checkbox]');
|
Chris@1115
|
209 var all_checked = true;
|
Chris@1115
|
210 boxes.each(function(){ if (!$(this).attr('checked')) { all_checked = false; } });
|
Chris@1115
|
211 boxes.each(function(){
|
Chris@1115
|
212 if (all_checked) {
|
Chris@1115
|
213 $(this).removeAttr('checked');
|
Chris@1115
|
214 $(this).parents('tr').removeClass('context-menu-selection');
|
Chris@1115
|
215 } else if (!$(this).attr('checked')) {
|
Chris@1115
|
216 $(this).attr('checked', true);
|
Chris@1115
|
217 $(this).parents('tr').addClass('context-menu-selection');
|
Chris@1115
|
218 }
|
Chris@1115
|
219 });
|
Chris@0
|
220 }
|
Chris@0
|
221
|
Chris@0
|
222 function window_size() {
|
Chris@1115
|
223 var w;
|
Chris@1115
|
224 var h;
|
Chris@1115
|
225 if (window.innerWidth) {
|
Chris@1115
|
226 w = window.innerWidth;
|
Chris@1115
|
227 h = window.innerHeight;
|
Chris@1115
|
228 } else if (document.documentElement) {
|
Chris@1115
|
229 w = document.documentElement.clientWidth;
|
Chris@1115
|
230 h = document.documentElement.clientHeight;
|
Chris@1115
|
231 } else {
|
Chris@1115
|
232 w = document.body.clientWidth;
|
Chris@1115
|
233 h = document.body.clientHeight;
|
Chris@1115
|
234 }
|
Chris@1115
|
235 return {width: w, height: h};
|
Chris@0
|
236 }
|