{"version":3,"file":"header.js","sources":["../../../resources/modern-javascript/entrypoint/header.js"],"sourcesContent":["import {\n  headerActiveClasses,\n  navigationActivatingClasses,\n  navigationActiveClasses,\n} from '../features/header/constants';\nimport {\n  toggleClass,\n  addClass,\n  removeClass,\n  removeAllActiveClasses,\n} from '../features/header/util';\nimport {\n  header,\n  submenus,\n  toggleSubmenuButtons,\n  resetHeaderMenus,\n} from '../features/header/index';\nimport {\n  setQuickBasketCountFromCookie,\n  initQuickBasket,\n} from '../features/basket/mini-basket';\nimport { initialiseSwiper } from '../swiper/swiper';\nimport { initialiseLazySearch } from '../features/autocomplete/lazy';\nimport {\n  getHeaderSearchInput,\n  setHeaderSearchOpen,\n} from '../features/autocomplete/header';\nimport {\n  trackNavigationMenu,\n  trackNoticeBar,\n} from '../util/tracking';\n\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  // TODO move most of this into ../features/header/index.js\n\n\n  const mobileToggle = document.querySelector('[data-mobile-toggle]');\n  const secondLevelButtons = document.querySelectorAll('[data-toggle-second-level]');\n  const searchInput = getHeaderSearchInput();\n\n  /**\n   * Track all nav links\n   */\n  const initHeaderLinkTracking = () => {\n    const nav = header.querySelector('[data-navigation]');\n\n    nav.addEventListener('click', (e) => {\n      if (e.target.tagName.toLowerCase() === 'a') {\n        trackNavigationMenu('Navigation Link Clicked', e.target.textContent.trim(), e.target.href.trim());\n      }\n    });\n  }\n\n  /**\n   * Track all notice bar links\n   */\n  const initNoticeBarLinkTracking = () => {\n    const noticeBar = document.querySelector('aside.notice-bar');\n\n    noticeBar.addEventListener('click', (e) => {\n      if (e.target.tagName.toLowerCase() === 'a') {\n        trackNoticeBar('Notice Bar Link Clicked', e.target.textContent.trim(), e.target.href.trim());\n      }\n    });\n  }\n\n  /**\n   * Toggles the submenu based on the clicked button.\n   * @param {Element} clickedButton\n   */\n  const toggleSubmenu = clickedButton => {\n    const clickedSubmenu = clickedButton.nextElementSibling;\n    const isActive = clickedSubmenu?.classList.contains(\n      navigationActiveClasses.groups\n    );\n\n    resetHeaderMenus();\n    setHeaderSearchOpen(false);\n\n    // No fade on mobile\n    const timeout = window.matchMedia('(max-width: 1024px)').matches ? 0 : 100;\n\n    if (!isActive) {\n      setTimeout(() => {\n        addClass(clickedSubmenu, navigationActiveClasses.groups);\n      }, timeout);\n      addClass(clickedSubmenu, navigationActivatingClasses.groups);\n      addClass(clickedButton, navigationActiveClasses.button);\n      addClass(header, headerActiveClasses.submenu);\n      clickedButton.setAttribute('aria-expanded', 'true');\n\n      trackNavigationMenu('Open Submenu', clickedButton.textContent.trim());\n    } else {\n      setTimeout(() => {\n        removeClass(clickedSubmenu, navigationActivatingClasses.groups);\n        trackNavigationMenu('Close Submenu', clickedButton.textContent.trim());\n      }, timeout);\n    }\n  };\n\n  /**\n   * Toggles the mobile menu.\n   */\n  const toggleMobileMenu = () => {\n    const isMobileActive = header?.classList.toggle(headerActiveClasses.mobile);\n\n    if (isMobileActive) {\n      document.documentElement.classList.add('lock-scroll');\n      closeSearch();\n    } else {\n      document.documentElement.classList.remove('lock-scroll');\n      removeAllActiveClasses(header);\n    }\n  };\n\n  /**\n   * Close the search\n   */\n  const closeSearch = () => {\n    const searchContainer = header.querySelector('.js-header-search');\n\n    searchContainer.classList.remove('header-search--active');\n  }\n\n  /**\n   * Toggles the second-level menu based on the clicked button.\n   * @param {Element} clickedButton\n   */\n  const toggleSecondLevel = clickedButton => {\n    toggleClass(clickedButton.parentElement, navigationActiveClasses.group);\n    toggleClass(header, headerActiveClasses.secondLevel);\n\n    if (header.classList.contains(headerActiveClasses.secondLevel)\n      && clickedButton.parentElement.classList.contains(navigationActiveClasses.group))\n    {\n      trackNavigationMenu('Open Second Level Menu', clickedButton.textContent.trim());\n    } else {\n      trackNavigationMenu('Close Second Level Menu', clickedButton.textContent.trim());\n    }\n\n    clickedButton.setAttribute('aria-expanded', 'false');\n  };\n\n  /**\n   * Initializes Intersection Observer to manage header position based on scrolling.\n   */\n  const initIntersectionObserver = () => {\n    const sentinel = document.querySelector('[data-sentinel]');\n    const observer = new IntersectionObserver(\n      entries => {\n        const position = entries[0].isIntersecting ? 'static' : 'sticky';\n        header.setAttribute('data-position', position);\n      },\n      { threshold: 1.0 }\n    );\n    observer.observe(sentinel);\n  };\n\n  /**\n   * Initializes a fallback scroll listener for browsers without IntersectionObserver support.\n   */\n  const initFallbackScrollListener = () => {\n    window.addEventListener('scroll', () => {\n      const position = window.scrollY > 0 ? 'static' : 'sticky';\n      header.setAttribute('data-position', position);\n    });\n  };\n\n  mobileToggle?.addEventListener('click', toggleMobileMenu);\n\n  toggleSubmenuButtons.forEach(button => {\n    button.addEventListener('click', e => toggleSubmenu(e.currentTarget));\n  });\n\n  secondLevelButtons.forEach(button => {\n    button.addEventListener('click', e => toggleSecondLevel(e.currentTarget));\n  });\n\n  searchInput.addEventListener('keydown', e => {\n    if (e.key === 'Escape') {\n      e.preventDefault();\n      setHeaderSearchOpen(false);\n    }\n  });\n\n  /**\n   * Initialize Observers and Event Listeners\n   */\n  if (window.IntersectionObserver) {\n    initIntersectionObserver();\n  } else {\n    initFallbackScrollListener();\n  }\n\n  /**\n   * Close header when clicking outside of the header.\n   */\n  document.addEventListener('click', e => {\n    if (header && !header.contains(e.target)) {\n      if (header.classList.toString().includes('active')) {\n        trackNavigationMenu('Closed Navigation Menu', 'Clicked Off Menu');\n      }\n\n      removeAllActiveClasses(header);\n    }\n  });\n\n  const initNoticeCarousel = () => {\n    const swiper = document.querySelector('[data-swiper]');\n\n    initialiseSwiper(swiper);\n\n    function manageMobileSlides(noticeSwiper, isMobile) {\n      const mobileOnlySlides = document.querySelectorAll(\n        '[data-mobile-only=\"true\"]'\n      );\n\n      if (isMobile) {\n        // Add mobile-only slides\n        mobileOnlySlides.forEach(slide => {\n          // Check if the slide is already appended\n          if (\n            !noticeSwiper.swiper.slides.some(\n              swiperSlide => swiperSlide.outerHTML === slide.outerHTML\n            )\n          ) {\n            noticeSwiper.swiper.appendSlide(slide.outerHTML);\n          }\n        });\n      } else {\n        let slidesToRemove = [];\n        // Remove mobile-only slides\n        noticeSwiper.swiper.slides.forEach((slide, index) => {\n          if (slide.dataset.mobileOnly === 'true') {\n            slidesToRemove.push(index);\n          }\n        });\n\n        noticeSwiper.swiper.removeSlide(slidesToRemove);\n      }\n\n      noticeSwiper.swiper.update();\n    }\n\n    function managePrivateSale(noticeSwiper, isMobile) {\n      const privateSaleSlides = noticeSwiper.querySelectorAll('[data-private-sale=\"true\"]');\n\n      if (privateSaleSlides.length) {\n        const slidesToRemove = [];\n\n        noticeSwiper.swiper.slides.forEach((slide, index) => {\n          // On desktop we only want to show the private sale slides if there are any\n          if (\n            (isMobile && slide.dataset.privateSale !== 'true') ||\n            (slide.dataset.mobileOnly !== 'true' && slide.dataset.privateSale !== 'true')\n          ) {\n            slidesToRemove.push(index);\n          }\n        });\n\n        noticeSwiper.swiper.removeSlide(slidesToRemove);\n      }\n\n      noticeSwiper.swiper.update();\n    }\n\n    manageMobileSlides(swiper, window.innerWidth <= 1024);\n    managePrivateSale(swiper, window.innerWidth <= 1024);\n\n    swiper.style.opacity = 1;\n  };\n\n  initQuickBasket();\n  initNoticeCarousel();\n  initialiseLazySearch();\n  initHeaderLinkTracking();\n  initNoticeBarLinkTracking();\n});\n\nsetQuickBasketCountFromCookie();\n"],"names":["document","addEventListener","mobileToggle","querySelector","secondLevelButtons","querySelectorAll","searchInput","getHeaderSearchInput","closeSearch","header","classList","remove","toggleMobileMenu","toggle","headerActiveClasses","mobile","documentElement","add","removeAllActiveClasses","toggleSubmenuButtons","forEach","button","e","clickedButton","clickedSubmenu","nextElementSibling","isActive","contains","navigationActiveClasses","groups","resetHeaderMenus","setHeaderSearchOpen","timeout","window","matchMedia","matches","setTimeout","removeClass","navigationActivatingClasses","trackNavigationMenu","textContent","trim","addClass","submenu","setAttribute","toggleSubmenu","currentTarget","toggleSecondLevel","toggleClass","parentElement","group","secondLevel","key","preventDefault","IntersectionObserver","initIntersectionObserver","sentinel","entries","position","isIntersecting","threshold","observe","scrollY","target","toString","includes","initQuickBasket","initNoticeCarousel","swiper","initialiseSwiper","noticeSwiper","isMobile","mobileOnlySlides","slide","slides","some","swiperSlide","outerHTML","appendSlide","slidesToRemove","index","dataset","mobileOnly","push","removeSlide","update","manageMobileSlides","innerWidth","length","privateSale","managePrivateSale","style","opacity","initialiseLazySearch","tagName","toLowerCase","href","trackNoticeBar","setQuickBasketCountFromCookie"],"mappings":"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"}