##// END OF EJS Templates
Fixed: Can't attach more than 1 file on IE 6 and 7 (#10115)....
Jean-Philippe Lang -
r8660:d57fbc9512cc
parent child
Show More
@@ -1,517 +1,517
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 function add_filter() {
87 87 select = $('add_filter_select');
88 88 field = select.value
89 89 Element.show('tr_' + field);
90 90 check_box = $('cb_' + field);
91 91 check_box.checked = true;
92 92 toggle_filter(field);
93 93 select.selectedIndex = 0;
94 94
95 95 for (i=0; i<select.options.length; i++) {
96 96 if (select.options[i].value == field) {
97 97 select.options[i].disabled = true;
98 98 }
99 99 }
100 100 }
101 101
102 102 function toggle_filter(field) {
103 103 check_box = $('cb_' + field);
104 104 if (check_box.checked) {
105 105 Element.show("operators_" + field);
106 106 Form.Element.enable("operators_" + field);
107 107 toggle_operator(field);
108 108 } else {
109 109 Element.hide("operators_" + field);
110 110 Form.Element.disable("operators_" + field);
111 111 enableValues(field, []);
112 112 }
113 113 }
114 114
115 115 function enableValues(field, indexes) {
116 116 var f = $$(".values_" + field);
117 117 for(var i=0;i<f.length;i++) {
118 118 if (indexes.include(i)) {
119 119 Form.Element.enable(f[i]);
120 120 f[i].up('span').show();
121 121 } else {
122 122 f[i].value = '';
123 123 Form.Element.disable(f[i]);
124 124 f[i].up('span').hide();
125 125 }
126 126 }
127 127 if (indexes.length > 0) {
128 128 Element.show("div_values_" + field);
129 129 } else {
130 130 Element.hide("div_values_" + field);
131 131 }
132 132 }
133 133
134 134 function toggle_operator(field) {
135 135 operator = $("operators_" + field);
136 136 switch (operator.value) {
137 137 case "!*":
138 138 case "*":
139 139 case "t":
140 140 case "w":
141 141 case "o":
142 142 case "c":
143 143 enableValues(field, []);
144 144 break;
145 145 case "><":
146 146 enableValues(field, [0,1]);
147 147 break;
148 148 case "<t+":
149 149 case ">t+":
150 150 case "t+":
151 151 case ">t-":
152 152 case "<t-":
153 153 case "t-":
154 154 enableValues(field, [2]);
155 155 break;
156 156 default:
157 157 enableValues(field, [0]);
158 158 break;
159 159 }
160 160 }
161 161
162 162 function toggle_multi_select(el) {
163 163 var select = $(el);
164 164 if (select.multiple == true) {
165 165 select.multiple = false;
166 166 } else {
167 167 select.multiple = true;
168 168 }
169 169 }
170 170
171 171 function submit_query_form(id) {
172 172 selectAllOptions("selected_columns");
173 173 $(id).submit();
174 174 }
175 175
176 176 function apply_filters_observer() {
177 177 $$("#query_form input[type=text]").invoke("observe", "keypress", function(e){
178 178 if(e.keyCode == Event.KEY_RETURN) {
179 179 submit_query_form("query_form");
180 180 }
181 181 });
182 182 }
183 183
184 184 var fileFieldCount = 1;
185 185
186 186 function addFileField() {
187 187 var fields = $('attachments_fields');
188 188 if (fields.childElements().length >= 10) return false;
189 189 fileFieldCount++;
190 var s = document.createElement("span");
190 var s = new Element('span');
191 191 s.update(fields.down('span').innerHTML);
192 192 s.down('input.file').name = "attachments[" + fileFieldCount + "][file]";
193 193 s.down('input.description').name = "attachments[" + fileFieldCount + "][description]";
194 194 fields.appendChild(s);
195 195 }
196 196
197 197 function removeFileField(el) {
198 198 var fields = $('attachments_fields');
199 199 var s = Element.up(el, 'span');
200 200 if (fields.childElements().length > 1) {
201 201 s.remove();
202 202 } else {
203 203 s.update(s.innerHTML);
204 204 }
205 205 }
206 206
207 207 function checkFileSize(el, maxSize, message) {
208 208 var files = el.files;
209 209 if (files) {
210 210 for (var i=0; i<files.length; i++) {
211 211 if (files[i].size > maxSize) {
212 212 alert(message);
213 213 el.value = "";
214 214 }
215 215 }
216 216 }
217 217 }
218 218
219 219 function showTab(name) {
220 220 var f = $$('div#content .tab-content');
221 221 for(var i=0; i<f.length; i++){
222 222 Element.hide(f[i]);
223 223 }
224 224 var f = $$('div.tabs a');
225 225 for(var i=0; i<f.length; i++){
226 226 Element.removeClassName(f[i], "selected");
227 227 }
228 228 Element.show('tab-content-' + name);
229 229 Element.addClassName('tab-' + name, "selected");
230 230 return false;
231 231 }
232 232
233 233 function moveTabRight(el) {
234 234 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
235 235 var tabsWidth = 0;
236 236 var i;
237 237 for (i=0; i<lis.length; i++) {
238 238 if (lis[i].visible()) {
239 239 tabsWidth += lis[i].getWidth() + 6;
240 240 }
241 241 }
242 242 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
243 243 return;
244 244 }
245 245 i=0;
246 246 while (i<lis.length && !lis[i].visible()) {
247 247 i++;
248 248 }
249 249 lis[i].hide();
250 250 }
251 251
252 252 function moveTabLeft(el) {
253 253 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
254 254 var i = 0;
255 255 while (i<lis.length && !lis[i].visible()) {
256 256 i++;
257 257 }
258 258 if (i>0) {
259 259 lis[i-1].show();
260 260 }
261 261 }
262 262
263 263 function displayTabsButtons() {
264 264 var lis;
265 265 var tabsWidth = 0;
266 266 var i;
267 267 $$('div.tabs').each(function(el) {
268 268 lis = el.down('ul').childElements();
269 269 for (i=0; i<lis.length; i++) {
270 270 if (lis[i].visible()) {
271 271 tabsWidth += lis[i].getWidth() + 6;
272 272 }
273 273 }
274 274 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
275 275 el.down('div.tabs-buttons').hide();
276 276 } else {
277 277 el.down('div.tabs-buttons').show();
278 278 }
279 279 });
280 280 }
281 281
282 282 function setPredecessorFieldsVisibility() {
283 283 relationType = $('relation_relation_type');
284 284 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
285 285 Element.show('predecessor_fields');
286 286 } else {
287 287 Element.hide('predecessor_fields');
288 288 }
289 289 }
290 290
291 291 function promptToRemote(text, param, url) {
292 292 value = prompt(text + ':');
293 293 if (value) {
294 294 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
295 295 return false;
296 296 }
297 297 }
298 298
299 299 function showModal(id, width) {
300 300 el = $(id);
301 301 if (el == undefined || el.visible()) {return;}
302 302 var h = $$('body')[0].getHeight();
303 303 var d = document.createElement("div");
304 304 d.id = 'modalbg';
305 305 $('main').appendChild(d);
306 306 $('modalbg').setStyle({ width: '100%', height: h + 'px' });
307 307 $('modalbg').show();
308 308
309 309 var pageWidth = document.viewport.getWidth();
310 310 if (width) {
311 311 el.setStyle({'width': width});
312 312 }
313 313 el.setStyle({'left': (((pageWidth - el.getWidth())/2 *100) / pageWidth) + '%'});
314 314 el.addClassName('modal');
315 315 el.show();
316 316
317 317 var submit = el.down("input[type=submit]");
318 318 if (submit) {
319 319 submit.focus();
320 320 }
321 321 }
322 322
323 323 function hideModal(el) {
324 324 var modal = Element.up(el, 'div.modal');
325 325 if (modal) {
326 326 modal.hide();
327 327 }
328 328 var bg = $('modalbg');
329 329 if (bg) {
330 330 bg.remove();
331 331 }
332 332 }
333 333
334 334 function collapseScmEntry(id) {
335 335 var els = document.getElementsByClassName(id, 'browser');
336 336 for (var i = 0; i < els.length; i++) {
337 337 if (els[i].hasClassName('open')) {
338 338 collapseScmEntry(els[i].id);
339 339 }
340 340 Element.hide(els[i]);
341 341 }
342 342 $(id).removeClassName('open');
343 343 }
344 344
345 345 function expandScmEntry(id) {
346 346 var els = document.getElementsByClassName(id, 'browser');
347 347 for (var i = 0; i < els.length; i++) {
348 348 Element.show(els[i]);
349 349 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
350 350 expandScmEntry(els[i].id);
351 351 }
352 352 }
353 353 $(id).addClassName('open');
354 354 }
355 355
356 356 function scmEntryClick(id) {
357 357 el = $(id);
358 358 if (el.hasClassName('open')) {
359 359 collapseScmEntry(id);
360 360 el.addClassName('collapsed');
361 361 return false;
362 362 } else if (el.hasClassName('loaded')) {
363 363 expandScmEntry(id);
364 364 el.removeClassName('collapsed');
365 365 return false;
366 366 }
367 367 if (el.hasClassName('loading')) {
368 368 return false;
369 369 }
370 370 el.addClassName('loading');
371 371 return true;
372 372 }
373 373
374 374 function scmEntryLoaded(id) {
375 375 Element.addClassName(id, 'open');
376 376 Element.addClassName(id, 'loaded');
377 377 Element.removeClassName(id, 'loading');
378 378 }
379 379
380 380 function randomKey(size) {
381 381 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');
382 382 var key = '';
383 383 for (i = 0; i < size; i++) {
384 384 key += chars[Math.floor(Math.random() * chars.length)];
385 385 }
386 386 return key;
387 387 }
388 388
389 389 function observeParentIssueField(url) {
390 390 new Ajax.Autocompleter('issue_parent_issue_id',
391 391 'parent_issue_candidates',
392 392 url,
393 393 { minChars: 3,
394 394 frequency: 0.5,
395 395 paramName: 'q',
396 396 method: 'get',
397 397 updateElement: function(value) {
398 398 document.getElementById('issue_parent_issue_id').value = value.id;
399 399 }});
400 400 }
401 401
402 402 function observeRelatedIssueField(url) {
403 403 new Ajax.Autocompleter('relation_issue_to_id',
404 404 'related_issue_candidates',
405 405 url,
406 406 { minChars: 3,
407 407 frequency: 0.5,
408 408 paramName: 'q',
409 409 method: 'get',
410 410 updateElement: function(value) {
411 411 document.getElementById('relation_issue_to_id').value = value.id;
412 412 },
413 413 parameters: 'scope=all'
414 414 });
415 415 }
416 416
417 417 function setVisible(id, visible) {
418 418 var el = $(id);
419 419 if (el) {if (visible) {el.show();} else {el.hide();}}
420 420 }
421 421
422 422 function observeProjectModules() {
423 423 var f = function() {
424 424 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
425 425 var c = ($('project_enabled_module_names_issue_tracking').checked == true);
426 426 setVisible('project_trackers', c);
427 427 setVisible('project_issue_custom_fields', c);
428 428 };
429 429
430 430 Event.observe(window, 'load', f);
431 431 Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
432 432 }
433 433
434 434 /*
435 435 * Class used to warn user when leaving a page with unsaved textarea
436 436 * Author: mathias.fischer@berlinonline.de
437 437 */
438 438
439 439 var WarnLeavingUnsaved = Class.create({
440 440 observedForms: false,
441 441 observedElements: false,
442 442 changedForms: false,
443 443 message: null,
444 444
445 445 initialize: function(message){
446 446 this.observedForms = $$('form');
447 447 this.observedElements = $$('textarea');
448 448 this.message = message;
449 449
450 450 this.observedElements.each(this.observeChange.bind(this));
451 451 this.observedForms.each(this.submitAction.bind(this));
452 452
453 453 window.onbeforeunload = this.unload.bind(this);
454 454 },
455 455
456 456 unload: function(){
457 457 this.observedElements.each(function(el) {el.blur();})
458 458 if(this.changedForms)
459 459 return this.message;
460 460 },
461 461
462 462 setChanged: function(){
463 463 this.changedForms = true;
464 464 },
465 465
466 466 setUnchanged: function(){
467 467 this.changedForms = false;
468 468 },
469 469
470 470 observeChange: function(element){
471 471 element.observe('change',this.setChanged.bindAsEventListener(this));
472 472 },
473 473
474 474 submitAction: function(element){
475 475 element.observe('submit',this.setUnchanged.bindAsEventListener(this));
476 476 }
477 477 });
478 478
479 479 /*
480 480 * 1 - registers a callback which copies the csrf token into the
481 481 * X-CSRF-Token header with each ajax request. Necessary to
482 482 * work with rails applications which have fixed
483 483 * CVE-2011-0447
484 484 * 2 - shows and hides ajax indicator
485 485 */
486 486 Ajax.Responders.register({
487 487 onCreate: function(request){
488 488 var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
489 489
490 490 if (csrf_meta_tag) {
491 491 var header = 'X-CSRF-Token',
492 492 token = csrf_meta_tag.readAttribute('content');
493 493
494 494 if (!request.options.requestHeaders) {
495 495 request.options.requestHeaders = {};
496 496 }
497 497 request.options.requestHeaders[header] = token;
498 498 }
499 499
500 500 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
501 501 Element.show('ajax-indicator');
502 502 }
503 503 },
504 504 onComplete: function(){
505 505 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
506 506 Element.hide('ajax-indicator');
507 507 }
508 508 }
509 509 });
510 510
511 511 function hideOnLoad() {
512 512 $$('.hol').each(function(el) {
513 513 el.hide();
514 514 });
515 515 }
516 516
517 517 Event.observe(window, 'load', hideOnLoad);
General Comments 0
You need to be logged in to leave comments. Login now