##// END OF EJS Templates
Merged r8780 from trunk (#10115)....
Jean-Philippe Lang -
r8661:84c61545a95c
parent child
Show More
@@ -1,417 +1,417
1 1 /* redMine - project management software
2 2 Copyright (C) 2006-2008 Jean-Philippe Lang */
3 3
4 4 function checkAll (id, checked) {
5 5 var els = Element.descendants(id);
6 6 for (var i = 0; i < els.length; i++) {
7 7 if (els[i].disabled==false) {
8 8 els[i].checked = checked;
9 9 }
10 10 }
11 11 }
12 12
13 13 function toggleCheckboxesBySelector(selector) {
14 14 boxes = $$(selector);
15 15 var all_checked = true;
16 16 for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } }
17 17 for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; }
18 18 }
19 19
20 20 function setCheckboxesBySelector(checked, selector) {
21 21 var boxes = $$(selector);
22 22 boxes.each(function(ele) {
23 23 ele.checked = checked;
24 24 });
25 25 }
26 26
27 27 function showAndScrollTo(id, focus) {
28 28 Element.show(id);
29 29 if (focus!=null) { Form.Element.focus(focus); }
30 30 Element.scrollTo(id);
31 31 }
32 32
33 33 function toggleRowGroup(el) {
34 34 var tr = Element.up(el, 'tr');
35 35 var n = Element.next(tr);
36 36 tr.toggleClassName('open');
37 37 while (n != undefined && !n.hasClassName('group')) {
38 38 Element.toggle(n);
39 39 n = Element.next(n);
40 40 }
41 41 }
42 42
43 43 function collapseAllRowGroups(el) {
44 44 var tbody = Element.up(el, 'tbody');
45 45 tbody.childElements('tr').each(function(tr) {
46 46 if (tr.hasClassName('group')) {
47 47 tr.removeClassName('open');
48 48 } else {
49 49 tr.hide();
50 50 }
51 51 })
52 52 }
53 53
54 54 function expandAllRowGroups(el) {
55 55 var tbody = Element.up(el, 'tbody');
56 56 tbody.childElements('tr').each(function(tr) {
57 57 if (tr.hasClassName('group')) {
58 58 tr.addClassName('open');
59 59 } else {
60 60 tr.show();
61 61 }
62 62 })
63 63 }
64 64
65 65 function toggleAllRowGroups(el) {
66 66 var tr = Element.up(el, 'tr');
67 67 if (tr.hasClassName('open')) {
68 68 collapseAllRowGroups(el);
69 69 } else {
70 70 expandAllRowGroups(el);
71 71 }
72 72 }
73 73
74 74 function toggleFieldset(el) {
75 75 var fieldset = Element.up(el, 'fieldset');
76 76 fieldset.toggleClassName('collapsed');
77 77 Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
78 78 }
79 79
80 80 function hideFieldset(el) {
81 81 var fieldset = Element.up(el, 'fieldset');
82 82 fieldset.toggleClassName('collapsed');
83 83 fieldset.down('div').hide();
84 84 }
85 85
86 86 var fileFieldCount = 1;
87 87
88 88 function addFileField() {
89 89 var fields = $('attachments_fields');
90 90 if (fields.childElements().length >= 10) return false;
91 91 fileFieldCount++;
92 var s = document.createElement("span");
92 var s = new Element('span');
93 93 s.update(fields.down('span').innerHTML);
94 94 s.down('input.file').name = "attachments[" + fileFieldCount + "][file]";
95 95 s.down('input.description').name = "attachments[" + fileFieldCount + "][description]";
96 96 fields.appendChild(s);
97 97 }
98 98
99 99 function removeFileField(el) {
100 100 var fields = $('attachments_fields');
101 101 var s = Element.up(el, 'span');
102 102 if (fields.childElements().length > 1) {
103 103 s.remove();
104 104 } else {
105 105 s.update(s.innerHTML);
106 106 }
107 107 }
108 108
109 109 function checkFileSize(el, maxSize, message) {
110 110 var files = el.files;
111 111 if (files) {
112 112 for (var i=0; i<files.length; i++) {
113 113 if (files[i].size > maxSize) {
114 114 alert(message);
115 115 el.value = "";
116 116 }
117 117 }
118 118 }
119 119 }
120 120
121 121 function showTab(name) {
122 122 var f = $$('div#content .tab-content');
123 123 for(var i=0; i<f.length; i++){
124 124 Element.hide(f[i]);
125 125 }
126 126 var f = $$('div.tabs a');
127 127 for(var i=0; i<f.length; i++){
128 128 Element.removeClassName(f[i], "selected");
129 129 }
130 130 Element.show('tab-content-' + name);
131 131 Element.addClassName('tab-' + name, "selected");
132 132 return false;
133 133 }
134 134
135 135 function moveTabRight(el) {
136 136 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
137 137 var tabsWidth = 0;
138 138 var i;
139 139 for (i=0; i<lis.length; i++) {
140 140 if (lis[i].visible()) {
141 141 tabsWidth += lis[i].getWidth() + 6;
142 142 }
143 143 }
144 144 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
145 145 return;
146 146 }
147 147 i=0;
148 148 while (i<lis.length && !lis[i].visible()) {
149 149 i++;
150 150 }
151 151 lis[i].hide();
152 152 }
153 153
154 154 function moveTabLeft(el) {
155 155 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
156 156 var i = 0;
157 157 while (i<lis.length && !lis[i].visible()) {
158 158 i++;
159 159 }
160 160 if (i>0) {
161 161 lis[i-1].show();
162 162 }
163 163 }
164 164
165 165 function displayTabsButtons() {
166 166 var lis;
167 167 var tabsWidth = 0;
168 168 var i;
169 169 $$('div.tabs').each(function(el) {
170 170 lis = el.down('ul').childElements();
171 171 for (i=0; i<lis.length; i++) {
172 172 if (lis[i].visible()) {
173 173 tabsWidth += lis[i].getWidth() + 6;
174 174 }
175 175 }
176 176 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
177 177 el.down('div.tabs-buttons').hide();
178 178 } else {
179 179 el.down('div.tabs-buttons').show();
180 180 }
181 181 });
182 182 }
183 183
184 184 function setPredecessorFieldsVisibility() {
185 185 relationType = $('relation_relation_type');
186 186 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
187 187 Element.show('predecessor_fields');
188 188 } else {
189 189 Element.hide('predecessor_fields');
190 190 }
191 191 }
192 192
193 193 function promptToRemote(text, param, url) {
194 194 value = prompt(text + ':');
195 195 if (value) {
196 196 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
197 197 return false;
198 198 }
199 199 }
200 200
201 201 function showModal(id, width) {
202 202 el = $(id);
203 203 if (el == undefined || el.visible()) {return;}
204 204 var h = $$('body')[0].getHeight();
205 205 var d = document.createElement("div");
206 206 d.id = 'modalbg';
207 207 $('main').appendChild(d);
208 208 $('modalbg').setStyle({ width: '100%', height: h + 'px' });
209 209 $('modalbg').show();
210 210
211 211 var pageWidth = document.viewport.getWidth();
212 212 el.setStyle({'width': width});
213 213 el.setStyle({'left': (((pageWidth - el.getWidth())/2 *100) / pageWidth) + '%'});
214 214 el.addClassName('modal');
215 215 el.show();
216 216
217 217 var submit = el.down("input[type=submit]");
218 218 if (submit) {
219 219 submit.focus();
220 220 }
221 221 }
222 222
223 223 function hideModal(el) {
224 224 var modal = Element.up(el, 'div.modal');
225 225 if (modal) {
226 226 modal.hide();
227 227 }
228 228 var bg = $('modalbg');
229 229 if (bg) {
230 230 bg.remove();
231 231 }
232 232 }
233 233
234 234 function collapseScmEntry(id) {
235 235 var els = document.getElementsByClassName(id, 'browser');
236 236 for (var i = 0; i < els.length; i++) {
237 237 if (els[i].hasClassName('open')) {
238 238 collapseScmEntry(els[i].id);
239 239 }
240 240 Element.hide(els[i]);
241 241 }
242 242 $(id).removeClassName('open');
243 243 }
244 244
245 245 function expandScmEntry(id) {
246 246 var els = document.getElementsByClassName(id, 'browser');
247 247 for (var i = 0; i < els.length; i++) {
248 248 Element.show(els[i]);
249 249 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
250 250 expandScmEntry(els[i].id);
251 251 }
252 252 }
253 253 $(id).addClassName('open');
254 254 }
255 255
256 256 function scmEntryClick(id) {
257 257 el = $(id);
258 258 if (el.hasClassName('open')) {
259 259 collapseScmEntry(id);
260 260 el.addClassName('collapsed');
261 261 return false;
262 262 } else if (el.hasClassName('loaded')) {
263 263 expandScmEntry(id);
264 264 el.removeClassName('collapsed');
265 265 return false;
266 266 }
267 267 if (el.hasClassName('loading')) {
268 268 return false;
269 269 }
270 270 el.addClassName('loading');
271 271 return true;
272 272 }
273 273
274 274 function scmEntryLoaded(id) {
275 275 Element.addClassName(id, 'open');
276 276 Element.addClassName(id, 'loaded');
277 277 Element.removeClassName(id, 'loading');
278 278 }
279 279
280 280 function randomKey(size) {
281 281 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');
282 282 var key = '';
283 283 for (i = 0; i < size; i++) {
284 284 key += chars[Math.floor(Math.random() * chars.length)];
285 285 }
286 286 return key;
287 287 }
288 288
289 289 function observeParentIssueField(url) {
290 290 new Ajax.Autocompleter('issue_parent_issue_id',
291 291 'parent_issue_candidates',
292 292 url,
293 293 { minChars: 3,
294 294 frequency: 0.5,
295 295 paramName: 'q',
296 296 method: 'get',
297 297 updateElement: function(value) {
298 298 document.getElementById('issue_parent_issue_id').value = value.id;
299 299 }});
300 300 }
301 301
302 302 function observeRelatedIssueField(url) {
303 303 new Ajax.Autocompleter('relation_issue_to_id',
304 304 'related_issue_candidates',
305 305 url,
306 306 { minChars: 3,
307 307 frequency: 0.5,
308 308 paramName: 'q',
309 309 method: 'get',
310 310 updateElement: function(value) {
311 311 document.getElementById('relation_issue_to_id').value = value.id;
312 312 },
313 313 parameters: 'scope=all'
314 314 });
315 315 }
316 316
317 317 function setVisible(id, visible) {
318 318 var el = $(id);
319 319 if (el) {if (visible) {el.show();} else {el.hide();}}
320 320 }
321 321
322 322 function observeProjectModules() {
323 323 var f = function() {
324 324 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
325 325 var c = ($('project_enabled_module_names_issue_tracking').checked == true);
326 326 setVisible('project_trackers', c);
327 327 setVisible('project_issue_custom_fields', c);
328 328 };
329 329
330 330 Event.observe(window, 'load', f);
331 331 Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
332 332 }
333 333
334 334 /*
335 335 * Class used to warn user when leaving a page with unsaved textarea
336 336 * Author: mathias.fischer@berlinonline.de
337 337 */
338 338
339 339 var WarnLeavingUnsaved = Class.create({
340 340 observedForms: false,
341 341 observedElements: false,
342 342 changedForms: false,
343 343 message: null,
344 344
345 345 initialize: function(message){
346 346 this.observedForms = $$('form');
347 347 this.observedElements = $$('textarea');
348 348 this.message = message;
349 349
350 350 this.observedElements.each(this.observeChange.bind(this));
351 351 this.observedForms.each(this.submitAction.bind(this));
352 352
353 353 window.onbeforeunload = this.unload.bind(this);
354 354 },
355 355
356 356 unload: function(){
357 357 this.observedElements.each(function(el) {el.blur();})
358 358 if(this.changedForms)
359 359 return this.message;
360 360 },
361 361
362 362 setChanged: function(){
363 363 this.changedForms = true;
364 364 },
365 365
366 366 setUnchanged: function(){
367 367 this.changedForms = false;
368 368 },
369 369
370 370 observeChange: function(element){
371 371 element.observe('change',this.setChanged.bindAsEventListener(this));
372 372 },
373 373
374 374 submitAction: function(element){
375 375 element.observe('submit',this.setUnchanged.bindAsEventListener(this));
376 376 }
377 377 });
378 378
379 379 /*
380 380 * 1 - registers a callback which copies the csrf token into the
381 381 * X-CSRF-Token header with each ajax request. Necessary to
382 382 * work with rails applications which have fixed
383 383 * CVE-2011-0447
384 384 * 2 - shows and hides ajax indicator
385 385 */
386 386 Ajax.Responders.register({
387 387 onCreate: function(request){
388 388 var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
389 389
390 390 if (csrf_meta_tag) {
391 391 var header = 'X-CSRF-Token',
392 392 token = csrf_meta_tag.readAttribute('content');
393 393
394 394 if (!request.options.requestHeaders) {
395 395 request.options.requestHeaders = {};
396 396 }
397 397 request.options.requestHeaders[header] = token;
398 398 }
399 399
400 400 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
401 401 Element.show('ajax-indicator');
402 402 }
403 403 },
404 404 onComplete: function(){
405 405 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
406 406 Element.hide('ajax-indicator');
407 407 }
408 408 }
409 409 });
410 410
411 411 function hideOnLoad() {
412 412 $$('.hol').each(function(el) {
413 413 el.hide();
414 414 });
415 415 }
416 416
417 417 Event.observe(window, 'load', hideOnLoad);
General Comments 0
You need to be logged in to leave comments. Login now