1/* 2 * This code is coupled with the Census search typeahead HTL. 3 * 4 * It is framework-less and should remain that way for the foreseeable future to aid other, non-AEM census pages to utilize it. 5 * 6 * As such, it does not inject any dependencies. 7 * 8 */ 9var CensusSearchTypeahead = (function() { // DO NOT INJECT FRAMEWORKS OR DEPENDENCIES THAT RELY ON FRAMEWORKS. 10 11 var apiUri; 12 var resultUrl; 13 var cedsciUrl; 14 var isUSASearch; 15 16 var initSearchTypeahead = function(searchApiUri, searchResultUrl, cedsciUrl, isUsingUSASearch) { 17 apiUri = searchApiUri; 18 resultUrl = searchResultUrl; 19 isUSASearch = (isUsingUSASearch == 'true'); 20 21 // Move entire search structure to root of page to make masking simpler 22 // var $search = $( '.uscb-header-search-container' ); 23 // if ( $search.length > 0 ) { 24 // $( 'body' ).append( $search ); 25 // } 26 27 // Add a keyup event listener to our input element 28 var searchInput = document.getElementById('data-uscb-header-input'); 29 30 var throttle = function(fn, threshhold, scope) { 31 threshhold || (threshhold = 250); 32 var last, 33 deferTimer; 34 return function () { 35 var context = scope || this; 36 37 var now = +new Date, 38 args = arguments; 39 if (last && now < last + threshhold) { 40 // hold on to it 41 clearTimeout(deferTimer); 42 deferTimer = setTimeout(function () { 43 last = now; 44 fn.apply(context, args); 45 }, threshhold); 46 } else { 47 last = now; 48 fn.apply(context, args); 49 } 50 }; 51 } 52 53 var parseResponse = function(xmlDoc) { 54 55 var getValue = function(xml, name) { 56 var elt = xml.getElementsByTagName(name); 57 if (elt && elt[0] && elt[0].childNodes && elt[0].childNodes[0] && elt[0].childNodes[0].nodeValue) { 58 return elt[0].childNodes[0].nodeValue; 59 } 60 61 return ""; 62 } 63 64 var getNestedValue = function(xml, outerName, innerName) { 65 var outerXml = xml.getElementsByTagName(outerName); 66 if (outerXml && outerXml[0]) { 67 return getValue(outerXml[0], innerName); 68 } 69 70 return ""; 71 } 72 73 var result = {}; 74 75 var answerXml = xmlDoc.getElementsByTagName("Answer"); 76 if (answerXml && answerXml[0]) { 77 answerXml = answerXml[0]; 78 result.answers = { 79 ansValue: getValue(answerXml, "Value"), 80 ansGeography: getValue(answerXml, "Geography"), 81 prefix: getValue(answerXml, "Prefix"), 82 suffix: getValue(answerXml, "Suffix"), 83 ansLastUpdated: getValue(answerXml, "LastUpdated"), 84 ansDescription: getValue(answerXml, "Description"), 85 ansSystemDesc: getNestedValue(answerXml, "System", "Description"), 86 ansSystemURL: getNestedValue(answerXml, "System", "URL"), 87 } 88 } 89 90 var resultXml = xmlDoc.getElementsByTagName("result"); 91 if (resultXml) { 92 result.results = []; 93 for (var i = 0; i < resultXml.length; i++) { 94 if (resultXml[i]) { 95 var resultXmlItem = resultXml[i]; 96 var category = resultXmlItem.getAttribute("category"); 97 var targetCategoryObj = undefined; 98 for (var j = 0; j < result.results.length; j++) { 99 if (result.results[j].category === category) { 100 targetCategoryObj = result.results[j]; 101 } 102 } 103 if (targetCategoryObj === undefined) { 104 targetCategoryObj = { 105 category: category, 106 items: [] 107 } 108 result.results.push(targetCategoryObj); 109 } 110 targetCategoryObj.items.push({ 111 value: resultXmlItem.getAttribute("name") 112 }) 113 } 114 } 115 116 } 117 118 return (result.answers || result.results) ? result : undefined; 119 } 120 121 var callTypeaheadService = function(query) { 122 // Unhide loading indicator 123 var $search = $( '.uscb-header-search' ); 124 var $loading = $search.find( '.uscb-loading-linear-indeterminate' ); 125 126 $loading.removeClass( 'uscb-hide' ); 127 128 SearchDataService.typeahead( query ).then( function( data ) { 129 // Hide loading indicator 130 $loading.addClass( 'uscb-hide' ); 131 132 var $typeahead = $( '#data-uscb-header-search-typeahead' ); 133 var $typeaheadContainer = $( '#data-uscb-header-search-typeahead-container' ); 134 var $helpfulLinks = $( '#data-uscb-header-links-helpful' ); 135 136 // Clear the typeahead before repopulating 137 $typeahead.empty(); 138 139 // Build typeahead based on returned suggestions 140 if ( data && data.length > 0 ) { 141 var $container = $( '<div class="uscb-typeahead-container"></div>' ); 142 data.forEach( function( suggestion ) { 143 var $entry; 144 if ( suggestion.type === 'tableid' ) { 145 $entry = $( '<a class="uscb-typeahead-entry" href="' + cedsciUrl.replace( 'api/','' ) + 'table?q=' + suggestion.facets.tableid + '">' + suggestion.title + '</a>' ); 146 } else { 147 $entry = $( '<a style="display: flex; align-items: center" class="uscb-typeahead-entry" href="' + resultUrl + suggestion.title + '">' + suggestion.title + '</a>' ); 148 } 149 150 // Add icon 151 switch(suggestion.type) { 152 case "topic": 153 case "geography": 154 case "naics": 155 case "survey": 156 case "year": 157 $($entry).prepend(`<img 158 src="/etc.clientlibs/census/clientlibs/cedsci-icons/resources/${suggestion.type}.svg" 159 class="uscb-typeahead-entry-icon" 160 alt="Icon"/>`); 161 break; 162 } 163 164 $container.append( $entry ); 165 }); 166 167 $typeahead.append( $container ); 168 $typeaheadContainer.removeClass( 'uscb-hide' ); 169 $helpfulLinks.addClass( 'uscb-hide' ); 170 } else { 171 $typeaheadContainer.addClass( 'uscb-hide' ); 172 $helpfulLinks.removeClass( 'uscb-hide' ); 173 } 174 }, function() { 175 // Hide loading indicator 176 $loading.addClass( 'uscb-hide' ); 177 }); 178 } 179 180 // Autocomplete for form 181 var hinter = function(event) { 182 183 // retireve the input element 184 var input = event.target; 185 186 // minimum number of characters before we start to generate suggestions 187 var min_characters = 3; 188 189 if (input.value.length < min_characters ) { 190 $( '#data-uscb-header-search-typeahead-container' ).addClass( 'uscb-hide' ); 191 $( '#data-uscb-header-links-helpful' ).removeClass( 'uscb-hide' ); 192 return; 193 } else { 194 callTypeaheadService( input.value ); 195 } 196 } 197 198 searchInput.addEventListener("keyup", throttle(hinter)); 199 // so we can abort old requests when a new one is make 200 window.hinterXHR = new XMLHttpRequest(); 201
202 // do some clean up on form submit 203 var $form = $(searchInput).closest('form'); 204 $form.on('submit', function() { 205 $form.find('#usaSearchName').remove(); 206 $form.find('#usaSearchApi').remove(); 207 }); 208 209 } 210 211 var onSearchFocus = function() { 212 // Take over the header and hide all non-search elements 213 toggleHeaderVisibility( false ); 214 toggleSearchVisibility( true ); 215 216 var $input = $( '.uscb-header-input' ); 217 if ( $input.length > 0 ) { 218 $input.focus(); 219 } 220 } 221 222 // Set non-search header items to given visibility 223 function toggleHeaderVisibility( show ) { 224 var $logo = $( '.uscb-header-logo' ); 225 var $subNavs = $( '.uscb-header-nav-subs' ); 226 var $mainNav = $( '.uscb-header-mainnav' ); 227 228 if ( show ) { 229 if ( $logo.length > 0 ) { 230 $logo.show(); 231 } 232 233 if ( $subNavs.length > 0 ) { 234 $subNavs.show() 235 } 236 237 if ( $mainNav.length > 0 ) { 238 $mainNav.show(); 239 } 240 } else { 241 if ( $logo.length > 0 ) { 242 $logo.hide(); 243 } 244 245 if ( $subNavs.length > 0 ) { 246 $subNavs.hide() 247 } 248 249 if ( $mainNav.length > 0 ) { 250 $mainNav.hide(); 251 } 252 } 253 } 254 255 // Toggle search header items to given visibility 256 function toggleSearchVisibility( show ) { 257 var $input = $( '.uscb-header-input' ); 258 259 if ( show ) { 260 if ( $input.length > 0 ) { 261 $input.show(); 262 } 263 } else { 264 if ( $input.length > 0 ) { 265 $input.hide(); 266 } 267 } 268 } 269 270 var onSearchFocusBlur = function(active) { 271 var $searchContainer = $( '.uscb-header-search-container' ); 272 if ( $searchContainer.length > 0 ) { 273 if ( active ) { 274 $searchContainer.show(); 275 $searchContainer.addClass( 'uscb-header-search-container-active' ); 276 } else { 277 $searchContainer.hide(); 278 $searchContainer.removeClass( 'uscb-header-search-container-active' ); 279 } 280 } 281 282 var searchIcon = document.getElementsByClassName("uscb-header-search-icon"); 283 if (searchIcon && searchIcon[0]) { 284 searchIcon[0].style.display = active ? "none" : "block"; 285 } 286 var searchButtons = document.getElementsByClassName("data-uscb-header-search-input-button"); 287 if (searchButtons) { 288 for (var i = 0; i < searchButtons.length; i++) { 289 searchButtons[i].style.display = active ? "block" : "none"; 290 } 291 } 292 293 if (typeof(document.getElementsByClassName("uscb-header-backdrop")) !== 'undefined' && 294 document.getElementsByClassName("uscb-header-backdrop") != null && document.getElementsByClassName("uscb-header-backdrop").length > 0) { 295 document.getElementsByClassName("uscb-header-backdrop")[0].style.display = active ? "block" : "none"; 296 } 297 298 if (!active && (typeof(document.getElementById("data-uscb-header-search-typeahead")) !== 'undefined' && 299 document.getElementById("data-uscb-header-search-typeahead") != null && document.getElementById("data-uscb-header-search-typeahead").length > 0)) { 300 // Don't activate unnecessarily, since search terms might not be present. 301 $("#data-uscb-header-search-typeahead-container").addClass( 'uscb-hide' ); 302 } 303 304 // Close typeahead on blur if clicking outisde typeahead/search bar 305 if ( !active ) { 306 var typeahead = $("#data-uscb-header-search-typeahead-container"); 307 if ( typeahead ) { 308 typeahead.addClass( 'uscb-hide' ); 309 } 310 } else { 311 var typeahead = $("#data-uscb-header-search-typeahead-container"); 312 if ( typeahead ) { 313 var typeaheadContainer = typeahead.find( 'uscb-typeahead-container' ); 314 if ( typeaheadContainer.length > 0 && typeaheadContainer.childNodes.length !== 0 ) { 315 $("#data-uscb-header-links-helpful").removeClass( 'uscb-hide' ); 316 } 317 } 318 319 var $input = $( '#data-uscb-header-input' ); 320 if ( $input.length > 0 ) { 321 $input.focus(); 322 } 323 } 324 } 325 326 var onSearchCloseClick = function() { 327 document.getElementById("data-uscb-header-input").value = ""; 328 $("#data-uscb-header-search-typeahead-container").addClass( 'uscb-hide' ); 329 $("#data-uscb-header-links-helpful").removeClass( 'uscb-hide' ); 330 331 onSearchFocusBlur(false); 332 } 333 334 var onSearchButtonClick = function() { 335 document.getElementById("data-uscb-header-search-form").submit(); 336 } 337 338 return { 339 initSearchTypeahead: initSearchTypeahead, 340 onSearchFocus: onSearchFocus, 341 onSearchFocusBlur: onSearchFocusBlur, 342 onSearchCloseClick: onSearchCloseClick, 343 onSearchButtonClick: onSearchButtonClick 344 } 345 346})(); // DO NOT INJECT FRAMEWORKS OR DEPENDENCIES THAT RELY ON FRAMEWORKS. 347 348/* 349 * This code is coupled with the Census main header HTL. 350 * 351 * It is framework-less and should remain that way for the foreseeable future to aid other, non-AEM census pages to utilize it. 352 * 353 * As such, it does not inject any dependencies, UNLESS the dependency is also depen
353dency-less like CensusSearchTypeahead. 354 * 355 */ 356var CensusUniversalHeader = (function(CensusSearchTypeahead) { // DO NOT INJECT FRAMEWORKS OR DEPENDENCIES THAT RELY ON FRAMEWORKS. 357 358 var activeTab; 359 var toggleOverlayIDs = []; 360 361 // Hide all togglable menus on scroll 362 document.addEventListener( "scroll", function(event) { 363 toggleOverlay( false ); 364 togglePanel( false ); 365 }); 366 367 var initHeader = function() { 368 activeTab = document.querySelector( '.uscb-header-mainnav-tab-active' ); 369 } 370 371 var toggleOverlay = function( show, idx ) { 372 const openAndCloseOverlay = () => { 373 var tabs = document.getElementsByClassName( 'uscb-header-mainnav-tab' ); 374 for ( var i = 0; i < tabs.length; i++ ) { 375 if ( show ) { 376 if ( i === idx ) { 377 // Replace the space if captured by the regex 378 tabs[i].className = tabs[i].className.replace( /( )?(uscb\-header\-mainnav\-tab\-inactive)/g, '$1uscb-header-mainnav-tab-active' ); 379 } else { 380 tabs[i].className = tabs[i].className.replace( /( )?(uscb\-header\-mainnav\-tab\-active)/g, '$1uscb-header-mainnav-tab-inactive' ); 381 } 382 } else { 383 tabs[i].className = tabs[i].className.replace( /( )?(uscb\-header\-mainnav\-tab\-active)/g, '$1uscb-header-mainnav-tab-inactive' ); 384 } 385 } 386 387 if ( !show && activeTab ) { 388 // Reset the active tab 389 activeTab.className = activeTab.className.replace( 'uscb-header-mainnav-tab-inactive', 'uscb-header-mainnav-tab-active' ); 390 } 391 392 var overlayWrapper = document.getElementsByClassName( 'uscb-header-overlay-wrapper' ); 393 if ( overlayWrapper.length === 1 ) { 394 var overlayItems = document.getElementsByClassName( 'uscb-header-overlay-item' ); 395 for ( var i = 0; i < overlayItems.length; i++ ) { 396 var item = overlayItems[ i ]; 397 if ( item.className.indexOf( 'uscb-header-overlay-item-' + idx ) !== -1 ) { 398 toggleVisibility( show, item ); 399 } else { 400 toggleVisibility( !show, item ); 401 } 402 } 403 404 var overlayBackdrop = document.getElementsByClassName( 'uscb-header-overlay-backdrop' ); 405 if ( overlayBackdrop.length === 1 ) { 406 toggleVisibility( show, overlayBackdrop[0] ); 407 } 408 409 toggleVisibility( show, overlayWrapper[0] ); 410 } 411 } 412 413 toggleOverlayIDs.forEach((timerId) => { 414 clearTimeout(timerId); 415 }); 416 toggleOverlayIDs = []; 417 let overlayWrapperEle = document.getElementsByClassName( 'uscb-header-overlay-wrapper' ); 418 overlayWrapperEle = overlayWrapperEle && overlayWrapperEle[0]; 419 420 if (overlayWrapperEle?.className.includes('uscb-hide') || !show) { 421 const OverlayTimerId = setTimeout(() => { 422 openAndCloseOverlay(); 423 }, 300); 424 toggleOverlayIDs.push(OverlayTimerId); 425 } else { 426 openAndCloseOverlay(); 427 } 428 } 429 430 var togglePanel = function( show ) { 431 var container = document.getElementsByClassName( 'uscb-header-panel-container' ); 432 if ( container.length === 1 ) { 433 toggleVisibility( show, container[0] ); 434 } 435 436 document.body.style.overflow = show ? 'hidden' : 'auto'; 437 } 438 439 var navigatePanel = function( show, key ) { 440 var topClass = 'uscb-header-panel-top'; 441 var contentClass = 'uscb-header-panel-content'; 442 443 var panelTops = document.getElementsByClassName( topClass ); 444 var panelContents = document.getElementsByClassName( contentClass ); 445 446 // Number of tops should always match number of content containers 447 if ( panelTops.length !== panelContents.length ) { 448 console.log( "ERROR: Header panel misconfigured." ); 449 } 450 451 for ( var i = 0; i < panelTops.length; i++ ) { 452 var top = panelTops[i]; 453 var content = panelContents[i]; 454 455 if ( top.className.indexOf( topClass + '-' + key ) !== -1 ) { 456 toggleVisibility( show, top ); 457 } else { 458 toggleVisibility( !show, top ); 459 } 460 461 if ( content.className.indexOf( contentClass + '-' + key ) !== -1 ) { 462 toggleVisibility( show, content ); 463 } else { 464 toggleVisibility( !show, content ); 465 } 466 } 467 } 468 469 function toggleVisibility( show, el ) { 470 if ( show ) { 471 el.className = el.className.replace( /( )?(uscb\-hide)/g, '' ); 472 } else { 473 if ( el.className.indexOf( 'uscb-hide' ) === -1 ) { 474 el.className += ' uscb-hide'; 475 } 476 } 477 } 478 479 function keypress( event, idx ) { 480 // Arrow down to open menu and move focus 481 if ( event.keyCode === 40 ) { 482 toggleOverlay( true, idx ); 483 484 var overlayItem = document.getElementsByClassName( 'uscb-header-overlay-item-' + idx ); 485 if (overlayItem.length > 0 ) { 486 var firstLink = overlayItem[0].querySelector( 'a' ); 487 if ( firstLink ) { 488 firstLink.focus(); 489 } 490 } 491 492 // Stop the keypress from doing anything else on the page 493 event.preventDefault(); 494 event.stopPropagation(); 495 } 496 } 497 498 // Force a shift in tab order at the end of each overlay subnav list by refocusing the current tab and simulating a tab press 499 function tabToNextMainItem( event, idx, last ) { 500 if ( last && event && event.keyCode === 9 ) { 501 var tabs = document.getElementsByClassName( 'uscb-header-mainnav-tab' ); 502 var currentTab = tabs[ idx ]; 503 var currentTabLink = currentTab.querySelector( 'a' ); 504 currentTabLink.focus(); 505 document.body.dispatchEvent( new KeyboardEvent( 'keydown', { 'keyCode': 61 } ) ); 506 507 toggleOverlay( false ); 508 } 509 } 510 511 var closeDropdowns = function(idPrefix, navItemIdPrefix, navItemLinkIdPrefix, navItemLength, skipIndex) { 512 for (var i = 0; i < navItemLength; i++) { 513 if (skipIndex !== undefined && i === skipIndex) { 514 continue; 515 } 516 var other = document.getElementById(idPrefix + i); 517 if (other) { 518 other.style.display = "none"; 519 } 520 521 var otherNavItemTarget = document.getElementById(navItemIdPrefix + i); 522 otherNavItemTarget.classList.remove("uscb-nav-item-hover"); 523 524 var otherNavItemLinkTarget = document.getElementById(navItemLinkIdPrefix + i); 525 otherNavItemLinkTarget.classList.remove("uscb-nav-item-link-hover"); 526 } 527 528 setMenuTabOrders(0); 529 } 530 531 var onActivateMenu = function(active, idPrefix, navItemIdPrefix, navItemLinkIdPrefix, index, navItemLength) { 532 if (active === true) { 533 CensusSearchTypeahead.onSearchFocusBlur(false); 534 535 var target = document.getElementById(idPrefix + index); 536 537 // Show targetted dropdown 538 if (target && target.style.display === "none") { 539 target.style.display = "flex"; 540 541 var navItemTarget = document.getElementById(navItemIdPrefix + index); 542 navItemTarget.className += " uscb-nav-item-hover"; 543 544 var navItemLinkTarget = document.getElementById(navItemLinkIdPrefix + index); 545 navItemLinkTarget.className += " uscb-nav-item-link-hover"; 546 } 547 548 // Close all other dropdowns 549 closeDropdowns(idPrefix, navItemIdPrefix, navItemLinkIdPrefix, navItemLength, index); 550 } else if (active === false) { 551 // Close ALL dropdowns 552 setTimeout( closeDropdowns, 300, idPrefix, navItemIdPrefix, navItemLinkIdPrefix, navItemLength ); 553 } else if (active === "toggle") { 554 var target = document.getElementById(idPrefix + index); 555 if (target) { 556 if (target.style.display === "none") { 557 window.headerOpenIndex = index; 558 onActivateMenu(true, idPrefix, navItemIdPrefix, navItemLinkIdPrefix, index, navItemLength); 559 } else if (target.style.display === "flex") { 560 closeDropdowns(idPrefix, navItemIdPrefix, navItemLinkIdPrefix, navItemLength); 561 if (index !== window.headerOpenIndex) { 562 window.headerOpenIndex = index; 563 onActivateMenu(true, idPrefix, navItemIdPrefix, navItemLinkIdPrefix, index, navItemLength); 564 } 565 } 566 } 567 } 568 } 569 570 var onHoverLeave = function(idPrefix, navItemIdPrefix, navItemLinkIdPrefix, index, navItemLength) { 571 setTimeout( closeDropdowns(idPrefix, navItemIdPrefix, navItemLinkIdPrefix, navItemLength), 300 ); 572 } 573 574 var toggleMenu = function(idPrefix, navItemIdPrefix, navItemLinkIdPrefix, firstExpandedIndex, navItemLength) { 575 var header = document.getElementById("data-uscb-main-header"); 576 var headerMenu = document.getElementById("data-uscb-header-menu"); 577 var headerMenuButton = document.getElementsByClassName("uscb-menu-icon-container")[0]; 578 var closeText = document.getElementById("data-uscb-header-close"); 579 if (headerMenu.classList.contains("uscb-hide-md")) { 580 // Open 581 header.classList.add("uscb-header-fixed"); 582 headerMenu.classList.remove("uscb-hide-md"); 583 headerMenu.classList.add("uscb-show-md"); 584 headerMenuButton.classList.add("uscb-menu-change"); 585 headerMenuButton.style.width = "90px"; 586 closeText.style.display = "block"; 587 588 onActivateMenu(true, idPrefix, navItemIdPrefix, navItemLinkIdPrefix, firstExpandedIndex, navItemLength); 589 } else if (headerMenu.classList.contains("uscb-show-md")) { 590 // Close 591 header.classList.remove("uscb-header-fixed"); 592 headerMenu.classList.remove("uscb-show-md"); 593 headerMenu.classList.add("uscb-hide-md"); 594 headerMenuButton.classList.remove("uscb-menu-change"); 595 headerMenuButton.style.width = "auto"; 596 closeText.style.display = "none"; 597 } 598 } 599 600 var onKeyParent = function(event, idPrefix, index) { 601 if (event.keyCode === 9 && !event.shiftKey) { 602 setMenuTabOrders(-1); 603 } 604 } 605 606 var onKeyChildLast = function(event, parentMenuId) { 607 if (event.keyCode === 9 && !event.shiftKey) { 608 setMenuTabOrders(0); 609 if ( !isLastHeaderItem( parentMenuId ) ) { 610 var target = document.getElementById(parentMenuId); 611 if (target) {
612 target.focus(); 613 event.stopPropagation(); 614 } 615 } 616 } 617 } 618 619 var onKeyChildFirst = function(event, parentMenuId) { 620 if (event.keyCode === 9 && event.shiftKey) { 621 setMenuTabOrders(0); 622 var target = document.getElementById(parentMenuId); 623 if (target) { 624 target.focus(); 625 event.stopPropagation(); 626 } 627 } 628 } 629 630 function isLastHeaderItem( parentMenuId ) { 631 var parentMenuItem = document.querySelector( '.uscb-header-menu #' + parentMenuId ); 632 var menuItems = document.querySelectorAll( '.uscb-header-menu a[id*="data-uscb-header-nav-item-"]' ); 633 return parentMenuItem === menuItems[ menuItems.length - 1 ]; 634 } 635 636 function setMenuTabOrders(order) { 637 var menuItems = document.querySelectorAll( '.uscb-header-menu a[id*="data-uscb-header-nav-item-"]' ); 638 if ( menuItems ) { 639 // Old for loop type to support IE 640 for ( var i = 0; i < menuItems.length; i++ ) { 641 menuItems[i].setAttribute('tabindex', order); 642 } 643 } 644 } 645 646 return { 647 toggleOverlay : toggleOverlay, 648 togglePanel : togglePanel, 649 navigatePanel : navigatePanel, 650 keypress : keypress, 651 tabToNextMainItem : tabToNextMainItem, 652 initHeader : initHeader, 653 onActivateMenu : onActivateMenu, 654 closeDropdowns : closeDropdowns, 655 onHoverLeave : onHoverLeave, 656 toggleMenu : toggleMenu, 657 onKeyParent : onKeyParent, 658 onKeyChildLast : onKeyChildLast, 659 onKeyChildFirst : onKeyChildFirst 660 } 661 662})(CensusSearchTypeahead); // DO NOT INJECT FRAMEWORKS OR DEPENDENCIES THAT RELY ON FRAMEWORKS. 663 664 665 // TODO: Genericize dropdown adn consolidate usages across components 666var $mobileNav = $('#data-uscb-input-wrapper-mobile-header-nav'); 667 668$mobileNav.click(function(e) { 669 var $dropdown = $mobileNav.find('ul'); 670 if ( $dropdown[0] ) { 671 if ( $dropdown[0].style.display === 'none' ) { 672 $dropdown[0].style.display = 'block'; 673 $mobileNav.attr('aria-expanded', 'true'); 674 } else { 675 $dropdown[0].style.display = 'none'; 676 $mobileNav.attr('aria-expanded', 'false'); 677 } 678 } 679}); 680 681 682$(window).click(function(e){ 683 if ( $(e.target).closest( '#data-uscb-input-wrapper-mobile-header-nav' )[0] !== undefined ) { 684 //do nothing... 685 } else { 686 var $dropdown = $mobileNav.find('ul'); 687 if ( $dropdown[0] ) { 688 if ( $dropdown[0].style.display === 'block' ) { 689 $dropdown[0].style.display = 'none'; 690 } 691 } 692 } 693}); 694
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.