PageSourceSearch

https://tickets.oudekerk.nl/product/297657/regulier-entree-ticket

html oudekerk.nl collected 2026-10-02 04:47:34 UTC 97,633 bytes, 1,485 lines download raw bytes

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        &copy; 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.