window.FishburneClipboard = (function( window, document, navigator ) { 'use strict'; var textArea; /** * Creates a text area using provided text string. * * @param {string} text * @param {HTMLElement} el */ function createTextArea( text, el ) { var yPosition = window.pageYOffset || document.documentElement.scrollTop; el = el || document.body; textArea = document.createElement( 'textarea' ); textArea.classList.add( 'clipboard-input' ); textArea.style.top = yPosition + 'px'; textArea.setAttribute( 'readonly', '' ); textArea.value = text; el.appendChild( textArea ); } /** * OS-aware text select. */ function selectText() { var range, selection; if ( isIOS() ) { range = document.createRange(); range.selectNodeContents( textArea ); selection = window.getSelection(); selection.removeAllRanges(); selection.addRange( range ); textArea.setSelectionRange( 0, 999999 ); } else { textArea.select(); } } /** * Copy text to clipboard and remove textarea. */ function copyToClipboard( el ) { el = el || document.body; document.execCommand( 'copy' ); el.removeChild( textArea ); } /** * Match helper for iOS user agent. * * @returns {boolean} */ function isIOS() { return null !== navigator.userAgent.match( /ipad|iphone/i ); } return { copy: function( text, el ) { createTextArea( text, el ); selectText(); copyToClipboard( el ); } }; })( window, document, navigator ); ; (function( tippy, $, fishburneShare, fishburneClipboard, shareThis, navigator ) { 'use strict'; // Configurable vars. var resizeId, resizeTimeout = 2 * 100, // 200 milliseconds. tooltipTimeout = 2 * 1000, // 2 seconds. tooltipFadeTime = 25 * 100; // 250 milliseconds. // Event handlers. function onLoad() { var shares = $( '.article__share' ); if ( 'undefined' === typeof tippy ) { return; } // Toggle anchors variants. $( document ).on( 'click', '.article__share__anchor__item', function() { $( '.article__share__anchor__item.active' ).removeClass( 'active' ); $( this ).addClass( 'active' ); }); // Remove loading state from meatballs. $( '.article__share__button--meatballs' ).removeClass( 'article__share__button--meatballs--loading' ); $( shares ).each( function() { var overlay = $( this ).find('.article__share__overlay'), triggerelem = $(this).find('.article__share__button--meatballs'), theme = $( overlay ).data( 'theme' ), offset_top = $( overlay ).data( 'offset-top' ), offset_bottom = $( overlay ).data( 'offset-bottom' ), offset_skidding = $( overlay ).data( 'offset-skidding' ); // If theme data attribute is not set, use default theme. if ( 'undefined' === typeof theme ) { theme = 'fishburne-light'; } // Attach Tippy instance to "meatball". tippy( triggerelem[0], { maxWidth: 500, duration: [ 100, 100 ], size: 'large', arrow: true, content: $(overlay).html(), allowHTML: true, interactive: true, trigger: 'manual', theme: theme, appendTo: () => document.body, placement: 'top', popperOptions: { modifiers: [ { name: 'offset', options: { offset: ({ placement, reference, popper }) => { offset_skidding = offset_skidding ? offset_skidding : 0; if (offset_top && placement === 'top') { return [offset_skidding, offset_top]; } else if (offset_bottom && placement === 'bottom') { return [offset_skidding, offset_bottom]; } else { return []; } }, }, }, ], }, onShow: function( instance ) { var popperInstance = $( instance.popper ); // Set focus after 100ms (arbitrary) timeout. setTimeout( function() { popperInstance.find( '.article__share__button:first' ).focus(); }, 100 ); hideAllVisiblePopovers( instance.id ); }, } ); }); $( '.article__share__button--meatballs' ).on( 'mouseenter click', function( event ) { var targetElement = event.target, targetButton = $( targetElement ).parents( 'button' ).get( 0 ); // Mouse enter is not required on mobile browsers, but Android acts particularly weird unless we avoid this. // if ( navigator.userAgent.match( /Android/i ) ) { // return; // } // In case the button itself gets targeted, we can set the targetButton to the targetElement. if ( 'BUTTON' === targetElement.tagName ) { targetButton = targetElement; } targetButton._tippy.show(); } ); // Handle click event for Select-Copy into clipboard. $( document ).on( 'click', '.article__share__button--link', performSelectCopy ); // Accessibility: Handle 'escape' key press for closing popover. $( document ).on( 'keyup', function( e ) { switch ( e.keyCode ) { case 27: // Escape key. hideAllVisiblePopovers(); break; } } ); // Accessibility: Handle 'enter' key press for Select-Copy into clipboard. $( document ).on( 'keypress', function( e ) { if ( e.target.classList.contains( 'article__share__button--link' ) ) { switch ( e.which ) { case 13: // Enter key. case 32: // Space key. performSelectCopy( e ); break; } } } ); $( document ).on( 'click', '.st-custom-button', function( e ) { var shareButton = $( e.target ).closest( 'button' ), anchor = $( shareButton ).data( 'anchor' ), content = $( e.target ).parents( '.tippy-content' ), active_anchor = $( content ).find( '.article__share__anchor__item.active' ), link = fishburneShare.link, headline = shareButton.data( 'title' ) ? shareButton.data( 'title' ) : shareThis.getTitle(); if ( $( shareButton ).data( 'network' ) === 'newsletter') { window.location.replace( $( shareButton ).data( 'newsletter-link' ) ); // eslint-disable-line WordPressVIPMinimum.JS.Window.location } // Checks do we have anchor toggle and the value is true. if ( anchor && active_anchor && true === $( active_anchor ).data( 'anchor' ) ) { link += '#' + anchor; } // We only care about share buttons inside a Tippy instance since those get rendered after initial page load. if ( $( content ).size() ) { /** * Since using __sharethis__.initialize() causes the initial set of share buttons to trigger twice, * I had to reverse engineer the __sharethis__.share() function and send it the information it normally * requires. */ shareThis.share( { count_url: link, share_url: link, url: link, description: shareThis.getDescription(), image: shareThis.getImage(), title: headline, network: shareButton.data( 'network' ), username: shareButton.data( 'username' ) } ); } } ); } /** * Window resize handler. */ function onWindowResize() { clearTimeout( resizeId ); resizeId = setTimeout( onWindowResizeDone, resizeTimeout ); } /** * On Window Resize done handler. * * This runs once the resize timeout has completed, so we aren't running functions on every instance of window resize. */ function onWindowResizeDone() { hideAllVisiblePopovers(); adjustButtonsForScreenWidth(); } // Helper methods. /** * Adjust buttons for screen width. */ function adjustButtonsForScreenWidth() { if ( $( window ).width() <= 600 ) { adjustButtonGroupsRepeatedly(); } else { resetAllShareButtons(); } } /** * Adjust button groups repeatedly until they fit on the screen. */ function adjustButtonGroupsRepeatedly() { // For each button group, we make sure only the appropriate amount of buttons display. $( '.article__share__button__group--collapsing:visible' ).each( function() { while ( getVisibleButtonsInGroup( this ) > 0 && getElementOffsetFromFirstChild( this ) < 50 ) { hideLastVisibleButtonInGroup( this ); } while ( getHiddenButtonsInGroup( this ) > 0 && getElementOffsetFromFirstChild( this ) > 50 ) { showFirstHiddenButtonInGroup( this ); } } ); } /** * Get element offset from first child. * * @param element HTMLElement * @returns {number} Number */ function getElementOffsetFromFirstChild( element ) { return $( element ).find( 'button:first' ).offset().left - $( element ).offset().left; } /** * Get visible buttons in group element. * * @param groupElement HTMLElement */ function getVisibleButtonsInGroup( groupElement ) { return $( groupElement ).find( '.article__share__button:not(.article__share__button--meatballs):visible' ).size(); } /** * Get hidden buttons in group element. * * @param groupElement HTMLElement */ function getHiddenButtonsInGroup( groupElement ) { return $( groupElement ).find( '.article__share__button:not(.article__share__button--meatballs):hidden' ).size(); } /** * Hide last visible button element in group. * * @param groupElement HTMLElement */ function hideLastVisibleButtonInGroup( groupElement ) { var lastButton = $( groupElement ).find( '.article__share__button:not(.article__share__button--meatballs):visible' ).last(); lastButton.next( '.horizontal-divider' ).hide(); lastButton.hide(); } /** * Show first hidden button in group. * * @param groupElement HTMLElement */ function showFirstHiddenButtonInGroup( groupElement ) { var firstButton = $( groupElement ).find( '.article__share__button:not(.article__share__button--meatballs):hidden' ).first(); firstButton.next( '.horizontal-divider' ).show(); firstButton.show(); } /** * Reset all the share buttons (except for meatball). * * We unset 'display' here so that all the default styles will get inherited. */ function resetAllShareButtons() { var buttons = $( '.article__share__button:not(.article__share__button--meatballs)[style*="display: "]' ); buttons.each( function() { $( this ).next( '.horizontal-divider' ).css( 'display', '' ); $( this ).css( 'display', '' ); } ); } /** * Hide all visible popovers (unless they match skipId). * * @param {number} [skipId] ID to skip (optional). */ function hideAllVisiblePopovers( skipId ) { $( '[data-tippy-root]' ).each( function ( i, element ) { if ( skipId !== element._tippy.id ) { element._tippy.hide(); } } ); } /** * Perform select copy into clipboard. * @param event Event */ function performSelectCopy( event ) { var tippyInstance, targetElement = event.target, targetButton = $( targetElement ).parents( 'button' ).get( 0 ), active_anchor = $( targetButton ).parents( '.tippy-content' ).find( '.article__share__anchor__item.active' ), anchor = $( targetButton ).data( 'anchor' ), link = fishburneShare.shortlink; // Checks do we have anchor toggle and the value is true. if ( anchor && active_anchor && true === $( active_anchor ).data( 'anchor' ) ) { link += '#' + anchor; } // In case the button itself gets targeted, we can set the targetButton to the targetElement. if ( 'BUTTON' === targetElement.tagName ) { targetButton = targetElement; } event.preventDefault(); // Re/activate the tool tip Tippy instance. tippyInstance = tippy( targetButton, { interactive: false, content: fishburneShare.i18n.link_copied, size: 'regular', arrow: true, trigger: 'manual', hideOnClick: true, placement: 'bottom', onShown: function ( instance ) { // After the timeout, hide the tippy popover. setTimeout( function () { instance.hide( tooltipFadeTime ); }, tooltipTimeout ); } } ); fishburneClipboard.copy( link, targetElement.parentNode ); // Show the "link copied" text. tippyInstance.show(); } // Event listeners. window.addEventListener( 'load', onLoad ); window.addEventListener( 'resize', onWindowResize ); // Run immediately. adjustButtonsForScreenWidth(); })( tippy, jQuery, FishburneShare, FishburneClipboard, __sharethis__, navigator ); ; /*! jQuery UI - v1.13.2 - 2022-07-14 * http://jqueryui.com * Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js * Copyright jQuery Foundation and other contributors; Licensed MIT */ !function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(x){"use strict";var t,e,i,n,W,C,o,s,r,l,a,h,u;function E(t,e,i){return[parseFloat(t[0])*(a.test(t[0])?e/100:1),parseFloat(t[1])*(a.test(t[1])?i/100:1)]}function L(t,e){return parseInt(x.css(t,e),10)||0}function N(t){return null!=t&&t===t.window}x.ui=x.ui||{},x.ui.version="1.13.2", /*! * jQuery UI :data 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ x.extend(x.expr.pseudos,{data:x.expr.createPseudo?x.expr.createPseudo(function(e){return function(t){return!!x.data(t,e)}}):function(t,e,i){return!!x.data(t,i[3])}}), /*! * jQuery UI Disable Selection 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ x.fn.extend({disableSelection:(t="onselectstart"in document.createElement("div")?"selectstart":"mousedown",function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}),enableSelection:function(){return this.off(".ui-disableSelection")}}), /*! * jQuery UI Focusable 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ x.ui.focusable=function(t,e){var i,n,o,s=t.nodeName.toLowerCase();return"area"===s?(o=(i=t.parentNode).name,!(!t.href||!o||"map"!==i.nodeName.toLowerCase())&&0<(i=x("img[usemap='#"+o+"']")).length&&i.is(":visible")):(/^(input|select|textarea|button|object)$/.test(s)?(n=!t.disabled)&&(o=x(t).closest("fieldset")[0])&&(n=!o.disabled):n="a"===s&&t.href||e,n&&x(t).is(":visible")&&function(t){var e=t.css("visibility");for(;"inherit"===e;)t=t.parent(),e=t.css("visibility");return"visible"===e}(x(t)))},x.extend(x.expr.pseudos,{focusable:function(t){return x.ui.focusable(t,null!=x.attr(t,"tabindex"))}}),x.fn._form=function(){return"string"==typeof this[0].form?this.closest("form"):x(this[0].form)}, /*! * jQuery UI Form Reset Mixin 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ x.ui.formResetMixin={_formResetHandler:function(){var e=x(this);setTimeout(function(){var t=e.data("ui-form-reset-instances");x.each(t,function(){this.refresh()})})},_bindFormResetHandler:function(){var t;this.form=this.element._form(),this.form.length&&((t=this.form.data("ui-form-reset-instances")||[]).length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t))},_unbindFormResetHandler:function(){var t;this.form.length&&((t=this.form.data("ui-form-reset-instances")).splice(x.inArray(this,t),1),t.length?this.form.data("ui-form-reset-instances",t):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset"))}},x.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()), /*! * jQuery UI Support for jQuery core 1.8.x and newer 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * */ x.expr.pseudos||(x.expr.pseudos=x.expr[":"]),x.uniqueSort||(x.uniqueSort=x.unique),x.escapeSelector||(e=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,i=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},x.escapeSelector=function(t){return(t+"").replace(e,i)}),x.fn.even&&x.fn.odd||x.fn.extend({even:function(){return this.filter(function(t){return t%2==0})},odd:function(){return this.filter(function(t){return t%2==1})}}), /*! * jQuery UI Keycode 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ x.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}, /*! * jQuery UI Labels 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ x.fn.labels=function(){var t,e,i;return this.length?this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(e=this.eq(0).parents("label"),(t=this.attr("id"))&&(i=(i=this.eq(0).parents().last()).add((i.length?i:this).siblings()),t="label[for='"+x.escapeSelector(t)+"']",e=e.add(i.find(t).addBack(t))),this.pushStack(e)):this.pushStack([])},x.ui.plugin={add:function(t,e,i){var n,o=x.ui[t].prototype;for(n in i)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([e,i[n]])},call:function(t,e,i,n){var o,s=t.plugins[e];if(s&&(n||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(o=0;o
")).children()[0],x("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),n=t-i)},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthW(C(n),C(o))?s.important="horizontal":s.important="vertical",f.using.call(this,t,s)}),r.offset(x.extend(h,{using:t}))})):h.apply(this,arguments)},x.ui.position={fit:{left:function(t,e){var i,n=e.within,o=n.isWindow?n.scrollLeft:n.offset.left,n=n.width,s=t.left-e.collisionPosition.marginLeft,r=o-s,l=s+e.collisionWidth-n-o;e.collisionWidth>n?0o?0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=x(e||this.defaultElement||this)[0],this.element=x(e),this.uuid=c++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=x(),this.hoverable=x(),this.focusable=x(),this.classesElementLookup={},e!==this&&(x.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=x(e.style?e.ownerDocument:e.document||e),this.window=x(this.document[0].defaultView||this.document[0].parentWindow)),this.options=x.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:x.noop,_create:x.noop,_init:x.noop,destroy:function(){var i=this;this._destroy(),x.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:x.noop,widget:function(){return this.element},option:function(t,e){var i,n,o,s=t;if(0===arguments.length)return x.widget.extend({},this.options);if("string"==typeof t)if(s={},t=(i=t.split(".")).shift(),i.length){for(n=s[t]=x.widget.extend({},this.options[t]),o=0;o":">",'"':""","'":"'","`":"`"},qn=Pn(t),t=Pn(An(t)),Un=m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Wn=/(.)^/,zn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Ln=/\\|'|\r|\n|\u2028|\u2029/g;function $n(n){return"\\"+zn[n]}var Cn=/^\s*(\w|\$)+\s*$/;var Kn=0;function Jn(n,r,t,e,u){return e instanceof r?(e=En(n.prototype),o(r=n.apply(e,u))?r:e):n.apply(t,u)}var M=l(function(u,o){function i(){for(var n=0,r=o.length,t=Array(r),e=0;e ul', $nav ); header_width = $header.width(); $nav_items = $( '>ul>li:not(.nav__vault)', $nav ); $nav_vault = $( '.nav__vault', $nav ); $nav_vault_items = $( '>ul>li', $nav_vault ); wrapped = false; // Hide More dropdown links. $nav_vault_items.addClass( 'link-hidden' ); $subnavs = $('.subnav__navigation'); // Set full width. $subnavs.each(function(index) { var $ul = $(this).children('ul'), width = 0; $ul.children('li').each(function(li_index) { width += $(this).width() + 40; }); $ul.css('width', width); }); // Add mouse hover handling. $subnavs .find('.menu-item') .on('mouseenter mouseleave', function(event) { var $menuItem = $(this); if (detectTap) { // Do nothing on mobile for mouse events. return; } // Toggle 'hover' helper class. if ('mouseenter' === event.type) { $menuItem.addClass('hover'); } else { $menuItem.removeClass('hover'); } // Stop animations. $menuItem.stop(true, true); // Position sub menu. calculateAndPositionSubMenu($menuItem); }); } /** * Makes sure the navigation doesn't break if something forces the header to be smaller (ad skins). */ function detect_header_resize() { if ( header_width !== $header.width() ) { resize_smaller = ( header_width > $header.width() ); detect_wrapped_nav(); setTimeout( detect_wrapped_nav, 100 ); } header_width = $header.width(); } /** * Add overflowing nav items to the 'More' dropdown. */ function detect_wrapped_nav() { var number = $nav_items.length, wrap_index = -1; for (var i = number; i > 1; i--) { var $item = $nav_items.eq( i ), $vault_item = $nav_vault_items.eq( i ); // Unhides items when resizing window larger. if ( ! $item.is( ':visible' ) && ! resize_smaller && typeof $item.attr( 'data-hidden-width' ) !== 'undefined' ) { if ( $item.attr( 'data-hidden-width' ) < $( window ).width() ) { $vault_item.addClass( 'link-hidden' ); $item.removeClass( 'link-hidden' ); $item.attr( 'data-hidden-width', '' ); if ( i === number - 1 ) { wrapped = false; } } } // Hides items when resizing window smaller. if ( $item.is( ':visible' ) ) { // If the "nav vault" is overflowing the navigation, hide links until it stops overflowing. // If the "nav vault" is off screen, the value will be 0, so we hide link then too. if ( $nav_inner.parent()[0].getBoundingClientRect().right < $nav_vault[0].getBoundingClientRect().right || $nav_vault[0].getBoundingClientRect().right == 0 ) { wrapped = true; if ( $item.hasClass( 'nav__vault' ) ) { $nav_items.eq( wrap_index ).addClass( 'link-hidden' ); $nav_items.eq( wrap_index ).attr( 'data-hidden-width', $( window ).width() ); $nav_vault_items.eq( wrap_index ).removeClass( 'link-hidden' ); } else { $item.addClass( 'link-hidden' ); $vault_item.removeClass( 'link-hidden' ); $item.attr( 'data-hidden-width', $( window ).width() ); } } else { wrap_index = i; } } $nav.attr( 'data-wrapped', wrapped ); }//end for $subnavs.find('.menu-item-has-children').each(function(item) { calculateAndPositionSubMenu($(this)); }); } /** * Helper: re-calculate submenu position. * * $menuItem refers to a parent list item that generally has the class 'menu-item-has-children', if that helps. * * @param {Object} $menuItem jQuery object. */ function calculateAndPositionSubMenu($menuItem) { if ($menuItem.parent().hasClass('menu')) { // Find child and set parameters. var $childMenu = $menuItem.children('.sub-menu'), $firstChild = $childMenu.find('a').first(), marginBase = 40; if (!$firstChild.position()) { return; } // Find this menu's first child element for use in calculations. var $menuItemFirstChild = $menuItem.find('.menu-item a').first(); // We want to position the sub menu text to line up with the // top menu text. var subMenuLeft = $menuItem.children('a').position().left, subMenuLeft = subMenuLeft - $firstChild.position().left, // Here, we subtract the int value of padding-left on the first child // element. subMenuLeft = subMenuLeft - parseInt($menuItemFirstChild.css('padding-left'), 10); // We also want to set a maximum distance to the right so the submenu is always visible. var subMenuRight = $(window).width() - $childMenu.width() - marginBase; $childMenu.css( 'left', Math.min(Math.max(0, subMenuLeft), subMenuRight) ); } } /** * General helpers. */ function helpers() { // Let the nav know to display (avoids the user seeing broken nav). $nav.addClass( 'subnav__navigation--ready' ); // Keep track of window resizes. $( window ).resize( function(event) { resize_smaller = ( last_width > $( window ).width() ); last_width = $( window ).width(); detect_wrapped_nav(); } ); // Keep track of scroll direction. $( window ).scroll( function(event) { var st = $( this ).scrollTop(); scrollUp = ! (st > scrollTop); scrollDown = (st > scrollTop); scrollTop = st; if ( st <= 0 ) { scrollUp = true; scrollDown = false; } } ); $( window ).load( function() { clearInterval( detectInterval ); detect_wrapped_nav(); } ); } // Mobile tap handlers. $(function() { $('.subnav__container' ).ready( function() { init(); detect_wrapped_nav(); helpers(); setInterval( detect_header_resize, 500 ); detectInterval = setInterval( detect_wrapped_nav, 500 ); }); function repositionSubnavs() { $subnavs.find('.menu-item-has-children').each(function(item) { calculateAndPositionSubMenu($(this)); }); } $(document).on('touchstart', function() { detectTap = true; }); $(document).on('touchmove', function() { // After 50ms, this is no longer a tap. setTimeout(function() { detectTap = false; }, 50); }); $(document).on( 'touchend', _.debounce(function(event) { if (detectTap) { var $eventTargetParent = $(event.target).parents( '.menu-item' ); var $eventTargetHoveredParent = $(event.target).parents( '.menu-item.hover' ); if ($eventTargetHoveredParent.length) { // Remove hover state from target with existing hover state. $eventTargetHoveredParent.removeClass('hover'); } else { // Remove any existing hover states. $subnavs.find('.menu-item.hover').removeClass('hover'); if ($eventTargetParent.length) { // Apply hover state to tapped target. $eventTargetParent.stop( true, true ).addClass('hover'); } } } // Reset submenu positions at the end of touch/drag event. repositionSubnavs(); }, 50) ); }); })( jQuery, _ ); ; (function ( FishburneNewsletter, $ ) { 'use strict'; // Configurable vars. // Var references. var $emailInputs = $( 'input.newsletter__email' ), $titleTexts = $( '.newsletter__title' ), $subtitleTexts = $( '.newsletter__subtitle' ), $newsletterForms = $( '.newsletter__form' ); // Event handlers. function onLoad() { $emailInputs.on( 'keyup', onInputChange ); $newsletterForms.submit( onFormSubmit ); $( 'input, button' ) .focus( function () { var $form = $( this ).closest( '.newsletter__form' ), focusClass = 'newsletter__form--focus', nodeName = $( this ).prop( 'nodeName' ).toLowerCase(); $form .addClass( focusClass ) .addClass( focusClass + '--' + nodeName ); } ) .blur( function () { var $form = $( this ).closest( '.newsletter__form' ), focusClass = 'newsletter__form--focus', nodeName = $( this ).prop( 'nodeName' ).toLowerCase(); $form .removeClass( focusClass ) .removeClass( focusClass + '--' + nodeName ); } ); // Set initial text for text elements. $titleTexts.each( function ( index, titleText ) { var $titleText = $( titleText ); $titleText.data( 'initial-title', $titleText.text() ); } ); $subtitleTexts.each( function ( index, subtitleText ) { var $subtitleText = $( subtitleText ); $subtitleText.data( 'initial-title', $subtitleText.text() ); } ); } /** * On Newsletter form submit. */ function onFormSubmit( event ) { event.preventDefault(); var $form = $( this ), $emailInput = $form.find( '.newsletter__email' ), email = $form.find( '.newsletter__email' ).val(), url = $form.attr( 'action' ), formData = { "wirelist": $form.find( '.newsletter__wirelist' ).val(), "brandId": $form.find( '.newsletter__brandid' ).val() }; if ( $form.hasClass( 'newsletter__form--processing' ) || '' === $emailInput.val() ) { $emailInput.focus(); setErrorState( $form ); return false; } // Remove any error state. $form.removeClass( 'newsletter__form--error' ); // Lock the form while we attempt to submit. lockForm( $form ); // Perform GET request. $.get( url + email + '?' + $.param(formData)) .done( function ( data ) { var response = data.response; if ( 200 === response.code ) { setSuccessState( $form ); } else { setErrorState( $form ); } } ) .fail( function ( data ) { setErrorState( $form ); } ) .always( function () { unlockForm( $form ); } ); } /** * On Newsletter input change. */ function onInputChange() { var $input = $( this ), $form = $input.closest( '.newsletter__form' ); unsetErrorState( $form ); if ( '' === $input.val() ) { $input.removeClass( 'newsletter__email--changed' ); } else { $input.addClass( 'newsletter__email--changed' ); } } // Helper functions. /** * Helper: Lock form. * * @param form \HTMLElement Form HTML Element. */ function lockForm( form ) { var $form = $( form ), $emailInput = $form.find( '.newsletter__email' ), $emailButton = $form.find( '.newsletter__email__submit' ); $form.addClass( 'newsletter__form--processing' ); $emailInput.prop( 'disabled', true ); $emailButton.prop( 'disabled', true ); } /** * Helper: Unlock form. * * @param form \HTMLElement Form HTML Element. */ function unlockForm( form ) { var $form = $( form ), $emailInput = $form.find( '.newsletter__email' ), $emailButton = $form.find( '.newsletter__email__submit' ); $form.removeClass( 'newsletter__form--processing' ); $emailInput.prop( 'disabled', false ); $emailButton.prop( 'disabled', false ); } /** * Helper: Set form success state. * * @param form \HTMLElement Form HTML Element. */ function setSuccessState( form ) { var $form = $( form ), $emailInput = $form.find( '.newsletter__email' ), $emailLabel = $form.find( '.newsletter__email__label' ), $titleText = $form.find( '.newsletter__title' ), $subtitleText = $form.find( '.newsletter__subtitle' ), $viewAllLink = $form.find( '.newsletter__viewall' ), $emailButton = $form.find( '.newsletter__email__submit' ); $form.addClass( 'newsletter__form--success' ); $titleText.text( FishburneNewsletter.i18n.title.success ); $subtitleText.text( FishburneNewsletter.i18n.subtitle.success ); $emailInput.val( '' ); $emailLabel.hide(); $emailButton.hide(); if ( $viewAllLink ) { $viewAllLink.show(); } } /** * Helper: Set form error state. * * @param form \HTMLElement Form HTML Element. */ function setErrorState( form ) { var $form = $( form ), $titleText = $form.find( '.newsletter__title' ), $subtitleText = $form.find( '.newsletter__subtitle' ); $titleText.text( FishburneNewsletter.i18n.title.error ); $subtitleText.text( FishburneNewsletter.i18n.subtitle.error ); $form.addClass( 'newsletter__form--error' ); } /** * Helper: Unset form error state. * * @param form \HTMLElement Form HTML Element. */ function unsetErrorState( form ) { var $form = $( form ); $form.removeClass( 'newsletter__form--error' ); } // Event listeners. $( document ).ready( onLoad ); })( FishburneNewsletter, jQuery ); ; !function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"===typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=63)}([function(t,e,n){(function(e){var n=function(t){return t&&t.Math==Math&&t};t.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")()}).call(this,n(34))},function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){var r=n(1);t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(t,e,n){var r=n(0),o=n(22),i=n(2),a=n(23),c=n(31),u=n(57),f=o("wks"),s=r.Symbol,l=u?s:s&&s.withoutSetter||a;t.exports=function(t){return i(f,t)||(c&&i(s,t)?f[t]=s[t]:f[t]=l("Symbol."+t)),f[t]}},function(t,e){t.exports=function(t){return"object"===typeof t?null!==t:"function"===typeof t}},function(t,e,n){var r=n(3),o=n(10),i=n(7);t.exports=r?function(t,e,n){return o.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(16),o=n(18);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(5);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){var r=n(3),o=n(19),i=n(11),a=n(9),c=Object.defineProperty;e.f=r?c:function(t,e,n){if(i(t),e=a(e,!0),i(n),o)try{return c(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(5);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,e,n){var r=n(0),o=n(6);t.exports=function(t,e){try{o(r,t,e)}catch(n){r[t]=e}return e}},function(t,e,n){var r=n(0),o=n(14).f,i=n(6),a=n(36),c=n(12),u=n(41),f=n(48);t.exports=function(t,e){var n,s,l,d,v,p=t.target,h=t.global,m=t.stat;if(n=h?r:m?r[p]||c(p,{}):(r[p]||{}).prototype)for(s in e){if(d=e[s],l=t.noTargetGet?(v=o(n,s))&&v.value:n[s],!f(h?s:p+(m?".":"#")+s,t.forced)&&void 0!==l){if(typeof d===typeof l)continue;u(d,l)}(t.sham||l&&l.sham)&&i(d,"sham",!0),a(n,s,d,t)}}},function(t,e,n){var r=n(3),o=n(15),i=n(7),a=n(8),c=n(9),u=n(2),f=n(19),s=Object.getOwnPropertyDescriptor;e.f=r?s:function(t,e){if(t=a(t),e=c(e,!0),f)try{return s(t,e)}catch(n){}if(u(t,e))return i(!o.f.call(t,e),t[e])}},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);e.f=i?function(t){var e=o(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(1),o=n(17),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){var r=n(3),o=n(1),i=n(35);t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){var r=n(21),o=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(t){return o.call(t)}),t.exports=r.inspectSource},function(t,e,n){var r=n(0),o=n(12),i="__core-js_shared__",a=r[i]||o(i,{});t.exports=a},function(t,e,n){var r=n(40),o=n(21);(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.6.5",mode:r?"pure":"global",copyright:"\xa9 2020 Denis Pushkarev (zloirock.ru)"})},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++n+r).toString(36)}},function(t,e){t.exports={}},function(t,e,n){var r=n(2),o=n(8),i=n(46).indexOf,a=n(24);t.exports=function(t,e){var n,c=o(t),u=0,f=[];for(n in c)!r(a,n)&&r(c,n)&&f.push(n);for(;e.length>u;)r(c,n=e[u++])&&(~i(f,n)||f.push(n));return f}},function(t,e,n){var r=n(27),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,n){var r=n(18);t.exports=function(t){return Object(r(t))}},function(t,e,n){var r=n(1);t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},function(t,e){t.exports={}},function(t,e,n){var r=n(13),o=n(49);r({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"===typeof window&&(n=window)}t.exports=n},function(t,e,n){var r=n(0),o=n(5),i=r.document,a=o(i)&&o(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},function(t,e,n){var r=n(0),o=n(6),i=n(2),a=n(12),c=n(20),u=n(37),f=u.get,s=u.enforce,l=String(String).split("String");(t.exports=function(t,e,n,c){var u=!!c&&!!c.unsafe,f=!!c&&!!c.enumerable,d=!!c&&!!c.noTargetGet;"function"==typeof n&&("string"!=typeof e||i(n,"name")||o(n,"name",e),s(n).source=l.join("string"==typeof e?e:"")),t!==r?(u?!d&&t[e]&&(f=!0):delete t[e],f?t[e]=n:o(t,e,n)):f?t[e]=n:a(e,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&f(this).source||c(this)}))},function(t,e,n){var r,o,i,a=n(38),c=n(0),u=n(5),f=n(6),s=n(2),l=n(39),d=n(24),v=c.WeakMap;if(a){var p=new v,h=p.get,m=p.has,y=p.set;r=function(t,e){return y.call(p,t,e),e},o=function(t){return h.call(p,t)||{}},i=function(t){return m.call(p,t)}}else{var g=l("state");d[g]=!0,r=function(t,e){return f(t,g,e),e},o=function(t){return s(t,g)?t[g]:{}},i=function(t){return s(t,g)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!u(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){var r=n(0),o=n(20),i=r.WeakMap;t.exports="function"===typeof i&&/native code/.test(o(i))},function(t,e,n){var r=n(22),o=n(23),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,e){t.exports=!1},function(t,e,n){var r=n(2),o=n(42),i=n(14),a=n(10);t.exports=function(t,e){for(var n=o(e),c=a.f,u=i.f,f=0;fs;)if((c=u[s++])!=c)return!0}else for(;f>s;s++)if((t||s in u)&&u[s]===n)return t||s||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},function(t,e,n){var r=n(27),o=Math.max,i=Math.min;t.exports=function(t,e){var n=r(t);return n<0?o(n+e,0):i(n,e)}},function(t,e,n){var r=n(1),o=/#|\.prototype\./,i=function(t,e){var n=c[a(t)];return n==f||n!=u&&("function"==typeof e?r(e):!!e)},a=i.normalize=function(t){return String(t).replace(o,".").toLowerCase()},c=i.data={},u=i.NATIVE="N",f=i.POLYFILL="P";t.exports=i},function(t,e,n){"use strict";var r=n(3),o=n(1),i=n(50),a=n(29),c=n(15),u=n(30),f=n(16),s=Object.assign,l=Object.defineProperty;t.exports=!s||o((function(){if(r&&1!==s({b:1},s(l({},"a",{enumerable:!0,get:function(){l(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},e={},n=Symbol(),o="abcdefghijklmnopqrst";return t[n]=7,o.split("").forEach((function(t){e[t]=t})),7!=s({},t)[n]||i(s({},e)).join("")!=o}))?function(t,e){for(var n=u(t),o=arguments.length,s=1,l=a.f,d=c.f;o>s;)for(var v,p=f(arguments[s++]),h=l?i(p).concat(l(p)):i(p),m=h.length,y=0;m>y;)v=h[y++],r&&!d.call(p,v)||(n[v]=p[v]);return n}:s},function(t,e,n){var r=n(25),o=n(28);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){var r=n(13),o=n(52);r({target:"Array",stat:!0,forced:!n(62)((function(t){Array.from(t)}))},{from:o})},function(t,e,n){"use strict";var r=n(53),o=n(30),i=n(55),a=n(56),c=n(26),u=n(58),f=n(59);t.exports=function(t){var e,n,s,l,d,v,p=o(t),h="function"==typeof this?this:Array,m=arguments.length,y=m>1?arguments[1]:void 0,g=void 0!==y,b=f(p),w=0;if(g&&(y=r(y,m>2?arguments[2]:void 0,2)),void 0==b||h==Array&&a(b))for(n=new h(e=c(p.length));e>w;w++)v=g?y(p[w],w):p[w],u(n,w,v);else for(d=(l=b.call(p)).next,n=new h;!(s=d.call(l)).done;w++)v=g?i(l,y,[s.value,w],!0):s.value,u(n,w,v);return n.length=w,n}},function(t,e,n){var r=n(54);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e,n){var r=n(11);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(a){var i=t.return;throw void 0!==i&&r(i.call(t)),a}}},function(t,e,n){var r=n(4),o=n(32),i=r("iterator"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(o.Array===t||a[i]===t)}},function(t,e,n){var r=n(31);t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(t,e,n){"use strict";var r=n(9),o=n(10),i=n(7);t.exports=function(t,e,n){var a=r(e);a in t?o.f(t,a,i(0,n)):t[a]=n}},function(t,e,n){var r=n(60),o=n(32),i=n(4)("iterator");t.exports=function(t){if(void 0!=t)return t[i]||t["@@iterator"]||o[r(t)]}},function(t,e,n){var r=n(61),o=n(17),i=n(4)("toStringTag"),a="Arguments"==o(function(){return arguments}());t.exports=r?o:function(t){var e,n,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(n){}}(e=Object(t),i))?n:a?o(e):"Object"==(r=o(e))&&"function"==typeof e.callee?"Arguments":r}},function(t,e,n){var r={};r[n(4)("toStringTag")]="z",t.exports="[object z]"===String(r)},function(t,e,n){var r=n(4)("iterator"),o=!1;try{var i=0,a={next:function(){return{done:!!i++}},return:function(){o=!0}};a[r]=function(){return this},Array.from(a,(function(){throw 2}))}catch(c){}t.exports=function(t,e){if(!e&&!o)return!1;var n=!1;try{var i={};i[r]=function(){return{next:function(){return{done:n=!0}}}},t(i)}catch(c){}return n}},function(t,e,n){"use strict";n.r(e);n(33),n(51);function r(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,r=new Array(e);n0&&this.registerTriggers.apply(this,o(i)),this.onClick=this.onClick.bind(this),this.onKeydown=this.onKeydown.bind(this)}var n,i,a;return n=e,(i=[{key:"registerTriggers",value:function(){for(var t=this,e=arguments.length,n=new Array(e),r=0;r0&&void 0!==arguments[0]?arguments[0]:null;if(this.activeElement=document.activeElement,this.modal.setAttribute("aria-hidden","false"),this.modal.classList.add(this.config.openClass),this.scrollBehaviour("disable"),this.addEventListeners(),this.config.awaitOpenAnimation){var n=function e(){t.modal.removeEventListener("animationend",e,!1),t.setFocusToFirstNode()};this.modal.addEventListener("animationend",n,!1)}else this.setFocusToFirstNode();this.config.onShow(this.modal,this.activeElement,e)}},{key:"closeModal",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=this.modal;if(this.modal.setAttribute("aria-hidden","true"),this.removeEventListeners(),this.scrollBehaviour("enable"),this.activeElement&&this.activeElement.focus&&this.activeElement.focus(),this.config.onClose(this.modal,this.activeElement,t),this.config.awaitCloseAnimation){var n=this.config.openClass;this.modal.addEventListener("animationend",(function t(){e.classList.remove(n),e.removeEventListener("animationend",t,!1)}),!1)}else e.classList.remove(this.config.openClass)}},{key:"closeModalById",value:function(t){this.modal=document.getElementById(t),this.modal&&this.closeModal()}},{key:"scrollBehaviour",value:function(t){if(this.config.disableScroll){var e=document.querySelector("body");switch(t){case"enable":Object.assign(e.style,{overflow:""});break;case"disable":Object.assign(e.style,{overflow:"hidden"})}}}},{key:"addEventListeners",value:function(){this.modal.addEventListener("touchstart",this.onClick),this.modal.addEventListener("click",this.onClick),document.addEventListener("keydown",this.onKeydown)}},{key:"removeEventListeners",value:function(){this.modal.removeEventListener("touchstart",this.onClick),this.modal.removeEventListener("click",this.onClick),document.removeEventListener("keydown",this.onKeydown)}},{key:"onClick",value:function(t){t.target.hasAttribute(this.config.closeTrigger)&&this.closeModal(t)}},{key:"onKeydown",value:function(t){27===t.keyCode&&this.closeModal(t),9===t.keyCode&&this.retainFocus(t)}},{key:"getFocusableNodes",value:function(){var e=this.modal.querySelectorAll(t);return Array.apply(void 0,o(e))}},{key:"setFocusToFirstNode",value:function(){var t=this;if(!this.config.disableFocus){var e=this.getFocusableNodes();if(0!==e.length){var n=e.filter((function(e){return!e.hasAttribute(t.config.closeTrigger)}));n.length>0&&n[0].focus(),0===n.length&&e[0].focus()}}}},{key:"retainFocus",value:function(t){var e=this.getFocusableNodes();if(0!==e.length)if(e=e.filter((function(t){return null!==t.offsetParent})),this.modal.contains(document.activeElement)){var n=e.indexOf(document.activeElement);t.shiftKey&&0===n&&(e[e.length-1].focus(),t.preventDefault()),!t.shiftKey&&e.length>0&&n===e.length-1&&(e[0].focus(),t.preventDefault())}else e[0].focus()}}])&&r(n.prototype,i),a&&r(n,a),e}(),n=null,i=function(t){if(!document.getElementById(t))return console.warn("MicroModal: \u2757Seems like you have missed %c'".concat(t,"'"),"background-color: #f8f9fa;color: #50596c;font-weight: bold;","ID somewhere in your code. Refer example below to resolve it."),console.warn("%cExample:","background-color: #f8f9fa;color: #50596c;font-weight: bold;",'')),!1},a=function(t,e){if(function(t){if(t.length<=0)console.warn("MicroModal: \u2757Please specify at least one %c'micromodal-trigger'","background-color: #f8f9fa;color: #50596c;font-weight: bold;","data attribute."),console.warn("%cExample:","background-color: #f8f9fa;color: #50596c;font-weight: bold;",'')}(t),!e)return!0;for(var n in e)i(n);return!0};return{init:function(t){var r=Object.assign({},{openTrigger:"data-micromodal-trigger"},t),i=o(document.querySelectorAll("[".concat(r.openTrigger,"]"))),c=function(t,e){var n=[];return t.forEach((function(t){var r=t.attributes[e].value;void 0===n[r]&&(n[r]=[]),n[r].push(t)})),n}(i,r.openTrigger);if(!0!==r.debugMode||!1!==a(i,c))for(var u in c){var f=c[u];r.targetModal=u,r.triggers=o(f),n=new e(r)}},show:function(t,r){var o=r||{};o.targetModal=t,!0===o.debugMode&&!1===i(t)||(n&&n.removeEventListeners(),(n=new e(o)).showModal())},close:function(t){t?n.closeModalById(t):n.closeModal()}}}();window.MicroModal=a;var c=a;window.microModal=c;var u=function(t){t.preventDefault();var e=t.currentTarget;window.location=e.getAttribute("data-href")},f=function(){var t=document.querySelector(".modal__btn-primary");t&&t.addEventListener("click",u),document.querySelector(".modal.micromodal-slide")&&new MutationObserver((function(t){t.forEach((function(t){t.addedNodes.forEach((function(t){document.querySelector(".modal.micromodal-slide.is-open")&&document.querySelector("#TB_window")&&document.querySelector(".modal__overlay").click()}))}))})).observe(document,{attributes:!0,childList:!0,subtree:!0})},s=function(){document.activeElement.blur()},l=function(t,e){[{prop:"caption",modifier:"innerText",query:".modal__caption"},{prop:"title",modifier:"innerText",query:".modal__title"},{prop:"content",modifier:"innerText",query:".modal__content"},{prop:"closeButtonText",modifier:"innerText",query:"button[data-micromodal-close].modal__btn"},{prop:"successButtonText",modifier:"innerText",query:".modal__btn-primary"},{prop:"href",modifier:"dataset",query:".modal__btn-primary"}].map((function(n){var r=n.prop,o=n.modifier,i=n.query;if(e.dataset[r])switch(o){case"dataset":t.querySelector(i)[o][r]=e.dataset[r];break;default:t.querySelector(i)[o]=e.dataset[r]}}))};window.addEventListener("load",(function(){c.init({disableScroll:!0,disableFocus:!0,onClose:s,onShow:l}),f()}))}]);; (function($) { var $homeContent = $( '#home-content' ), $homeToggleLinks = $( '.home-content__toggle__link', $homeContent ); /** * Ran first on page load. */ function init() { $homeToggleLinks.click( function( e ) { e.preventDefault(); $homeContent.attr( 'data-show', $( this ).data('tab') ); } ); } init(); })(jQuery); ; (function( $, microModal ) { $(document).on('click', '.pds-vote-button, .pds-vote-button-load', function() { // Remove default alert. window.alert = function(){}; var poll = $(this).parents('.PDS_Poll'), radio_btns = $(poll).find('input[type="radio"]'), id = $( this ).attr( 'id' ), poll_id = id.replace( 'pd-vote-button','' ), modal_id = 'pds-' + poll_id, is_checked = false, offset = $(poll).offset().top; // Check if at least one poll value is selected. $(radio_btns).each( function() { if ($(this).is(':checked')) { is_checked = true; return false; } }); // If not, show the modal. if ( ! is_checked ) { if ( window.pageYOffset > offset ) { window.scrollTo(0, offset - 82); } microModal.show(modal_id,{ onClose: modal => onClose(modal, event) }); } }); function onClose( modal, event ) { event.preventDefault(); event.stopPropagation(); } })( jQuery, microModal ); ; /* globals jQuery, infiniteScrollerCached */ (function( $ ) { 'use strict'; var self = { isFetching: false, atEnd: false, state: $.extend( {}, infiniteScrollerCached.args ), $els: { window: $( window ), wrap: $( 'div#infinite-scroll-container' ).parent(), button: $( 'button#infinite-scroll-button' ), loader: null, list: null }, scrollTimer: null, templates: {} }; if ( 0 === self.$els.wrap.size() ) { self.$els.wrap = $( 'div#nav-below' ).parent(); } if ( 0 === self.$els.wrap.size() ) { return; } $('nav#nav-below').remove(); self.url = infiniteScrollerCached.ajaxUrl; self.$els.list = self.$els.wrap.find( 'div#infinite-scroll-container' ); self.$els.loader = self.$els.wrap.find( 'div.poll-loader' ); self.loaderColor = self.$els.loader.css( 'color' ); self.state.offset = self.$els.wrap.find( 'article' ).first().data('datetime') || self.state.updated || 0; self.state.first = true; if ( 0 === self.$els.list.size() ) { self.$els.wrap.append('
'); } if ( 0 === self.$els.loader.size() ) { self.$els.list.after( '
' ); self.$els.loader = self.$els.wrap.find( 'div.poll-loader' ); self.$els.loader.css( 'margin', '0 auto 30px' ); self.$els.loader.css( 'display', 'block' ); self.$els.loader.css( 'width', '35px' ); self.$els.loader.css( 'height', '35px' ); self.$els.loader.css( 'padding-top', '17px' ); self.$els.loader.css( 'box-sizing', 'border-box' ); } self.showLoader = function( first ) { self.$els.loader.show().spin( 'medium-left', self.loaderColor ); }; self.hideLoader = function( first ) { self.$els.loader.hide().spin( false ); }; self.hideButton = function () { self.$els.button.hide(); }; self.isExternal = function( url ) { return ( 'string' !== typeof url || infiniteScrollerCached.ajaxUrl !== url ); }; self.fetchList = function( url, args ) { var xhr; self.isFetching = true; url = url || infiniteScrollerCached.ajaxUrl; if ( null === url ) { url = ''; } if ( url.length > 0 && '/' !== url[ url.length - 1 ] ) { url += '/'; } args = args || []; $.each( args, function( key, value ) { url += value + '/'; }); xhr = $.get( url ); return xhr; }; self.growList = function( url ) { var xhr; url = url || self.url; self.showLoader( self.state.first ); xhr = self.fetchList( url, [ self.state.offset, 'older', self.state.page + 1 ]); xhr.done( function( response ) { if ( response.success ) { if ( response.data.haveItems && self.renderList( response.data, self.state.first ) ) { self.state.page = response.data.page; self.state.first = false; if ( self.isExternal( url ) ) { self.url = url; } if (self.state.page === self.state.max_num_pages) { self.atEnd = true; self.hideButton(); } } else { self.atEnd = true; } } else { self.atEnd = true; } }).always( function() { self.hideLoader( self.state.first ); self.scrollTimer = null; self.isFetching = false; }).error( function() { self.atEnd = true; }); }; self.renderList = function( data ) { if ( data.content && data.content.length > 0 ) { self.$els.list.append( data.content ); $( document.body ).trigger( 'post-load' ); return true; } }; // Infinite scroll self.$els.window.on( 'scroll', function(e) { var bottom, threshold; if ( ! self.$els.button.length ) { // Disable automatic loading if thre is a button. if ( self.scrollTimer || self.isFetching || self.atEnd ) { return; } bottom = self.$els.window.scrollTop() + self.$els.window.height(), threshold = self.$els.wrap.offset().top + self.$els.wrap.outerHeight( false ) - ( self.$els.window.height() * 2 ); // jshint ignore:line if ( bottom > threshold ) { self.isFetching = true; self.scrollTimer = setTimeout( self.growList, 50 ); } } }); self.$els.button.on("click", function(e) { if ( self.scrollTimer || self.isFetching || self.atEnd ) { return; } self.isFetching = true; self.scrollTimer = setTimeout( self.growList, 50 ); }); }( jQuery )); ; /** * Utility module. */ // Main module reference. var Wasabi = Wasabi || {}; Wasabi.utils = (function( $, wasabi ) { 'use strict'; /** * Checks if touch is supported. * @return {Boolean} True on touch. */ function isTouch() { return !! ( 'ontouchstart' in window ); } /** * Checks if the screen width is mobile sized. * @return {Boolean} True on mobile. */ function isMobile() { return window.outerWidth <= 727; } /** * Checks if the admin bar is enabled. * @return {Boolean} True on yes. */ function hasAdminBar() { return $( 'body' ).hasClass( 'admin-bar' ); } return { isTouch: isTouch, isMobile: isMobile, hasAdminBar: hasAdminBar }; })( jQuery, Wasabi ); ; /** * Navigation module. */ // Main module reference. var Wasabi = Wasabi || {}; Wasabi.navigation = (function( $, wasabi ) { 'use strict'; var $nav = $( '.nav' ), $wrap = $( '.nav__wrap' ), $menu = $( '.nav__menu' ), $more = null, moreWidth = 0, searchOpen = false, spanishOn = window.wasabiSpanishEnabled; /** * Loads on page init. * @return {void} */ function init() { // Set up the More dropdown. $( window ).on( 'resize', createMoreMenu ); createMoreMenu(); // Sets up mobile. $( '.branding__mobile' ).sidr({ name: 'mobile-nav', side: 'right', source: '#mobile-nav-holder', renaming: false, onClose: mobileResetClose }); $( '.mobile-nav__close' ).click(function() { $.sidr( 'close', 'mobile-nav' ); }); // Sticky header. setupSticky(); // Sets up dropdown menus. $( '.mobile-nav__menu' ).on( 'click', '.mobile-nav__item--parent', toggleSubMenu ); if ( ! wasabi.utils.isTouch() ) { $menu.on( 'mouseenter mouseleave', '.nav__item--parent', toggleSubMenu ); } else { $menu.on( 'click mouseleave', '.nav__item--parent', toggleSubMenu ); } // Bind search funtionality to search bar click. $( '.branding__search' ).on( 'click', checkSearchState ); // Mobile Menu Scrolling. document.getElementById( 'mobile-nav' ).addEventListener( 'scroll', scrollSidebar ); } /** * Sets up the nav sticking. * @param {number} spacing The space in pixels. * @return {void} */ function setupSticky( spacing ) { spacing = spacing || 0; $( '#header-wrapper' ) .unstick() .sticky({ topSpacing: spacing }); } /** * Creates the more menu item. * @return {void} */ function createMoreMenu() { if ( ! $more ) { var more_txt = 'More'; if (spanishOn) { more_txt = 'Más'; } $more = $( '
  • ', { id: 'menu-item-more', class: 'nav__item nav__item--more nav__item--parent' }) .append( $( '' +more_txt+ '' ) ) .append( $( '
      ', { class: 'sub-menu' }) ); // Get the width. $more.appendTo( $menu ); moreWidth = $more.outerWidth(); $more.detach(); // Set minimum to 100 to fix odd race issue with Safari. if ( moreWidth < 100 ) { moreWidth = 100; } // Hide the element if on desktop, now that we have the size. $menu.addClass( 'nav__menu--more-loaded' ); } var winWidth = window.innerWidth, totalWidth = 1000; if ( totalWidth > winWidth ) { // We're in tablet mode. ABORT. return; } var $children = $menu.children(), numSocial = $('.nav__wrap .nav__social > li').size(), singleWidth = 55, curWidth = 0, socialWidth = numSocial * singleWidth, menuSpace = totalWidth - socialWidth, maxWidth = menuSpace - moreWidth, index, $item; $( '.nav__menu' ).css( 'max-width', menuSpace ); // Calulate more spot. for ( index = 0; index < $children.length; index++ ) { curWidth += $children.eq( index ).outerWidth(); // If we're on the last item, we only need to know if it will fit, not it + the more menu. if ( index === $children.length -1 ) { maxWidth = menuSpace; } if ( curWidth > maxWidth ) { $item = $children.eq( index - 1 ); break; } } // Exit if there's no need. if ( ! $item || $item.is( ':last-child' ) ) { return; } // Add in more menu item. $more .insertAfter( $item ) .children( 'ul' ) .append( $more.nextAll().clone() ); // Determine if more menu needs to be to the right. var $moreSub = $( '.nav__item--more .sub-menu' ), morePosition = $more.position().left, moreSubWidth = $moreSub.width(); if ( totalWidth < morePosition + moreSubWidth ) { $moreSub.addClass( 'sub-menu--right' ); } // Detach so function is not called again. $( window ).off( 'resize', createMoreMenu ); } /** * Toggles a submenu dropdown. * @param {Event} event The mouse event. * @return {void} */ function toggleSubMenu( event ) { var $this = $( event.currentTarget ), $subnav = $this.children( '.sub-menu' ), prefix = 'nav__item'; if ( $this.hasClass( 'mobile-nav__item' ) ) { prefix = 'mobile-nav__item'; } if ( ! $this.hasClass( prefix + '--selected' ) && $subnav.length ) { event.preventDefault(); event.stopPropagation(); } $this.toggleClass( prefix + '--selected' ); $subnav.toggleClass( 'sub-menu--showing' ); } /** * Resets styles on closing mobile view. * @return {void} */ function mobileResetClose() { $( '.mobile-nav__item--parent' ).removeClass( 'mobile-nav__item--selected' ); $( '.sub-menu' ).removeClass( 'sub-menu--showing' ); } /* * Runs on scroll event on mobile menu. * @param {Event} event * @return {void} */ function scrollSidebar( event ) { var $footer = $( '.mobile-nav__footer' ), distY = $( '#mobile-nav' ).scrollTop(), distYH = distY + $( '#mobile-nav' ).innerHeight(), menuH = $( '#mobile-nav' )[0].scrollHeight; if ( distYH >= menuH ) { $footer.addClass( 'mobile-nav__footer-bottom' ); } else { $footer.removeClass( 'mobile-nav__footer-bottom' ); } } /** * Checks the state of the click and closes or open search. * @param {Event} event The mouse event. * @return {void} */ function checkSearchState( event ) { event.stopPropagation(); var $target = $( event.target ), $searchBar = $( '.branding__search' ), $searchForm = $( '.branding__search-form' ), $searchInput = $( '.branding__search-input' ); // Search is closed and bind is only on search bar, therefore open it. if ( searchOpen === false ) { openSearch(); // Search is open and search bar was clicked. } else if ( $target.is( '.branding__search' ) || $searchBar.has( event.target ).length ) { // Clicked close button. if ( $target.is( '.branding__search-close' ) ) { closeSearch(); // Clicked the form. } else if ( $target.is( '.branding__search-form' ) || $searchForm.has( event.target ).length ) { $searchInput.focus(); // Clicked the magnifying glass. } else { // Form is not empty. if ( $searchInput.val().length !== 0 ) { $searchForm.submit(); // Form is empty. } else { $searchInput.focus(); } } // Search is open and the search bar was not clicked. } else { closeSearch(); } } /** * Opens the search box. * @return {void} */ function openSearch() { var $searchBar = $( '.branding__search' ); $searchBar .addClass( 'branding__search--show' ) .parent() .addClass( 'branding--show-search' ); $( '.branding__search-input' ).focus(); $searchBar.off( 'click', checkSearchState ); // Turn off bind to search. $( document ).on( 'click', checkSearchState ); // Turn on bind to document. searchOpen = true; } /** * Closes the search box. * @return {void} */ function closeSearch() { var $searchBar = $( '.branding__search' ); $searchBar .removeClass( 'branding__search--show' ) .parent() .removeClass( 'branding--show-search' ); $( document ).off( 'click', checkSearchState ); // Turn off bind to document. $searchBar.on( 'click', checkSearchState ); // Turn on bind to search box. searchOpen = false; } // Adds to list of modules available. wasabi.modules = wasabi.modules || []; wasabi.modules.push( 'navigation' ); // Public interface. return { init: init, sticky: setupSticky }; })( jQuery, Wasabi ); ; /** * Sidebar module. */ // Main module reference. var Wasabi = Wasabi || {}; Wasabi.sidebar = (function( $, wasabi ) { 'use strict'; var $window = $( window ), $headerAd = $( '#header-ad' ), $sidebar = $( '#secondary' ), $main = $( '#main' ), topMargin = 20, // Margin in px. startH, startY, brandingH, headerH, lastScroll, hitBottom, goingUp, currentState, lastState, sidebarOffset, sidebarHeight, contentHeight; /** * Loads on page init. * @return {void} */ function init() { // Bail if no sidebar. if ( ! $sidebar.length ) { return; } $( document ).ready(function() { headerH = $( '.nav' ).outerHeight(); brandingH = $( '.branding' ).outerHeight(); sidebarHeight = $sidebar.outerHeight() + 800; // 350 if ad is larger and height detection errors contentHeight = $main.outerHeight() - $sidebar.position().top; // Sets the minimum height to show the full sidebar. $main.css( 'min-height', sidebarHeight ); $( '.hero, .site-content > article' ).each(function() { if ( $( this ).length ) { headerH += $( this ).outerHeight( true ); } }); if ( $( 'body' ).hasClass( 'admin-bar' ) ) { brandingH += 32; // Height of admin for desktop. } startH = brandingH; startH += $( '.nav' ).outerHeight(); lastScroll = startH; $window.on( 'scroll', scroll ); }); } /** * Runs on scroll event. * * @return {void} */ function scroll() { var winY = $window.scrollTop(), winYH = winY + $window.height(), topY = $sidebar.offset().top, bottomY = topY + $sidebar.outerHeight(), adHeight = $headerAd.outerHeight(), headerHeight = startH + adHeight; // Determine if we're scrolling up or down. if ( winY > lastScroll ) { goingUp = false; } else { goingUp = true; } // If the window offset exceeds the bottom of the widget, // and we are going down and haven't done this. if ( winYH > bottomY && ! goingUp && 'stuck-bottom' !== currentState ) { // Set the status, and alert we hit bottom. currentState = 'stuck-bottom'; hitBottom = true; startY = topY; sidebarOffset = topY - headerHeight; $sidebar.removeAttr( 'style' ); } // If we're stuck to the bottom and still going down. else if ( ! goingUp && 'stuck-bottom' === currentState ) { // Update the offset. sidebarOffset = topY - headerHeight; } // If the window scroll distance is below the header plus header. else if ( winY <= ( headerH + adHeight ) - topMargin ) { currentState = false; } // If the sidebar offset is greater than the scroll height, // and we've hit the bottom. else if ( ( topY >= winY + brandingH + topMargin - 1 ) && hitBottom && goingUp ) { currentState = 'stuck-top'; $sidebar.removeAttr( 'style' ); sidebarOffset = topY - headerHeight; if ( topY <= startY ) { currentState = false; } } // If we hit the bottom and haven't hit the above conditions, // we should float. else if ( hitBottom && 'floating' !== currentState ) { currentState = 'floating'; $sidebar.css( 'top', sidebarOffset ); } // Set the current state. if ( currentState && lastState !== currentState ) { $sidebar .removeClass( 'sidebar--' + lastState ) .addClass( 'sidebar--' + currentState ); lastState = currentState; } // Reset the state. else if ( ! currentState && hitBottom ) { $sidebar .removeAttr( 'style' ) .removeClass( 'sidebar--' + lastState ); lastState = false; hitBottom = false; } lastScroll = winY; } // Adds to list of modules available. wasabi.modules = wasabi.modules || []; wasabi.modules.push( 'sidebar' ); // Public interface. return { init: init }; })( jQuery, Wasabi ); // Used in lawrence/js/main.js:47. window.noSidebarSticky = true; ;