It looks like this is a web page, not a feed. I looked for a feed associated with this page, but couldn't find one. Please enter the address of your feed to validate.

Source: https://caribou.travel/

  1. <!DOCTYPE html><!-- Last Published: Fri Nov 15 2024 02:01:03 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="caribou.travel" data-wf-page="64d1f8d7c8eb554aa7393f21" data-wf-site="64d1f8d7c8eb554aa7393f33" lang="zh-HK"><head><meta charset="utf-8"/><title>Caribou Travel - 你的一對一旅遊預訂助手 - 輕鬆預訂 郵輪假期|精品酒店</title><link rel="alternate" hrefLang="x-default" href="https://caribou.travel/"/><link rel="alternate" hrefLang="zh-HK" href="https://caribou.travel/"/><link rel="alternate" hrefLang="en" href="https://caribou.travel/en"/><meta content="Caribou Travel 預訂助手讓客人透過單一對口,輕鬆接通世界各地旅遊資源,隨時隨地查詢及預訂旅程所需的相關項目,助你輕鬆安排每一個夢想旅程。 少一點煩惱,多一點感受" name="description"/><meta content="Caribou Travel - 你的一對一旅遊預訂助手 - 輕鬆預訂 郵輪假期|精品酒店" property="og:title"/><meta content="Caribou Travel 預訂助手讓客人透過單一對口,輕鬆接通世界各地旅遊資源,隨時隨地查詢及預訂旅程所需的相關項目,助你輕鬆安排每一個夢想旅程。 少一點煩惱,多一點感受" property="og:description"/><meta content="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/663ca3459494614aa385b3bc_Cover%20Image%20-%20Chinese.png" property="og:image"/><meta content="Caribou Travel - 你的一對一旅遊預訂助手 - 輕鬆預訂 郵輪假期|精品酒店" property="twitter:title"/><meta content="Caribou Travel 預訂助手讓客人透過單一對口,輕鬆接通世界各地旅遊資源,隨時隨地查詢及預訂旅程所需的相關項目,助你輕鬆安排每一個夢想旅程。 少一點煩惱,多一點感受" property="twitter:description"/><meta content="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/663ca3459494614aa385b3bc_Cover%20Image%20-%20Chinese.png" property="twitter:image"/><meta property="og:type" content="website"/><meta content="summary_large_image" name="twitter:card"/><meta content="width=device-width, initial-scale=1" name="viewport"/><link href="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/css/caribou-staging.webflow.e3a9457ca.min.css" rel="stylesheet" type="text/css"/><link href="https://fonts.googleapis.com" rel="preconnect"/><link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="anonymous"/><script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script><script type="text/javascript">WebFont.load({  google: {    families: ["Noto Sans HK:regular,500,700","Poppins:regular,500,600,700","Manrope:regular,500,600,700"]  }});</script><script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script><link href="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f7a_Favicon.png" rel="shortcut icon" type="image/x-icon"/><link href="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f7b_Webclip.png" rel="apple-touch-icon"/><!-- Google Tag Manager -->
  2. <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
  3. new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
  4. j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
  5. 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
  6. })(window,document,'script','dataLayer','GTM-WKGC5B3');</script>
  7. <!-- End Google Tag Manager -->
  8.  
  9. <meta name="agd-partner-manual-verification" />
  10.  
  11.  
  12. <!-- Meta Pixel Code -->
  13. <script>
  14. !function(f,b,e,v,n,t,s)
  15. {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
  16. n.callMethod.apply(n,arguments):n.queue.push(arguments)};
  17. if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
  18. n.queue=[];t=b.createElement(e);t.async=!0;
  19. t.src=v;s=b.getElementsByTagName(e)[0];
  20. s.parentNode.insertBefore(t,s)}(window, document,'script',
  21. 'https://connect.facebook.net/en_US/fbevents.js');
  22. fbq('init', '921638962188869');
  23.  
  24. </script>
  25. <noscript><img height="1" width="1" style="display:none"
  26. src="https://www.facebook.com/tr?id=921638962188869&ev=PageView&noscript=1"
  27. /></noscript>
  28. <!-- End Meta Pixel Code -->
  29.  
  30.  
  31. <!-- Custom Google Ad Tracking -->
  32. <script>
  33. function setCookie(name, value, days) {
  34.  var expires = "";
  35.  if (days) {
  36.    var date = new Date();
  37.    date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000); // Set expiry to 30 days
  38.    expires = "; expires=" + date.toUTCString();
  39.  }
  40.  document.cookie =
  41.    name + "=" + encodeURIComponent(value || "") + expires + "; path=/";
  42. }
  43.  
  44. // Utility Functions
  45. function getCookie(name) {
  46.  var nameEQ = name + "=";
  47.  var ca = document.cookie.split(";");
  48.  for (var i = 0; i < ca.length; i++) {
  49.    var c = ca[i];
  50.    while (c.charAt(0) == " ") c = c.substring(1, c.length);
  51.    if (c.indexOf(nameEQ) == 0) {
  52.      var cookieValue = c.substring(nameEQ.length, c.length);
  53.      return decodeURIComponent(cookieValue);
  54.    }
  55.  }
  56.  return null;
  57. }
  58.  
  59. function getClientId() {
  60.  var gaCookie = getCookie("_ga");
  61.  if (gaCookie) {
  62.    var parts = gaCookie.split(".");
  63.    if (parts.length >= 4) {
  64.      return parts[2] + "." + parts[3];
  65.    }
  66.  }
  67.  return "";
  68. }
  69.  
  70. function getSessionId() {
  71.  var gaSessionCookie = getCookie("_ga_F643X6TL3D");
  72.  if (gaSessionCookie) {
  73.    var parts = gaSessionCookie.split(".");
  74.    if (parts.length >= 2) {
  75.      return parts[2];
  76.    }
  77.  }
  78.  return "";
  79. }
  80.  
  81.  
  82. function triggerCustomDataReady(){
  83.  // Push the fetched data and a custom event to the dataLayer
  84.  dataLayer.push({
  85.    'event': 'data_ready',  // Custom event name
  86.  });
  87.  
  88.  fbq('track', 'PageView');
  89. }
  90.  
  91.  
  92. async function fetchHashId(hashObject) {
  93.  try {
  94.    // Skip hashing for empty object
  95.    if (!hashObject || Object.keys(hashObject).length === 0) {
  96.      return;
  97.    }
  98.    
  99.    const response = await fetch(
  100.      "https://hub.caribou.travel/api/hash",
  101.      {
  102.        method: "POST",
  103.        headers: {
  104.          "Content-Type": "application/json",
  105.          "Caribou-Token": "76776d2b7be55bac4de727bec1030657",
  106.        },
  107.        body: JSON.stringify(hashObject),
  108.      }
  109.    );
  110.  
  111.    const data = await response.json();
  112.    if (response.ok && data) {
  113.      var hashID = data.uuid;
  114.      setCookie("caribou_hashID", hashID, 30);
  115.    } else {
  116.      setCookie("caribou_hashID", '(no hashID)', 30);
  117.      console.error("API error or invalid response");
  118.    }
  119.  } catch (error) {
  120.    console.error("Error: ", error);
  121.  }
  122. }
  123.  
  124.  
  125. var urlParams = new URLSearchParams(window.location.search);
  126. var keys = [
  127.  "adUID",
  128.  "network",
  129.  "campaignid",
  130.  "campaign_id",
  131.  "adgroupid",
  132.  "adset_id",
  133.  "ad_id",
  134.  "device",
  135.  "creative",
  136.  "keyword",
  137.  "gclid",
  138.  'fbclid'
  139. ];
  140. var hasParams = keys.some((key) => urlParams.has(key));
  141. var adTracking = {}
  142.  
  143.  
  144. if (hasParams) {
  145.  adTracking = {
  146.    adUID: urlParams.get("adUID") || "(no value)",
  147.    network: urlParams.get("network") || "(no value)",
  148.    campaignid: urlParams.get("campaignid") || urlParams.get("campaign_id") || "(no value)", // Google: campaignid; Facebook: campaign_id
  149.    adgroupid: urlParams.get("adgroupid") || urlParams.get("adset_id") || "(no value)", // Google: adgroupid; Facebook: adset_id
  150.    adid: urlParams.get("ad_id") || "(no value)", // Google: /; Facebook: ad_id
  151.    device: urlParams.get("device") || "(no value)",
  152.    creative: urlParams.get("creative") || "(no value)",
  153.    keyword: urlParams.get("keyword") || "(no value)",
  154.    gclid: urlParams.get("gclid") || "(no value)",
  155.    fbclid: urlParams.get("fbclid") || "(no value)",
  156.    timestamp: new Date().toISOString(),
  157.  };
  158.  
  159.  // Get the existing adTracking cookie
  160.  var existingAdTracking = getCookie('adTracking') ? JSON.parse(getCookie('adTracking')) : null
  161.  
  162.  // Create copies of the adTracking objects without the timestamp
  163.  var currentAdTrackingNoTimestamp = { ...adTracking }
  164.  delete currentAdTrackingNoTimestamp.timestamp
  165.  
  166.  var existingAdTrackingNoTimestamp = existingAdTracking ? { ...existingAdTracking } : null
  167.  if ( existingAdTrackingNoTimestamp ) delete existingAdTrackingNoTimestamp.timestamp
  168.  
  169.  // Compare the existing adTracking cookie with the new one
  170.  if (!existingAdTrackingNoTimestamp || JSON.stringify(existingAdTrackingNoTimestamp) !== JSON.stringify(currentAdTrackingNoTimestamp)) {
  171.    setCookie("adTracking", JSON.stringify(adTracking), 30); // Store in a cookie for 30 days
  172.    setCookie("caribou_hashID", '(no_hashID)', 30) // Set the cookie 'caribou_hashID' so that it can request another hash
  173.  }
  174. }
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182. </script>
  183. <!-- End Custom Google Ad Tracking -->
  184.  
  185. <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
  186. <link
  187.  rel="stylesheet"
  188.  href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css"
  189. />
  190. <script src="https://cdnjs.cloudflare.com/ajax/libs/typed.js/2.1.0/typed.umd.js"></script>
  191.  
  192. <style>
  193.  
  194. .homepage-body-wrapper {
  195. display: none;
  196. }
  197.  
  198.  
  199. </style>
  200.  
  201. <script>
  202.  
  203. async function checkLocationAndRedirect() {
  204.    var currentPath = window.location.pathname;
  205.  
  206.    if (currentPath === "/") {
  207.        try {
  208.            // Check for existing 'caribou_language' cookie
  209.            const userLanguage = getCookie('caribou_language')
  210.  
  211.            if (userLanguage) {
  212.                // If cookie exists, redirect or display content accordingly
  213.                var languagePathMap = {
  214.                    'zh-Hant-HK': "/",
  215.                    'en': '/en'
  216.                }
  217.                var targetPathFromCookie = languagePathMap[userLanguage] || null
  218.  
  219.                if (targetPathFromCookie && currentPath !== targetPathFromCookie) {
  220.                    window.location.pathname = targetPathFromCookie;
  221.                    return; // Early return to prevent further execution
  222.                } else {
  223.                    // Show body when no redirect is needed
  224.                    document.querySelector(".homepage-body-wrapper").style.display = "block"
  225.                }
  226.            } else {
  227.                // Call API to checking language when cookie does not exist
  228.                const response = await fetch('https://advisor.caribou.travel/api/geo');
  229.                const data = await response.json();
  230.                var countryCode = data.data.country
  231.                var urlMap = {
  232.                    'HK': '/', // Hong Kong
  233.                    'SG': '/en', // Singapore
  234.                    'TW': '/', // Taiwan
  235.                };
  236.  
  237.                // Set cookie if not already set
  238.                const languageToSet = countryCode === 'HK' ? 'zh-Hant-HK' : 'en'
  239.                document.cookie = `caribou_language=${encodeURIComponent(languageToSet)}; path=/;`
  240.                
  241.                // Check if redirect is needed
  242.                var targetPath = urlMap[countryCode] || '/en'; // default to english if countryCode not in urlMap
  243.                if (currentPath !== targetPath){
  244.                    window.location.pathname = targetPath
  245.                } else {
  246.                    // No redirect is needed; show the body
  247.                    document.querySelector(".homepage-body-wrapper").style.display = "block"
  248.                }
  249.            }
  250.  
  251.        } catch (error) {
  252.            console.error('Error fetching country code:', error);
  253.            // API Error
  254.            document.querySelector(".homepage-body-wrapper").style.display = "block";
  255.        }
  256.    } else {
  257.        // Not in root directory
  258.        document.querySelector(".homepage-body-wrapper").style.display = "block";
  259.    }
  260. }
  261.  
  262.  
  263. window.onload = function() {
  264.  checkLocationAndRedirect();
  265. }
  266.  
  267.  
  268.  
  269.  
  270. </script>
  271. </head><body class="body"><div class="loading-wrapper"><div class="w-embed"><span class="loader"></span></div><div class="w-embed"><style>
  272. /* Loading Spinner */
  273. .loader {
  274.    display: block;
  275.    position: relative;
  276.    height: 32px;
  277.    width: 140px;
  278.    border: 3px solid #fff;
  279.    border-radius: 20px;
  280.    box-sizing: border-box;
  281.    animation: balancing 2s linear infinite alternate;
  282.    transform-origin: center center;
  283. }
  284.  
  285. .loader:before {
  286.    content: '';
  287.    position: absolute;
  288.    left: 0;
  289.    bottom: 0;
  290.    width: 52px;
  291.    height: 26px;
  292.    border-radius: 20px;
  293.    background: #FF911F;
  294.    animation: ballbns 2s linear infinite alternate;
  295. }
  296.  
  297. @keyframes ballbns {
  298.    0% {
  299.        left: 0;
  300.        transform: translateX(0%);
  301.    }
  302.  
  303.    100% {
  304.        left: 100%;
  305.        transform: translateX(-100%);
  306.    }
  307. }
  308.  
  309. @keyframes balancing {
  310.    0% {
  311.        transform: rotate(-25deg);
  312.    }
  313.  
  314.    50% {
  315.        transform: rotate(0deg);
  316.    }
  317.  
  318.    100% {
  319.        transform: rotate(25deg);
  320.    }
  321. }
  322.  
  323.  
  324. </style></div></div><div class="embed-js-loading-spinner w-embed w-script"><script>
  325.  
  326. // Show the loading wrapper by default
  327. document.querySelector(".loading-wrapper").style.display = "flex"
  328.  
  329. </script></div><div data-animation="default" data-collapse="medium" data-duration="400" data-easing="ease" data-easing2="ease" role="banner" class="plain-navbar w-nav"><div class="plain-navbar-container w-container"><a href="/" aria-current="page" class="plain-navbar-brand w-nav-brand w--current"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/653a0cc1720f1634ea7c29e9_Caribou-Logo.svg" loading="lazy" alt="" class="plain-navbar-img"/></a><nav role="navigation" class="plain-nav-menu w-nav-menu"><div data-hover="false" data-delay="0" class="nav-dropdown w-dropdown"><div class="nav-dropdown-toggle w-dropdown-toggle"><div class="nav-dropdown-toggle-text">旅遊產品</div><div class="nav-dropdown-toggle-icon"></div></div><nav class="nav-dropdown-list w-dropdown-list"><div class="nav-menu-collection-wrapper w-dyn-list"><div role="list" class="nav-menu-collection-list w-dyn-items"><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="#" class="nav-menu-link w-dropdown-link">所有產品</a><div class="nav-menu-hidden-link">/tour-products</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="#" class="nav-menu-link w-dropdown-link">郵輪假期</a><div class="nav-menu-hidden-link">/tour-products?searchKeyword=郵輪</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="#" class="nav-menu-link w-dropdown-link">精選酒店</a><div class="nav-menu-hidden-link">/tour-products?searchKeyword=酒店</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="#" class="nav-menu-link w-dropdown-link">深度遊</a><div class="nav-menu-hidden-link">/tour-products?supplier=GLO%20Travel#</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="#" class="nav-menu-link w-dropdown-link">包車遊</a><div class="nav-menu-hidden-link">/tour-products?searchKeyword=包車遊</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="#" class="nav-menu-link w-dropdown-link">旅遊套票</a><div class="nav-menu-hidden-link">/tour-products?searchKeyword=旅遊套票</div></div></div></div></nav></div><a href="/advisors" class="nav-link w-nav-link">旅遊顧問</a><a href="/about-us" class="nav-link w-nav-link">關於我們</a><a href="#" class="nav-lang-dropdown-icon-wrapper w-inline-block"><div class="nav-lang-dropdown-icon w-embed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
  330.  <path fill-rule="evenodd" clip-rule="evenodd" d="M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z" stroke="#101820" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  331.  <path d="M2 12H22" stroke="#101820" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  332.  <path fill-rule="evenodd" clip-rule="evenodd" d="M12 2C14.5013 4.73835 15.9228 8.29203 16 12C15.9228 15.708 14.5013 19.2616 12 22C9.49872 19.2616 8.07725 15.708 8 12C8.07725 8.29203 9.49872 4.73835 12 2V2Z" stroke="#101820" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  333. </svg></div><div class="locale-css w-embed"><style>
  334.  
  335. .nav-lang-dropdown-icon-wrapper:hover .nav-lang-dropdown-icon path {
  336. stroke:white;
  337. }
  338.  
  339. </style></div></a><a id="navbar-cta-button" href="/join-us" class="btn btn-primary btn-cta w-inline-block"><div>成為旅遊顧問</div></a><div class="mobile-menu-language-currency-wrapper"><a id="mobile-menu-btn-language" href="#" class="mobile-menu-icon-btn w-inline-block"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f42_globe.svg" loading="lazy" alt="" class="mobile-menu-icon-btn-img"/><div class="mobile-menu-icon-btn-text mobile-menu-btn-text-language">繁體中文</div></a><a id="mobile-menu-btn-currency" href="#" class="mobile-menu-icon-btn w-inline-block"><div class="mobile-menu-icon-btn-img-text">$</div><div class="mobile-menu-icon-btn-text mobile-menu-btn-text-currency">HKD</div></a></div></nav><div class="navbar-menu-button plain-navbar-menu-button w-nav-button"><div class="w-icon-nav-menu"></div></div></div></div><div class="hero-section"><section class="section hero-section-slide-section"><div class="w-layout-blockcontainer container hp-container w-container"><div class="hero-section-content-wrapper"><div class="hero-section-content-left"><div class="hero-section-heading-wrapper"><h1 class="hero-section-heading">一對一旅遊預訂助手<br/>助你輕鬆預訂</h1><h1 class="hero-section-heading hero-section-heading-highlight">郵輪假期</h1><h1 class="hero-section-heading"> </h1></div><p class="hero-section-description">Caribou Travel 預訂助手讓客人透過單一對口,輕鬆接通世界各地旅遊資源,隨時隨地查詢及預訂旅程所需的相關項目,助你輕鬆安排每一個夢想旅程。<br/><strong>少一點煩惱,多一點感受</strong></p><a href="/tour-products" class="btn btn-primary w-button">發現更多旅遊體驗</a></div><div class="hero-section-content-right"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/663c82ee0cbf062b21a0eb90_Cruise%20Key%20Visual%20-%20Whatsapp.webp" loading="lazy" sizes="(max-width: 479px) 93vw, (max-width: 767px) 96vw, (max-width: 991px) 95vw, (max-width: 1919px) 43vw, 475px" srcset="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/663c82ee0cbf062b21a0eb90_Cruise%20Key%20Visual%20-%20Whatsapp-p-500.webp 500w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/663c82ee0cbf062b21a0eb90_Cruise%20Key%20Visual%20-%20Whatsapp-p-800.webp 800w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/663c82ee0cbf062b21a0eb90_Cruise%20Key%20Visual%20-%20Whatsapp-p-1080.webp 1080w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/663c82ee0cbf062b21a0eb90_Cruise%20Key%20Visual%20-%20Whatsapp.webp 1587w" alt="" class="hero-section-key-visual"/></div></div></div></section><div class="hero-section-slider-wrapper w-dyn-list"><div role="list" class="hero-section-slider swiper-wrapper w-dyn-items"><div slide-img-url="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/663c82ee0cbf062b21a0eb90_Cruise%20Key%20Visual%20-%20Whatsapp.webp" slide-name="郵輪假期" role="listitem" class="hero-section-slide swiper-slide w-dyn-item"><div class="hero-section-bg-img-cover"></div><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/663c97b73084ff499bf716e2_Cruise%20Desktop%20Image.jpg&quot;)" class="hero-section-bg-img-desktop"></div><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/663c97bcf17b22d17c1f2882_Cruise%20Mobile%20Image.jpg&quot;)" class="hero-section-bg-img-mobile"></div></div><div slide-img-url="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/663c82ec4f1c78bd3da4fbb8_Hotel%20Key%20Visual%20-%20Whatsapp.webp" slide-name="精品酒店" role="listitem" class="hero-section-slide swiper-slide w-dyn-item"><div class="hero-section-bg-img-cover"></div><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/663c97c80c82f2b76795bca7_Hotel%20Desktop%20Image.jpg&quot;)" class="hero-section-bg-img-desktop"></div><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/663c97cf6342ecf62b719f7a_Hotel%20Mobile%20Image.jpg&quot;)" class="hero-section-bg-img-mobile"></div></div></div></div><div class="hero-slider-control"><div class="hero-slider-previous"></div><div class="hero-slider-next"></div><div class="hero-slider-pagination"><div class="swiper-bullet-active"></div><div class="swiper-bullet"></div></div></div></div><section class="section homepage-section"><div class="w-layout-blockcontainer container hp-container w-container"><h2 class="section-heading">郵輪假期</h2><div class="hp-product-wrapper w-dyn-list"><div role="list" class="hp-product-list w-dyn-items"><div role="listitem" class="hp-product-item w-dyn-item"><a href="/tour-products/632" class="tp-listing-item w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/66c1b47c234911f96bd1a1c5_melaka%20(2).jpg&quot;)" class="tp-listing-item-img"></div><div class="tp-listing-item-content-wrapper hp-tp-listing-item"><h2 class="tp-listing-item-name">名勝世界郵輪|雲頂夢號 - 2晚 馬六甲(吉隆坡)海上遊</h2><div class="tp-listing-item-details-wrapper"><div class="tp-listing-item-price-wrapper"><div class="tp-listing-item-discounted-price-wrapper"><div class="tour-product-price">1240</div><div class="tour-product-price-supporting">/人</div></div><div class="tour-product-original-price w-dyn-bind-empty"></div></div><div class="tp-listing-item-tour-types-wrapper"><div class="tour-types-text">郵輪, 新加坡, 吉隆坡</div></div></div></div></a></div><div role="listitem" class="hp-product-item w-dyn-item"><a href="/tour-products/203" class="tp-listing-item w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/65aff514bacb5c6b0cecc21d_1%20(6).jpg&quot;)" class="tp-listing-item-img"></div><div class="tp-listing-item-content-wrapper hp-tp-listing-item"><h2 class="tp-listing-item-name">皇家加勒比國際遊輪 | 海洋光譜號 - 5 晚航遊日本(沖繩、石垣)</h2><div class="tp-listing-item-details-wrapper"><div class="tp-listing-item-price-wrapper"><div class="tp-listing-item-discounted-price-wrapper"><div class="tour-product-price">2619</div><div class="tour-product-price-supporting">/人</div></div><div class="tour-product-original-price w-dyn-bind-empty"></div></div><div class="tp-listing-item-tour-types-wrapper"><div class="tour-types-text">郵輪, 日本 </div></div></div></div></a></div><div role="listitem" class="hp-product-item w-dyn-item"><a href="/tour-products/207" class="tp-listing-item w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/65aff72358f7ce687d7fa1de_1%20(7).jpg&quot;)" class="tp-listing-item-img"></div><div class="tp-listing-item-content-wrapper hp-tp-listing-item"><h2 class="tp-listing-item-name">皇家加勒比國際遊輪 | 海洋光譜號 - 9 晚航遊日本九州 【聖誕精選】</h2><div class="tp-listing-item-details-wrapper"><div class="tp-listing-item-price-wrapper"><div class="tp-listing-item-discounted-price-wrapper"><div class="tour-product-price">10779</div><div class="tour-product-price-supporting">/人</div></div><div class="tour-product-original-price w-dyn-bind-empty"></div></div><div class="tp-listing-item-tour-types-wrapper"><div class="tour-types-text"> 郵輪, 日本, 聖誕節精選</div></div></div></div></a></div><div role="listitem" class="hp-product-item w-dyn-item"><a href="/tour-products/620" class="tp-listing-item w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6605087e2f72a3d6c9550479_2.jpg&quot;)" class="tp-listing-item-img"></div><div class="tp-listing-item-content-wrapper hp-tp-listing-item"><h2 class="tp-listing-item-name">地中海郵輪|歐羅巴號 - 7 晚西班牙、法國、意大利、馬爾他 (2025年1-3月航次)</h2><div class="tp-listing-item-details-wrapper"><div class="tp-listing-item-price-wrapper"><div class="tp-listing-item-discounted-price-wrapper"><div class="tour-product-price">3498</div><div class="tour-product-price-supporting">/人</div></div><div class="tour-product-original-price w-dyn-bind-empty"></div></div><div class="tp-listing-item-tour-types-wrapper"><div class="tour-types-text">郵輪, 西班牙, 法國, 意大利, 馬爾他</div></div></div></div></a></div></div></div><a href="/tour-products" class="btn btn-primary w-button">查看更多</a></div><div id="themed-travel-guides" class="w-layout-blockcontainer container hp-container w-container"><h2 class="section-heading">各種主題旅遊攻略</h2><div class="hp-theme-wrapper w-dyn-list"><div role="list" class="hp-theme-list w-dyn-items"><div role="listitem" class="hp-theme-item w-dyn-item"><a href="/product-theme/latest-cruise-promotion" class="theme-page-link-wrapper w-inline-block"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/670149745f6d846c260f2650_OG-template%20.png" loading="lazy" alt="" sizes="(max-width: 479px) 93vw, (max-width: 767px) 96vw, (max-width: 991px) 95vw, (max-width: 1919px) 28vw, 374px" srcset="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/670149745f6d846c260f2650_OG-template%20-p-500.png 500w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/670149745f6d846c260f2650_OG-template%20-p-800.png 800w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/670149745f6d846c260f2650_OG-template%20-p-1080.png 1080w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/670149745f6d846c260f2650_OG-template%20.png 1200w" class="theme-page-link-img"/><div class="theme-page-content-wrapper"><h3 class="theme-page-title"> 【最新郵輪優惠】精選各地航程 超值優惠大合集</h3></div></a></div><div role="listitem" class="hp-theme-item w-dyn-item"><a href="/product-theme/cruise-tips-okinawa-shore-excursions" class="theme-page-link-wrapper w-inline-block"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/66deae1c986a495f8e96b2e0_OG-template%20%20(5).jpg" loading="lazy" alt="" sizes="(max-width: 479px) 93vw, (max-width: 767px) 96vw, (max-width: 991px) 95vw, (max-width: 1919px) 28vw, 374px" srcset="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/66deae1c986a495f8e96b2e0_OG-template%20%20(5)-p-500.jpg 500w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/66deae1c986a495f8e96b2e0_OG-template%20%20(5)-p-800.jpg 800w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/66deae1c986a495f8e96b2e0_OG-template%20%20(5)-p-1080.jpg 1080w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/66deae1c986a495f8e96b2e0_OG-template%20%20(5).jpg 1200w" class="theme-page-link-img"/><div class="theme-page-content-wrapper"><h3 class="theme-page-title">【郵輪攻略】郵輪自由行玩法大解密  沖繩經典半日遊5大私藏路線</h3></div></a></div><div role="listitem" class="hp-theme-item w-dyn-item"><a href="/product-theme/cruise-tips-how-to-choose-cruise" class="theme-page-link-wrapper w-inline-block"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/66227b1b8a9b050b62d827ac_cruise.jpg" loading="lazy" alt="" sizes="(max-width: 479px) 93vw, (max-width: 767px) 96vw, (max-width: 991px) 95vw, (max-width: 1919px) 28vw, 374px" srcset="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/66227b1b8a9b050b62d827ac_cruise-p-500.jpg 500w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/66227b1b8a9b050b62d827ac_cruise-p-800.jpg 800w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/66227b1b8a9b050b62d827ac_cruise-p-1080.jpg 1080w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/66227b1b8a9b050b62d827ac_cruise.jpg 1200w" class="theme-page-link-img"/><div class="theme-page-content-wrapper"><h3 class="theme-page-title">【精明旅遊小貼士】郵輪旅遊絕不能錯過的 7 大挑選秘訣</h3></div></a></div></div></div><a href="/product-themes/all" class="btn btn-primary w-button">查看更多</a></div></section><section id="seamless-replace" class="section bg-orange homepage-section"><div class="w-layout-blockcontainer container hp-container w-container"><div class="section-title"><div class="section-title-tag">旅遊達人</div><h2 class="section-title-heading">為您帶來有溫度、有深度旅遊體驗的旅遊達人</h2></div><div id="test" class="home-expert-wrapper w-dyn-list"><div role="list" class="home-expert-collection-list w-dyn-items"><div role="listitem" class="home-expert-collection-item w-dyn-item"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/650705db62edbc114404d37a_CARIBOU%20Profile%20Pic.png&quot;)" class="expert-profile-image"></div><div class="expert-profile-info-wrapper home-expert-profile-info-wrapper"><div class="expert-name-wrapper"><h1 class="expert-name-heading">oija</h1><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f63_privacy-guard-success---filled(24x24)%401x%201.svg" loading="lazy" alt="" class="expert-badge-icon"/></div><div class="expert-number-wrapper"><div class="expert-number-item"><div class="expert-number-data">50</div><div class="expert-number-description">地點</div></div><div class="expert-number-item w-condition-invisible"><div class="expert-number-data w-dyn-bind-empty"></div><div class="expert-number-description">景點</div></div><div class="expert-number-item"><div class="expert-number-data">5</div><div class="expert-number-description">活動</div></div></div><div class="expert-activities-wrapper"><div class="activities-collection-list-wrapper w-dyn-list"><div role="list" class="activities-collection-list home-expert-activities-collection-list w-dyn-items"><div role="listitem" class="activities-collection-item w-dyn-item"><div>自駕遊</div></div><div role="listitem" class="activities-collection-item w-dyn-item"><div>自然景觀</div></div><div role="listitem" class="activities-collection-item w-dyn-item"><div>歷史</div></div><div role="listitem" class="activities-collection-item w-dyn-item"><div>藝術</div></div><div role="listitem" class="activities-collection-item w-dyn-item"><div>建築</div></div></div></div></div></div><a href="/expert/oija" class="home-expert-link w-inline-block"></a></div><div role="listitem" class="home-expert-collection-item w-dyn-item"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6506b2d0e3a78cfe0d51e41a_emily_profile.png&quot;)" class="expert-profile-image"></div><div class="expert-profile-info-wrapper home-expert-profile-info-wrapper"><div class="expert-name-wrapper"><h1 class="expert-name-heading">賞遊世界60國的Emily</h1><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f63_privacy-guard-success---filled(24x24)%401x%201.svg" loading="lazy" alt="" class="expert-badge-icon"/></div><div class="expert-number-wrapper"><div class="expert-number-item"><div class="expert-number-data">220</div><div class="expert-number-description">地點</div></div><div class="expert-number-item w-condition-invisible"><div class="expert-number-data w-dyn-bind-empty"></div><div class="expert-number-description">景點</div></div><div class="expert-number-item"><div class="expert-number-data">5</div><div class="expert-number-description">活動</div></div></div><div class="expert-activities-wrapper"><div class="activities-collection-list-wrapper w-dyn-list"><div role="list" class="activities-collection-list home-expert-activities-collection-list w-dyn-items"><div role="listitem" class="activities-collection-item w-dyn-item"><div>藝術</div></div><div role="listitem" class="activities-collection-item w-dyn-item"><div>冥想</div></div><div role="listitem" class="activities-collection-item w-dyn-item"><div>健康</div></div><div role="listitem" class="activities-collection-item w-dyn-item"><div>行山</div></div><div role="listitem" class="activities-collection-item w-dyn-item"><div>自然景觀</div></div></div></div></div></div><a href="/expert/emily-shake-to-win" class="home-expert-link w-inline-block"></a></div><div role="listitem" class="home-expert-collection-item w-dyn-item"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/65970c8cb6ad289e89cae6ee_public.jpeg&quot;)" class="expert-profile-image"></div><div class="expert-profile-info-wrapper home-expert-profile-info-wrapper"><div class="expert-name-wrapper"><h1 class="expert-name-heading">Lionel</h1><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f63_privacy-guard-success---filled(24x24)%401x%201.svg" loading="lazy" alt="" class="expert-badge-icon"/></div><div class="expert-number-wrapper"><div class="expert-number-item"><div class="expert-number-data">7</div><div class="expert-number-description">地點</div></div><div class="expert-number-item"><div class="expert-number-data">21</div><div class="expert-number-description">景點</div></div><div class="expert-number-item"><div class="expert-number-data">3</div><div class="expert-number-description">活動</div></div></div><div class="expert-activities-wrapper"><div class="activities-collection-list-wrapper w-dyn-list"><div role="list" class="activities-collection-list home-expert-activities-collection-list w-dyn-items"><div role="listitem" class="activities-collection-item w-dyn-item"><div>單板滑雪</div></div><div role="listitem" class="activities-collection-item w-dyn-item"><div>藝術</div></div><div role="listitem" class="activities-collection-item w-dyn-item"><div>自駕遊</div></div><div role="listitem" class="activities-collection-item w-dyn-item"><div>歷史</div></div><div role="listitem" class="activities-collection-item w-dyn-item"><div>溫泉</div></div></div></div></div></div><a href="/expert/lionel" class="home-expert-link w-inline-block"></a></div></div></div><a href="/advisors" class="btn btn-primary w-button">查看更多</a></div><div class="w-layout-blockcontainer container hp-container w-container"><div class="hp-sub-wrapper"><h2 class="hp-sub-heading">追蹤最新資訊及優惠</h2><p class="hp-sub-paragraph">立即追蹤最新旅遊產品資訊及推廣優惠</p><a id="navbar-cta-button" href="https://whatsapp.com/channel/0029VaBPZ8cGpLHYCCURp10F" target="_blank" class="btn btn-primary btn-cta btn-subscribe w-inline-block"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/65e6b63063727f0971340f08_hotel-link-whatsapp.svg" loading="lazy" alt=""/><div>立即追蹤</div></a></div></div></section><div class="embed-product-price w-embed w-script"><script>
  340.  
  341. // Function to format number as currency without decimal places
  342. async function formatCurrencyWithConversion(number) {
  343.  const currencyCode = getCookie("caribou_currency"); // Assuming getCookie is a function defined elsewhere
  344.  
  345.  // Mapping of currency codes to their symbols and locale
  346.  const currencyDetails = {
  347.    HKD: { symbol: "HK$", locale: "en-HK" },
  348.    TWD: { symbol: "NT$", locale: "en-TW" },
  349.    SGD: { symbol: "S$", locale: "en-SG" },
  350.    USD: { symbol: "US$", locale: "en-US" },
  351.  };
  352.  
  353.  // Fallback details in case the currency code is not recognized
  354.  const fallbackDetails = { symbol: "$", locale: "en-US" };
  355.  
  356.  // Retrieve the currency details or use fallback
  357.  const { symbol, locale } = currencyDetails[currencyCode] || fallbackDetails;
  358.  
  359.  try {
  360.    // Fetch currency conversion rates from the API
  361.    const response = await fetch(
  362.      "https://advisor.caribou.travel/api/currency-conversion"
  363.    );
  364.    const result = await response.json();
  365.  
  366.    // Get the conversion rate based on the currencyCode
  367.    const conversionRate = result.data[currencyCode.toLowerCase()] || 1; // Default to 1 if no found
  368.  
  369.    // Calculate the converted amount
  370.    const convertedAmount = number * conversionRate;
  371.  
  372.    // Use Intl.NumberFormat to format the converted amount with the correct locale and currency symbol
  373.    const formattedConvertedAmount = new Intl.NumberFormat(locale, {
  374.      minimumFractionDigits: 0,
  375.      maximumFractionDigits: 0,
  376.    }).format(convertedAmount);
  377.  
  378.    // Construct the formatted currency string
  379.    const formattedCurrency = `${symbol}${formattedConvertedAmount}`;
  380.  
  381.    return formattedCurrency;
  382.  } catch (error) {
  383.    console.error("Error fetching currency conversion: ", error);
  384.    // Fallback to formatting without conversion in case of error
  385.    const formattedNumber = new Intl.NumberFormat(locale, {
  386.      minimumFractionDigits: 0,
  387.      maximumFractionDigits: 0,
  388.    }).format(number);
  389.  
  390.    const formattedCurrency = `${symbol}${formattedNumber}`;
  391.    return formattedCurrency;
  392.  }
  393. }
  394.  
  395. async function updateTourProductPrice() {
  396.  // Convert and Format the discounted price
  397.  const tourProductPriceElements = document.querySelectorAll(".tour-product-price")
  398.  
  399.  tourProductPriceElements.forEach(async (element) => {
  400.    const numericValue = parseFloat(element.textContent);
  401.    try {
  402.      const formattedAmount = await formatCurrencyWithConversion(numericValue) + "+";
  403.  
  404.      // Update the value of each "tour-product-price" element
  405.      element.textContent = formattedAmount;  
  406.    } catch (error) {
  407.      console.error('Error formatting currency: ', error)
  408.    }
  409.  });
  410.  
  411.  // Convert and Format the original price
  412.  const tourProductOriginalPriceElements = document.querySelectorAll(".tour-product-original-price")
  413.  
  414.  tourProductOriginalPriceElements.forEach(async (element) => {
  415.    const numericValue = parseFloat(element.textContent)
  416.    try {
  417.      const formattedAmount = await formatCurrencyWithConversion(numericValue) + "+";
  418.  
  419.      // Update the value of each "tour-product-price" element
  420.      element.textContent = formattedAmount;  
  421.    } catch (error) {
  422.      console.error('Error formatting currency: ', error)
  423.    }
  424.  })
  425. }
  426.  
  427.  
  428.  
  429. </script></div><div class="embed-product-hashtags w-embed w-script"><script>
  430.  
  431. // Function to process each advisor-tour-products-block
  432. function processTourProductsBlocks() {
  433.  // Find all blocks with class 'advisor-tour-products-block'
  434.  const blocks = document.querySelectorAll('.advisor-tour-products-block');
  435.  
  436.  blocks.forEach(block => {
  437.      // Extract the value from 'tour-types-text'
  438.      const tourTypesTextElement = block.querySelector('.tour-types-text');
  439.      if (tourTypesTextElement) {
  440.          const tourTypesText = tourTypesTextElement.textContent.trim();
  441.  
  442.          // Split into a comma-separated list
  443.          const tourTypesList = tourTypesText.split(',').map(text => `#${text.trim()}`);
  444.  
  445.          // Find the 'tour-types-wrapper' element
  446.          const tourTypesWrapper = block.querySelector('.tour-types-wrapper');
  447.          if (tourTypesWrapper) {
  448.              // Clear existing content
  449.              tourTypesWrapper.innerHTML = '';
  450.  
  451.              // Append each item from the list
  452.              tourTypesList.forEach(tourType => {
  453.                  const span = document.createElement('span');
  454.                  span.textContent = tourType;
  455.                  tourTypesWrapper.appendChild(span);
  456.              });
  457.          }
  458.      }
  459.  });
  460. }
  461.  
  462.  
  463.  
  464. </script></div><div class="embed-js w-embed w-script"><script>
  465.  
  466. function initHeroSectionSwiper() {
  467.  
  468.  // Hero Section Slider
  469.  const heroSectionSlider = new Swiper(".hero-section-slider-wrapper", {
  470.    loop: true,
  471.    speed: 700,
  472.    slidesPerView: 1,
  473.  
  474.    // Autoplay
  475.    autoplay: {
  476.      delay: 5000,
  477.    },
  478.  
  479.    // Navigation Arrows
  480.    navigation: {
  481.      nextEl: ".hero-slider-next",
  482.      prevEl: ".hero-slider-previous",
  483.    },
  484.  
  485.    // Pagination:
  486.    pagination: {
  487.      el: ".hero-slider-pagination",
  488.      bulletActiveClass: "swiper-bullet-active",
  489.      bulletClass: "swiper-bullet",
  490.      bulletElement: "button",
  491.      clickable: true,
  492.    },
  493.  });
  494.  
  495.  // Function to update heading highlight and key visual based on the current slide
  496.  function updateSliderContent(slideIndex){
  497.    const slides = heroSectionSlider.slides
  498.    const currentSlide = slides[slideIndex]
  499.    const slideName = currentSlide.getAttribute('slide-name')
  500.    const slideImgUrl = currentSlide.getAttribute('slide-img-url')
  501.  
  502.    // Update heading highlight with slide name
  503.    const highlightText = document.querySelector(".hero-section-heading-highlight")
  504.    if (highlightText){
  505.      // Clear existing content
  506.      highlightText.textContent = '';
  507.  
  508.      // Determine the typing speed based on website language
  509.      let typeSpeed = 200; // Default typing speed
  510.  
  511.      // Check website language and adjust typing speed accordingly
  512.      if (websiteLanguage === "zh-Hant-HK") {
  513.        typeSpeed = 200; // Typing speed for Traditional Chinese
  514.      } else if (websiteLanguage === "en") {
  515.        typeSpeed = 100; // Typing speed for English
  516.      }
  517.  
  518.      // Initialize Typed.js for typing animation
  519.      const typed = new Typed(highlightText, {
  520.        strings: [slideName],
  521.        typeSpeed: typeSpeed, // Set typing speed based on language
  522.        showCursor: false, // Hide the cursor
  523.      });
  524.    }
  525.  
  526.    // Create a new key visual element for the slide image
  527.    const keyVisualContainer = document.querySelector('.hero-section-content-right');
  528.    if (keyVisualContainer) {
  529.      // Clear existing content
  530.      keyVisualContainer.innerHTML = '';
  531.  
  532.      // Create a new <img> element
  533.      const newKeyVisual = document.createElement('img');
  534.      newKeyVisual.src = slideImgUrl;
  535.      newKeyVisual.classList.add("hero-section-key-visual")
  536.      newKeyVisual.alt = ''; // Set alt text as needed
  537.  
  538.      // Append the new <img> element to the container
  539.      keyVisualContainer.appendChild(newKeyVisual);
  540.    }
  541.  }
  542.  
  543.  // Initialize
  544.  updateSliderContent(heroSectionSlider.activeIndex);
  545.  
  546.  heroSectionSlider.on("realIndexChange", function() {
  547.    updateSliderContent(heroSectionSlider.activeIndex);
  548.  });
  549. }
  550.  
  551.  
  552.  
  553. function initPromotionSlider() {
  554.  // Promotional Slider
  555.  const promotionalSlider = new Swiper(".hp-promotion-wrapper", {
  556.    loop: true,
  557.    speed: 700,
  558.    slidesPerView: 1,
  559.    spaceBetween: 16,
  560.  
  561.    // Breakpoints
  562.    breakpoints: {
  563.      479: {
  564.        slidesPerView: 2,
  565.      },
  566.      991: {
  567.        slidesPerView: 3,
  568.      },
  569.    },
  570.  
  571.    // Navigation Arrows
  572.    navigation: {
  573.      nextEl: ".hp-promotion-control .hp-swiper-next",
  574.      prevEl: ".hp-promotion-control .hp-swiper-previous",
  575.    },
  576.  
  577.    // Pagination:
  578.    pagination: {
  579.      el: ".hp-promotion-control .hp-swiper-pagination",
  580.      bulletActiveClass: "hp-swiper-bullet-active",
  581.      bulletClass: "hp-swiper-bullet",
  582.      bulletElement: "button",
  583.      clickable: true,
  584.    },
  585.  });
  586. }
  587.  
  588. function updatePromotionLink() {
  589.  // Get all anchor elements within the promotion-wrapper
  590.  const anchorElements = document.querySelectorAll(".hp-promotion-wrapper a");
  591.  
  592.  // Iterate through each anchor element
  593.  anchorElements.forEach((anchor) => {
  594.    // Get the value of the href attribute
  595.    const href = anchor.getAttribute("href");
  596.  
  597.    // Check if the href is not a relative path
  598.    if (href && (href.startsWith('http') || href.startsWith('//'))) {
  599.        // Change the href to open in a new tab
  600.        anchor.setAttribute('target', '_blank');
  601.    }
  602.  });
  603. }
  604.  
  605. $(document).ready(async function () {
  606.  try {
  607.    initHeroSectionSwiper();
  608.    // initPromotionSlider();
  609.    // updatePromotionLink()
  610.  
  611.    // Hnadle the pricing
  612.    await updateTourProductPrice()
  613.  
  614.    // Handle the hashtags
  615.    processTourProductsBlocks();
  616.  
  617.    // Hide theme section for english
  618.    if (websiteLanguage == "en") {
  619.      document.querySelector("#themed-travel-guides").style.display = "none"
  620.    }
  621.    document.querySelector(".loading-wrapper").style.display = "none"
  622.  } catch (error){
  623.    console.error('Error:', error);
  624.    document.querySelector(".loading-wrapper").style.display = "none"
  625.  }
  626.  
  627. });
  628.  
  629.  
  630.  
  631.  
  632.  
  633. </script></div><div class="embed-css w-embed"><style>
  634.  
  635. .hero-slider-previous,
  636. .hero-slider-next {
  637.  top: calc(50% - 24px);
  638. }
  639.  
  640. @media screen and (max-width: 991px) {
  641.  .hero-slider-previous,
  642.  .hero-slider-next {
  643.    top: auto;
  644.    bottom: 8px
  645.  }
  646.  
  647. }
  648.  
  649. .hp-swiper-pagination {
  650.  width: auto !important;
  651. }
  652.  
  653. .swiper-wrapper {
  654.  margin: 0px !important;
  655. }
  656.  
  657.  
  658. /* Loading Spinner */
  659. .loader {
  660.  display: block;
  661.  position: relative;
  662.  height: 32px;
  663.  width: 140px;
  664.  border: 3px solid #fff;
  665.  border-radius: 20px;
  666.  box-sizing: border-box;
  667.  animation: balancing 2s linear infinite alternate;
  668.  transform-origin: center center;
  669. }
  670.  
  671. .loader:before {
  672.  content: '';
  673.  position: absolute;
  674.  left: 0;
  675.  bottom: 0;
  676.  width: 52px;
  677.  height: 26px;
  678.  border-radius: 20px;
  679.  background: #FF911F;
  680.  animation: ballbns 2s linear infinite alternate;
  681. }
  682.  
  683. @keyframes ballbns {
  684.  0% {
  685.      left: 0;
  686.      transform: translateX(0%);
  687.  }
  688.  
  689.  100% {
  690.      left: 100%;
  691.      transform: translateX(-100%);
  692.  }
  693. }
  694.  
  695. @keyframes balancing {
  696.  0% {
  697.      transform: rotate(-25deg);
  698.  }
  699.  
  700.  50% {
  701.      transform: rotate(0deg);
  702.  }
  703.  
  704.  100% {
  705.      transform: rotate(25deg);
  706.  }
  707. }
  708.  
  709.  
  710.  
  711.  
  712. </style></div><section class="section section-footer"><div class="footer-line"></div><div class="footer-wrapper"><div id="footer-item-themePage" class="footer-item"><div class="footer-item-header">主題</div><div class="footer-link-wrapper"><div class="nav-menu-collection-wrapper w-dyn-list"><div role="list" class="nav-menu-collection-list footer-link-collection w-dyn-items"><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="/product-theme/resorts-world-one-cruise" class="footer-link">所有主題</a><div class="nav-menu-hidden-link">/product-themes/all</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="/product-theme/resorts-world-one-cruise" class="footer-link">酒店</a><div class="nav-menu-hidden-link">/product-themes/hotels</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="/product-theme/resorts-world-one-cruise" class="footer-link">郵輪</a><div class="nav-menu-hidden-link">/product-themes/cruises</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="/product-theme/resorts-world-one-cruise" class="footer-link">其他</a><div class="nav-menu-hidden-link">/product-themes/others</div></div></div></div></div></div><div class="footer-item"><div class="footer-item-header">旅遊產品</div><div class="footer-link-wrapper"><div class="nav-menu-collection-wrapper w-dyn-list"><div role="list" class="nav-menu-collection-list footer-link-collection w-dyn-items"><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="/product-theme/resorts-world-one-cruise" class="footer-link">所有產品</a><div class="nav-menu-hidden-link">/tour-products</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="/product-theme/resorts-world-one-cruise" class="footer-link">郵輪假期</a><div class="nav-menu-hidden-link">/tour-products?searchKeyword=郵輪</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="/product-theme/resorts-world-one-cruise" class="footer-link">精選酒店</a><div class="nav-menu-hidden-link">/tour-products?searchKeyword=酒店</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="/product-theme/resorts-world-one-cruise" class="footer-link">深度遊</a><div class="nav-menu-hidden-link">/tour-products?supplier=GLO%20Travel#</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="/product-theme/resorts-world-one-cruise" class="footer-link">包車遊</a><div class="nav-menu-hidden-link">/tour-products?searchKeyword=包車遊</div></div><div role="listitem" class="nav-menu-collection-item w-dyn-item"><a href="/product-theme/resorts-world-one-cruise" class="footer-link">旅遊套票</a><div class="nav-menu-hidden-link">/tour-products?searchKeyword=旅遊套票</div></div></div></div></div></div><div class="footer-item"><div class="footer-item-header">公司</div><div class="footer-link-wrapper"><a href="/about-us" class="footer-link">關於我們</a><a href="/join-us" class="footer-link">成為旅遊顧問</a><a href="/about-us#contact-us" class="footer-link">聯絡我們</a><a href="/terms-and-conditions" class="footer-link">條款及細則</a><a href="/privacy-policy" class="footer-link">私隱政策</a></div></div></div><div class="footer-liccense-wrapper"><div class="footer-license-item-wrapper"><div class="footer-license-item-text-supportive">HK Travel Agent License: </div><div class="footer-license-item-text-primary">Hip Holiday Ltd 353151</div></div><div class="footer-license-item-wrapper"><div class="footer-license-item-text-supportive">SG Travel Agent License:</div><div class="footer-license-item-text-primary">DISCOVER THE WORLD MARKETING PTE LTD TA00687</div></div></div><div class="footer-bottom-wrapper"><div class="footer-copyright">© Caribou Technology Limited. All Rights Reserved.</div><div class="footer-bottom-right-wrapper"><div class="footer-language-currency-wrapper"><a id="footer-btn-language" href="#" class="footer-icon-btn w-inline-block"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f42_globe.svg" loading="lazy" alt="" class="footer-icon-btn-img"/><div class="footer-icon-btn-text footer-btn-text-language">繁體中文</div></a><a id="footer-btn-currency" href="#" class="footer-icon-btn w-inline-block"><div class="footer-icon-btn-img-text">$</div><div class="footer-icon-btn-text footer-btn-text-currency">HKD</div></a></div><div class="footer-social-wrapper"><a href="https://www.facebook.com/enjoycaribou" target="_blank" class="footer-social-link w-inline-block"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/65e6d3a346de8ad47b23af7d_Facebook.svg" loading="lazy" alt="" class="footer-social-link-img"/></a><a href="https://www.instagram.com/enjoycaribou/" target="_blank" class="footer-social-link w-inline-block"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/65e6d3a30d65b5d2855d4ff7_Instagram.svg" loading="lazy" alt="" class="footer-social-link-img"/></a></div></div></div><div class="embed-utility-function w-embed w-script"><script>
  713.  
  714.  
  715. // Function to get a cookie
  716. function getCookie(name) {
  717.    var nameEQ = name + "=";
  718.    var ca = document.cookie.split(';');
  719.    for(var i=0;i < ca.length;i++) {
  720.        var c = ca[i];
  721.        while (c.charAt(0)==' ') c = c.substring(1,c.length);
  722.        if (c.indexOf(nameEQ) == 0) {
  723.            var cookieValue = c.substring(nameEQ.length, c.length);
  724.            return decodeURIComponent(cookieValue);
  725.        }
  726.    }
  727.    return null;
  728. }
  729.  
  730.  
  731.  
  732. </script></div><div class="language-popup-container"><div id="popup-language-currency" class="language-popup-wrapper"><div class="language-popup"><div class="language-popup-header"><a href="#" class="language-popup-close-btn w-inline-block"></a></div><div data-current="Tab 1" data-easing="ease" data-duration-in="300" data-duration-out="100" class="language-popup-tabs w-tabs"><div class="language-popup-tabs-menu w-tab-menu"><a data-w-tab="Tab 1" class="language-popup-tab-link w-inline-block w-tab-link w--current"><div>語言</div></a><a data-w-tab="Tab 2" class="language-popup-tab-link w-inline-block w-tab-link"><div>貨幣</div></a></div><div class="language-popup-tabs-content w-tab-content"><div data-w-tab="Tab 1" class="language-popup-tab-pane w-tab-pane w--tab-active"><div class="language-popup-tab-pane-wrapper"><div class="language-popup-header-text">選擇語言</div><div class="language-popup-locales-wrapper w-locales-list"><div role="list" class="language-popup-locales-list w-locales-items"><div role="listitem" class="language-popup-locale w-locales-item"><a hreflang="zh-HK" href="/" aria-current="page" class="language-popup-link w--current">繁體中文</a></div><div role="listitem" class="language-popup-locale w-locales-item"><a hreflang="en" href="/en" class="language-popup-link">English</a></div></div></div></div></div><div data-w-tab="Tab 2" class="language-popup-tab-pane w-tab-pane"><div class="language-popup-tab-pane-wrapper"><div class="language-popup-header-text">選擇貨幣</div><div class="language-popup-currency-wrapper"><div currency="HKD" class="language-popup-link">港幣 HKD - $</div><div currency="SGD" class="language-popup-link">新加坡幣 SGD - $</div><div currency="USD" class="language-popup-link">美元 USD - $</div></div></div></div></div></div></div></div><div id="popup-language" class="language-popup-wrapper"><div class="language-popup"><div class="language-popup-header"><a href="#" class="language-popup-close-btn w-inline-block"></a></div><div class="language-popup-tab-pane-wrapper"><div class="language-popup-header-text">選擇語言</div><div class="language-popup-locales-wrapper w-locales-list"><div role="list" class="language-popup-locales-list w-locales-items"><div role="listitem" class="language-popup-locale w-locales-item"><a hreflang="zh-HK" href="/" aria-current="page" class="language-popup-link w--current">繁體中文</a></div><div role="listitem" class="language-popup-locale w-locales-item"><a hreflang="en" href="/en" class="language-popup-link">English</a></div></div></div></div></div></div><div id="popup-currency" class="language-popup-wrapper"><div class="language-popup"><div class="language-popup-header"><a href="#" class="language-popup-close-btn w-inline-block"></a></div><div class="language-popup-tab-pane-wrapper"><div class="language-popup-header-text">選擇貨幣</div><div class="language-popup-currency-wrapper"><div currency="HKD" class="language-popup-link">港幣 HKD - $</div><div currency="SGD" class="language-popup-link">新加坡幣 SGD - $</div><div currency="USD" class="language-popup-link">美元 USD - $</div></div></div></div></div><div class="embed-language-currency w-embed w-script"><script>
  733.  
  734. // Function to manage the active class and set cookie
  735. function setActiveCurrency(currencyCode, updateUrl = true ) {
  736.    // Remove active class from all currency elements
  737.    document.querySelectorAll('.language-popup-link').forEach(function(element) {
  738.        element.classList.remove('active');
  739.    });
  740.  
  741.    // Add active class to the selected currency
  742.    document.querySelectorAll(`.language-popup-link[currency="${currencyCode}"]`).forEach(function(element) {
  743.        element.classList.add('active');
  744.    });
  745.  
  746.    // Set the currency in a cookie
  747.    setCookie('caribou_currency',currencyCode, 30); // Expires in 7 days
  748.    
  749.    // Update the footer btn text
  750.    const footerBtnTextCurrency = document.querySelector(".footer-btn-text-currency")
  751.    if (footerBtnTextCurrency) {
  752.        footerBtnTextCurrency.textContent = currencyCode
  753.    }
  754.    
  755.    // Update the mobile menu btn text
  756.    const mobileMenuBtnTextCurrency = document.querySelector(".mobile-menu-btn-text-currency")
  757.    if (mobileMenuBtnTextCurrency) {
  758.        mobileMenuBtnTextCurrency.textContent = currencyCode
  759.    }
  760.  
  761.    // Set the currency parameter in the URL if updateUrl is true
  762.    if (updateUrl) {
  763.        setUrlParameter('curr', currencyCode);
  764.    }
  765. }
  766.  
  767.  
  768. // Function to manage the active language and set cookie
  769. function setActiveLanguage(langCode) {
  770.    // Mapping of hreflang to cookie values
  771.    const langCookieMap = {
  772.        'zh-HK': 'zh-Hant-HK',
  773.        'en': 'en'
  774.    }
  775.  
  776.    // Determine the cookie value using the mapping, default to the langCode if not found
  777.    const cookieValue = langCookieMap[langCode] || langCode
  778.  
  779.    // Set the cookie for 30 days
  780.    setCookie('caribou_language', cookieValue, 30)
  781. }
  782.  
  783.  
  784. // Initialize or set default active currency based on cookie
  785. function initCurrency() {
  786.    const currencyParam = getUrlParameter('curr');
  787.    if (currencyParam) {
  788.        setActiveCurrency(currencyParam);
  789.    } else {
  790.        var savedCurrency = getCookie('caribou_currency');
  791.        if (savedCurrency) {
  792.            setActiveCurrency(savedCurrency, false);
  793.        } else {
  794.            const defaultCurrency = 'HKD'; // Default to HKD if no cookie is found
  795.            setActiveCurrency(defaultCurrency, false);
  796.        }
  797.    }
  798. }
  799.  
  800. // Function to get URL parameters
  801. function getUrlParameter(name) {
  802.    name = name.replace(/[\[\]]/g, '\\$&');
  803.    const urlParams = new URLSearchParams(window.location.search);
  804.    return urlParams.get(name);
  805. }
  806.  
  807. // Function to set URL parameters
  808. function setUrlParameter(param, value) {
  809.    const url = new URL(window.location.href);
  810.    url.searchParams.set(param, value);
  811.    window.history.replaceState(null, '', url.toString());
  812. }
  813.  
  814. // Function to add event listener
  815. function addPopupEventListener() {
  816.    const navToggle = document.querySelector(".nav-lang-dropdown-icon-wrapper")
  817.    const footerBtnLanguage = document.querySelector("#footer-btn-language")
  818.    const footerBtnCurrency = document.querySelector("#footer-btn-currency")
  819.    const mobileMenuBtnLanguage = document.querySelector("#mobile-menu-btn-language")
  820.    const mobileMenuBtnCurrency = document.querySelector("#mobile-menu-btn-currency")
  821.  
  822.    // Show popup for both language and currency when nav toggle has been clicked
  823.    if (navToggle) {
  824.        navToggle.addEventListener("click", function() {
  825.            document.querySelector("#popup-language-currency").style.display = "flex"
  826.        })
  827.    }
  828.    
  829.    // Show popup for language when the footerBtnLanguage has been clicked
  830.    if (footerBtnLanguage) {
  831.        footerBtnLanguage.addEventListener("click", function() {
  832.            document.querySelector("#popup-language").style.display = "flex"
  833.        })
  834.    }
  835.    
  836.    // Show popup for currency when the footerBtnCurrency has been clicked
  837.    if (footerBtnCurrency) {
  838.        footerBtnCurrency.addEventListener("click", function() {
  839.            document.querySelector("#popup-currency").style.display = "flex"
  840.        })
  841.    }
  842.    
  843.    // Show popup for language when the mobileMenuBtnLanguage has been clicked
  844.    if (mobileMenuBtnLanguage) {
  845.        mobileMenuBtnLanguage.addEventListener("click", function() {
  846.            document.querySelector("#popup-language").style.display = "flex"
  847.        })
  848.    }
  849.  
  850.    // Show popup for currency when the mobileMenuBtnCurrency has been clicked
  851.    if (mobileMenuBtnCurrency) {
  852.        mobileMenuBtnCurrency.addEventListener("click", function(){
  853.            document.querySelector("#popup-currency").style.display = "flex"
  854.        })
  855.    }
  856.  
  857. }
  858.  
  859.  
  860. document.addEventListener('DOMContentLoaded', function() {
  861.  
  862.    initCurrency();
  863.    addPopupEventListener()
  864.  
  865.    // Close the popup
  866.    document.querySelectorAll(".language-popup-close-btn").forEach(function(element) {
  867.        element.addEventListener("click", function(){
  868.            // Find the cloest language-popup-wrapper and hide it
  869.            let popupWrapper = this.closest(".language-popup-wrapper")
  870.            if (popupWrapper) {
  871.                popupWrapper.style.display = "none"
  872.            }
  873.        })
  874.    })
  875.  
  876.    // Add click event listeners to all currency elements
  877.    document.querySelectorAll('.language-popup-currency-wrapper .language-popup-link').forEach(function(element) {
  878.        element.addEventListener('click', function() {
  879.            const currentCurrencyCode = getCookie('caribou_currency')
  880.            const targetCurrencyCode = this.getAttribute('currency')
  881.            if (targetCurrencyCode !== currentCurrencyCode) {
  882.                setActiveCurrency(targetCurrencyCode);
  883.  
  884.                // Reload the page to reflect changes
  885.                window.location.reload()
  886.            }
  887.        });
  888.    });
  889.  
  890.    // Add click event listener to all language elements
  891.    document.querySelectorAll(".language-popup-locale .language-popup-link").forEach(function(element) {
  892.        element.addEventListener("click", function() {
  893.            // Get hreflang attribute of the clicked button
  894.            let hreflang = this.getAttribute('hreflang')
  895.            setActiveLanguage(hreflang)
  896.  
  897.        })
  898.    })
  899.    
  900.    // Add click event listeners for the temporary language switcher
  901.    document.querySelectorAll(".nav-locale .nav-menu-link").forEach(function(element) {
  902.        element.addEventListener("click", function() {
  903.            // Get hreflang attribute of the clicked button
  904.            let hreflang = this.getAttribute('hreflang')
  905.            setActiveLanguage(hreflang)
  906.  
  907.        })
  908.    })
  909.  
  910.    // Update footer language text
  911.    // Check for existing 'caribou_language' cookie
  912.    const userLanguage = getCookie('caribou_language')
  913.  
  914.    if (userLanguage) {
  915.        const footerLangMap = {
  916.            "zh-Hant-HK": "繁體中文",
  917.            "en": "English"
  918.        }
  919.  
  920.        const footerLangText = footerLangMap[userLanguage] || '繁體中文'
  921.        const footerBtnTextLang = document.querySelector(".footer-btn-text-language")
  922.        if (footerBtnTextLang) {
  923.            footerBtnTextLang.textContent = footerLangText
  924.        }
  925.        
  926.        const mobileMenuBtnTextLang = document.querySelector(".mobile-menu-btn-text-language")
  927.        if (mobileMenuBtnTextLang) {
  928.            mobileMenuBtnTextLang.textContent = footerLangText
  929.        }
  930.    }
  931.    
  932. });
  933.  
  934.  
  935.  
  936.  
  937.  
  938.  
  939. </script></div></div></section><div class="homepage-body-wrapper"></div><script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=64d1f8d7c8eb554aa7393f33" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script><script src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/js/webflow.af3e27223.js" type="text/javascript"></script><!-- Google Tag Manager (noscript) -->
  940. <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WKGC5B3"
  941. height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  942. <!-- End Google Tag Manager (noscript) -->
  943.  
  944.  
  945.  
  946. <script>
  947.  
  948. $(document).ready(function() {
  949.    $('.language-switch-chi').click(function(e){
  950.        relativePath = location.href.replace(location.origin,'');
  951.  
  952.        if(relativePath == "/en/home") {
  953.            window.location.href = "/";
  954.        } else if (!relativePath.includes("/en/")){
  955.            return
  956.        } else {
  957.            window.location.href = relativePath.replace("/en/", "/");
  958.        }
  959.  
  960.    })
  961.  
  962.    $('.language-switch-eng').click(function(e){
  963.        relativePath = location.href.replace(location.origin,'');
  964.  
  965.        if(relativePath == "/") {
  966.            window.location.href = "/en/home";
  967.        } else if (relativePath.includes("/en/")){
  968.            return
  969.        } else {
  970.            window.location.href = relativePath.replace("/", "/en/");
  971.        }
  972.    });
  973.  
  974.  
  975. });
  976.  
  977.  
  978. </script>
  979.  
  980.  
  981.  
  982. <!-- Render Nav Menu Dropdown -->
  983. <script>
  984. // Select all list items in the nav-menu-collection-list
  985. const listItems = document.querySelectorAll('.nav-menu-collection-list .nav-menu-collection-item');
  986.  
  987. // Loop through each list item
  988. listItems.forEach(item => {
  989.    // Find the nav-menu-link and nav-menu-hidden-link elements within the current list item
  990.    const navLink = item.querySelector('.nav-menu-link');
  991.    const footerLink = item.querySelector('.footer-link')
  992.    const hiddenLink = item.querySelector('.nav-menu-hidden-link');
  993.  
  994.  
  995.    if (hiddenLink) {
  996.        if (navLink) {
  997.            // Set the href attribute of nav-menu-link to the text content of nav-menu-hidden-link
  998.            navLink.setAttribute('href', hiddenLink.textContent.trim());
  999.        } else if (footerLink) {
  1000.            // Set the href attribute of footer-link to the text content of nav-menu-hidden-link
  1001.            footerLink.setAttribute('href', hiddenLink.textContent.trim());
  1002.        }
  1003.  
  1004.        // Remove the nav-menu-hidden-link element from the DOM
  1005.        hiddenLink.remove();
  1006.    }
  1007.  
  1008. });
  1009. </script>
  1010. <!-- End Render Nav Menu Dropdown -->
  1011.  
  1012. <script>
  1013. // Hide theme page menu for english
  1014.  
  1015. const websiteLanguage = window.location.pathname.includes("/en/") || window.location.pathname === "/en" ? "en" : "zh-Hant-HK"
  1016. const footerItemThemePage = document.querySelector("#footer-item-themePage")
  1017. if (websiteLanguage == "en") {
  1018.  if (footerItemThemePage) {
  1019.    footerItemThemePage.style.display = "none"
  1020.  }
  1021. }
  1022.  
  1023.  
  1024.  
  1025.  
  1026. async function checkAndFetchHashID() {
  1027.  // Function to create custom fbc cookie if it does not exists
  1028.  const setCustomFbcCookie = () => {
  1029.    if (
  1030.      !getCookie("_fbc") &&
  1031.      adTracking.fbclid &&
  1032.      adTracking.fbclid != "(no value)"
  1033.    ) {
  1034.      let timestamp = new Date(adTracking.timestamp).getTime() / 1000;
  1035.      let customFbc = `fb.1.${timestamp}.${adTracking.fbclid}`;
  1036.      setCookie("_fbc", customFbc, 90);
  1037.    }
  1038.  };
  1039.  
  1040.  // Function to populate the cookie into hash object if the cookie exists
  1041.  const populateCookieToHashObject = (cookieName, hashKey) => {
  1042.    let cookieValue = getCookie(cookieName);
  1043.    if (cookieValue) hashObject[hashKey] = cookieValue;
  1044.  };
  1045.  
  1046.  // Function to populate fbc & fbp into the forms
  1047.  const populateFormFields = (formPrefix) => {
  1048.    document.getElementById(`${formPrefix}-hash_id`).value =getCookie("caribou_hashID");
  1049.    if (getCookie("_fbc"))
  1050.      document.getElementById(`${formPrefix}-fbc`).value = getCookie("_fbc");
  1051.    if (getCookie("_fbp"))
  1052.      document.getElementById(`${formPrefix}-fbp`).value = getCookie("_fbp");
  1053.  };
  1054.  
  1055.  // Function to get theme page id
  1056.  const getThemePageTrackingId = () => {
  1057.    const firstHotelLink = document.querySelector(".hotel-link");
  1058.    if (firstHotelLink) {
  1059.      const regex = /caribou-theme-\d+/;
  1060.      const match = firstHotelLink.href.match(regex);
  1061.      if (match) {
  1062.        return match[0];
  1063.      }
  1064.    }
  1065.    return null;
  1066.  };
  1067.  
  1068.  // Function to replace theme page id tracking with hash id
  1069.  const updateHotelLinksWithHashId = () => {
  1070.    const hashId = getCookie("caribou_hashID");
  1071.    if (!hashId || hashId == "(no_hashID)") {
  1072.      console.error("Hash ID not found in cookies");
  1073.      return;
  1074.    }
  1075.  
  1076.    const regex = /caribou-theme-\d+/;
  1077.    const hotelLinks = document.querySelectorAll(".hotel-link");
  1078.    hotelLinks.forEach((link) => {
  1079.      link.href = link.href.replace(regex, `${hashId}`);
  1080.    });
  1081.  };
  1082.  
  1083.  // Check if the 'caribou_hashID' cookie exists. if not, fetch it
  1084.  if (adTracking && Object.keys(adTracking).length > 0) {
  1085.    // Proceed with hash request only if adTracking has data
  1086.    if (
  1087.      !getCookie("caribou_hashID") ||
  1088.      getCookie("caribou_hashID") == "(no_hashID)"
  1089.    ) {
  1090.      // Init hashObject
  1091.      var hashObject = {};
  1092.  
  1093.      // Add client_id into hash object
  1094.      if (getClientId() != "") {
  1095.        hashObject.client_id = getClientId();
  1096.      }
  1097.  
  1098.      // Add session_id into hash object
  1099.      if (getSessionId() != "") {
  1100.        hashObject.session_id = getSessionId();
  1101.      }
  1102.  
  1103.      // Add adTracking into the hash object
  1104.      for (let key in adTracking) {
  1105.        if (adTracking[key] && adTracking[key] != "(no value)") {
  1106.          hashObject[key] = adTracking[key];
  1107.        }
  1108.      }
  1109.  
  1110.      setCustomFbcCookie();
  1111.  
  1112.      populateCookieToHashObject("_fbc", "fbc");
  1113.      populateCookieToHashObject("_fbp", "fbp");
  1114.  
  1115.  
  1116.      // Retrieve theme page id for hotel links tracking
  1117.      if (window.location.href.includes("/product-theme/")) {
  1118.        const themePageTrackingId = getThemePageTrackingId();
  1119.        if (themePageTrackingId) {
  1120.          hashObject.themePage_TrackingId = themePageTrackingId;
  1121.        }
  1122.      }
  1123.  
  1124.      // Only fetch hash if adTracking has relevant data
  1125.      if (Object.keys(hashObject).length > 0) {
  1126.        await fetchHashId(hashObject);
  1127.      }
  1128.    }
  1129.  }
  1130.  
  1131.  if (getCookie("caribou_hashID") != "(no_hashID)") {
  1132.    // Populate the hash id, fbc & fbp into sales funnel tracking form
  1133.    if (window.location.href.includes("/tour-products/")) {
  1134.      populateFormFields("funnel-form");
  1135.    }
  1136.  
  1137.    // Populate the hash id, fbc and fbp into product search form
  1138.    if (
  1139.      window.location.href.includes("/tour-products") &&
  1140.      !window.location.href.includes("/tour-products/")
  1141.    ) {
  1142.      populateFormFields("product-search");
  1143.    }
  1144.  
  1145.    // Replace hotels link with hash id for theme page
  1146.    if (window.location.href.includes('/product-theme/')){
  1147.      const themePageTrackingId = getThemePageTrackingId()
  1148.      if (themePageTrackingId) {
  1149.        updateHotelLinksWithHashId(themePageTrackingId)
  1150.      }
  1151.    }
  1152.  }
  1153. }
  1154.  
  1155.  
  1156.  
  1157.  
  1158.  
  1159. $(document).ready(async function () {
  1160.  
  1161.  if (!window.location.href.includes("/product-theme/") && !window.location.href.includes("/tour-products/")) {
  1162.    await checkAndFetchHashID();
  1163.  }
  1164.  
  1165.  if (
  1166.    !window.location.href.includes("/tour-products") &&
  1167.    !window.location.href.includes("/product-theme/")
  1168.  ) {
  1169.    triggerCustomDataReady();
  1170.  }
  1171. });
  1172.  
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178. </script>
  1179.  
  1180. <script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
  1181.  
  1182. <!-- Start seamless-pagination custom code -->
  1183.  
  1184. <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.pjax/2.0.1/jquery.pjax.min.js"></script>
  1185. <script>
  1186.  var containerSelector = '#seamless-replace';
  1187.  $(document).pjax(
  1188.    '.w-pagination-wrapper a',
  1189.    containerSelector,
  1190.    {
  1191.      container: containerSelector,
  1192.      fragment: containerSelector,
  1193.      scrollTo: false,
  1194.      timeout: 2500,
  1195.    }
  1196.  );
  1197.    // These 3 lines should reinitialize interactions
  1198.  $(document).on('pjax:end', function() {
  1199.    Webflow.require('ix2').init();
  1200.  });
  1201. </script>
  1202.  
  1203. <!-- End seamless-pagination custom code --></body></html>
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda