127 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| ( function() {
 | |
| 	'use strict';
 | |
| 
 | |
| 	if ( 'querySelector' in document && 'addEventListener' in window ) {
 | |
| 		/**
 | |
| 		 * Navigation search.
 | |
| 		 *
 | |
| 		 * @param {Object} e The event.
 | |
| 		 * @param {Object} item The clicked item.
 | |
| 		 */
 | |
| 		var toggleSearch = function( e, item ) {
 | |
| 			e.preventDefault();
 | |
| 
 | |
| 			if ( ! item ) {
 | |
| 				item = this;
 | |
| 			}
 | |
| 
 | |
| 			var forms = document.querySelectorAll( '.navigation-search' ),
 | |
| 				toggles = document.querySelectorAll( '.search-item' ),
 | |
| 				focusableEls = document.querySelectorAll( 'a[href], area[href], input:not([disabled]):not(.navigation-search), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex="0"]' ),
 | |
| 				nav = '';
 | |
| 
 | |
| 			if ( item.closest( '.mobile-menu-control-wrapper' ) ) {
 | |
| 				nav = document.getElementById( 'site-navigation' );
 | |
| 			}
 | |
| 
 | |
| 			for ( var i = 0; i < forms.length; i++ ) {
 | |
| 				if ( forms[ i ].classList.contains( 'nav-search-active' ) ) {
 | |
| 					if ( forms[ i ].closest( '#sticky-placeholder' ) ) {
 | |
| 						continue;
 | |
| 					}
 | |
| 
 | |
| 					forms[ i ].classList.remove( 'nav-search-active' );
 | |
| 
 | |
| 					var activeSearch = document.querySelector( '.has-active-search' );
 | |
| 
 | |
| 					if ( activeSearch ) {
 | |
| 						activeSearch.classList.remove( 'has-active-search' );
 | |
| 					}
 | |
| 
 | |
| 					for ( var t = 0; t < toggles.length; t++ ) {
 | |
| 						toggles[ t ].classList.remove( 'close-search' );
 | |
| 						toggles[ t ].classList.remove( 'active' );
 | |
| 						toggles[ t ].querySelector( 'a' ).setAttribute( 'aria-label', generatepressNavSearch.open );
 | |
| 
 | |
| 						// Allow tabindex on items again.
 | |
| 						for ( var f = 0; f < focusableEls.length; f++ ) {
 | |
| 							if ( ! focusableEls[ f ].closest( '.navigation-search' ) && ! focusableEls[ f ].closest( '.search-item' ) ) {
 | |
| 								focusableEls[ f ].removeAttribute( 'tabindex' );
 | |
| 							}
 | |
| 						}
 | |
| 					}
 | |
| 
 | |
| 					document.activeElement.blur();
 | |
| 				} else {
 | |
| 					if ( forms[ i ].closest( '#sticky-placeholder' ) ) {
 | |
| 						continue;
 | |
| 					}
 | |
| 
 | |
| 					var openedMobileMenu = forms[ i ].closest( '.toggled' );
 | |
| 
 | |
| 					if ( openedMobileMenu ) {
 | |
| 						// Close the mobile menu.
 | |
| 						openedMobileMenu.querySelector( 'button.menu-toggle' ).click();
 | |
| 					}
 | |
| 
 | |
| 					if ( nav ) {
 | |
| 						nav.classList.add( 'has-active-search' );
 | |
| 					}
 | |
| 
 | |
| 					forms[ i ].classList.add( 'nav-search-active' );
 | |
| 
 | |
| 					var container = this.closest( 'nav' );
 | |
| 
 | |
| 					if ( container ) {
 | |
| 						if ( container.classList.contains( 'mobile-menu-control-wrapper' ) ) {
 | |
| 							container = nav;
 | |
| 						}
 | |
| 
 | |
| 						var searchField = container.querySelector( '.search-field' );
 | |
| 
 | |
| 						if ( searchField ) {
 | |
| 							searchField.focus();
 | |
| 						}
 | |
| 					}
 | |
| 
 | |
| 					for ( t = 0; t < toggles.length; t++ ) {
 | |
| 						toggles[ t ].classList.add( 'active' );
 | |
| 						toggles[ t ].querySelector( 'a' ).setAttribute( 'aria-label', generatepressNavSearch.close );
 | |
| 
 | |
| 						// Trap tabindex within the search element
 | |
| 						for ( f = 0; f < focusableEls.length; f++ ) {
 | |
| 							if ( ! focusableEls[ f ].closest( '.navigation-search' ) && ! focusableEls[ f ].closest( '.search-item' ) ) {
 | |
| 								focusableEls[ f ].setAttribute( 'tabindex', '-1' );
 | |
| 							}
 | |
| 						}
 | |
| 
 | |
| 						toggles[ t ].classList.add( 'close-search' );
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		};
 | |
| 
 | |
| 		if ( document.body.classList.contains( 'nav-search-enabled' ) ) {
 | |
| 			var searchItems = document.querySelectorAll( '.search-item' );
 | |
| 
 | |
| 			for ( var i = 0; i < searchItems.length; i++ ) {
 | |
| 				searchItems[ i ].addEventListener( 'click', toggleSearch, false );
 | |
| 			}
 | |
| 
 | |
| 			// Close navigation search on escape key
 | |
| 			document.addEventListener( 'keydown', function( e ) {
 | |
| 				if ( document.querySelector( '.navigation-search.nav-search-active' ) ) {
 | |
| 					if ( 'Escape' === e.key ) {
 | |
| 						var activeSearchItems = document.querySelectorAll( '.search-item.active' );
 | |
| 
 | |
| 						for ( var activeSearchItem = 0; activeSearchItem < activeSearchItems.length; activeSearchItem++ ) {
 | |
| 							toggleSearch( e, activeSearchItems[ activeSearchItem ] );
 | |
| 							break;
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}, false );
 | |
| 		}
 | |
| 	}
 | |
| }() );
 |