https://www.letsroam.com/assets/js/store/source/BundleView.js?cache_version=v12.2.6354ccd.1789030553
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 — 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 — 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">×</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;"> ×</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> <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&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 ? ' ' + 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.