1'use strict'; 2 3(function () { 4 // Initiate the menus when the DOM loads. 5 function initNavigation() { 6 if (!document.documentElement.classList) { 7 return; 8 } 9 10 var siteMenus = document.querySelectorAll('.site-menu'); 11 12 if (!siteMenus.length) { 13 return; 14 } 15 16 for (var i = 0; i < siteMenus.length; i++) { 17 setToggleSubmenuOnFocus(siteMenus[i]); 18 setToggleSubmenuOnTouch(siteMenus[i]); 19 } 20 21 createMobileMenu(); 22 } 23 /** 24 * Created a mobile menu based on the primary menu. 25 */ 26 27 function createMobileMenu() { 28 var siteHeader = document.getElementById('masthead'); 29 var mobileMenuContainer = document.getElementById('mobile-navigation'); 30 var headerSearchForm = siteHeader.querySelector('.search-form'); 31 var headerMenus = siteHeader.querySelectorAll('.menu'); 32 var headerSocialMenu = siteHeader.querySelector('.social-list'); 33 var mobileContent = document.createDocumentFragment(); 34 35 if (null !== headerSearchForm) { 36 mobileContent.appendChild(headerSearchForm.cloneNode(true)); 37 } 38 39 if (headerMenus.length) { 40 for (var i = 0; i < headerMenus.length; i++) { 41 var menu = headerMenus[i].cloneNode(true); 42 menu.removeAttribute('id'); 43 mobileContent.appendChild(menu); 44 } 45 } // Copy social menu to the mobile navigation. 46 47 if (null !== headerSocialMenu) { 48 var socialMenuList = headerSocialMenu.getElementsByTagName('ul')[0]; 49 50 if ('undefined' !== typeof socialMenuList) { 51 socialMenuList = socialMenuList.cloneNode(true); 52 socialMenuList.removeAttribute('id'); 53 socialMenuList.classList.add('social-list'); 54 mobileContent.appendChild(socialMenuList); 55 } 56 } // Add dropdown toggle that displays child menu items. 57 58 var parentMenuItems = mobileContent.querySelectorAll( 59 '.menu-item-has-children' 60 ); 61 62 if (parentMenuItems.length) { 63 for (var _i = 0; _i < parentMenuItems.length; _i++) { 64 var buttonScreenReaderText = document.createElement('span'); 65 buttonScreenReaderText.className = 'screen-reader-text'; 66 buttonScreenReaderText.appendChild( 67 document.createTextNode(screenReaderText.expand) 68 ); 69 var dropdownToggle = document.createElement('button'); 70 dropdownToggle.className = 'dropdown-toggle clean-button has-icon'; 71 dropdownToggle.setAttribute('aria-expanded', false); 72 dropdownToggle.appendChild(buttonScreenReaderText); 73 74 parentMenuItems[_i].appendChild(dropdownToggle); 75 76 parentMenuItems[_i].setAttribute('aria-haspopup', true); 77 } 78 } // Add a search form and list items to the mobile container. 79 80 mobileMenuContainer.appendChild(mobileContent); // Remove ID attributes from the list items to avoid repetition. 81 82 var mobileMenuItems = mobileMenuContainer.getElementsByTagName('li'); 83 var mobileMenuItemsCount = mobileMenuItems.length; 84 85 if (mobileMenuItemsCount) { 86 for (var itemIndex = 0; itemIndex < mobileMenuItemsCount; itemIndex++) { 87 mobileMenuItems[itemIndex].removeAttribute('id'); 88 } 89 } // Toggle buttons and submenu items with active children menu items. 90 91 var activeToggleButtons = mobileMenuContainer.querySelectorAll( 92 '.current-menu-ancestor > button' 93 ); 94 var activeToggleSubMenus = mobileMenuContainer.querySelectorAll( 95 '.current-menu-ancestor > .sub-menu' 96 ); 97 var activeToggleIndecators = mobileMenuContainer.querySelectorAll( 98 '.current-menu-ancestor > .arrow-icon' 99 ); 100 101 if (activeToggleButtons.length) { 102 for (var _i2 = 0; _i2 < activeToggleButtons.length; _i2++) { 103 activeToggleButtons[_i2].classList.add('toggled-on'); 104 105 activeToggleButtons[_i2].setAttribute('aria-expanded', true); 106 } 107 } 108 109 if (activeToggleSubMenus.length) { 110 for (var _i3 = 0; _i3 < activeToggleSubMenus.length; _i3++) { 111 activeToggleSubMenus[_i3].classList.add('toggled-on'); 112 } 113 } 114 115 if (activeToggleIndecators.length) { 116 for (var _i4 = 0; _i4 < activeToggleIndecators.length; _i4++) { 117 activeToggleIndecators[_i4].classList.add('toggled-on'); 118 } 119 } 120 121 var dropdownToggleButtons = mobileMenuContainer.querySelectorAll( 122 'button.dropdown-toggle' 123 ); 124 125 if (dropdownToggleButtons.length) { 126 var dropdownToggleEvent = function dropdownToggleEvent(e) { 127 e.preventDefault(); 128 var screenReader = e.target.querySelector('.screen-reader-text'); 129 var arrowIconElement = 130 e.target.parentElement.querySelector('.arrow-icon'); 131 arrowIconElement.classList.toggle('toggled-on'); 132 133 if (-1 !== e.target.className.indexOf('toggled-on')) { 134 e.target.setAttribute('aria-expanded', false); 135 136 if (null !== screenReader) { 137 screenReader.textContent = screenReaderText.collapse; 138 } 139 } else { 140 e.target.setAttribute('aria-expanded', true); 141 142 if (null !== screenReader) { 143 screenReader.textContent = screenReaderText.expand; 144 } 145 } 146 147 e.target.classList.toggle('toggled-on'); 148 var parentItem = e.target.parentNode; 149 150 for (var _i5 = 0; _i5 < parentItem.childNodes.length; _i5++) { 151 if ('UL' === parentItem.childNodes[_i5].nodeName) { 152 parentItem.childNodes[_i5].classList.toggle('toggled-on'); 153 } 154 } 155 }; 156 157 for (var _i6 = 0; _i6 < dropdownToggleButtons.length; _i6++) { 158 dropdownToggleButtons[_i6].addEventListener( 159 'click', 160 dropdownToggleEvent, 161 false 162 ); 163 } 164 } 165 } 166 /** 167 * Toggle `focus` class to allow sub-menu access on focus and blur. 168 * 169 * @param {Object} container 170 */ 171 172 function setToggleSubmenuOnFocus(container) { 173 // Get the first ul element insite the menu container. 174 var primaryMenu = container.getElementsByTagName('ul')[0]; // Get all the link elements within the menu. 175 176 var menuLinks = primaryMenu.getElementsByTagName('a'); 177 var i, focusFn;
177 // Sets or removes .focus class on an element. 178 179 focusFn = function focusFn() { 180 var self = this; // Move up through the ancestors of the current link until we hit .nav-menu. 181 182 while ( 183 !self.classList.contains('site-menu') && 184 'nav' !== self.tagName.toLowerCase() 185 ) { 186 // On li elements toggle the class .focus. 187 if ('li' === self.tagName.toLowerCase()) { 188 if (self.classList.contains('focus')) { 189 self.classList.remove('focus'); 190 } else { 191 self.classList.add('focus'); 192 } 193 } 194 195 self = self.parentElement; 196 } 197 }; // Each time a menu link is focused or blurred, toggle focus. 198 199 for (i = 0; i < menuLinks.length; i++) { 200 menuLinks[i].addEventListener('focus', focusFn, false); 201 menuLinks[i].addEventListener('blur', focusFn, false); 202 } 203 } 204 /** 205 * Toggle `focus` class to allow sub-menu access on touch screens. 206 * 207 * @param {Object} container 208 */ 209 210 function setToggleSubmenuOnTouch(container) { 211 var touchStartFn, 212 touchOutsideFn, 213 removeFocusFn, 214 i, 215 parentLink = container.querySelectorAll( 216 '.menu-item-has-children > a, .page_item_has_children > a' 217 ); 218 219 removeFocusFn = function removeFocusFn() { 220 var focusedElements = container.querySelectorAll('li.focus'); 221 var i; 222 223 for (i = 0; i < focusedElements.length; ++i) { 224 focusedElements[i].classList.remove('focus'); 225 } 226 }; 227 228 touchStartFn = function touchStartFn(e) { 229 var menuItem = this.parentNode, 230 i; 231 232 if (!menuItem.classList.contains('focus')) { 233 e.preventDefault(); 234 235 for (i = 0; i < menuItem.parentNode.children.length; ++i) { 236 if (menuItem === menuItem.parentNode.children[i]) { 237 continue; 238 } 239 240 menuItem.parentNode.children[i].classList.remove('focus'); 241 } 242 243 if (!container.classList.contains('is-touched')) { 244 container.classList.add('is-touched'); 245 } 246 247 menuItem.classList.add('focus'); 248 } else { 249 menuItem.classList.remove('focus'); 250 } 251 }; 252 253 touchOutsideFn = function touchOutsideFn(e) { 254 var isTochedMenu = container.classList.contains('is-touched'); 255 256 if (!isTochedMenu) { 257 return; 258 } 259 260 var elementParent = e.target.parentNode; 261 262 if ( 263 elementParent && 264 !elementParent.classList.contains('menu-item') && 265 isTochedMenu 266 ) { 267 removeFocusFn(); 268 } 269 }; 270 271 document.addEventListener('touchstart', touchOutsideFn, false); 272 273 for (i = 0; i < parentLink.length; ++i) { 274 parentLink[i].addEventListener('touchstart', touchStartFn, false); 275 } 276 } 277 278 if ('loading' === document.readyState) { 279 // The DOM has not yet been loaded. 280 document.addEventListener('DOMContentLoaded', initNavigation); 281 } else { 282 // The DOM has already been loaded. 283 initNavigation(); 284 } 285})(); 286/* 287 Handles additional functionalities of the theme. 288*/ 289 290(function () { 291 var htmlRTL = 292 'rtl' === document.documentElement.getAttribute('dir') ? true : false; 293 var prosperityTheme = { 294 // Run on ready. 295 onReady: function onReady() { 296 this.setToggleSidebar(); 297 this.skipLinkFocusFix(); 298 }, 299 // Set up a mobile toggle sidebar. 300 setToggleSidebar: function setToggleSidebar() { 301 var pageContainer = document.getElementById('page'); 302 303 if (!pageContainer) { 304 return; 305 } 306 307 var toggleSection = document.getElementById('toggle-sidebar'); 308 var toggleButton = document.getElementById('mobile-menu-toggle'); 309 var closeBuutton = document.getElementById('close-toggle-sidebar'); 310 toggleSection.style.display = 'block'; 311 var toggleSectionWidth = toggleSection.offsetWidth; 312 toggleSection.style.removeProperty('display'); 313 314 var bodyAction = function bodyAction(e) { 315 if ( 316 !toggleSection.contains(e.target) && 317 e.target.nodeName !== 'BUTTON' 318 ) { 319 document.body.classList.toggle('active-toggle-sidebar'); 320 closeToggleSection(); 321 } 322 }; 323 324 var closeToggleSection = function closeToggleSection() { 325 // Move a content area to a regular position. 326 if (htmlRTL) { 327 pageContainer.style.removeProperty('left'); 328 } else { 329 pageContainer.style.removeProperty('right'); 330 } // Update aria attributes. 331 332 toggleSection.setAttribute('aria-hidden', true); 333 toggleButton.setAttribute('aria-expanded', false); // Detect all clicks on the document 334 335 document.body.removeEventListener('click', bodyAction, false); 336 }; 337 338 var showToggleSection = function showToggleSection() { 339 // Move a content area to the side. 340 if (htmlRTL) { 341 pageContainer.style.left = toggleSectionWidth + 'px'; 342 } else { 343 pageContainer.style.right = toggleSectionWidth + 'px'; 344 } // Update aria attributes. 345 346 toggleSection.setAttribute('aria-hidden', false); 347 toggleButton.setAttribute('aria-expanded', true); // Detect all clicks on the document 348 349 document.body.addEventListener('click', bodyAction, false); 350 }; 351 352 var buttonAction = function buttonAction() { 353 document.body.classList.toggle('active-toggle-sidebar'); 354 355 if (-1 !== document.body.className.indexOf('active-toggle-sidebar')) { 356 showToggleSection(); 357 } else { 358 closeToggleSection(); 359 } 360 }; 361 362 toggleButton.addEventListener('click', buttonAction, false); 363 closeBuutton.addEventListener('click', buttonAction, false); 364 }, 365 // Helps with accessibility for keyboard only users. 366 skipLinkFocusFix: function skipLinkFocusFix() { 367 var isIe = /(trident|msie)/i.test(navigator.userAgent); 368 369 if (isIe && document.getElementById && window.addEventListener) { 370 window.addEventListener( 371 'hashchange', 372 function () { 373 var id = location.hash.substring(1), 374 element; 375 376 if (!/^[A-z0-9_-]+$/.test(id)) { 377 return; 378 } 379 380 element = document.getElementById(id); 381 382 if (element) { 383 if ( 384 !/^(?:a|select|input|button|textarea)$/i.test(element.tagName) 385 ) { 386 element.tabIndex = -1; 387 } 388 389 element.focus(); 390 } 391 }, 392 false 393 ); 394 } 395 }, 396 }; // Things that need to happen when the document is ready. 397 398 document.addEventListener('DOMContentLoaded', function () { 399 prosperityTheme.onReady(); 400 }); 401})();
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.