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: Thu May 30 2024 09:09:41 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.9b15a521b.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. fbq('track', 'PageView');
  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 = name + "=" + (value || "") + expires + "; path=/";
  41.  }
  42.  
  43.  
  44.  var urlParams = new URLSearchParams(window.location.search);
  45.  var keys = ['adUID', 'campaignid', 'adgroupid', 'device', 'creative', 'keyword', 'gclid'];
  46.  var hasParams = keys.some(key => urlParams.has(key));
  47.  
  48.  if (hasParams) {
  49.    var adTracking = {
  50.      adUID: urlParams.get('adUID') || "(no value)",
  51.      campaignid: urlParams.get('campaignid') || "(no value)",
  52.      adgroupid: urlParams.get('adgroupid') || "(no value)",
  53.      device: urlParams.get('device') || "(no value)",
  54.      creative: urlParams.get('creative') || "(no value)",
  55.      keyword: urlParams.get('keyword') || "(no value)",
  56.      gclid: urlParams.get('gclid') || "(no value)",
  57.      timestamp: new Date().toISOString()
  58.    };
  59.  
  60.    setCookie('adTracking', encodeURIComponent(JSON.stringify(adTracking)), 30); // Store in a cookie for 30 days
  61.  }
  62.  
  63.  
  64. </script>
  65. <!-- End Custom Google Ad Tracking -->
  66.  
  67. <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
  68. <link
  69.  rel="stylesheet"
  70.  href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css"
  71. />
  72. <script src="https://cdnjs.cloudflare.com/ajax/libs/typed.js/2.1.0/typed.umd.js"></script>
  73.  
  74. <style>
  75.  
  76. .homepage-body-wrapper {
  77. display: none;
  78. }
  79.  
  80.  
  81. </style>
  82.  
  83. <script>
  84.  
  85. async function checkLocationAndRedirect() {
  86.    var currentPath = window.location.pathname;
  87.  
  88.    if (currentPath === "/") {
  89.        try {
  90.            // Check for existing 'caribou_language' cookie
  91.            const userLanguage = getCookie('caribou_language')
  92.  
  93.            if (userLanguage) {
  94.                // If cookie exists, redirect or display content accordingly
  95.                var languagePathMap = {
  96.                    'zh-Hant-HK': "/",
  97.                    'en': '/en'
  98.                }
  99.                var targetPathFromCookie = languagePathMap[userLanguage] || null
  100.  
  101.                if (targetPathFromCookie && currentPath !== targetPathFromCookie) {
  102.                    window.location.pathname = targetPathFromCookie;
  103.                    return; // Early return to prevent further execution
  104.                } else {
  105.                    // Show body when no redirect is needed
  106.                    document.querySelector(".homepage-body-wrapper").style.display = "block"
  107.                }
  108.            } else {
  109.                // Call API to checking language when cookie does not exist
  110.                const response = await fetch('https://advisor.caribou.travel/api/geo');
  111.                const data = await response.json();
  112.                var countryCode = data.data.country
  113.                var urlMap = {
  114.                    'HK': '/', // Hong Kong
  115.                    'SG': '/en', // Singapore
  116.                    'TW': '/', // Taiwan
  117.                };
  118.  
  119.                // Set cookie if not already set
  120.                const languageToSet = countryCode === 'HK' ? 'zh-Hant-HK' : 'en'
  121.                document.cookie = `caribou_language=${encodeURIComponent(languageToSet)}; path=/;`
  122.                
  123.                // Check if redirect is needed
  124.                var targetPath = urlMap[countryCode] || '/en'; // default to english if countryCode not in urlMap
  125.                if (currentPath !== targetPath){
  126.                    window.location.pathname = targetPath
  127.                } else {
  128.                    // No redirect is needed; show the body
  129.                    document.querySelector(".homepage-body-wrapper").style.display = "block"
  130.                }
  131.            }
  132.  
  133.        } catch (error) {
  134.            console.error('Error fetching country code:', error);
  135.            // API Error
  136.            document.querySelector(".homepage-body-wrapper").style.display = "block";
  137.        }
  138.    } else {
  139.        // Not in root directory
  140.        document.querySelector(".homepage-body-wrapper").style.display = "block";
  141.    }
  142. }
  143.  
  144.  
  145. window.onload = function() {
  146.  checkLocationAndRedirect();
  147. }
  148.  
  149.  
  150.  
  151.  
  152. </script>
  153. </head><body class="body"><div class="loading-wrapper"><div class="w-embed"><span class="loader"></span></div><div class="w-embed"><style>
  154. /* Loading Spinner */
  155. .loader {
  156.    display: block;
  157.    position: relative;
  158.    height: 32px;
  159.    width: 140px;
  160.    border: 3px solid #fff;
  161.    border-radius: 20px;
  162.    box-sizing: border-box;
  163.    animation: balancing 2s linear infinite alternate;
  164.    transform-origin: center center;
  165. }
  166.  
  167. .loader:before {
  168.    content: '';
  169.    position: absolute;
  170.    left: 0;
  171.    bottom: 0;
  172.    width: 52px;
  173.    height: 26px;
  174.    border-radius: 20px;
  175.    background: #FF911F;
  176.    animation: ballbns 2s linear infinite alternate;
  177. }
  178.  
  179. @keyframes ballbns {
  180.    0% {
  181.        left: 0;
  182.        transform: translateX(0%);
  183.    }
  184.  
  185.    100% {
  186.        left: 100%;
  187.        transform: translateX(-100%);
  188.    }
  189. }
  190.  
  191. @keyframes balancing {
  192.    0% {
  193.        transform: rotate(-25deg);
  194.    }
  195.  
  196.    50% {
  197.        transform: rotate(0deg);
  198.    }
  199.  
  200.    100% {
  201.        transform: rotate(25deg);
  202.    }
  203. }
  204.  
  205.  
  206. </style></div></div><div class="embed-js-loading-spinner w-embed w-script"><script>
  207.  
  208. // Show the loading wrapper by default
  209. document.querySelector(".loading-wrapper").style.display = "flex"
  210.  
  211. </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?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></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">
  212.  <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"/>
  213.  <path d="M2 12H22" stroke="#101820" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  214.  <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"/>
  215. </svg></div><div class="locale-css w-embed"><style>
  216.  
  217. .nav-lang-dropdown-icon-wrapper:hover .nav-lang-dropdown-icon path {
  218. stroke:white;
  219. }
  220.  
  221. </style></div></a><a id="navbar-cta-button" href="/join-us" class="btn btn-primary btn-cta w-inline-block"><div>成為旅遊顧問</div></a></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/255" class="tp-listing-item w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/664c5db6585846fdc8b00f47_Tokushima%2C%20Japan.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">公主郵輪|鑽石公主號 - 10晚日本夏日慶典</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">8898</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/172" class="tp-listing-item w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/660d1a6bb5772ad4109d4176_Spain.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 晚意大利、法國、西班牙</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">2798</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 晚 航遊日本【2025元旦航程】</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">3279</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/187" class="tp-listing-item w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/663e6624375ac03d083d4418_Famous%20Tourist%20Attraction%20-%20Golden%20Bridge%20at%20the%20Top%20of%20the%20Ba%20Na%20Hills%2C%20Vietnam.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">皇家加勒比國際遊輪|海洋光譜號 - 4晚香港、越南(真美)之旅</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">2439</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/royal-caribbean-spectrum-of-the-seas-hong-kong-cruises" class="theme-page-link-wrapper w-inline-block"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/662fd7fa31818e63e6456859_OG-template%20%20(9).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/662fd7fa31818e63e6456859_OG-template%20%20(9)-p-500.jpg 500w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/662fd7fa31818e63e6456859_OG-template%20%20(9)-p-800.jpg 800w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/662fd7fa31818e63e6456859_OG-template%20%20(9)-p-1080.jpg 1080w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/662fd7fa31818e63e6456859_OG-template%20%20(9).jpg 1200w" class="theme-page-link-img"/><div class="theme-page-content-wrapper"><h3 class="theme-page-title">【香港郵輪】海洋光譜號12月正式啟航</h3></div></a></div><div role="listitem" class="hp-theme-item w-dyn-item"><a href="/product-theme/2024-new-cruises" class="theme-page-link-wrapper w-inline-block"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/662f911977781c63f5ccefaf_OG-template%20%20(2).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/662f911977781c63f5ccefaf_OG-template%20%20(2)-p-500.jpg 500w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/662f911977781c63f5ccefaf_OG-template%20%20(2)-p-800.jpg 800w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/662f911977781c63f5ccefaf_OG-template%20%20(2)-p-1080.jpg 1080w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/662f911977781c63f5ccefaf_OG-template%20%20(2).jpg 1200w" class="theme-page-link-img"/><div class="theme-page-content-wrapper"><h3 class="theme-page-title"> 【2024新郵輪推介】 全球最大旗艦郵輪 海上度假新體驗</h3></div></a></div><div role="listitem" class="hp-theme-item w-dyn-item"><a href="/product-theme/japan-hoshinoya-tokyo" class="theme-page-link-wrapper w-inline-block"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6630a1d4b8cafa0c29c5a83a_Caribou-OG-template.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/6630a1d4b8cafa0c29c5a83a_Caribou-OG-template-p-500.jpg 500w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6630a1d4b8cafa0c29c5a83a_Caribou-OG-template-p-800.jpg 800w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6630a1d4b8cafa0c29c5a83a_Caribou-OG-template-p-1080.jpg 1080w, https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6630a1d4b8cafa0c29c5a83a_Caribou-OG-template.jpg 1200w" class="theme-page-link-img"/><div class="theme-page-content-wrapper"><h3 class="theme-page-title">5 大星野集團東京住宿推介</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>
  222.  
  223. // Function to format number as currency without decimal places
  224. async function formatCurrencyWithConversion(number) {
  225.  const currencyCode = getCookie("caribou_currency"); // Assuming getCookie is a function defined elsewhere
  226.  
  227.  // Mapping of currency codes to their symbols and locale
  228.  const currencyDetails = {
  229.    HKD: { symbol: "HK$", locale: "en-HK" },
  230.    TWD: { symbol: "NT$", locale: "en-TW" },
  231.    SGD: { symbol: "S$", locale: "en-SG" },
  232.    USD: { symbol: "US$", locale: "en-US" },
  233.  };
  234.  
  235.  // Fallback details in case the currency code is not recognized
  236.  const fallbackDetails = { symbol: "$", locale: "en-US" };
  237.  
  238.  // Retrieve the currency details or use fallback
  239.  const { symbol, locale } = currencyDetails[currencyCode] || fallbackDetails;
  240.  
  241.  try {
  242.    // Fetch currency conversion rates from the API
  243.    const response = await fetch(
  244.      "https://advisor.caribou.travel/api/currency-conversion"
  245.    );
  246.    const result = await response.json();
  247.  
  248.    // Get the conversion rate based on the currencyCode
  249.    const conversionRate = result.data[currencyCode.toLowerCase()] || 1; // Default to 1 if no found
  250.  
  251.    // Calculate the converted amount
  252.    const convertedAmount = number * conversionRate;
  253.  
  254.    // Use Intl.NumberFormat to format the converted amount with the correct locale and currency symbol
  255.    const formattedConvertedAmount = new Intl.NumberFormat(locale, {
  256.      minimumFractionDigits: 0,
  257.      maximumFractionDigits: 0,
  258.    }).format(convertedAmount);
  259.  
  260.    // Construct the formatted currency string
  261.    const formattedCurrency = `${symbol}${formattedConvertedAmount}`;
  262.  
  263.    return formattedCurrency;
  264.  } catch (error) {
  265.    console.error("Error fetching currency conversion: ", error);
  266.    // Fallback to formatting without conversion in case of error
  267.    const formattedNumber = new Intl.NumberFormat(locale, {
  268.      minimumFractionDigits: 0,
  269.      maximumFractionDigits: 0,
  270.    }).format(number);
  271.  
  272.    const formattedCurrency = `${symbol}${formattedNumber}`;
  273.    return formattedCurrency;
  274.  }
  275. }
  276.  
  277. async function updateTourProductPrice() {
  278.  // Convert and Format the discounted price
  279.  const tourProductPriceElements = document.querySelectorAll(".tour-product-price")
  280.  
  281.  tourProductPriceElements.forEach(async (element) => {
  282.    const numericValue = parseFloat(element.textContent);
  283.    try {
  284.      const formattedAmount = await formatCurrencyWithConversion(numericValue) + "+";
  285.  
  286.      // Update the value of each "tour-product-price" element
  287.      element.textContent = formattedAmount;  
  288.    } catch (error) {
  289.      console.error('Error formatting currency: ', error)
  290.    }
  291.  });
  292.  
  293.  // Convert and Format the original price
  294.  const tourProductOriginalPriceElements = document.querySelectorAll(".tour-product-original-price")
  295.  
  296.  tourProductOriginalPriceElements.forEach(async (element) => {
  297.    const numericValue = parseFloat(element.textContent)
  298.    try {
  299.      const formattedAmount = await formatCurrencyWithConversion(numericValue) + "+";
  300.  
  301.      // Update the value of each "tour-product-price" element
  302.      element.textContent = formattedAmount;  
  303.    } catch (error) {
  304.      console.error('Error formatting currency: ', error)
  305.    }
  306.  })
  307. }
  308.  
  309.  
  310.  
  311. </script></div><div class="embed-product-hashtags w-embed w-script"><script>
  312.  
  313. // Function to process each advisor-tour-products-block
  314. function processTourProductsBlocks() {
  315.  // Find all blocks with class 'advisor-tour-products-block'
  316.  const blocks = document.querySelectorAll('.advisor-tour-products-block');
  317.  
  318.  blocks.forEach(block => {
  319.      // Extract the value from 'tour-types-text'
  320.      const tourTypesTextElement = block.querySelector('.tour-types-text');
  321.      if (tourTypesTextElement) {
  322.          const tourTypesText = tourTypesTextElement.textContent.trim();
  323.  
  324.          // Split into a comma-separated list
  325.          const tourTypesList = tourTypesText.split(',').map(text => `#${text.trim()}`);
  326.  
  327.          // Find the 'tour-types-wrapper' element
  328.          const tourTypesWrapper = block.querySelector('.tour-types-wrapper');
  329.          if (tourTypesWrapper) {
  330.              // Clear existing content
  331.              tourTypesWrapper.innerHTML = '';
  332.  
  333.              // Append each item from the list
  334.              tourTypesList.forEach(tourType => {
  335.                  const span = document.createElement('span');
  336.                  span.textContent = tourType;
  337.                  tourTypesWrapper.appendChild(span);
  338.              });
  339.          }
  340.      }
  341.  });
  342. }
  343.  
  344.  
  345.  
  346. </script></div><div class="embed-js w-embed w-script"><script>
  347.  
  348. function initHeroSectionSwiper() {
  349.  
  350.  // Hero Section Slider
  351.  const heroSectionSlider = new Swiper(".hero-section-slider-wrapper", {
  352.    loop: true,
  353.    speed: 700,
  354.    slidesPerView: 1,
  355.  
  356.    // Autoplay
  357.    autoplay: {
  358.      delay: 5000,
  359.    },
  360.  
  361.    // Navigation Arrows
  362.    navigation: {
  363.      nextEl: ".hero-slider-next",
  364.      prevEl: ".hero-slider-previous",
  365.    },
  366.  
  367.    // Pagination:
  368.    pagination: {
  369.      el: ".hero-slider-pagination",
  370.      bulletActiveClass: "swiper-bullet-active",
  371.      bulletClass: "swiper-bullet",
  372.      bulletElement: "button",
  373.      clickable: true,
  374.    },
  375.  });
  376.  
  377.  // Function to update heading highlight and key visual based on the current slide
  378.  function updateSliderContent(slideIndex){
  379.    const slides = heroSectionSlider.slides
  380.    const currentSlide = slides[slideIndex]
  381.    const slideName = currentSlide.getAttribute('slide-name')
  382.    const slideImgUrl = currentSlide.getAttribute('slide-img-url')
  383.  
  384.    // Update heading highlight with slide name
  385.    const highlightText = document.querySelector(".hero-section-heading-highlight")
  386.    if (highlightText){
  387.      // Clear existing content
  388.      highlightText.textContent = '';
  389.  
  390.      // Determine the typing speed based on website language
  391.      let typeSpeed = 200; // Default typing speed
  392.  
  393.      // Check website language and adjust typing speed accordingly
  394.      if (websiteLanguage === "zh-Hant-HK") {
  395.        typeSpeed = 200; // Typing speed for Traditional Chinese
  396.      } else if (websiteLanguage === "en") {
  397.        typeSpeed = 100; // Typing speed for English
  398.      }
  399.  
  400.      // Initialize Typed.js for typing animation
  401.      const typed = new Typed(highlightText, {
  402.        strings: [slideName],
  403.        typeSpeed: typeSpeed, // Set typing speed based on language
  404.        showCursor: false, // Hide the cursor
  405.      });
  406.    }
  407.  
  408.    // Create a new key visual element for the slide image
  409.    const keyVisualContainer = document.querySelector('.hero-section-content-right');
  410.    if (keyVisualContainer) {
  411.      // Clear existing content
  412.      keyVisualContainer.innerHTML = '';
  413.  
  414.      // Create a new <img> element
  415.      const newKeyVisual = document.createElement('img');
  416.      newKeyVisual.src = slideImgUrl;
  417.      newKeyVisual.classList.add("hero-section-key-visual")
  418.      newKeyVisual.alt = ''; // Set alt text as needed
  419.  
  420.      // Append the new <img> element to the container
  421.      keyVisualContainer.appendChild(newKeyVisual);
  422.    }
  423.  }
  424.  
  425.  // Initialize
  426.  updateSliderContent(heroSectionSlider.activeIndex);
  427.  
  428.  heroSectionSlider.on("realIndexChange", function() {
  429.    updateSliderContent(heroSectionSlider.activeIndex);
  430.  });
  431. }
  432.  
  433.  
  434.  
  435. function initPromotionSlider() {
  436.  // Promotional Slider
  437.  const promotionalSlider = new Swiper(".hp-promotion-wrapper", {
  438.    loop: true,
  439.    speed: 700,
  440.    slidesPerView: 1,
  441.    spaceBetween: 16,
  442.  
  443.    // Breakpoints
  444.    breakpoints: {
  445.      479: {
  446.        slidesPerView: 2,
  447.      },
  448.      991: {
  449.        slidesPerView: 3,
  450.      },
  451.    },
  452.  
  453.    // Navigation Arrows
  454.    navigation: {
  455.      nextEl: ".hp-promotion-control .hp-swiper-next",
  456.      prevEl: ".hp-promotion-control .hp-swiper-previous",
  457.    },
  458.  
  459.    // Pagination:
  460.    pagination: {
  461.      el: ".hp-promotion-control .hp-swiper-pagination",
  462.      bulletActiveClass: "hp-swiper-bullet-active",
  463.      bulletClass: "hp-swiper-bullet",
  464.      bulletElement: "button",
  465.      clickable: true,
  466.    },
  467.  });
  468. }
  469.  
  470. function updatePromotionLink() {
  471.  // Get all anchor elements within the promotion-wrapper
  472.  const anchorElements = document.querySelectorAll(".hp-promotion-wrapper a");
  473.  
  474.  // Iterate through each anchor element
  475.  anchorElements.forEach((anchor) => {
  476.    // Get the value of the href attribute
  477.    const href = anchor.getAttribute("href");
  478.  
  479.    // Check if the href is not a relative path
  480.    if (href && (href.startsWith('http') || href.startsWith('//'))) {
  481.        // Change the href to open in a new tab
  482.        anchor.setAttribute('target', '_blank');
  483.    }
  484.  });
  485. }
  486.  
  487. $(document).ready(async function () {
  488.  try {
  489.    initHeroSectionSwiper();
  490.    // initPromotionSlider();
  491.    // updatePromotionLink()
  492.  
  493.    // Hnadle the pricing
  494.    await updateTourProductPrice()
  495.  
  496.    // Handle the hashtags
  497.    processTourProductsBlocks();
  498.  
  499.    // Hide theme section for english
  500.    if (websiteLanguage == "en") {
  501.      document.querySelector("#themed-travel-guides").style.display = "none"
  502.    }
  503.    document.querySelector(".loading-wrapper").style.display = "none"
  504.  } catch (error){
  505.    console.error('Error:', error);
  506.    document.querySelector(".loading-wrapper").style.display = "none"
  507.  }
  508.  
  509. });
  510.  
  511.  
  512.  
  513.  
  514.  
  515. </script></div><div class="embed-css w-embed"><style>
  516.  
  517. .hero-slider-previous,
  518. .hero-slider-next {
  519.  top: calc(50% - 24px);
  520. }
  521.  
  522. @media screen and (max-width: 991px) {
  523.  .hero-slider-previous,
  524.  .hero-slider-next {
  525.    top: auto;
  526.    bottom: 8px
  527.  }
  528.  
  529. }
  530.  
  531. .hp-swiper-pagination {
  532.  width: auto !important;
  533. }
  534.  
  535. .swiper-wrapper {
  536.  margin: 0px !important;
  537. }
  538.  
  539.  
  540. /* Loading Spinner */
  541. .loader {
  542.  display: block;
  543.  position: relative;
  544.  height: 32px;
  545.  width: 140px;
  546.  border: 3px solid #fff;
  547.  border-radius: 20px;
  548.  box-sizing: border-box;
  549.  animation: balancing 2s linear infinite alternate;
  550.  transform-origin: center center;
  551. }
  552.  
  553. .loader:before {
  554.  content: '';
  555.  position: absolute;
  556.  left: 0;
  557.  bottom: 0;
  558.  width: 52px;
  559.  height: 26px;
  560.  border-radius: 20px;
  561.  background: #FF911F;
  562.  animation: ballbns 2s linear infinite alternate;
  563. }
  564.  
  565. @keyframes ballbns {
  566.  0% {
  567.      left: 0;
  568.      transform: translateX(0%);
  569.  }
  570.  
  571.  100% {
  572.      left: 100%;
  573.      transform: translateX(-100%);
  574.  }
  575. }
  576.  
  577. @keyframes balancing {
  578.  0% {
  579.      transform: rotate(-25deg);
  580.  }
  581.  
  582.  50% {
  583.      transform: rotate(0deg);
  584.  }
  585.  
  586.  100% {
  587.      transform: rotate(25deg);
  588.  }
  589. }
  590.  
  591.  
  592.  
  593.  
  594. </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?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></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-bottom-wrapper"><div class="footer-copyright">© Caribou Technology Limited. All Rights Reserved. 旅行代理商牌照: Hip Holiday Ltd #353151</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>
  595.  
  596. // Function to set a cookie
  597. function setCookie(name, value, days) {
  598.    var expires = "";
  599.    if (days) {
  600.        var date = new Date();
  601.        date.setTime(date.getTime() + (days*24*60*60*1000));
  602.        expires = "; expires=" + date.toUTCString();
  603.    }
  604.    document.cookie = name + "=" + (value || "")  + expires + "; path=/";
  605. }
  606.  
  607.  
  608. // Function to get a cookie
  609. function getCookie(name) {
  610.    var nameEQ = name + "=";
  611.    var ca = document.cookie.split(';');
  612.    for(var i=0;i < ca.length;i++) {
  613.        var c = ca[i];
  614.        while (c.charAt(0)==' ') c = c.substring(1,c.length);
  615.        if (c.indexOf(nameEQ) == 0) {
  616.            var cookieValue = c.substring(nameEQ.length, c.length);
  617.            return decodeURIComponent(cookieValue);
  618.        }
  619.    }
  620.    return null;
  621. }
  622.  
  623.  
  624.  
  625. </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>
  626.  
  627. // Function to manage the active class and set cookie
  628. function setActiveCurrency(currencyCode, updateUrl = true ) {
  629.    // Remove active class from all currency elements
  630.    document.querySelectorAll('.language-popup-link').forEach(function(element) {
  631.        element.classList.remove('active');
  632.    });
  633.  
  634.    // Add active class to the selected currency
  635.    document.querySelectorAll(`.language-popup-link[currency="${currencyCode}"]`).forEach(function(element) {
  636.        element.classList.add('active');
  637.    });
  638.  
  639.    // Set the currency in a cookie
  640.    setCookie('caribou_currency',currencyCode, 30); // Expires in 7 days
  641.    
  642.    // Update the footer btn text
  643.    const footerBtnTextCurrency = document.querySelector(".footer-btn-text-currency")
  644.    if (footerBtnTextCurrency) {
  645.        footerBtnTextCurrency.textContent = currencyCode
  646.    }
  647.  
  648.    // Set the currency parameter in the URL if updateUrl is true
  649.    if (updateUrl) {
  650.        setUrlParameter('curr', currencyCode);
  651.    }
  652. }
  653.  
  654.  
  655. // Function to manage the active language and set cookie
  656. function setActiveLanguage(langCode) {
  657.    // Mapping of hreflang to cookie values
  658.    const langCookieMap = {
  659.        'zh-HK': 'zh-Hant-HK',
  660.        'en': 'en'
  661.    }
  662.  
  663.    // Determine the cookie value using the mapping, default to the langCode if not found
  664.    const cookieValue = langCookieMap[langCode] || langCode
  665.  
  666.    // Set the cookie for 30 days
  667.    setCookie('caribou_language', cookieValue, 30)
  668. }
  669.  
  670.  
  671. // Initialize or set default active currency based on cookie
  672. function initCurrency() {
  673.    const currencyParam = getUrlParameter('curr');
  674.    if (currencyParam) {
  675.        setActiveCurrency(currencyParam);
  676.    } else {
  677.        var savedCurrency = getCookie('caribou_currency');
  678.        if (savedCurrency) {
  679.            setActiveCurrency(savedCurrency, false);
  680.        } else {
  681.            const defaultCurrency = 'HKD'; // Default to HKD if no cookie is found
  682.            setActiveCurrency(defaultCurrency, false);
  683.        }
  684.    }
  685. }
  686.  
  687. // Function to get URL parameters
  688. function getUrlParameter(name) {
  689.    name = name.replace(/[\[\]]/g, '\\$&');
  690.    const urlParams = new URLSearchParams(window.location.search);
  691.    return urlParams.get(name);
  692. }
  693.  
  694. // Function to set URL parameters
  695. function setUrlParameter(param, value) {
  696.    const url = new URL(window.location.href);
  697.    url.searchParams.set(param, value);
  698.    window.history.replaceState(null, '', url.toString());
  699. }
  700.  
  701. // Function to add event listener
  702. function addPopupEventListener() {
  703.    const navToggle = document.querySelector(".nav-lang-dropdown-icon-wrapper")
  704.    const footerBtnLanguage = document.querySelector("#footer-btn-language")
  705.    const footerBtnCurrency = document.querySelector("#footer-btn-currency")
  706.  
  707.    // Show popup for both language and currency when nav toggle has been clicked
  708.    if (navToggle) {
  709.        navToggle.addEventListener("click", function() {
  710.            document.querySelector("#popup-language-currency").style.display = "flex"
  711.        })
  712.    }
  713.    
  714.    // Show popup for language when the footerBtnLanguage has been clicked
  715.    if (footerBtnLanguage) {
  716.        footerBtnLanguage.addEventListener("click", function() {
  717.            document.querySelector("#popup-language").style.display = "flex"
  718.        })
  719.    }
  720.    
  721.  
  722.    // Show popup for currency when the footerBtnCurrency has been clicked
  723.    if (footerBtnCurrency) {
  724.        footerBtnCurrency.addEventListener("click", function() {
  725.            document.querySelector("#popup-currency").style.display = "flex"
  726.        })
  727.    }
  728.  
  729. }
  730.  
  731.  
  732. document.addEventListener('DOMContentLoaded', function() {
  733.  
  734.    initCurrency();
  735.    addPopupEventListener()
  736.  
  737.    // Close the popup
  738.    document.querySelectorAll(".language-popup-close-btn").forEach(function(element) {
  739.        element.addEventListener("click", function(){
  740.            // Find the cloest language-popup-wrapper and hide it
  741.            let popupWrapper = this.closest(".language-popup-wrapper")
  742.            if (popupWrapper) {
  743.                popupWrapper.style.display = "none"
  744.            }
  745.        })
  746.    })
  747.  
  748.    // Add click event listeners to all currency elements
  749.    document.querySelectorAll('.language-popup-currency-wrapper .language-popup-link').forEach(function(element) {
  750.        element.addEventListener('click', function() {
  751.            const currentCurrencyCode = getCookie('caribou_currency')
  752.            const targetCurrencyCode = this.getAttribute('currency')
  753.            if (targetCurrencyCode !== currentCurrencyCode) {
  754.                setActiveCurrency(targetCurrencyCode);
  755.  
  756.                // Reload the page to reflect changes
  757.                window.location.reload()
  758.            }
  759.        });
  760.    });
  761.  
  762.    // Add click event listener to all language elements
  763.    document.querySelectorAll(".language-popup-locale .language-popup-link").forEach(function(element) {
  764.        element.addEventListener("click", function() {
  765.            // Get hreflang attribute of the clicked button
  766.            let hreflang = this.getAttribute('hreflang')
  767.            setActiveLanguage(hreflang)
  768.  
  769.        })
  770.    })
  771.    
  772.    // Add click event listeners for the temporary language switcher
  773.    document.querySelectorAll(".nav-locale .nav-menu-link").forEach(function(element) {
  774.        element.addEventListener("click", function() {
  775.            // Get hreflang attribute of the clicked button
  776.            let hreflang = this.getAttribute('hreflang')
  777.            setActiveLanguage(hreflang)
  778.  
  779.        })
  780.    })
  781.  
  782.    // Update footer language text
  783.    // Check for existing 'caribou_language' cookie
  784.    const userLanguage = getCookie('caribou_language')
  785.  
  786.    if (userLanguage) {
  787.        const footerLangMap = {
  788.            "zh-Hant-HK": "繁體中文",
  789.            "en": "English"
  790.        }
  791.  
  792.        const footerLangText = footerLangMap[userLanguage] || '繁體中文'
  793.        const footerBtnTextLang = document.querySelector(".footer-btn-text-language")
  794.        if (footerBtnTextLang) {
  795.            footerBtnTextLang.textContent = footerLangText
  796.        }
  797.    }
  798.    
  799. });
  800.  
  801.  
  802.  
  803.  
  804.  
  805.  
  806. </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.86552b852.js" type="text/javascript"></script><!-- Google Tag Manager (noscript) -->
  807. <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WKGC5B3"
  808. height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  809. <!-- End Google Tag Manager (noscript) -->
  810.  
  811.  
  812.  
  813. <script>
  814.  
  815. $(document).ready(function() {
  816.    $('.language-switch-chi').click(function(e){
  817.        relativePath = location.href.replace(location.origin,'');
  818.  
  819.        if(relativePath == "/en/home") {
  820.            window.location.href = "/";
  821.        } else if (!relativePath.includes("/en/")){
  822.            return
  823.        } else {
  824.            window.location.href = relativePath.replace("/en/", "/");
  825.        }
  826.  
  827.    })
  828.  
  829.    $('.language-switch-eng').click(function(e){
  830.        relativePath = location.href.replace(location.origin,'');
  831.  
  832.        if(relativePath == "/") {
  833.            window.location.href = "/en/home";
  834.        } else if (relativePath.includes("/en/")){
  835.            return
  836.        } else {
  837.            window.location.href = relativePath.replace("/", "/en/");
  838.        }
  839.    });
  840.  
  841.  
  842. });
  843.  
  844.  
  845. </script>
  846.  
  847.  
  848.  
  849. <!-- Render Nav Menu Dropdown -->
  850. <script>
  851. // Select all list items in the nav-menu-collection-list
  852. const listItems = document.querySelectorAll('.nav-menu-collection-list .nav-menu-collection-item');
  853.  
  854. // Loop through each list item
  855. listItems.forEach(item => {
  856.    // Find the nav-menu-link and nav-menu-hidden-link elements within the current list item
  857.    const navLink = item.querySelector('.nav-menu-link');
  858.    const footerLink = item.querySelector('.footer-link')
  859.    const hiddenLink = item.querySelector('.nav-menu-hidden-link');
  860.  
  861.  
  862.    if (hiddenLink) {
  863.        if (navLink) {
  864.            // Set the href attribute of nav-menu-link to the text content of nav-menu-hidden-link
  865.            navLink.setAttribute('href', hiddenLink.textContent.trim());
  866.        } else if (footerLink) {
  867.            // Set the href attribute of footer-link to the text content of nav-menu-hidden-link
  868.            footerLink.setAttribute('href', hiddenLink.textContent.trim());
  869.        }
  870.  
  871.        // Remove the nav-menu-hidden-link element from the DOM
  872.        hiddenLink.remove();
  873.    }
  874.  
  875. });
  876. </script>
  877. <!-- End Render Nav Menu Dropdown -->
  878.  
  879. <script>
  880. // Hide theme page menu for english
  881.  
  882. const websiteLanguage = window.location.pathname.includes("/en/") || window.location.pathname === "/en" ? "en" : "zh-Hant-HK"
  883. if (websiteLanguage == "en") {
  884.  document.querySelector("#footer-item-themePage").style.display = "none"
  885. }
  886. </script>
  887.  
  888. <script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
  889.  
  890. <!-- Start seamless-pagination custom code -->
  891.  
  892. <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.pjax/2.0.1/jquery.pjax.min.js"></script>
  893. <script>
  894.  var containerSelector = '#seamless-replace';
  895.  $(document).pjax(
  896.    '.w-pagination-wrapper a',
  897.    containerSelector,
  898.    {
  899.      container: containerSelector,
  900.      fragment: containerSelector,
  901.      scrollTo: false,
  902.      timeout: 2500,
  903.    }
  904.  );
  905.    // These 3 lines should reinitialize interactions
  906.  $(document).on('pjax:end', function() {
  907.    Webflow.require('ix2').init();
  908.  });
  909. </script>
  910.  
  911. <!-- End seamless-pagination custom code --></body></html>
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda