comparison public/javascripts/application.js @ 514:7eba09d624db live

Merge
author Chris Cannam
date Thu, 14 Jul 2011 10:50:53 +0100
parents 851510f1b535
children 5e80956cc792
comparison
equal deleted inserted replaced
512:b9aebdd7dd40 514:7eba09d624db
38 Element.toggle(n); 38 Element.toggle(n);
39 n = Element.next(n); 39 n = Element.next(n);
40 } 40 }
41 } 41 }
42 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
43 function toggleFieldset(el) { 74 function toggleFieldset(el) {
44 var fieldset = Element.up(el, 'fieldset'); 75 var fieldset = Element.up(el, 'fieldset');
45 fieldset.toggleClassName('collapsed'); 76 fieldset.toggleClassName('collapsed');
46 Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2}); 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();
47 } 84 }
48 85
49 var fileFieldCount = 1; 86 var fileFieldCount = 1;
50 87
51 function addFileField() { 88 function addFileField() {
216 updateElement: function(value) { 253 updateElement: function(value) {
217 document.getElementById('issue_parent_issue_id').value = value.id; 254 document.getElementById('issue_parent_issue_id').value = value.id;
218 }}); 255 }});
219 } 256 }
220 257
221 /* shows and hides ajax indicator */ 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 this.observedElements.each(function(el) {el.blur();})
313 if(this.changedForms)
314 return this.message;
315 },
316
317 setChanged: function(){
318 this.changedForms = true;
319 },
320
321 setUnchanged: function(){
322 this.changedForms = false;
323 },
324
325 observeChange: function(element){
326 element.observe('change',this.setChanged.bindAsEventListener(this));
327 },
328
329 submitAction: function(element){
330 element.observe('submit',this.setUnchanged.bindAsEventListener(this));
331 }
332 });
333
334 /*
335 * 1 - registers a callback which copies the csrf token into the
336 * X-CSRF-Token header with each ajax request. Necessary to
337 * work with rails applications which have fixed
338 * CVE-2011-0447
339 * 2 - shows and hides ajax indicator
340 */
222 Ajax.Responders.register({ 341 Ajax.Responders.register({
223 onCreate: function(){ 342 onCreate: function(request){
343 var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
344
345 if (csrf_meta_tag) {
346 var header = 'X-CSRF-Token',
347 token = csrf_meta_tag.readAttribute('content');
348
349 if (!request.options.requestHeaders) {
350 request.options.requestHeaders = {};
351 }
352 request.options.requestHeaders[header] = token;
353 }
354
224 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) { 355 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
225 Element.show('ajax-indicator'); 356 Element.show('ajax-indicator');
226 } 357 }
227 }, 358 },
228 onComplete: function(){ 359 onComplete: function(){