| 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);
|