1 | /* |
---|
2 | * This is the code for the collapsibles. It uses the following markup: |
---|
3 | * |
---|
4 | * <dl class="collapsible"> |
---|
5 | * <dt class="collapsibleHeader"> |
---|
6 | * A Title |
---|
7 | * </dt> |
---|
8 | * <dd class="collapsibleContent"> |
---|
9 | * <!-- Here can be any content you want --> |
---|
10 | * </dd> |
---|
11 | * </dl> |
---|
12 | * |
---|
13 | * When the collapsible is toggled, then the dl will get an additional class |
---|
14 | * which switches between 'collapsedBlockCollapsible' and |
---|
15 | * 'expandedBlockCollapsible'. You can use this to style it accordingly, for |
---|
16 | * example: |
---|
17 | * |
---|
18 | * .expandedBlockCollapsible .collapsibleContent { |
---|
19 | * display: block; |
---|
20 | * } |
---|
21 | * |
---|
22 | * .collapsedBlockCollapsible .collapsibleContent { |
---|
23 | * display: none; |
---|
24 | * } |
---|
25 | * |
---|
26 | * If you add the 'collapsedOnLoad' class to the dl, then it will get |
---|
27 | * collapsed on page load, this is done, so the content is accessible even when |
---|
28 | * javascript is disabled. |
---|
29 | * |
---|
30 | * If you add the 'inline' class to the dl, then it will toggle between |
---|
31 | * 'collapsedInlineCollapsible' and 'expandedInlineCollapsible' instead of |
---|
32 | * 'collapsedBlockCollapsible' and 'expandedBlockCollapsible'. |
---|
33 | * |
---|
34 | * This file uses functions from register_function.js, cssQuery.js and |
---|
35 | * nodeutils.js. |
---|
36 | * |
---|
37 | */ |
---|
38 | |
---|
39 | function isCollapsible(node) { |
---|
40 | if (hasClassName(node, 'collapsible')) { |
---|
41 | return true; |
---|
42 | } |
---|
43 | return false; |
---|
44 | }; |
---|
45 | |
---|
46 | function toggleCollapsible(event) { |
---|
47 | if (!event) var event = window.event; // IE compatibility |
---|
48 | |
---|
49 | if (!this.tagName && (this.tagName == 'DT' || this.tagName == 'dt')) { |
---|
50 | return true; |
---|
51 | } |
---|
52 | |
---|
53 | var container = findContainer(this, isCollapsible); |
---|
54 | if (!container) { |
---|
55 | return true; |
---|
56 | } |
---|
57 | |
---|
58 | if (hasClassName(container, 'collapsedBlockCollapsible')) { |
---|
59 | replaceClassName(container, 'collapsedBlockCollapsible', 'expandedBlockCollapsible'); |
---|
60 | } else if (hasClassName(container, 'expandedBlockCollapsible')) { |
---|
61 | replaceClassName(container, 'expandedBlockCollapsible', 'collapsedBlockCollapsible'); |
---|
62 | } else if (hasClassName(container, 'collapsedInlineCollapsible')) { |
---|
63 | replaceClassName(container, 'collapsedInlineCollapsible', 'expandedInlineCollapsible'); |
---|
64 | } else if (hasClassName(container, 'expandedInlineCollapsible')) { |
---|
65 | replaceClassName(container, 'expandedInlineCollapsible', 'collapsedInlineCollapsible'); |
---|
66 | } |
---|
67 | }; |
---|
68 | |
---|
69 | function activateCollapsibles() { |
---|
70 | if (!W3CDOM) {return false;} |
---|
71 | |
---|
72 | var collapsibles = cssQuery('dl.collapsible'); |
---|
73 | for (var i=0; i < collapsibles.length; i++) { |
---|
74 | var collapsible = collapsibles[i]; |
---|
75 | |
---|
76 | var collapsible_header = cssQuery('dt.collapsibleHeader', collapsible)[0]; |
---|
77 | collapsible_header.onclick = toggleCollapsible; |
---|
78 | |
---|
79 | if (hasClassName(collapsible, 'inline')) { |
---|
80 | // the collapsible should be inline |
---|
81 | if (hasClassName(collapsible, 'collapsedOnLoad')) { |
---|
82 | replaceClassName(collapsible, 'collapsedOnLoad', 'collapsedInlineCollapsible'); |
---|
83 | } else { |
---|
84 | addClassName(collapsible, 'expandedInlineCollapsible'); |
---|
85 | } |
---|
86 | } else { |
---|
87 | // the collapsible is a block |
---|
88 | if (hasClassName(collapsible, 'collapsedOnLoad')) { |
---|
89 | replaceClassName(collapsible, 'collapsedOnLoad', 'collapsedBlockCollapsible'); |
---|
90 | } else { |
---|
91 | addClassName(collapsible, 'expandedBlockCollapsible'); |
---|
92 | } |
---|
93 | } |
---|
94 | } |
---|
95 | }; |
---|
96 | |
---|
97 | registerPloneFunction(activateCollapsibles); |
---|