PageSourceSearch

https://www.royalcaribbean.com/content/dam/royal/custom-clientlibs/custom.js

js royalcaribbean.com collected 2026-09-24 08:32:21 UTC 7,635 bytes, 225 lines download raw bytes

1(function () {
2  "use strict";
3  var CONFIG = {
4    ENABLE_LOGS: false,
5    MARKER_CLASS: "global-hotfix-manager-initialized",
6    TARGET_GRANDPARENT_SELECTOR: "#pencil-banner",
7    TARGET_LINK_SELECTOR: "a.cta-link",
8    FIX_ID_PENCIL_BANNER: "PENCIL_BANNER_CTA_FIX",
9    // FIX_ID_CND_4551: "CND-4551",
10  };
11  var marketPathCache = null;
12  function log(fixId, message, data) {
13    if (CONFIG.ENABLE_LOGS) {
14      var time = new Date().toLocaleTimeString("en-US", { hour12: false });
15      console.log("[" + fixId + "] [" + time + "]: " + message);
16      if (data) console.log(data);
17    }
18  }
19  function getMarketLanguagePath() {
20    if (marketPathCache) {
21      return marketPathCache;
22    }
23    var path = window.location.pathname;
24    var pathPrefix = "/";
25    var pathMatch = path.match(/^\/([a-z]{3}|\w{2,3})\/([a-z]{2})\/?/);
26    if (pathMatch) {
27      pathPrefix = pathMatch[0];
28      if (!pathPrefix.endsWith("/")) {
29        pathPrefix += "/";
30      }
31    } else {
32      if (path === "/" || path === "") {
33        try {
34          var globalPlatformData = sessionStorage.getItem("GlobalPlatform");
35          if (globalPlatformData) {
36            var data = JSON.parse(globalPlatformData);
37            if (data && data.marketPath) {
38              pathPrefix = data.marketPath;
39              pathPrefix = pathPrefix.startsWith("/")
40                ? pathPrefix
41                : "/" + pathPrefix;
42            }
43          }
44        } catch (e) {}
45      }
46    }
47    marketPathCache = pathPrefix;
48    log("PATH_HELPER", "Market path determined to be: " + pathPrefix);
49    return pathPrefix;
50  }
51  // function fix_CND_4551() {
52  //   var FIX_ID = CONFIG.FIX_ID_CND_4551;
53  //   var runFixLogic = function () {
54  //     var templates = ["homepage-template", "initial-page-template"];
55  //     var isTargetTemplate = templates.some(function (cls) {
56  //       return document.body.classList.contains(cls);
57  //     });
58  //     if (!isTargetTemplate) {
59  //       return;
60  //     }
61  //     var heroBase = document.querySelector(
62  //       ".superpromohero.basicHero > div.basicHero__base"
63  //     );
64  //     if (!heroBase) {
65  //       return;
66  //     }
67  //     var hasPromoActive = heroBase.classList.contains(
68  //       "promoHero__base--active"
69  //     );
70  //     if (!hasPromoActive) {
71  //       return;
72  //     }
73  //     var lockupImages = heroBase.querySelectorAll(".promoHero__lockupImage");
74  //     var hasVisibleLockup = Array.from(lockupImages).some(function (img) {
75  //       return img.offsetParent !== null;
76  //     });
77  //     if (!hasVisibleLockup) {
78  //       var firstSmallPerk = heroBase.querySelector(
79  //         "h3.basicHero__textLine.basicHero__textLine--small"
80  //       );
81  //       if (firstSmallPerk) {
82  //         firstSmallPerk.classList.remove("basicHero__textLine--small");
83  //         firstSmallPerk.classList.add("basicHero__textLine--large");
84  //         log(FIX_ID, "Applied fix: Enlarged first perk text.");
85  //       }
86  //     }
87  //   };
88  //   setTimeout(runFixLogic, 500);
89  // }
90  function fix_PENCIL_BANNER_CTA() {
91    var FIX_ID = CONFIG.FIX_ID_PENCIL_BANNER;
92    var TARGET_GRANDPARENT = CONFIG.TARGET_GRANDPARENT_SELECTOR;
93    var TARGET_LINK = CONFIG.TARGET_LINK_SELECTOR;
94    var observerInstance = null;
95    function applyFix(ctaLink, observer, isOverwriteReversal) {
96      var originalHref = ctaLink.getAttribute("href");
97      var marketPathPrefix = getMarketLanguagePath();
98      if (
99        !originalHref ||
100        originalHref.startsWith("http") ||
101        originalHref.startsWith(marketPathPrefix) ||
102        originalHref === "#"
103      ) {
104        if (observer && !isOverwriteReversal) {
105          observer.disconnect();
106        }
107        return;
108      }
109      var cleanHref = originalHref.startsWith("/")
110        ? originalHref.substring(1)
111        : originalHref;
112      var newHref = marketPathPrefix + cleanHref;
113      ctaLink.setAttribute("href", newHref);
114      log(
115        FIX_ID,
116        "SUCCESS: Updated Href (Attempt: " +
117          (isOverwriteReversal ? "Overwrite Reversal" : "Initial") +
118          ")",
119        { original: originalHref, new: newHref }
120      );
121      if (observer && !isOverwriteReversal) {
122        observer.disconnect();
123      }
124    }
125    function startOverwriteReversalObserver(ctaLink) {
126      log(FIX_ID, "INITIATING OVERWRITE REVERSAL OBSERVER on CTA link.");
127      var reversalObserver = new MutationObserver(function () {
128        var currentHref = ctaLink.getAttribute("href");
129        var marketPathPrefix = getMarketLanguagePath();
130        if (
131          currentHref &&
132          currentHref !== "#" &&
133          !currentHref.startsWith(marketPathPrefix)
134        ) {
135          log(FIX_ID, "OVERWRITE DETECTED! Reverting fix.", currentHref);
136          reversalObserver.disconnect();
137          applyFix(ctaLink, null, true);
138        }
139      });
140      var config = { attributes: true, attributeFilter: ["href"] };
141      reversalObserver.observe(ctaLink, config);
142      applyFix(ctaLink, null, false);
143    }
144    function startBodyObserver() {
145      log(
146        FIX_ID,
147        "STARTING GLOBAL OBSERVER: Monitoring document.body for final Pencil Banner state."
148      );
149      var observer = new MutationObserver(function () {
150        var pencilBanner = document.querySelector(TARGET_GRANDPARENT);
151        if (pencilBanner && pencilBanner.classList.contains("is-visible")) {
152          var ctaLink = pencilBanner.querySelector(TARGET_LINK);
153          if (ctaLink) {
154            var currentHref = ctaLink.getAttribute("href");
155            if (
156              currentHref &&
157              currentHref !== "#" &&
158              !currentHref.startsWith(getMarketLanguagePath())
159            ) {
160              log(
161                FIX_ID,
162                "Pencil Banner FINALIZED. Initiating Overwrite Reversal sequence."
163              );
164              observer.disconnect();
165              startOverwriteReversalObserver(ctaLink);
166            }
167          }
168        }
169      });
170      var config = {
171        childList: true,
172        subtree: true,
173        attributes: true,
174        attributeFilter: ["class", "href"],
175      };
176      observer.observe(document.body, config);
177      observerInstance = observer;
178      setTimeout(function () {
179        var finalLink = document.querySelector(TARGET_LINK);
180        if (
181          finalLink &&
182          finalLink.getAttribute("href") &&
183          finalLink.getAttribute("href") !== "#" &&
184          !finalLink.getAttribute("href").startsWith(getMarketLanguagePath())
185        ) {
186          log(
187            FIX_ID,
188            "3s Fallback Check Triggered. Initiating Overwrite Reversal sequence."
189          );
190          observerInstance.disconnect();
191          startOverwriteReversalObserver(finalLink);
192        } else {
193          log(FIX_ID, "3s Fallback Check passed. Continuing observation.");
194        }
195      }, 3e3);
196    }
197    startBodyObserver();
198  }
199  function runAllFixes() {
200    if (document.body.classList.contains(CONFIG.MARKER_CLASS)) {
201      log("MANAGER", "Manager already executed. Skipping.");
202      return;
203    }
204    document.body.classList.add(CONFIG.MARKER_CLASS);
205    log("MANAGER", "Starting execution of all registered fixes.");
206
207
208    // var fixRegistry = [fix_PENCIL_BANNER_CTA];
209    var fixRegistry = [];
210
211    
212    for (var i = 0; i < fixRegistry.length; i++) {
213      fixRegistry[i]();
214    }
215    log("MANAGER", "All registered fixes have been executed.");
216  }
217  if (
218    document.readyState === "interactive" ||
219    document.readyState === "complete"
220  ) {
221    runAllFixes();
222  } else {
223    document.addEventListener("DOMContentLoaded", runAllFixes);
224  }
225})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.