LEFT | RIGHT |
1 (function(){ | 1 (function(){ |
2 document.addEventListener("DOMContentLoaded", function() | 2 document.addEventListener("DOMContentLoaded", function() |
3 { | 3 { |
4 | 4 |
5 // Change html class name from "no-js" to "js" | 5 // Change html class name from "no-js" to "js" |
6 document.documentElement.className = "js"; | 6 document.documentElement.className = "js"; |
7 | 7 |
8 // Toggle Navbar Collapse | 8 // Toggle Navbar Collapse |
9 function toggleNavbarCollapse() | 9 function toggleNavbarCollapse() |
10 { | 10 { |
11 var navbarCollapseEls = this.parentElement.getElementsByClassName("navbar-
collapse"); | 11 var navbarCollapseEls = this.parentElement.getElementsByClassName("navbar-
collapse"); |
12 for (var i = 0; i < navbarCollapseEls.length; i++) | 12 for (var i = 0; i < navbarCollapseEls.length; i++) |
13 { | 13 { |
14 navbarCollapseEls[i] | 14 navbarCollapseEls[i] |
15 .classList.toggle("open") | 15 .classList.toggle("open") |
16 } | 16 } |
17 } | 17 } |
18 | 18 |
19 var toggleNavbarCollapseEls = document.getElementsByClassName("toggle-navbar
-collapse"); | 19 var toggleNavbarCollapseEls = document.getElementsByClassName("toggle-navbar
-collapse"); |
20 for (var i = 0; i < toggleNavbarCollapseEls.length; i++) | 20 for (var i = 0; i < toggleNavbarCollapseEls.length; i++) |
21 { | 21 { |
22 toggleNavbarCollapseEls[i] | 22 toggleNavbarCollapseEls[i] |
23 .addEventListener("click", toggleNavbarCollapse, false); | 23 .addEventListener("click", toggleNavbarCollapse, false); |
24 } | 24 } |
25 | 25 |
| 26 // Custom Select |
| 27 function onClickCustomSelect() |
| 28 { |
| 29 var options = this.nextElementSibling; |
| 30 if (options.getAttribute("aria-hidden") == "true") |
| 31 { |
| 32 options.removeAttribute("aria-hidden"); |
| 33 this.setAttribute("aria-expanded", "true"); |
| 34 } |
| 35 else |
| 36 { |
| 37 options.setAttribute("aria-hidden", "true"); |
| 38 this.setAttribute("aria-expanded", "false"); |
| 39 } |
| 40 } |
| 41 |
| 42 var customSelectEls = document.getElementsByClassName('custom-select-selecte
d'); |
| 43 for (var i = 0; i < customSelectEls.length; i++) |
| 44 { |
| 45 customSelectEls[i] |
| 46 .addEventListener("click", onClickCustomSelect, false); |
| 47 customSelectEls[i] |
| 48 .nextElementSibling |
| 49 .setAttribute("aria-hidden", "true"); |
| 50 } |
| 51 |
26 // Accordion menu | 52 // Accordion menu |
27 | 53 |
28 function setupAccordionMenu(accordionEl) | 54 function Accordion(accordion) |
29 { | 55 { |
30 var accordionButtons = accordionEl.getElementsByClassName('accordion-toggl
e-button'); | 56 this.accordion = accordion; |
31 | 57 |
32 for ( var i = 0; i < accordionButtons.length; i++ ) | 58 var accordionButtons = this.accordion.getElementsByClassName('accordion-to
ggle-button'); |
| 59 for (var i = 0; i < accordionButtons.length; i++) |
33 { | 60 { |
34 accordionButtons[i] | 61 // Close all sections except the first |
35 .addEventListener("click", toggleAccordionSection, false); | 62 if (i !== 0) |
36 accordionButtons[i] | |
37 .addEventListener("keydown", navigateAccordionHeadings, false); | |
38 | |
39 // Close all sections besides the first | |
40 if ( i !== 0 ) | |
41 { | 63 { |
42 accordionButtons[i].setAttribute("aria-expanded", "false"); | 64 accordionButtons[i].setAttribute("aria-expanded", "false"); |
43 accordionButtons[i].setAttribute("aria-disabled", "false"); | |
44 document | 65 document |
45 .getElementById( accordionButtons[i].getAttribute("aria-controls") ) | 66 .getElementById( accordionButtons[i].getAttribute("aria-controls") ) |
46 .setAttribute("hidden", "true"); | 67 .setAttribute("hidden", "true"); |
47 } | 68 } |
48 } | 69 } |
| 70 |
| 71 this.accordion |
| 72 .addEventListener("click", this._onClick.bind(this), false); |
| 73 this.accordion |
| 74 .addEventListener("keydown", this._onKeyDown.bind(this), false); |
49 } | 75 } |
50 | 76 |
51 function toggleAccordionSection() | 77 Accordion.prototype.toggleSection = function(clickedButton) |
52 { | 78 { |
53 // Hide currently expanded section | 79 // Hide currently expanded section |
54 var accordion = this.parentElement.parentElement; | 80 var expandedButton = this.accordion.querySelector("button[aria-expanded='t
rue']"); |
55 var expandedButton = accordion.querySelector("button[aria-expanded='true']
"); | 81 if (expandedButton) |
56 if ( expandedButton ) | |
57 { | 82 { |
58 expandedButton.setAttribute("aria-expanded", "false"); | 83 expandedButton.setAttribute("aria-expanded", "false"); |
59 expandedButton.setAttribute("aria-disabled", "false"); | |
60 document | 84 document |
61 .getElementById( expandedButton.getAttribute("aria-controls") ) | 85 .getElementById( expandedButton.getAttribute("aria-controls") ) |
62 .setAttribute("hidden", "true"); | 86 .setAttribute("hidden", "true"); |
63 } | 87 } |
64 | 88 |
65 if ( expandedButton === this ) return; | 89 // If currently expanded section is clicked |
| 90 if (expandedButton === clickedButton) return; |
66 | 91 |
67 // Expand new section | 92 // Expand new section |
68 this.setAttribute("aria-expanded", "true"); | 93 clickedButton.setAttribute("aria-expanded", "true"); |
69 this.setAttribute("aria-disabled", "true"); | |
70 document | 94 document |
71 .getElementById( this.getAttribute("aria-controls") ) | 95 .getElementById( clickedButton.getAttribute("aria-controls") ) |
72 .removeAttribute("hidden"); | 96 .removeAttribute("hidden"); |
73 } | 97 } |
74 | 98 |
75 function navigateAccordionHeadings(e) | 99 Accordion.prototype.focusNextSection = function() |
76 { | 100 { |
77 if ( e.keyCode !== 38 && e.keyCode !== 40 ) return; | 101 var currentFocus = document.activeElement; |
| 102 var nextheading = currentFocus.parentElement.nextElementSibling.nextElemen
tSibling; |
78 | 103 |
79 var accordion = this.parentElement.parentElement; | 104 if (nextheading) |
80 | |
81 // Direction == up | |
82 if ( e.keyCode == 38 ) | |
83 { | 105 { |
84 var prevEl = this.parentElement.previousElementSibling; | 106 nextheading // .accordion-heading |
85 if ( prevEl ) | 107 .firstElementChild // .accordion-toggle-button |
86 { | 108 .focus(); |
87 prevEl // .accordion-body | |
88 .previousElementSibling // .accordion-heading | |
89 .firstElementChild // .accordion-toggle-button | |
90 .focus(); | |
91 } | |
92 else | |
93 { | |
94 accordion | |
95 .lastElementChild // .accordion-body | |
96 .previousElementSibling // .accordion-heading | |
97 .firstElementChild // .accordion-toggle-button | |
98 .focus(); | |
99 } | |
100 } | 109 } |
101 | 110 else |
102 // Direction == down | |
103 else if ( e.keyCode == 40 ) | |
104 { | 111 { |
105 var nextheading = this.parentElement.nextElementSibling.nextElementSibli
ng; | 112 this.accordion |
106 if ( nextheading ) | 113 .firstElementChild // .accordion-heading |
107 { | 114 .firstElementChild // .accordion-toggle-button |
108 nextheading // .accordion-heading | 115 .focus(); |
109 .firstElementChild // .accordion-toggle-button | |
110 .focus(); | |
111 } | |
112 else | |
113 { | |
114 accordion | |
115 .firstElementChild // .accordion-heading | |
116 .firstElementChild // .accordion-toggle-button | |
117 .focus(); | |
118 } | |
119 } | 116 } |
120 } | 117 } |
121 | 118 |
122 var accordionMenus = document.getElementsByClassName('accordion'); | 119 Accordion.prototype.focusPrevSection = function() |
123 for (var i = 0; i < accordionMenus.length; i++) | |
124 { | 120 { |
125 setupAccordionMenu( accordionMenus[i] ); | 121 var currentFocus = document.activeElement; |
| 122 var prevAccordionBody = currentFocus.parentElement.previousElementSibling; |
| 123 |
| 124 if (prevAccordionBody) |
| 125 { |
| 126 prevAccordionBody // .accordion-body |
| 127 .previousElementSibling // .accordion-heading |
| 128 .firstElementChild // .accordion-toggle-button |
| 129 .focus(); |
| 130 } |
| 131 else |
| 132 { |
| 133 this.accordion |
| 134 .lastElementChild // .accordion-body |
| 135 .previousElementSibling // .accordion-heading |
| 136 .firstElementChild // .accordion-toggle-button |
| 137 .focus(); |
| 138 } |
| 139 } |
| 140 |
| 141 Accordion.prototype._onKeyDown = function(event) |
| 142 { |
| 143 if (!event.target.classList.contains("accordion-toggle-button")) return; |
| 144 |
| 145 if (event.key == "ArrowUp" || event.keyCode == 38) |
| 146 { |
| 147 this.focusPrevSection(); |
| 148 } |
| 149 else if (event.key == "ArrowDown" || event.keyCode == 40) |
| 150 { |
| 151 this.focusNextSection(); |
| 152 } |
| 153 } |
| 154 |
| 155 Accordion.prototype._onClick = function(event) |
| 156 { |
| 157 if (!event.target.classList.contains("accordion-toggle-button")) return; |
| 158 |
| 159 this.toggleSection(event.target); |
| 160 } |
| 161 |
| 162 var accordions = document.getElementsByClassName('accordion'); |
| 163 for (var i = 0; i < accordions.length; i++) |
| 164 { |
| 165 new Accordion(accordions[i]); |
126 } | 166 } |
127 | 167 |
128 }, false); | 168 }, false); |
129 }()); | 169 }()); |
LEFT | RIGHT |