| Index: static/js/main.js | 
| =================================================================== | 
| --- a/static/js/main.js | 
| +++ b/static/js/main.js | 
| @@ -18,10 +18,112 @@ | 
|  | 
| var toggleNavbarCollapseEls = document.getElementsByClassName("toggle-navbar-collapse"); | 
| for (var i = 0; i < toggleNavbarCollapseEls.length; i++) | 
| { | 
| toggleNavbarCollapseEls[i] | 
| .addEventListener("click", toggleNavbarCollapse, false); | 
| } | 
|  | 
| +    // Accordion menu | 
| + | 
| +    function setupAccordionMenu(accordionEl) | 
| +    { | 
| +      var accordionButtons = accordionEl.getElementsByClassName('accordion-toggle-button'); | 
| + | 
| +      for ( var i = 0; i < accordionButtons.length; i++ ) | 
| +      { | 
| +        accordionButtons[i] | 
| +          .addEventListener("click", toggleAccordionSection, false); | 
| +        accordionButtons[i] | 
| +          .addEventListener("keydown", navigateAccordionHeadings, false); | 
| + | 
| +        // Close all sections besides the first | 
| +        if ( i !== 0 ) | 
| +        { | 
| +          accordionButtons[i].setAttribute("aria-expanded", "false"); | 
| +          accordionButtons[i].setAttribute("aria-disabled", "false"); | 
| +          document | 
| +            .getElementById( accordionButtons[i].getAttribute("aria-controls") ) | 
| +            .setAttribute("hidden", "true"); | 
| +        } | 
| +      } | 
| +    } | 
| + | 
| +    function toggleAccordionSection() | 
| +    { | 
| +      // Hide currently expanded section | 
| +      var accordion = this.parentElement.parentElement; | 
| +      var expandedButton = accordion.querySelector("button[aria-expanded='true']"); | 
| +      if ( expandedButton ) | 
| +      { | 
| +        expandedButton.setAttribute("aria-expanded", "false"); | 
| +        expandedButton.setAttribute("aria-disabled", "false"); | 
| +        document | 
| +          .getElementById( expandedButton.getAttribute("aria-controls") ) | 
| +          .setAttribute("hidden", "true"); | 
| +      } | 
| + | 
| +      if ( expandedButton === this ) return; | 
| + | 
| +      // Expand new section | 
| +      this.setAttribute("aria-expanded", "true"); | 
| +      this.setAttribute("aria-disabled", "true"); | 
| +      document | 
| +        .getElementById( this.getAttribute("aria-controls") ) | 
| +        .removeAttribute("hidden"); | 
| +    } | 
| + | 
| +    function navigateAccordionHeadings(e) | 
| +    { | 
| +      if ( e.keyCode !== 38 && e.keyCode !== 40 ) return; | 
| + | 
| +      var accordion = this.parentElement.parentElement; | 
| + | 
| +      // Direction == up | 
| +      if ( e.keyCode == 38 ) | 
| +      { | 
| +        var prevEl = this.parentElement.previousElementSibling; | 
| +        if ( prevEl ) | 
| +        { | 
| +          prevEl // .accordion-body | 
| +            .previousElementSibling // .accordion-heading | 
| +            .firstElementChild // .accordion-toggle-button | 
| +            .focus(); | 
| +        } | 
| +        else | 
| +        { | 
| +          accordion | 
| +            .lastElementChild // .accordion-body | 
| +            .previousElementSibling // .accordion-heading | 
| +            .firstElementChild // .accordion-toggle-button | 
| +            .focus(); | 
| +        } | 
| +      } | 
| + | 
| +      // Direction == down | 
| +      else if ( e.keyCode == 40 ) | 
| +      { | 
| +        var nextheading = this.parentElement.nextElementSibling.nextElementSibling; | 
| +        if ( nextheading ) | 
| +        { | 
| +          nextheading // .accordion-heading | 
| +            .firstElementChild // .accordion-toggle-button | 
| +            .focus(); | 
| +        } | 
| +        else | 
| +        { | 
| +          accordion | 
| +            .firstElementChild // .accordion-heading | 
| +            .firstElementChild // .accordion-toggle-button | 
| +            .focus(); | 
| +        } | 
| +      } | 
| +    } | 
| + | 
| +    var accordionMenus = document.getElementsByClassName('accordion'); | 
| +    for (var i = 0; i < accordionMenus.length; i++) | 
| +    { | 
| +      setupAccordionMenu( accordionMenus[i] ); | 
| +    } | 
| + | 
| }, false); | 
| }()); | 
|  |