{"version":3,"file":"script.js","sources":["../../../dev/components/video-wistia/_script.js","../../../dev/assets/js/utilities.js","../../../dev/components/breadcrumbs/_script.js","../../../dev/components/back-to-trip/_script-non-trip.js","../../../dev/components/nav/_script.js","../../../dev/components/repeaters/outer/guide-bio-trip/_script.js","../../../dev/components/guide-bio-updated/_script.js","../../../dev/components/slideshow-old/_script.js","../../../dev/components/hero/_video.js","../../../dev/components/slideshow/_script.js","../../../dev/components/guide-aside/_script.js","../../../dev/components/modal/_script.js","../../../dev/components/slideshow-grid/_script.js","../../../dev/components/enso/_script.js","../../../dev/components/modal/generic-dialog/_script.js","../../../dev/components/masthead/_script.js","../../../dev/components/masthead/nav/_script.js","../../../dev/components/lists/country-list/_country-list.js","../../../dev/assets/js/smartypants.js","../../../dev/assets/js/global-form-functions.js","../../../dev/components/modal/catalog/_script.js","../../../dev/components/modal/enews/_script.js","../../../dev/components/olark/_script.js","../../../dev/components/modal/message/_script.js","../../../dev/components/modal/refer/_script.js","../../../dev/components/modal/digital/_script.js","../../../dev/components/modal/youtube/_script.js","../../../dev/components/modal/eBook/_script.js","../../../dev/components/ctas/magic/_script.js","../../../dev/components/masthead/favorites/_script.js","../../../dev/templates/guide-bio-updated/script.js"],"sourcesContent":["export function isWistiaVideoPlaying() {\n\tlet isVideoPlaying = false;\n\n\tfunction wistiaVideo() {\n\t\tconst videoID = document.querySelector(\".js-wistia-video-id\").textContent;\n\t\tconst wistiaSrc = `https://fast.wistia.net/embed/iframe/${videoID}?videoFoam=true`;\n\n\t\tif (wistiaSrc === \"https://fast.wistia.net/embed/iframe/?videoFoam=true\") {\n\t\t\treturn;\n\t\t}\n\n\t\tconst wistiaIframe = document.querySelector(\".js-wistia-video\");\n\t\twistiaIframe.setAttribute(\"src\", wistiaSrc);\n\n\t\twindow._wq = window._wq || [];\n\t\tconst videoTitles = document.querySelector(\".js-video\");\n\t\tvideoTitles.addEventListener(\"click\", function (ev) {\n\t\t\tvideoTitles.classList.add(\"hide\");\n\t\t\tplayVideo();\n\t\t});\n\t\tfunction playVideo() {\n\t\t\tlet playStatus;\n\t\t\t_wq.push({\n\t\t\t\tid: \"_all\",\n\t\t\t\tonReady: function (video) {\n\t\t\t\t\tvideo.play();\n\t\t\t\t\tvideo.bind(\"play\", function () {\n\t\t\t\t\t\tplayStatus = true;\n\t\t\t\t\t\tvideoPlayStatus(playStatus);\n\t\t\t\t\t});\n\t\t\t\t\tvideo.bind(\"pause\", function () {\n\t\t\t\t\t\tplayStatus = false;\n\t\t\t\t\t\tvideoPlayStatus(playStatus);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\twistiaVideo();\n\n\tfunction videoPlayStatus(status) {\n\t\tisVideoPlaying = status;\n\t}\n\treturn isVideoPlaying;\n}\n","import { isWistiaVideoPlaying } from \"../../components/video-wistia/_script.js\";\n\nexport function isAdmin() {\n\tconst ensoElement = document.querySelector(\"[enso]\");\n\tconst ensoElementAttribute = ensoElement.getAttribute(\"enso\");\n\treturn Boolean(ensoElementAttribute);\n}\n\nexport function showForAdmin() {\n\tif (!isAdmin()) return;\n\n\tif (window.matchMedia(\"(max-width : 768px)\").matches) return;\n\n\tconst elements = document.querySelectorAll(\"[js-show-for-admin]\");\n\tfor (const element of elements) {\n\t\tconst getDisplayType = element.getAttribute(\"js-show-for-admin\");\n\t\telement.classList.remove(\"hide\");\n\t\telement.style.display = `${getDisplayType}`; // to pick up edge cases during migration\n\t}\n}\n\nexport function cleanupAnchorTags() {\n\t// Remove a tag if href is missing or undefined\n\t$(\"a\").each(function () {\n\t\tif ($(this).attr(\"href\") == \"\" || $(this).attr(\"href\") == \"undefined\") {\n\t\t\t$(this).remove();\n\t\t}\n\t});\n}\n\n// Check all a links to find target = _blank see above\nexport function cleanupAnchorTagsBlankTarget() {\n\tdocument.querySelectorAll(\"a\").forEach(function (link) {\n\t\tif (!link.hasAttribute(\"href\")) link.remove();\n\n\t\tconst linkHref = link.getAttribute(\"href\");\n\n\t\t// Add _blank to all links that go to Monster Campaigns so they open on top of our pages instead of being redirected to Monsty\n\t\tif (linkHref && linkHref.includes(\"https://app.monstercampaigns.com/\")) {\n\t\t\tlink.setAttribute(\"target\", \"_blank\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove all _blank from a tags on mobile and tablet\n\t\tif (document.documentElement.clientWidth < 1025) {\n\t\t\tlink.setAttribute(\"target\", \"_self\");\n\t\t}\n\t});\n}\n\nexport function pushEvent(item, action, label) {\n\ttry {\n\t\tdataLayer.push({\n\t\t\tevent: item,\n\t\t\taction: action,\n\t\t\tlabel: label\n\t\t});\n\t\tconsole.log(\"Success: Pushed Event via data layer:\", item, action, label);\n\t} catch (error) {\n\t\tconsole.log(\"Failed: Pushed Event:\", item, action, label, \"-\", error);\n\t}\n}\n\nexport function pushEventFacebook() {\n\ttry {\n\t\tfbq(\"track\", \"Lead\");\n\t} catch (error) {\n\t\tconsole.log(\"Failed : pushEventFacebook\");\n\t}\n}\n\nexport function pushEventBing() {\n\ttry {\n\t\twindow.uetq = window.uetq || [];\n\t\twindow.uetq.push({\n\t\t\tec: \"Lead\",\n\t\t\tea: \"Catalog_Request\"\n\t\t});\n\t} catch (error) {\n\t\t// console.log(\"Failed : pushEventBing\");\n\t}\n}\n\n// Function: get user's device size. This function is intentionally duplicated here to be available for global use. Second instance lives in resize-img.js\nexport function getBrowserDevice() {\n\tif (window.matchMedia(\"(max-width : 767px)\").matches) return \"mobile\";\n\tif (window.matchMedia(\"(min-width : 768px) AND (max-width : 1023px)\").matches) return \"tablet\";\n\tif (window.matchMedia(\"(min-width : 1024px)\").matches) return \"desktop\";\n\treturn \"unsure\";\n}\n\n// EVENT - Check for country local storage, set if not already set\nexport async function saveUserCountryToLocalStorage() {\n\tlet userCountry = localStorage.getItem(\"country\");\n\tif (userCountry === null) {\n\t\tuserCountry = await setUserCountry();\n\t}\n}\n\n// set user country in local storage\nasync function setUserCountry() {\n\ttry {\n\t\tlet response = await fetch(\"https://ipinfo.io/json?token=5ddc6962f801d5\");\n\t\tlet data = await response.json();\n\t\tlet userCountry = data.country || \"unknown\";\n\t\tlocalStorage.setItem(\"country\", userCountry);\n\t\treturn userCountry;\n\t} catch (err) {\n\t\tconsole.error(\"Failed to fetch user country.\", err);\n\t\treturn \"unknown\"; // Return a default value in case of an error\n\t}\n}\n\n// Function: check if any modal is open\nexport function checkForOpenModals() {\n\tconst isOpen = sessionStorage.getItem(\"modalOpen\") === \"true\";\n\treturn isOpen;\n}\n\n// Function: check if a wistia video is playing\nexport function checkIfWistiaVideoPlaying() {\n\tconst wistiaVideo = document.querySelector(\".js-video\");\n\tif (wistiaVideo && isWistiaVideoPlaying() !== undefined) {\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\n// vanilla wrapper to get cookie value\nexport function getCookie(name) {\n\tlet value = `; ${document.cookie}`;\n\tlet parts = value.split(`; ${name}=`);\n\tif (parts.length === 2) return parts.pop().split(\";\").shift();\n}\n\n// Utility to copy text to clipboard\nexport async function copyToClipboard(val) {\n\ttry {\n\t\tawait navigator.clipboard.writeText(val);\n\t} catch (err) {\n\t\tconsole.error(\"Failed to copy: \", err);\n\t}\n}\n\n// Utility to track browser size for Google Analytics -- are we using this?\nexport function browserSize() {\n\tlet width = window.innerWidth || document.body.clientWidth;\n\tlet height = window.innerHeight || document.body.clientHeight;\n\tlet size = width + \"x\" + height;\n\n\tlet browserSizeCookie = Cookies.get(\"browserSize\");\n\tif (browserSizeCookie === \"blocked\" || browserSizeCookie == null || browserSizeCookie != size) {\n\t\tbrowserSizeCookie = size;\n\t\tCookies.set(\"browserSize\", size, {\n\t\t\texpires: 365\n\t\t});\n\t\tpushEvent(\"Browser Size\", \"Range\", size);\n\t}\n}\n\n// Function: show hero photo credit if name has been entered in CMS\nexport function showHeroPhotoCredit() {\n\tconst photoCredit = document.querySelector(\"[js-hero-photo-credit]\");\n\tif (photoCredit) {\n\t\tconst creditText = photoCredit.textContent.trim();\n\t\tif (creditText.length > 2) {\n\t\t\tphotoCredit.classList.remove(\"hide\");\n\t\t} else {\n\t\t\tphotoCredit.classList.add(\"hide\");\n\t\t}\n\t}\n}\n\n// Need to run on page load but not a huge priority\nexport function setFavIcon() {\n\tconst favicon = document.querySelector(\"[js-set-favicon]\");\n\tconst mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\tif (!favicon) return;\n\tfunction updateFavicon() {\n\t\tfavicon.setAttribute(\"href\", mediaQuery.matches ? \"/assets/images/icons/favicon-dark-mode.png\" : \"/assets/images/icons/favicon-light-mode.png\");\n\t}\n\tupdateFavicon();\n\tmediaQuery.addEventListener(\"change\", updateFavicon);\n}\n\n// Track social icon clicks for GA\nexport function trackSocialClicks(links, area) {\n\tlet socialLinks = document.querySelectorAll(`[${links}]`);\n\tsocialLinks.forEach(function (link) {\n\t\tlink.addEventListener(\"click\", function () {\n\t\t\tlet platform = link.getAttribute(`${links}`);\n\t\t\tpushEvent(\"Clicks\", `Social ${area}`, `${platform}`);\n\t\t});\n\t});\n}\n\n// Functions: check if elements exist\nconst ensureElementExists = (elementSelector, limit) =>\n\tnew Promise((resolve, reject) => {\n\t\tlet count = 0;\n\t\tfunction waitForElement() {\n\t\t\tconst element = document.querySelector(elementSelector);\n\t\t\tif (element) return resolve(element);\n\t\t\tif (limit && count > limit) return false;\n\t\t\tcount += 1;\n\t\t\tsetTimeout(waitForElement, 100);\n\t\t}\n\t\twaitForElement();\n\t});\n\nexport const waitUntilElementExists = async (elementSelector, limit) => {\n\tconst response = await ensureElementExists(elementSelector, limit);\n\treturn response;\n};\n\nexport function addEnsoExample(selector) {\n\tconst element = document.querySelector(selector);\n\tconst elementText = element.innerText;\n\n\tif (element && elementText === \"\") element.classList.add(\"js-enso-example\");\n}\n\nexport function removeMissingImage() {\n\tconst images = document.querySelectorAll(\"[js-remove-missing-image]\");\n\timages.forEach((img) => {\n\t\tif (img.naturalWidth === 0) {\n\t\t\timg.remove();\n\t\t}\n\t});\n}\n","import { getBrowserDevice } from \"../../assets/js/utilities.js\";\n\n// check for breadcrumbs up to 4 levels deep and animate sticky hero elements\nexport function manageBreadcrumbs() {\n\tconst breadcrumbsBar = document.querySelector(\"[js-breadcrumbs-bar]\"); // desktop\n\tconst breadcrumbsListItems = document.querySelectorAll(\"[js-breadcrumbs-item]\"); // desktop and mobile\n\n\tbreadcrumbsListItems.forEach((item) => {\n\t\tif (item.textContent === \"\") item.remove();\n\t});\n\n\t// hide home link if no breadcrumbs (ie. 404 page)\n\tif (document.querySelector(\"[js-breadcrumbs-mobile-list]\") && document.querySelector(\"[js-breadcrumbs-mobile-list]\").innerText === \"\") {\n\t\tdocument.querySelector(\"[js-breadcrumbs-mobile-home-link]\").classList.add(\"hide\");\n\t}\n\n\tif (getBrowserDevice() === \"desktop\" && breadcrumbsBar) {\n\t\tScrollTrigger.create({\n\t\t\ttrigger: breadcrumbsBar,\n\t\t\tonUpdate: (self) => scale_breadcrumbs_pagename(self.direction, breadcrumbsBar)\n\t\t});\n\t}\n}\n\nwindow.addEventListener(\"resize\", manageBreadcrumbs);\n\nfunction scale_breadcrumbs_pagename(direction, breadcrumbsBar) {\n\tconst pageName = document.querySelector(\"[js-sticky-pagename]\");\n\tconst distanceToTop = 0.08;\n\tlet position = ScrollTrigger.positionInViewport(breadcrumbsBar, \"top\");\n\n\t// scrolling down\n\tif (direction === 1 && position < distanceToTop) scaleDown(pageName, breadcrumbsBar);\n\n\t// scrolling up\n\tif (direction === -1 && position > distanceToTop) scaleUp(pageName, breadcrumbsBar);\n}\n\nfunction scaleDown(pageName, breadcrumbsBar) {\n\tpageName.classList.add(\"js-transform-pagename\");\n\tbreadcrumbsBar.classList.add(\"js-transform-breadcrumbs\");\n}\n\nfunction scaleUp(pageName, breadcrumbsBar) {\n\tpageName.classList.remove(\"js-transform-pagename\");\n\tbreadcrumbsBar.classList.remove(\"js-transform-breadcrumbs\");\n}\n","import { pushEvent } from \"../../assets/js/utilities.js\";\n\nexport function backToTripBar() {\n\tconst heroBar = document.querySelector(\"[hero~='bottom-bar']\");\n\tconst urlPathname = window.location.pathname;\n\n\t// Function: Show Back To Trip bar on non-trip pages\n\tfunction showBackToTripBar() {\n\t\tif (sessionStorage.getItem(\"backToTripURL\") !== null && sessionStorage.getItem(\"backToTripName\") !== null) {\n\t\t\tconst backToTripURL = sessionStorage.getItem(\"backToTripURL\");\n\t\t\tconst backToTripName = sessionStorage.getItem(\"backToTripName\");\n\t\t\tconst backToTripElement = document.querySelector(\"[js-back-to-trip]\");\n\n\t\t\tbackToTripElement.setAttribute(\"href\", backToTripURL);\n\t\t\tbackToTripElement.textContent = `Back to ${backToTripName}`;\n\t\t\tbackToTripElement.classList.remove(\"hide\");\n\t\t\theroBar.classList.add(\"js-back-to-trip-on\");\n\n\t\t\tbackToTripElement.addEventListener(\"click\", function () {\n\t\t\t\tpushEvent(\"Clicks\", \"Back to Trip Bar\");\n\t\t\t});\n\t\t}\n\t}\n\tshowBackToTripBar();\n\n\t// Function: for Camps/Lodges pages with repeaters (multiple camps are on the page), show Back To bar for parent page; Ex: African camps\n\tfunction backToCamp() {\n\t\tconst masthead = document.querySelector(\"[masthead-stage]\");\n\t\tconst subNavLinks = document.querySelector(\".js-tripnav\");\n\t\tconst campRepeaters = document.querySelectorAll(\"[repeater~='trips'] a\");\n\n\t\t// Events: clear back to bar sessions if user navigates to a different page (ie. clicks on the bar, masthead, or a subnav link)\n\t\theroBar.addEventListener(\"click\", clearBackToBarSessions);\n\t\tmasthead.addEventListener(\"click\", clearBackToBarSessions());\n\t\tsubNavLinks.addEventListener(\"click\", clearBackToBarSessions());\n\n\t\t// Event: if there are repeaters on the page, remember the url and link name for back to bar when user clicks on one\n\t\tif (!campRepeaters.length > 0) return;\n\n\t\tcampRepeaters.forEach((camp) => {\n\t\t\tcamp.addEventListener(\"click\", function () {\n\t\t\t\tlet activeSubnavLink = document.querySelector(\".js-tripnav li.active a\");\n\t\t\t\tlet subnavName = activeSubnavLink.textContent;\n\n\t\t\t\tsessionStorage.setItem(\"backToTripURL\", urlPathname);\n\t\t\t\tsessionStorage.setItem(\"backToTripName\", subnavName);\n\t\t\t});\n\t\t});\n\t}\n\n\t// Function: clear back to bar session storage\n\tfunction clearBackToBarSessions() {\n\t\tsessionStorage.removeItem(\"backToTripURL\");\n\t\tsessionStorage.removeItem(\"backToTripName\");\n\t}\n\n\t// Event: call function if in camps/lodges section\n\tif (urlPathname.includes(\"/camps-lodges/\")) {\n\t\tbackToCamp();\n\t}\n}\n","import { getBrowserDevice, getCookie } from \"../../assets/js/utilities.js\";\n\nexport function setTripNavPosition() {\n\tconst hero = document.querySelector(\"[hero]\");\n\tconst main = document.querySelector(\"main\");\n\tconst leftNav = document.querySelector(\"[js-position-left-nav]\");\n\tconst tripCTAs = document.querySelector(\"[js-position-trip-ctas]\");\n\tconst magicCTA = document.querySelector(\"[js-magic-wrapper]\");\n\tconst magicHidden = !magicCTA || getCookie(\"magic\") === \"hide\" ? true : false;\n\tconst buffer = 24;\n\tlet isHeroSticky = true;\n\tlet observer;\n\n\tfunction checkPositions() {\n\t\tconst browserDevice = getBrowserDevice();\n\t\tif (browserDevice === \"mobile\") return;\n\n\t\tlet heightMasthead = getElementProperty(\"[masthead]\", null, \"height\");\n\t\tlet heightMagic = magicHidden ? 0 : getElementProperty(\"[js-magic-wrapper]\", \"[magic-image-catalog] img\", \"height\");\n\t\tlet heightTabletBreadcrumbsBar = getElementProperty(\"[js-tripnav-section-wrapper]\", null, \"height\");\n\n\t\tconst heightStickyHero = heightMasthead + buffer;\n\t\tlet heightNav, heightsAll, heightsNavHero;\n\n\t\t// define variables based on device size\n\t\tif (browserDevice === \"desktop\") {\n\t\t\tconst slideshow = document.querySelector(\"[js-get-slideshow-height]\");\n\t\t\tconst heightSlideshow = slideshow ? slideshow.offsetHeight : 0;\n\n\t\t\theightNav = leftNav ? leftNav.offsetHeight + buffer : 0;\n\t\t\theightsNavHero = heightNav > heightSlideshow ? heightNav + heightStickyHero : heightSlideshow + heightStickyHero;\n\t\t\theightsAll = heightsNavHero + heightMagic;\n\t\t}\n\n\t\tif (browserDevice === \"tablet\") {\n\t\t\theightNav = tripCTAs ? tripCTAs.offsetHeight + heightTabletBreadcrumbsBar + buffer : 0;\n\t\t\theightsAll = heightNav + heightMagic;\n\t\t}\n\n\t\tconst heightsNavMagic = heightNav + heightMagic;\n\n\t\t// in case of resize, reset all classes and disconnect observer\n\t\tremoveAllStaticClasses();\n\t\tstopObservingMagicCTA();\n\n\t\t// if all sticky elements fit in the window, keep sticky and set magic default position\n\t\tif (window.innerHeight > heightsAll) {\n\t\t\tsetDefaultMagicPosition(magicHidden, magicCTA);\n\t\t\treturn;\n\t\t}\n\n\t\t// if leftnav doesn't fit, make everything static and set magic default position\n\t\tif (window.innerHeight <= heightNav) {\n\t\t\taddAllStaticClasses();\n\t\t\tsetDefaultMagicPosition(magicHidden, magicCTA);\n\t\t\treturn;\n\t\t}\n\n\t\t// if hero doesn't fit, make hero static\n\t\tif (browserDevice === \"desktop\" && window.innerHeight <= heightsNavHero) {\n\t\t\taddRemoveClass(hero, \"js-static-hero\", \"add\");\n\t\t\tisHeroSticky = false;\n\t\t}\n\n\t\tif (magicHidden) return;\n\n\t\t// if leftnav and magic fit, set magic default position\n\t\tif (window.innerHeight > heightsNavMagic) {\n\t\t\tsetDefaultMagicPosition(magicHidden, magicCTA);\n\n\t\t\t// if hero is sticky, watch when magicCTA is intersecting with main and remove sticky hero to make room\n\t\t\tif (browserDevice === \"desktop\" && isHeroSticky) observeMagicCTA();\n\n\t\t\t// otherwise watch for end of main to show magicCTA\n\t\t} else {\n\t\t\tScrollTrigger.create({\n\t\t\t\ttrigger: main,\n\t\t\t\tonUpdate: (self) => positionMagicCTA(self.direction, main, magicCTA)\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction removeAllStaticClasses() {\n\t\taddRemoveClass(leftNav, \"js-static-nav\", \"remove\");\n\t\taddRemoveClass(tripCTAs, \"js-static-ctas\", \"remove\");\n\t\taddRemoveClass(magicCTA, \"js-default-magic-position\", \"remove\");\n\t\tsetAttribute(magicCTA, \"js-position\", \"\");\n\t\taddRemoveClass(hero, \"js-static-hero\", \"remove\");\n\t\tisHeroSticky = true;\n\t}\n\n\tfunction addAllStaticClasses() {\n\t\taddRemoveClass(leftNav, \"js-static-nav\", \"add\");\n\t\taddRemoveClass(tripCTAs, \"js-static-ctas\", \"add\");\n\t\taddRemoveClass(hero, \"js-static-hero\", \"add\");\n\t\tisHeroSticky = false;\n\t\tsetDefaultMagicPosition(magicCTA);\n\t}\n\n\tfunction observeMagicCTA() {\n\t\tobserver = new IntersectionObserver(addRemoveStickyHero, {\n\t\t\trootMargin: \"100px 0px 0px 0px\"\n\t\t});\n\t\tobserver.observe(magicCTA);\n\t}\n\n\tfunction addRemoveStickyHero(entries) {\n\t\tentries.forEach((entry) => {\n\t\t\tif (entry.isIntersecting) {\n\t\t\t\taddRemoveClass(hero, \"js-static-hero\", \"add\");\n\t\t\t} else if (isHeroSticky) {\n\t\t\t\taddRemoveClass(hero, \"js-static-hero\", \"remove\");\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction stopObservingMagicCTA() {\n\t\tif (observer) {\n\t\t\tobserver.disconnect();\n\t\t}\n\t}\n\n\t// Run the function initially and when the window is resized\n\tcheckPositions();\n\twindow.addEventListener(\"resize\", checkPositions);\n}\n\nfunction getElementProperty(selector, childSelector, property) {\n\tconst element = document.querySelector(selector);\n\tif (element) {\n\t\tconst child = childSelector ? element.querySelector(childSelector) : element;\n\t\tconst styles = window.getComputedStyle(child);\n\t\treturn parseFloat(styles.getPropertyValue(property));\n\t}\n\treturn 0;\n}\n\nfunction addRemoveClass(element, className, condtion) {\n\tif (!element) return;\n\tif (condtion === \"remove\") element.classList.remove(className);\n\tif (condtion === \"add\") element.classList.add(className);\n}\n\nfunction setAttribute(element, attributeName, value) {\n\tif (!element) return;\n\telement.setAttribute(attributeName, value);\n}\n\nfunction setDefaultMagicPosition(magicHidden, magicCTA) {\n\tif (magicHidden) return;\n\taddRemoveClass(magicCTA, \"js-default-magic-position\", \"add\");\n\tsetAttribute(magicCTA, \"js-position\", \"js-default-magic-position\");\n}\n\nfunction positionMagicCTA(direction, main, magicCTA) {\n\tlet mainPosition = ScrollTrigger.positionInViewport(main, \"bottom\");\n\n\t// scrolling down\n\tif (direction === 1 && mainPosition < 0.85) {\n\t\taddRemoveClass(magicCTA, \"js-reposition-magic\", \"add\");\n\t}\n\n\t// scrolling up\n\tif (direction === -1 && mainPosition > 0.8) {\n\t\taddRemoveClass(magicCTA, \"js-reposition-magic\", \"remove\");\n\t}\n}\n","export function trimGuideName() {\n\tconst guideName = document.querySelector(\"[js-get-guide-name]\");\n\n\t// trim last name from title\n\tconst firstName = guideName.textContent.trim().split(\" \")[0];\n\tguideName.textContent = firstName;\n}\n","export function hideEmptyGuideBioSections() {\n\tconst sections = document.querySelectorAll(\"[js-is-hidden]\");\n\n\tsections.forEach((section) => {\n\t\tif (section.clientHeight === 0) section.classList.add(\"hide\");\n\t});\n}\n","export function convertOldSlideshowToNew() {\n\tconst imageContainers = document.querySelectorAll(\".js-old-slideshow-images\");\n\tif (!imageContainers.length) return;\n\n\tlet slides = \"\";\n\n\tfor (const imageContainer of imageContainers) {\n\t\tconst images = imageContainer.querySelectorAll(\"img\");\n\t\tif (!images.length) continue;\n\n\t\tfor (const image of images) {\n\t\t\tconst alt = image.getAttribute(\"alt\") || \" \";\n\t\t\tlet src = image.getAttribute(\"src\") || image.getAttribute(\"data-src\");\n\n\t\t\tif (!src) continue;\n\n\t\t\tconst domain = \"https://www.nathab.com\";\n\t\t\tconst cdn = \"https://cdn.filestackcontent.com/A6dTpd53SmIg0pBfJJhgAz/resize=width:1600,fit:max/quality=value:60/cache=expiry:31536000/compress/\";\n\t\t\tconst doubleDomain = domain + domain;\n\n\t\t\tsrc = domain + src;\n\t\t\tsrc = src.replace(doubleDomain, domain);\n\t\t\tsrc = cdn + src;\n\n\t\t\tslides += `\n\t\t\t\t