Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
// django javascript file
2
 
3
// Finds all fieldsets with class="collapse", collapses them, and gives each
4
// one a "show" link that uncollapses it. The "show" link becomes a "hide"
5
// link when the fieldset is visible.
6
 
7
function findForm(node) {
8
  // returns the node of the form containing the given node
9
  if (node.tagName.toLowerCase() != 'form') {
10
    return findForm(node.parentNode);
11
  }
12
  return node;
13
}
14
 
15
var CollapsedFieldsets = {
16
  collapse_re: /\bcollapse\b/,   // Class of fieldsets that should be dealt with.
17
  collapsed_re: /\bcollapsed\b/, // Class that fieldsets get when they're hidden.
18
  collapsed_class: 'collapsed',
19
  init: function() {
20
    var fieldsets = document.getElementsByTagName('fieldset');
21
    var collapsed_seen = false;
22
    for (var i = 0, fs; fs = fieldsets[i]; i++) {
23
      // Collapse this fieldset if it has the correct class, and if it
24
      // doesn't have any errors. (Collapsing shouldn't apply in the case
25
      // of error messages.)
26
      if (fs.className.match(CollapsedFieldsets.collapse_re) && !CollapsedFieldsets.fieldset_has_errors(fs)) {
27
        collapsed_seen = true;
28
        // Give it an additional class, used by CSS to hide it.
29
        fs.className += ' ' + CollapsedFieldsets.collapsed_class;
30
        // (<a id="fieldsetcollapser3" class="collapse-toggle" href="#">show</a>)
31
        var collapse_link = document.createElement('a');
32
        collapse_link.className = 'collapse-toggle';
33
        collapse_link.id = 'fieldsetcollapser' + i;
34
        collapse_link.onclick = new Function('CollapsedFieldsets.show('+i+'); return false;');
35
        collapse_link.href = '#';
36
        collapse_link.innerHTML = 'show';
37
        var h2 = fs.getElementsByTagName('h2')[0];
38
        h2.appendChild(document.createTextNode(' ['));
39
        h2.appendChild(collapse_link);
40
        h2.appendChild(document.createTextNode(']'));
41
      }
42
    }
43
    if (collapsed_seen) {
44
      // Expand all collapsed fieldsets when form is submitted.
45
      Event.observe(findForm(document.getElementsByTagName('fieldset')[0]), 'submit', function() { CollapsedFieldsets.uncollapse_all(); }, false);
46
    }
47
  },
48
  fieldset_has_errors: function(fs) {
49
    // Returns true if any fields in the fieldset have validation errors.
50
    var divs = fs.getElementsByTagName('div');
51
    for (var i=0; i<divs.length; i++) {
52
      if (divs[i].className.match(/\bform-error\b/)) {
53
        return true;
54
      }
55
    }
56
    return false;
57
  },
58
  show: function(fieldset_index) {
59
    var fs = document.getElementsByTagName('fieldset')[fieldset_index];
60
    // Remove the class name that causes the "display: none".
61
    fs.className = fs.className.replace(CollapsedFieldsets.collapsed_re, '');
62
    // Toggle the "show" link to a "hide" link
63
    var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index);
64
    collapse_link.onclick = new Function('CollapsedFieldsets.hide('+fieldset_index+'); return false;');
65
    collapse_link.innerHTML = 'hide';
66
  },
67
  hide: function(fieldset_index) {
68
    var fs = document.getElementsByTagName('fieldset')[fieldset_index];
69
    // Add the class name that causes the "display: none".
70
    fs.className += ' ' + CollapsedFieldsets.collapsed_class;
71
    // Toggle the "hide" link to a "show" link
72
    var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index);
73
        collapse_link.onclick = new Function('CollapsedFieldsets.show('+fieldset_index+'); return false;');
74
    collapse_link.innerHTML = 'show';
75
  },
76
 
77
  uncollapse_all: function() {
78
    var fieldsets = document.getElementsByTagName('fieldset');
79
    for (var i=0; i<fieldsets.length; i++) {
80
      if (fieldsets[i].className.match(CollapsedFieldsets.collapsed_re)) {
81
        CollapsedFieldsets.show(i);
82
      }
83
    }
84
  }
85
}
86
 
87
Event.observe(window, 'load', CollapsedFieldsets.init, false);