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 / .svn / text-base / application.js.svn-base @ 441:cbce1fd3b1b7

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 119:8661b858af72 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 119:8661b858af72 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);