PageSourceSearch

https://www.census.gov/etc.clientlibs/census/clientlibs/universalh…der.min.5cd274db0d00d4643e944bef646f6b9f.js

js census.gov collected 2026-09-24 06:23:44 UTC 27,664 bytes, 694 lines download raw bytes

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.