1 <!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="utf-8"> 5 <meta name="author" content="Oude Kerk"> 6 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 7 <meta name="description" content="De Oude Kerk is het oudste nog bestaande gebouw van Amsterdam en bevindt zich aan het Oudekerksplein in het stadsdeel Amsterdam-Centrum. De kerk werd gewijd aan de heilige Nicolaas, bisschop van Myra, ten tijde van Guy van Avesnes, de bisschop van Utrecht."> 8 <meta name="keywords" content="Oude Kerk Amsterdam"> 9 <title>Oude Kerk</title> 10 <link rel="icon" href="https://cdn.booqi.app/static/images/86/69e766a782262.jpg" type="image/jpeg"> 11 <link rel="shortcut icon" href="https://cdn.booqi.app/static/images/86/69e766a782262.jpg" type="image/jpeg"> 12 <link href="/css/ui.css?v=16.4.12" rel="stylesheet" type="text/css"> 13 <link href="/css/wysiwyg/wysiwyg.css?v=16.4.12" rel="stylesheet" type="text/css"> 14
14<script type="0f1b92e37160e984b6cc3846-text/javascript" src="/js/bundle.js?v=16.4.12"></script>
14 15
15<script type="0f1b92e37160e984b6cc3846-text/javascript">window.dataLayer = window.dataLayer || [];</script>
15 16
16<script type="0f1b92e37160e984b6cc3846-text/javascript"> 17 window.Storefront = window.Storefront || {}; 18 window.Storefront.autoSkipSingleTimeslot = window.Storefront.autoSkipSingleTimeslot !== false; 19 window.Storefront.readyCallbacks = window.Storefront.readyCallbacks || []; 20 window.Storefront.ready = window.Storefront.ready || function (callback) { 21 this.readyCallbacks.push(callback); 22 }; 23 window.Storefront.get = window.Storefront.get || function (type) { 24 const key = String(type || '').toUpperCase(); 25 26 if (key === 'AUTO_SKIP_SINGLE_TIMESLOT') { 27 return window.Storefront.autoSkipSingleTimeslot; 28 } 29 30 if (key === 'LANGUAGE') { 31 const normalizeLanguage = (value) => String(value || '').toLowerCase().trim().slice(0, 2); 32 const storedLanguage = localStorage.getItem('storefront_language_explicit') === '1' 33 ? normalizeLanguage(localStorage.getItem('storefront_language')) 34 : ''; 35 const currentLanguage = normalizeLanguage('en'); 36 const defaultLanguage = normalizeLanguage('nl'); 37 38 return storedLanguage || currentLanguage || defaultLanguage || 'en'; 39 } 40 41 return null; 42 }; 43 window.Storefront.set = window.Storefront.set || function (type, value) { 44 const key = String(type || '').toUpperCase(); 45 46 if (key === 'AUTO_SKIP_SINGLE_TIMESLOT') { 47 window.Storefront.autoSkipSingleTimeslot = value !== false; 48 return window.Storefront.autoSkipSingleTimeslot; 49 } 50 51 if (key === 'LANGUAGE') { 52 const normalizedLanguage = String(value || '').toLowerCase().trim().slice(0, 2); 53 54 if (!normalizedLanguage) { 55 return null; 56 } 57 58 if (window.StorefrontLanguage && typeof window.StorefrontLanguage.select === 'function') { 59 return window.StorefrontLanguage.select(normalizedLanguage); 60 } 61 62 localStorage.setItem('storefront_language', normalizedLanguage); 63 localStorage.setItem('storefront_language_explicit', '1'); 64 document.cookie = `storefront_language=${normalizedLanguage}; path=/; max-age=31536000; samesite=lax`; 65 document.cookie = 'storefront_language_explicit=1; path=/; max-age=31536000; samesite=lax'; 66 window.location.reload(); 67 68 return normalizedLanguage; 69 } 70 71 return null; 72 }; 73 </script>
73 74 <style> 75 .skip-link { 76 position: absolute; 77 left: 1rem; 78 top: -4rem; 79 z-index: 2000; 80 padding: .75rem 1rem; 81 color: #fff; 82 background: #101924; 83 } 84 85 .skip-link:focus { 86 top: 1rem; 87 } 88 </style> 89 90 <link rel="stylesheet" href="/build/hashed.5a89d52a.css?v=16.4.12" type="text/css"></link> 91<link rel="stylesheet" href="/build/app.d2ba41b0.css?v=16.4.12" type="text/css"></link> 92
92<script src="/build/runtime.1ccf1c2b.js?v=16.4.12" defer="defer" type="0f1b92e37160e984b6cc3846-text/javascript"></script>
vendor: 1 bytes, line 92
92
93<script src="/build/hashed.c8f49be8.js?v=16.4.12" defer="defer" type="0f1b92e37160e984b6cc3846-text/javascript"></script>
vendor: 1 bytes, line 93
93
94<script src="/build/app.ee8a024a.js?v=16.4.12" defer="defer" type="0f1b92e37160e984b6cc3846-text/javascript"></script>
94 95 96 <style> 97 a:focus-visible, 98 button:focus-visible, 99 input:focus-visible, 100 select:focus-visible, 101 textarea:focus-visible, 102 [tabindex]:focus-visible { 103 box-shadow: 0 0 0 2px rgba(39, 40, 40, 1) !important; 104 background-color: rgb(237, 237, 237); 105 border-radius: 5px; 106 } 107 108 @media (prefers-reduced-motion: reduce) { 109 *, *::before, *::after { 110 animation-duration: .01ms !important; 111 animation-iteration-count: 1 !important; 112 scroll-behavior: auto !important; 113 transition-duration: .01ms !important; 114 } 115 } 116 </style> 117 118 119 <style type="text/css"> 120 121 :root { 122 --background: #f5f6fa; 123 --header-background: #000000; 124 --header-text: #FFFFFF; 125 --header-language-selector-background: #000000; 126 --header-language-selector-text: #FFFFFF; 127 --footer-background: #ffffff; 128 --footer-text: #000000; 129 --button: #000000; 130 --button-text: #FFFFFF; 131 --title: #292929; 132 --paragraph: #000000; 133 --item-text: #8091A7; 134 --gray: #8091A7; 135 --hyperlink: #000000; 136 137 --font-title: 'booqi-font-title', 'DM Sans', sans-serif; 138 --font-paragraph: 'booqi-font-paragraph', 'DM Sans', sans-serif; 139 140 --background-rgb: 245,246,250; 141 --header-background-rgb: 0,0,0; 142 --header-text-rgb: 255,255,255; 143 --footer-background-rgb: 255,255,255; 144 --footer-text-rgb: 0,0,0; 145 --button-rgb: 0,0,0; 146 --title-rgb: 41,41,41; 147 --paragraph-rgb: 0,0,0; 148 --item-text-rgb: 128,145,167; 149 --availability-high: 46,204,113; 150 --availability-medium: 241,196,15; 151 --availability-low: 231,76,60; 152 --passBack: ; 153 --passFront: ; 154 } 155 156 157 @font-face { 158 font-family: 'booqi-font-title'; 159 src: url('https://cdn.booqi.app/static/fonts/86/68b192a01f1a9.ttf'); 160 } 161 162 163 164 @font-face { 165 font-family: 'booqi-font-paragraph'; 166 src: url('https://cdn.booqi.app/static/fonts/86/68b192a4cd593.ttf'); 167 } 168 169 170 html, body, .nk-wrap { 171 font-family: var(--font-paragraph); 172 } 173 174 h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { 175 font-family: var(--font-title); 176 } 177 178 p, .paragraph { 179 font-family: var(--font-paragraph); 180 } 181 182 .btn { 183 font-family: var(--font-title); 184 } 185 186 .ff-base, .ff-alt, .card-subtitle { 187 font-family: var(--font-paragraph) !important; 188 } 189 190 .link, 191 .nav-tabs, 192 .nav-tabs .nav-link, 193 .nav-tabs-card, 194 .badge { 195 font-family: var(--font-title); 196 } 197 198 .select2-container--default .select2-selection--single, 199 .select2-container--default .select2-selection--multiple { 200 font-family: var(--font-paragraph); 201 } 202 203 .navbar { 204 background: var(--header-background); 205 } 206 207 .navbar * { 208 color: var(--header-text) !important; 209 } 210 211 #storefront-language-toggle, 212 #storefront-language-toggle:hover, 213 #storefront-language-toggle:focus, 214 #storefront-language-toggle:active, 215 #storefront-language-menu, 216 #storefront-language-menu .dropdown-item { 217 background-color: var(--header-language-selector-background) !important; 218 border-color: var(--header-language-selector-background) !important; 219 color: var(--header-language-selector-text) !important; 220 } 221 222 #storefront-language-toggle *, 223 #storefront-language-menu, 224 #storefront-language-menu * { 225 color: var(--header-language-selector-text) !important; 226 } 227 228 #storefront-language-toggle::after { 229 border-top-color: var(--header-language-selector-text) !important; 230 } 231 .storefront-language-nav { 232 flex-direction: row; 233 position: relative; 234 } 235 236 .storefront-language-nav .dropdown { 237 position: relative; 238 } 239 240 .storefront-language-nav .dropdown-menu { 241 left: auto; 242 max-height: 70vh; 243 min-width: max-content; 244 overflow-y: auto; 245 position: absolute; 246 right: 0; 247 top: 100%; 248 z-index: 1040; 249 } 250 251 @media (max-width: 991.98px) { 252 .storefront-language-nav { 253 margin-left: auto !important; 254 margin-right: 0 !important; 255 } 256 257 .storefront-language-nav .dropdown-menu { 258 float: none; 259 position: absolute; 260 transform: none; 261 } 262 } 263 264 #storefront-language-menu .dropdown-item:hover, 265 #storefront-language-menu .dropdown-item:focus, 266 #storefront-language-menu .dropdown-item.active { 267 background-color: var(--header-language-selector-background) !important; 268 } 269 270 body, .nk-wrap { 271 background: var(--background); 272 } 273 274 .nk-footer { 275 background: var(--footer-background); 276 } 277 278 .nk-footer * { 279 color: var(--footer-text) !important; 280 } 281 282 .btn, 283 .btn:hover, 284 .btn:focus, 285 .btn:active, 286 .btn:disabled { 287 background-color: var(--button); 288 border-color: var(--button); 289 color: var(--button-text); 290 } 291 292 .btn-primary:not(:disabled):not(.disabled):active { 293 background-color: rgb(var(--button-rgb), 0.6); 294 border-color: var(--button); 295 } 296 297 /* Semantic buttons used for link-like storefront actions keep the original visual treatment. */ 298 .back-to,
299 .wysiwyg-readmore, 300 .card-footer > button { 301 appearance: none; 302 background: transparent; 303 border: 0; 304 color: inherit; 305 cursor: pointer; 306 font: inherit; 307 padding: 0; 308 } 309 310 .back-to { 311 align-items: center; 312 display: inline-flex; 313 } 314 315 .card-footer > button { 316 width: 100%; 317 } 318 319 h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6, .title { 320 color: var(--title) !important; 321 } 322 323 .paragraph { 324 color: var(--paragraph) !important; 325 } 326 327 .text-soft, 328 .text-gray, 329 .text-muted { 330 color: var(--item-text, #8091A7) !important; 331 } 332 333 334</style> 335</head> 336<body class="nk-body bg-lighter npc-general has-sidebar no-touch nk-nio-theme" data-route="store_index"> 337 338<a class="skip-link" href="#main-content">Skip to main content</a> 339<div class="nk-app-root"> 340 <div class="nk-main"> 341 <main id="main-content" tabindex="-1"> 342 <div class="nk-wrap"> 343 344 345 346<nav class="navbar navbar-expand-lg navbar-light" aria-label="Primary navigation"> 347 <a href="/"> 348 <img src="https://cdn.booqi.app/static/images/86/69e766974e84b.png" style="max-height: 52px; margin-right: 15px;" alt="Logo"> 349 </a> 350 <div class="navbar-nav storefront-language-nav ml-auto mr-2"> 351 <div class="dropdown"> 352 <button id="storefront-language-toggle" class="btn btn-sm dropdown-toggle" type="button" data-language-current="en" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 353 <img class="translation-language-flag-image" style="width: 20px; height: 20px; border-radius: 50%; object-fit: cover;" src="https://hatscripts.github.io/circle-flags/flags/gb.svg" alt="" aria-hidden="true" loading="lazy" decoding="async"> 354 <span class="ml-2">English</span> 355 </button> 356 <div class="dropdown-menu dropdown-menu-right" id="storefront-language-menu" role="menu" aria-label="Choose language"> 357 <button type="button" class="dropdown-item storefront-language-item" data-language="nl" role="menuitem" aria-label="Nederlands"> 358 <img class="translation-language-flag-image" style="width: 20px; height: 20px; border-radius: 50%; object-fit: cover;" src="https://hatscripts.github.io/circle-flags/flags/nl.svg" alt="" aria-hidden="true" loading="lazy" decoding="async"> 359 <span class="ml-2">Nederlands</span> 360 </button> 361 <button type="button" class="dropdown-item storefront-language-item" data-language="de" role="menuitem" aria-label="Deutsch"> 362 <img class="translation-language-flag-image" style="width: 20px; height: 20px; border-radius: 50%; object-fit: cover;" src="https://hatscripts.github.io/circle-flags/flags/de.svg" alt="" aria-hidden="true" loading="lazy" decoding="async"> 363 <span class="ml-2">
363Deutsch</span> 364 </button> 365 <button type="button" class="dropdown-item storefront-language-item" data-language="en" role="menuitem" aria-label="English"> 366 <img class="translation-language-flag-image" style="width: 20px; height: 20px; border-radius: 50%; object-fit: cover;" src="https://hatscripts.github.io/circle-flags/flags/gb.svg" alt="" aria-hidden="true" loading="lazy" decoding="async"> 367 <span class="ml-2">English</span> 368 </button> 369 <button type="button" class="dropdown-item storefront-language-item" data-language="fr" role="menuitem" aria-label="Français"> 370 <img class="translation-language-flag-image" style="width: 20px; height: 20px; border-radius: 50%; object-fit: cover;" src="https://hatscripts.github.io/circle-flags/flags/fr.svg" alt="" aria-hidden="true" loading="lazy" decoding="async"> 371 <span class="ml-2">Français</span> 372 </button> 373 <button type="button" class="dropdown-item storefront-language-item" data-language="it" role="menuitem" aria-label="Italiano"> 374 <img class="translation-language-flag-image" style="width: 20px; height: 20px; border-radius: 50%; object-fit: cover;" src="https://hatscripts.github.io/circle-flags/flags/it.svg" alt="" aria-hidden="true" loading="lazy" decoding="async"> 375 <span class="ml-2">Italiano</span> 376 </button> 377 <button type="button" class="dropdown-item storefront-language-item" data-language="es" role="menuitem" aria-label="Español"> 378 <img class="translation-language-flag-image" style="width: 20px; height: 20px; border-radius: 50%; object-fit: cover;" src="https://hatscripts.github.io/circle-flags/flags/es.svg" alt="" aria-hidden="true" loading="lazy" decoding="async"> 379 <span class="ml-2">Español</span> 380 </button> 381 </div> 382 </div> 383 </div> 384 </nav> 385 <div class="nk-content"> 386 <div class="container-fluid"> 387 <div class="nk-content-inner"> 388 <div class="nk-content-body"> 389 <div class="content-page wide-md m-auto"> 390 <div class="nk-block"> 391 <div id="app"></div> 392 </div> 393 </div> 394 </div> 395 </div> 396 </div> 397 </div> 398 <div class="nk-footer"> 399 <div class="container-fluid"> 400 <div class="nk-footer-wrap d-flex flex-column flex-md-row align-items-center justify-content-between text-center text-md-left"> 401 <div class="nk-footer-copyright mb-2 mb-md-0"> 402 © 2026 Oude Kerk 403 </div> 404 <nav class="nk-footer-links" aria-label="Footer navigation"> 405 406 <ul class="nav nav-sm d-flex flex-wrap justify-content-center justify-content-md-end mb-0" data-storefront-legal-documents> 407 <li class="nav-item" data-storefront-legal-document> 408 <a class="nav-link py-1 px-2" href="https://oudekerk.nl/cookies" target="_blank" rel="noopener noreferrer"> 409 Terms and conditions 410 </a> 411 </li> 412 <li class="nav-item" data-storefront-legal-document> 413 <a class="nav-link py-1 px-2" href="https://oudekerk.nl/privacy-policy" target="_blank" rel="noopener noreferrer"> 414 Privacy policy 415 </a> 416 </li> 417 </ul> 418 </nav> 419 </div> 420 </div> 421</div> 422 </div> 423 424</main> 425 </div> 426</div> 427 428 <div class="modal" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="order-failed-title" id="order_failed"> 429 <div class="modal-dialog" role="document"> 430 <div class="modal-content"> 431 <div class="modal-body modal-body-lg text-center"> 432 <div class="nk-modal"> 433 <em class="nk-modal-icon icon icon-circle icon-circle-xxl ni ni-cross bg-danger"></em> 434 <h4 class="nk-modal-title" id="order-failed-title">Failed to create order!</h4> 435 <div class="nk-modal-text"> 436 <p class="lead">Oops, your order failed to create. You can try again.</p> 437 <p class="text-soft">Error message:
438 <span id="order_error_message" class="d-block mt-1"></span></p> 439 </div> 440 <div class="nk-modal-action mt-5"> 441 <button type="button" class="btn btn-lg btn-mw btn-light" 442 data-dismiss="modal">Try again</button> 443 </div> 444 </div> 445 </div> 446 </div> 447 </div> 448 </div> 449 450 <div class="modal" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="reservation-cancelled-title" id="reservation_cancelled"> 451 <div class="modal-dialog" role="document"> 452 <div class="modal-content"> 453 <div class="modal-body modal-body-lg text-center"> 454 <div class="nk-modal"> 455 <em class="nk-modal-icon icon icon-circle icon-circle-xxl ni ni-cross bg-danger"></em> 456 <h4 class="nk-modal-title" id="reservation-cancelled-title">Reservation was cancelled</h4> 457 <div class="nk-modal-text"> 458 <p class="lead">Your reservation was cancelled</p> 459 <p class="text-soft">Error message: 460 <span id="reservation_error_message" class="d-block mt-1"></span></p> 461 </div> 462 <div class="nk-modal-action mt-5"> 463 <button type="button" class="btn btn-lg btn-mw btn-light" 464 data-dismiss="modal">OK</button> 465 </div> 466 </div> 467 </div> 468 </div> 469 </div> 470 </div> 471
472<script type="0f1b92e37160e984b6cc3846-text/javascript" src="/js/libs/cookie.js?v=16.4.12"></script>
vendor: 1 bytes, line 472
472
473<script type="0f1b92e37160e984b6cc3846-text/javascript" src="/js/scripts.js?v=16.4.12"></script>
vendor: 1 bytes, line 473
473
474<script type="0f1b92e37160e984b6cc3846-text/javascript"> 475 (function () { 476 var lastModalTrigger = null; 477 478 document.addEventListener('keydown', function (event) { 479 if (event.key !== 'Escape') { 480 return; 481 } 482 483 var openModal = document.querySelector('.modal.show'); 484 if (openModal) { 485 $(openModal).modal('hide'); 486 } 487 }); 488 489 $(document).on('click', '[data-toggle="modal"]', function () { 490 lastModalTrigger = this; 491 }); 492 493 $(document).on('shown.bs.modal', '.modal', function () { 494 var dialog = this.querySelector('.modal-dialog') || this; 495 var firstFocusable = dialog.querySelector('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])'); 496 if (firstFocusable) { 497 firstFocusable.focus(); 498 } 499 }); 500 501 $(document).on('hidden.bs.modal', '.modal', function () { 502 if (lastModalTrigger && document.contains(lastModalTrigger)) { 503 lastModalTrigger.focus(); 504 } 505 lastModalTrigger = null; 506 }); 507 }()); 508</script>
vendor: 1 bytes, line 508
508
509<script type="0f1b92e37160e984b6cc3846-text/javascript"> 510 window.applyStorefrontRuntimeTranslations = function () { 511 if (typeof window.storetrans === 'undefined' || !window.storetrans) { 512 return; 513 } 514 515 document.querySelectorAll('[data-storefront-i18n]').forEach(function (element) { 516 const key = element.getAttribute('data-storefront-i18n'); 517 if (!key || !window.storetrans[key]) { 518 return; 519 } 520 521 element.textContent = window.storetrans[key]; 522 }); 523 524 if (Array.isArray(window.storeLegalDocuments)) { 525 const container = document.querySelector('[data-storefront-legal-documents]'); 526 if (container) { 527 const nodes = Array.from(container.querySelectorAll('[data-storefront-legal-document]')); 528 nodes.forEach(function (node, index) { 529 const legalDocument = window.storeLegalDocuments[index]; 530 const link = node.querySelector('a'); 531 if (!legalDocument || !link || !legalDocument.name || !legalDocument.url) { 532 node.classList.add('d-none'); 533 return; 534 } 535 536 link.textContent = legalDocument.name; 537 link.setAttribute('href', legalDocument.url); 538 node.classList.remove('d-none'); 539 }); 540 } 541 } 542 }; 543 544 (function initStorefrontLanguagePickerCommon() { 545 if (window.__storefrontLanguagePickerCommonInitialized) { 546 return; 547 } 548 window.__storefrontLanguagePickerCommonInitialized = true; 549 550 if (typeof window.StorefrontLanguage === 'undefined') { 551 window.StorefrontLanguage = { 552 select(language, options = { explicit: true }) { 553 if (!language) { 554 return; 555 } 556 557 const normalizedLanguage = String(language).toLowerCase().trim().slice(0, 2); 558 const explicit = options.explicit === true; 559 localStorage.setItem('storefront_language', normalizedLanguage); 560 localStorage.setItem('storefront_language_explicit', explicit ? '1' : '0'); 561 document.cookie = `storefront_language=${normalizedLanguage}; path=/; max-age=31536000; samesite=lax`; 562 document.cookie = `storefront_language_explicit=${explicit ? '1' : '0'}; path=/; max-age=31536000; samesite=lax`; 563 window.location.reload(); 564 } 565 }; 566 } 567 568 const toggle = document.getElementById('storefront-language-toggle'); 569 const items = Array.from(document.querySelectorAll('.storefront-language-item')); 570 if (!toggle || items.length === 0) { 571 return; 572 } 573 574 const normalizeLanguage = (value) => String(value || '').toLowerCase().trim().slice(0, 2); 575 const getCookieValue = (name) => { 576 const prefix = `${name}=`; 577 const parts = document.cookie.split(';').map((part) => part.trim()); 578 const match = parts.find((part) => part.startsWith(prefix)); 579 return match ? match.slice(prefix.length) : null; 580 }; 581 const supportedLanguages = Array.from(new Set( 582 items 583 .map((item) => normalizeLanguage(item.dataset.language)) 584 .filter((language) => !!language) 585 )); 586 const renderedLanguage = normalizeLanguage(toggle.getAttribute('data-language-current')); 587 const storedLanguage = normalizeLanguage(localStorage.getItem('storefront_language')); 588 const cookieLanguage = normalizeLanguage(getCookieValue('storefront_language')); 589 const currentLanguage = [storedLanguage, cookieLanguage, renderedLanguage] 590 .find((language) => language && supportedLanguages.includes(language)); 591 const updateToggle = (language) => { 592 const activeItem = items.find((item) => normalizeLanguage(item.dataset.language) === language) || items[0]; 593 if (!activeItem) { 594 return; 595 } 596 597 items.forEach((item) => item.classList.remove('active')); 598 activeItem.classList.add('active'); 599 toggle.innerHTML = activeItem.innerHTML; 600 }; 601 602 items.forEach((item) => { 603 item.addEventListener('click', function (event) { 604 event.preventDefault(); 605 const language = normalizeLanguage(this.dataset.language || ''); 606 if (!language) { 607 return; 608 } 609 610 updateToggle(language); 611 window.StorefrontLanguage.select(language, { explicit: true }); 612 }); 613 }); 614 615 if (currentLanguage) { 616 updateToggle(currentLanguage); 617 } 618 619 window.applyStorefrontRuntimeTranslations(); 620 })(); 621</script>
621 622 623
623<script type="0f1b92e37160e984b6cc3846-text/javascript" src="/js/storefront.js?v=16.4.12"></script>
623 624 625
625<script type="0f1b92e37160e984b6cc3846-text/javascript" src="/js/libs/moment.js?v=16.4.12"></script>
625 626
626<script type="0f1b92e37160e984b6cc3846-text/javascript" src="/js/libs/moment.timezone.js?v=16.4.12"></script>
626 627 628
628<script type="0f1b92e37160e984b6cc3846-text/javascript"> 629 var translations = {"route.home":"Home","route.faq":"Frequently asked questions","route.withdrawal":"Recording","route.calendar":"Calendar","route.category":"Category","route.product":"Product","route.rebook":"Book tickets again","route.renew":"Renew subscription","route.subscription":"Subscription","route.voucher":"Voucher","route.voucher_check":"Check voucher","route.reservation":"Reservation","route.not_found":"Page not found","title":"Shop","header.navigation":"Main navigation","header.language":"Choose language","header.footer_navigation":"Footer navigation","header.skip_to_content":"Skip to main content","header.home":"Home","header.login":"Log in","header.logout":"Log out","header.account":"My account","client.tooltips.order_cancel":"Cancel order","client.tooltips.download_tickets":"Download your tickets","client.tooltips.download_invoice":"Download your invoice","client.flash.email_format":"Email address has an invalid format.","client.flash.email_duplicate":"Email address cannot be changed, account already exists.","client.flash.name_length":"First and\/or last name must be between 1 and 100 characters.","client.flash.field_format":"Field %field% is not in the correct format.","client.flash.field_required":"Field %field% is required.","client.flash.success":"Profile updated successfully!","checkout.methods.paypal.title":"PayPal","checkout.methods.paypal.subtitle":"Please select a payment method:","checkout.return.title":"Order","checkout.return.message":"An order confirmation including tickets will also be sent to the specified email address.","checkout.return.download":"Download tickets","checkout.return.download_upsells":"Download extras","checkout.return.pay":"Pay now","checkout.return.retry":"Try again","checkout.return.retry_loading":"Preparing new payment...","checkout.return.retry_failed":"A new payment could not be created. Please try again later.","checkout.return.agenda.button":"Add visit to your calendar","checkout.return.agenda.dropdown":"Open calendar options","checkout.return.agenda.download":"Download for Outlook \/ Apple Calendar","checkout.return.agenda.google":"Add to Google Calendar","checkout.return.agenda.outlook":"Add to Outlook.com","checkout.return.agenda.location":"Location: %address%","checkout.return.succesfull.header":"Thank you!","checkout.return.succesfull.title":"Thank you very much for your order.","checkout.return.succesfull.subtitle":"Your order has been received successfully. See you soon!","checkout.return.pending.header":"Please wait...","checkout.return.pending.title":"Your payment is being processed; this may take a while.","checkout.return.insuccesfull.header":"Payment failed!","checkout.return.insuccesfull.title":"Oops! Your payment was unsuccessful.","checkout.return.insuccesfull.subtitle":"Unfortunately, we have not (yet) received your payment. You can of course try again!","checkout.return.failed.header":"Invalid order!","checkout.return.failed.title":"Order not found.","checkout.return.failed.subtitle":"The requested order was not found!","checkout.return.rebooked.header":"Thanks!","checkout.return.rebooked.title":"Thank you for your rebooking.","checkout.return.rebooked.subtitle":"We will now send you an email with your new tickets. The old tickets will be cancelled and won't work anymore.","checkout.return.rebooked.continue":"Continue to the next activity","components.cart.nodate":"No date selected","components.cart.notimeslot":"No time slot selected","components.cart.info.title":"More information","components.cart.info.upsell":"Extras","components.cart.info.price":"Price","components.cart.info.additions":"Transaction fees","components.cart.info.total":"Total","components.cart.info.topay":"Checkout","components.cart.info.reserve":"Make a reservation","components.cart.info.free":"FREE","components.cart.info.change":"Change","components.cart.quantity":"Ticket(s)","components.cart.delete":"Remove","components.cart.edit":"Edit","components.cart.delete_confirm":"Are you sure you want to remove {order}?","components.cart.cancel":"Cancel","components.cart.coupon.title":"Discount code","components.cart.coupon.subtotal":"Subtotal","components.cart.coupon.discount":"Discount","components.cart.coupon.redeem":"Have a coupon? Redeem","components.cart.coupon.redeem_with_cards":"Redeem coupon or %cards%","components.cart.coupon.used":"applied","components.cart.coupon.modal.title":"Redeem coupon","components.cart.coupon.modal.title_with_cards":"Redeem coupon or %cards%","components.cart.coupon.modal.option.percentage.normal":"Coupon added! Discount of %discount%% applied to the entire order.","components.cart.coupon.modal.option.percentage.maximized":"Coupon added! Discount of %discount%% applied to %amount% product(s).","components.cart.coupon.modal.option.amount.normal":"Coupon added! Discount of %discount% applied to the entire order.","components.cart.coupon.modal.option.amount.maximized":"Coupon added! Discount of %discount% applied to %amount% product(s).","components.cart.coupon.modal.option.voucher":"Voucher added! Discount of up to %discount% applied to the entire order.","components.cart.coupon.modal.option.provider_voucher.message":"Voucher for %card% applied! Balance: %balance%.","components.cart.coupon.modal.option.provider_voucher.status.val
629id":"valid","components.cart.coupon.modal.option.provider_voucher.status.invalid":"invalid","components.cart.coupon.modal.option.not_valid":"This coupon\/voucher is no longer valid!","components.cart.coupon.modal.option.outside_availability":"This coupon is not valid for the selected visit date\/time.","components.cart.coupon.modal.pincode.placeholder":"Enter PIN code","components.cart.coupon.modal.redeem":"Redeem","components.cart.coupon.modal.continue":"Continue","components.cart.coupon.modal.input_placeholder_with_cards":"Enter your coupon code or %cards% number","components.cart.coupon.remove":"Remove coupon","components.footer.tos":"Terms and conditions","components.footer.privacy":"Privacy policy","components.footer.faq":"Ticket Support","components.footer.withdrawal":"Withdraw from agreement","index.readmore":"Read more","index.readless":"Read less","index.categories.title":"Index","index.categories.select":"Select","index.products.price":"Price","index.products.pricefrom":"Price from","index.products.free":"FREE","index.products.submit":"Book","index.subscriptions.price":"Price","index.subscriptions.pricefrom":"Price from","index.subscriptions.free":"FREE","index.subscriptions.current":"CURRENT","index.subscriptions.submit":"Buy","index.vouchers.price":"Price","index.vouchers.submit":"Buy","faq.title":"Frequently asked questions","faq.subtitle":"Questions? We have the answers!","faq.extra.title":"Can't you find the answer you're looking for in the FAQ?","faq.extra.subtitle":"How else can we help you?","faq.extra.questions.q_1":"I want to change the date\/time of my ticket.","faq.extra.questions.q_2":"I want to submit a cancellation or refund request. (Refund requests are processed within 30 working days). Please note: requests for tickets whose visit date has already passed will not be processed.","faq.extra.questions.q_3":"If you have not found the answer to your question in the FAQ and do not want to change\/refund your ticket, click here.","faq.extra.rebook":"Change","faq.extra.cancellation":"Requests","faq.extra.contact":"Contact","faq.contact":"Contact","faq.restitution.application":"Refund request","faq.restitution.firstname":"First name","faq.restitution.surname":"Last name","faq.restitution.email":"Email address","faq.restitution.order_number":"Order number","faq.restitution.reason":"Reason\/Comments","faq.restitution.send":"Shipping","withdrawal.title":"Withdraw from agreement","withdrawal.subtitle":"Use this form to withdraw from your agreement.","withdrawal.description":"Enter your order, voucher, or subscription number together with the corresponding email address.","withdrawal.form.identifier":"Order\/voucher\/subscription number","withdrawal.form.email":"Email address","withdrawal.form.submit":"Request withdrawal","withdrawal.form.confirm":"Confirm withdrawal request","withdrawal.form.cancel":"Cancel","withdrawal.error.fields_required":"Enter a valid number and email address.","withdrawal.error.invalid_identifier_email":"The combination of number and email address could not be verified.","withdrawal.error.disabled":"This withdrawal form is currently disabled.","withdrawal.error.unknown":"Something went wrong. Please try again.","withdrawal.success.title":"Request received","withdrawal.success.subtitle":"Your withdrawal request has been sent successfully.","withdrawal.admin_email.subject":"Withdrawal request %identifier%","withdrawal.admin_email.body":"A withdrawal request for an agreement has been submitted.\n\nType: %type%\nNumber: %identifier%\nEmail address: %email%\nRequested on: %requested_at%","withdrawal.admin_email.type.order":"Order","withdrawal.admin_email.type.subscription":"Subscription","withdrawal.admin_email.type.voucher":"Voucher","rebook.title":"Rebook","rebook.description":"On this page, you can rebook an order or reservation. Enter the email address and order ID of your old order, then you can choose a new date. Rebooking is not possible if the order's visit date has passed!","rebook.form.exception":"Rebooking is not allowed","rebook.form.order_id":"Order number","rebook.form.email":"Email address","rebook.form.submit":"Continue","rebook.selection.title":"Which activity would you like to rebook?","rebook.selection.description":"Select the activities you want to rebook. You can continue with one activity or complete them one by one.","rebook.selection.select_all":"Select all","rebook.selection.submit":"Continue with selected activities","rebook.selection.none_selected":"Select at least one activity to continue.","rebook.selection.main_order":"Main order","rebook.selection.visit_date":"Visit date","rebook.selection.quantity_tickets":"Number of tickets","rebook.error.not_allowed":"Rebooking is not allowed","rebook.error.invali
629d_email":"Invalid order ID \/ email","rebook.error.not_completed":"Order is not complete","rebook.error.order_item_cancelled":"Order items have been cancelled or checked in","rebook.error.order_upsell_cancelled":"Order upsells have been cancelled or checked in","rebook.error.product_unavailable":"This product is not available","rebook.error.visit_date_passed":"The visit date for this order has passed","rebook.error.rebook_disabled":"Rebooking is disabled for this organization.","rebook.error.rebook_token_mismatch":"The rebooking link is invalid or has expired.","rebook.error.rebook_not_allowed":"Rebooking is not allowed.","rebook.error.rebook_unprocessable":"This order has already been rebooked.","rebook.error.rebook_forbidden_pos":"Orders placed through the checkout cannot be rebooked online.","rebook.error.rebook_forbidden_email":"The email address does not match the original order.","rebook.error.rebook_duplicate":"This order has already been rebooked.","rebook.error.rebook_forbidden_subscription":"Subscription orders cannot be rebooked through this page.","rebook.error.rebook_forbidden_status":"Only completed orders can be rebooked.","rebook.error.rebook_forbidden_item_checkins":"One or more tickets have already been checked in.","rebook.error.rebook_forbidden_upsell_checkins":"One or more extras have already been checked in.","rebook.error.rebook_forbidden_product":"The associated product has been disabled or removed.","rebook.error.rebook_forbidden_product_unavailable":"The associated product is no longer available.","rebook.error.rebook_forbidden_date_passed":"The visit date for this order has already passed.","rebook.error.rebook_forbidden_rebooking_period":"The rebooking period for this order has expired.","rebook.error.rebook_forbidden_max_rebookings":"The maximum number of rebookings has been reached.","rebook.error.rebook_forbidden_cancellation_period":"The cancellation period for this order has expired.","rebook.error.fields_required":"Enter your order number and email address.","subscription.client.dashboard.title":"Customer panel","subscription.client.dashboard.details.title":"My details","subscription.client.dashboard.details.general":"General","subscription.client.dashboard.details.name":"Name","subscription.client.dashboard.details.email":"Email","subscription.client.dashboard.details.phone":"Phone number","subscription.client.dashboard.details.payment":"Payment method","subscription.client.dashboard.details.method":"Method","subscription.client.dashboard.details.method_subtitle_ideal":"Online bank payment","subscription.client.dashboard.details.method_subtitle_directdebit":"Bank account direct debit","subscription.client.dashboard.details.method_subtitle_paybybank":"Open banking payment","subscription.client.dashboard.details.method_subtitle_paypal":"Digital wallet payment","subscription.client.dashboard.details.method_subtitle_applepay":"Apple Wallet payment","subscription.client.dashboard.details.method_subtitle_generic":"Recurring payment method","subscription.client.dashboard.details.primary_payment_method":"Primary payment method","subscription.client.dashboard.details.payment_method":"Primary payment method","subscription.client.dashboard.details.other_payment_methods":"Other payment options","subscription.client.dashboard.details.no_payment_method":"No payment method","subscription.client.dashboard.details.no_other_payment_methods":"No other payment options","subscription.client.dashboard.details.add_payment_method":"Add payment method","subscription.client.dashboard.details.payment_method_update_success":"Payment method successfully updated.","subscription.client.dashboard.details.payment_method_update_pending":"Payment method is being updated. Refresh this page in a few seconds.","subscription.client.dashboard.details.expires":"Expires","subscription.client.dashboard.details.payment_details_unavailable":"Payment details are currently unavailable.","subscription.client.dashboard.details.payment_method_make_primary":"Make primary","subscription.client.dashboard.details.payment_method_remove":"Delete","subscription.client.dashboard.details.payment_method_make_primary_success":"Primary payment method updated.","subscription.client.dashboard.details.payment_method_remove_success":"Payment method deleted.","subscription.client.dashboard.details.payment_method_remove_primary_error":"The primary payment method cannot be deleted here.","subscription.client.dashboard.details.payment_method_remove_modal_title":"Delete payment method","subscription.client.dashboard.details.payment_method_remove_modal_body":"Are you sure you want to delete this payment method?","subscription.client.dashboard.details.payment_method_remove_modal_cancel":"Cancel","subscription.client.dashboard.details.payment_method_remove_modal_confirm":"Delete","subscription.client.dashboard.details.change_details":"Edit details","subscription.client.dashboard.details.save":"Save","subscription.client.dashboard.orders.title":"Orders","subscription.client.dashboard.orders.table.product":"Product","subscription.client.dashboard.orders.table.status":"Status","subscription.client.dashboard.orders.table.price":"Amount","subscription.client.dashboard.orders.table.date":"Date","subscription.client.dashboard.orders.table.visitdate":"Visit date","subscription.client.dashboard.orders.table.cancel":"Cancel","subscription.client.dashboard.orders.no_orders":"No orders","subscription.client.dashboard.orders.tabs.available":"Available","subscription.client.dashboard.orders.tabs.others":"Other","subscription.client.dashboard.orders.modal.header":"Cancel subscription order","subscription.client.dashboard.orders.modal.title":"Are you sure you want to cancel this order?","subscription.client.dashboard.orders.modal.subtitle":"You are about to cancel your order; the subscription pass used will be reinstated. Other products can be cancelled.","subscription.client.dashboard.orders.modal.submit":"Cancel order","subscription.client.dashboard.orders.modal.return":"Back","subscription.client.dashboard.subscriptions.title":"Subscriptions","subscription.client.dashboard.subscriptions.table.name":"Name","subscription.client.dashboard.subscriptions.table.status":"Status","subscription.client.dashboard.subscriptions.table.available":"Available tickets","subscription.client.dashboard.subscriptions.table.unlimited":"Unlimited","subscription.client.dashboard.subscriptions.table.expiration":"Expiration date","subscription.client.dashboard.subscriptions.table.no_expiration":"No expiration date","subscription.client.dashboard.subscriptions.select":"Bookings","subscription.client.dashboard.subscriptions.no_subscriptions":"No subscriptions","subscription.client.dashboard.passes.title":"Passes","subscription.client.dashboard.passes.inactivated_subscription":"Please note: n
629ot all subscriptions are currently activated. Activate your subscriptions by adding the remaining details. You can only use your subscription after activation.","subscription.client.dashboard.passes.no_activated_subscription":"Please note: the duration of all subscriptions in this order starts as soon as the first pass is activated.","subscription.client.dashboard.passes.subscription_expiring":"Subscription expires soon. Click the button below to renew easily and keep your passes.","subscription.client.dashboard.passes.subscription_expired":"Subscription has expired; click the button below to purchase again.","subscription.client.dashboard.passes.pass_activated":"Pass has been activated and is ready for use!","subscription.client.dashboard.passes.expirationdate":"Expiry date:","subscription.client.dashboard.passes.invalid_fields":"Invalid fields set!","subscription.client.dashboard.passes.nothing_chosen":"No profile selected!","subscription.client.dashboard.passes.already_bound":"This profile is already linked to a pass!","subscription.client.dashboard.passes.show_more":"Show more","subscription.client.dashboard.passes.show_less":"Show less","subscription.client.dashboard.passes.no_passes":"No passes","subscription.client.dashboard.passes.activate":"Activate","subscription.client.dashboard.passes.look_at":"View","subscription.client.dashboard.passes.renew":"Renew","subscription.client.dashboard.passes.auto_renewal.title":"Automatic renewal","subscription.client.dashboard.passes.auto_renewal.on":"On","subscription.client.dashboard.passes.auto_renewal.off":"Off","subscription.client.dashboard.passes.auto_renewal.toggle_on":"Turn on","subscription.client.dashboard.passes.auto_renewal.toggle_off":"Turn off","subscription.client.dashboard.passes.auto_renewal.modal.title":"Automatic renewal","subscription.client.dashboard.passes.auto_renewal.modal.text":"Are you sure you want to stop automatically renewing your subscription? Your subscription will stop once it expires and will not be renewed automatically.","subscription.client.dashboard.passes.auto_renewal.modal.button.confirm":"Confirm","subscription.client.dashboard.passes.auto_renewal.modal.button.cancel":"Cancel","subscription.client.dashboard.passes.pass.back":"Back","subscription.client.dashboard.passes.pass.pass_number":"Pass no.:","subscription.client.dashboard.passes.pass.last_used":"Last used","subscription.client.dashboard.passes.pass.birthday":"Date of birth","subscription.client.dashboard.passes.pass.audience":"Target group","subscription.client.dashboard.passes.pass.price":"Price","subscription.client.dashboard.passes.pass.availability":"Availability","subscription.client.dashboard.passes.pass.expiration_date":"Expiry date","subscription.client.dashboard.passes.pass.rotate_pass":"Click on your pass to turn it over; the QR code for check-in is on the back.","subscription.client.dashboard.passes.pass.activate_pass":"Activate your subscription pass","subscription.client.dashboard.passes.pass.name_surname":"First and last name","subscription.client.dashboard.passes.pass.activate":"Activate","subscription.client.dashboard.passes.pass.profile":"Choose the profile for this pass:","subscription.client.dashboard.passes.pass.age_doesnt_match":"This profile is too young or too old for this subscription.","subscription.client.dashboard.passes.pass.photo":"Passport photo","subscription.client.dashboard.passes.pass.save":"Save","subscription.client.dashboard.passes.pass.image.profile_picture":"Profile photo","subscription.client.dashboard.passes.pass.image.upload":"Upload","subscription.client.dashboard.passes.pass.image.image_set":"Photo set!","subscription.client.dashboard.passes.pass.note.text_1":"Please note: you are now activating a subscription for","subscription.client.dashboard.passes.pass.note.text_2":".","subscription.client.dashboard.passes.pass.placeholder.firstname":"First name","subscription.client.dashboard.passes.pass.placeholder.surname":"Last name","subscription.client.dashboard.passes.pass.modal.confirm.title":"Confirm pass activation","subscription.client.dashboard.passes.pass.modal.confirm.text":"Weet je zeker dat je profiel <span id=\\\"pass_profile_name\\\"><\/span> wilt koppelen aan deze pas met doelgroep \\\"%audience%\\\"?","subscription.client.dashboard.passes.pass.modal.confirm.button.confirm":"Confirm","subscription.client.dashboard.passes.pass.modal.confirm.button.cancel":"Return","subscription.client.dashboard.passes.change_photo":"Change photo","
629subscription.client.dashboard.passes.save":"Save photo","subscription.client.dashboard.passes.change_photo_warning":"You can only change the photo once","subscription.client.dashboard.vouchers.title":"Vouchers","subscription.client.dashboard.vouchers.table.code":"Code","subscription.client.dashboard.vouchers.table.status":"Status","subscription.client.dashboard.vouchers.table.credit":"Balance","subscription.client.dashboard.vouchers.table.name":"Name","subscription.client.dashboard.vouchers.table.id":"ID","subscription.client.dashboard.profiles.title":"Profiles","subscription.client.dashboard.profiles.add":"Add profile","subscription.client.dashboard.profiles.upload":"Upload","subscription.client.dashboard.profiles.connected.to":"Linked to","subscription.client.dashboard.profiles.connected.none":"Not linked","subscription.client.dashboard.profiles.errors.firstname":"First name may not be longer than 35 characters.","subscription.client.dashboard.profiles.errors.lastname":"Last name may not be longer than 35 characters.","subscription.client.login.title":"Log in as a customer","subscription.client.login.subtitle":"Access your account with your email address and password.","subscription.client.login.email":"Email address","subscription.client.login.password":"Password","subscription.client.login.loginbutton":"Log in","subscription.client.login.flash.invalidlogin":"Invalid email\/password combination!","subscription.client.login.flash.captcha":"Invalid captcha!","subscription.client.reset.subject":"Reset your account","subscription.client.reset.greet":"Hello","subscription.client.reset.body":"There was a request to change your password!\n\n If you did not make this request, you can ignore this email.\n\n Otherwise, click this link to change your password: \n%link%","subscription.client.reset.send":"If a valid account exists, you will receive an email shortly","subscription.client.reset.title":"Reset password","subscription.client.reset.subtitle":"Create a new password for your account","subscription.client.reset.password":"Password","subscription.client.reset.password_confirm":"Repeat password","subscription.client.reset.save":"Change password","subscription.client.reset.flash.password_unmatch":"Passwords do not match","subscription.client.reset.flash.requested":"A new password has been requested!","subscription.client.reset.flash.changed":"Password has been changed!","subscription.client.reset.flash.mail_not_exist":"The specified email address is not known in our database!","subscription.client.reset.flash.reset_not_available":"The password reset has already been completed via this URL. Log in with the chosen password or request a new password reset.","product.quantity.availability":"At the moment, no more tickets are available than:","product.quantity.not_available":"There are currently no tickets available.","product.quantity.minimal":"This product requires a minimum quantity of paid tickets","product.quantity.audience.title":"Number of tickets","product.quantity.audience.free":"FREE","product.quantity.regular.amount":"Number of tickets","product.steps.subscription.title":"Subscription","product.steps.subscription.subtitle":"Use a subscription for this order.","product.steps.subscription.available":"Available tickets","product.steps.subscription.expiration":"Valid until","product.steps.subscription.no_subscription":"Do not redeem a subscription","product.steps.subscription.renew":"Renew","product.steps.subscription.age":"year","product.steps.subscription.new":"New subscription","product.steps.subscription.add_extra":"Add extra subscription","product.steps.subscription.untouched":"Unused pass","product.steps.subscription.current":"Your current passes:","product.steps.subscription.audience_placeholder":"Select a target group","product.steps.subscription.add":"Add","product.steps.subscription.remove":"Remove subscription","product.steps.checkout.title":"Personal details","product.steps.checkout.participant":"Participant","product.steps.checkout.subtitle":"Enter the details below to complete your order.","product.steps.checkout.company":"Company name","product.steps.checkout.company_option":"I am a business","product.steps.checkout.vat_id":"VAT number","product.steps.checkout.address":"Address","product.steps.checkout.zipcode":"Postal code","product.steps.checkout.city":"City","product.steps.checkout.firstname":"First name","product.steps.checkout.lastname":"Last name","product.steps.checkout.email":"Email address","product.steps.checkout.phone":"Phone number","product.steps.checkout.password":"Password","product.steps.checkout.password_confirm":"Repeat password","product.steps.checkout.tos":"By placing this order, you agree to the <a class=\"text-primary\" href=\"{url}\" target=\"_blank\">terms and conditions<\/a>.","product.steps.checkout.required":"Fields are required.","product.steps.checkout.dropdown.placeholder":"Select an option...","product.steps.upsells.add":"Add-ons for your order","product.steps.upsells.free":"FREE","product.steps.upsells.rebooking_min_donation":"When rebooking, the donation cannot be lower than your original donation.","product.steps.cross_sells.add":"Related products you may find interesting","product.types.days.title":"Choose a visit date","product.types.days.free":"FREE","product.types.timeslot.select_timeslot":"Choose a time slot","product.types.timeslot.select_date":"Please select a date first.","product.types.timeslot.no_timeslots_today":"Please note: there are no available time slots today","product.types.timeslot.free":"FREE","product.types.timeslot.available":"available","product.types.timeslot.not_available":"The date you previously selected is not available for this product.","product.order.back":"Back","product.order.addMore":"Buy more","product.order.cancel":"Cancel","product.order.chosen":"You have selected {quantity} tickets -","product.order.changeamount":"Adjust quantities","product.order.proceed":"Continue","product.rebook.title":"- Rebooking","product.rebook.negative_difference":"Rebooking is currently not possible if the new price is lower than the old price.","product.rebook.proceed":"Rebook order","product.rebook.reservation.title":"- Reservation","product.rebook.reservation.proceed":"Change reservation","voucher_template_selection.title":"Choose your voucher design","voucher_template_selection.description":"Select the design that will be sent with the voucher.","voucher_template_selection.selected":"Selected","voucher-check.title":"Voucher balance","voucher-check.description":"Check the remaining balance of your voucher here.","voucher-check.form.code":"Barcode","voucher-check.form.submit":"Check","voucher-check.modal.title":"Voucher","voucher-check.modal.code":"Barcode:","voucher-check.modal.credit":"Balance:","voucher-check.modal.expiration":"Expiry date:","voucher-check.modal.non-expiring":"No expiry date","reservation.overview.confirmation_message.title":"Thank y
629ou for your reservation!","reservation.overview.confirmation_message.body.standard":"Thank you for your reservation. This reservation does not expire. You can return to this page at any time to view the details, make changes, or complete your booking.","reservation.overview.confirmation_message.body.with_expiration":"Thank you for your reservation, we will hold it until {expiration_date}. You can return to this page until then to make changes or finalize your reservation. The link to this page has also been sent to you by email.","reservation.overview.confirmation_message.body.finalized":"This reservation has been paid for and completed. You can always continue to view your reservation details on this page.","reservation.overview.locked.finalized":"This reservation has been paid for and completed. Payment or changes through this page are no longer required.","reservation.overview.locked.deposit":"A deposit has been made for this reservation. It is no longer possible to make changes or pay through this page.","reservation.overview.locked.organisation":"Editing this reservation has been disabled by the organizer. You can still view the details here.","reservation.overview.title":"Personal details","reservation.overview.subtitle":"Please check the information below before proceeding to checkout.","reservation.overview.edit.button":"Edit details","reservation.overview.edit.subtitle":"Update your details and complete any missing fields.","reservation.overview.edit.save":"Save changes","reservation.overview.edit.saving":"Saving...","reservation.overview.edit.cancel":"Cancel","reservation.overview.edit.success":"Your details have been updated.","reservation.overview.edit.validation":"Complete the required fields before saving.","reservation.overview.edit.company_toggle":"This reservation is for a company","reservation.overview.payment.deposit":"Deposit ({percentage}%)","reservation.overview.payment.due_now":"Amount due","reservation.overview.fields.name":"Name","reservation.overview.fields.email":"Email","if404.title":"Page not found!","if404.subtitle":"Oops! The requested page can no longer be found. The item is most likely no longer available.","errors.customer_token_invalid":"Customer key is invalid, please log in again.","errors.customer_token_required":"This email address is already registered, please log in before placing an order.","errors.customer_field_invalid":"A form field has been filled in incorrectly, check your details.","errors.customer_field_missing":"A form field is missing, check your details.","errors.captcha_invalid":"The CAPTCHA is invalid, reload the page and place your order again.","errors.product_min_quantity_exceeded":"The number of tickets is below the minimum required. Increase your quantity.","errors.product_max_quantity_exceeded":"The number of tickets exceeds the maximum allowed. Reduce your quantity.","errors.product_not_found":"The product you are trying to order is no longer available.","errors.plot_not_found":"The booking time you are trying to order is no longer available.","errors.plot_capacity_insufficient":"The selected time slot is currently sold out. More tickets may become available later. Try again or check whether tickets are available for another date.","errors.audience_not_found":"The target group was not found.","errors.audience_not_allowed":"This target group can only be booked in combination with another target group.","errors.audience_age_not_allowed":"The selected target group does not match the specified age.","errors.upsell_not_found":"The upsell was not found.","errors.upsell_not_allowed":"This upsell cannot be ordered in combination with this product.","errors.value_amount_invalid":"Enter a valid custom voucher amount greater than 0.","errors.subscription_invalid":"The subscription is invalid.","errors.subscription_inactive":"The subscription is no longer active; the capacity is probably insufficient.","errors.subscription_product_mismatch":"The subscription does not grant access to this product.","errors.subscription_expired":"The subscription has expired.","errors.subscription_quantity_mismatch":"The subscription does not grant access to these quantities.","errors.subscription_used_today":"The subscription has already been used today.","errors.subscription_redemptions_exceeded":"The subscription has exceeded its maximum usage.","errors.coupon_invali
629d":"The entered coupon code is invalid.","errors.intersolve_pin_invalid":"The PIN code is invalid.","errors.intersolve_coupon_voucher_not_configured":"Coupon voucher is not configured for this card type.","errors.intersolve_coupon_voucher_retrieve_failed":"Coupon voucher could not be retrieved.","errors.intersolve_coupon_voucher_ineligible":"Coupon voucher is not valid for this pass.","errors.intersolve_coupon_voucher_redeem_failed":"Coupon voucher could not be redeemed.","errors.coupon_product_mismatch":"This coupon cannot be used for this product.","errors.coupon_expired":"This coupon has expired.","errors.coupon_redemptions_exceeded":"This coupon has been fully used.","errors.rebook_invalid":"The rebooking is invalid.","errors.rebook_product_mismatch":"The rebooking cannot be made with the specified product.","errors.subscription_not_found":"The specified subscription could not be found.","errors.reservation_cancelled":"The specified reservation has expired\/been cancelled.","errors.reservation_not_found":"The reservation could not be found","errors.reservation_field_invalid":"One of the fields could not be updated. Refresh the page and try again.","errors.reservation_changes_disabled":"Changes are not allowed for this reservation.","errors.reservation_invalid_payload":"We could not process your change. Please try again.","errors.pos_cash_not_allowed":"Cash payments are not allowed for this register.","errors.pos_not_found":"The register could not be found.","errors.error_unknown":"Something went wrong while processing your request. Please try again.","errors.subscription_order.order_creation_failed":"Payment failed!","errors.subscription_order.order_creation_failed_description":"Oops, we were unable to create your order.","errors.subscription_order.order_creation_failed_errormessage":"Error message:","errors.subscription_order.order_creation_failed_tryagain":"Try again","errors.reservation.reservation_cancelled":"Reservation cancelled","errors.reservation.reservation_cancelled_description":"Your reservation has been cancelled","errors.reservation.reservation_cancelled_error_message":"Error message:","errors.reservation.reservation_cancelled_ok":"OK","errors.product_unpurchasable":"This product is currently unavailable for purchase.","errors.reservation_not_allowed":"Reservations are not available for this product.","errors.plot_booking_closed":"Booking is closed for this time slot. Choose another time.","errors.upsell_not_enough_stock":"There is not enough stock for the selected add-on. Reduce the quantity.","errors.subscription_type_mismatch":"This subscription type cannot be used for this booking.","errors.intersolve_pin_required":"Enter the PIN code for this card.","errors.coupon_batch_missing":"This coupon is no longer linked to a valid coupon batch. Please contact us.","errors.coupon_batch_mismatch":"This coupon cannot be used with the selected coupon offer.","errors.voucher_expired":"This voucher has expired.","errors.tax_not_configured":"Tax settings are incomplete. Contact us to complete your purchase.","errors.coupon_not_found":"This coupon could not be found. Check the code.","errors.coupon_subscription_mismatch":"This coupon cannot be used for this subscription.","errors.voucher_not_found":"This voucher could not be found. Check the code.","errors.value_not_found":"The selected voucher value is no longer available.","errors.ticket_template_not_allowed":"The selected ticket design is not available for this voucher.","errors.ticket_template_not_found":"The selected ticket design could not be found.","errors.category_not_found":"This category could not be found.","errors.unexpected_payload":"The submitted details could not be processed. Please check them and try again.","errors.ticket_invalid":"This ticket is invalid.","errors.checkin_invalid":"This check-in could not be completed.","errors.coupon_duplicate":"This coupon has already been added.","errors.coupon_outside_availability":"This coupon is not valid for the selected date or time.","errors.missing_parameters":"Required information is missing. Fill it in and try again.","errors.customer_not_found":"The customer could not be found.","errors.customer_already_exists":"A customer with these details already exists.","errors.customer_creation_error":"The customer could not be created. Check the details and try again.","errors.payload_invalid":"The submitted information is invali
629d. Check it and try again.","errors.withdrawal_fields_required":"Enter your order or subscription number and email address.","errors.withdrawal_disabled":"Online withdrawal is not available. Contact us.","errors.withdrawal_no_match":"No matching purchase was found. Check your details.","errors.customers_not_found":"The selected customers could not be found.","errors.reservation_not_reserved":"This reservation is no longer awaiting confirmation.","errors.reservation_customer_not_found":"The customer for this reservation could not be found.","errors.order_not_found":"This order could not be found.","errors.order_delete_forbidden":"This order cannot be cancelled.","errors.order_complete_forbidden":"This order cannot be completed.","errors.ticket_not_found":"This ticket could not be found.","errors.login_failure":"Login failed. Check your login details.","errors.tse_receipt_data_missing":"Required fiscal receipt details are missing. Please contact support.","errors.not_found":"The requested item could not be found.","errors.error_forbidden":"You do not have permission to perform this action.","errors.end_of_day_report_not_found":"The end-of-day report could not be found.","errors.invalid_amount":"Enter a valid amount.","errors.invalid_user":"The selected user is invalid.","errors.invalid_reason":"Enter a valid reason.","errors.no_plots_available":"There are currently no dates or time slots available.","errors.rebook_not_allowed":"This booking cannot be changed.","errors.rebook_token_mismatch":"This rebooking link is invalid. Use the link provided for your booking.","errors.subscription_status_incompatible":"This action is not available for the current subscription status.","errors.subscription_incompatible":"This subscription cannot be used for this action.","errors.subscription_payload_missing":"Required subscription details are missing.","errors.subscription_pass_already_activated":"This subscription card has already been activated.","errors.invalid_payload":"The submitted details are invalid. Check them and try again.","errors.preview_not_found":"This preview is no longer available. Generate a new preview.","errors.file_upload_failure":"The file could not be uploaded. Please try again.","errors.error_unauthorized":"Please log in to continue.","errors.tse_open_failed":"The fiscal transaction could not be started. Please contact support.","errors.tse_signing_failed":"The fiscal transaction could not be signed. Please contact support.","errors.pos_terminal_provider_unavailable":"The payment terminal provider is currently unavailable. Please try again later.","errors.pos_terminal_invalid_response":"The payment terminal returned an unexpected response. Check the payment status before trying again.","errors.pos_terminal_create_failed":"The payment terminal transaction could not be created. Check the payment status before trying again.","errors.checkout_retry_unsupported":"This checkout cannot be resumed. Contact us for assistance.","errors.checkout_retry_in_progress":"This checkout is already being processed. Please wait.","errors.checkout_retry_failed":"Your checkout could not be resumed. Please try again or contact us for assistance.","errors.unknown_error":"Something went wrong while processing your request. Please try again.","errors.rebook_disabled":"Rebooking is not available.","errors.rebook_forbidden_pos":"Bookings made at the register cannot be changed online. Please contact us.","errors.rebook_forbidden_email":"The email address does not match this booking. Use the email address provided when booking.","errors.rebook_duplicate":"This booking has already been rebooked. Use your latest booking.","errors.rebook_forbidden_subscription":"This subscription booking cannot be changed.","errors.rebook_forbidden_status":"This booking cannot be changed in its current status.","errors.rebook_forbidden_item_checkins":"This booking cannot be changed because a ticket has already been checked in.","errors.rebook_forbidden_upsell_checkins":"This booking cannot be changed because an add-on has already been checked in.","errors.rebook_forbidden_product_unavailable":"This booking cannot be changed because the product is no longer available.","errors.rebook_forbidden_date_passed":"The time limit for changing this booking has passed.","errors.rebook_forbidden_cancellation_period":"The cancellation deadline for this booking has passed.","errors.rebook_forbidden_rebooking_period":"The rebooking deadline has passed.","errors.rebook_forbidden_max_rebookings":"This booking has reached the maximum number of changes.","calendar.previous":"Previous period","calendar.next":"Next period","renew.title":"Subscription renewal","renew.description":"This subscription cannot be renewed at the moment. Please contact us if you need help.","voucher.order.back":"Back","accessibility.invalid_field":"Check this field.","accessibility.required_field":"This field is required.","accessibility.invalid_email":"Enter a valid email address.","accessibility.invalid_phone":"Enter a valid phone number.","accessibility.invalid_number":"Enter a valid number.","accessibility.invalid_date":"Enter a valid date.","accessibility.invalid_selection":"Select a valid option.","accessibility.invalid_value":"Enter a valid value.","accessibility.close_dialog":"Close dialog","accessibility.decrease_quantity":"Decrease quantity","accessibility.increase_quantity":"Increase quantity","accessibility.quantity_for":"Quantity for","accessibility.decrease_price":"Decrease price","accessibility.increase_price":"Increase price","accessibility.price_for":"Price for"}; 630 translations['accessibility.invalid_field'] = "Please check this field."; 631 translations['accessibility.required_field'] = "This field is required."; 632 translations['accessibility.invalid_email'] = "Please enter a valid email address."; 633 translations['accessibility.invalid_phone'] = "Please enter a valid phone number."; 634 translations['accessibility.invalid_number'] = "Please enter a valid number."; 635 translations['accessibility.invalid_date'] = "Please enter a valid date."; 636 translations['accessibility.invalid_selection'] = "Please select a valid option."; 637 translations['accessibility.invalid_value'] = "Please enter a valid value."; 638 translations['accessibility.close_dialog'] = "Close dialog"; 639 translations['accessibility.decrease_quantity'] = "Decrease quantity"; 640 translations['accessibility.increase_quantity'] = "Increase quantity"; 641 translations['accessibility.quantity_for'] = "Quantity for"; 642 translations['accessibility.decrease_price'] = "Decrease price"; 643 translations['accessibility.increase_price'] = "Increase price"; 644 translations['accessibility.price_for'] = "Price for"; 645 window.StorefrontTranslations = { 646 captureOverrides(options) { 647 options = options || {}; 648 const overrides = {}; 649 650 if (window.__storefrontTranslationOverrides && typeof window.__storefrontTranslationOverrides === 'object') { 651 Object.assign(overrides, window.__storefrontTranslationOverrides); 652 } 653 654 if (window.storefrontTranslationOverrides && typeof window.storefrontTranslationOverrides === 'object') { 655 Object.assign(overrides, window.storefrontTranslationOverrides); 656 } 657 if (options.captureLegacyStoretrans === true && typeof storetrans !== 'undefined' && storetrans && typeof storetrans === 'object' && storetrans !== window.__storefrontMergedStoretrans) { 658 Object.assign(overrides, storetrans); 659 } 660 661 if (window.storetrans && typeof window.storetrans === 'object' && window.storetrans !== window.__storefrontMergedStoretrans) { 662 Object.assign(overrides, window.storetrans); 663 } 664 665 window.__storefrontTranslationOverrides = overrides; 666 667 return overrides; 668 }, 669 merge(translations, options) { 670 options = options || {}; 671 const merged = Object.assign({}, translations || {}, this.captureOverrides(options)); 672 window.__storefrontRuntimeTranslations = merged; 673 window.storetrans = merged; 674 window.__storefrontMergedStoretrans = merged; 675 676 return merged; 677 }, 678 current() { 679 return window.__storefrontRuntimeTranslations || window.storetrans || translations; 680 } 681 }; 682 window.__storefrontGeneratedTranslations = translations;
683 window.StorefrontTranslations.merge(translations); 684 const definitions = {"name":"Oude Kerk","prefix":"oudekerkamsterdam","captcha":null,"appearance":{"fonts":{"title":"static\/fonts\/86\/68b192a01f1a9.ttf","paragraph":"static\/fonts\/86\/68b192a4cd593.ttf"},"images":{"logo":"static\/images\/86\/69e766974e84b.png","favicon":"static\/images\/86\/69e766a782262.jpg","background":null},"colors":{"background":"#f5f6fa","button":"#000000","text_title":"#292929","text_paragraph":"#000000","item_text":"#8091A7","header_background":"#000000","header_text":"#FFFFFF","header_language_selector_background":null,"header_language_selector_text":null,"footer_background":"#ffffff","footer_text":"#000000","button_text":"#FFFFFF","hyperlink":"#000000","availability_high":"#2ECC71","availability_medium":"#F1C40F","availability_low":"#E74C3C","pass_foreground":null,"pass_background":null}},"shop":{"products":9,"upsells":168,"subscriptions":0,"categories":0},"additions":[],"language":"nl","current_language":"en","supported_languages":["nl","de","en","fr","it","es"],"legal_documents":[{"name":"Terms and conditions","url":"https:\/\/oudekerk.nl\/cookies"},{"name":"Privacy policy","url":"https:\/\/oudekerk.nl\/privacy-policy"}],"fields":[{"id":"9c6e49c3-3dc9-4673-bab7-ddf4b5c0093c","name":"Bevestiging e-mailadres","type":"EMAIL_CONFIRM","options":null,"required":true,"sort":0,"products":[],"subscriptions":[],"vouchers":[],"business":false,"order":false,"invoice":false,"applicability":"ALL","visible":true,"default_value":null,"help_text":null},{"id":"ba28fc5a-4685-49cc-97d8-81814a73c05f","name":"Postcode","type":"TEXT","options":null,"required":false,"sort":1,"products":[],"subscriptions":[],"vouchers":[],"business":false,"order":false,"invoice":false,"applicability":"ALL","visible":true,"default_value":null,"help_text":null},{"id":"a8185772-380e-4196-b685-4c4e5606a311","name":"Land","type":"COUNTRY","options":null,"required":false,"sort":2,"products":[],"subscriptions":[],"vouchers":[],"business":false,"order":false,"invoice":false,"applicability":"ALL","visible":true,"default_value":null,"help_text":null},{"id":"13502da1-7c31-4bb6-96ff-ee484b168ca7","name":"Ik ga akkoord met de algemene voorwaarden en bezoekersvoorwaarden","type":"CHECKBOX","options":null,"required":true,"sort":3,"products":[],"subscriptions":[],"vouchers":[],"business":false,"order":false,"invoice":false,"applicability":"ALL","visible":true,"default_value":null,"help_text":null},{"id":"58030b34-1f6a-4653-91b0-4c9a5efbdc72","name":"Ik wil graag de nieuwsbrief ontvangen","type":"CHECKBOX","options":null,"required":false,"sort":4,"products":[],"subscriptions":[],"vouchers":[],"business":false,"order":false,"invoice":false,"applicability":"ALL","visible":true,"default_value":null,"help_text":null}],"security":{"enabled":false},"urls":{"tos":"https:\/\/oudekerk.nl\/cookies","privacy":"https:\/\/oudekerk.nl\/privacy-policy"},"currency":"EUR","allow_business":false,"date":{"date":"2026-10-02 06:47:33.579373","timezone_type":3,"timezone":"Europe\/Amsterdam"},"date_format":"DD-MM-YYYY","timezone":"Europe\/Amsterdam","mode":"LIVE","allowShoppingCart":true,"online_discount_cards":[{"key":"amsterdam_stadspas","label":"Amsterdam Stadspas"}]}; 685 window.storeLegalDocuments = definitions.legal_documents || []; 686 window.Storefront = Object.assign(window.Storefront || {}, { 687 readyCallbacks: (window.Storefront && window.Storefront.readyCallbacks) || [], 688 ready(callback) { 689 this.readyCallbacks.push(callback); 690 }, 691 get(type) { 692 const key = String(type || '').toUpperCase(); 693 694 if (key === 'LANGUAGE') { 695 const normalizeLanguage = (value) => String(value || '').toLowerCase().trim().slice(0, 2); 696 const storedLanguage = localStorage.getItem('storefront_language_explicit') === '1' 697 ? normalizeLanguage(localStorage.getItem('storefront_language')) 698 : ''; 699 const currentLanguage = normalizeLanguage(definitions.current_language); 700 const defaultLanguage = normalizeLanguage(definitions.language); 701 702 return storedLanguage || currentLanguage || defaultLanguage || 'en'; 703 } 704 705 return null; 706 } 707 }); 708 window.StorefrontLanguage = { 709 async select(language, options = { explicit: true }) { 710 if (!language) { 711 return; 712 } 713 const normalizedLanguage = String(language).toLowerCase().trim().slice(0, 2); 714 const explicit = options.explicit === true; 715 localStorage.setItem('storefront_language', normalizedLanguage); 716 localStorage.setItem('storefront_language_explicit', explicit ? '1' : '0'); 717 document.cookie = `storefront_language=${normalizedLanguage}; path=/; max-age=31536000; samesite=lax`; 718 document.cookie = `storefront_language_explicit=${explicit ? '1' : '0'}; path=/; max-age=31536000; samesite=lax`; 719 720 try { 721 const response = await fetch(`/api/storefront/translations?language=${encodeURIComponent(normalizedLanguage)}`, { 722 method: 'GET', 723 headers: { 724 'Accept': 'application/json' 725 } 726 }); 727 728 if (response.ok) { 729 const payload = await response.json(); 730 const data = payload && payload.response ? payload.response : payload; 731 if (data && data.translations) { 732 window.__storefrontGeneratedTranslations = data.translations;
733 window.StorefrontTranslations.merge(data.translations, { captureLegacyStoretrans: true }); 734 window.storeLegalDocuments = Array.isArray(data.legal_documents) ? data.legal_documents : []; 735 if (typeof window.applyStorefrontRuntimeTranslations === 'function') { 736 window.applyStorefrontRuntimeTranslations(); 737 } 738 } 739 document.documentElement.lang = normalizedLanguage; 740 } 741 742 if (window.vm && window.vm.$store) { 743 await window.vm.$store.dispatch('changeLanguage', { 744 language: normalizedLanguage, 745 route: window.vm.$route 746 }); 747 } 748 } catch (error) { 749 console.error('Storefront language switch failed', error); 750 } 751 } 752 }; 753 (function initStorefrontLanguageSelect() { 754 const toggle = document.getElementById('storefront-language-toggle'); 755 const items = Array.from(document.querySelectorAll('.storefront-language-item')); 756 const getCookieValue = (name) => { 757 const prefix = `${name}=`; 758 const parts = document.cookie.split(';').map((part) => part.trim()); 759 const match = parts.find((part) => part.startsWith(prefix)); 760 return match ? match.slice(prefix.length) : null; 761 }; 762 const normalizeLanguage = (value) => String(value || '').toLowerCase().trim().slice(0, 2); 763 const resolveBrowserLanguage = (rawLanguage, supportedLanguages) => { 764 const raw = String(rawLanguage || '').toLowerCase().trim(); 765 if (!raw) { 766 return null; 767 } 768 769 const parts = raw.split('-').filter(Boolean); 770 const candidates = []; 771 772 candidates.push(normalizeLanguage(parts[0])); 773 774 if (parts.length >= 2) { 775 candidates.push(normalizeLanguage(parts[1])); 776 } 777 778 return candidates.find((candidate) => candidate && supportedLanguages.includes(candidate)) || null; 779 }; 780 781 if (!toggle || items.length === 0) { 782 return; 783 } 784 785 const supportedLanguages = Array.from(new Set( 786 items 787 .map((item) => normalizeLanguage(item.dataset.language)) 788 .filter((language) => !!language) 789 )); 790 const currentLanguage = normalizeLanguage(definitions.current_language || definitions.language || ''); 791 const storedLanguage = normalizeLanguage(localStorage.getItem('storefront_language')); 792 const cookieLanguage = normalizeLanguage(getCookieValue('storefront_language')); 793 const cookieLanguageExplicit = getCookieValue('storefront_language_explicit') === '1'; 794 const storedLanguageExplicit = localStorage.getItem('storefront_language_explicit') === '1'; 795 const browserLanguage = resolveBrowserLanguage((navigator.language || navigator.userLanguage || ''), supportedLanguages); 796 const hasPersistedLanguage = (cookieLanguageExplicit || storedLanguageExplicit) && (!!cookieLanguage || !!storedLanguage); 797 798 if (!hasPersistedLanguage && browserLanguage && supportedLanguages.includes(browserLanguage) && browserLanguage !== currentLanguage) { 799 window.StorefrontLanguage.select(browserLanguage, { explicit: false }); 800 return; 801 } 802 803 if (!currentLanguage) { 804 return; 805 } 806 807 808 const updateToggle = (language) => { 809 const activeItem = items.find((item) => normalizeLanguage(item.dataset.language) === language) || items[0]; 810 if (!activeItem) { 811 return; 812 } 813 814 items.forEach((item) => item.classList.remove('active')); 815 activeItem.classList.add('active'); 816 toggle.innerHTML = activeItem.innerHTML; 817 }; 818 819 items.forEach((item) => { 820 item.addEventListener('click', function (event) { 821 event.preventDefault(); 822 const language = normalizeLanguage(this.dataset.language || ''); 823 if (!language) { 824 return; 825 } 826 827 updateToggle(language); 828 window.StorefrontLanguage.select(language); 829 }); 830 }); 831 832 updateToggle(currentLanguage); 833 })(); 834 window.cdn = 'https://cdn.booqi.app/'; 835 if (typeof window.applyStorefrontRuntimeTranslations === 'function') { 836 window.applyStorefrontRuntimeTranslations(); 837 } 838 window.sentry = ''; 839 window.enrichment = { 840 ip: '181.215.65.76', 841 referrer: (document.referrer !== undefined && document.referrer.length > 0 ? document.referrer : false), 842 useragent: (navigator.userAgent !== undefined && navigator.userAgent.length > 0 ? navigator.userAgent : false), 843 screen: { 844 width: screen.width, 845 height: screen.height 846 } 847 }; 848 </script>
848 849 850
850<script type="0f1b92e37160e984b6cc3846-text/javascript"> 851(function () { 852 'use strict'; 853 854 window.Storefront.ready(function () { 855 if (window.__sfCrossSellAvailability297657Installed) return; 856 window.__sfCrossSellAvailability297657Installed = true; 857 858 var PARENT_PRODUCT_ID = 297657; 859 var CROSS_SELL_PRODUCT_ID = 297726; 860 var STEP_NAMES = ['cross_sells', 'cross_sell']; 861 862 var CARD_SELECTOR = '[data-cross_sell-id="' + CROSS_SELL_PRODUCT_ID + '"]'; 863 var NOTICE_CLASS = 'sf-cross-sell-availability-notice'; 864 865 var QUANTITY_NOTICE_ID = 'sf-oude-kerk-quantity-notice'; 866 var QUANTITY_NOTICE_TEXT = 'Je staat op het punt om tickets voor de Oude Kerk in <strong style="font-weight:900!important;">Amsterdam</strong> te kopen'; 867 868 var POLL_INTERVAL = 400; 869 var MAX_ATTEMPTS = 20; 870 871 var state = { 872 isChecking: false, 873 lastDate: null, 874 lastAvailability: null 875 }; 876 877 function safeGet() { 878 try { 879 return window.Storefront.get.apply(window.Storefront, arguments); 880 } catch (err) { 881 return null; 882 } 883 } 884 885 function getProductOrder() { 886 return safeGet('PRODUCT_ORDER'); 887 } 888 889 function getProductCart() { 890 return safeGet('PRODUCT_CART'); 891 } 892 893 function getSelectedProductId() { 894 var order = getProductOrder(); 895 return Number(order?.product_id || order?.product?.id || 0) || null; 896 } 897 898 function normalizeCartItems(cart) { 899 if (Array.isArray(cart)) return cart; 900 if (Array.isArray(cart?.items)) return cart.items; 901 if (Array.isArray(cart?.products)) return cart.products; 902 if (cart && typeof cart === 'object') return Object.values(cart); 903 return []; 904 } 905 906 function cartHasProduct(productId) { 907 var cart = getProductCart(); 908 var items = normalizeCartItems(cart); 909 910 return items.some(function (item) { 911 return Number( 912 item?.product_id || 913 item?.product?.id || 914 item?.id || 915 0 916 ) === Number(productId); 917 }); 918 } 919 920 function hasProductInOrderOrCart(productId) { 921 return ( 922 getSelectedProductId() === Number(productId) || 923 cartHasProduct(productId) 924 ); 925 } 926 927 function hasEntranceAndTowerInOrderOrCart() { 928 return ( 929 hasProductInOrderOrCart(PARENT_PRODUCT_ID) && 930 hasProductInOrderOrCart(CROSS_SELL_PRODUCT_ID) 931 ); 932 } 933 934 function isTargetProductFlow() { 935 return getSelectedProductId() === PARENT_PRODUCT_ID; 936 } 937 938 function isCrossSellStep(step) { 939 var value = step; 940 941 if (step && typeof step === 'object') { 942 value = 943 step.name || 944 step.step || 945 step.key || 946 step.id || 947 step?.to?.step || 948 step?.to?.name || 949 step?.current?.step || 950 step?.current?.name; 951 } 952 953 return STEP_NAMES.indexOf(String(value || '')) !== -1; 954 } 955 956 function isQuantityStep(step) { 957 var value = step; 958 959 if (step && typeof step === 'object') { 960 value = 961 step.name || 962 step.step || 963 step.key || 964 step.id || 965 step?.to?.step || 966 step?.to?.name || 967 step?.current?.step || 968 step?.current?.name; 969 } 970 971 return String(value || '') === 'quantity'; 972 } 973 974 function removeQuantityNotice() { 975 var existing = document.getElementById(QUANTITY_NOTICE_ID); 976 if (existing) existing.remove(); 977 } 978 979 function findQuantityNoticeTarget() { 980 return ( 981 document.querySelector('.product-step') || 982 document.querySelector('.product-quantity-step') || 983 document.querySelector('[data-step="quantity"]') || 984 document.querySelector('.audiences') || 985 document.querySelector('.booking-widget') || 986 document.querySelector('.storefront') 987 ); 988 } 989 990 function addQuantityNotice(attempt) { 991 attempt = attempt || 0; 992 993 if (attempt > MAX_ATTEMPTS) return; 994 if (!isTargetProductFlow()) return; 995 996 var target = findQuantityNoticeTarget(); 997 998 if (!target) { 999 setTimeout(function () { 1000 addQuantityNotice(attempt + 1); 1001 }, POLL_INTERVAL); 1002 return; 1003 } 1004 1005 if (document.getElementById(QUANTITY_NOTICE_ID)) return; 1006 1007 var notice = document.createElement('div'); 1008 notice.id = QUANTITY_NOTICE_ID; 1009 notice.innerHTML = QUANTITY_NOTICE_TEXT; 1010 notice.style.margin = '0 0 16px'; 1011 notice.style.padding = '12px 14px'; 1012 notice.style.background = '#f5f5f5'; 1013 notice.style.border = '1px solid #e0e0e0'; 1014 notice.style.borderLeft = '4px solid #111'; 1015 notice.style.borderRadius = '6px'; 1016 notice.style.fontSize = '14px'; 1017 notice.style.lineHeight = '1.4'; 1018 notice.style.fontWeight = '600'; 1019 notice.style.color = '#111'; 1020 1021 target.insertBefore(notice, target.firstChild); 1022 } 1023 1024 function handleQuantityNotice(step) { 1025 removeQuantityNotice(); 1026 1027 if (!isQuantityStep(step)) return; 1028 if (!isTargetProductFlow()) return; 1029 1030 setTimeout(function () { 1031 addQuantityNotice(0); 1032 }, 100); 1033 } 1034 1035 function getSelectedDateFromPlot() { 1036 var order = getProductOrder(); 1037 if (!order) return null; 1038 1039 var plotId = order?.product?.plot; 1040 if (!plotId) return null; 1041 1042 var plot = safeGet('PLOT_BY_ID', { 1043 productId: PARENT_PRODUCT_ID, 1044 plotId: plotId 1045 }); 1046 1047 if (!plot || !plot.date) return null; 1048 1049 var isoMatch = String(plot.date).match(/^(\d{4}-\d{2}-\d{2})/);
1050 if (isoMatch) return isoMatch[1]; 1051 1052 var parsed = new Date(plot.date); 1053 if (!isNaN(parsed.getTime())) { 1054 return parsed.toISOString().slice(0, 10); 1055 } 1056 1057 return null; 1058 } 1059 1060 function buildUrl(date) { 1061 var url = new URL('https://oudekerkamsterdam.booqi.me/api/products/' + CROSS_SELL_PRODUCT_ID + '/plots'); 1062 url.searchParams.set('filterFrom', date); 1063 url.searchParams.set('filterUntil', date); 1064 return url.toString(); 1065 } 1066 1067 function findCard() { 1068 return document.querySelector(CARD_SELECTOR); 1069 } 1070 1071 function findButton(card) { 1072 if (!card) return null; 1073 1074 var buttons = card.querySelectorAll('button'); 1075 for (var i = 0; i < buttons.length; i++) { 1076 var txt = (buttons[i].textContent || '').toLowerCase(); 1077 if (txt.indexOf('boeken') !== -1 || txt.indexOf('niet beschikbaar') !== -1) { 1078 return buttons[i]; 1079 } 1080 } 1081 1082 return card.querySelector('button'); 1083 } 1084 1085 function getOrCreateNotice(card) { 1086 if (!card) return null; 1087 1088 var existing = card.querySelector('.' + NOTICE_CLASS); 1089 if (existing) return existing; 1090 1091 var el = document.createElement('div'); 1092 el.className = NOTICE_CLASS; 1093 el.style.display = 'none'; 1094 el.style.margin = '8px'; 1095 el.style.padding = '10px'; 1096 el.style.borderRadius = '6px'; 1097 el.style.fontSize = '14px'; 1098 el.style.lineHeight = '1.4'; 1099 el.style.fontWeight = '600'; 1100 1101 var innerCard = card.querySelector('.card') || card; 1102 innerCard.appendChild(el); 1103 1104 return el; 1105 } 1106 1107 function setState(card, type, text) { 1108 var notice = getOrCreateNotice(card); 1109 if (!notice) return; 1110 1111 notice.textContent = text || ''; 1112 notice.style.display = text ? 'block' : 'none'; 1113 1114 if (type === 'info') { 1115 notice.style.background = '#e9f2ff'; 1116 notice.style.color = '#1f4b99'; 1117 notice.style.border = '1px solid #cfe0ff'; 1118 } else if (type === 'error') { 1119 notice.style.background = '#f8d7da'; 1120 notice.style.color = '#842029'; 1121 notice.style.border = '1px solid #f5c2c7'; 1122 } else { 1123 notice.style.background = '#fff3cd'; 1124 notice.style.color = '#856404'; 1125 notice.style.border = '1px solid #ffeeba'; 1126 } 1127 } 1128 1129 function setAvailable(card) { 1130 var btn = findButton(card); 1131 var innerCard = card.querySelector('.card') || card; 1132 1133 setState(card, 'info', ''); 1134 1135 if (btn) { 1136 btn.disabled = false; 1137 btn.removeAttribute('aria-disabled'); 1138 btn.textContent = 'Boeken'; 1139 btn.style.fontSize = '14px'; 1140 btn.style.opacity = ''; 1141 btn.style.cursor = ''; 1142 } 1143 1144 innerCard.style.opacity = ''; 1145 innerCard.style.pointerEvents = ''; 1146 } 1147 1148 function setUnavailable(card) { 1149 var btn = findButton(card); 1150 var innerCard = card.querySelector('.card') || card; 1151 1152 setState(card, 'warning', 'Niet beschikbaar op de gekozen datum.'); 1153 1154 if (btn) { 1155 btn.disabled = true; 1156 btn.setAttribute('aria-disabled', 'true'); 1157 btn.textContent = 'Niet beschikbaar'; 1158 btn.style.opacity = '0.6'; 1159 btn.style.cursor = 'not-allowed'; 1160 } 1161 1162 innerCard.style.opacity = '0.7'; 1163 innerCard.style.pointerEvents = 'none'; 1164 } 1165 1166 function setChecking(card) { 1167 var btn = findButton(card); 1168 var innerCard = card.querySelector('.card') || card; 1169 1170 setState(card, 'info', ''); 1171 1172 if (btn) { 1173 btn.disabled = true; 1174 btn.setAttribute('aria-disabled', 'true'); 1175 btn.textContent = 'Beschikbaarheid controleren...'; 1176 btn.style.fontSize = '11px'; 1177 btn.style.opacity = '0.6'; 1178 btn.style.cursor = 'wait'; 1179 } 1180 1181 innerCard.style.opacity = '0.7'; 1182 innerCard.style.pointerEvents = 'none'; 1183 } 1184 1185 function setError(card) { 1186 var btn = findButton(card); 1187 var innerCard = card.querySelector('.card') || card; 1188 1189 setState(card, 'error', 'Fout bij ophalen beschikbaarheid.'); 1190 1191 if (btn) { 1192 btn.disabled = true; 1193 btn.setAttribute('aria-disabled', 'true'); 1194 btn.textContent = 'Niet beschikbaar'; 1195 btn.style.opacity = '0.6'; 1196 btn.style.cursor = 'not-allowed'; 1197 } 1198 1199 innerCard.style.opacity = '0.7'; 1200 innerCard.style.pointerEvents = 'none'; 1201 } 1202 1203 function setMissingDate(card) { 1204 var btn = findButton(card); 1205 var innerCard = card.querySelector('.card') || card; 1206 1207 setState(card, 'warning', 'Geen datum gevonden.'); 1208 1209 if (btn) { 1210 btn.disabled = true; 1211 btn.setAttribute('aria-disabled', 'true'); 1212 btn.textContent = 'Niet beschikbaar'; 1213 btn.style.opacity = '0.6'; 1214 btn.style.cursor = 'not-allowed'; 1215 } 1216 1217 innerCard.style.opacity = '0.7'; 1218 innerCard.style.pointerEvents = 'none'; 1219 } 1220 1221 function getSelectedAudienceQuantity() { 1222 var order = getProductOrder();
1223 var audiences = order?.audiences; 1224 1225 if (!Array.isArray(audiences) || !audiences.length) return 0; 1226 1227 return audiences.reduce(function (total, audience) { 1228 return total + Number(audience?.quantity || 0); 1229 }, 0); 1230 } 1231 1232 function parseAvailability(data) { 1233 var list = 1234 (Array.isArray(data?.response) && data.response) || 1235 (Array.isArray(data?.data) && data.data) || 1236 (Array.isArray(data?.plots) && data.plots) || 1237 (Array.isArray(data) && data) || 1238 []; 1239 1240 if (!list.length) return false; 1241 1242 var requiredQuantity = getSelectedAudienceQuantity(); 1243 if (requiredQuantity <= 0) return false; 1244 1245 return list.some(function (item) { 1246 var availableAmount = Number(item?.availability?.amount || 0); 1247 1248 return ( 1249 availableAmount >= requiredQuantity && 1250 item?.maxOrdersReached !== true 1251 ); 1252 }); 1253 } 1254 1255 function check(card) { 1256 if (!card) return; 1257 if (state.isChecking) return; 1258 if (!isTargetProductFlow()) return; 1259 1260 var date = getSelectedDateFromPlot(); 1261 1262 if (!date) { 1263 setMissingDate(card); 1264 return; 1265 } 1266 1267 if (state.lastDate === date && state.lastAvailability !== null) { 1268 state.lastAvailability ? setAvailable(card) : setUnavailable(card); 1269 return; 1270 } 1271 1272 state.isChecking = true; 1273 setChecking(card); 1274 1275 fetch(buildUrl(date), { 1276 method: 'GET', 1277 headers: { Accept: 'application/json' }, 1278 credentials: 'same-origin' 1279 }) 1280 .then(function (response) { 1281 if (!response.ok) throw new Error('Request failed: ' + response.status); 1282 return response.json(); 1283 }) 1284 .then(function (data) { 1285 var hasAvailability = parseAvailability(data); 1286 1287 state.lastDate = date; 1288 state.lastAvailability = hasAvailability; 1289 1290 hasAvailability ? setAvailable(card) : setUnavailable(card); 1291 }) 1292 .catch(function (error) { 1293 console.error('[Storefront] Cross-sell availability check failed:', error); 1294 setError(card); 1295 }) 1296 .finally(function () { 1297 state.isChecking = false; 1298 }); 1299 } 1300 1301 function waitForCard(attempt) { 1302 if (attempt > MAX_ATTEMPTS) return; 1303 if (!isTargetProductFlow()) return; 1304 1305 var card = findCard(); 1306 if (card) { 1307 check(card); 1308 return; 1309 } 1310 1311 setTimeout(function () { 1312 waitForCard(attempt + 1); 1313 }, POLL_INTERVAL); 1314 } 1315 1316 function findContinueButton() { 1317 var candidates = document.querySelectorAll('button, a, [role="button"]'); 1318 1319 for (var i = 0; i < candidates.length; i++) { 1320 var text = (candidates[i].textContent || '').trim().toLowerCase(); 1321 1322 if ( 1323 candidates[i].getAttribute('data-button') === 'continue' || 1324 text.indexOf('doorgaan') !== -1 || 1325 text.indexOf('verder') !== -1 || 1326 text.indexOf('overslaan') !== -1 1327 ) { 1328 return candidates[i]; 1329 } 1330 } 1331 1332 return null; 1333 } 1334 1335 function clickContinueButton(btn) { 1336 if (!btn) return false; 1337 1338 btn.disabled = false; 1339 btn.removeAttribute('disabled'); 1340 btn.removeAttribute('aria-disabled'); 1341 btn.style.pointerEvents = ''; 1342 btn.style.opacity = ''; 1343 btn.style.cursor = ''; 1344 1345 btn.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window })); 1346 btn.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window })); 1347 btn.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window })); 1348 1349 return true; 1350 } 1351 1352 function skipCrossSellStep(attempt) { 1353 attempt = attempt || 0; 1354 if (attempt > 40) return; 1355 if (!hasEntranceAndTowerInOrderOrCart()) return; 1356 1357 var btn = findContinueButton(); 1358 1359 if (btn && btn.offsetParent !== null) { 1360 clickContinueButton(btn); 1361 return; 1362 } 1363 1364 setTimeout(function () { 1365 skipCrossSellStep(attempt + 1); 1366 }, 250); 1367 } 1368 1369 function forceLockContinueButton() { 1370 var btn = findContinueButton(); 1371 if (!btn) return; 1372 1373 if (!btn.hasAttribute('data-original-text')) { 1374 btn.setAttribute('data-original-text', btn.textContent || 'Doorgaan'); 1375 } 1376 1377 $('.card-title').text('De Oudekerkstoren is alleen te bezoeken in combinatie met een toegangsticket voor de Oude Kerk. Boek hier je ticket voor de Oude Kerk.'); 1378 1379 btn.textContent = 'Boek eerst je entreeticket(s)!'; 1380 btn.disabled = true; 1381 btn.setAttribute('aria-disabled', 'true'); 1382 btn.style.pointerEvents = 'none'; 1383 btn.style.opacity = '0.6'; 1384 btn.style.cursor = 'not-allowed'; 1385 } 1386 1387 function waitForForceLock(attempt) { 1388 if (attempt > MAX_ATTEMPTS) return; 1389 if (getSelectedProductId() !== CROSS_SELL_PRODUCT_ID) return; 1390 if (hasEntranceAndTowerInOrderOrCart()) return; 1391 1392 var btn = findContinueButton(); 1393 if (btn) { 1394 forceLockContinueButton(); 1395 return; 1396 } 1397 1398 setTimeout(function () { 1399 waitForForceLock(attempt + 1); 1400 }, POLL_INTERVAL); 1401 } 1402 1403 function waitForElement(selector, callback, maxAttempts, interval) { 1404 var attempts = 0; 1405 maxAttempts = maxAttempts || 20; 1406 interval = interval || 400; 1407 1408 function checkElement() { 1409 var $el = $(selector); 1410 1411 if ($el.length) { 1412 callback($el); 1413 return; 1414 } 1415 1416 attempts++; 1417 if (attempts >= maxAttempts) return; 1418 1419 setTimeout(checkElement, interval); 1420 } 1421 1422 checkElement(); 1423 } 1424 1425 window.Storefront.on('PRODUCT_STEP_CHANGED', function (step) { 1426 var selectedProductId = getSelectedProductId(); 1427 1428 handleQuantityNotice(step); 1429 1430 if (selectedProductId === PARENT_PRODUCT_ID) { 1431 if (isCrossSellStep(step) && hasEntranceAndTowerInOrderOrCart()) { 1432 skipCrossSellStep(0); 1433 return; 1434 } 1435 1436 if (hasEntranceAndTowerInOrderOrCart() || step?.step === 'quantity') { 1437 waitForElement('.back-to + button', function ($btn) { 1438 $btn.remove(); 1439 $('button.ni-trash').remove(); 1440 }, 30, 300); 1441 } 1442 } 1443 1444 if (!isCrossSellStep(step)) return; 1445 1446 if (selectedProductId === CROSS_SELL_PRODUCT_ID) { 1447 waitForForceLock(0); 1448 return; 1449 } 1450 1451 if (!isTargetProductFlow()) return; 1452 1453 waitForCard(0); 1454 }); 1455 1456 window.Storefront.on('PLOT_UPDATED', function () { 1457 state.lastDate = null; 1458 state.lastAvailability = null; 1459 1460 var card = findCard(); 1461 if (card) check(card); 1462 }); 1463 }); 1464})(); 1465</script>
vendor: 1 bytes, line 1465
1465
1466<script type="0f1b92e37160e984b6cc3846-text/javascript"> 1467 if (window.StorefrontTranslations && window.__storefrontGeneratedTranslations) { 1468 window.StorefrontTranslations.merge(window.__storefrontGeneratedTranslations, { captureLegacyStoretrans: true }); 1469 1470 if (typeof window.applyStorefrontRuntimeTranslations === 'function') { 1471 window.applyStorefrontRuntimeTranslations(); 1472 } 1473 1474 if (window.vm && typeof window.vm.$forceUpdate === 'function') { 1475 const forceUpdate = function (component) { 1476 component.$forceUpdate(); 1477 component.$children.forEach(forceUpdate); 1478 }; 1479 forceUpdate(window.vm); 1480 } 1481 } 1482</script>
vendor: 143 bytes, lines 1482-1483
1482 1483<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0f1b92e37160e984b6cc3846-|49" defer></script>
1483<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"0020f5201f59499c9adc64aeb1c7943a","spa":2}' crossorigin="anonymous"></script>
1483 1484</body> 1485</html>
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.