1/** 2 * File navigation.js. 3 * 4 * Handles toggling the navigation menu for small screens and enables TAB key 5 * navigation support for dropdown menus. 6 */ 7"use strict"; 8(function () { 9 var container, button, menu, links, i, len; 10 11 container = document.getElementById("site-navigation"); 12 if (!container) { 13 return; 14 } 15 16 button = container.getElementsByTagName("button")[0]; 17 if ("undefined" === typeof button) { 18 return; 19 } 20 21 menu = container.getElementsByTagName("ul")[0]; 22 23 // Hide menu toggle button if menu is empty and return early. 24 if ("undefined" === typeof menu) { 25 button.style.display = "none"; 26 return; 27 } 28 29 menu.setAttribute("aria-expanded", "false"); 30 if (-1 === menu.className.indexOf("nav-menu")) { 31 menu.className += " nav-menu"; 32 } 33 34 button.onclick = function () { 35 if (-1 !== container.className.indexOf("toggled")) { 36 container.className = container.className.replace(" toggled", ""); 37 button.setAttribute("aria-expanded", "false"); 38 menu.setAttribute("aria-expanded", "false"); 39 } else { 40 container.className += " toggled"; 41 button.setAttribute("aria-expanded", "true"); 42 menu.setAttribute("aria-expanded", "true"); 43 } 44 }; 45 46 // Get all the link elements within the menu. 47 links = menu.getElementsByTagName("a"); 48 49 // Each time a menu link is focused or blurred, toggle focus. 50 for (i = 0, len = links.length; i < len; i++) { 51 links[i].addEventListener("focus", toggleFocus, true); 52 links[i].addEventListener("blur", toggleFocus, true); 53 } 54 55 /** 56 * Sets or removes .focus class on an element. 57 */ 58 function toggleFocus() { 59 var self = this; 60 61 // Move up through the ancestors of the current link until we hit .nav-menu. 62 while (-1 === self.className.indexOf("nav-menu")) { 63 // On li elements toggle the class .focus. 64 if ("li" === self.tagName.toLowerCase()) { 65 if (-1 !== self.className.indexOf("focus")) { 66 self.className = self.className.replace(" focus", ""); 67 } else { 68 self.className += " focus"; 69 } 70 } 71 72 self = self.parentElement; 73 } 74 } 75 76 /** 77 * Toggles `focus` class to allow submenu access on tablets. 78 */ 79 (function (container) { 80 var touchStartFn, 81 i, 82 parentLink = container.querySelectorAll( 83 ".menu-item-has-children > a, .page_item_has_children > a" 84 ); 85 86 if ("ontouchstart" in window) { 87 touchStartFn = function (e) { 88 var menuItem = this.parentNode, 89 i; 90 91 if (!menuItem.classList.contains("focus")) { 92 e.preventDefault(); 93 for (i = 0; i < menuItem.parentNode.children.length; ++i) { 94 if (menuItem === menuItem.parentNode.children[i]) { 95 continue; 96 } 97 menuItem.parentNode.children[i].classList.remove("focus"); 98 } 99 menuItem.classList.add("focus"); 100 } else { 101 menuItem.classList.remove("focus"); 102 } 103 }; 104 105 for (i = 0; i < parentLink.length; ++i) { 106 parentLink[i].addEventListener("touchstart", touchStartFn, false); 107 } 108 } 109 })(container); 110})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.