| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | /* global twentyseventeenScreenReaderText */ | 
					
						
							|  |  |  | (function( $ ) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Variables and DOM Caching.
 | 
					
						
							|  |  |  | 	var $body = $( 'body' ), | 
					
						
							|  |  |  | 		$customHeader = $body.find( '.custom-header' ), | 
					
						
							|  |  |  | 		$branding = $customHeader.find( '.site-branding' ), | 
					
						
							|  |  |  | 		$navigation = $body.find( '.navigation-top' ), | 
					
						
							|  |  |  | 		$navWrap = $navigation.find( '.wrap' ), | 
					
						
							|  |  |  | 		$navMenuItem = $navigation.find( '.menu-item' ), | 
					
						
							|  |  |  | 		$menuToggle = $navigation.find( '.menu-toggle' ), | 
					
						
							|  |  |  | 		$menuScrollDown = $body.find( '.menu-scroll-down' ), | 
					
						
							|  |  |  | 		$sidebar = $body.find( '#secondary' ), | 
					
						
							|  |  |  | 		$entryContent = $body.find( '.entry-content' ), | 
					
						
							|  |  |  | 		$formatQuote = $body.find( '.format-quote blockquote' ), | 
					
						
							|  |  |  | 		isFrontPage = $body.hasClass( 'twentyseventeen-front-page' ) || $body.hasClass( 'home blog' ), | 
					
						
							|  |  |  | 		navigationFixedClass = 'site-navigation-fixed', | 
					
						
							|  |  |  | 		navigationHeight, | 
					
						
							|  |  |  | 		navigationOuterHeight, | 
					
						
							|  |  |  | 		navPadding, | 
					
						
							|  |  |  | 		navMenuItemHeight, | 
					
						
							|  |  |  | 		idealNavHeight, | 
					
						
							|  |  |  | 		navIsNotTooTall, | 
					
						
							|  |  |  | 		headerOffset, | 
					
						
							|  |  |  | 		menuTop = 0, | 
					
						
							|  |  |  | 		resizeTimer; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Ensure the sticky navigation doesn't cover current focused links.
 | 
					
						
							|  |  |  | 	$( 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], [contenteditable]', '.site-content-contain' ).filter( ':visible' ).focus( function() { | 
					
						
							|  |  |  | 		if ( $navigation.hasClass( 'site-navigation-fixed' ) ) { | 
					
						
							|  |  |  | 			var windowScrollTop = $( window ).scrollTop(), | 
					
						
							|  |  |  | 				fixedNavHeight = $navigation.height(), | 
					
						
							|  |  |  | 				itemScrollTop = $( this ).offset().top, | 
					
						
							|  |  |  | 				offsetDiff = itemScrollTop - windowScrollTop; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// Account for Admin bar.
 | 
					
						
							|  |  |  | 			if ( $( '#wpadminbar' ).length ) { | 
					
						
							|  |  |  | 				offsetDiff -= $( '#wpadminbar' ).height(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if ( offsetDiff < fixedNavHeight ) { | 
					
						
							|  |  |  | 				$( window ).scrollTo( itemScrollTop - ( fixedNavHeight + 50 ), 0 ); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Set properties of navigation.
 | 
					
						
							|  |  |  | 	function setNavProps() { | 
					
						
							|  |  |  | 		navigationHeight      = $navigation.height(); | 
					
						
							|  |  |  | 		navigationOuterHeight = $navigation.outerHeight(); | 
					
						
							|  |  |  | 		navPadding            = parseFloat( $navWrap.css( 'padding-top' ) ) * 2; | 
					
						
							|  |  |  | 		navMenuItemHeight     = $navMenuItem.outerHeight() * 2; | 
					
						
							|  |  |  | 		idealNavHeight        = navPadding + navMenuItemHeight; | 
					
						
							|  |  |  | 		navIsNotTooTall       = navigationHeight <= idealNavHeight; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Make navigation 'stick'.
 | 
					
						
							|  |  |  | 	function adjustScrollClass() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Make sure we're not on a mobile screen.
 | 
					
						
							|  |  |  | 		if ( 'none' === $menuToggle.css( 'display' ) ) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// Make sure the nav isn't taller than two rows.
 | 
					
						
							|  |  |  | 			if ( navIsNotTooTall ) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// When there's a custom header image or video, the header offset includes the height of the navigation.
 | 
					
						
							|  |  |  | 				if ( isFrontPage && ( $body.hasClass( 'has-header-image' ) || $body.hasClass( 'has-header-video' ) ) ) { | 
					
						
							|  |  |  | 					headerOffset = $customHeader.innerHeight() - navigationOuterHeight; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					headerOffset = $customHeader.innerHeight(); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// If the scroll is more than the custom header, set the fixed class.
 | 
					
						
							|  |  |  | 				if ( $( window ).scrollTop() >= headerOffset ) { | 
					
						
							|  |  |  | 					$navigation.addClass( navigationFixedClass ); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					$navigation.removeClass( navigationFixedClass ); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// Remove 'fixed' class if nav is taller than two rows.
 | 
					
						
							|  |  |  | 				$navigation.removeClass( navigationFixedClass ); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Set margins of branding in header.
 | 
					
						
							|  |  |  | 	function adjustHeaderHeight() { | 
					
						
							|  |  |  | 		if ( 'none' === $menuToggle.css( 'display' ) ) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// The margin should be applied to different elements on front-page or home vs interior pages.
 | 
					
						
							|  |  |  | 			if ( isFrontPage ) { | 
					
						
							|  |  |  | 				$branding.css( 'margin-bottom', navigationOuterHeight ); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				$customHeader.css( 'margin-bottom', navigationOuterHeight ); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			$customHeader.css( 'margin-bottom', '0' ); | 
					
						
							|  |  |  | 			$branding.css( 'margin-bottom', '0' ); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Set icon for quotes.
 | 
					
						
							|  |  |  | 	function setQuotesIcon() { | 
					
						
							|  |  |  | 		$( twentyseventeenScreenReaderText.quote ).prependTo( $formatQuote ); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Add 'below-entry-meta' class to elements.
 | 
					
						
							|  |  |  | 	function belowEntryMetaClass( param ) { | 
					
						
							|  |  |  | 		var sidebarPos, sidebarPosBottom; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ( ! $body.hasClass( 'has-sidebar' ) || ( | 
					
						
							|  |  |  | 			$body.hasClass( 'search' ) || | 
					
						
							|  |  |  | 			$body.hasClass( 'single-attachment' ) || | 
					
						
							|  |  |  | 			$body.hasClass( 'error404' ) || | 
					
						
							|  |  |  | 			$body.hasClass( 'twentyseventeen-front-page' ) | 
					
						
							|  |  |  | 		) ) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		sidebarPos       = $sidebar.offset(); | 
					
						
							|  |  |  | 		sidebarPosBottom = sidebarPos.top + ( $sidebar.height() + 28 ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$entryContent.find( param ).each( function() { | 
					
						
							|  |  |  | 			var $element = $( this ), | 
					
						
							|  |  |  | 				elementPos = $element.offset(), | 
					
						
							|  |  |  | 				elementPosTop = elementPos.top; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// Add 'below-entry-meta' to elements below the entry meta.
 | 
					
						
							|  |  |  | 			if ( elementPosTop > sidebarPosBottom ) { | 
					
						
							|  |  |  | 				$element.addClass( 'below-entry-meta' ); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				$element.removeClass( 'below-entry-meta' ); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 	 * Test if inline SVGs are supported. | 
					
						
							|  |  |  | 	 * @link https://github.com/Modernizr/Modernizr/
 | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	function supportsInlineSVG() { | 
					
						
							|  |  |  | 		var div = document.createElement( 'div' ); | 
					
						
							|  |  |  | 		div.innerHTML = '<svg/>'; | 
					
						
							|  |  |  | 		return 'http://www.w3.org/2000/svg' === ( 'undefined' !== typeof SVGRect && div.firstChild && div.firstChild.namespaceURI ); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Test if an iOS device. | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	function checkiOS() { | 
					
						
							|  |  |  | 		return /iPad|iPhone|iPod/.test(navigator.userAgent) && ! window.MSStream; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 	 * Test if background-attachment: fixed is supported. | 
					
						
							|  |  |  | 	 * @link http://stackoverflow.com/questions/14115080/detect-support-for-background-attachment-fixed
 | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	function supportsFixedBackground() { | 
					
						
							|  |  |  | 		var el = document.createElement('div'), | 
					
						
							|  |  |  | 			isSupported; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		try { | 
					
						
							|  |  |  | 			if ( ! ( 'backgroundAttachment' in el.style ) || checkiOS() ) { | 
					
						
							|  |  |  | 				return false; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			el.style.backgroundAttachment = 'fixed'; | 
					
						
							|  |  |  | 			isSupported = ( 'fixed' === el.style.backgroundAttachment ); | 
					
						
							|  |  |  | 			return isSupported; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		catch (e) { | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Fire on document ready.
 | 
					
						
							|  |  |  | 	$( document ).ready( function() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// If navigation menu is present on page, setNavProps and adjustScrollClass.
 | 
					
						
							|  |  |  | 		if ( $navigation.length ) { | 
					
						
							|  |  |  | 			setNavProps(); | 
					
						
							|  |  |  | 			adjustScrollClass(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// If 'Scroll Down' arrow in present on page, calculate scroll offset and bind an event handler to the click event.
 | 
					
						
							|  |  |  | 		if ( $menuScrollDown.length ) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if ( $( 'body' ).hasClass( 'admin-bar' ) ) { | 
					
						
							|  |  |  | 				menuTop -= 32; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if ( $( 'body' ).hasClass( 'blog' ) ) { | 
					
						
							|  |  |  | 				menuTop -= 30; // The div for latest posts has no space above content, add some to account for this.
 | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if ( ! $navigation.length ) { | 
					
						
							|  |  |  | 				navigationOuterHeight = 0; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			$menuScrollDown.click( function( e ) { | 
					
						
							|  |  |  | 				e.preventDefault(); | 
					
						
							|  |  |  | 				$( window ).scrollTo( '#primary', { | 
					
						
							|  |  |  | 					duration: 600, | 
					
						
							|  |  |  | 					offset: { top: menuTop - navigationOuterHeight } | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		adjustHeaderHeight(); | 
					
						
							|  |  |  | 		setQuotesIcon(); | 
					
						
							| 
									
										
										
										
											2019-05-08 08:07:01 +01:00
										 |  |  | 		belowEntryMetaClass( 'blockquote.alignleft, blockquote.alignright' ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		if ( true === supportsInlineSVG() ) { | 
					
						
							|  |  |  | 			document.documentElement.className = document.documentElement.className.replace( /(\s*)no-svg(\s*)/, '$1svg$2' ); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ( true === supportsFixedBackground() ) { | 
					
						
							|  |  |  | 			document.documentElement.className += ' background-fixed'; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// If navigation menu is present on page, adjust it on scroll and screen resize.
 | 
					
						
							|  |  |  | 	if ( $navigation.length ) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// On scroll, we want to stick/unstick the navigation.
 | 
					
						
							|  |  |  | 		$( window ).on( 'scroll', function() { | 
					
						
							|  |  |  | 			adjustScrollClass(); | 
					
						
							|  |  |  | 			adjustHeaderHeight(); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Also want to make sure the navigation is where it should be on resize.
 | 
					
						
							|  |  |  | 		$( window ).resize( function() { | 
					
						
							|  |  |  | 			setNavProps(); | 
					
						
							|  |  |  | 			setTimeout( adjustScrollClass, 500 ); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$( window ).resize( function() { | 
					
						
							|  |  |  | 		clearTimeout( resizeTimer ); | 
					
						
							|  |  |  | 		resizeTimer = setTimeout( function() { | 
					
						
							|  |  |  | 			belowEntryMetaClass( 'blockquote.alignleft, blockquote.alignright' ); | 
					
						
							|  |  |  | 		}, 300 ); | 
					
						
							|  |  |  | 		setTimeout( adjustHeaderHeight, 1000 ); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Add header video class after the video is loaded.
 | 
					
						
							|  |  |  | 	$( document ).on( 'wp-custom-header-video-loaded', function() { | 
					
						
							|  |  |  | 		$body.addClass( 'has-header-video' ); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | })( jQuery ); |