##// END OF EJS Templates
Merged r9391 from trunk....
Jean-Philippe Lang -
r9269:4c330a1241aa
parent child
Show More
@@ -1,523 +1,535
1 /* Redmine - project management software
1 /* Redmine - project management software
2 Copyright (C) 2006-2012 Jean-Philippe Lang */
2 Copyright (C) 2006-2012 Jean-Philippe Lang */
3
3
4 function checkAll (id, checked) {
4 function checkAll (id, checked) {
5 var els = Element.descendants(id);
5 var els = Element.descendants(id);
6 for (var i = 0; i < els.length; i++) {
6 for (var i = 0; i < els.length; i++) {
7 if (els[i].disabled==false) {
7 if (els[i].disabled==false) {
8 els[i].checked = checked;
8 els[i].checked = checked;
9 }
9 }
10 }
10 }
11 }
11 }
12
12
13 function toggleCheckboxesBySelector(selector) {
13 function toggleCheckboxesBySelector(selector) {
14 boxes = $$(selector);
14 boxes = $$(selector);
15 var all_checked = true;
15 var all_checked = true;
16 for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } }
16 for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } }
17 for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; }
17 for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; }
18 }
18 }
19
19
20 function setCheckboxesBySelector(checked, selector) {
20 function setCheckboxesBySelector(checked, selector) {
21 var boxes = $$(selector);
21 var boxes = $$(selector);
22 boxes.each(function(ele) {
22 boxes.each(function(ele) {
23 ele.checked = checked;
23 ele.checked = checked;
24 });
24 });
25 }
25 }
26
26
27 function showAndScrollTo(id, focus) {
27 function showAndScrollTo(id, focus) {
28 Element.show(id);
28 Element.show(id);
29 if (focus!=null) { Form.Element.focus(focus); }
29 if (focus!=null) { Form.Element.focus(focus); }
30 Element.scrollTo(id);
30 Element.scrollTo(id);
31 }
31 }
32
32
33 function toggleRowGroup(el) {
33 function toggleRowGroup(el) {
34 var tr = Element.up(el, 'tr');
34 var tr = Element.up(el, 'tr');
35 var n = Element.next(tr);
35 var n = Element.next(tr);
36 tr.toggleClassName('open');
36 tr.toggleClassName('open');
37 while (n != undefined && !n.hasClassName('group')) {
37 while (n != undefined && !n.hasClassName('group')) {
38 Element.toggle(n);
38 Element.toggle(n);
39 n = Element.next(n);
39 n = Element.next(n);
40 }
40 }
41 }
41 }
42
42
43 function collapseAllRowGroups(el) {
43 function collapseAllRowGroups(el) {
44 var tbody = Element.up(el, 'tbody');
44 var tbody = Element.up(el, 'tbody');
45 tbody.childElements('tr').each(function(tr) {
45 tbody.childElements('tr').each(function(tr) {
46 if (tr.hasClassName('group')) {
46 if (tr.hasClassName('group')) {
47 tr.removeClassName('open');
47 tr.removeClassName('open');
48 } else {
48 } else {
49 tr.hide();
49 tr.hide();
50 }
50 }
51 })
51 })
52 }
52 }
53
53
54 function expandAllRowGroups(el) {
54 function expandAllRowGroups(el) {
55 var tbody = Element.up(el, 'tbody');
55 var tbody = Element.up(el, 'tbody');
56 tbody.childElements('tr').each(function(tr) {
56 tbody.childElements('tr').each(function(tr) {
57 if (tr.hasClassName('group')) {
57 if (tr.hasClassName('group')) {
58 tr.addClassName('open');
58 tr.addClassName('open');
59 } else {
59 } else {
60 tr.show();
60 tr.show();
61 }
61 }
62 })
62 })
63 }
63 }
64
64
65 function toggleAllRowGroups(el) {
65 function toggleAllRowGroups(el) {
66 var tr = Element.up(el, 'tr');
66 var tr = Element.up(el, 'tr');
67 if (tr.hasClassName('open')) {
67 if (tr.hasClassName('open')) {
68 collapseAllRowGroups(el);
68 collapseAllRowGroups(el);
69 } else {
69 } else {
70 expandAllRowGroups(el);
70 expandAllRowGroups(el);
71 }
71 }
72 }
72 }
73
73
74 function toggleFieldset(el) {
74 function toggleFieldset(el) {
75 var fieldset = Element.up(el, 'fieldset');
75 var fieldset = Element.up(el, 'fieldset');
76 fieldset.toggleClassName('collapsed');
76 fieldset.toggleClassName('collapsed');
77 Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
77 Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
78 }
78 }
79
79
80 function hideFieldset(el) {
80 function hideFieldset(el) {
81 var fieldset = Element.up(el, 'fieldset');
81 var fieldset = Element.up(el, 'fieldset');
82 fieldset.toggleClassName('collapsed');
82 fieldset.toggleClassName('collapsed');
83 fieldset.down('div').hide();
83 fieldset.down('div').hide();
84 }
84 }
85
85
86 function add_filter() {
86 function add_filter() {
87 select = $('add_filter_select');
87 select = $('add_filter_select');
88 field = select.value
88 field = select.value
89 Element.show('tr_' + field);
89 Element.show('tr_' + field);
90 check_box = $('cb_' + field);
90 check_box = $('cb_' + field);
91 check_box.checked = true;
91 check_box.checked = true;
92 toggle_filter(field);
92 toggle_filter(field);
93 select.selectedIndex = 0;
93 select.selectedIndex = 0;
94
94
95 for (i=0; i<select.options.length; i++) {
95 for (i=0; i<select.options.length; i++) {
96 if (select.options[i].value == field) {
96 if (select.options[i].value == field) {
97 select.options[i].disabled = true;
97 select.options[i].disabled = true;
98 }
98 }
99 }
99 }
100 }
100 }
101
101
102 function toggle_filter(field) {
102 function toggle_filter(field) {
103 check_box = $('cb_' + field);
103 check_box = $('cb_' + field);
104 if (check_box.checked) {
104 if (check_box.checked) {
105 Element.show("operators_" + field);
105 Element.show("operators_" + field);
106 Form.Element.enable("operators_" + field);
106 Form.Element.enable("operators_" + field);
107 toggle_operator(field);
107 toggle_operator(field);
108 } else {
108 } else {
109 Element.hide("operators_" + field);
109 Element.hide("operators_" + field);
110 Form.Element.disable("operators_" + field);
110 Form.Element.disable("operators_" + field);
111 enableValues(field, []);
111 enableValues(field, []);
112 }
112 }
113 }
113 }
114
114
115 function enableValues(field, indexes) {
115 function enableValues(field, indexes) {
116 var f = $$(".values_" + field);
116 var f = $$(".values_" + field);
117 for(var i=0;i<f.length;i++) {
117 for(var i=0;i<f.length;i++) {
118 if (indexes.include(i)) {
118 if (indexes.include(i)) {
119 Form.Element.enable(f[i]);
119 Form.Element.enable(f[i]);
120 f[i].up('span').show();
120 f[i].up('span').show();
121 } else {
121 } else {
122 f[i].value = '';
122 f[i].value = '';
123 Form.Element.disable(f[i]);
123 Form.Element.disable(f[i]);
124 f[i].up('span').hide();
124 f[i].up('span').hide();
125 }
125 }
126 }
126 }
127 if (indexes.length > 0) {
127 if (indexes.length > 0) {
128 Element.show("div_values_" + field);
128 Element.show("div_values_" + field);
129 } else {
129 } else {
130 Element.hide("div_values_" + field);
130 Element.hide("div_values_" + field);
131 }
131 }
132 }
132 }
133
133
134 function toggle_operator(field) {
134 function toggle_operator(field) {
135 operator = $("operators_" + field);
135 operator = $("operators_" + field);
136 switch (operator.value) {
136 switch (operator.value) {
137 case "!*":
137 case "!*":
138 case "*":
138 case "*":
139 case "t":
139 case "t":
140 case "w":
140 case "w":
141 case "o":
141 case "o":
142 case "c":
142 case "c":
143 enableValues(field, []);
143 enableValues(field, []);
144 break;
144 break;
145 case "><":
145 case "><":
146 enableValues(field, [0,1]);
146 enableValues(field, [0,1]);
147 break;
147 break;
148 case "<t+":
148 case "<t+":
149 case ">t+":
149 case ">t+":
150 case "t+":
150 case "t+":
151 case ">t-":
151 case ">t-":
152 case "<t-":
152 case "<t-":
153 case "t-":
153 case "t-":
154 enableValues(field, [2]);
154 enableValues(field, [2]);
155 break;
155 break;
156 default:
156 default:
157 enableValues(field, [0]);
157 enableValues(field, [0]);
158 break;
158 break;
159 }
159 }
160 }
160 }
161
161
162 function toggle_multi_select(el) {
162 function toggle_multi_select(el) {
163 var select = $(el);
163 var select = $(el);
164 if (select.multiple == true) {
164 if (select.multiple == true) {
165 select.multiple = false;
165 select.multiple = false;
166 } else {
166 } else {
167 select.multiple = true;
167 select.multiple = true;
168 }
168 }
169 }
169 }
170
170
171 function submit_query_form(id) {
171 function submit_query_form(id) {
172 selectAllOptions("selected_columns");
172 selectAllOptions("selected_columns");
173 $(id).submit();
173 $(id).submit();
174 }
174 }
175
175
176 function apply_filters_observer() {
176 function apply_filters_observer() {
177 $$("#query_form input[type=text]").invoke("observe", "keypress", function(e){
177 $$("#query_form input[type=text]").invoke("observe", "keypress", function(e){
178 if(e.keyCode == Event.KEY_RETURN) {
178 if(e.keyCode == Event.KEY_RETURN) {
179 submit_query_form("query_form");
179 submit_query_form("query_form");
180 }
180 }
181 });
181 });
182 }
182 }
183
183
184 var fileFieldCount = 1;
184 var fileFieldCount = 1;
185
185
186 function addFileField() {
186 function addFileField() {
187 var fields = $('attachments_fields');
187 var fields = $('attachments_fields');
188 if (fields.childElements().length >= 10) return false;
188 if (fields.childElements().length >= 10) return false;
189 fileFieldCount++;
189 fileFieldCount++;
190 var s = new Element('span');
190 var s = new Element('span');
191 s.update(fields.down('span').innerHTML);
191 s.update(fields.down('span').innerHTML);
192 s.down('input.file').name = "attachments[" + fileFieldCount + "][file]";
192 s.down('input.file').name = "attachments[" + fileFieldCount + "][file]";
193 s.down('input.description').name = "attachments[" + fileFieldCount + "][description]";
193 s.down('input.description').name = "attachments[" + fileFieldCount + "][description]";
194 fields.appendChild(s);
194 fields.appendChild(s);
195 }
195 }
196
196
197 function removeFileField(el) {
197 function removeFileField(el) {
198 var fields = $('attachments_fields');
198 var fields = $('attachments_fields');
199 var s = Element.up(el, 'span');
199 var s = Element.up(el, 'span');
200 if (fields.childElements().length > 1) {
200 if (fields.childElements().length > 1) {
201 s.remove();
201 s.remove();
202 } else {
202 } else {
203 s.update(s.innerHTML);
203 s.update(s.innerHTML);
204 }
204 }
205 }
205 }
206
206
207 function checkFileSize(el, maxSize, message) {
207 function checkFileSize(el, maxSize, message) {
208 var files = el.files;
208 var files = el.files;
209 if (files) {
209 if (files) {
210 for (var i=0; i<files.length; i++) {
210 for (var i=0; i<files.length; i++) {
211 if (files[i].size > maxSize) {
211 if (files[i].size > maxSize) {
212 alert(message);
212 alert(message);
213 el.value = "";
213 el.value = "";
214 }
214 }
215 }
215 }
216 }
216 }
217 }
217 }
218
218
219 function showTab(name) {
219 function showTab(name) {
220 var f = $$('div#content .tab-content');
220 var f = $$('div#content .tab-content');
221 for(var i=0; i<f.length; i++){
221 for(var i=0; i<f.length; i++){
222 Element.hide(f[i]);
222 Element.hide(f[i]);
223 }
223 }
224 var f = $$('div.tabs a');
224 var f = $$('div.tabs a');
225 for(var i=0; i<f.length; i++){
225 for(var i=0; i<f.length; i++){
226 Element.removeClassName(f[i], "selected");
226 Element.removeClassName(f[i], "selected");
227 }
227 }
228 Element.show('tab-content-' + name);
228 Element.show('tab-content-' + name);
229 Element.addClassName('tab-' + name, "selected");
229 Element.addClassName('tab-' + name, "selected");
230 return false;
230 return false;
231 }
231 }
232
232
233 function moveTabRight(el) {
233 function moveTabRight(el) {
234 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
234 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
235 var tabsWidth = 0;
235 var tabsWidth = 0;
236 var i;
236 var i;
237 for (i=0; i<lis.length; i++) {
237 for (i=0; i<lis.length; i++) {
238 if (lis[i].visible()) {
238 if (lis[i].visible()) {
239 tabsWidth += lis[i].getWidth() + 6;
239 tabsWidth += lis[i].getWidth() + 6;
240 }
240 }
241 }
241 }
242 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
242 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
243 return;
243 return;
244 }
244 }
245 i=0;
245 i=0;
246 while (i<lis.length && !lis[i].visible()) {
246 while (i<lis.length && !lis[i].visible()) {
247 i++;
247 i++;
248 }
248 }
249 lis[i].hide();
249 lis[i].hide();
250 }
250 }
251
251
252 function moveTabLeft(el) {
252 function moveTabLeft(el) {
253 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
253 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
254 var i = 0;
254 var i = 0;
255 while (i<lis.length && !lis[i].visible()) {
255 while (i<lis.length && !lis[i].visible()) {
256 i++;
256 i++;
257 }
257 }
258 if (i>0) {
258 if (i>0) {
259 lis[i-1].show();
259 lis[i-1].show();
260 }
260 }
261 }
261 }
262
262
263 function displayTabsButtons() {
263 function displayTabsButtons() {
264 var lis;
264 var lis;
265 var tabsWidth = 0;
265 var tabsWidth = 0;
266 var i;
266 var i;
267 $$('div.tabs').each(function(el) {
267 $$('div.tabs').each(function(el) {
268 lis = el.down('ul').childElements();
268 lis = el.down('ul').childElements();
269 for (i=0; i<lis.length; i++) {
269 for (i=0; i<lis.length; i++) {
270 if (lis[i].visible()) {
270 if (lis[i].visible()) {
271 tabsWidth += lis[i].getWidth() + 6;
271 tabsWidth += lis[i].getWidth() + 6;
272 }
272 }
273 }
273 }
274 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
274 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
275 el.down('div.tabs-buttons').hide();
275 el.down('div.tabs-buttons').hide();
276 } else {
276 } else {
277 el.down('div.tabs-buttons').show();
277 el.down('div.tabs-buttons').show();
278 }
278 }
279 });
279 });
280 }
280 }
281
281
282 function setPredecessorFieldsVisibility() {
282 function setPredecessorFieldsVisibility() {
283 relationType = $('relation_relation_type');
283 relationType = $('relation_relation_type');
284 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
284 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
285 Element.show('predecessor_fields');
285 Element.show('predecessor_fields');
286 } else {
286 } else {
287 Element.hide('predecessor_fields');
287 Element.hide('predecessor_fields');
288 }
288 }
289 }
289 }
290
290
291 function promptToRemote(text, param, url) {
291 function promptToRemote(text, param, url) {
292 value = prompt(text + ':');
292 value = prompt(text + ':');
293 if (value) {
293 if (value) {
294 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
294 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
295 return false;
295 return false;
296 }
296 }
297 }
297 }
298
298
299 function showModal(id, width) {
299 function showModal(id, width) {
300 el = $(id);
300 el = $(id);
301 if (el == undefined || el.visible()) {return;}
301 if (el == undefined || el.visible()) {return;}
302 var h = $$('body')[0].getHeight();
302 var h = $$('body')[0].getHeight();
303 var d = document.createElement("div");
303 var d = document.createElement("div");
304 d.id = 'modalbg';
304 d.id = 'modalbg';
305 $('main').appendChild(d);
305 $('main').appendChild(d);
306 $('modalbg').setStyle({ width: '100%', height: h + 'px' });
306 $('modalbg').setStyle({ width: '100%', height: h + 'px' });
307 $('modalbg').show();
307 $('modalbg').show();
308
308
309 var pageWidth = document.viewport.getWidth();
309 var pageWidth = document.viewport.getWidth();
310 if (width) {
310 if (width) {
311 el.setStyle({'width': width});
311 el.setStyle({'width': width});
312 }
312 }
313 el.setStyle({'left': (((pageWidth - el.getWidth())/2 *100) / pageWidth) + '%'});
313 el.setStyle({'left': (((pageWidth - el.getWidth())/2 *100) / pageWidth) + '%'});
314 el.addClassName('modal');
314 el.addClassName('modal');
315 el.show();
315 el.show();
316
316
317 if (el.down("input[type=text]")) {
317 if (el.down("input[type=text]")) {
318 el.down("input[type=text]").focus();
318 el.down("input[type=text]").focus();
319 } else if (el.down("input[type=submit]")) {
319 } else if (el.down("input[type=submit]")) {
320 el.down("input[type=submit]").focus();
320 el.down("input[type=submit]").focus();
321 }
321 }
322 }
322 }
323
323
324 function hideModal(el) {
324 function hideModal(el) {
325 var modal;
325 var modal;
326 if (el) {
326 if (el) {
327 modal = Element.up(el, 'div.modal');
327 modal = Element.up(el, 'div.modal');
328 } else {
328 } else {
329 modal = $('ajax-modal');
329 modal = $('ajax-modal');
330 }
330 }
331 if (modal) {
331 if (modal) {
332 modal.hide();
332 modal.hide();
333 }
333 }
334 var bg = $('modalbg');
334 var bg = $('modalbg');
335 if (bg) {
335 if (bg) {
336 bg.remove();
336 bg.remove();
337 }
337 }
338 }
338 }
339
339
340 function collapseScmEntry(id) {
340 function collapseScmEntry(id) {
341 var els = document.getElementsByClassName(id, 'browser');
341 var els = document.getElementsByClassName(id, 'browser');
342 for (var i = 0; i < els.length; i++) {
342 for (var i = 0; i < els.length; i++) {
343 if (els[i].hasClassName('open')) {
343 if (els[i].hasClassName('open')) {
344 collapseScmEntry(els[i].id);
344 collapseScmEntry(els[i].id);
345 }
345 }
346 Element.hide(els[i]);
346 Element.hide(els[i]);
347 }
347 }
348 $(id).removeClassName('open');
348 $(id).removeClassName('open');
349 }
349 }
350
350
351 function expandScmEntry(id) {
351 function expandScmEntry(id) {
352 var els = document.getElementsByClassName(id, 'browser');
352 var els = document.getElementsByClassName(id, 'browser');
353 for (var i = 0; i < els.length; i++) {
353 for (var i = 0; i < els.length; i++) {
354 Element.show(els[i]);
354 Element.show(els[i]);
355 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
355 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
356 expandScmEntry(els[i].id);
356 expandScmEntry(els[i].id);
357 }
357 }
358 }
358 }
359 $(id).addClassName('open');
359 $(id).addClassName('open');
360 }
360 }
361
361
362 function scmEntryClick(id) {
362 function scmEntryClick(id) {
363 el = $(id);
363 el = $(id);
364 if (el.hasClassName('open')) {
364 if (el.hasClassName('open')) {
365 collapseScmEntry(id);
365 collapseScmEntry(id);
366 el.addClassName('collapsed');
366 el.addClassName('collapsed');
367 return false;
367 return false;
368 } else if (el.hasClassName('loaded')) {
368 } else if (el.hasClassName('loaded')) {
369 expandScmEntry(id);
369 expandScmEntry(id);
370 el.removeClassName('collapsed');
370 el.removeClassName('collapsed');
371 return false;
371 return false;
372 }
372 }
373 if (el.hasClassName('loading')) {
373 if (el.hasClassName('loading')) {
374 return false;
374 return false;
375 }
375 }
376 el.addClassName('loading');
376 el.addClassName('loading');
377 return true;
377 return true;
378 }
378 }
379
379
380 function scmEntryLoaded(id) {
380 function scmEntryLoaded(id) {
381 Element.addClassName(id, 'open');
381 Element.addClassName(id, 'open');
382 Element.addClassName(id, 'loaded');
382 Element.addClassName(id, 'loaded');
383 Element.removeClassName(id, 'loading');
383 Element.removeClassName(id, 'loading');
384 }
384 }
385
385
386 function randomKey(size) {
386 function randomKey(size) {
387 var chars = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
387 var chars = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
388 var key = '';
388 var key = '';
389 for (i = 0; i < size; i++) {
389 for (i = 0; i < size; i++) {
390 key += chars[Math.floor(Math.random() * chars.length)];
390 key += chars[Math.floor(Math.random() * chars.length)];
391 }
391 }
392 return key;
392 return key;
393 }
393 }
394
394
395 function observeParentIssueField(url) {
395 function observeParentIssueField(url) {
396 new Ajax.Autocompleter('issue_parent_issue_id',
396 new Ajax.Autocompleter('issue_parent_issue_id',
397 'parent_issue_candidates',
397 'parent_issue_candidates',
398 url,
398 url,
399 { minChars: 3,
399 { minChars: 3,
400 frequency: 0.5,
400 frequency: 0.5,
401 paramName: 'q',
401 paramName: 'q',
402 method: 'get',
402 method: 'get',
403 updateElement: function(value) {
403 updateElement: function(value) {
404 document.getElementById('issue_parent_issue_id').value = value.id;
404 document.getElementById('issue_parent_issue_id').value = value.id;
405 }});
405 }});
406 }
406 }
407
407
408 function observeRelatedIssueField(url) {
408 function observeRelatedIssueField(url) {
409 new Ajax.Autocompleter('relation_issue_to_id',
409 new Ajax.Autocompleter('relation_issue_to_id',
410 'related_issue_candidates',
410 'related_issue_candidates',
411 url,
411 url,
412 { minChars: 3,
412 { minChars: 3,
413 frequency: 0.5,
413 frequency: 0.5,
414 paramName: 'q',
414 paramName: 'q',
415 method: 'get',
415 method: 'get',
416 updateElement: function(value) {
416 updateElement: function(value) {
417 document.getElementById('relation_issue_to_id').value = value.id;
417 document.getElementById('relation_issue_to_id').value = value.id;
418 },
418 },
419 parameters: 'scope=all'
419 parameters: 'scope=all'
420 });
420 });
421 }
421 }
422
422
423 function setVisible(id, visible) {
423 function setVisible(id, visible) {
424 var el = $(id);
424 var el = $(id);
425 if (el) {if (visible) {el.show();} else {el.hide();}}
425 if (el) {if (visible) {el.show();} else {el.hide();}}
426 }
426 }
427
427
428 function observeProjectModules() {
428 function observeProjectModules() {
429 var f = function() {
429 var f = function() {
430 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
430 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
431 var c = ($('project_enabled_module_names_issue_tracking').checked == true);
431 var c = ($('project_enabled_module_names_issue_tracking').checked == true);
432 setVisible('project_trackers', c);
432 setVisible('project_trackers', c);
433 setVisible('project_issue_custom_fields', c);
433 setVisible('project_issue_custom_fields', c);
434 };
434 };
435
435
436 Event.observe(window, 'load', f);
436 Event.observe(window, 'load', f);
437 Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
437 Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
438 }
438 }
439
439
440 /*
440 /*
441 * Class used to warn user when leaving a page with unsaved textarea
441 * Class used to warn user when leaving a page with unsaved textarea
442 * Author: mathias.fischer@berlinonline.de
442 * Author: mathias.fischer@berlinonline.de
443 */
443 */
444
444
445 var WarnLeavingUnsaved = Class.create({
445 var WarnLeavingUnsaved = Class.create({
446 observedForms: false,
446 observedForms: false,
447 observedElements: false,
447 observedElements: false,
448 changedForms: false,
448 changedForms: false,
449 message: null,
449 message: null,
450
450
451 initialize: function(message){
451 initialize: function(message){
452 this.observedForms = $$('form');
452 this.observedForms = $$('form');
453 this.observedElements = $$('textarea');
453 this.observedElements = $$('textarea');
454 this.message = message;
454 this.message = message;
455
455
456 this.observedElements.each(this.observeChange.bind(this));
456 this.observedElements.each(this.observeChange.bind(this));
457 this.observedForms.each(this.submitAction.bind(this));
457 this.observedForms.each(this.submitAction.bind(this));
458
458
459 window.onbeforeunload = this.unload.bind(this);
459 window.onbeforeunload = this.unload.bind(this);
460 },
460 },
461
461
462 unload: function(){
462 unload: function(){
463 this.observedElements.each(function(el) {el.blur();})
463 this.observedElements.each(function(el) {el.blur();})
464 if(this.changedForms)
464 if(this.changedForms)
465 return this.message;
465 return this.message;
466 },
466 },
467
467
468 setChanged: function(){
468 setChanged: function(){
469 this.changedForms = true;
469 this.changedForms = true;
470 },
470 },
471
471
472 setUnchanged: function(){
472 setUnchanged: function(){
473 this.changedForms = false;
473 this.changedForms = false;
474 },
474 },
475
475
476 observeChange: function(element){
476 observeChange: function(element){
477 element.observe('change',this.setChanged.bindAsEventListener(this));
477 element.observe('change',this.setChanged.bindAsEventListener(this));
478 },
478 },
479
479
480 submitAction: function(element){
480 submitAction: function(element){
481 element.observe('submit',this.setUnchanged.bindAsEventListener(this));
481 element.observe('submit',this.setUnchanged.bindAsEventListener(this));
482 }
482 }
483 });
483 });
484
484
485 /*
485 /*
486 * 1 - registers a callback which copies the csrf token into the
486 * 1 - registers a callback which copies the csrf token into the
487 * X-CSRF-Token header with each ajax request. Necessary to
487 * X-CSRF-Token header with each ajax request. Necessary to
488 * work with rails applications which have fixed
488 * work with rails applications which have fixed
489 * CVE-2011-0447
489 * CVE-2011-0447
490 * 2 - shows and hides ajax indicator
490 * 2 - shows and hides ajax indicator
491 */
491 */
492 Ajax.Responders.register({
492 Ajax.Responders.register({
493 onCreate: function(request){
493 onCreate: function(request){
494 var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
494 var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
495
495
496 if (csrf_meta_tag) {
496 if (csrf_meta_tag) {
497 var header = 'X-CSRF-Token',
497 var header = 'X-CSRF-Token',
498 token = csrf_meta_tag.readAttribute('content');
498 token = csrf_meta_tag.readAttribute('content');
499
499
500 if (!request.options.requestHeaders) {
500 if (!request.options.requestHeaders) {
501 request.options.requestHeaders = {};
501 request.options.requestHeaders = {};
502 }
502 }
503 request.options.requestHeaders[header] = token;
503 request.options.requestHeaders[header] = token;
504 }
504 }
505
505
506 if ($('ajax-indicator') && Ajax.activeRequestCount > 0 && $$('input.ajax-loading').size() == 0) {
506 if ($('ajax-indicator') && Ajax.activeRequestCount > 0 && $$('input.ajax-loading').size() == 0) {
507 Element.show('ajax-indicator');
507 Element.show('ajax-indicator');
508 }
508 }
509 },
509 },
510 onComplete: function(){
510 onComplete: function(){
511 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
511 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
512 Element.hide('ajax-indicator');
512 Element.hide('ajax-indicator');
513 }
513 }
514 }
514 }
515 });
515 });
516
516
517 function hideOnLoad() {
517 function hideOnLoad() {
518 $$('.hol').each(function(el) {
518 $$('.hol').each(function(el) {
519 el.hide();
519 el.hide();
520 });
520 });
521 }
521 }
522
522
523 function addFormObserversForDoubleSubmit() {
524 $$('form[method=post]').each(function(el) {
525 Event.observe(el, 'submit', function(e) {
526 var form = Event.element(e);
527 form.select('input[type=submit]').each(function(btn) {
528 btn.disable();
529 });
530 });
531 });
532 }
533
523 Event.observe(window, 'load', hideOnLoad);
534 Event.observe(window, 'load', hideOnLoad);
535 Event.observe(window, 'load', addFormObserversForDoubleSubmit);
General Comments 0
You need to be logged in to leave comments. Login now