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/expert/emily-shake-to-win

  1. <!DOCTYPE html><!-- Last Published: Wed Dec 11 2024 08:54:51 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="caribou.travel" data-wf-page="64d1f8d7c8eb554aa7393f25" data-wf-site="64d1f8d7c8eb554aa7393f33" lang="zh-HK" data-wf-locale="zh-HK" data-wf-collection="64d1f8d7c8eb554aa7393fad" data-wf-item-slug="emily-shake-to-win"><head><meta charset="utf-8"/><title>賞遊世界60國的Emily|Caribou Travel - 你的一對一旅遊預訂助手 - 輕鬆預訂 郵輪假期|精品酒店</title><link rel="alternate" hrefLang="x-default" href="https://caribou.travel/expert/emily-shake-to-win"/><link rel="alternate" hrefLang="zh-HK" href="https://caribou.travel/expert/emily-shake-to-win"/><link rel="alternate" hrefLang="en" href="https://caribou.travel/en/expert/emily-shake-to-win"/><meta content="" name="description"/><meta content="賞遊世界60國的Emily|Caribou Travel - 你的一對一旅遊預訂助手 - 輕鬆預訂 郵輪假期|精品酒店" property="og:title"/><meta content="" property="og:description"/><meta content="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6506b2d0e3a78cfe0d51e41a_emily_profile.png" property="og:image"/><meta content="賞遊世界60國的Emily|Caribou Travel - 你的一對一旅遊預訂助手 - 輕鬆預訂 郵輪假期|精品酒店" property="twitter:title"/><meta content="" property="twitter:description"/><meta content="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6506b2d0e3a78cfe0d51e41a_emily_profile.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.7950f0eb5.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></head><body class="full-page-body"><div class="div-block-24"><div class="embed-css w-embed"><style>
  186.  
  187. /* Loading Spinner */
  188. .loader {
  189.  display: block;
  190.  position: relative;
  191.  height: 32px;
  192.  width: 140px;
  193.  border: 3px solid #fff;
  194.  border-radius: 20px;
  195.  box-sizing: border-box;
  196.  animation: balancing 2s linear infinite alternate;
  197.  transform-origin: center center;
  198. }
  199.  
  200. .loader:before {
  201.  content: '';
  202.  position: absolute;
  203.  left: 0;
  204.  bottom: 0;
  205.  width: 52px;
  206.  height: 26px;
  207.  border-radius: 20px;
  208.  background: #FF911F;
  209.  animation: ballbns 2s linear infinite alternate;
  210. }
  211.  
  212. @keyframes ballbns {
  213.  0% {
  214.      left: 0;
  215.      transform: translateX(0%);
  216.  }
  217.  
  218.  100% {
  219.      left: 100%;
  220.      transform: translateX(-100%);
  221.  }
  222. }
  223.  
  224. @keyframes balancing {
  225.  0% {
  226.      transform: rotate(-25deg);
  227.  }
  228.  
  229.  50% {
  230.      transform: rotate(0deg);
  231.  }
  232.  
  233.  100% {
  234.      transform: rotate(25deg);
  235.  }
  236. }
  237.  
  238.  
  239.  
  240. </style></div><div class="loading-wrapper"><div class="w-embed"><span class="loader"></span></div><div class="w-embed"><style>
  241. /* Loading Spinner */
  242. .loader {
  243.    display: block;
  244.    position: relative;
  245.    height: 32px;
  246.    width: 140px;
  247.    border: 3px solid #fff;
  248.    border-radius: 20px;
  249.    box-sizing: border-box;
  250.    animation: balancing 2s linear infinite alternate;
  251.    transform-origin: center center;
  252. }
  253.  
  254. .loader:before {
  255.    content: '';
  256.    position: absolute;
  257.    left: 0;
  258.    bottom: 0;
  259.    width: 52px;
  260.    height: 26px;
  261.    border-radius: 20px;
  262.    background: #FF911F;
  263.    animation: ballbns 2s linear infinite alternate;
  264. }
  265.  
  266. @keyframes ballbns {
  267.    0% {
  268.        left: 0;
  269.        transform: translateX(0%);
  270.    }
  271.  
  272.    100% {
  273.        left: 100%;
  274.        transform: translateX(-100%);
  275.    }
  276. }
  277.  
  278. @keyframes balancing {
  279.    0% {
  280.        transform: rotate(-25deg);
  281.    }
  282.  
  283.    50% {
  284.        transform: rotate(0deg);
  285.    }
  286.  
  287.    100% {
  288.        transform: rotate(25deg);
  289.    }
  290. }
  291.  
  292.  
  293. </style></div></div><div class="embed-js-loading-spinner w-embed w-script"><script>
  294.  
  295. // Show the loading wrapper by default
  296. document.querySelector(".loading-wrapper").style.display = "flex"
  297.  
  298. </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="/" class="plain-navbar-brand w-nav-brand"><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">
  299.  <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"/>
  300.  <path d="M2 12H22" stroke="#101820" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  301.  <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"/>
  302. </svg></div><div class="locale-css w-embed"><style>
  303.  
  304. .nav-lang-dropdown-icon-wrapper:hover .nav-lang-dropdown-icon path {
  305. stroke:white;
  306. }
  307.  
  308. </style></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><section class="section narrow-section"><div class="w-layout-blockcontainer container w-container"><div class="breadcrumb-wrapper"><a href="/advisors" class="breadcrumb-link">旅遊顧問</a><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f5a_breadcrumb-arrow.svg" loading="lazy" alt="" class="breadcrumb-arrow"/><div class="breadcrumb-text">賞遊世界60國的Emily</div></div><div class="advisor-profile-content-wrapper"><div id="w-node-_84591e5a-9a95-7737-f6f0-0de37668faea-a7393f25" class="advisor-profile-profile-wrapper"><div class="advisor-name-and-img-wrapper"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6506b2d0e3a78cfe0d51e41a_emily_profile.png&quot;)" class="advisor-profile-image advisor-profile-page"></div><div class="advisor-details-wrapper"><div class="advisor-header-wrapper"><div class="advisor-name-badge"><div class="advsior-name-wrapper"><h1 class="advisor-name-heading">賞遊世界60國的Emily</h1></div><div class="advisor-badge-wrapper"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f63_privacy-guard-success---filled(24x24)%401x%201.svg" loading="lazy" alt="" class="advisor-badge-icon"/><div class="advisor-badge-name">旅遊顧問</div></div></div></div><div class="advisor-number-wrapper"><div class="advisor-number-item"><div class="advisor-number-data">220</div><div class="advisor-number-description">地點</div></div><div class="advisor-number-item w-condition-invisible"><div class="advisor-number-data w-dyn-bind-empty"></div><div class="advisor-number-description">景點</div></div><div class="advisor-number-item"><div class="advisor-number-data">5</div><div class="advisor-number-description">活動</div></div></div></div></div></div><div id="w-node-e8a12f95-2677-40af-75c7-4d40e704cdbf-a7393f25" class="advisor-profile-details-wrapper"><div class="advisor-details advisor-details-top"><div class="about-advisor-block-wrapper"><div class="about-advisor-block"><div class="about-advisor-header-wrapper"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/65533c51cf5bdf94e35b4c2d_user-square(24x24)%401x%201.svg" loading="lazy" alt="" class="about-advisor-header-image"/><h3 class="about-advisor-header-heading">簡介</h3></div><div class="about-us-description-wrapper"><div class="about-advisor-desc-less-wrapper"><div class="about-advisor-description about-advisor-description-collapsed w-richtext"><p>從六歲到現在,我一直堅持著夢想,用文字和照片記錄著每一次的旅行經歷,讓更多人看見這個世界。我是Emily,一名熱愛探索世界的旅行者,遊歷全球五大洲、60個國家和220座城市,對我而言,旅行不僅在於造訪的地方,更在於離開時帶走了什麼?如果你認為生命是一場充滿好奇心的冒險之旅,那麼我們就一起勇敢踏上這趟旅程。我曾出版電子書《流浪在世界每個角落》,下載量達到20萬次,寫過許多文化旅行專欄,還創立了幫助好奇心旅行者探索世界文化的APP,名為「賞遊地」。我在2009年建立了Facebook粉絲專頁《賞遊世界60國的Emily》,擁有11K粉絲。我喜愛探索各種奇妙的文化,了解當地人的生活,奉行慢旅行的理念,珍惜人生中的每一段歷程中遇上過的人。如果你也擁有巨大無比的好奇心,我們可以成為朋友,也許在旅途中會相遇。我的人生願望是「用一雙腳走遍世界更多值得被發現的地方,用一雙手幫助更多需要幫助的人」</p></div></div><div class="about-us-desc-more-wrapper"><div class="about-advisor-description about-advisor-description-expanded w-richtext"><p>從六歲到現在,我一直堅持著夢想,用文字和照片記錄著每一次的旅行經歷,讓更多人看見這個世界。我是Emily,一名熱愛探索世界的旅行者,遊歷全球五大洲、60個國家和220座城市,對我而言,旅行不僅在於造訪的地方,更在於離開時帶走了什麼?如果你認為生命是一場充滿好奇心的冒險之旅,那麼我們就一起勇敢踏上這趟旅程。我曾出版電子書《流浪在世界每個角落》,下載量達到20萬次,寫過許多文化旅行專欄,還創立了幫助好奇心旅行者探索世界文化的APP,名為「賞遊地」。我在2009年建立了Facebook粉絲專頁《賞遊世界60國的Emily》,擁有11K粉絲。我喜愛探索各種奇妙的文化,了解當地人的生活,奉行慢旅行的理念,珍惜人生中的每一段歷程中遇上過的人。如果你也擁有巨大無比的好奇心,我們可以成為朋友,也許在旅途中會相遇。我的人生願望是「用一雙腳走遍世界更多值得被發現的地方,用一雙手幫助更多需要幫助的人」</p></div></div><a data-w-id="ac727aa1-9765-24a1-6a61-14d19a652bde" href="#" class="btn-display-more w-inline-block"><div class="btn-display-text">顯示更多</div><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f4f_arrow.svg" loading="lazy" alt="" class="btn-display-arrow"/></a><a data-w-id="86844537-acbb-a1a4-d547-b2cafd974c99" href="#" class="btn-display-less w-inline-block"><div class="btn-display-text">顯示更少</div><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/655344f70845ec3d96806d51_up.svg" loading="lazy" alt="" class="btn-display-arrow"/></a><div class="w-embed"><style>
  309.  
  310. .about-advisor-description-collapsed {
  311. display: -webkit-box;
  312.  -webkit-line-clamp: 3;
  313.  -webkit-box-orient: vertical;
  314.  overflow: hidden;
  315.  text-overflow: ellipsis;
  316. }
  317.  
  318. .about-advisor-description-collapsed p {
  319. display: contents;
  320. }
  321.  
  322. .about-advisor-description-collapsed p:after {
  323. content: "\A";
  324.  white-space:pre;
  325. }
  326.  
  327.  
  328. </style></div></div></div><div class="about-advisor-block"><div class="about-advisor-header-wrapper"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f66_beach(24x24)%401x%201.svg" loading="lazy" alt="" class="about-advisor-header-image"/><h3 class="about-advisor-header-heading">精通活動</h3></div><div class="advisor-text-list-wrapper"><div class="text-list-collection-list-wrapper w-dyn-list"><div role="list" class="text-list-collection-list w-dyn-items"><div role="listitem" class="text-list-collection-item w-dyn-item"><div>藝術</div></div><div role="listitem" class="text-list-collection-item w-dyn-item"><div>冥想</div></div><div role="listitem" class="text-list-collection-item w-dyn-item"><div>健康</div></div><div role="listitem" class="text-list-collection-item w-dyn-item"><div>行山</div></div><div role="listitem" class="text-list-collection-item w-dyn-item"><div>自然景觀</div></div><div role="listitem" class="text-list-collection-item w-dyn-item"><div>自然公園</div></div><div role="listitem" class="text-list-collection-item w-dyn-item"><div>設計</div></div><div role="listitem" class="text-list-collection-item w-dyn-item"><div>Cafe</div></div></div></div></div></div><div class="about-advisor-block"><div class="about-advisor-header-wrapper"><img src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f64_location(24x24)%401x%201.svg" loading="lazy" alt="" class="about-advisor-header-image"/><h3 class="about-advisor-header-heading">精通地點</h3></div><div class="advisor-text-list-wrapper"><div class="text-list-collection-list-wrapper w-dyn-list"><div role="list" class="text-list-collection-list w-dyn-items"><div role="listitem" class="text-list-collection-item w-dyn-item"><div>冰島</div></div><div role="listitem" class="text-list-collection-item w-dyn-item"><div>阿拉斯加</div></div><div role="listitem" class="text-list-collection-item w-dyn-item"><div>荷蘭</div></div><div role="listitem" class="text-list-collection-item w-dyn-item"><div>西班牙</div></div><div role="listitem" class="text-list-collection-item w-dyn-item"><div>中國</div></div></div></div></div></div></div></div><div class="advisor-details w-condition-invisible"><h2 class="advisor-details-heading">旅遊產品</h2><div class="advisor-tour-products-collection-list-wrapper w-dyn-list"><div class="empty-state w-dyn-empty"><div>No items found.</div></div></div></div><div class="advisor-details"><h2 class="advisor-details-heading">旅遊紀錄</h2><div class="advisor-post-collection-list-wrapper w-dyn-list"><div role="list" class="advisor-post-collection-list w-dyn-items"><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/ninghai" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6508709575fe96024913870c_%E5%AF%A7%E6%B5%B7.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">寧海 - 拋棄世俗的選擇才能收穫由心的快樂</div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">寧海</div></div></div></a></div><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/dunhuang" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/65086991e39f484d1e2e2e4a_%E6%95%A6%E7%85%8C.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">敦煌 - 在營營役役的世界尋找永恆不變的規律 </div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">敦煌</div></div></div></a></div><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/czech-prague" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6508652910ba014cc630f1c4_%E5%B8%83%E6%8B%89%E6%A0%BC.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">漫遊布拉格 - 有一個地方只有我們知道</div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">布拉格</div></div></div></a></div><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/netherland-zaandam" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/65085ecc8e252bf313bad69c_%E8%B4%8A%E4%B8%B9.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">贊丹 - 從莫奈的25幅油畫裡走出來的童話小鎮</div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">贊丹</div></div></div></a></div><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/10-spain-granada" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6508552888bf8585c25f9178_%E6%A0%BC%E6%8B%89%E7%B4%8D%E9%81%94.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">10 個打卡地體驗格拉納達</div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">格拉納達</div></div></div></a></div><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/6-attractions-amsterdam" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/65084cead7844d4aa106f9d8_%E9%98%BF%E5%A7%86%E6%96%AF%E7%89%B9%E4%B8%B9.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">6 個必打卡地體驗阿姆斯特丹</div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">阿姆斯特丹</div></div></div></a></div><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/8-spots-spain-madrid" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6506cc255a7b654c49971b77_%E9%A6%AC%E5%BE%B7%E9%87%8C.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">8 個打卡地感受馬德里不思議</div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">馬德里</div></div></div></a></div><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/8-attractions-spain-valencia" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6506c7c8ef3419468ecfca26_%E7%93%A6%E4%BC%A6%E8%A5%BF%E4%BA%9A.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">8 個地標玩轉西班牙瓦倫西亞</div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">瓦倫西亞</div></div></div></a></div><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/galicia-4" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6506bd19afba43c69413fa90_14.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">加利西亞旅程亮點4:  跟著當地人去吃當地菜</div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">加利西亞</div></div></div></a></div><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/galicia-3" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6506bc03303f42e64df354cc_11.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">旅程亮點3:住12世紀修道院,參加當地葡萄酒盛典</div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">加利西亞</div></div></div></a></div><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/galicia-2" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6506b8c9f68c472192a187ae_8.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">加利西亞旅程亮點2:  住隱世小屋,認識老闆和老闆的一家人</div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">加利西亞</div></div></div></a></div><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/gallicia-1-wine-boat-fjord" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6506b9a7cf44ceedc71e60c3_5.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">加利西亞旅程亮點 1:學習當地人懸崖峭壁種植葡萄的文化 - 乘船、品酒、欣賞自然峽灣的風景</div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">加利西亞</div></div></div></a></div><div role="listitem" class="advisor-post-collection-item w-dyn-item"><a href="/post/spain-galicia" class="advisor-post-wrapper w-inline-block"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f39/6506b95ef68c472192a1df0f_1.png&quot;)" class="advisor-post-img"></div><div class="advisor-post-details-wrapper"><div class="advisor-post-title">遠離人煙的世外桃源西班牙- 加利西亞Galicia</div><div class="advisor-post-location-wrapper"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64d1f8d7c8eb554aa7393f33/64d1f8d7c8eb554aa7393f67_location-tag.svg" class="advisor-post-location-icon"/><div class="advisor-post-location">加利西亞</div></div></div></a></div></div></div></div></div></div></div></section><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>
  329.  
  330.  
  331. // Function to get a cookie
  332. function getCookie(name) {
  333.    var nameEQ = name + "=";
  334.    var ca = document.cookie.split(';');
  335.    for(var i=0;i < ca.length;i++) {
  336.        var c = ca[i];
  337.        while (c.charAt(0)==' ') c = c.substring(1,c.length);
  338.        if (c.indexOf(nameEQ) == 0) {
  339.            var cookieValue = c.substring(nameEQ.length, c.length);
  340.            return decodeURIComponent(cookieValue);
  341.        }
  342.    }
  343.    return null;
  344. }
  345.  
  346.  
  347.  
  348. </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="/expert/emily-shake-to-win" 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/expert/emily-shake-to-win" 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="/expert/emily-shake-to-win" 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/expert/emily-shake-to-win" 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>
  349.  
  350. // Function to manage the active class and set cookie
  351. function setActiveCurrency(currencyCode, updateUrl = true ) {
  352.    // Remove active class from all currency elements
  353.    document.querySelectorAll('.language-popup-link').forEach(function(element) {
  354.        element.classList.remove('active');
  355.    });
  356.  
  357.    // Add active class to the selected currency
  358.    document.querySelectorAll(`.language-popup-link[currency="${currencyCode}"]`).forEach(function(element) {
  359.        element.classList.add('active');
  360.    });
  361.  
  362.    // Set the currency in a cookie
  363.    setCookie('caribou_currency',currencyCode, 30); // Expires in 7 days
  364.    
  365.    // Update the footer btn text
  366.    const footerBtnTextCurrency = document.querySelector(".footer-btn-text-currency")
  367.    if (footerBtnTextCurrency) {
  368.        footerBtnTextCurrency.textContent = currencyCode
  369.    }
  370.    
  371.    // Update the mobile menu btn text
  372.    const mobileMenuBtnTextCurrency = document.querySelector(".mobile-menu-btn-text-currency")
  373.    if (mobileMenuBtnTextCurrency) {
  374.        mobileMenuBtnTextCurrency.textContent = currencyCode
  375.    }
  376.  
  377.    // Set the currency parameter in the URL if updateUrl is true
  378.    if (updateUrl) {
  379.        setUrlParameter('curr', currencyCode);
  380.    }
  381. }
  382.  
  383.  
  384. // Function to manage the active language and set cookie
  385. function setActiveLanguage(langCode) {
  386.    // Mapping of hreflang to cookie values
  387.    const langCookieMap = {
  388.        'zh-HK': 'zh-Hant-HK',
  389.        'en': 'en'
  390.    }
  391.  
  392.    // Determine the cookie value using the mapping, default to the langCode if not found
  393.    const cookieValue = langCookieMap[langCode] || langCode
  394.  
  395.    // Set the cookie for 30 days
  396.    setCookie('caribou_language', cookieValue, 30)
  397. }
  398.  
  399.  
  400. // Initialize or set default active currency based on cookie
  401. function initCurrency() {
  402.    const currencyParam = getUrlParameter('curr');
  403.    if (currencyParam) {
  404.        setActiveCurrency(currencyParam);
  405.    } else {
  406.        var savedCurrency = getCookie('caribou_currency');
  407.        if (savedCurrency) {
  408.            setActiveCurrency(savedCurrency, false);
  409.        } else {
  410.            const defaultCurrency = 'HKD'; // Default to HKD if no cookie is found
  411.            setActiveCurrency(defaultCurrency, false);
  412.        }
  413.    }
  414. }
  415.  
  416. // Function to get URL parameters
  417. function getUrlParameter(name) {
  418.    name = name.replace(/[\[\]]/g, '\\$&');
  419.    const urlParams = new URLSearchParams(window.location.search);
  420.    return urlParams.get(name);
  421. }
  422.  
  423. // Function to set URL parameters
  424. function setUrlParameter(param, value) {
  425.    const url = new URL(window.location.href);
  426.    url.searchParams.set(param, value);
  427.    window.history.replaceState(null, '', url.toString());
  428. }
  429.  
  430. // Function to add event listener
  431. function addPopupEventListener() {
  432.    const navToggle = document.querySelector(".nav-lang-dropdown-icon-wrapper")
  433.    const footerBtnLanguage = document.querySelector("#footer-btn-language")
  434.    const footerBtnCurrency = document.querySelector("#footer-btn-currency")
  435.    const mobileMenuBtnLanguage = document.querySelector("#mobile-menu-btn-language")
  436.    const mobileMenuBtnCurrency = document.querySelector("#mobile-menu-btn-currency")
  437.  
  438.    // Show popup for both language and currency when nav toggle has been clicked
  439.    if (navToggle) {
  440.        navToggle.addEventListener("click", function() {
  441.            document.querySelector("#popup-language-currency").style.display = "flex"
  442.        })
  443.    }
  444.    
  445.    // Show popup for language when the footerBtnLanguage has been clicked
  446.    if (footerBtnLanguage) {
  447.        footerBtnLanguage.addEventListener("click", function() {
  448.            document.querySelector("#popup-language").style.display = "flex"
  449.        })
  450.    }
  451.    
  452.    // Show popup for currency when the footerBtnCurrency has been clicked
  453.    if (footerBtnCurrency) {
  454.        footerBtnCurrency.addEventListener("click", function() {
  455.            document.querySelector("#popup-currency").style.display = "flex"
  456.        })
  457.    }
  458.    
  459.    // Show popup for language when the mobileMenuBtnLanguage has been clicked
  460.    if (mobileMenuBtnLanguage) {
  461.        mobileMenuBtnLanguage.addEventListener("click", function() {
  462.            document.querySelector("#popup-language").style.display = "flex"
  463.        })
  464.    }
  465.  
  466.    // Show popup for currency when the mobileMenuBtnCurrency has been clicked
  467.    if (mobileMenuBtnCurrency) {
  468.        mobileMenuBtnCurrency.addEventListener("click", function(){
  469.            document.querySelector("#popup-currency").style.display = "flex"
  470.        })
  471.    }
  472.  
  473. }
  474.  
  475.  
  476. document.addEventListener('DOMContentLoaded', function() {
  477.  
  478.    initCurrency();
  479.    addPopupEventListener()
  480.  
  481.    // Close the popup
  482.    document.querySelectorAll(".language-popup-close-btn").forEach(function(element) {
  483.        element.addEventListener("click", function(){
  484.            // Find the cloest language-popup-wrapper and hide it
  485.            let popupWrapper = this.closest(".language-popup-wrapper")
  486.            if (popupWrapper) {
  487.                popupWrapper.style.display = "none"
  488.            }
  489.        })
  490.    })
  491.  
  492.    // Add click event listeners to all currency elements
  493.    document.querySelectorAll('.language-popup-currency-wrapper .language-popup-link').forEach(function(element) {
  494.        element.addEventListener('click', function() {
  495.            const currentCurrencyCode = getCookie('caribou_currency')
  496.            const targetCurrencyCode = this.getAttribute('currency')
  497.            if (targetCurrencyCode !== currentCurrencyCode) {
  498.                setActiveCurrency(targetCurrencyCode);
  499.  
  500.                // Reload the page to reflect changes
  501.                window.location.reload()
  502.            }
  503.        });
  504.    });
  505.  
  506.    // Add click event listener to all language elements
  507.    document.querySelectorAll(".language-popup-locale .language-popup-link").forEach(function(element) {
  508.        element.addEventListener("click", function() {
  509.            // Get hreflang attribute of the clicked button
  510.            let hreflang = this.getAttribute('hreflang')
  511.            setActiveLanguage(hreflang)
  512.  
  513.        })
  514.    })
  515.    
  516.    // Add click event listeners for the temporary language switcher
  517.    document.querySelectorAll(".nav-locale .nav-menu-link").forEach(function(element) {
  518.        element.addEventListener("click", function() {
  519.            // Get hreflang attribute of the clicked button
  520.            let hreflang = this.getAttribute('hreflang')
  521.            setActiveLanguage(hreflang)
  522.  
  523.        })
  524.    })
  525.  
  526.    // Update footer language text
  527.    // Check for existing 'caribou_language' cookie
  528.    const userLanguage = getCookie('caribou_language')
  529.  
  530.    if (userLanguage) {
  531.        const footerLangMap = {
  532.            "zh-Hant-HK": "繁體中文",
  533.            "en": "English"
  534.        }
  535.  
  536.        const footerLangText = footerLangMap[userLanguage] || '繁體中文'
  537.        const footerBtnTextLang = document.querySelector(".footer-btn-text-language")
  538.        if (footerBtnTextLang) {
  539.            footerBtnTextLang.textContent = footerLangText
  540.        }
  541.        
  542.        const mobileMenuBtnTextLang = document.querySelector(".mobile-menu-btn-text-language")
  543.        if (mobileMenuBtnTextLang) {
  544.            mobileMenuBtnTextLang.textContent = footerLangText
  545.        }
  546.    }
  547.    
  548. });
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555. </script></div></div></section><div class="embed-product-price w-embed w-script"><script>
  556.  
  557. // Function to format number as currency without decimal places
  558. async function formatCurrencyWithConversion(number) {
  559.  const currencyCode = getCookie("caribou_currency"); // Assuming getCookie is a function defined elsewhere
  560.  
  561.  // Mapping of currency codes to their symbols and locale
  562.  const currencyDetails = {
  563.    HKD: { symbol: "HK$", locale: "en-HK" },
  564.    TWD: { symbol: "NT$", locale: "en-TW" },
  565.    SGD: { symbol: "S$", locale: "en-SG" },
  566.    USD: { symbol: "US$", locale: "en-US" },
  567.  };
  568.  
  569.  // Fallback details in case the currency code is not recognized
  570.  const fallbackDetails = { symbol: "$", locale: "en-US" };
  571.  
  572.  // Retrieve the currency details or use fallback
  573.  const { symbol, locale } = currencyDetails[currencyCode] || fallbackDetails;
  574.  
  575.  try {
  576.    // Fetch currency conversion rates from the API
  577.    const response = await fetch(
  578.      "https://advisor.caribou.travel/api/currency-conversion"
  579.    );
  580.    const result = await response.json();
  581.  
  582.    // Get the conversion rate based on the currencyCode
  583.    const conversionRate = result.data[currencyCode.toLowerCase()] || 1; // Default to 1 if no found
  584.  
  585.    // Calculate the converted amount
  586.    const convertedAmount = number * conversionRate;
  587.  
  588.    // Use Intl.NumberFormat to format the converted amount with the correct locale and currency symbol
  589.    const formattedConvertedAmount = new Intl.NumberFormat(locale, {
  590.      minimumFractionDigits: 0,
  591.      maximumFractionDigits: 0,
  592.    }).format(convertedAmount);
  593.  
  594.    // Construct the formatted currency string
  595.    const formattedCurrency = `${symbol}${formattedConvertedAmount}`;
  596.  
  597.    return formattedCurrency;
  598.  } catch (error) {
  599.    console.error("Error fetching currency conversion: ", error);
  600.    // Fallback to formatting without conversion in case of error
  601.    const formattedNumber = new Intl.NumberFormat(locale, {
  602.      minimumFractionDigits: 0,
  603.      maximumFractionDigits: 0,
  604.    }).format(number);
  605.  
  606.    const formattedCurrency = `${symbol}${formattedNumber}`;
  607.    return formattedCurrency;
  608.  }
  609. }
  610.  
  611. async function updateTourProductPrice() {
  612.  // Convert and Format the discounted price
  613.  const tourProductPriceElements = document.querySelectorAll(".tour-product-price")
  614.  
  615.  tourProductPriceElements.forEach(async (element) => {
  616.    const numericValue = parseFloat(element.textContent);
  617.    try {
  618.      const formattedAmount = await formatCurrencyWithConversion(numericValue) + "+";
  619.  
  620.      // Update the value of each "tour-product-price" element
  621.      element.textContent = formattedAmount;  
  622.    } catch (error) {
  623.      console.error('Error formatting currency: ', error)
  624.    }
  625.  });
  626.  
  627.  // Convert and Format the original price
  628.  const tourProductOriginalPriceElements = document.querySelectorAll(".tour-product-original-price")
  629.  
  630.  tourProductOriginalPriceElements.forEach(async (element) => {
  631.    const numericValue = parseFloat(element.textContent)
  632.    try {
  633.      const formattedAmount = await formatCurrencyWithConversion(numericValue) + "+";
  634.  
  635.      // Update the value of each "tour-product-price" element
  636.      element.textContent = formattedAmount;  
  637.    } catch (error) {
  638.      console.error('Error formatting currency: ', error)
  639.    }
  640.  })
  641. }
  642.  
  643.  
  644. </script></div><div class="embed-product-hashtags w-embed w-script"><script>
  645.  
  646. // Function to process each advisor-tour-products-block
  647. function processTourProductsBlocks() {
  648.  // Find all blocks with class 'advisor-tour-products-block'
  649.  const blocks = document.querySelectorAll('.advisor-tour-products-block');
  650.  
  651.  blocks.forEach(block => {
  652.      // Extract the value from 'tour-types-text'
  653.      const tourTypesTextElement = block.querySelector('.tour-types-text');
  654.      if (tourTypesTextElement) {
  655.          const tourTypesText = tourTypesTextElement.textContent.trim();
  656.  
  657.          // Split into a comma-separated list
  658.          const tourTypesList = tourTypesText.split(',').map(text => `#${text.trim()}`);
  659.  
  660.          // Find the 'tour-types-wrapper' element
  661.          const tourTypesWrapper = block.querySelector('.tour-types-wrapper');
  662.          if (tourTypesWrapper) {
  663.              // Clear existing content
  664.              tourTypesWrapper.innerHTML = '';
  665.  
  666.              // Append each item from the list
  667.              tourTypesList.forEach(tourType => {
  668.                  const span = document.createElement('span');
  669.                  span.textContent = tourType;
  670.                  tourTypesWrapper.appendChild(span);
  671.              });
  672.          }
  673.      }
  674.  });
  675. }
  676.  
  677.  
  678.  
  679. </script></div><div class="embed-js w-embed w-script"><script>
  680.  
  681. $(document).ready(async function () {
  682.  try {
  683.    // Hnadle the pricing
  684.    await updateTourProductPrice()
  685.  
  686.    // Handle the hashtags
  687.    processTourProductsBlocks();
  688.  
  689.    document.querySelector(".loading-wrapper").style.display = "none"
  690.  } catch (error){
  691.    console.error('Error:', error);
  692.    document.querySelector(".loading-wrapper").style.display = "none"
  693.  }
  694.  
  695. });
  696.  
  697. </script></div></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.f1987f992ee15436db1eba446e537b50.js" type="text/javascript"></script><!-- Google Tag Manager (noscript) -->
  698. <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WKGC5B3"
  699. height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  700. <!-- End Google Tag Manager (noscript) -->
  701.  
  702.  
  703.  
  704. <script>
  705.  
  706. $(document).ready(function() {
  707.    $('.language-switch-chi').click(function(e){
  708.        relativePath = location.href.replace(location.origin,'');
  709.  
  710.        if(relativePath == "/en/home") {
  711.            window.location.href = "/";
  712.        } else if (!relativePath.includes("/en/")){
  713.            return
  714.        } else {
  715.            window.location.href = relativePath.replace("/en/", "/");
  716.        }
  717.  
  718.    })
  719.  
  720.    $('.language-switch-eng').click(function(e){
  721.        relativePath = location.href.replace(location.origin,'');
  722.  
  723.        if(relativePath == "/") {
  724.            window.location.href = "/en/home";
  725.        } else if (relativePath.includes("/en/")){
  726.            return
  727.        } else {
  728.            window.location.href = relativePath.replace("/", "/en/");
  729.        }
  730.    });
  731.  
  732.  
  733. });
  734.  
  735.  
  736. </script>
  737.  
  738.  
  739.  
  740. <!-- Render Nav Menu Dropdown -->
  741. <script>
  742. // Select all list items in the nav-menu-collection-list
  743. const listItems = document.querySelectorAll('.nav-menu-collection-list .nav-menu-collection-item');
  744.  
  745. // Loop through each list item
  746. listItems.forEach(item => {
  747.    // Find the nav-menu-link and nav-menu-hidden-link elements within the current list item
  748.    const navLink = item.querySelector('.nav-menu-link');
  749.    const footerLink = item.querySelector('.footer-link')
  750.    const hiddenLink = item.querySelector('.nav-menu-hidden-link');
  751.  
  752.  
  753.    if (hiddenLink) {
  754.        if (navLink) {
  755.            // Set the href attribute of nav-menu-link to the text content of nav-menu-hidden-link
  756.            navLink.setAttribute('href', hiddenLink.textContent.trim());
  757.        } else if (footerLink) {
  758.            // Set the href attribute of footer-link to the text content of nav-menu-hidden-link
  759.            footerLink.setAttribute('href', hiddenLink.textContent.trim());
  760.        }
  761.  
  762.        // Remove the nav-menu-hidden-link element from the DOM
  763.        hiddenLink.remove();
  764.    }
  765.  
  766. });
  767. </script>
  768. <!-- End Render Nav Menu Dropdown -->
  769.  
  770. <script>
  771. // Hide theme page menu for english
  772.  
  773. const websiteLanguage = window.location.pathname.includes("/en/") || window.location.pathname === "/en" ? "en" : "zh-Hant-HK"
  774. const footerItemThemePage = document.querySelector("#footer-item-themePage")
  775. if (websiteLanguage == "en") {
  776.  if (footerItemThemePage) {
  777.    footerItemThemePage.style.display = "none"
  778.  }
  779. }
  780.  
  781.  
  782.  
  783.  
  784. async function checkAndFetchHashID() {
  785.  // Function to create custom fbc cookie if it does not exists
  786.  const setCustomFbcCookie = () => {
  787.    if (
  788.      !getCookie("_fbc") &&
  789.      adTracking.fbclid &&
  790.      adTracking.fbclid != "(no value)"
  791.    ) {
  792.      let timestamp = new Date(adTracking.timestamp).getTime() / 1000;
  793.      let customFbc = `fb.1.${timestamp}.${adTracking.fbclid}`;
  794.      setCookie("_fbc", customFbc, 90);
  795.    }
  796.  };
  797.  
  798.  // Function to populate the cookie into hash object if the cookie exists
  799.  const populateCookieToHashObject = (cookieName, hashKey) => {
  800.    let cookieValue = getCookie(cookieName);
  801.    if (cookieValue) hashObject[hashKey] = cookieValue;
  802.  };
  803.  
  804.  // Function to populate fbc & fbp into the forms
  805.  const populateFormFields = (formPrefix) => {
  806.    document.getElementById(`${formPrefix}-hash_id`).value =getCookie("caribou_hashID");
  807.    if (getCookie("_fbc"))
  808.      document.getElementById(`${formPrefix}-fbc`).value = getCookie("_fbc");
  809.    if (getCookie("_fbp"))
  810.      document.getElementById(`${formPrefix}-fbp`).value = getCookie("_fbp");
  811.  };
  812.  
  813.  // Function to get theme page id
  814.  const getThemePageTrackingId = () => {
  815.    const firstHotelLink = document.querySelector(".hotel-link");
  816.    if (firstHotelLink) {
  817.      const regex = /caribou-theme-\d+/;
  818.      const match = firstHotelLink.href.match(regex);
  819.      if (match) {
  820.        return match[0];
  821.      }
  822.    }
  823.    return null;
  824.  };
  825.  
  826.  // Function to replace theme page id tracking with hash id
  827.  const updateHotelLinksWithHashId = () => {
  828.    const hashId = getCookie("caribou_hashID");
  829.    if (!hashId || hashId == "(no_hashID)") {
  830.      console.error("Hash ID not found in cookies");
  831.      return;
  832.    }
  833.  
  834.    const regex = /caribou-theme-\d+/;
  835.    const hotelLinks = document.querySelectorAll(".hotel-link");
  836.    hotelLinks.forEach((link) => {
  837.      link.href = link.href.replace(regex, `${hashId}`);
  838.    });
  839.  };
  840.  
  841.  // Check if the 'caribou_hashID' cookie exists. if not, fetch it
  842.  if (adTracking && Object.keys(adTracking).length > 0) {
  843.    // Proceed with hash request only if adTracking has data
  844.    if (
  845.      !getCookie("caribou_hashID") ||
  846.      getCookie("caribou_hashID") == "(no_hashID)"
  847.    ) {
  848.      // Init hashObject
  849.      var hashObject = {};
  850.  
  851.      // Add client_id into hash object
  852.      if (getClientId() != "") {
  853.        hashObject.client_id = getClientId();
  854.      }
  855.  
  856.      // Add session_id into hash object
  857.      if (getSessionId() != "") {
  858.        hashObject.session_id = getSessionId();
  859.      }
  860.  
  861.      // Add adTracking into the hash object
  862.      for (let key in adTracking) {
  863.        if (adTracking[key] && adTracking[key] != "(no value)") {
  864.          hashObject[key] = adTracking[key];
  865.        }
  866.      }
  867.  
  868.      setCustomFbcCookie();
  869.  
  870.      populateCookieToHashObject("_fbc", "fbc");
  871.      populateCookieToHashObject("_fbp", "fbp");
  872.  
  873.  
  874.      // Retrieve theme page id for hotel links tracking
  875.      if (window.location.href.includes("/product-theme/")) {
  876.        const themePageTrackingId = getThemePageTrackingId();
  877.        if (themePageTrackingId) {
  878.          hashObject.themePage_TrackingId = themePageTrackingId;
  879.        }
  880.      }
  881.  
  882.      // Only fetch hash if adTracking has relevant data
  883.      if (Object.keys(hashObject).length > 0) {
  884.        await fetchHashId(hashObject);
  885.      }
  886.    }
  887.  }
  888.  
  889.  if (getCookie("caribou_hashID") != "(no_hashID)") {
  890.    // Populate the hash id, fbc & fbp into sales funnel tracking form
  891.    if (window.location.href.includes("/tour-products/")) {
  892.      populateFormFields("funnel-form");
  893.    }
  894.  
  895.    // Populate the hash id, fbc and fbp into product search form
  896.    if (
  897.      window.location.href.includes("/tour-products") &&
  898.      !window.location.href.includes("/tour-products/")
  899.    ) {
  900.      populateFormFields("product-search");
  901.    }
  902.  
  903.    // Replace hotels link with hash id for theme page
  904.    if (window.location.href.includes('/product-theme/')){
  905.      const themePageTrackingId = getThemePageTrackingId()
  906.      if (themePageTrackingId) {
  907.        updateHotelLinksWithHashId(themePageTrackingId)
  908.      }
  909.    }
  910.  }
  911. }
  912.  
  913.  
  914.  
  915.  
  916.  
  917. $(document).ready(async function () {
  918.  
  919.  if (!window.location.href.includes("/product-theme/") && !window.location.href.includes("/tour-products/")) {
  920.    await checkAndFetchHashID();
  921.  }
  922.  
  923.  if (
  924.    !window.location.href.includes("/tour-products") &&
  925.    !window.location.href.includes("/product-theme/")
  926.  ) {
  927.    triggerCustomDataReady();
  928.  }
  929. });
  930.  
  931.  
  932.  
  933.  
  934.  
  935.  
  936. </script>
  937.  
  938. </body></html>
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda