PageSourceSearch

https://www.letsroam.com/assets/js/store/source/BundleView.js?cache_version=v12.2.6354ccd.1789030553

js letsroam.com collected 2026-09-24 09:24:50 UTC 59,394 bytes, 1,403 lines download raw bytes

1// outer template for the cart panel
2// tickets, addons are rendered in the next section
3function shouldUseGhostTourDarkBundleTheme() {
4  return false;
5}
6
7function applyGhostThemeToLegacyBundleModal(bundleModal) {
8  if (!shouldUseGhostTourDarkBundleTheme()) {
9    return;
10  }
11  var isMobile = window.matchMedia('(max-width: 768px)').matches;
12
13  var root = bundleModal.querySelector('#cartItem') || bundleModal;
14  root.style.setProperty('background', 'rgba(0, 0, 0, 0.75)', 'important');
15
16  var dialog = bundleModal.querySelector('.modal-dialog');
17  if (dialog) {
18    dialog.style.setProperty('min-width', '0', 'important');
19    dialog.style.setProperty('max-width', '990px', 'important');
20    dialog.style.setProperty('width', 'calc(100% - 24px)', 'important');
21    dialog.style.setProperty('margin', '12px auto', 'important');
22    dialog.style.setProperty('border-left', '0', 'important');
23    dialog.style.setProperty('box-shadow', 'none', 'important');
24    if (isMobile) {
25      dialog.style.setProperty('max-height', 'calc(100dvh - 16px)', 'important');
26      dialog.style.setProperty('height', 'auto', 'important');
27      dialog.style.setProperty('overflow-y', 'auto', 'important');
28      dialog.style.setProperty('-webkit-overflow-scrolling', 'touch', 'important');
29      dialog.style.setProperty('margin', '8px auto', 'important');
30    }
31  }
32
33  var leftPanel = bundleModal.querySelector('.c-cart__left-panel');
34  if (leftPanel) {
35    leftPanel.style.setProperty('display', 'none', 'important');
36    leftPanel.style.setProperty('background', 'none', 'important');
37    leftPanel.style.setProperty('overflow', 'hidden', 'important');
38    leftPanel.style.setProperty('box-sizing', 'border-box', 'important');
39    leftPanel.style.setProperty('border', 'none', 'important');
40    leftPanel.style.setProperty('border-left', 'none', 'important');
41    leftPanel.style.setProperty('outline', 'none', 'important');
42    leftPanel.style.setProperty('box-shadow', 'none', 'important');
43  }
44
45  var leftImage = bundleModal.querySelector('.c-cart__left-panel .productBundleImage');
46  if (leftImage) {
47    leftImage.style.setProperty('display', 'none', 'important');
48  }
49
50  var mobileHeaderImage = bundleModal.querySelector('.c-cart__bundle--image-mobile.productBundleImage');
51  if (mobileHeaderImage) {
52    mobileHeaderImage.style.setProperty('display', 'none', 'important');
53  }
54
55  var mobileImageContainer = bundleModal.querySelector('.c-cart__bundle--image-container');
56  if (mobileImageContainer && isMobile) {
57    mobileImageContainer.style.setProperty(
58      'background',
59      'linear-gradient(90deg, #2d4d1f 0%, #1f3a20 50%, #162c1a 100%)',
60      'important'
61    );
62    mobileImageContainer.style.setProperty('display', 'flex', 'important');
63    mobileImageContainer.style.setProperty('justify-content', 'flex-end', 'important');
64    mobileImageContainer.style.setProperty('align-items', 'center', 'important');
65    mobileImageContainer.style.setProperty('min-height', '58px', 'important');
66    mobileImageContainer.style.setProperty('max-height', '58px', 'important');
67    mobileImageContainer.style.setProperty('padding', '6px 10px', 'important');
68  }
69  var mobileHeaderBar = bundleModal.querySelector('.c-cart__bundle--header-mobile.mobileHeader');
70  if (mobileHeaderBar && isMobile) {
71    mobileHeaderBar.style.setProperty('background', 'transparent', 'important');
72    mobileHeaderBar.style.setProperty('color', '#fff', 'important');
73    mobileHeaderBar.style.setProperty('justify-content', 'space-between', 'important');
74    mobileHeaderBar.style.setProperty('align-items', 'center', 'important');
75    mobileHeaderBar.style.setProperty('padding', '0 2px', 'important');
76    mobileHeaderBar.style.setProperty('margin-left', '0', 'important');
77    mobileHeaderBar.style.setProperty('margin-top', '0', 'important');
78    mobileHeaderBar.style.setProperty('width', '100%', 'important');
79    mobileHeaderBar.style.setProperty('min-height', '0', 'important');
80
81    var mobileHeaderTitleWrap = mobileHeaderBar.querySelector('div');
82    if (mobileHeaderTitleWrap) {
83      mobileHeaderTitleWrap.style.setProperty('background', 'transparent', 'important');
84      mobileHeaderTitleWrap.style.setProperty('box-shadow', 'none', 'important');
85      mobileHeaderTitleWrap.style.setProperty('padding', '0', 'important');
86      mobileHeaderTitleWrap.style.setProperty('margin', '0', 'important');
87      mobileHeaderTitleWrap.style.setProperty('text-align', 'left', 'important');
88    }
89
90    var mobileHeaderTitle = mobileHeaderBar.querySelector('.cartItemTitle');
91    if (mobileHeaderTitle) {
92      mobileHeaderTitle.style.setProperty('text-align', 'left', 'important');
93      mobileHeaderTitle.style.setProperty('display', 'block', 'important');
94      mobileHeaderTitle.style.setProperty('background', 'transparent', 'important');
95      mobileHeaderTitle.style.setProperty('padding', '0', 'important');
96    }
97
98    var mobileClose = mobileHeaderBar.querySelector('.mobileClose');
99    if (mobileClose) {
100      mobileClose.style.setProperty('margin-left', 'auto', 'important');
101      mobileClose.style.setProperty('padding-left', '10px', 'important');
102      mobileClose.style.setProperty('text-align', 'right', 'important');
103    }
104  }
105
106  var content = bundleModal.querySelector('.bundleMainContent');
107  if (content) {
108    content.style.setProperty('background', '#14191D', 'important');
109    content.style.setProperty('color', '#FFFFFF', 'important');
110    if (isMobile) {
111      content.style.setProperty('max-height', 'none', 'important');
112      content.style.setProperty('height', 'auto', 'important');
113      content.style.setProperty('overflow', 'visible', 'important');
114      content.style.setProperty('padding-bottom', '18px', 'important');
115    }
116    content
117      .querySelectorAll('div, span, label, p, li, a, small, b')
118      .forEach(function(el) {
119        el.style.setProperty('color', '#FFFFFF', 'important');
120      });
121  }
122
123  var titlePrefix = bundleModal.querySelector('#addToCartTitle');
124  if (titlePrefix) {
125    titlePrefix.style.setProperty('color', '#7FD219', 'important');
126    titlePrefix.style.setProperty('display', 'block', 'important');
127    titlePrefix.style.setProperty('width', '100%', 'important');
128    titlePrefix.style.setProperty('text-align', 'center', 'important');
129  }
130
131  var desktopHeader = bundleModal.querySelector('.c-cart__bundle--header.desktopOnly');
132  if (desktopHeader) {
133    desktopHeader.style.setProperty('max-width', 'none', 'important');
134    desktopHeader.style.setProperty('width', '100%', 'important');
135    desktopHeader.style.setProperty('text-align', 'center', 'important');
136    desktopHeader.style.setProperty('margin-left', '0', 'important');
137    desktopHeader.style.setProperty('margin-right', '0', 'important');
138  }
139  var desktopHeaderTitle = bundleModal.querySelector('.c-cart__bundle--header.desktopOnly .cartItemTitle');
140  if (desktopHeaderTitle) {
141    desktopHeaderTitle.style.setProperty('display', 'block', 'important');
142    desktopHeaderTitle.style.setProperty('width', '100%', 'important');
143    desktopHeaderTitle.style.setProperty('max-width', 'none', 'important');
144    desktopHeaderTitle.style.setProperty('text-align', 'center', 'important');
145  }
146
147  var subtitle = bundleModal.querySelector('.productBundleName');
148  if (subtitle) {
149    var fullTitleEl = bundleModal.querySelector('.cartItemTitle');
150    var fullTitleText = fullTitleEl
151      ? fullTitleEl.textContent.replace(/adding\s*to\s*cart\s*:/i, '').trim().toLowerCase()
152      : '';
153    var subtitleText = subtitle.textContent ? subtitle.textContent.trim().toLowerCase() : '';
154    var isDuplicateSubtitle = !!fullTitleText && !!subtitleText && fullTitleText === subtitleText;
155
156    if (isDuplicateSubtitle && !isMobile) {
157      subtitle.style.setProperty('display', 'none', 'important');
158    } else {
159      subtitle.style.setProperty('display', 'block', 'important');
160      subtitle.style.setProperty('width', '100%', 'important');
161      subtitle.style.setProperty('max-width', 'none', 'important');
162      subtitle.style.setProperty('margin-left', 'auto', 'important');
163      subtitle.style.setProperty('margin-right', 'auto', 'important');
164      subtitle.style.setProperty('text-align', 'center', 'important');
165      subtitle.style.setProperty('background', 'transparent', 'important');
166      subtitle.style.setProperty('border', 'none', 'important');
167    }
168  }
169
170  var bulletLists = bundleModal.querySelectorAll(
171    '.productBundleBullets, .c-cart__bundle--bullets'
172  );
173  bulletLists.forEach(function(listEl) {
174    listEl.style.setProperty('list-style', 'none', 'important');
175    listEl.style.setProperty('padding-left', '0', 'important');
176    listEl.style.setProperty('margin-left', '0', 'important');
177    listEl.style.setProperty('max-width', 'none', 'important');
178    listEl.style.setProperty('width', '100%', 'important');
179    listEl.style.setProperty('margin-right', '0', 'important');
180    listEl.style.setProperty('text-align', 'center', 'important');
181  });
182  var bulletItems = bundleModal.querySelectorAll(
183    '.productBundleBullets li, .c-cart__bundle--bullets li'
184  );
185  bulletItems.forEach(function(itemEl) {
186    itemEl.style.setProperty('list-style', 'none', 'important');
187    itemEl.style.setProperty('text-align', 'center', 'important');
188  });
189
190  var totals = bundleModal.querySelectorAll('.previewTotal, .cart_total_currency');
191  totals.forEach(function(el) {
192    el.style.setProperty('color', '#FFFFFF', 'important');
193  });
194
195  var footer = bundleModal.querySelector('.c-cart__footer');
196  if (footer) {
197    footer.style.setProperty('position', 'relative', 'important');
198    footer.style.setProperty('bottom', 'auto', 'important');
199    footer.style.setProperty('left', 'auto', 'important');
200    footer.style.setProperty('right', 'auto', 'important');
201    footer.style.setProperty('margin-top', '8px', 'important');
202    footer.style.setProperty('background', 'rgb(30 35 41)', 'important');
203    footer.style.setProperty('border', 'none', 'important');
204    footer.style.setProperty('border-radius', '10px', 'important');
205    footer.style.setProperty('padding', '14px 18px', 'important');
206    footer.style.setProperty('box-sizing', 'border-box', 'important');
207    footer.style.setProperty('max-width', '400px', 'important');
208    footer.style.setProperty('width', '100%', 'important');
209    footer.style.setProperty('margin-left', 'auto', 'important');
210    footer.style.setProperty('margin-right', 'auto', 'important');
211  }
212  var step2 = bundleModal.querySelector('.addToCartStep2');
213  if (step2) {
214    step2.style.setProperty('position', 'relative', 'important');
215    step2.style.setProperty('bottom', 'auto', 'important');
216    step2.style.setProperty('left', 'auto', 'important');
217    step2.style.setProperty('right', 'auto', 'important');
218    step2.style.setProperty('width', '100%', 'important');
219  }
220
221  var totalRow = bundleModal.querySelector('.c-cart__actions--total');
222  if (totalRow) {
223    totalRow.style.setProperty('color', '#E6EDF3', 'important');
224    totalRow.style.setProperty('display', 'flex', 'important');
225    totalRow.style.setProperty('justify-content', 'space-between', 'important');
226    totalRow.style.setProperty('align-items', 'center', 'important');
227    totalRow.style.setProperty('width', '100%', 'important');
228    totalRow.style.setProperty('box-sizing', 'border-box', 'important');
229    totalRow.style.setProperty('margin', '0 0 12px 0', 'important');
230    totalRow.style.setProperty('padding', '0', 'important');
231  }
232
233  var totalPriceWrap = bundleModal.querySelector(
234    '.c-cart__actions--total [data-toggle="modal"]'
235  );
236  if (totalPriceWrap) {
237    totalPriceWrap.style.setProperty('margin', '0', 'important');
238    totalPriceWrap.style.setProperty('padding', '0', 'important');
239    totalPriceWrap.style.setProperty('text-align', 'right', 'important');
240  }
241
242  var divider = bundleModal.querySelector('.c-cart__divider');
243  if (divider) {
244    divider.style.setProperty('display', 'none', 'important');
245  }
246
247  var ticketDropdowns = bundleModal.querySelectorAll(
248    '.bchTicketsRolesAmount, .c-cart__bundle--dropdown'
249  );
250  ticketDropdowns.forEach(function(selectEl) {
251    selectEl.style.setProperty('background', 'rgb(30 35 41)', 'important');
252    selectEl.style.setProperty('color', '#E6EDF3', 'important');
253    selectEl.style.setProperty('border', '1px solid rgba(255, 255, 255, 0.22)', 'important');
254    selectEl.style.setProperty('box-shadow', 'none', 'important');
255    selectEl.style.setProperty('border-radius', '8px', 'important');
256    selectEl.style.setProperty('font-weight', '600', 'important');
257
258    selectEl.querySelectorAll('option').forEach(function(optionEl) {
259      optionEl.style.setProperty('background', 'rgb(30 35 41)', 'important');
260      optionEl.style.setProperty('color', '#E6EDF3', 'important');
261    });
262  });
263
264  var addonCards = bundleModal.querySelectorAll('.addon-checks');
265  addonCards.forEach(function(card) {
266    card.style.setProperty('background', '#1E2329', 'important');
267    card.style.setProperty('border-color', '#444444', 'important');
268    card.style.setProperty('justify-content', 'center', 'important');
269    card.style.setProperty('text-align', 'center', 'important');
270  });
271  bundleModal
272    .querySelectorAll('.addon-checks .c-cart__upgrades--name, .addon-checks .c-cart__upgrades--subtitle, .addon-checks .c-cart__upgrades--pricing, .addon-checks label, .addon-checks p, .addon-checks div')
273    .forEach(function(el) {
274      el.style.setProperty('text-align', 'center', 'important');
275    });
276  var upgradesWrap = bundleModal.querySelector('.c-cart__upgrades');
277  if (upgradesWrap) {
278    upgradesWrap.style.setProperty('justify-content', 'center', 'important');
279    upgradesWrap.style.setProperty('width', 'auto', 'important');
280    upgradesWrap.style.setProperty('max-width', 'none', 'important');
281    upgradesWrap.style.setProperty('margin', '0 auto', 'important');
282  }
283  bundleModal
284    .querySelectorAll('.c-cart__line.c-cart__bundle--ticket-container')
285    .forEach(function(el) {
286      el.style.setProperty('justify-content', 'center', 'important');
287      el.style.setProperty('width', 'auto', 'important');
288      el.style.setProperty('max-width', 'none', 'important');
289      el.style.setProperty('margin', '0 auto', 'important');
290      el.style.setProperty('gap', '10px', 'important');
291    });
292
293  var ctaButton = bundleModal.querySelector('#add-to-cart-btn');
294  if (ctaButton) {
295    ctaButton.style.setProperty('background', '#7FD219', 'important');
296    ctaButton.style.setProperty('color', '#000000', 'important');
297    ctaButton.style.setProperty('border', '1px solid #ACFF45', 'important');
298    ctaButton.style.setProperty('font-weight', '700', 'important');
299    ctaButton.style.setProperty('width', '100%', 'important');
300    ctaButton.style.setProperty('max-width', '370px', 'important');
301    ctaButton.style.setProperty('margin', '0', 'important');
302    ctaButton.style.setProperty('box-sizing', 'border-box', 'important');
303  }
304
305  var ctaWrap = bundleModal.querySelector('.c-cart__cta');
306  if (ctaWrap) {
307    ctaWrap.style.setProperty('width', '100%', 'important');
308    ctaWrap.style.setProperty('margin', '0', 'important');
309    ctaWrap.style.setProperty('padding', '0', 'important');
310  }
311
312  var closeButton = bundleModal.querySelector('.desktopClose, .mobileClose');
313  if (closeButton) {
314    closeButton.style.setProperty('color', '#FFFFFF', 'important');
315  }
316}
317
318function getSchTicketOverhaulConfig() {
319  return window.schTicketSectionOverhaul2026Config || {};
320}
321
322function getSchPurchaseText(key, fallback, placeholders) {
323  var reviewedSources = {
324    'ticket.date_night.upsell_title': 'Enjoy special dates all year',
325    'ticket.date_night.upsell_copy': 'Get <strong>unlimited couples scavenger hunts</strong> for 2 people for one year for just <strong>{{delta}}</strong> more today.',
326    'ticket.date_night.upgrade': 'Upgrade to the Couples Annual Pass',
327    'ticket.date_night.keep_single': 'Keep one scavenger hunt',
328    'ticket.group.upsell_title': 'Enjoy scavenger hunts all year',
329    'ticket.group.upsell_copy': 'Upgrade to the annual pass for 6 players and enjoy <strong>unlimited scavenger hunts for one year</strong> for up to 6 people in over 3,000 locations for just <strong>{{delta}}</strong> more today.',
330    'ticket.group.upgrade': 'Upgrade to the Annual Pass',
331    'ticket.group.keep_single': 'Keep tickets for one scavenger hunt',
332    'price.item_total': 'Item Total',
333  };
334  var source = typeof translationOverridesUseExactPhrases !== 'undefined'
335    && translationOverridesUseExactPhrases
336    && reviewedSources[key]
337      ? reviewedSources[key]
338      : fallback;
339  var translated = typeof translateText === 'function'
340    ? translateText(source)
341    : source;
342
343  Object.entries(placeholders || {}
343).forEach(function (entry) {
344    translated = translated.split('{{' + entry[0] + '}}').join(entry[1]);
345  });
346
347  return translated;
348}
349
350function isSchTicketOverhaulLegacyTicket() {
351  var config = getSchTicketOverhaulConfig();
352  return !!(
353    config.enabled &&
354    current_product &&
355    Number(current_product.bundleId || 0) === Number(config.ticketBundleId || 0)
356  );
357}
358
359function getSchTicketOverhaulGroupUpsellMaximumQuantity() {
360  return 6;
361}
362
363var schTicketOverhaulDismissedUpsellForCurrentModal = null;
364var schTicketOverhaulModalSessionCounter = 0;
365
366function initializeSchTicketOverhaulModalDismissalSession() {
367  if (!isSchTicketOverhaulLegacyTicket()) {
368    return;
369  }
370
371  if (!current_product.schTicketOverhaulModalSessionId) {
372    schTicketOverhaulModalSessionCounter += 1;
373    current_product.schTicketOverhaulModalSessionId =
374      schTicketOverhaulModalSessionCounter;
375    schTicketOverhaulDismissedUpsellForCurrentModal = null;
376  }
377}
378
379function formatSchTicketOverhaulPrice(amount, wholeDollar) {
380  var parsedAmount = wholeDollar
381    ? Math.floor(Number(amount || 0))
382    : Number(amount || 0);
383  var formattedPrice =
384    typeof formatPrice === 'function'
385      ? formatPrice(parsedAmount, cy, true, false)
386      : '$' + parsedAmount.toFixed(2);
387
388  if (wholeDollar) {
389    return formattedPrice.replace(/([.,]00)(\D*)$/, '$2');
390  }
391
392  return formattedPrice;
393}
394
395function buildSchTicketOverhaulProductFromBundleId(bundleId) {
396  var bundle = getBundleInfo(bundleId) || {};
397  var product = getProductInfo(bundle.initial_product_id || 1) || {};
398  var quantity = Math.max(1, Number(bundle.initial_quantity || 1) || 1);
399
400  return {
401    bundleId: Number(bundle.id || bundleId),
402    productId: Number(bundle.initial_product_id || 1),
403    roleId: Number(bundle.initial_rid || 1),
404    quantity: quantity,
405    adultQuantity: quantity,
406    childQuantity: 0,
407    addons: bundle.initial_addons ? JSON.parse(bundle.initial_addons) : {},
408    location: bundle.location || null,
409    locationType: bundle.locationType || null,
410    isInlineBundle: bundle.isInlineBundle || false,
411    planId: product.plan_id || null,
412    v: '3.0.0',
413  };
414}
415
416function isSchTicketOverhaulDateNightSelected() {
417  var config = getSchTicketOverhaulConfig();
418  return !!(
419    isSchTicketOverhaulLegacyTicket() &&
420    Number(current_product.roleId || 0) === Number(config.dateNightRoleId || 4)
421  );
422}
423
424function shouldShowSchTicketOverhaulDateNightUpsell() {
425  return !!(
426    schTicketOverhaulDismissedUpsellForCurrentModal !== 'date-night' &&
427    isSchTicketOverhaulDateNightSelected() &&
428    Number(current_product.quantity || 0) === 2
429  );
430}
431
432function shouldShowSchTicketOverhaulGroupUpsell() {
433  return !!(
434    schTicketOverhaulDismissedUpsellForCurrentModal !== 'group' &&
435    isSchTicketOverhaulLegacyTicket() &&
436    Number(current_product.quantity || 0) >= 3 &&
437    Number(current_product.quantity || 0) <= getSchTicketOverhaulGroupUpsellMaximumQuantity()
438  );
439}
440
441function closeSchTicketOverhaulUpsellModal(dismissForCurrentModal) {
442  var modal = document.querySelector('.sch-ticket-overhaul-desktop-upsell');
443  if (modal) {
444    if (dismissForCurrentModal === true) {
445      schTicketOverhaulDismissedUpsellForCurrentModal = modal.dataset.upsellType || 'sch-ticket-overhaul';
446    }
447    modal.remove();
448  }
449}
450
451function addSchTicketOverhaulAnnualBundleToCart(bundleId) {
452  var annualPassProduct = buildSchTicketOverhaulProductFromBundleId(bundleId);
453  closeSchTicketOverhaulUpsellModal();
454  if (annualPassProduct) {
455    current_product.showBundle = false;
456    addToCart(false, annualPassProduct);
457  }
458}
459
460function addSchTicketOverhaulCurrentProductToCart() {
461  closeSchTicketOverhaulUpsellModal();
462  if (typeof UpgradeViewRender != 'undefined') {
463    current_product.showUpgrade = true;
464    var isPotentialUpgrade = UpgradeViewRender();
465    if (!isPotentialUpgrade) {
466      addToCart();
467    }
468    return;
469  }
470
471  addToCart();
472}
473
474function renderSchTicketOverhaulUpsellModal(options) {
475  closeSchTicketOverhaulUpsellModal();
476
477  var modal = renderHTML(`
478    <div class="sch-new-ticket-date-night-upsell sch-ticket-overhaul-desktop-upsell ${options.extraClass || ''}" data-upsell-type="${options.upsellType || 'sch-ticket-overhaul'}" role="dialog" aria-modal="true">
479      <div class="sch-new-ticket-date-night-upsell__overlay" aria-hidden="true"></div>
480      <div class="sch-new-ticket-date-night-upsell__panel">
481        <button class="sch-new-ticket-date-night-upsell__close" type="button" aria-label="Close"></button>
482        ${options.imageUrl ? `<img class="sch-new-ticket-date-night-upsell__image ${options.imageClass || ''}" src="${options.imageUrl}" alt="" loading="lazy" decoding="async">` : ''}
483        <h3 class="sch-new-ticket-date-night-upsell__title">${options.title}</h3>
484        <p class="sch-new-ticket-date-night-upsell__copy">${options.copy}</p>
485        <button class="sch-new-ticket-date-night-upsell__primary ${options.primaryClass || ''}" type="button">
486          ${options.primaryIcon || ''}<span>${options.primaryText}</span>
487        </button>
488        <button class="sch-new-ticket-date-night-upsell__secondary" type="button">${options.secondaryText}</button>
489      </div>
490    </div>
491  `);
492
493  modal.style.zIndex = '2147483647';
494  modal
495    .querySelectorAll('.sch-new-ticket-date-night-upsell__close')
496    .forEach(function (trigger) {
497      trigger.addEventListener('click', function () {
498        if (typeof options.onClose === 'function') {
499          options.onClose();
500          return;
501        }
502        closeSchTicketOverhaulUpsellModal(true);
503      });
504    });
505  modal
506    .querySelector('.sch-new-ticket-date-night-upsell__primary')
507    .addEventListener('click', options.onPrimary);
508  modal
509    .querySelector('.sch-new-ticket-date-night-upsell__secondary')
510    .addEventListener('click', options.onSecondary);
511  document.body.appendChild(modal);
512}
513
514function getSchTicketOverhaulBundleDelta(bundleId, wholeDollar) {
515  var targetProduct = buildSchTicketOverhaulProductFromBundleId(bundleId);
516  var targetTotal =
517    typeof calculateItemTotal === 'function'
518      ? Number(calculateItemTotal(targetProduct, cy, 'discounted') || 0)
519      : 0;
520  var currentTotal =
521    typeof calculateItemTotal === 'function'
522      ? Number(calculateItemTotal(current_product, cy, 'discounted') || 0)
523      : 0;
524
525  return formatSchTicketOverhaulPrice(
526    Math.max(0, targetTotal - currentTotal),
527    wholeDollar
528  );
529}
530
531function openSchTicketOverhaulDateNightUpsellModal() {
532  var config = getSchTicketOverhaulConfig();
533  var delta = getSchTicketOverhaulBundleDelta(
534    config.dateNightAnnualBundleId,
535    true
536  );
537  var heartIcon = `
538    <span class="sch-new-ticket-date-night-upsell__primary-icon" aria-hidden="true">
539      <svg viewBox="0 0 24 24" focusable="false">
540        <path fill="currentColor" d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41 0.81 4.5 2.08C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"></path>
541      </svg>
542    </span>`;
543
544  renderSchTicketOverhaulUpsellModal({
545    upsellType: 'date-night',
546    title: getSchPurchaseText('ticket.date_night.upsell_title', 'Make date night last <em>all year</em>'),
547    imageUrl: '/assets/images/store/bundles/date-night-annual-upsell-2026.png',
548    copy: getSchPurchaseText('ticket.date_night.upsell_copy', 'Get <strong>unlimited date night hunts</strong> <strong>for 2</strong> for a full year &mdash; for only <strong>{{delta}}</strong> more today.', { delta: delta }),
549    primaryText: getSchPurchaseText('ticket.date_night.upgrade', 'Upgrade to Date Night Pass'),
550    primaryIcon: heartIcon,
551    primaryClass: 'sch-new-ticket-date-night-upsell__primary--date-night',
552    secondaryText: getSchPurchaseText('ticket.date_night.keep_single', 'Keep the single hunt'),
553    onPrimary: function () {
554      addSchTicketOverhaulAnnualBundleToCart(config.dateNightAnnualBundleId);
555    },
556    onSecondary: addSchTicketOverhaulCurrentProductToCart,
557  });
558}
559
560function openSchTicketOverhaulGroupUpsellModal() {
561  var config = getSchTicketOverhaulConfig();
562  var delta = getSchTicketOverhaulBundleDelta(
563    config.groupAnnualBundleId,
564    false
565  );
566
567  renderSchTicketOverhaulUpsellModal({
568    upsellType: 'group',
569    extraClass: 'sch-new-ticket-group-upsell',
570    title: getSchPurchaseText('ticket.group.upsell_title', 'Make it a year of hunts'),
571    imageUrl: '/assets/images/store/bundles/group-annual-upsell-2026.png',
572    imageClass: 'sch-new-ticket-group-upsell__image',
573    copy: getSchPurchaseText('ticket.group.upsell_copy', 'Upgrade to a 6-Player Annual Pass and get <strong>unlimited hunts for a year</strong> for up to 6 people at 3000+ locations &mdash; for only <strong>{{delta}}</strong> more today.', { delta: delta }),
574    primaryText: getSchPurchaseText('ticket.group.upgrade', 'Upgrade to Annual Pass'),
575    primaryClass: 'sch-new-ticket-group-upsell__primary',
576    secondaryText: getSchPurchaseText('ticket.group.keep_single', 'Keep single-hunt tickets'),
577    onPrimary: function () {
578      addSchTicketOverhaulAnnualBundleToCart(config.groupAnnualBundleId);
579    },
580    onClose: addSchTicketOverhaulCurrentProductToCart,
581    onSecondary: addSchTicketOverhaulCurrentProductToCart,
582  });
583}
584
585var BundleModalRender = () => {
586  initializeSchTicketOverhaulModalDismissalSession();
587  var isInEdit =
588    cart.items &&
589    cart.items.length > 0 &&
590    (cart.editIndex || cart.editIndex === 0);
591
592  var BundleModalContainer = document.querySelector('#bundleModalContainer');
593
594  if (document.querySelector('#isInlineBundle') && !isInEdit) {
595    current_product.showBundle = 1;
596    current_product.isInlineBundle = true;
597  }
598
599  if (document.querySelector('#isInlineBundle') && isInEdit) {
600    if (current_product.showBundle) {
601      current_product.isInlineBundle = false;
602    } else {
603      cart.editIndex = null;
604    }
605  }
606
607  // Hide floating feedback button while Add To Cart bundle modal is open.
608  var feedbackButtons = document.querySelectorAll('.giftButton');
609  if (feedbackButtons && feedbackButtons.length > 0) {
610    feedbackButtons.forEach(function (button) {
611      if (button.dataset.originalDisplay === undefined) {
612        button.dataset.originalDisplay = button.style.display || '';
613      }
614      button.style.display = current_product.showBundle
615        ? 'none'
616        : button.dataset.originalDisplay;
617    });
618  }
619
620  if (!current_product.showBundle) {
621    return removeAllChildNodes(BundleModalContainer);
622  } else {
623    if (typeof logTempCart != 'undefined') {
624    }
625  }
626  var bundle = getBundleInfo(current_product.bundleId || 1) || {};
627  if (bundle.force_redirect) {
628    return (window.location.href = base_url(bundle.force_redirect));
629  }
630  var displayBundleTitle = bundle.title;
631  if ([1, 224, 307].includes(Number(bundle.id || 0))) {
632    displayBundleTitle = getSchPurchaseText('ticket.single.title', displayBundleTitle);
633  }
634
635  var product = getProductInfo(current_product.productId || 1);
636  console.log({ bundle, product });
637
638  if (!product || typeof product != 'object') {
639    current_product.showBundle = false;
640    feedbackButtons.forEach(function (button) {
641      button.style.display = button.dataset.originalDisplay || '';
642    });
643    console.warn('Bundle unavailable: matching product pricing is missing');
644    return removeAllChildNodes(BundleModalContainer);
645  }
646
647  if (product.product_price_low) {
648    if (current_product.quantity < 3) {
649      current_product.product_price_override = product.product_price_high;
650    } else if (current_product.quantity < 6) {
651      current_product.product_price_override =
652        product.product_price_high - (current_product.quantity - 2);
653    } else {
654      current_product.product_price_override = product.product_price_low;
655    }
656    current_product.product_discount =
657      product.product_price_high - current_product.product_price_override;
658    current_product.product_discount_formatted = getLocalPrice(
659      current_product.product_discount,
660      cy
661    );
662  }
663
664  // generating the bullets
665  var bullet_description = JSON.parse(bundle.bullet_description) || [];
666  if (
667    current_product.upgradeSale &&
668    current_product.upgradeSale.additional_bullet
669  ) {
670    bullet_description.unshift(current_product.upgradeSale.additional_bullet);
671  } else if (realDiscount > 0) {
672    bullet_description.push({
673      text: translatedCartDiscountHtml(realDiscount),
674    });
675  }
676  var bullets = '';
677  if (bundle.bullet_description) {
678    bullet_description.map(function (bullet, index) {
679      var bulletText = bullet.text || bullet;
680      if (
681        current_product.locationType == 'state' &&
682        !!current_product.location
683      ) {
684        bulletText = bulletText.replace(
685          'one state',
686          `${current_product.location} or one other state picked after purchase`
687        );
688      }
689      bullets =
690        bullets +
691        `<li style='${
692          !current_product.isInlineBundle ? 'list-style: disc;' : ''
693        }'>` +
694        bulletText;
695
696      if (bullet.info) {
697        bullets =
698          bullets +
699          `<svg id="bullets-${bundle.id}-${index}" 
700          bullets-${bundle.id}" data-tippy-content="${bullet.info}"
701          style="margin-right: 0px; width: 16pzx; height: 16px;" class="bchInfoIcon bundleInfoTooltip infoToolTip bullets-1" data-tippy-content="You need 1 ticket per person per hunt for outdoor hunts." aria-expanded="false" aria-hidden="true" focusable="false" data-prefix="fa" data-icon="info-circle" role="img" xmlns="https://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z"></path></svg>`;
702      }
703      bullets = bullets + '</li>';
704    });
705  }
706
707  var title, cta;
708  var discount = '';
709
710  if (isInEdit) {
711    title = getSchPurchaseText('cart.editing', 'Editing Item') + ' ' + displayBundleTitle;
712    cta = getSchPurchaseText('cart.edit_item', 'Edit Item');
713  } else if (current_product.upgradeSale) {
714    title = current_product.upgradeSale.title;
715    cta = current_product.upgradeSale.cta;
716  } else {
717    title = '<span id="addToCartTitle">' + getSchPurchaseText('cart.adding', 'Adding To Cart:') + '</span> ' + displayBundleTitle;
718    cta = getSchPurchaseText('ticket.selector.add_to_cart', 'Add To Cart');
719  }
720
721  console.log({ current_product });
722  if (current_product.locationType == 'state' && !!current_product.location) {
723    title = title.replace('Single State', current_product.location);
724  }
725
726  var bundleTotal = formatPrice(
727    calculateItemTotal(current_product, cy, 'discounted'),
728    cy
729  );
730  // var
731
732  current_product.fullTotal = calculateItemTotal(current_product, cy, 'full');
733  current_product.regulartTotal = calculateItemTotal(
734    current_product,
735    cy,
736    'regular'
737  );
738  current_product.total = calculateItemTotal(current_product, cy, 'discounted');
739
740  var formattedTotal =
741    (product.trial_period_days && product.trial_period_days != '0'
742      ? `${product.trial_period_days} days free, then `
743      : '') +
744    bundleTotal +
745    (product.subscription_length ? ' / month' : '');
746
747  if (!product.subscription_length) {
748    var bundleUndiscounted = formatPrice(
749      calculateItemTotal(current_product, cy, 'full'),
750      cy
751    );
752    discount = `<span style="display: 'inline'"  class="c-cart__actions--total-undiscounted oldPreviewTotal hihihi" style="font-size: 13px !important;">${bundleUndiscounted}</span>`;
753  }
754
755  function handleBundleClose() {
756    if (!document.querySelector('#isInlineBundle')) {
757      current_product.showBundle = false;
758    } else {
759      setTimeout(function () {
760        current_product.showBundle = true;
761        current_product.isInlineBundle = true;
762        cart.editIndex = null;
763        navigateToBundle(Object.assign({}, initialBundle));
764      }, 500);
765    }
766    BundleModalRender();
767  }
768
769  const season_pass_length =
770    current_product.season_pass_length_override || bundle.season_pass_length;
771  const compactBundleModalIds = Array.isArray(window.compactBundleModalIds)
772    ? window.compactBundleModalIds.map(Number)
773    : [];
774  const isCompactDateNightBundle = compactBundleModalIds.includes(
775    Number(current_product.bundleId)
776  );
777
778  var BundleModal = renderHTML(`
779  <div class="${
780    !current_product.isInlineBundle
781      ? 'c-cart modal modalright modaldesktopcenter'
782      : 'inLineBundleContainer'
783  }" id="cartItem" style="display: block; ${
784    !current_product.isInlineBundle ? '' : 'margin: 0 auto;'
785  }" >
786   <div class="${
787     !current_product.isInlineBundle ? 'modal-dialog c-cart__modal' : ''
788   }" role="document" style="${
789    isCompactDateNightBundle ? 'min-height: auto !important;' : ''
790  }">
791   <div class="c-cart__left-panel">
792           <img
793             class="c-cart__left-image productBundleImage"
794             src="/assets/images/store/bundle_characters/${
795               bundle.image_characters
796             }"
797           />
798         </div>
799      <div  class="bundleMainContent ${
800        !current_product.isInlineBundle
801          ? 'c-cart__container modal-content'
802          : 'bundleContentWrapper'
803      }" style="padding:20px 15px;border-left:0;border-top:0; max-height: 90vh; ${
804    bundle.pass_product_options ? 'padding-bottom: 90px;' : ''
805  } ${isCompactDateNightBundle ? 'min-height: auto !important;' : ''}">
806         <div class="close c-cart__bundle--close desktopClose"><span aria-hidden="true">&times;</span></div>
807         <div class="c-cart__bundle--header desktopOnly"><span class="cartItemTitle">${title}</span></div>
808         <div class="c-cart__bundle--image-container">
809            <img  class="c-cart__bundle--image-mobile mobileHeader productBundleImage"
810            id="dasfsadfdsafdsaf"
811            style="width: 110px; height: 90px;"
812            src="${
813              '/assets/images/store/bundle_characters/' +
814              bundle.image_characters
815            }"
816            class="productBundleImage">
817            <div class="c-cart__bundle--header-mobile mobileHeader" style="display: flex;">
818               <div ><span class="cartItemTitle">${cta}</span></div>
819               <div class="mobileClose" style= "font-size: 27px; line-height: 27px; padding-left: 10px;"> &times;</div>
820            </div>
821         </div>
822         <span class="productBundleName c-cart__bundle--subtitle">${
823           displayBundleTitle
824         }</span>
825         <ul class="c-cart__bundle--bullets productBundleBullets">${bullets}</ul>
826         <div class="bundleHolder" style=""></div> 
827         <div class="c-cart__line c-cart__bundle--ticket-container" style="${
828           bundle.pass_product_options ? 'padding-bottom: 20px;' : ''
829         }"></div>
830         <div class="addToCartStep2" style="">
831            <div class="addUpgrades" style="">
832               <div class="c-cart__upgrades-title"></div>
833               <div class="c-cart__upgrades">
834               </div>
835            </div> 
836            
837            <div class='${
838              !current_product.isInlineBundle ? 'c-cart__footer' : ''
839            }'>
840
841
842            
843              
844            <div class='c-cart__divider' style="margin:0;margin-left: -30px; margin-right: -30px;"></div>
845
846             <div class="c-cart__actions--total c-cart__actions--total-extra-space">
847        
848                   
849              <b style="font-weight:500">${
850                !current_product.isInlineBundle
851                  ? getSchPurchaseText('price.total', 'Total') + ':'
852                  : getSchPurchaseText('price.item_total', 'Item Total') + ':'
853              }</b>
854                
855              
856                  <div data-toggle="modal" data-target="#change_currency">
857                     ${discount}
858                     <span class="c-cart__actions--total-amount previewTotal">${formattedTotal}</span>
859                     <span class="c-cart__actions--total-currency cart_total_currency" style="margin-left: 4px;">${cy}</span>
860                  </div>
861               </div>
862               <div class="c-cart__cta">
863                  <button id="add-to-cart-btn" type="button" class="c-cart__cta--button btn btn-success btn-block btn-lg addToCart">${cta}</button>
864               </div>
865               
866            </div>
867         </div>
868      </div>
869   </div>
870  </div> 
871  `);
872
873  // adding bundle options
874  // if they exist
875  if (bundle.pass_product_options) {
876    const passProductOptions = JSON.parse(bundle.pass_product_options);
877
878    const passOptionsHolder = renderHTML(
879      `<div>
880        <div style="font-weight: 800; margin-bottom: 10px;">${
881          passProductOptions[0].main_title
882        } 
883      <span> </span><div class=\"tooltip\"><svg style=\"margin-right: 0px; width: 16px; height: 16px;\" role=\"img\" xmlns=\"https://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"></path></svg>
884    <span class=\"tooltiptext\">${passProductOptions[0].main_info}</span>
885  </div>
886      </div>
887        <div 
888          class="passOptionsHolderFlex" 
889          style="display: flex; min-height: 50px; margin-top: 0px; margin-left: 3px;
890          ">
891        </div>
892        ${
893          !season_pass_length
894            ? `<div style="font-weight: 800; margin-top: 10px; margin-bottom: 10px;">Number Of Players: <span> </span><div class=\"tooltip\"><svg style=\"margin-right: 0px; width: 16px; height: 16px;\" role=\"img\" xmlns=\"https://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"></path></svg>
895            <span class=\"tooltiptext\">For individual hunt tickets you need 1 ticket per hunt per person. Consider the annual pass to get unlimited hunts for either 2 or 6 people for 1 year.</span> </div>`
896            : `<div><div style="font-weight: 800; margin-top: 10px; margin-bottom: 0px;"><div style="font-weight: 800; margin-top: 10px; margin-bottom: 0px;">Number Of Players <span> </span><div class=\"tooltip\"><svg style=\"margin-right: 0px; width: 16px; height: 16px;\" role=\"img\" xmlns=\"https://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"></path></svg>
897            <span class=\"tooltiptext\">The annual pass give you unlimited hunts for one pass holder plus friends for exploring the world.</span> </div></div>
898            <div style="margin-top: 20px; margin-bottom: 30px;">Annual Pass includes unlimited scavenger hunts for up to ${
899              current_product.season_pass_players_override - 1
900            } players playing together. Save and go on unlimited scavenger hunts in 1,000+ locations around the world. Also buy a second annual pass for an extra $5 off.</div>
901            </div>`
902        }
903      </div>`
904    );
905    passProductOptions.map(function (passOption, index) {
906      var priceDisplay = `${getLocalPrice(
907        passOption.show_per_player
908          ? passOption.product_price ||
909              passOption.bundle_price / passOption.season_pass_players
910          : passOption.bundle_price - bundle.bundle_price,
911        cy
912      )}`;
913      if (passOption.product_price_low) {
914        priceDisplay = `${getLocalPrice(passOption.product_price_low, cy)}`;
915      }
916
917      const selected = (current_product.selectedIndex || 0) == index;
918      console.log({ selected, bundle, passOption });
919      const passOptionButton = renderHTML(`
920      <div style="text-align: center; flex: 1; max-width:160px; background: ${
921        selected ? '#53A6C455' : 'white'
922      }; border: 1px solid ${
923        selected ? '#53A6C4' : 'var(--gray1)'
924      }; cursor: pointer;" class="h-padding--5 h-padding__t--10 h-padding__b--10  h-padding-m--0 h-padding-m__t--5 h-padding-m__b--5" >
925        <div class="h-size--14 h-size-m--12" style="font-weight: bold;min-height: 30px;">${
926          passOption.title
927        }</div>
928        ${
929          passOption.show_per_player
930            ? `<div class="h-size--14 h-size-m--12"> ${
931                passOption.season_pass_players
932                  ? `Up to ${passOption.season_pass_players} Players`
933                  : 'Individual Tickets'
934              }</div>`
935            : ''
936        }
937        <div class="h-size--12 h-size-m--12" style="font-weight: 600;"  >
938          ${priceDisplay}
939          / ${passOption.show_per_player ? 'player' : 'pass'} ${
940        passOption.product_price_low ? '& up' : ''
941      }
942        </div>
943       
944      </div>
945    `);
946
947      passOptionButton.onclick = function () {
948        current_product.bundle_price_override = passOption.bundle_price;
949        current_product.selectedIndex = index;
950        current_product.season_pass_length_override =
951          passOption.season_pass_length;
952        current_product.season_pass_players_override =
953          passOption.season_pass_players;
954
955        current_product.bundleIdOverride = passOption.bundleIdOverride;
956
957        BundleModalRender();
958      };
959
960      passOptionsHolder
961        .querySelector('.passOptionsHolderFlex')
962        .appendChild(passOptionButton);
963    });
964    BundleModal.querySelector('.bundleHolder').appendChild(passOptionsHolder);
965    BundleModal.querySelector('.c-cart__upgrades-title').appendChild(
966      renderHTML(
967        current_product.isInlineBundle
968          ? `<div style="font-weight: 800; margin-top: 10px; margin-bottom: 10px;">Upgrade Options: <div class=\"tooltip\"><svg style=\"margin-right: 0px; width: 16px; height: 16px;\" role=\"img\" xmlns=\"https://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"></path></svg>
969          <span class=\"tooltiptext\">Add bonus themes to make your adventure even more fun (included with the annual pass)</span> </div></div>`
970          : ' <div style="font-weight: 800; margin-top: 10px; margin-bottom: 10px;">Upgrade Options:</div>'
971      )
972    );
973  }
974
975  //adding the addons section
976  var AddonsAndUpgradesSectionView = AddonsAndUpgradesSection(bundle);
977  console.log({ AddonsAndUpgradesSectionView });
978  var hideAddonsAndUpgrades =
979    current_product.upgradeSale &&
980    current_product.upgradeSale.hideAddonsAndUpgrades;
981  if (getCookie(`STORE_TICKETS`) == '1') {
982    hideAddonsAndUpgrades = true;
983  }
984  if (AddonsAndUpgradesSectionView && !hideAddonsAndUpgrades) {
985    BundleModal.querySelector('.c-cart__upgrades').append(
986      AddonsAndUpgradesSectionView
987    );
988  }
989
990  // showing or hiding the tickets section
991  var hasFixedBundlePrice =
992    bundle.bundle_price_id ||
993    bundle.bundle_price_override ||
994    current_product.season_pass_length_override ||
995    bundle.bundle_price;
996  if (!product.subscription_length && !hasFixedBundlePrice) {
997    BundleModal.querySelector('.c-cart__bundle--ticket-container').appendChild(
998      BundleTicketSectionView(bundle)
999    );
1000  } else {
1001    BundleModal.querySelector(
1002      '.c-cart__bundle--ticket-container'
1003    ).style.display = 'none';
1004  }
1005  BundleModal.querySelector('.desktopClose').onclick = function (e) {
1006    e.preventDefault();
1007    handleBundleClose();
1008  };
1009  BundleModal.querySelector('.mobileClose').onclick = function (e) {
1010    e.preventDefault();
1011    handleBundleClose();
1012  };
1013
1014  var ctaButton = BundleModal.querySelector('.addToCart');
1015  ctaButton.onclick = function (e) {
1016    e.preventDefault();
1017    if (shouldShowSchTicketOverhaulDateNightUpsell()) {
1018      openSchTicketOverhaulDateNightUpsellModal();
1019      return;
1020    }
1021    if (shouldShowSchTicketOverhaulGroupUpsell()) {
1022      openSchTicketOverhaulGroupUpsellModal();
1023      return;
1024    }
1025    if (current_product.upgradeSale) {
1026      ctaButton.classList.add('lr-btn--loading');
1027      ctaButton.disabled = true;
1028      if (
1029        current_product.upgradeSale.upgrade_type ==
1030        'b2c_web_sale_duplicate_upgrade'
1031      ) {
1032        return submitDuplicateOrder(current_product.upgradeSale.tnid);
1033      }
1034      if (current_product.upgradeSale.upgrade_type == 'add_players') {
1035        return submitAddPlayers(
1036          current_product.upgradeSale.tnid,
1037          current_product.upgradeSale.vnid,
1038          current_product.upgradeSale.oldPlayers
1039        );
1040      }
1041    }
1042
1043    // CHECKING IF UGRADE
1044    if (typeof UpgradeViewRender != 'undefined') {
1045      current_product.showUpgrade = true;
1046      var isPotentialUpgrade = UpgradeViewRender();
1047
1048      if (!isPotentialUpgrade) {
1049        addToCart();
1050      }
1051
1052      // REGULAR ADD TO CART
1053    } else {
1054      addToCart();
1055    }
1056  };
1057
1058  BundleModal.onclick = function (event) {
1059    if (event.target.id == 'cartItem') {
1060      console.log('closing Bundle Modal');
1061      handleBundleClose();
1062    }
1063  };
1064
1065  // if (BundleModalContainer.firstChild) {
1066  //   var CurrentBundleModal = BundleModalContainer.firstChild;
1067  //   // console.log('merging dom', { CurrentBundleModal, BundleModal });
1068
1069  //   morphdom(CurrentBundleModal, BundleModal);
1070  //   // removeAllChildNodes(BundleModalContainer);
1071  //   // BundleModalContainer.append(BundleModal);
1072  // } else {
1073  removeAllChildNodes(BundleModalContainer);
1074  BundleModalContainer.append(BundleModal);
1075  applyGhostThemeToLegacyBundleModal(BundleModal);
1076
1077  console.log({ BundleModal });
1078  BundleModalContainer.querySelector('.bundleMainContent').onclick =
1079    function () {
1080      if (!hasLoggedBundleInteract && typeof fb_track_safe != 'undefined') {
1081        hasLoggedBundleInteract = 1;
1082        fb_track_safe('track', 'BundleInteract');
1083      }
1084    };
1085  // }
1086  // adding tooltips
1087  if (typeof safeTippy != 'undefined') {
1088    safeTippy(`.infoToolTip`, {
1089      appendTo: 'parent',
1090      interactive: true,
1091      inlinePositioning: true,
1092    });
1093  }
1094
1095  // console.log('hello');
1096
1097  return BundleModal;
1098};
1099
1100var BundleTicketSectionView = function (bundle) {
1101  // generating the ticket options
1102  var product = getProductInfo(current_product.productId);
1103  if (!product || typeof product != 'object') {
1104    return '';
1105  }
1106  var ticketsOptions = '';
1107  var quantity = parseInt(`${current_product.quantity}`);
1108  var maximumQuantity = 10;
1109  var x = 1;
1110  var ticketQuantityLabel = product.unit || 'Ticket';
1111  while (x <= maximumQuantity) {
1112    ticketsOptions += `
1113    <option
1114      style="height: 38px !important;"
1115      class="playerSelect"
1116      value=${x}
1117      ${x == quantity ? 'selected' : ''}
1118    >
1119      ${x} ${translatedQuantityUnit(ticketQuantityLabel, x)}
1120    </option>
1121    `;
1122    x += 1;
1123  }
1124
1125  // getting the tickets prices
1126
1127  var role = getRoleInfo(current_product.roleId);
1128  var { product_price } = product;
1129  var { role_price } = role;
1130  var totalTicketPrice =
1131    parseFloat(current_product.product_price_override || product_price) +
1132    parseFloat(role_price);
1133  console.log({ totalTicketPrice, product_price, role_price });
1134  var ticketPriceBase =
1135    parseFloat(current_product.product_price_override || product_price) +
1136    parseFloat(role_price);
1137  var undiscountedTicketPriceBase =
1138    parseFloat(product_price) + parseFloat(role_price);
1139  var ticketPriceUnit = product.unit || 'Ticket';
1140  var ticketPrice = getLocalPrice(
1141    ticketPriceBase,
1142    cy,
1143    true,
1144    'discounted'
1145  );
1146  var undiscountedTicketPrice = getLocalPrice(
1147    undiscountedTicketPriceBase,
1148    cy,
1149    true,
1150    'full'
1151  );
1152
1153  var BundleTicketSectionView = renderHTML(`
1154  <div class="c-cart__line c-cart__bundle--ticket-container" style="${
1155    bundle.pass_product_options ? 'padding-bottom: 0px;' : ''
1156  }">
1157    <div class="c-cart__bundle--tickets">
1158      <div class="cartSubtractPlayers">
1158<svg style="width: 20px; height: 20px;" class="c-cart__bundle--tickets-button c-cart__bundle--tickets-button-minus" aria-hidden="true" focusable="false" data-prefix="fa" data-icon="minus-circle" role="img" xmlns="https://www.w3.org/2000/svg" viewBox="0 0 512 512" ><path fill="currentColor" d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zM124 296c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h264c6.6 0 12 5.4 12 12v56c0 6.6-5.4 12-12 12H124z"></path></svg></div>
1159      <select class="form-control c-cart__bundle--dropdown bchTicketsRolesAmount" style="height: 38px !important;     padding-left: 25px; margin-bottom: 0px !important;">
1160        <option id="player-option-0" style="height: 38px !important;" class="playerSelect" disabled value=0>${getSchPurchaseText('ticket.selector.select_number', 'Select # of Tickets')}</option>
1161        ${ticketsOptions}
1162      </select>
1163      <div class="cartAddPlayers"><svg class="svg-inline--fa c-cart__bundle--tickets-button c-cart__bundle--tickets-button-plus" aria-hidden="true" focusable="false" data-prefix="fa" style="width: 20px; height: 20px;" data-icon="plus-circle" role="img" xmlns="https://www.w3.org/2000/svg" viewBox="0 0 512 512" ><path fill="currentColor" d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm144 276c0 6.6-5.4 12-12 12h-92v92c0 6.6-5.4 12-12 12h-56c-6.6 0-12-5.4-12-12v-92h-92c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h92v-92c0-6.6 5.4-12 12-12h56c6.6 0 12 5.4 12 12v92h92c6.6 0 12 5.4 12 12v56z"></path></svg></div>
1164    </div>
1165    
1166    <div class="c-cart__bundle--prices" style="text-align: right;">
1167      <div>
1168        <span  style='display: inline' class='c-cart__bundle--regularTicketPrice cartCombinedUndiscountedTicketPrice'>${undiscountedTicketPrice}</span>&nbsp;<span class="c-cart__bundle--ticketPrice" style="${
1169    current_product.product_price_override ? 'color: black;' : ''
1170  }"><span style="${
1171    current_product.product_price_override ? 'color: black;' : ''
1172  }" class="cartCombinedTicketPrice">${ticketPrice}</span>/ <span   style="${
1173    current_product.product_price_override ? 'color: black;' : ''
1174  }" class="cartUnit">${ticketPriceUnit}</span></span>
1175  
1176      </div>
1177    </div>
1178  </div>
1179  `);
1180
1181  BundleTicketSectionView.querySelector('.cartSubtractPlayers').onclick =
1182    function (e) {
1183      e.preventDefault();
1184      subtractPlayer();
1185    };
1186
1187  BundleTicketSectionView.querySelector('.bchTicketsRolesAmount').onchange =
1188    function (e) {
1189      e.preventDefault();
1190      current_product.quantity = parseInt(
1191        `${document.querySelector('.bchTicketsRolesAmount').value}`
1192      );
1193      current_product.adultQuantity = current_product.quantity;
1194
1195      BundleModalRender();
1196    };
1197
1198  BundleTicketSectionView.querySelector('.cartAddPlayers').onclick = function (
1199    e
1200  ) {
1201    e.preventDefault();
1202    addPlayer();
1203  };
1204
1205  return BundleTicketSectionView;
1206};
1207
1208function subtractPlayer() {
1209  current_product.quantity = Math.max(
1210    parseInt(`${current_product.quantity}`) - 1,
1211    1
1212  );
1213  current_product.adultQuantity = current_product.quantity;
1214  BundleModalRender();
1215}
1216
1217function addPlayer() {
1218  current_product.quantity = Math.min(
1219    parseInt(`${current_product.quantity}`) + 1,
1220    10
1221  );
1222  current_product.adultQuantity = current_product.quantity;
1223  BundleModalRender();
1224}
1225
1226var AddonsAndUpgradesSection = (bundle) => {
1227  var AddonsAndUpgradesSection = document.createElement('div');
1228  AddonsAndUpgradesSection.style.display = 'flex';
1229  AddonsAndUpgradesSection.style.flexDirection = 'column';
1230
1231  // handling adddons
1232  var possibleAddons = bundle.possible_addons;
1233
1234  if (possibleAddons) {
1235    possibleAddons = JSON.parse(possibleAddons);
1236  } else {
1237    return console.log('no addons');
1238  }
1239  console.log({ possibleAddons });
1240
1241  // handling theme upgrades
1242  var possibleRoleUpgrades = bundle.possible_role_upgrades;
1243
1244  console.log({ possibleRoleUpgrades });
1245  if (possibleRoleUpgrades) {
1246    possibleRoleUpgrades = JSON.parse(possibleRoleUpgrades);
1247
1248    possibleRoleUpgrades.map((roleId) => {
1249      if (current_product.season_pass_length_override) {
1250        return;
1251      }
1252      var role = getRoleInfo(roleId);
1253      console.log({ role, current_product });
1254      var selected = current_product.roleId == roleId;
1255      AddonsAndUpgradesSection.append(
1256        AddonOrUpgrade({
1257          title: typeof translationOverridesUseExactPhrases !== 'undefined'
1258            && translationOverridesUseExactPhrases
1259            && role.id == 4
1260            && typeof translateText === 'function'
1261            ? translateText('Date Night Upgrade')
1262            : role.name,
1263          image: '/' + (role.image || '').replace('images/', 'images/store/'),
1264          price: role.role_price,
1265          selected,
1266          addonId: role.id,
1267          addonOrUpgradeOnClick: function (e) {
1268            console.log('addon clicked');
1269            toggleCurrentProductRoleUpgrade(role.id);
1270          },
1271          long_description: role.long_description,
1272          perPerson: true,
1273        })
1274      );
1275    });
1276  } else {
1277    console.log('no role upgrades');
1278  }
1279
1280  //rendering addons
1281  var selectedAddons = current_product.addons
1282    ? Object.keys(current_product.addons)
1283    : [];
1284
1285  possibleAddons.map((addonId) => {
1286    var addon = getAddonInfo(addonId);
1287    if (!!parseInt(addon.us_only) && cy != 'usd') {
1288      return console.log(addon, 'addon is us only');
1289    }
1290    console.log({ addon, selectedAddons });
1291    var selected = selectedAddons.includes(`${addon.id}`);
1292
1293    var addonPrice = addon.addon_price;
1294    if (campaignDiscounts && campaignDiscounts[`addon-${addonId}`]) {
1295      addonPrice =
1296        (1 - parseFloat(campaignDiscounts[`addon-${addonId}`].value)) *
1297        addonPrice;
1298      if (isNaN) {
1299        addonPrice = 0;
1300      }
1301    }
1302
1303    var addonView = AddonOrUpgrade({
1304      title: typeof translationOverridesUseExactPhrases !== 'undefined'
1305        && translationOverridesUseExactPhrases
1306        && addon.id == 4
1307        && typeof translateText === 'function'
1308        ? translateText('Date Night Upgrade')
1309        : addon.name,
1310      image: '/' + (addon.photo_url || '').replace('images/', 'images/store/'),
1311      price: addonPrice,
1312      selected,
1313      long_description: addon.long_description,
1314      addonId: addon.id,
1315      addonOrUpgradeOnClick: function (e) {
1316        toggleCurrentProductAddon(addon.id);
1317      },
1318      perPerson: !!addon.per_unit && addon.per_unit != '0',
1319    });
1320    console.log({ addonView });
1321    AddonsAndUpgradesSection.append(addonView);
1322  });
1323
1324  return AddonsAndUpgradesSection;
1325};
1326
1327var AddonOrUpgrade = (formattedInfo) => {
1328  var {
1329    addonId,
1330    selected,
1331    long_description,
1332    addonOrUpgradeOnClick,
1333    image,
1334    title,
1335    price,
1336    perPerson,
1337  } = formattedInfo;
1338  var unit = '';
1339  if (perPerson) {
1340    unit = getSchPurchaseText('price.per_person', 'per person');
1341  } else if (addonId == 8) {
1342    unit = 'S&amp;H';
1343  }
1344
1345  var zeroFix = price == Math.round(price) ? '.00' : '';
1346  var formattedPrice = !!(price * 1)
1347    ? `<span class="autoUpdateCurrency" data-price="${price}">${formatPrice(
1348        price,
1349        cy
1350      )}${zeroFix}</span>`
1351    : 'Free Upgrade';
1352  console.log(`AddonOrUpgrade`, { price });
1353  var AddonOrUpgrade = renderHTML(`
1354  <div class="addon-checks upgrade-${addonId} c-cart__upgrades--container" style="${
1355    addonId == 57 ? 'order: -1' : ''
1356  }">
1357   <div style="display: flex; align-items: center; min-height: 70px; max-height: 83px;">
1358      <input style="margin-left: 0px;" type="checkbox" class="addon-check-input c-cart__upgrades--input" ${
1359        selected ? 'checked' : ''
1360      }>
1361   </div>
1362   <label for="">
1363   <img class="c-cart__upgrades--img" style="
1364      min-width: 100px; width: 100px; 
1365      min-height: 72px; height: 72px; ;"
1366      src="${image}">
1367   </label>
1368   <div>
1369      <div class="c-cart__upgrades--name">
1370        ${title}
1371      </div>
1372      <div class="bchRolePrices" style="letter-spacing: -0.5px; word-spacing: -0.5px; margin-top: 5px;">
1373         <span class="c-cart__upgrades--pricing">
1374         <span style="" for="">+</span> <span>
1375         <label style="" for="">${formattedPrice}</label>
1376         <label style="" for=""><small>${unit ? '&nbsp;' + unit : ''}</small></label>
1377         </span>
1378         </span>
1379         
1380         <svg data-tippy-content="${long_description}" id="bullets-1-3" style="margin-right: 0px; width: 16px; height: 16px;" class="bchInfoIcon bundleInfoTooltip infoToolTip bullets-1" data-tippy-content="You need 1 ticket per person per hunt for outdoor hunts." aria-expanded="false" aria-hidden="true" focusable="false" data-prefix="fa" data-icon="info-circle" role="img" xmlns="https://www.w3.org/2000/svg" viewBox="0 0 512 512" ><path fill="currentColor" d="M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z"></path></svg>
1381        </div>
1382      </div>
1383   </div>
1384</div>
1385  `);
1386
1387  AddonOrUpgrade.querySelector('.c-cart__upgrades--img').onclick = function () {
1388    addonOrUpgradeOnClick(event);
1389  };
1390  AddonOrUpgrade.querySelector('input').onclick = function () {
1391    addonOrUpgradeOnClick(event);
1392  };
1393  AddonOrUpgrade.querySelector('.c-cart__upgrades--name').onclick =
1394    function () {
1395      addonOrUpgradeOnClick(event);
1396    };
1397
1398  setTimeout(function () {
1399    updateCurrencies();
1400  }, 50);
1401
1402  return AddonOrUpgrade;
1403};

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.