To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / public / javascripts / application.js @ 442:753f1380d6bc

History | View | Annotate | Download (9.87 KB)

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