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 @ 443:350acce374a2

History | View | Annotate | Download (9.87 KB)

1
/* 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
function setCheckboxesBySelector(checked, selector) {
21
  var boxes = $$(selector);
22
  boxes.each(function(ele) {
23
    ele.checked = checked;
24
  });
25
}
26

    
27
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
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
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
function hideFieldset(el) {
81
        var fieldset = Element.up(el, 'fieldset');
82
        fieldset.toggleClassName('collapsed');
83
        fieldset.down('div').hide();
84
}
85

    
86
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
    var dLabel = new Element('label');
100
    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
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
/*
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

    
333
/* 
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
Ajax.Responders.register({
341
    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
        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

    
373

    
374

    
375