1$(document).ready(function() { 2 // Initialise nav 3 var mobileView = 991; 4 var navWrapper = $('.header .navigation .header-nav'), 5 screenMode = window.innerWidth <= mobileView ? 'mobile' : 'desktop', 6 mobNavPos = 0, 7 navAniDuration = 300; 8 9 // Handle nav reset 10 resetNav(); 11 function resetNav() { 12 if (screenMode === 'desktop') { 13 closeMobileNav(); 14 $('#nav').attr('aria-hidden', 'false'); 15 navWrapper.find('li.nav-dropdown > .nav-item > a + button').attr('aria-expanded', 'false'); 16 navWrapper.find('> li > .nav-item > a, > li > .nav-item > a + button').removeAttr('tabindex aria-hidden'); 17 navWrapper.find('div.lvl-2 .nav-item > a').attr({ 18 'tabindex': '-1', 19 'aria-hidden': 'true' 20 }); 21 } else if (screenMode === 'mobile') { 22 navWrapper.find('> li.nav-dropdown').removeClass('open-nav'); 23 navWrapper.find('li.nav-dropdown > .nav-item > a + button').removeAttr('aria-expanded'); 24 navWrapper.find('div.lvl-2 .nav-item > a').removeAttr('tabindex aria-hidden'); 25 closeMobileNav(); 26 } 27 } 28 29 // Handle closing the mobile nav 30 function closeMobileNav() { 31 if (mobNavPos != 0) { 32 mobNavPos = 0; 33 navWrapper.css('transform', ''); 34 setTimeout(function() { 35 navWrapper.find('ul').removeClass('nav-show'); 36 }, navAniDuration); 37 } 38 $('.header .header-top .mobile-buttons .nav-toggle').removeClass('active').attr('aria-expanded', 'false'); 39 $('.ccm-page, button.cc-revoke, .cc-window').removeClass('nav-open'); 40 41 // Hide mobile navigation from assistive technologies 42 $('#nav').attr('aria-hidden', 'true'); 43 navWrapper.find('ul').removeClass('nav-show').attr('aria-hidden', 'true'); 44 navWrapper.find('li a, li button').attr({ 45 'tabindex': '-1', 46 'aria-hidden': 'true' 47 }); 48 } 49 50 // Toggle mobile nav 51 $('.header .header-top .mobile-buttons').on('click', '.nav-toggle', function() { 52 if ($(this).attr('aria-expanded') === 'false') { 53 $(this).addClass('active').attr('aria-expanded', 'true'); 54 $('.ccm-page, button.cc-revoke, .cc-window').addClass('nav-open'); 55 56 // Close all mobile toolbars 57 $('.header .mobile-buttons .header-tool-button').attr('aria-expanded', 'false'); 58 $('.header .header-mobile-tool').removeClass('active').find('a, button, input, select, textarea').attr({ 59 'tabindex': '-1', 60 'aria-hidden': 'true' 61 }); 62 63 // Reveal mobile navigation to assistive technologies 64 $('#nav').attr('aria-hidden', 'false'); 65 navWrapper.find('> li > .nav-item > a, > li > .nav-item > button').attr({ 66 'tabindex': '0', 67 'aria-hidden': 'false' 68 }); 69 navWrapper.find('> li:first-child > .nav-item > a').focus(); 70 } else { 71 closeMobileNav(); 72 } 73 }); 74 75 // Leaving focus on mobile nav toggle 76 $('.header .header-top .mobile-buttons').on('keydown', '.nav-toggle', function(e) { 77 if (screenMode === 'mobile') { 78 if (!e.shiftKey && e.key === 'Tab') { 79 if ($(this).attr('aria-expanded') === 'true') { 80 e.preventDefault(); 81 navWrapper.find('[tabindex="0"]').first().focus(); 82 } 83 } 84 } 85 }); 86 87 // Leaving focus on mobile nav 88 navWrapper.on('keydown', '> li:first-child > .nav-item > a', function(e) { 89 if (screenMode === 'mobile') { 90 if (e.shiftKey && e.key === 'Tab') { 91 e.preventDefault(); 92 $('.header .header-top .mobile-buttons .nav-toggle').focus(); 93 } 94 } 95 }); 96 97 // Close mobile nav when clicked outside 98 $(document).on('click', function(e) { 99 if ($('.ccm-page').hasClass('nav-open') && $(e.target).closest('.nav-toggle').length === 0) { 100 if ($(e.target).closest('.navigation').length === 0) { 101 closeMobileNav(); 102 } 103 } 104 }); 105 106 // Navigation through mobile nav 107 navWrapper.on('click', 'li.nav-dropdown > .nav-item > a + button', function() {
108 if (screenMode === 'mobile') { 109 var subMenu = $(this).parent('.nav-item').next('div[class*="lvl-"]').find('> ul'); 110 if (subMenu.length) { 111 subMenu.addClass('nav-show').attr('aria-hidden', 'false'); 112 subMenu.find('> li.nav-title > .nav-item > button:first-child, > li > .nav-item > a, > li > .nav-item > a + button').attr({ 113 'tabindex': '0', 114 'aria-hidden': 'false' 115 }); 116 mobNavPos -= 100; 117 navWrapper.css('transform', 'translateX(' + mobNavPos + '%)'); 118 119 // Hide parent items for looping within sub menus 120 var parentItems = subMenu.closest('li.nav-dropdown').parent('ul').find('> li > .nav-item > [tabindex="0"]'); 121 parentItems.attr('tabindex', '-1'); 122 } 123 } 124 }); 125 navWrapper.on('click', 'li.nav-dropdown .nav-title > .nav-item > button:first-child', function() { 126 if (screenMode === 'mobile') { 127 var subMenu = $(this).closest('div[class*="lvl-"] > ul'); 128 if (subMenu.length) { 129 mobNavPos += 100; 130 navWrapper.css('transform', 'translateX(' + mobNavPos + '%)'); 131 setTimeout(function() { 132 subMenu.removeClass('nav-show').attr('aria-hidden', 'true'); 133 subMenu.find('> li.nav-title > .nav-item > button:first-child, > li > .nav-item > a, > li > .nav-item > a + button').attr({ 134 'tabindex': '-1', 135 'aria-hidden': 'true' 136 }); 137 }, navAniDuration); 138 139 // Show parent items 140 var parentItems = subMenu.parent('div[class*="lvl-"]').parent('li').parent('ul').find('> li > .nav-item > [tabindex="-1"]'); 141 parentItems.attr('tabindex', '0'); 142 } 143 } 144 }); 145 146 // Leaving focus from last nav item inside dropdown 147 navWrapper.on('blur', '.nav-item > [tabindex="0"]:last', function() { 148 if (screenMode === 'mobile') { 149 $('.header .header-top .mobile-buttons .nav-toggle').focus(); 150 } 151 }); 152 153 // Reset nav on window resize 154 window.addEventListener('resize', function() { 155 if (screenMode === 'desktop' && window.innerWidth <= mobileView) { 156 screenMode = 'mobile'; 157 resetNav(); 158 } else if (screenMode === 'mobile' && window.innerWidth > mobileView) { 159 screenMode = 'desktop'; 160 resetNav(); 161 } 162 }); 163 164 // Dropdown buttons 165 navWrapper.on('click', '> li.nav-dropdown > .nav-item > a + button', function() { 166 if (screenMode === 'desktop') { 167 if ($(this).attr('aria-expanded') === 'false') { 168 navWrapper.find('> li.nav-dropdown').removeClass('open-nav'); 169 navWrapper.find('> li.nav-dropdown > .nav-item > a + button').attr('aria-expanded', 'false'); 170 $(this).closest('.header-nav > li.nav-dropdown').addClass('open-nav'); 171 $(this).attr('aria-expanded', 'true'); 172 $(this).parent('.nav-item').find('+ div.lvl-2 ul').attr('aria-hidden', 'false'); 173 $(this).parent('.nav-item').find('+ div.lvl-2 .nav-item > a').attr({ 174 'tabindex': '0', 175 'aria-hidden': 'false' 176 }); 177 } else if ($(this).attr('aria-expanded') === 'true') { 178 $(this).closest('.header-nav > li.nav-dropdown').removeClass('open-nav'); 179 $(this).attr('aria-expanded', 'false'); 180 $(this).parent('.nav-item').find('+ div.lvl-2 ul').attr('aria-hidden', 'true'); 181 $(this).parent('.nav-item').find('+ div.lvl-2 .nav-item > a').attr({ 182 'tabindex': '-1', 183 'aria-hidden': 'true' 184 }); 185 } 186 } 187 }); 188 189 // Escape keypress while navigating with keyboard 190 navWrapper.on('keyup', '.nav-item > a, .nav-item > button', function(e) { 191 if (e.key === 'Escape' || e.key === 'Esc') { 192 var currentL1 = $(this).closest('.header-nav > li.nav-dropdown');
193 if (screenMode === 'desktop' && currentL1.find('div.lvl-2').length) { 194 currentL1.removeClass('open-nav'); 195 currentL1.find('> .nav-item > button').attr('aria-expanded', 'false').focus(); 196 currentL1.find('div.lvl-2 ul').attr('aria-hidden', 'true'); 197 currentL1.find('div.lvl-2 .nav-item > a').attr({ 198 'tabindex': '-1', 199 'aria-hidden': 'true' 200 }); 201 } else if (screenMode === 'mobile') { 202 closeMobileNav(); 203 $('.header .header-top .mobile-buttons .nav-toggle').focus(); 204 } 205 } 206 }); 207 208 // Escape keypress while hovering over menu 209 navWrapper.on('mouseover', '> li.nav-dropdown', function() { 210 if (screenMode === 'desktop') { 211 $(document).on('keyup', function(e) { 212 if (e.key === 'Escape' || e.key === 'Esc') { 213 $(this).find('div.lvl-2').css('transform', 'unset'); 214 } 215 }); 216 if ($(this).find('div.lvl-2').attr('style')) { 217 $(this).find('div.lvl-2').attr('style', ''); 218 } 219 } 220 }) 221 222 // Leaving focus from last nav item inside dropdown 223 navWrapper.on('blur', '> li.nav-dropdown.open-nav div.lvl-2 .nav-item > a:last', function() { 224 if (screenMode === 'desktop') { 225 var currentL1 = $(this).closest('.header-nav > li.nav-dropdown'); 226 currentL1.removeClass('open-nav'); 227 currentL1.find('> .nav-item > button').attr('aria-expanded', 'false').focus(); 228 currentL1.find('div.lvl-2 ul').attr('aria-hidden', 'true'); 229 currentL1.find('div.lvl-2 .nav-item > a').attr({ 230 'tabindex': '-1', 231 'aria-hidden': 'true' 232 }); 233 } 234 }); 235 236 // Leaving focus from first nav item inside dropdown 237 navWrapper.on('keydown', '> li.nav-dropdown.open-nav div.lvl-2 .nav-item > a:first', function(e) { 238 if (screenMode === 'desktop') { 239 if (e.shiftKey && e.key === 'Tab') { 240 var currentL1 = $(this).closest('.header-nav > li.nav-dropdown'); 241 currentL1.removeClass('open-nav'); 242 currentL1.find('> .nav-item > button').attr('aria-expanded', 'false'); 243 currentL1.find('div.lvl-2 ul').attr('aria-hidden', 'true'); 244 currentL1.find('div.lvl-2 .nav-item > a').attr({ 245 'tabindex': '-1', 246 'aria-hidden': 'true' 247 }); 248 } 249 } 250 }); 251 252 // Nav touch 253 navWrapper.on('touchstart', '> li.nav-dropdown > .nav-item > a', function(e) { 254 if (screenMode === 'desktop') { 255 e.preventDefault(); 256 var btn = $(this).next('button'); 257 if (btn.length) { 258 if (btn.attr('aria-expanded') === 'false') { 259 navWrapper.find('> li.nav-dropdown').removeClass('open-nav'); 260 navWrapper.find('> li.nav-dropdown > .nav-item > a + button').attr('aria-expanded', 'false'); 261 btn.closest('.header-nav > li.nav-dropdown').addClass('open-nav'); 262 btn.attr('aria-expanded', 'true'); 263 btn.parent('.nav-item').find('+ div.lvl-2 ul').attr('aria-hidden', 'false'); 264 btn.parent('.nav-item').find('+ div.lvl-2 .nav-item > a').attr({ 265 'tabindex': '0', 266 'aria-hidden': 'false' 267 }); 268 } else if (btn.attr('aria-expanded') === 'true') { 269 btn.closest('.header-nav > li.nav-dropdown').removeClass('open-nav'); 270 btn.attr('aria-expanded', 'false'); 271 btn.parent('.nav-item').find('+ div.lvl-2 ul').attr('aria-hidden', 'true'); 272 btn.parent('.nav-item').find('+ div.lvl-2 .nav-item > a').attr({ 273 'tabindex': '-1', 274 'aria-hidden': 'true' 275 }); 276 } 277 } 278 } 279 }); 280 281 // Close desktop nav when clicked outside (Touch based) 282 $(document).on('touchstart', function(e) {
283 if (screenMode === 'desktop' && navWrapper.find('> li.nav-dropdown.open-nav').length) { 284 if ($(e.target).closest('.header .navigation .header-nav > li.nav-dropdown.open-nav').length === 0) { 285 var btn = navWrapper.find('> li.nav-dropdown.open-nav > .nav-item > button'); 286 if (btn.length) { 287 btn.closest('.header-nav > li.nav-dropdown').removeClass('open-nav'); 288 btn.attr('aria-expanded', 'false'); 289 btn.parent('.nav-item').find('+ div.lvl-2 ul').attr('aria-hidden', 'true'); 290 btn.parent('.nav-item').find('+ div.lvl-2 .nav-item > a').attr({ 291 'tabindex': '-1', 292 'aria-hidden': 'true' 293 }); 294 } 295 } 296 } 297 }); 298});
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.