PageSourceSearch

https://domstadboot.nl/contact/

html domstadboot.nl collected 2026-10-07 00:27:33 UTC 237,940 bytes, 4,821 lines download raw bytes

1<!doctype html>
2<html dir="ltr" lang="nl-NL">
3<head>
4	<meta charset="UTF-8">
5	<meta name="viewport" content="width=device-width, initial-scale=1">
6	<link rel="profile" href="https://gmpg.org/xfn/11">
7	<title>Domstadboot - contact | Voor al uw vragen | Domstadboot</title>
8
9		<!-- All in One SEO Pro 5.0.0.1 - aioseo.com -->
10	<meta name="description" content="Voelt u zich geheel vrij om informatie aan te vragen. Als u gebruik maakt van het contact-formulier hieronder, vergeet dan niet te vermelden waar u graag meer over wilt weten." />
11	<meta name="robots" content="max-image-preview:large" />
12	<link rel="canonical" href="https://domstadboot.nl/contact/" />
13	<meta name="generator" content="All in One SEO Pro (AIOSEO) 5.0.0.1" />
14		
14<script type="application/ld+json" class="aioseo-schema">
15			{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/domstadboot.nl\/contact\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/domstadboot.nl#listItem","position":1,"name":"Home","item":"https:\/\/domstadboot.nl","nextItem":{"@type":"ListItem","@id":"https:\/\/domstadboot.nl\/contact\/#listItem","name":"Contact"}},{"@type":"ListItem","@id":"https:\/\/domstadboot.nl\/contact\/#listItem","position":2,"name":"Contact","previousItem":{"@type":"ListItem","@id":"https:\/\/domstadboot.nl#listItem","name":"Home"}}]},{"@type":"Organization","@id":"https:\/\/domstadboot.nl\/#organization","name":"Domstadboot","description":"Varen in stijl!","url":"https:\/\/domstadboot.nl\/","email":"[email protected]","telephone":"+31618426144","logo":{"@type":"ImageObject","url":"https:\/\/domstadboot.nl\/wp-content\/uploads\/2022\/06\/cropped-Domstadboot_logo_14.png","@id":"https:\/\/domstadboot.nl\/contact\/#organizationLogo","width":512,"height":512,"caption":"Varen in stijl sloep huren utrecht"},"image":{"@id":"https:\/\/domstadboot.nl\/contact\/#organizationLogo"},"sameAs":["https:\/\/www.instagram.com\/domstadboot\/"],"address":{"@id":"https:\/\/domstadboot.nl\/#postaladdress","@type":"PostalAddress","streetAddress":"Oudegracht 181","postalCode":"3511 NE","addressLocality":"Utrecht","addressCountry":"NL"},"vatID":"NL004263147B03"},{"@type":"WebPage","@id":"https:\/\/domstadboot.nl\/contact\/#webpage","url":"https:\/\/domstadboot.nl\/contact\/","name":"Domstadboot - contact | Voor al uw vragen | Domstadboot","description":"Voelt u zich geheel vrij om informatie aan te vragen. Als u gebruik maakt van het contact-formulier hieronder, vergeet dan niet te vermelden waar u graag meer over wilt weten.","inLanguage":"nl-NL","isPartOf":{"@id":"https:\/\/domstadboot.nl\/#website"},"breadcrumb":{"@id":"https:\/\/domstadboot.nl\/contact\/#breadcrumblist"},"datePublished":"2018-03-05T12:20:23+01:00","dateModified":"2026-07-03T13:16:07+01:00"},{"@type":"WebSite","@id":"https:\/\/domstadboot.nl\/#website","url":"https:\/\/domstadboot.nl\/","name":"Domstadboot","description":"Zorgeloos varen op de mooiste sloep van Utrecht!","inLanguage":"nl-NL","publisher":{"@id":"https:\/\/domstadboot.nl\/#organization"}}]}
16		</script>
16
17		<!-- All in One SEO Pro -->
18
19
20<!-- Google Tag Manager for WordPress by gtm4wp.com -->
21<script data-cfasync="false" data-pagespeed-no-defer>
22	var gtm4wp_datalayer_name = "dataLayer";
23	var dataLayer = dataLayer || [];
24</script>
24
25<!-- End Google Tag Manager for WordPress by gtm4wp.com --><link rel='dns-prefetch' href='//www.googletagmanager.com' />
26<link rel='dns-prefetch' href='//fh-kit.com' />
27<link rel="alternate" type="application/rss+xml" title="Domstadboot &raquo; feed" href="https://domstadboot.nl/feed/" />
28<link rel="alternate" type="application/rss+xml" title="Domstadboot &raquo; reacties feed" href="https://domstadboot.nl/comments/feed/" />
29<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://domstadboot.nl/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fdomstadboot.nl%2Fcontact%2F" />
30<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://domstadboot.nl/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fdomstadboot.nl%2Fcontact%2F&#038;format=xml" />
31<style id="wp-img-auto-sizes-contain-inline-css">
32img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
33/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
34</style>
35<link rel='stylesheet' id='ht_ctc_main_css-css' href='https://domstadboot.nl/wp-content/plugins/click-to-chat-for-whatsapp/new/inc/assets/css/main.css?ver=4.43' media='all' />
36<link rel='stylesheet' id='sbi_styles-css' href='https://domstadboot.nl/wp-content/plugins/instagram-feed/css/sbi-styles.min.css?ver=6.10.1' media='all' />
37<style id="wp-emoji-styles-inline-css">
38
39	img.wp-smiley, img.emoji {
40		display: inline !important;
41		border: none !important;
42		box-shadow: none !important;
43		height: 1em !important;
44		width: 1em !important;
45		margin: 0 0.07em !important;
46		vertical-align: -0.1em !important;
47		background: none !important;
48		padding: 0 !important;
49	}
50/*# sourceURL=wp-emoji-styles-inline-css */
51</style>
52<style id="classic-theme-styles-inline-css">
53/*! This file is auto-generated */
54.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
55/*# sourceURL=/wp-includes/css/classic-themes.min.css */
56</style>
57<link rel='stylesheet' id='aioseo-local-business/css/src/assets/scss/business-info.scss-css' href='https://domstadboot.nl/wp-content/plugins/aioseo-local-business/dist/css/business-info.BWoeH1k0.css?ver=1.3.15' media='all' />
58<link rel='stylesheet' id='aioseo-local-business/css/src/assets/scss/opening-hours.scss-css' href='https://domstadboot.nl/wp-content/plugins/aioseo-local-business/dist/css/opening-hours.othxJ9PM.css?ver=1.3.15' media='all' />
59<link rel='stylesheet' id='aioseo/css/src/vue/standalone/blocks/table-of-contents/global.scss-css' href='https://domstadboot.nl/wp-content/plugins/all-in-one-seo-pack-pro/dist/Pro/assets/css/table-of-contents/global.e90f6d47.css?ver=5.0.0.1' media='all' />
60<link rel='stylesheet' id='aioseo/css/src/vue/standalone/blocks/pro/recipe/global.scss-css' href='https://domstadboot.nl/wp-content/plugins/all-in-one-seo-pack-pro/dist/Pro/assets/css/recipe/global.d86a4aa4.css?ver=5.0.0.1' media='all' />
61<link rel='stylesheet' id='aioseo/css/src/vue/standalone/blocks/pro/product/global.scss-css' href='https://domstadboot.nl/wp-content/plugins/all-in-one-seo-pack-pro/dist/Pro/assets/css/product/global.0f804f5f.css?ver=5.0.0.1' media='all' />
62<style id="global-styles-inline-css">
63:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,
630) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
63.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
64:root :where(.wp-block-icon svg){width: 24px;}
65:where(.wp-block-gallery.is-layout-flex){gap: var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );}:where(.wp-block-gallery.is-layout-grid){gap: var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );}
66:where(.wp-block-latest-posts.is-layout-flex){gap: 1.25em;}:where(.wp-block-latest-posts.is-layout-grid){gap: 1.25em;}
67:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
68:where(.wp-block-term-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-term-template.is-layout-grid){gap: 1.25em;}
69:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
70:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}
71/*# sourceURL=global-styles-inline-css */
72</style>
73<link rel='stylesheet' id='hello-elementor-css' href='https://domstadboot.nl/wp-content/themes/hello-elementor/style.min.css?ver=3.0.1' media='all' />
74<link rel='stylesheet' id='hello-elementor-theme-style-css' href='https://domstadboot.nl/wp-content/themes/hello-elementor/theme.min.css?ver=3.0.1' media='all' />
75<link rel='stylesheet' id='hello-elementor-header-footer-css' href='https://domstadboot.nl/wp-content/themes/hello-elementor/header-footer.min.css?ver=3.0.1' media='all' />
76<link rel='stylesheet' id='elementor-frontend-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/css/frontend.min.css?ver=4.0.1' media='all' />
77<link rel='stylesheet' id='elementor-post-4573-css' href='https://domstadboot.nl/wp-content/uploads/elementor/css/post-4573.css?ver=1787039692' media='all' />
78<link rel='stylesheet' id='widget-icon-list-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/css/widget-icon-list.min.css?ver=4.0.1' media='all' />
79<link rel='stylesheet' id='widget-image-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/css/widget-image.min.css?ver=4.0.1' media='all' />
80<link rel='stylesheet' id='widget-nav-menu-css' href='https://domstadboot.nl/wp-content/plugins/elementor-pro/assets/css/widget-nav-menu.min.css?ver=3.32.2' media='all' />
81<link rel='stylesheet' id='e-animation-zoomIn-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/lib/animations/styles/zoomIn.min.css?ver=4.0.1' media='all' />
82<link rel='stylesheet' id='widget-heading-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/css/widget-heading.min.css?ver=4.0.1' media='all' />
83<link rel='stylesheet' id='widget-divider-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/css/widget-divider.min.css?ver=4.0.1' media='all' />
84<link rel='stylesheet' id='elementor-icons-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/lib/eicons/css/elementor-icons.min.css?ver=5.48.0' media='all' />
85<link rel='stylesheet' id='sbistyles-css' href='https://domstadboot.nl/wp-content/plugins/instagram-feed/css/sbi-styles.min.css?ver=6.10.1' media='all' />
86<link rel='stylesheet' id='widget-spacer-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/css/widget-spacer.min.css?ver=4.0.1' media='all' />
87<link rel='stylesheet' id='widget-form-css' href='https://domstadboot.nl/wp-content/plugins/elementor-pro/assets/css/widget-form.min.css?ver=3.32.2' media='all' />
88<link rel='stylesheet' id='widget-google_maps-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/css/widget-google_maps.min.css?ver=4.0.1' media='all' />
89<link rel='stylesheet' id='widget-icon-box-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/css/widget-icon-box.min.css?ver=4.0.1' media='all' />
90<link rel='stylesheet' id='elementor-post-3265-css' href='https://domstadboot.nl/wp-content/uploads/elementor/css/post-3265.css?ver=1787042725' media='all' />
91<link rel='stylesheet' id='elementor-post-4625-css' href='https://domstadboot.nl/wp-content/uploads/elementor/css/post-4625.css?ver=1787039692' media='all' />
92<link rel='stylesheet' id='elementor-post-4639-css' href='https://domstadboot.nl/wp-content/uploads/elementor/css/post-4639.css?ver=1789053068' media='all' />
93<link rel='stylesheet' id='fh-buttons-css' href='https://fh-kit.com/buttons/v2/?pop=cf7931' media='all' />
94<link rel='stylesheet' id='lgc-unsemantic-grid-responsive-tablet-css' href='https://domstadboot.nl/wp-content/plugins/lightweight-grid-columns/css/unsemantic-grid-responsive-tablet.css?ver=1.0' media='all' />
95<link rel='stylesheet' id='elementor-gf-local-montserrat-css' href='https://domstadboot.nl/wp-content/uploads/elementor/google-fonts/css/montserrat.css?ver=1743863675' media='all' />
96<link rel='stylesheet' id='elementor-gf-local-poppins-css' href='https://domstadboot.nl/wp-content/uploads/elementor/google-fonts/css/poppins.css?ver=1743873749' media='all' />
97<link rel='stylesheet' id='elementor-icons-shared-0-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/lib/font-awesome/css/fontawesome.min.css?ver=5.15.3' media='all' />
98<link rel='stylesheet' id='elementor-icons-fa-solid-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/lib/font-awesome/css/solid.min.css?ver=5.15.3' media='all' />
99<link rel='stylesheet' id='elementor-icons-fa-brands-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/lib/font-awesome/css/brands.min.css?ver=5.15.3' media='all' />
100<script id="jquery-core-js" src="https://domstadboot.nl/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
vendor: 1 bytes, line 100
100
101<script id="jquery-migrate-js" src="https://domstadboot.nl/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
101
102
103<!-- Google tag (gtag.js) snippet toegevoegd door Site Kit -->
104<!-- Google Analytics snippet toegevoegd door Site Kit -->
vendor: 80 bytes, lines 104-105
104
105<script id="google_gtagjs-js" src="https://www.googletagmanager.com/gtag/js?id=
105GT-KTPDB5D
vendor: 18 bytes, line 105
105" async></script>
106<script id="google_gtagjs-js-after">
107window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}
108gtag("set","linker",{"domains":["domstadboot.nl"]});
109gtag("js", new Date());
110gtag("set", "developer_id.dZTNiMT", true);
111gtag("config", "GT-KTPDB5D");
112 window._googlesitekit = window._googlesitekit || {}; window._googlesitekit.throttledEvents = []; window._googlesitekit.gtagEvent = (name, data) => { var key = JSON.stringify( { name, data } ); if ( !! window._googlesitekit.throttledEvents[ key ] ) { return; } window._googlesitekit.throttledEvents[ key ] = true; setTimeout( () => { delete window._googlesitekit.throttledEvents[ key ]; }, 5 ); gtag( "event", name, { ...data, event_source: "site-kit" } ); }; 
113//# sourceURL=google_gtagjs-js-after
114</script>
114
115<link rel="https://api.w.org/" href="https://domstadboot.nl/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://domstadboot.nl/wp-json/wp/v2/pages/3265" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://domstadboot.nl/xmlrpc.php?rsd" />
116<meta name="generator" content="WordPress 7.1" />
117<link rel='shortlink' href='https://domstadboot.nl/?p=3265' />
118<meta name="generator" content="Site Kit by Google 1.176.0" /><!-- Google Search Console verificatie -->
119<meta name="google-site-verification" content="hM0gNNu3Z8ddk4DkTHd00aBvduXe61UgVdMTy66KjEA" />		<!--[if lt IE 9]>
120			<link rel="stylesheet" href="https://domstadboot.nl/wp-content/plugins/lightweight-grid-columns/css/ie.min.css" />
121		<![endif]-->
122	<meta name="ti-site-data" content="eyJyIjoiMTowITc6MCEzMDoxIiwibyI6Imh0dHBzOlwvXC9kb21zdGFkYm9vdC5ubD90aS1vbmxpbmUtdXNlcnMtZ29vZ2xlPTEmYW1wO3A9JTJGY29udGFjdCUyRiZhbXA7X3dwbm9uY2U9ZjAwNTQzMDhmNCJ9" />
123<!-- Google Tag Manager for WordPress by gtm4wp.com -->
124<!-- GTM Container placement set to footer -->
125<script data-cfasync="false" data-pagespeed-no-defer>
126	var dataLayer_content = {"pagePostType":"page","pagePostType2":"single-page","pagePostAuthor":"Annelies"};
127	dataLayer.push( dataLayer_content );
128</script>
vendor: 1 bytes, line 128
128
129<script data-cfasync="false" data-pagespeed-no-defer>
vendor: 322 bytes, lines 129-134
129
130(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
131new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
132j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
133'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
134})(window,document,'script','dataLayer','
134GTM-5WT74M2
vendor: 4 bytes, line 134
134');
135</script>
135
136<!-- End Google Tag Manager for WordPress by gtm4wp.com --><meta name="generator" content="Elementor 4.0.1; features: additional_custom_breakpoints; settings: css_print_method-external, google_font-enabled, font_display-auto">
137			<style>
138				.e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload),
139				.e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload) * {
140					background-image: none !important;
141				}
142				@media screen and (max-height: 1024px) {
143					.e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload),
144					.e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload) * {
145						background-image: none !important;
146					}
147				}
148				@media screen and (max-height: 640px) {
149					.e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload),
150					.e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload) * {
151						background-image: none !important;
152					}
153				}
154			</style>
155			<!-- Call Now Button 2.0.2 (https://callnowbutton.com) [renderer:noop]-->
156<link rel="icon" href="https://domstadboot.nl/wp-content/uploads/2022/06/cropped-Domstadboot_logo_14-32x32.png" sizes="32x32" />
157<link rel="icon" href="https://domstadboot.nl/wp-content/uploads/2022/06/cropped-Domstadboot_logo_14-192x192.png" sizes="192x192" />
158<link rel="apple-touch-icon" href="https://domstadboot.nl/wp-content/uploads/2022/06/cropped-Domstadboot_logo_14-180x180.png" />
159<meta name="msapplication-TileImage" content="https://domstadboot.nl/wp-content/uploads/2022/06/cropped-Domstadboot_logo_14-270x270.png" />
160</head>
161<body class="wp-singular page-template-default page page-id-3265 wp-custom-logo wp-theme-hello-elementor elementor-default elementor-kit-4573 elementor-page elementor-page-3265 elementor-page-4687 elementor-page-4685 elementor-page-4648">
162
163<script type="text/javascript" src="https://app.ranktool.nl/suggestion.js" defer></script>
163
164<a class="skip-link screen-reader-text" href="#content">Ga naar de inhoud</a>
165
166		<header data-elementor-type="header" data-elementor-id="4625" class="elementor elementor-4625 elementor-location-header" data-elementor-post-type="elementor_library">
167					<section class="elementor-section elementor-top-section elementor-element elementor-element-352b812 elementor-section-full_width elementor-section-height-default elementor-section-height-default" data-id="352b812" data-element_type="section" data-e-type="section" id="header_pop">
168						<div class="elementor-container elementor-column-gap-default">
169					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ca9eff7" data-id="ca9eff7" data-element_type="column" data-e-type="column" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
170			<div class="elementor-widget-wrap elementor-element-populated">
171						<section class="elementor-section elementor-inner-section elementor-element elementor-element-66464789 elementor-reverse-mobile elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="66464789" data-element_type="section" data-e-type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
172						<div class="elementor-container elementor-column-gap-default">
173					<div class="elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-104f20ce elementor-hidden-phone" data-id="104f20ce" data-element_type="column" data-e-type="column">
174			<div class="elementor-widget-wrap elementor-element-populated">
175						<div class="elementor-element elementor-element-82098c8 elementor-icon-list--layout-inline elementor-align-center elementor-mobile-align-center elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="82098c8" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default">
176				<div class="elementor-widget-container">
177							<ul class="elementor-icon-list-items elementor-inline-items">
178							<li class="elementor-icon-list-item elementor-inline-item">
179											<a href="tel:+31618426144">
180
181												<span class="elementor-icon-list-icon">
182							<i aria-hidden="true" class="fas fa-phone"></i>						</span>
183										<span class="elementor-icon-list-text">+31618426144</span>
184											</a>
185									</li>
186								<li class="elementor-icon-list-item elementor-inline-item">
187											<span class="elementor-icon-list-icon">
188							<i aria-hidden="true" class="fas fa-envelope"></i>						</span>
189										<span class="elementor-icon-list-text"><a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1d74737b725d7972706e697c797f727269337371">[email&#160;protected]</a></span>
190									</li>
191								<li class="elementor-icon-list-item elementor-inline-item">
192											<a href="https://www.google.com/maps/place/Domstadboot/@52.0890479,5.1186402,548m/data=!3m2!1e3!4b1!4m6!3m5!1s0x47c66f5a930394ed:0xd2b4f9cff97434a1!8m2!3d52.0890479!4d5.1212151!16s%2Fg%2F11hbh8vqg2?entry=ttu&#038;g_ep=EgoyMDI2MDQwNS4wIKXMDSoASAFQAw%3D%3D" target="_blank">
193
194												<span class="elementor-icon-list-icon">
195							<i aria-hidden="true" class="fas fa-map-marker-alt"></i>						</span>
196										<span class="elementor-icon-list-text">Oudegracht 181, Utrecht</span>
197											</a>
198									</li>
199								<li class="elementor-icon-list-item elementor-inline-item">
200											<a href="https://www.instagram.com/domstadboot/?hl=en" target="_blank">
201
202												<span class="elementor-icon-list-icon">
203							<i aria-hidden="true" class="fab fa-instagram"></i>						</span>
204										<span class="elementor-icon-list-text"></span>
205											</a>
206									</li>
207						</ul>
208						</div>
209				</div>
210					</div>
211		</div>
212					</div>
213		</section>
214				<section class="elementor-section elementor-inner-section elementor-element elementor-element-2119efee elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="2119efee" data-element_type="section" data-e-type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
215						<div class="elementor-container elementor-column-gap-default">
216					<div class="elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-5fb7f3d5" data-id="5fb7f3d5" data-element_type="column" data-e-type="column" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
217			<div class="elementor-widget-wrap elementor-element-populated">
218						<div class="elementor-element elementor-element-b8e8f30 elementor-widget__width-initial elementor-widget-mobile__width-initial elementor-widget elementor-widget-image" data-id="b8e8f30" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
219				<div class="elementor-widget-container">
220																<a href="/">
221							<img fetchpriority="high" width="300" height="300" src="https://domstadboot.nl/wp-content/uploads/2022/06/cropped-Domstadboot_logo_14-300x300.png" class="attachment-medium size-medium wp-image-5284" alt="Logo Domstadboot Bootje huren Utrecht" srcset="https://domstadboot.nl/wp-content/uploads/2022/06/cropped-Domstadboot_logo_14-300x300.png 300w, https://domstadboot.nl/wp-content/uploads/2022/06/cropped-Domstadboot_logo_14-80x80.png 80w, https://domstadboot.nl/wp-content/uploads/2022/06/cropped-Domstadboot_logo_14-270x270.png 270w, https://domstadboot.nl/wp-content/uploads/2022/06/cropped-Domstadboot_logo_14-192x192.png 192w, https://domstadboot.nl/wp-content/uploads/2022/06/cropped-Domstadboot_logo_14-180x180.png 180w, https://domstadboot.nl/wp-content/uploads/2022/06/cropped-Domstadboot_logo_14-32x32.png 32w, https://domstadboot.nl/wp-content/uploads/2022/06/cropped-Domstadboot_logo_14.png 512w" sizes="(max-width: 300px) 100v
221w, 300px" title="Logo Domstadboot | Domstadboot" />								</a>
222															</div>
223				</div>
224					</div>
225		</div>
226				<div class="elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-c70c7d0 col-menu" data-id="c70c7d0" data-element_type="column" data-e-type="column">
227			<div class="elementor-widget-wrap elementor-element-populated">
228						<div class="elementor-element elementor-element-544bb2f0 elementor-nav-menu__align-justify elementor-nav-menu--stretch elementor-nav-menu__text-align-center elementor-widget__width-initial elementor-widget-mobile__width-initial elementor-nav-menu--dropdown-tablet elementor-nav-menu--toggle elementor-nav-menu--burger elementor-widget elementor-widget-nav-menu" data-id="544bb2f0" data-element_type="widget" data-e-type="widget" data-settings="{&quot;full_width&quot;:&quot;stretch&quot;,&quot;layout&quot;:&quot;horizontal&quot;,&quot;submenu_icon&quot;:{&quot;value&quot;:&quot;&lt;i class=\&quot;fas fa-caret-down\&quot; aria-hidden=\&quot;true\&quot;&gt;&lt;\/i&gt;&quot;,&quot;library&quot;:&quot;fa-solid&quot;},&quot;toggle&quot;:&quot;burger&quot;}" data-widget_type="nav-menu.default">
229				<div class="elementor-widget-container">
230								<nav aria-label="Menu" class="elementor-nav-menu--main elementor-nav-menu__container elementor-nav-menu--layout-horizontal e--pointer-text e--animation-grow">
231				<ul id="menu-1-544bb2f0" class="elementor-nav-menu"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-3469"><a href="https://domstadboot.nl/" class="elementor-item">Home</a></li>
232<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3335"><a href="https://domstadboot.nl/tarieven-reserveren/" class="elementor-item">Tarieven</a></li>
233<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-7773"><a href="https://domstadboot.nl/publieke-rondvaart-utrecht/" class="elementor-item">Publieke rondvaart</a></li>
234<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3337"><a href="https://domstadboot.nl/cateringarrangementen/" class="elementor-item">Arrangementen</a></li>
235<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-5805"><a href="#" class="elementor-item elementor-item-anchor">Informatie</a>
236<ul class="sub-menu elementor-nav-menu--dropdown">
237	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5283"><a href="https://domstadboot.nl/veelgestelde-vragen/" class="elementor-sub-item">Veelgestelde vragen</a></li>
238	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6062"><a href="https://domstadboot.nl/werken-bij-domstadboot/" class="elementor-sub-item">Werken bij Domstadboot</a></li>
239	<li class="menu-item menu-item-type-post_type menu-item-object-post menu-item-5804"><a href="https://domstadboot.nl/koningsdag-2/" class="elementor-sub-item">Koningsdag</a></li>
240</ul>
241</li>
242<li class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-3265 current_page_item menu-item-3334"><a href="https://domstadboot.nl/contact/" aria-current="page" class="elementor-item elementor-item-active">Contact</a></li>
243</ul>			</nav>
244					<div class="elementor-menu-toggle" role="button" tabindex="0" aria-label="Menu toggle" aria-expanded="false">
245			<i aria-hidden="true" role="presentation" class="elementor-menu-toggle__icon--open eicon-menu-bar"></i><i aria-hidden="true" role="presentation" class="elementor-menu-toggle__icon--close eicon-close"></i>		</div>
246					<nav class="elementor-nav-menu--dropdown elementor-nav-menu__container" aria-hidden="true">
247				<ul id="menu-2-544bb2f0" class="elementor-nav-menu"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-3469"><a href="https://domstadboot.nl/" class="elementor-item" tabindex="-1">Home</a></li>
248<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3335"><a href="https://domstadboot.nl/tarieven-reserveren/" class="elementor-item" tabindex="-1">Tarieven</a></li>
249<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-7773"><a href="https://domstadboot.nl/publieke-rondvaart-utrecht/" class="elementor-item" tabindex="-1">Publieke rondvaart</a></li>
250<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3337"><a href="https://domstadboot.nl/cateringarrangementen/" class="elementor-item" tabindex="-1">Arrangementen</a></li>
251<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-5805"><a href="#" class="elementor-item elementor-item-anchor" tabindex="-1">Informatie</a>
252<ul class="sub-menu elementor-nav-menu--dropdown">
253	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5283"><a href="https://domstadboot.nl/veelgestelde-vragen/" class="elementor-sub-item" tabindex="-1">Veelgestelde vragen</a></li>
254	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6062"><a href="https://domstadboot.nl/werken-bij-domstadboot/" class="elementor-sub-item" tabindex="-1">Werken bij Domstadboot</a></li>
255	<li class="menu-item menu-item-type-post_type menu-item-object-post menu-item-5804"><a href="https://domstadboot.nl/koningsdag-2/" class="elementor-sub-item" tabindex="-1">Koningsdag</a></li>
256</ul>
257</li>
258<li class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-3265 current_page_item menu-item-3334"><a href="https://domstadboot.nl/contact/" aria-current="page" class="elementor-item elementor-item-active" tabindex="-1">Contact</a></li>
259</ul>			</nav>
260						</div>
261				</div>
262					</div>
263		</div>
264				<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-408a64bb col-cta" data-id="408a64bb" data-element_type="column" data-e-type="column">
265			<div class="elementor-widget-wrap elementor-element-populated">
266						<div class="elementor-element elementor-element-3ed4abde elementor-align-right elementor-mobile-align-justify elementor-widget-mobile__width-initial elementor-widget__width-auto elementor-invisible elementor-widget elementor-widget-button" data-id="3ed4abde" data-element_type="widget" data-e-type="widget" data-settings="{&quot;_animation&quot;:&quot;zoomIn&quot;,&quot;_animation_delay&quot;:2}" data-widget_type="button.default">
267				<div class="elementor-widget-container">
268									<div class="elementor-button-wrapper">
269					<a class="elementor-button elementor-button-link elementor-size-sm" href="#elementor-action%3Aaction%3Dpopup%3Aopen%26settings%3DeyJpZCI6IjY4MTgiLCJ0b2dnbGUiOmZhbHNlfQ%3D%3D">
270						<span class="elementor-button-content-wrapper">
271						<span class="elementor-button-icon">
272				<i aria-hidden="true" class="fas fa-long-arrow-alt-right"></i>			</span>
273									<span class="elementor-button-text">Start aanvraag</span>
274					</span>
275					</a>
276				</div>
277								</div>
278				</div>
279					</div>
280		</div>
281					</div>
282		</section>
283					</div>
284		</div>
285					</div>
286		</section>
287				</header>
288		
289<main id="content" class="site-main post-3265 page type-page status-publish hentry">
290
291	
292	<div class="page-content">
293				<div data-elementor-type="wp-page" data-elementor-id="3265" class="elementor elementor-3265" data-elementor-post-type="page">
294						<section class="elementor-section elementor-top-section elementor-element elementor-element-1bbbe258 elementor-section-content-middle elementor-section-full_width elementor-section-height-min-height elementor-section-items-stretch elementor-section-height-default" data-id="1bbbe258" data-element_type="section" data-e-type="section">
295						<div class="elementor-container elementor-column-gap-no">
296					<div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-6e838960" data-id="6e838960" data-element_type="column" data-e-type="column" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
297			<div class="elementor-widget-wrap elementor-element-populated">
298						<div class="elementor-element elementor-element-619e2876 elementor-widget elementor-widget-heading" data-id="619e2876" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
299				<div class="elementor-widget-container">
300					<h1 class="elementor-heading-title elementor-size-default">Contact Us</h1>				</div>
301				</div>
302				<div class="elementor-element elementor-element-1e46d818 elementor-widget elementor-widget-text-editor" data-id="1e46d818" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
303				<div class="elementor-widget-container">
304									<p>Heb je vragen? Aarzel niet om contact met ons op te nemen!</p>								</div>
305				</div>
306				<div class="elementor-element elementor-element-2bb24431 elementor-widget elementor-widget-heading" data-id="2bb24431" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
307				<div class="elementor-widget-container">
308					<h4 class="elementor-heading-title elementor-size-default">Get In Touch</h4>				</div>
309				</div>
310				<div class="elementor-element elementor-element-28bee74e elementor-align-start elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="28bee74e" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default">
311				<div class="elementor-widget-container">
312							<ul class="elementor-icon-list-items">
313							<li class="elementor-icon-list-item">
314										<span class="elementor-icon-list-text">+31618426144</span>
315									</li>
316								<li class="elementor-icon-list-item">
317											<a href="/cdn-cgi/l/email-protection#ff96919990bf9b90928c8b9e9b9d90908bd19193" target="_blank">
318
319											<span class="elementor-icon-list-text"><span class="__cf_email__" data-cfemail="036a6d656c43676c6e70776267616c6c772d6d6f">[email&#160;protected]</span></span>
320											</a>
321									</li>
322						</ul>
323						</div>
324				</div>
325				<div class="elementor-element elementor-element-869b869 elementor-widget elementor-widget-spacer" data-id="869b869" data-element_type="widget" data-e-type="widget" data-widget_type="spacer.default">
326				<div class="elementor-widget-container">
327							<div class="elementor-spacer">
328			<div class="elementor-spacer-inner"></div>
329		</div>
330						</div>
331				</div>
332				<div class="elementor-element elementor-element-ca268e6 elementor-button-align-stretch elementor-widget elementor-widget-form" data-id="ca268e6" data-element_type="widget" data-e-type="widget" data-settings="{&quot;step_next_label&quot;:&quot;Volgende&quot;,&quot;step_previous_label&quot;:&quot;Vorige&quot;,&quot;button_width&quot;:&quot;100&quot;,&quot;step_type&quot;:&quot;number_text&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;}" data-widget_type="form.default">
333				<div class="elementor-widget-container">
334							<form class="elementor-form" method="post" name="Nieuw formulier" aria-label="Nieuw formulier">
335			<input type="hidden" name="post_id" value="3265"/>
336			<input type="hidden" name="form_id" value="ca268e6"/>
337			<input type="hidden" name="referer_title" value="Domstadboot - contact | Voor al uw vragen | Domstadboot" />
338
339							<input type="hidden" name="queried_id" value="3265"/>
340			
341			<div class="elementor-form-fields-wrapper elementor-labels-above">
342								<div class="elementor-field-type-text elementor-field-group elementor-column elementor-field-group-name elementor-col-100 elementor-field-required">
343												<label for="form-field-name" class="elementor-field-label">
344								Naam							</label>
345														<input size="1" type="text" name="form_fields[name]" id="form-field-name" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="Naam" required="required">
346											</div>
347								<div class="elementor-field-type-email elementor-field-group elementor-column elementor-field-group-email elementor-col-100 elementor-field-required">
348												<label for="form-field-email" class="elementor-field-label">
349								E-mail							</label>
350														<input size="1" type="email" name="form_fields[email]" id="form-field-email" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="E-mail" required="required">
351											</div>
352								<div class="elementor-field-type-tel elementor-field-group elementor-column elementor-field-group-field_1807751 elementor-col-100 elementor-field-required">
353												<label for="form-field-field_1807751" class="elementor-field-label">
354								Telefoonnummer							</label>
355								<input size="1" type="tel" name="form_fields[field_1807751]" id="form-field-field_1807751" class="elementor-field elementor-size-sm  elementor-field-textual" placeholder="0612345678" required="required" pattern="[0-9()#&amp;+*-=.]+" title="Alleen cijfers en telefoonkarakters (#, -, *, enz.) worden geaccepteerd.">
356
357						</div>
358								<div class="elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-message elementor-col-100 elementor-field-required">
359												<label for="form-field-message" class="elementor-field-label">
360								Bericht							</label>
361						<textarea class="elementor-field-textual elementor-field  elementor-size-sm" name="form_fields[message]" id="form-field-message" rows="4" placeholder="Bericht" required="required"></textarea>				</div>
362								<div class="elementor-field-type-recaptcha_v3 elementor-field-group elementor-column elementor-field-group-field_784ad5b elementor-col-100 recaptcha_v3-bottomright">
363					<div class="elementor-field" id="form-field-field_784ad5b"><div class="elementor-g-recaptcha" data-sitekey="6LfoJmMrAAAAABNmvv-e_2GE-8pDXX9bZYU8YpSe" data-type="v3" data-action="Form" data-badge="bottomright" data-size="invisible"></div></div>				</div>
364								<div class="elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons">
365					<button class="elementor-button elementor-size-sm" type="submit">
366						<span class="elementor-button-content-wrapper">
367																						<span class="elementor-button-text">Verstuur</span>
368													</span>
369					</button>
370				</div>
371			</div>
372		</form>
373						</div>
374				</div>
375					</div>
376		</div>
377				<div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-7a7e20fa" data-id="7a7e20fa" data-element_type="column" data-e-type="column" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
378			<div class="elementor-widget-wrap elementor-element-populated">
379						<div class="elementor-element elementor-element-3bba75d0 elementor-widget elementor-widget-text-editor" data-id="3bba75d0" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
380				<div class="elementor-widget-container">
381									<p><b>Vragen? </b></p><p>Binnen een werkdag antwoord!</p>								</div>
382				</div>
383				<section class="elementor-section elementor-inner-section elementor-element elementor-element-bff8953 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="bff8953" data-element_type="section" data-e-type="section">
384						<div class="elementor-container elementor-column-gap-default">
385					<div class="elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-02315f4" data-id="02315f4" data-element_type="column" data-e-type="column">
386			<div class="elementor-widget-wrap elementor-element-populated">
387						<div class="elementor-element elementor-element-5a44906 elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-shortcode" data-id="5a44906" data-element_type="widget" data-e-type="widget" data-widget_type="shortcode.default">
388				<div class="elementor-widget-container">
389							<div class="elementor-shortcode"><style>
390  .db-calc { max-width: 680px; font-family: Montserrat, sans-serif; padding: 0; }
391  .db-calc h3 { font-family: Merriweather, serif; font-size: 28px; font-weight: 600; line-height: 40px; color: #003366; text-align: center; margin: 0 0 1.25rem; }
392  .db-field { margin-bottom: 1rem; }
393  .db-field label { display: block; font-size: 13px; font-weight: 600; margin-bottom: 6px; color: #1f2937; }
394  .db-field select { width: 100%; padding: 8px 24px 8px 12px; border: 1px solid rgba(204,204,204,1); border-radius: 4px; font-size: 14px; background: rgba(239,239,239,1); color: #1f2937; appearance: none; -webkit-appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23555' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 12px center; }
395  .db-extras-box { padding: 12px 0;}
396  .db-extras-label { font-size: 13px; font-weight: 600; margin-bottom: 10px; color: #1f2937; }
397  .db-checkbox-row { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; font-size: 13px; color: #1f2937; cursor: pointer; }
398  .db-checkbox-row:last-child { margin-bottom: 0; }
399  .db-checkbox-row input { width: 16px; height: 16px; margin: 0; accent-color: #003366; }
400  .db-hapjes-select { margin: 6px 0 8px 24px; }
401  .db-hapjes-select select { width: 100%; max-width: 360px; padding: 8px 24px 8px 12px; border: 1px solid rgba(204,204,204,1); border-radius: 4px; font-size: 13px; background: rgba(239,239,239,1); color: #1f2937; appearance: none; -webkit-appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23555' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 12px center; }
402  .db-note { font-size: 11px; color: #667085; margin-top: 4px; }
403
404  .db-result { background: rgba(246,246,246,1); border-radius: 8px; padding: 20px 20px 34px 20px; margin-top: 1.5rem; }
405  .db-result-title { font-size: 16px; font-weight: 600; color: #1f2937; margin-bottom: 14px; line-height: 1.4; }
406  .db-price-line { display: flex; align-items: baseline; gap: 6px; padding: 3px 0; font-size: 14px; color: #1f2937; }
407  .db-price-line::before { content: "·"; color: #888; font-size: 14px; flex-shrink: 0; }
408  .db-price-line-label { flex: 1; }
409  .db-price-line-amount { font-weight: 500; white-space: nowrap; }
410  .db-total-section { margin-top: 18px; }
411  .db-total-label { font-size: 18px; font-weight: 700; color: #1f2937; margin-bottom: 4px; }
412  .db-total-amount { font-size: 28px; font-weight: 700; color: #003366; margin-bottom: 12px; line-height: 1.2; }
413  .db-pp { font-size: 16px; color: #1f2937; margin-bottom: 4px; }
414  .db-pp strong { font-weight: 700; }
415  .db-footer-note { font-size: 13px; color: #667085; font-style: italic; margin-top: 12px; }
416  .db-placeholder { font-size: 13px; color: #888; text-align: center; padding: 1.5rem 0; }
417</style>
418
419<div class="db-calc">
420  <h3>Bereken direct je prijs</h3>
421
422  <div class="db-field">
423    <label>Aantal personen</label>
424    <select id="c_personen"></select>
425  </div>
426
427  <div class="db-field">
428    <label>Type tocht</label>
429    <select id="c_arr">
430      <option value="">Kies een arrangement</option>
431    </select>
432  </div>
433
434  <div class="db-field">
435    <label>Duur van de tocht</label>
436    <select id="c_duur">
437      <option value="">Kies eerst een arrangement</option>
438    </select>
439  </div>
440
441  <div id="c_extras"></div>
442
443  <div id="c_result"><div class="db-placeholder">Vul de velden in om een prijsindicatie te zien.</div></div>
444</div>
vendor: 112 bytes, lines 444-446
444
445
446<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
446<script>
447(function(){
448  const CONFIG = {
449    zones:{A:{min:6,max:12,boot:'Barbara'},B:{min:13,max:35,boot:'Domstadboot'},C:{min:36,max:48,boot:'Twee boten'}},
450    vaartarief:{A:200,B:300,C:500},
451    extraVaarHalfuur:{A:50,B:75,C:125},
452    drank:{basis:15,zaterdagBasis:20,extraHalfuur:5},
453    warmeHapjes:{piecesPerPerson:5,pricePerPiece:1.5},
454    gids:100,dessertPP:10,lunchPP:25,highteaPP:27.5,
455    koffieTheePP:7.5,lunchDrankUpgradePP:10,proseccoUpgradePP:7.5,
456    highTeaDrankUpgradePP:10,wijnPP:65,tapasPP:65,bbqPP:70,
457    bbqHalalPP:3,pizza15PP:55,pizza20PP:60,kurkPP:5,
458    borrelplankStaffels:[75,100,125,150,175,200,250,300,350,400],
459    saturdaySurchargePP:5
460  };
461  const ARRANGEMENTS = {
462    drank:{label:'Borreltocht',zones:['A','B','C'],durations:[1.5,2,2.5],extras:['hapjes_keuze','gids','warme_hapjes','borrelplank']},
463    pizza:{label:'Pizza',zones:['A','B','C'],durations:[1.5,2,2.5],extras:['dessert']},
464    wijn:{label:'Wijnproeverij',zones:['A','B','C'],durations:[2,2.5],extras:[]},
465    tapas:{label:'Tapas Dinner',zones:['B','C'],durations:[2,2.5],extras:['dessert']},
466    bbq:{label:'BBQ Dinner',zones:['A','B','C'],durations:[2,2.5],extras:['dessert','bbq_halal']},
467    lunch:{label:'Lunch',zones:['B','C'],durations:[1.5,2,2.5],extras:['koffie_thee','drank_upgrade','borrelplank']},
468    hightea:{label:'High Tea',zones:['B','C'],durations:[1.5,2,2.5],extras:['prosecco_upgrade','drank_upgrade','borrelplank']},
469    kurk:{label:'Geen arrangement / kurkengeld',zones:['A','B','C'],durations:[1.5,2,2.5],extras:[]}
470  };
471  const PIZZA_BARBARA={1.5:{6:475,7:500,8:525,9:550,10:575}};
472
473  let state={personen:10,arrangement:'',duur:'',extras:{hapjes_keuze:'',gids:false,warme_hapjes:false,warme_hapjes_type:'',borrelplank:false,dessert:false,koffie_thee:false,drank_upgrade:false,prosecco_upgrade:false,bbq_halal:false}};
474
475  const $=id=>document.getElementById(id);
476  function euro(v){return '€'+Number(v).toLocaleString('nl-NL',{minimumFractionDigits:2,maximumFractionDigits:2});}
477  function euroW(v){return '€'+Math.round(v).toLocaleString('nl-NL',{minimumFractionDigits:2,maximumFractionDigits:2});}
478  function getZone(p){if(p>=6&&p<=12)return'A';if(p>=13&&p<=35)return'B';if(p>=36&&p<=48)return'C';return null;}
479  function borrelprijs(p){const t=p*7.5,s=CONFIG.borrelplankStaffels;let b=s[0],bd=Math.abs(b-t);s.forEach(x=>{const d=Math.abs(x-t);if(d<bd||(d===bd&&x<b)){b=x;bd=d;}});return b;}
480  function getEffDur(){let d=Number(state.duur||0);if(state.extras.dessert)d+=0.5;return d;}
481  function getBaseDur(arr){if(['wijn','tapas','bbq'].includes(arr))return 2;if(arr==='pizza')return Number(state.duur)===1.5?1.5:2;return 1.5;}
482
483  function renderPersons(){
484    let h='';for(let i=6;i<=48;i++)h+=`<option value="${i}"${i===state.personen?' selected':''}>${i}${i===48?' (max online)':''}</option>`;
485    $('c_personen').innerHTML=h;
486  }
487
488  function renderArrangements(){
489    const zone=getZone(state.personen);
490    let h='<option value="">Kies een arrangement</option>';
491    Object.entries(ARRANGEMENTS).forEach(([k,v])=>{
492      if(k==='bbq'&&state.personen<10)return;
493      if(!v.zones.includes(zone))return;
494      h+=`<option value="${k}"${state.arrangement===k?' selected':''}>${v.label}</option>`;
495    });
496    $('c_arr').innerHTML=h;
497  }
498
499  function renderDurations(){
500    if(!state.arrangement){$('c_duur').innerHTML='<option value="">Kies eerst een arrangement</option>';return;}
501    const ds=ARRANGEMENTS[state.arrangement].durations;
502    let h='<option value="">Kies een duur</option>';
503    ds.forEach(d=>h+=`<option value="${d}"${Number(state.duur)===d?' selected':''}>${String(d).replace('.',',')} uur</option>`);
504    $('c_duur').innerHTML=h;
505  }
506
507  function renderExtras(){
508    if(!state.arrangement){$('c_extras').innerHTML='';return;}
509    const extras=ARRANGEMENTS[state.arrangement].extras||[];
510    if(!extras.length){$('c_extras').innerHTML='';return;}
511    let h='<div class="db-extras-box">';
512    h+='<div class="db-extras-label">Extra opties</div>';
513
514    if(extras.includes('hapjes_keuze')){
515      h+=`<div style="margin-bottom:10px;"><label style="display:block;font-size:12px;font-weight:600;margin-bottom:6px;color:#1f2937;">Willen jullie hapjes?</label>
516      <select id="e_hapjes_keuze" style="width:100%;padding:8px 24px 8px 12px;border:1px solid rgba(204,204,204,1);border-radius:4px;font-size:13px;background:rgba(239,239,239,1);color:#1f2937;">
517      <option value="">Maak een keuze</option>
518      <option value="nee"${state.extras.hapjes_keuze==='nee'?' selected':''}>Nee, geen hapjes</option>
519      <option value="ja"${state.extras.hapjes_keuze==='ja'?' selected':''}>Ja, graag hapjes erbij</option>
520      </select></div>`;
521    }
522
523    const showH=state.arrangement!=='drank'||state.extras.hapjes_keuze==='ja';
524    function cb(key,label,checked){return`<label class="db-checkbox-row"><input type="checkbox" data-extra="${key}"${checked?' checked':''}><span>${label}</span></label>`;}
525
526    if(extras.includes('gids'))h+=cb('gids',`Gids aan boord (€${CONFIG.gids})`,state.extras.gids);
527    if(showH){
528      if(extras.includes('warme_hapjes'))h+=cb('warme_hapjes',`Bittergarnituur (${euro(CONFIG.warmeHapjes.piecesPerPerson*CONFIG.warmeHapjes.pricePerPiece)} p.p.)`,state.extras.warme_hapjes);
529      if(extras.includes('borrelplank'))h+=cb('borrelplank','Luxe borrelplank',state.extras.borrelplank);
530    }
531    if(extras.includes('dessert'))h+=cb('dessert',`Dessertplank (${euro(CONFIG.dessertPP)} p.p.)`,state.extras.dessert);
532    if(extras.includes('koffie_thee'))h+=cb('koffie_thee',`Koffie en thee (${euro(CONFIG.koffieTheePP)} p.p.)`,state.extras.koffie_thee);
533    if(extras.includes('drank_upgrade'))h+=cb('drank_upgrade',`Drankupgrade (${euro(CONFIG.lunchDrankUpgradePP)} p.p. voor de eerste 1,5 uur)`,state.extras.drank_upgrade);
534    if(extras.includes('prosecco_upgrade'))h+=cb('prosecco_upgrade',`Onbeperkt prosecco (${euro(CONFIG.proseccoUpgradePP)} p.p.)`,state.extras.prosecco_upgrade);
535    if(extras.includes('bbq_halal'))h+=cb('bbq_halal',`Halal BBQ voor hele groep (+${euro(CONFIG.bbqHalalPP)} p.p.)`,state.extras.bbq_halal);
536
537    if(state.extras.warme_hapjes&&showH&&extras.includes('warme_hapjes')){
538      h+=`<div class="db-hapjes-select"><select id="e_hapjes_type">
539      <option value="">Kies een soort hapjes</option>
540      <option value="bitterballen"${state.extras.warme_hapjes_type==='bitterballen'?' selected':''}>Bitterballen</option>
541      <option value="vlees"${state.extras.warme_hapjes_type==='vlees'?' selected':''}>Bittergarnituur vlees</option>
542      <option value="vega"${state.extras.warme_hapjes_type==='vega'?' selected':''}>Bittergarnituur vega</option>
543      <option value="gemengd"${state.extras.warme_hapjes_type==='gemengd'?' selected':''}>Bittergarnituur gemengd</option>
544      </select></div>`;
545    }
546    if(state.extras.dessert)h+=`<div class="db-note" style="margin-top:6px;">Een dessertplank voegt automatisch 30 minuten extra vaartijd toe.</div>`;
547    if(state.arrangement==='wijn')h+=`<div class="db-note" style="margin-top:6px;">Bij de wijnproeverij is de luxe borrelplank standaard inbegrepen.</div>`;
548    h+='</div>';
549    $('c_extras').innerHTML=h;
550
551    const hkSel=document.getElementById('e_hapjes_keuze');
552    if(hkSel)hkSel.addEventListener('change',function(){state.extras.hapjes_keuze=this.value;if(this.value==='nee'){state.extras.warme_hapjes=false;state.extras.warme_hapjes_type='';state.extras.borrelplank=false;}renderExtras();renderResult();});
553    document.querySelectorAll('[data-extra]').forEach(inp=>inp.addEventListener('change',function(){const k=this.getAttribute('data-extra');state.extras[k]=this.checked;if(k==='warme_hapjes'&&!this.checked)state.extras.warme_hapjes_type='';renderExtras();renderResult();}));
554    const htSel=document.getElementById('e_hapjes_type');
555    if(htSel)htSel.addEventListener('change',function(){state.extras.warme_hapjes_type=this.value;renderResult();});
556  }
557
558  function calcPrice(){
559    const p=Number(state.personen),arr=state.arrangement,dur=Number(state.duur);
560    if(!p||!arr||!dur)return null;
561    const zone=getZone(p),effDur=getEffDur(),baseDur=getBaseDur(arr);
562    const lines=[];
563
564    const base=(()=>{
565      switch(arr){
566        case'drank':{const pp=CONFIG.drank.basis;return{label:'Drankarrangement',meta:`${p} x ${euro(pp)} p.p.`,amount:p*pp};}
567        case'pizza':{const dk=Number(dur)===1.5?1.5:2,pp=dk===1.5?CONFIG.pizza15PP:CONFIG.pizza20PP;if(zone==='A'&&dk===1.5&&p<=10){return{label:'Pizza pakket',meta:'Incl. 1,5 uur varen, pizza en onbeperkt drank',amount:PIZZA_BARBARA[1.5][p]};}return{label:'Pizza pakket',meta:`${p} x ${euro(pp)} p.p.`,amount:p*pp};}
568        case'wijn':{const pp=CONFIG.wijnPP;return{label:'Wijnproeverij pakket',meta:`${Math.max(p,10)} x ${euro(pp)} p.p.`,amount:Math.max(p,10)*pp};}
569        case'tapas':{const pp=CONFIG.tapasPP;return{label:'Tapas pakket',meta:`${Math.max(p,10)} x ${euro(pp)} p.p.`,amount:Math.max(p,10)*pp};}
570        case'bbq':{const pp=CONFIG.bbqPP;return{label:'BBQ pakket',meta:`${Math.max(p,10)} x ${euro(pp)} p.p.`,amount:Math.max(p,10)*pp};}
571        case'lunch':{const pp=CONFIG.lunchPP;return{label:'Lunch',meta:`${p} x ${euro(pp)} p.p.`,amount:p*pp};}
572        case'hightea':{const pp=CONFIG.highteaPP;return{label:'High Tea',meta:`${p} x ${euro(pp)} p.p.`,amount:p*pp};}
573        case'kurk':return{label:'Kurkengeld voor 1,5 uur',meta:`${p} x ${euro(CONFIG.kurkPP)} p.p.`,amount:p*CONFIG.kurkPP};
574        default:return{label:'',meta:'',amount:0};
575      }
576    })();
577    if(base.amount>0)lines.push({label:base.label,amount:base.amount});
578
579    const inclBoating=['pizza','wijn','tapas','bbq'].includes(arr);
580    if(!inclBoating)lines.push({label:'Varen',amount:CONFIG.vaartarief[zone]});
581    if(effDur>baseDur){
582      const blocks=(effDur-baseDur)/0.5,bzone=(arr==='bbq'&&p<=12)?'B':zone;
583      lines.push({label:'Extra vaartijd',amount:blocks*CONFIG.extraVaarHalfuur[bzone]});
584      let edc=0;
585      if(['drank','pizza','wijn','tapas','bbq'].includes(arr))edc=blocks*p*CONFIG.drank.extraHalfuur;
586      else if(arr==='lunch'&&state.extras.drank_upgrade)edc=blocks*p*CONFIG.drank.extraHalfuur;
587      else if(arr==='hightea'&&(state.extras.drank_upgrade||state.extras.prosecco_upgrade))edc=blocks*p*CONFIG.drank.extraHalfuur;
588      if(edc>0)lines.push({label:'Verlenging drankarrangement',amount:edc});
589    }
590
591    if(state.extras.gids)lines.push({label:'Gids aan boord',amount:CONFIG.gids});
592    if(state.extras.warme_hapjes){const m={bitterballen:'Bitterballen',vlees:'Bittergarnituur vlees',vega:'Bittergarnituur vega',gemengd:'Bittergarnituur gemengd'};lines.push({label:'Bittergarnituur'+(state.extras.warme_hapjes_type?', '+(m[state.extras.warme_hapjes_type]||state.extras.warme_hapjes_type):''),amount:p*CONFIG.warmeHapjes.piecesPerPerson*CONFIG.warmeHapjes.pricePerPiece});}
593    if(state.extras.borrelplank&&arr!=='wijn')lines.push({label:'Luxe borrelplank',amount:borrelprijs(p)});
594    if(state.extras.dessert)lines.push({label:'Dessertplank',amount:p*CONFIG.dessertPP});
595    if(arr==='lunch'&&state.extras.koffie_thee)lines.push({label:'Koffie en thee',amount:p*CONFIG.koffieTheePP});
596    if(arr==='lunch'&&state.extras.drank_upgrade)lines.push({label:'Drankupgrade (eerste 1,5 uur)',amount:p*CONFIG.lunchDrankUpgradePP});
597    if(arr==='hightea'&&state.extras.prosecco_upgrade)lines.push({label:'Onbeperkt prosecco',amount:p*CONFIG.proseccoUpgradePP});
598    if(arr==='hightea'&&state.extras.drank_upgrade)lines.push({label:'Drankupgrade (eerste 1,5 uur)',amount:p*CONFIG.highTeaDrankUpgradePP});
599    if(arr==='bbq'&&state.extras.bbq_halal)lines.push({label:'Halal BBQ toeslag',amount:p*CONFIG.bbqHalalPP});
600
601    const total=Math.round(lines.reduce((s,l)=>
601s+l.amount,0));
602    const pp=Math.round(total/p*2)/2;
603    return{lines,total,pp,p};
604  }
605
606  function renderResult(){
607    const r=calcPrice();
608    if(!r){$('c_result').innerHTML='<div class="db-placeholder">Vul de velden in om een prijsindicatie te zien.</div>';return;}
609    let h='<div class="db-result">';
610    h+='<div class="db-result-title">Uw prijs is opgebouwd aan de hand van de volgende tarieven:</div>';
611    r.lines.forEach(l=>{
612      h+=`<div class="db-price-line"><span class="db-price-line-label">${l.label}</span><span class="db-price-line-amount">${euroW(l.amount)}</span></div>`;
613    });
614    h+=`<div class="db-total-section">`;
615    h+=`<div class="db-total-label">Totaalbedrag voor de hele groep:</div>`;
616    h+=`<div class="db-total-amount">${euroW(r.total)}</div>`;
617    h+=`<div class="db-pp"><strong>Per persoon:</strong> ${euroW(r.pp)}</div>`;
618    h+=`<div class="db-footer-note">Inclusief btw en schipper. Geen verborgen kosten!</div>`;
619    h+=`</div></div>`;
620    $('c_result').innerHTML=h;
621  }
622
623  function recalc(){renderArrangements();renderDurations();renderExtras();renderResult();}
624
625  renderPersons();
626  renderArrangements();
627  renderDurations();
628  renderResult();
629
630  $('c_arr').addEventListener('change',function(){state.arrangement=this.value;state.duur='';state.extras={hapjes_keuze:'',gids:false,warme_hapjes:false,warme_hapjes_type:'',borrelplank:false,dessert:false,koffie_thee:false,drank_upgrade:false,prosecco_upgrade:false,bbq_halal:false};recalc();});
631  $('c_personen').addEventListener('change',function(){state.personen=Number(this.value);state.arrangement='';state.duur='';state.extras={hapjes_keuze:'',gids:false,warme_hapjes:false,warme_hapjes_type:'',borrelplank:false,dessert:false,koffie_thee:false,drank_upgrade:false,prosecco_upgrade:false,bbq_halal:false};recalc();});
632  $('c_duur').addEventListener('change',function(){state.duur=this.value;renderExtras();renderResult();});
633})();
634</script>
634
635</div>
636						</div>
637				</div>
638				<div class="elementor-element elementor-element-c6d8ed2 elementor-widget elementor-widget-html" data-id="c6d8ed2" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
639				<div class="elementor-widget-container">
640					<div id="domstadboot-popup-flow" style="max-width:1180px;margin:0 auto;padding:12px 16px;background:#fff;border-radius:10px;font-family:Montserrat,sans-serif;color:#1f2937;">
641  <style>
642    #domstadboot-popup-flow * { box-sizing: border-box; }
643    #domstadboot-popup-flow h2,
644    #domstadboot-popup-flow h3 {
645      font-family: Merriweather, serif;
646      color: #003366;
647      margin: 0 0 6px;
648      line-height: 1.15;
649    }
650    #domstadboot-popup-flow .db-header {
651      display:flex;
652      align-items:flex-start;
653      justify-content:space-between;
654      gap:20px;
655      margin-bottom:8px;
656    }
657    #domstadboot-popup-flow .db-logo-wrap {
658      display:flex;
659      align-items:flex-start;
660      gap:14px;
661      padding-right:8px;
662      flex-shrink:0;
663    }
664    #domstadboot-popup-flow .db-logo {
665      height:68px;
666      width:auto;
667      opacity:.96;
668      flex-shrink:0;
669      margin-top:2px;
670    }
671    #domstadboot-popup-flow .db-step { display: none; }
672    #domstadboot-popup-flow .db-step.active { display: block; }
673
674    #domstadboot-popup-flow .db-grid {
675      display: grid;
676      grid-template-columns: 1fr 1fr;
677      gap: 10px 14px;
678    }
679    #domstadboot-popup-flow .db-grid-single {
680      display: grid;
681      grid-template-columns: 1fr;
682      gap: 10px;
683    }
684    #domstadboot-popup-flow .db-step1-layout {
685      display:grid;
686      grid-template-columns: 1.02fr 0.98fr;
687      gap:14px;
688      align-items:start;
689      margin-top:10px;
690    }
691    #domstadboot-popup-flow .db-field label {
692      display: block;
693      font-weight: 600;
694      margin-bottom: 4px;
695      color: #1f2937;
696      font-size: 13px;
697      line-height: 1.25;
698    }
699    #domstadboot-popup-flow input[type="text"],
700    #domstadboot-popup-flow input[type="email"],
701    #domstadboot-popup-flow input[type="tel"],
702    #domstadboot-popup-flow input[type="date"],
703    #domstadboot-popup-flow select,
704    #domstadboot-popup-flow textarea {
705      width: 100%;
706      padding: 9px 10px;
707      border: 1px solid #cfd8e3;
708      border-radius: 8px;
709      font-size: 14px;
710      background: #fff;
711      line-height: 1.25;
712    }
713    #domstadboot-popup-flow textarea {
714      min-height: 88px;
715      resize: vertical;
716    }
717    #domstadboot-popup-flow select:disabled,
718    #domstadboot-popup-flow input:disabled,
719    #domstadboot-popup-flow textarea:disabled {
720      background:#f3f4f6;
721      color:#6b7280;
722      cursor:not-allowed;
723    }
724    #domstadboot-popup-flow .db-card {
725      background: #f8fbff;
726      border: 1px solid #d9e9f7;
727      border-radius: 10px;
728      padding: 11px 12px;
729    }
730    #domstadboot-popup-flow .db-progress {
731      display: flex;
732      gap: 8px;
733      margin-bottom: 8px;
734    }
735    #domstadboot-popup-flow .db-progress-item {
736      flex: 1;
737      padding: 8px 10px;
738      border-radius: 999px;
739      background: #eef3f8;
740      color: #5c7085;
741      font-weight: 600;
742      text-align: center;
743      font-size: 12px;
744      line-height: 1.2;
745    }
746    #domstadboot-popup-flow .db-progress-item.active {
747      background: #003366;
748      color: #fff;
749    }
750    #domstadboot-popup-flow .db-result {
751      background: #f6f6f6;
752      border-radius: 10px;
753      padding: 12px 14px;
754      margin-top: 0;
755    }
756    #domstadboot-popup-flow .db-price-line {
757      display: flex;
758      justify-content: space-between;
759      gap: 12px;
760      padding: 4px 0;
761      border-bottom: 1px solid #e5e7eb;
762      font-size: 13px;
763      line-height: 1.3;
764    }
765    #domstadboot-popup-flow .db-price-line:last-child {
766      border-bottom: 0;
767    }
768    #domstadboot-popup-flow .db-price-line .db-price-label small {
769      display:block;
770      color:#667085;
771      font-size:11px;
772      line-height:1.3;
773      margin-top:1px;
774    }
775    #domstadboot-popup-flow .db-total {
776      font-size: 19px;
777      font-weight: 700;
778      color: #003366;
779      margin-top: 8px;
780      line-height: 1.15;
781    }
782    #domstadboot-popup-flow .db-pp {
783      font-size: 14px;
784      margin-top: 3px;
785      line-height: 1.25;
786    }
787    #domstadboot-popup-flow .db-buttons {
788      display: flex;
789      gap: 10px;
790      margin-top: 12px;
791      flex-wrap: wrap;
792    }
793    #domstadboot-popup-flow .db-buttons-step1 {
794      justify-content: flex-start;
795      padding-top: 2px;
796    }
797    #domstadboot-popup-flow .db-btn {
798      appearance: none;
799      border: 0;
800      border-radius: 8px;
801      padding: 12px 18px;
802      font-size: 14px;
803      font-weight: 700;
804      cursor: pointer;
805      min-width: 170px;
806      line-height: 1.2;
807    }
808    #domstadboot-popup-flow .db-btn-primary {
809      background: #003366;
810      color: #fff;
811    }
812    #domstadboot-popup-flow .db-btn-secondary {
813      background: #eef3f8;
814      color: #003366;
815    }
816    #domstadboot-popup-flow .db-btn[disabled] {
817      opacity:.6;
818      cursor:not-allowed;
819    }
820    #domstadboot-popup-flow .db-note {
821      font-size: 11px;
822      color: #5b6775;
823      margin-top: 4px;
824      line-height: 1.3;
825    }
826    #domstadboot-popup-flow .db-inline-note {
827      font-size: 11px;
828      color: #667085;
829      margin-top: 4px;
830      line-height: 1.3;
831    }
832    #domstadboot-popup-flow .db-message-box {
833      background: #f8fbff;
834      border: 1px solid #d9e9f7;
835      border-radius: 8px;
836      padding: 8px 10px;
837      margin-top: 8px;
838    }
839    #domstadboot-popup-flow .db-message-box div {
840      font-size: 11px;
841      color: #244b6b;
842      margin-bottom: 4px;
843      line-height: 1.3;
844    }
845    #domstadboot-popup-flow .db-message-box div:last-child {
846      margin-bottom: 0;
847    }
848    #domstadboot-popup-flow .db-error {
849      color: #b42318;
850      font-size: 12px;
851      margin-top: 8px;
852      line-height: 1.3;
853    }
854    #domstadboot-popup-flow .db-success {
855      background: #ecfdf3;
856      border: 1px solid #abefc6;
857      color: #067647;
858      border-radius: 8px;
859      padding: 12px 14px;
860      font-size: 13px;
861      margin-top: 12px;
862      line-height: 1.35;
863    }
864    #domstadboot-popup-flow .db-success-big-wrap {
865      display:flex;
866      align-items:center;
867      justify-content:center;
868      min-height:420px;
869      padding:20px;
870    }
871    #domstadboot-popup-flow .db-success-big {
872      max-width:760px;
873      width:100%;
874      background:linear-gradient(180deg,#f8fbff 0%,#ffffff 100%);
875      border:1px solid #d9e9f7;
876      border-radius:20px;
877      padding:34px 28px;
878      text-align:center;
879      box-shadow:0 10px 30px rgba(0,51,102,.08);
880    }
881    #domstadboot-popup-flow .db-success-big h2 {
882      font-size:40px;
883      margin-bottom:12px;
884      color:#003366;
885    }
886    #domstadboot-popup-flow .db-success-big p {
887      margin:10px 0;
888      font-size:18px;
889      line-height:1.6;
890      color:#1f2937;
891    }
892    #domstadboot-popup-flow .db-checkbox {
893      display: block;
894      margin-bottom: 6px;
895      line-height: 1.35;
896      cursor: pointer;
897      font-size: 13px;
898    }
899    #domstadboot-popup-flow .db-checkbox input {
900      margin-right: 8px;
901      transform: translateY(1px);
902    }
903    #domstadboot-popup-flow .db-required {
904      color:#b42318;
905      margin-left:4px;
906    }
907    #domstadboot-popup-flow .db-terms-link {
908      color:#003366;
909      text-decoration:underline;
910    }
911    #domstadboot-popup-flow .db-hidden {
912      display:none !important;
913    }
914    #domstadboot-popup-flow .db-step1-title,
915    #domstadboot-popup-flow .db-step2-title {
916      font-size: 24px;
917      margin-bottom: 4px;
918    }
919    #domstadboot-popup-flow .db-extras-grid {
920      display:grid;
921      grid-template-columns: 1fr 1fr;
922      gap: 4px 16px;
923    }
924    #domstadboot-popup-flow .db-extras-grid-single {
925      display:grid;
926      grid-template-columns: 1fr;
927      gap: 4px;
928    }
929    #domstadboot-popup-flow .db-hapjes-wrap {
930      margin-top:8px;
931      max-width: 420px;
932    }
933    #domstadboot-popup-flow .db-summary-mini {
934      display:grid;
935      grid-template-columns: auto 1fr;
936      gap: 2px 8px;
937      font-size:13px;
938      line-height:1.35;
939    }
940    #domstadboot-popup-flow .db-summary-mini strong {
941      color:#1f2937;
942    }
943
944    @media (max-width: 980px) {
945      #domstadboot-popup-flow .db-step1-layout {
946        grid-template-columns: 1fr;
947      }
948      #domstadboot-popup-flow .db-grid {
949        grid-template-columns: 1fr;
950      }
951    }
952    @media (max-width: 767px) {
953      #domstadboot-popup-flow {
954        padding: 14px 14px;
955      }
956      #domstadboot-popup-flow .db-buttons {
957        flex-direction: column;
958      }
959      #domstadboot-popup-flow .db-btn {
960        width: 100%;
961      }
962      #domstadboot-popup-flow .db-header {
963        align-items:flex-start;
964        flex-direction:column;
965      }
966      #domstadboot-popup-flow .db-logo {
967        height:54px;
968      }
969      #domstadboot-popup-flow .db-extras-grid,
970      #domstadboot-popup-flow .db-extras-grid-single {
971        grid-template-columns: 1fr;
972      }
973      #domstadboot-popup-flow .db-hapjes-wrap {
974        max-width: 100%;
975      }
976      #domstadboot-popup-flow .db-success-big h2 {
977        font-size:30px;
978      }
979      #domstadboot-popup-flow .db-success-big p {
980        font-size:16px;
981      }
982    }
983  </style>
984
985  <div class="db-header">
986    <div style="flex:1;">
987      <div class="db-progress">
988        <div id="db-progress-1" class="db-progress-item active">1. Wensen & prijs</div>
989        <div id="db-progress-2" class="db-progress-item">2. Gegevens & verzenden</div>
990      </div>
991    </div>
992    <div class="db-logo-wrap">
993      <img decoding="async" class="db-logo" src="https://domstadboot.nl/wp-content/uploads/2022/06/Domstadboot_logo_14.png" alt="Domstadboot logo">
994    </div>
995  </div>
996
997  <form id="db-popup-form" novalidate>
998    <div id="db-step-1" class="db-step active">
999      <h2 class="db-step1-title">Vul hier jullie wensen in</h2>
1000      <div class="db-note">Kies jullie wensen en bekijk direct de prijsindicatie.</div>
1001
1002      <div class="db-step1-layout">
1003        <div>
1004          <div class="db-grid">
1005            <div class="db-field">
1006              <label for="calc_personen">Aantal personen</label>
1007              <select id="calc_personen" name="calc_personen"></select>
1008            </div>
1009
1010            <div class="db-field">
1011              <label for="calc_arrangement">Arrangement</label>
1012              <select id="calc_arrangement" name="calc_arrangement">
1013                <option value="">Kies een arrangement</option>
1014              </select>
1015            </div>
1016
1017            <div class="db-field">
1018              <label for="calc_duur">Duur</label>
1019              <select id="calc_duur" name="calc_duur">
1020                <option value="">Kies eerst een arrangement</option>
1021              </select>
1022            </div>
1023
1024            <div class="db-field">
1025              <label for="calc_date_for_price">Datum van de tocht</label>
1026              <input type="date" id="calc_date_for_price" name="calc_date_for_price">
1027              <div class="db-inline-note">Op zaterdag geldt een toeslag van €5 p.p. op elk arrangement.</div>
1028            </div>
1029          </div>
1030
1031          <div id="calc_extras" style="margin-top:10px;"></div>
1032
1033          <div class="db-buttons db-buttons-step1">
1034            <button type="button" id="db-next-step" class="db-btn db-btn-primary">Volgende</button>
1035          </div>
1036        </div>
1037
1038        <div>
1039          <div id="calc_result"></div>
1040          <div id="calc_messages"></div>
1041        </div>
1042      </div>
1043
1044      <div id="db-step-1-error" class="db-error"></div>
1045    </div>
1046
1047    <div id="db-step-2" class="db-step">
1048      <h2 class="db-step2-title">Vul jullie gegevens in</h2>
1049      <div class="db-note">Jullie keuzes en prijsindicatie nemen we direct mee in de aanvraag.</div>
1050
1051      <div class="db-card" style="margin-top:12px;">
1052        <h3 style="font-size:17px;">Samenvatting aanvraag</h3>
1053        <div id="db-step-2-summary" style="font-size:13px;line-height:1.45;"></div>
1054      </div>
1055
1056      <div class="db-grid" style="margin-top:12px;">
1057        <div class="db-field">
1058          <label for="contact_name">Volledige naam<span class="db-required">*</span></label>
1059          <input type="text" id="contact_name" name="contact_name" required>
1060        </div>
1061
1062        <div class="db-field">
1063          <label for="contact_email">E-mailadres<span class="db-required">*</span></label>
1064          <input type="email" id="contact_email" name="contact_email" required>
1065        </div>
1066
1067        <div class="db-field">
1068          <label for="contact_phone">Telefoonnummer<span class="db-required">*</span></label>
1069          <input type="tel" id="contact_phone" name="contact_phone" required>
1070        </div>
1071
1072        <div class="db-field">
1073          <label for="contact_company">Bedrijfsnaam</label>
1074          <input type="text" id="contact_company" name="contact_company">
1075        </div>
1076
1077        <div class="db-field">
1078          <label for="contact_date">Gewenste datum<span class="db-required">*</span></label>
1079          <input type="date" id="contact_date" name="contact_date" required>
1080        </div>
1081
1082        <div class="db-field">
1083          <label for="contact_starttime">Gewenste starttijd<span class="db-required">*</span></label>
1084          <select id="contact_starttime" name="contact_starttime" required>
1085            <option value="">Kies een starttijd</option>
1086          </select>
1087        </div>
1088
1089        <div class="db-field">
1090          <label for="contact_occasion">Gelegenheid / soort uitje<span class="db-required">*</span></label>
1091          <select id="contact_occasion" name="contact_occasion" required>
1092            <option value="">Kies een gelegenheid</option>
1093            <option value="Bedrijfsuitje">Bedrijfsuitje</option>
1094            <option value="Vriendenuitje">Vriendenuitje</option>
1095            <option value="Familieuitje">Familieuitje</option>
1096            <option value="Bruiloft">Bruiloft</option>
1097            <option value="Evenement">Evenement</option>
1098            <option value="Vrijgezellenfeest">Vrijgezellenfeest</option>
1099            <option value="Anders">Anders</option>
1100          </select>
1101        </div>
1102
1103        <div class="db-field db-hidden" id="contact_group_wrap">
1104          <label for="contact_group">Samenstelling gezelschap<span class="db-required">*</span></label>
1105          <select id="contact_group" name="contact_group">
1106            <option value="">Kies een samenstelling</option>
1107            <option value="Alleen mannen">Alleen mannen</option>
1108            <option value="Alleen vrouwen">Alleen vrouwen</option>
1109            <option value="Gemengd">Gemengd</option>
1110          </select>
1111        </div>
1112      </div>
1113
1114      <div class="db-grid-single" style="margin-top:10px;">
1115        <div class="db-field">
1116          <label for="contact_notes">Opmerkingen, wensen of dieetwensen</label>
1117          <textarea id="contact_notes" name="contact_notes" placeholder="Zijn er nog bijzonderheden, wensen of dieetwensen waar we rekening mee kunnen houden?"></textarea>
1118        </div>
1119
1120        <div class="db-field">
1121          <label class="db-checkbox">
1122            <input type="checkbox" id="contact_terms" name="contact_terms" required>
1123            Ik ga akkoord met de <a class="db-terms-link" href="https://domstadboot.nl/algemene-voorwaarden/" target="_blank" rel="noopener">algemene voorwaarden</a><span class="db-required">*</span>
1124          </label>
1125        </div>
1126      </div>
1127
1128      <input type="hidden" id="hidden_calc_zone" name="hidden_calc_zone">
1129      <input type="hidden" id="hidden_calc_boot_type" name="hidden_calc_boot_type">
1130      <input type="hidden" id="hidden_calc_arrangement" name="hidden_calc_arrangement">
1131      <input type="hidden" id="hidden_calc_arrangement_key" name="hidden_calc_arrangement_key">
1132      <input type="hidden" id="hidden_calc_personen" name="hidden_calc_personen">
1133      <input type="hidden" id="hidden_calc_duur" name="hidden_calc_duur">
1134      <input type="hidden" id="hidden_calc_effective_duur" name="hidden_calc_effective_duur">
1135      <input type="hidden" id="hidden_calc_prijs_totaal" name="hidden_calc_prijs_totaal">
1136      <input type="hidden" id="hidden_calc_prijs_pp" name="hidden_calc_prijs_pp">
1137      <input type="hidden" id="hidden_calc_samenvatting" name="hidden_calc_samenvatting">
1138      <input type="hidden" id="hidden_calc_json" name="hidden_calc
1138_json">
1139      <input type="hidden" id="hidden_calc_price_lines_json" name="hidden_calc_price_lines_json">
1140      <input type="hidden" id="hidden_calc_hapjes" name="hidden_calc_hapjes">
1141      <input type="hidden" id="hidden_calc_hapjes_type" name="hidden_calc_hapjes_type">
1142      <input type="hidden" id="hidden_calc_borrelplank" name="hidden_calc_borrelplank">
1143      <input type="hidden" id="hidden_calc_dessert" name="hidden_calc_dessert">
1144      <input type="hidden" id="hidden_calc_gids" name="hidden_calc_gids">
1145      <input type="hidden" id="hidden_calc_is_zaterdag" name="hidden_calc_is_zaterdag">
1146      <input type="hidden" id="hidden_calc_hapjes_keuze" name="hidden_calc_hapjes_keuze">
1147      <input type="hidden" id="hidden_calc_bbq_halal" name="hidden_calc_bbq_halal">
1148
1149      <div id="db-step-2-error" class="db-error"></div>
1150      <div id="db-submit-status"></div>
1151
1152      <div class="db-buttons">
1153        <button type="button" id="db-prev-step" class="db-btn db-btn-secondary">Terug</button>
1154        <button type="submit" id="db-submit" class="db-btn db-btn-primary">Aanvraag verzenden</button>
1155      </div>
1156    </div>
1157  </form>
1158</div>
1159
1160<script>
1161(function () {
1162  function createQuarterHourOptions(selectEl) {
1163    if (!selectEl || selectEl.dataset.filled === 'yes') return;
1164    let html = '<option value="">Kies een starttijd</option>';
1165    for (let h = 8; h <= 23; h++) {
1166      for (let m = 0; m < 60; m += 15) {
1167        const hh = String(h).padStart(2, '0');
1168        const mm = String(m).padStart(2, '0');
1169        html += '<option value="' + hh + ':' + mm + '">' + hh + ':' + mm + '</option>';
1170      }
1171    }
1172    selectEl.innerHTML = html;
1173    selectEl.dataset.filled = 'yes';
1174  }
1175
1176  // ИЗМЕНЕНО: root приходит аргументом (а не через getElementById, который брал
1177  // всегда только первую копию на странице). Флаг "инициализировано" храним на
1178  // самом элементе, поэтому встроенная и попап-копия не мешают друг другу.
1179  function createPopupFlow(root) {
1180    if (!root) return;
1181    if (root.dataset.dbFlowInit === 'yes') return;
1182    root.dataset.dbFlowInit = 'yes';
1183
1184    const CONFIG = {
1185      zones: {
1186        A: { min: 6, max: 12, boot: 'Barbara' },
1187        B: { min: 13, max: 35, boot: 'Domstadboot' },
1188        C: { min: 36, max: 48, boot: 'Twee boten' }
1189      },
1190      vaartarief: { A: 200, B: 300, C: 500 },
1191      extraVaarHalfuur: { A: 50, B: 75, C: 125 },
1192      drank: { basis: 15, zaterdagBasis: 20, extraHalfuur: 5 },
1193      warmeHapjes: { piecesPerPerson: 5, pricePerPiece: 1.5 },
1194      gids: 100,
1195      dessertPP: 10,
1196      lunchPP: 25,
1197      highteaPP: 27.5,
1198      koffieTheePP: 7.5,
1199      lunchDrankUpgradePP: 10,
1200      proseccoUpgradePP: 7.5,
1201      highTeaDrankUpgradePP: 10,
1202      wijnPP: 65,
1203      tapasPP: 65,
1204      bbqPP: 70,
1205      bbqHalalPP: 3,
1206      pizza15PP: 55,
1207      pizza20PP: 60,
1208      kurkPP: 5,
1209      borrelplankStaffels: [75, 100, 125, 150, 175, 200, 250, 300, 350, 400],
1210      saturdaySurchargePP: 5
1211    };
1212
1213    const ARRANGEMENTS = {
1214      drank: { label: 'Drank arrangement', zones: ['A', 'B', 'C'], durations: [1.5, 2, 2.5], extras: ['hapjes_keuze', 'gids', 'warme_hapjes', 'borrelplank'] },
1215      pizza: { label: 'Pizza', zones: ['A', 'B', 'C'], durations: [1.5, 2, 2.5], extras: ['dessert'] },
1216      wijn: { label: 'Wijnproeverij', zones: ['A', 'B', 'C'], durations: [2, 2.5], extras: [] },
1217      tapas: { label: 'Tapas Dinner', zones: ['B', 'C'], durations: [2, 2.5], extras: ['dessert'] },
1218      bbq: { label: 'BBQ Dinner', zones: ['A', 'B', 'C'], durations: [2, 2.5], extras: ['dessert', 'bbq_halal'] },
1219      lunch: { label: 'Lunch', zones: ['B', 'C'], durations: [1.5, 2, 2.5], extras: ['koffie_thee', 'drank_upgrade', 'borrelplank'] },
1220      hightea: { label: 'High Tea', zones: ['B', 'C'], durations: [1.5, 2, 2.5], extras: ['prosecco_upgrade', 'drank_upgrade', 'borrelplank'] },
1221      kurk: { label: 'Geen arrangement / kurkengeld', zones: ['A', 'B', 'C'], durations: [1.5, 2, 2.5], extras: [] }
1222    };
1223
1224    const PIZZA_BARBARA_PRICES = {
1225      1.5: { 6: 475, 7: 500, 8: 525, 9: 550, 10: 575 }
1226    };
1227
1228    const state = {
1229      personen: 12,
1230      arrangement: '',
1231      duur: '',
1232      calcDate: '',
1233      extras: {
1234        hapjes_keuze: '',
1235        gids: false,
1236        warme_hapjes: false,
1237        warme_hapjes_type: '',
1238        borrelplank: false,
1239        dessert: false,
1240        koffie_thee: false,
1241        drank_upgrade: false,
1242        prosecco_upgrade: false,
1243        bbq_halal: false
1244      }
1245    };
1246
1247    let isSubmitting = false;
1248    let formWasSubmitted = false;
1249
1250    const els = {
1251      form: root.querySelector('#db-popup-form'),
1252      step1: root.querySelector('#db-step-1'),
1253      step2: root.querySelector('#db-step-2'),
1254      progress1: root.querySelector('#db-progress-1'),
1255      progress2: root.querySelector('#db-progress-2'),
1256      nextStep: root.querySelector('#db-next-step'),
1257      prevStep: root.querySelector('#db-prev-step'),
1258      submitBtn: root.querySelector('#db-submit'),
1259      step1Error: root.querySelector('#db-step-1-error'),
1260      step2Error: root.querySelector('#db-step-2-error'),
1261      submitStatus: root.querySelector('#db-submit-status'),
1262      personen: root.querySelector('#calc_personen'),
1263      arrangement: root.querySelector('#calc_arrangement'),
1264      duur: root.querySelector('#calc_duur'),
1265      calcDate: root.querySelector('#calc_date_for_price'),
1266      extras: root.querySelector('#calc_extras'),
1267      result: root.querySelector('#calc_result'),
1268      messages: root.querySelector('#calc_messages'),
1269      step2Summary: root.querySelector('#db-step-2-summary'),
1270      contactName: root.querySelector('#contact_name'),
1271      contactEmail: root.querySelector('#contact_email'),
1272      contactPhone: root.querySelector('#contact_phone'),
1273      contactCompany: root.querySelector('#contact_company'),
1274      contactDate: root.querySelector('#contact_date'),
1275      contactStarttime: root.querySelector('#contact_starttime'),
1276      contactOccasion: root.querySelector('#contact_occasion'),
1277      contactGroupWrap: root.querySelector('#contact_group_wrap'),
1278      contactGroup: root.querySelector('#contact_group'),
1279      contactNotes: root.querySelector('#contact_notes'),
1280      contactTerms: root.querySelector('#contact_terms')
1281    };
1282
1283    createQuarterHourOptions(els.contactStarttime);
1284
1285    function euro(value) {
1286      return '€' + Number(value).toLocaleString('nl-NL', {
1287        minimumFractionDigits: 2,
1288        maximumFractionDigits: 2
1289      });
1290    }
1291
1292    function euroWhole(value) {
1293      return '€' + Math.round(value).toLocaleString('nl-NL');
1294    }
1295
1296    function roundToHalf(value) {
1297      return Math.round(value * 2) / 2;
1298    }
1299
1300    function getZone(personen) {
1301      if (personen >= 6 && personen <= 12) return 'A';
1302      if (personen >= 13 && personen <= 35) return 'B';
1303      if (personen >= 36 && personen <= 48) return 'C';
1304      return null;
1305    }
1306
1307    function getBootType(zone, arrangement, personen) {
1308      if (arrangement === 'bbq' && personen <= 12) return 'Domstadboot';
1309      return CONFIG.zones[zone] ? CONFIG.zones[zone].boot : '';
1310    }
1311
1312    function isSaturday(dateString) {
1313      if (!dateString) return false;
1314      const d = new Date(dateString + 'T12:00:00');
1315      return d.getDay() === 6;
1316    }
1317
1318    function needsGroupComposition(occasion) {
1319      return occasion === 'Vriendenuitje' || occasion === 'Vrijgezellenfeest';
1320    }
1321
1322    function updateGroupCompositionVisibility() {
1323      const show = needsGroupComposition(els.contactOccasion.value);
1324      if (show) {
1325        els.contactGroupWrap.classList.remove('db-hidden');
1326        els.contactGroup.required = true;
1327      } else {
1328        els.contactGroupWrap.classList.add('db-hidden');
1329        els.contactGroup.required = false;
1330        els.contactGroup.value = '';
1331      }
1332    }
1333
1334    function calculateBorrelplankPrice(personen) {
1335      const target = personen * 7.5;
1336      const staffels = CONFIG.borrelplankStaffels;
1337      let best = staffels[0];
1338      let bestDiff = Math.abs(best - target);
1339
1340      for (const price of staffels) {
1341        const diff = Math.abs(price - target);
1342        if (diff < bestDiff) {
1343          best = price;
1344          bestDiff = diff;
1345        } else if (diff === bestDiff && price < best) {
1346          best = price;
1347        }
1348      }
1349      return best;
1350    }
1351
1352    function getVisibleArrangements(zone, saturday, personen) {
1353      return Object.entries(ARRANGEMENTS)
1354        .filter(function (entry) {
1355          const key = entry[0];
1356          const cfg = entry[1];
1357          if (key === 'bbq' && personen < 10) return false;
1358          return cfg.zones.includes(zone);
1359        })
1360        .map(function (entry) { return { key: entry[0], label: entry[1].label }; });
1361    }
1362
1363    function renderPersonOptions() {
1364      let html = '';
1365      for (let i = 6; i <= 48; i++) {
1366        html += '<option value="' + i + '">' + i + (i === 48 ? ' (max online)' : '') + '</option>';
1367      }
1368      els.personen.innerHTML = html;
1369      els.personen.value = String(state.personen || 12);
1370    }
1371
1372    function renderArrangementOptions() {
1373      const zone = getZone(state.personen);
1374      const saturday = isSaturday(state.calcDate);
1375      const visible = getVisibleArrangements(zone, saturday, state.personen);
1376
1377      let html = '<option value="">Kies een arrangement</option>';
1378      visible.forEach(function (item) {
1379        if (item.key === 'kurk' && saturday) {
1380          html += '<option value="' + item.key + '" disabled>' + item.label + ' (niet mogelijk op zaterdag)</option>';
1381        } else {
1382          html += '<option value="' + item.key + '">' + item.label + '</option>';
1383        }
1384      });
1385
1386      els.arrangement.innerHTML = html;
1387
1388      const isValid = state.arrangement && visible.find(function (v) { return v.key === state.arrangement; }) && !(state.arrangement === 'kurk' && saturday);
1389      if (isValid) {
1390        els.arrangement.value = state.arrangement;
1391      } else {
1392        state.arrangement = '';
1393        els.arrangement.value = '';
1394      }
1395    }
1396
1397    function renderDurationOptions() {
1398      if (!state.arrangement) {
1399        els.duur.innerHTML = '<option value="">Kies eerst een arrangement</option>';
1400        state.duur = '';
1401        return;
1402      }
1403
1404      const durations = ARRANGEMENTS[state.arrangement].durations;
1405      let html = '<option value="">Kies een duur</option>';
1406
1407      durations.forEach(function (d) {
1408        html += '<option value="' + d + '">' + String(d).replace('.', ',') + ' uur</option>';
1409      });
1410
1411      els.duur.innerHTML = html;
1412
1413      if (durations.includes(Number(state.duur))) {
1414        els.duur.value = String(state.duur);
1415      } else {
1416        state.duur = '';
1417        els.duur.value = '';
1418      }
1419    }
1420
1421    function resetExtras() {
1422      state.extras = {
1423        hapjes_keuze: '',
1424        gids: false,
1425        warme_hapjes: false,
1426        warme_hapjes_type: '',
1427        borrelplank: false,
1428        dessert: false,
1429        koffie_thee: false,
1430        drank_upgrade: false,
1431        prosecco_upgrade: false,
1432        bbq_halal: false
1433      };
1434    }
1435
1436    function buildExtrasReadable() {
1437      const extras = [];
1438
1439      if (state.arrangement === 'drank') {
1440        if (state.extras.hapjes_keuze === 'ja') extras.push('Hapjes: ja');
1441        if (state.extras.hapjes_keuze === 'nee') extras.push('Hapjes: nee');
1442      }
1443
1444      if (state.extras.gids) extras.push('Gids');
1445      if (state.extras.borrelplank && state.arrangement !== 'wijn') extras.push('Luxe borrelplank');
1446      if (state.extras.dessert) extras.push('Dessertplank');
1447      if (state.extras.koffie_thee) extras.push('Koffie en thee');
1448      if (state.extras.drank_upgrade) extras.push('Drankupgrade');
1449      if (state.extras.prosecco_upgrade) extras.push('Onbeperkt prosecco');
1450      if (state.extras.bbq_halal) extras.push('Halal BBQ voor gehele groep');
1451
1452      if (state.extras.warme_hapjes) {
1453        if (state.extras.warme_hapjes_type) {
1454          let hapjesLabel = state.extras.warme_hapjes_type;
1455          if (hapjesLabel === 'vlees') hapjesLabel = 'Bittergarnituur vlees';
1456          if (hapjesLabel === 'vega') hapjesLabel = 'Bittergarnituur vega';
1457          if (hapjesLabel === 'gemengd') hapjesLabel = 'Bittergarnituur gemengd';
1458          if (hapjesLabel === 'bitterballen') hapjesLabel = 'Bitterballen';
1459          extras.push('Warme hapjes, ' + hapjesLabel);
1460        } else {
1461          extras.push('Warme hapjes');
1462        }
1463      }
1464
1465      if (state.arrangement === 'wijn') {
1466        extras.push('Luxe borrelplank inbegrepen');
1467      }
1468
1469      return extras.join(', ');
1470    }
1471
1472    function renderExtras() {
1473      if (!state.arrangement) {
1474        els.extras.innerHTML = '';
1475        return;
1476      }
1477
1478      const extras = ARRANGEMENTS[state.arrangement].extras || [];
1479      let html = '<div class="db-card">';
1480      html += '<div style="font-weight:700;margin-bottom:8px;color:#003366;font-size:13px;">Extra opties</div>';
1481
1482      if (extras.includes('hapjes_keuze')) {
1483        html += '<div style="margin-bottom:10px;">';
1484        html += '<label for="calc_hapjes_keuze" style="display:block;margin-bottom:4px;font-weight:600;font-size:12px;">Willen jullie daar hapjes bij?<span class="db-required">*</span></label>';
1485        html += '<select id="calc_hapjes_keuze">';
1486        html += '<option value="">Maak een keuze</option>';
1487        html += '<option value="nee"' + (state.extras.hapjes_keuze === 'nee' ? ' selected' : '') + '>Nee, geen hapjes</option>';
1488        html += '<option value="ja"' + (state.extras.hapjes_keuze === 'ja' ? ' selected' : '') + '>Ja, graag hapjes erbij</option>';
1489        html += '</select>';
1490        html += '</div>';
1491      }
1492
1493      const showHapjesOptions = state.arrangement !== 'drank' || state.extras.hapjes_keuze === 'ja';
1494      const useSingleColumn = state.arrangement === 'drank';
1495
1496      html += '<div class="' + (useSingleColumn ? 'db-extras-grid-single' : 'db-extras-grid') + '">';
1497
1498      function checkbox(id, label, checked) {
1499        return '<label class="db-checkbox"><input type="checkbox" data-extra="' + id + '" ' + (checked ? 'checked' : '') + '><span>' + label + '</span></label>';
1500      }
1501
1502      if (extras.includes('gids')) {
1503        html += checkbox('gids', 'Gids aan boord (' + euroWhole(CONFIG.gids) + ')', state.extras.gids);
1504      }
1505
1506      if (showHapjesOptions) {
1507        if (extras.includes('warme_hapjes')) html += checkbox('warme_hapjes', 'Warme hapjes, 5 stuks p.p. (' + euro(CONFIG.warmeHapjes.piecesPerPerson * CONFIG.warmeHapjes.pricePerPiece) + ' p.p.)', state.extras.warme_hapjes);
1508        if (extras.includes('borrelplank')) html += checkbox('borrelplank', 'Luxe borrelplank', state.extras.borrelplank);
1509      }
1510
1511      if (extras.includes('dessert')) html += checkbox('dessert', 'Dessertplank (' + euro(CONFIG.dessertPP) + ' p.p.)', state.extras.dessert);
1512      if (extras.includes('koffie_thee')) html += checkbox('koffie_thee', 'Koffie en thee (' + euro(CONFIG.koffieTheePP) + ' p.p.)', state.extras.koffie_thee);
1513      if (extras.includes('drank_upgrade')) html += checkbox('drank_upgrade', 'Drankupgrade (' + euro(CONFIG.lunchDrankUpgradePP) + ' p.p. voor de eerste 1,5 uur)', state.extras.drank_upgrade);
1514      if (extras.includes('prosecco_upgrade')) html += checkbox('prosecco_upgrade', 'Onbeperkt prosecco (' + euro(CONFIG.proseccoUpgradePP) + ' p.p.)', state.extras.prosecco_upgrade);
1515      if (extras.includes('bbq_halal')) html += checkbox('bbq_halal', 'Halal BBQ voor hele groep (+' + euro(CONFIG.bbqHalalPP) + ' p.p.)', state.extras.bbq_halal);
1516
1517      html += '</div>';
1518
1519      if (state.extras.warme_hapjes && extras.includes('warme_hapjes') && showHapjesOptions) {
1520        html += '<div class="db-hapjes-wrap">';
1521        html += '<label for="calc_warme_hapjes_type" style="display:block;margin-bottom:4px;font-weight:600;font-size:12px;">Welke warme hapjes willen jullie?</label>';
1522        html += '<select id="calc_warme_hapjes_type">';
1523        html += '<option value="">Kies een soort</option>';
1524        html += '<option value="bitterballen"' + (state.extras.warme_hapjes_type === 'bitterballen' ? ' selected' : '') + '>Bitterballen</option>';
1525        html += '<option value="vlees"' + (state.extras.warme_hapjes_type === 'vlees' ? ' selected' : '') + '>Bittergarnituur vlees</option>';
1526        html += '<option value="vega"' + (state.extras.warme_hapjes_type === 'vega' ? ' selected' : '') + '>Bittergarnituur vega</option>';
1527        html += '<option value="gemengd"' + (state.extras.warme_hapjes_type === 'gemengd' ? ' selected' : '') + '>Bittergarnituur gemengd</option>';
1528        html += '</select>';
1529        html += '</div>';
1530      }
1531
1532      if (state.arrangement === 'drank' && state.extras.hapjes_keuze === 'ja') {
1533        html += '<div class="db-inline-note" style="margin-top:6px;">Kies hierbij minimaal warme hapjes of een luxe borrelplank.</div>';
1534      }
1535
1536      if (state.arrangement === 'wijn') {
1537        html += '<div class="db-inline-note" style="margin-top:6px;">Bij de wijnproeverij is de luxe borrelplank standaard inbegrepen.</div>';
1538      }
1539
1540      if (state.extras.dessert && extras.includes('dessert')) {
1541        html += '<div class="db-inline-note" style="margin-top:6px;">Een dessertplank voegt automatisch 30 minuten extra vaartijd toe.</div>';
1542      }
1543
1544      html += '</div>';
1545      els.extras.innerHTML = html;
1546
1547      const hapjesKeuzeSelect = root.querySelector('#calc_hapjes_keuze');
1548      if (hapjesKeuzeSelect) {
1549        hapjesKeuzeSelect.addEventListener('change', function () {
1550          state.extras.hapjes_keuze = this.value;
1551          if (this.value === 'nee') {
1552            state.extras.warme_hapjes = false;
1553            state.extras.warme_hapjes_type = '';
1554            state.extras.borrelplank = false;
1555          }
1556          renderExtras();
1557          recalculate();
1558        });
1559      }
1560
1561      els.extras.querySelectorAll('input[type="checkbox"][data-extra]').forEach(function (input) {
1562        input.addEventListener('change', function () {
1563          const key = this.getAttribute('data-extra');
1564          state.extras[key] = this.checked;
1565          if (key === 'warme_hapjes' && !this.checked) {
1566            state.extras.warme_hapjes_type = '';
1567          }
1568          renderExtras();
1569          recalculate();
1570        });
1571      });
1572
1573      const hapjesTypeSelect = root.querySelector('#calc_warme_hapjes_type');
1574      if (hapjesTypeSelect) {
1575        hapjesTypeSelect.addEventListener('change', function () {
1576          state.extras.warme_hapjes_type = this.value;
1577          recalculate();
1578        });
1579      }
1580    }
1581
1582    function getEffectiveDuration() {
1583      let duration = Number(state.duur || 0);
1584      if (state.extras.dessert) duration += 0.5;
1585      return duration;
1586    }
1587
1588    function getBaseDuration(arrangement) {
1589      if (['wijn', 'tapas', 'bbq'].includes(arrangement)) return 2;
1590      if (arrangement === 'pizza') return Number(state.duur) === 1.5 ? 1.5 : 2;
1591      return 1.5;
1592    }
1593
1594    function calculateBoatCost(zone, arrangement, effectiveDuration, personen) {
1595      const includesBoating = ['pizza', 'wijn', 'tapas', 'bbq'].includes(arrangement);
1596      const baseDuration = getBaseDuration(arrangement);
1597      let boatCost = 0;
1598      let extraBoatCost = 0;
1599
1600      if (!includesBoating) boatCost = CONFIG.vaartarief[zone];
1601
1602      if (effectiveDuration > baseDuration) {
1603        const extraBlocks = (effectiveDuration - baseDuration) / 0.5;
1604        const boatZone = (arrangement === 'bbq' && personen <= 12) ? 'B' : zone;
1605        extraBoatCost = extraBlocks * CONFIG.extraVaarHalfuur[boatZone];
1606      }
1607
1608      return { boatCost, extraBoatCost };
1609    }
1610
1611    function describeBaseArrangement(zone, arrangement, persons, selectedDuration, saturday) {
1612      switch (arrangement) {
1613        case 'drank':
1614          return {
1615            amount: persons * (saturday ? CONFIG.drank.zaterdagBasis : CONFIG.drank.basis),
1616            label: 'Drank arrangement voor 1,5 uur',
1617            meta: persons + ' x ' + euro(saturday ? CONFIG.drank.zaterdagBasis : CONFIG.drank.basis) + ' p.p.'
1618          };
1619        case 'pizza': {
1620          const durationKey = Number(selectedDuration) === 1.5 ? 1.5 : 2;
1621          const pp = durationKey === 1.5 ? CONFIG.pizza15PP : CONFIG.pizza20PP;
1622          const saturdayPP = pp + (saturday ? CONFIG.saturdaySurchargePP : 0);
1623
1624          if (zone === 'A' && durationKey === 1.5 && persons <= 10) {
1625            return {
1626              amount: PIZZA_BARBARA_PRICES[1.5][persons] + (saturday ? persons * CONFIG.saturdaySurchargePP : 0),
1627              label: 'Pizza pakket',
1628              meta: 'Inclusief 1,5 uur varen, pizza en onbeperkt drank'
1629            };
1630          }
1631
1632          return {
1633            amount: persons * saturdayPP,
1634            label: 'Pizza pakket',
1635            meta: persons + ' x ' + euro(saturdayPP) + ' p.p. (incl. ' + String(durationKey).replace('.', ',') + ' uur varen, pizza en onbeperkt drank)'
1636          };
1637        }
1638        case 'wijn': {
1639          const pp = CONFIG.wijnPP + (saturday ? CONFIG.saturdaySurchargePP : 0);
1640          return {
1641            amount: Math.max(persons, 10) * pp,
1642            label: 'Wijnproeverij pakket',
1643            meta: Math.max(persons, 10) + ' x ' + euro(pp) + ' p.p. (incl. 2 uur varen, wijnproeverij, onbeperkt drank en luxe borrelplank)'
1644          };
1645        }
1646        case 'tapas': {
1647          const pp = CONFIG.tapasPP + (saturday ? CONFIG.saturdaySurchargePP : 0);
1648          return {
1649            amount: Math.max(persons, 10) * pp,
1650            label: 'Tapas pakket',
1651            meta: Math.max(persons, 10) + ' x ' + euro(pp) + ' p.p. (incl. 2 uur varen, tapas en onbeperkt drank)'
1652          };
1653        }
1654        case 'bbq': {
1655          const pp = CONFIG.bbqPP + (saturday ? CONFIG.saturdaySurchargePP : 0);
1656          return {
1657            amount: Math.max(persons, 10) * pp,
1658            label: 'BBQ pakket',
1659            meta: Math.max(persons, 10) + ' x ' + euro(pp) + ' p.p. (incl. 2 uur varen, BBQ en onbeperkt drank)'
1660          };
1661        }
1662        case 'lunch': {
1663          const pp = CONFIG.lunchPP + (saturday ? CONFIG.saturdaySurchargePP : 0);
1664          return {
1665            amount: persons * pp,
1666            label: 'Lunch',
1667            meta: persons + ' x ' + euro(pp) + ' p.p.'
1668          };
1669        }
1670        case 'hightea': {
1671          const pp = CONFIG.highteaPP + (saturday ? CONFIG.saturdaySurchargePP : 0);
1672          return {
1673            amount: persons * pp,
1674            label: 'High Tea',
1675            meta: persons + ' x ' + euro(pp) + ' p.p.'
1676          };
1677        }
1678        case 'kurk':
1679          return {
1680            amount: persons * CONFIG.kurkPP,
1681            label: 'Kurkengeld voor 1,5 uur',
1682            meta: persons + ' x ' + euro(CONFIG.kurkPP) + ' p.p.'
1683          };
1684        default:
1685          return { amount: 0, label: '', meta: '' };
1686      }
1687    }
1688
1689    function calculateExtraDrinkCost(arrangement, effectiveDuration, persons) {
1690      const baseDuration = getBaseDuration(arrangement);
1691      if (effectiveDuration <= baseDuration) return 0;
1692      const extraBlocks = (effectiveDuration - baseDuration) / 0.5;
1693
1694      if (['drank'].includes(arrangement)) return extraBlocks * persons * CONFIG.drank.extraHalfuur;
1695      if (['pizza', 'wijn', 'tapas', 'bbq'].includes(arrangement)) return extraBlocks * persons * CONFIG.drank.extraHalfuur;
1696      if (arrangement === 'lunch' && state.extras.drank_upgrade) return extraBlocks * persons * CONFIG.drank.extraHalfuur;
1697      if (arrangement === 'hightea' && (state.extras.drank_upgrade || state.extras.prosecco_upgrade)) return extraBlocks * persons * CONFIG.drank.extraHalfuur;
1698      return 0;
1699    }
1700
1701    function calculateExtras(arrangement, persons) {
1702      const lines = [];
1703      let total = 0;
1704
1705      if (state.extras.gids) {
1706        lines.push({ key: 'gids', label: 'Gids aan boord', meta: '', amount: CONFIG.gids });
1707        total += CONFIG.gids;
1708      }
1709
1710      if (state.extras.warme_hapjes) {
1711        const hapjesPrice = persons * CONFIG.warmeHapjes.piecesPerPerson * CONFIG.warmeHapjes.pricePerPiece;
1712        let hapjesLabel = 'Warme hapjes';
1713        if (state.extras.warme_hapjes_type) {
1714          if (state.extras.warme_hapjes_type === 'bitterballen') hapjesLabel = 'Warme hapjes, Bitterballen';
1715          if (state.extras.warme_hapjes_type === 'vlees') hapjesLabel = 'Warme hapjes, Bittergarnituur vlees';
1716          if (state.extras.warme_hapjes_type === 'vega') hapjesLabel = 'Warme hapjes, Bittergarnituur vega';
1717          if (state.extras.warme_hapjes_type === 'gemengd') hapjesLabel = 'Warme hapjes, Bittergarnituur gemengd';
1718        }
1719        lines.push({
1720          key: 'warme_hapjes',
1721          label: hapjesLabel,
1722          meta: persons + ' x ' + euro(CONFIG.warmeHapjes.piecesPerPerson * CONFIG.warmeHapjes.pricePerPiece) + ' p.p.',
1723          amount: hapjesPrice
1724        });
1725        total += hapjesPrice;
1726      }
1727
1728      if (state.extras.borrelplank && arrangement !== 'wijn') {
1729        const plankPrice = calculateBorrelplankPrice(persons);
1730        lines.push({ key: 'borrelplank', label: 'Luxe borrelplank', meta: '', amount: plankPrice });
1731        total += plankPrice;
1732      }
1733
1734      if (state.extras.dessert) {
1735        const price = persons * CONFIG.dessertPP;
1736        lines.push({
1737          key: 'dessert',
1738          label: 'Dessertplank',
1739          meta: persons + ' x ' + euro(CONFIG.dessertPP) + ' p.p.',
1740          amount: price
1741        });
1742        total += price;
1743      }
1744
1745      if (arrangement === 'lunch' && state.extras.koffie_thee) {
1746        const price = persons * CONFIG.koffieTheePP;
1747        lines.push({
1748          key: 'koffie_thee',
1749          label: 'Koffie en thee',
1750          meta: persons + ' x ' + euro(CONFIG.koffieTheePP) + ' p.p.',
1751          amount: price
1752        });
1753        total += price;
1754      }
1755
1756      if (arrangement === 'lunch' && state.extras.drank_upgrade) {
1757        const price = persons * CONFIG.lunchDrankUpgradePP;
1758        lines.push({
1759          key: 'drank_upgrade',
1760          label: 'Drankupgrade voor de eerste 1,5 uur',
1761          meta: persons + ' x ' + euro(CONFIG.lunchDrankUpgradePP) + ' p.p.',
1762          amount: price
1763        });
1764        total += price;
1765      }
1766
1767      if (arrangement === 'hightea' && state.extras.prosecco_upgrade) {
1768        const price = persons * CONFIG.proseccoUpgradePP;
1769        lines.push({
1770          key: 'prosecco_upgrade',
1771          label: 'Onbeperkt prosecco',
1772          meta: persons + ' x ' + euro(CONFIG.proseccoUpgradePP) + ' p.p.',
1773          amount: price
1774        });
1775        total += price;
1776      }
1777
1778      if (arrangement === 'hightea' && state.extras.drank_upgrade) {
1779        const price = persons * CONFIG.highTeaDrankUpgradePP;
1780        lines.push({
1781          key: 'drank_upgrade',
1782          label: 'Drankupgrade voor de eerste 1,5 uur',
1783          meta: persons + ' x ' + euro(CONFIG.highTeaDrankUpgradePP) + ' p.p.',
1784          amount: price
1785        });
1786        total += price;
1787      }
1788
1789      if (arrangement === 'bbq' && state.extras.bbq_halal) {
1790        const price = persons * CONFIG.bbqHalalPP;
1791        lines.push({
1792          key: 'bbq_halal',
1793          label: 'Halal BBQ toeslag',
1794          meta: persons + ' x ' + euro(CONFIG.bbqHalalPP) + ' p.p.',
1795          amount: price
1796        });
1797        total += price;
1798      }
1799
1800      return { total, lines };
1801    }
1802
1803    function getMessages(zone, arrangement, saturday, personen) {
1804      const messages = [
1805        'Prijsindicatie op basis van jullie huidige keuzes.',
1806        'De prijs per persoon kan nog iets veranderen als het aantal deelnemers wijzigt.'
1807      ];
1808      if (!state.calcDate) messages.push('Op zaterdag geldt een toeslag van €5 p.p. op elk arrangement.');
1809      if (zone === 'C') messages.push('Voor 36 t/m 48 personen varen we verdeeld over twee boten.');
1810      if (arrangement === 'drank' && state.extras.hapjes_keuze === 'ja') messages.push('Kies hierbij minimaal warme hapjes of een luxe borrelplank.');
1811      if (arrangement === 'kurk' && saturday) messages.push('Kurkengeld is niet mogelijk op zaterdag.');
1812      if (arrangement === 'wijn') messages.push('Bij de wijnproeverij is de luxe borrelplank inbegrepen.');
1813      return messages;
1814    }
1815
1816    function buildSummary(arrangementLabel, effectiveDuration) {
1817      const extras = [];
1818      if (state.extras.gids) extras.push('gids');
1819      if (state.extras.warme_hapjes) extras.push(state.extras.warme_hapjes_type ? 'warme hapjes, ' + state.extras.warme_hapjes_type : 'warme hapjes');
1820      if (state.extras.borrelplank && state.arrangement !== 'wijn') extras.push('luxe borrelplank');
1821      if (state.extras.dessert) extras.push('dessertplank');
1822      if (state.extras.koffie_thee) extras.push('koffie en thee');
1823      if (state.extras.drank_upgrade) extras.push('drankupgrade');
1824      if (state.extras.prosecco_upgrade) extras.push('onbeperkt prosecco');
1825      if (state.extras.bbq_halal) extras.push('halal BBQ voor gehele groep');
1826      if (state.arrangement === 'drank' && state.extras.hapjes_keuze === 'nee') extras.push('zonder hapjes');
1827      if (state.arrangement === 'wijn') extras.push('incl. luxe borrelplank');
1828      return state.personen + ' personen, ' + arrangementLabel + ', ' + String(effectiveDuration).replace('.', ',') + ' uur' + (extras.length ? ', met ' + extras.join(', ') : '') + '.';
1829    }
1830
1831    function calculatePrice() {
1832      const persons = Number(state.personen);
1833      const arrangement = state.arrangement;
1834      const duration = Number(state.duur);
1835
1836      if (!persons || !arrangement || !duration) return null;
1837
1838      const zone = getZone(persons);
1839      const bootType = getBootType(zone, arrangement, persons);
1840      const arrangementLabel = ARRANGEMENTS[arrangement].label;
1841      const effectiveDuration = getEffectiveDuration();
1842      const saturday = isSaturday(state.calcDate);
1843
1844      const base = describeBaseArrangement(zone, arrangement, persons, duration, saturday);
1845      const boat = calculateBoatCost(zone, arrangement, effectiveDuration, persons);
1846      const extraDrinkCost = calculateExtraDrinkCost(arrangement, effectiveDuration, persons);
1847      const extras = calculateExtras(arrangement, persons);
1848
1849      const rawTotal = base.amount + boat.boatCost + boat.extraBoatCost + extraDrinkCost + extras.total;
1850
1851      const priceLines = [];
1852      if (base.amount > 0) {
1853        priceLines.push({
1854          key: 'basis',
1855          label: base.label,
1856          meta: base.meta || '',
1857          amount: base.amount
1858        });
1859      }
1860
1861      if (boat.boatCost > 0) {
1862        priceLines.push({
1863          key: 'vaartarief',
1864          label: 'Vaartarief voor 1,5 uur',
1865          meta: '',
1866          amount: boat.boatCost
1867        });
1868      }
1869
1870      if (boat.extraBoatCost > 0) {
1871        priceLines.push({
1872          key: 'extra_vaartijd',
1873          label: 'Extra vaartijd',
1874          meta: 'Verlenging van de tocht',
1875          amount: boat.extraBoatCost
1876        });
1877      }
1878
1879      if (extraDrinkCost > 0) {
1880        priceLines.push({
1881          key: 'extra_drank',
1882          label: 'Verlenging drankarrangement',
1883          meta: persons + ' x ' + euro(CONFIG.drank.extraHalfuur) + ' p.p. per half uur',
1884          amount: extraDrinkCost
1885        });
1886      }
1887
1888      extras.lines.forEach(function (line) {
1889        priceLines.push(line);
1890      });
1891
1892      return {
1893        zone,
1894        bootType,
1895        arrangementKey: arrangement,
1896        arrangementLabel,
1897        personen: persons,
1898        duur: duration,
1899        effectiveDuration,
1900        priceLines,
1901        total: Math.round(rawTotal),
1902        pricePerPerson: roundToHalf(rawTotal / persons),
1903        messages: getMessages(zone, arrangement, saturday, persons),
1904        summaryText: buildSummary(arrangementLabel, effectiveDuration),
1905        saturday
1906      };
1907    }
1908
1909    function renderResult(result) {
1910      if (!result) {
1911        els.result.innerHTML = '';
1912        els.messages.innerHTML = '';
1913        return;
1914      }
1915
1916      let html = '<div class="db-result">';
1917      html += '<div style="font-size:18px;font-weight:700;color:#003366;margin-bottom:6px;line-height:1.15;">Jullie prijsindicatie</div>';
1918      html += '<div style="font-size:13px;margin-bottom:10px;line-height:1.35;"><strong>Samenvatting:</strong> ' + result.summaryText + '</div>';
1919
1920      result.priceLines.forEach(function (line) {
1921        html += '<div class="db-price-line">';
1922        html += '<div class="db-price-label">';
1923        html += '<div>' + line.label + '</div>';
1924        if (line.meta) {
1925          html += '<small>' + line.meta + '</small>';
1926        }
1927        html += '</div>';
1928        html += '<div style="white-space:nowrap;font-weight:600;">' + euroWhole(line.amount) + '</div>';
1929        html += '</div>';
1930      });
1931
1932      html += '<div class="db-total">Totaal: ' + euroWhole(result.total) + '</div>';
1933      html += '<div class="db-pp">Ca. ' + euro(result.pricePerPerson) + ' p.p.</div>';
1934      html += '</div>';
1935
1936      els.result.innerHTML = html;
1937
1938      if (result.messages && result.messages.length) {
1939        els.messages.innerHTML = '<div class="db-message-box">' + result.messages.map(function (msg) {
1940          return '<div>' + msg + '</div>';
1941        }).join('') + '</div>';
1942      } else {
1943        els.messages.innerHTML = '';
1944      }
1945    }
1946
1947    function fillHiddenField(id, value) {
1948      const field = root.querySelector('#' + id);
1949      if (field) field.value = value;
1950    }
1951
1952    function buildCalcJson(result) {
1953      return JSON.stringify({
1954        zone: result.zone,
1955        bootType: result.bootType,
1956        arrangement: result.arrangementLabel,
1957        arrangementKey: result.arrangementKey,
1958        personen: result.personen,
1959        duur: result.duur,
1960        effectiveDuration: result.effectiveDuration,
1961        zaterdag: result.saturday ? 'ja' : 'nee',
1962        calcDate: state.calcDate || '',
1963        extras: state.extras,
1964        total: result.total,
1965        pricePerPerson: result.pricePerPerson,
1966        messages: result.messages,
1967        summary: result.summaryText,
1968        lines: result.priceLines
1969      });
1970    }
1971
1972    function buildPriceLinesJson(result) {
1973      return JSON.stringify(result ? result.priceLines : []);
1974    }
1975
1976    function fillHiddenFields(result) {
1977      if (!result) return;
1978      fillHiddenField('hidden_calc_zone', result.zone);
1979      fillHiddenField('hidden_calc_boot_type', result.bootType);
1980      fillHiddenField('hidden_calc_arrangement', result.arrangementLabel);
1981      fillHiddenField('hidden_calc_arrangement_key', result.arrangementKe
1981y);
1982      fillHiddenField('hidden_calc_personen', result.personen);
1983      fillHiddenField('hidden_calc_duur', String(result.duur).replace('.', ','));
1984      fillHiddenField('hidden_calc_effective_duur', String(result.effectiveDuration).replace('.', ','));
1985      fillHiddenField('hidden_calc_prijs_totaal', result.total);
1986      fillHiddenField('hidden_calc_prijs_pp', euro(result.pricePerPerson));
1987      fillHiddenField('hidden_calc_samenvatting', result.summaryText);
1988      fillHiddenField('hidden_calc_json', buildCalcJson(result));
1989      fillHiddenField('hidden_calc_price_lines_json', buildPriceLinesJson(result));
1990      fillHiddenField('hidden_calc_hapjes', state.extras.warme_hapjes ? 'ja' : 'nee');
1991      fillHiddenField('hidden_calc_hapjes_type', state.extras.warme_hapjes_type || '');
1992      fillHiddenField('hidden_calc_borrelplank', state.extras.borrelplank ? 'ja' : 'nee');
1993      fillHiddenField('hidden_calc_dessert', state.extras.dessert ? 'ja' : 'nee');
1994      fillHiddenField('hidden_calc_gids', state.extras.gids ? 'ja' : 'nee');
1995      fillHiddenField('hidden_calc_is_zaterdag', result.saturday ? 'ja' : 'nee');
1996      fillHiddenField('hidden_calc_hapjes_keuze', state.extras.hapjes_keuze || '');
1997      fillHiddenField('hidden_calc_bbq_halal', state.extras.bbq_halal ? 'ja' : 'nee');
1998    }
1999
2000    function recalculate() {
2001      renderArrangementOptions();
2002      renderDurationOptions();
2003      renderExtras();
2004      const result = calculatePrice();
2005      renderResult(result);
2006      fillHiddenFields(result);
2007    }
2008
2009    function setSubmitBusy(busy) {
2010      isSubmitting = busy;
2011      if (els.submitBtn) {
2012        els.submitBtn.disabled = busy || formWasSubmitted;
2013        els.submitBtn.textContent = busy ? 'Bezig met verzenden...' : 'Aanvraag verzenden';
2014      }
2015      if (els.prevStep) els.prevStep.disabled = busy || formWasSubmitted;
2016    }
2017
2018    function disableEntireFormAfterSuccess() {
2019      formWasSubmitted = true;
2020      root.querySelectorAll('input, select, textarea, button').forEach(function(el) {
2021        el.disabled = true;
2022      });
2023    }
2024
2025    function showBigSuccessMessage() {
2026      const fullName = (els.contactName && els.contactName.value ? els.contactName.value.trim() : '');
2027      const firstName = fullName ? fullName.split(/\s+/)[0] : 'daar';
2028
2029      const successHtml = `
2030        <div class="db-success-big-wrap">
2031          <div class="db-success-big">
2032            <h2>Ahoy ${firstName}, je aanvraag is gelukt!</h2>
2033            <p>Bedankt voor jullie aanvraag bij Domstadboot.</p>
2034            <p>Onze planner <strong>Tessa</strong> komt binnen <strong>24 uur</strong> bij jullie terug met een passende offerte.</p>
2035            <p>Heb je in de tussentijd nog vragen? Dan kun je gewoon reageren op onze mail of kijk op onze website bij de veelgestelde vragen.</p>
2036          </div>
2037        </div>
2038      `;
2039      els.form.innerHTML = successHtml;
2040    }
2041
2042    els.personen.addEventListener('change', function () {
2043      state.personen = Number(this.value);
2044      state.arrangement = '';
2045      state.duur = '';
2046      resetExtras();
2047      recalculate();
2048    });
2049
2050    els.arrangement.addEventListener('change', function () {
2051      state.arrangement = this.value;
2052      state.duur = '';
2053      resetExtras();
2054      recalculate();
2055    });
2056
2057    els.duur.addEventListener('change', function () {
2058      state.duur = this.value;
2059      recalculate();
2060    });
2061
2062    els.calcDate.addEventListener('change', function () {
2063      state.calcDate = this.value;
2064      if (state.arrangement === 'kurk' && isSaturday(this.value)) {
2065        state.arrangement = '';
2066      }
2067      recalculate();
2068    });
2069
2070    els.contactOccasion.addEventListener('change', function () {
2071      updateGroupCompositionVisibility();
2072    });
2073
2074    els.nextStep.addEventListener('click', function () {
2075      const result = calculatePrice();
2076
2077      if (!state.arrangement) {
2078        els.step1Error.textContent = 'Kies eerst een arrangement.';
2079        return;
2080      }
2081      if (!state.duur) {
2082        els.step1Error.textContent = 'Kies eerst een duur.';
2083        return;
2084      }
2085      if (state.arrangement === 'drank' && !state.extras.hapjes_keuze) {
2086        els.step1Error.textContent = 'Geef eerst aan of jullie wel of geen hapjes willen.';
2087        return;
2088      }
2089      if (state.arrangement === 'drank' && state.extras.hapjes_keuze === 'ja' && !state.extras.warme_hapjes && !state.extras.borrelplank) {
2090        els.step1Error.textContent = 'Kies bij hapjes minimaal warme hapjes of een luxe borrelplank.';
2091        return;
2092      }
2093      if (state.extras.warme_hapjes && !state.extras.warme_hapjes_type) {
2094        els.step1Error.textContent = 'Kies ook welk type warme hapjes je wilt.';
2095        return;
2096      }
2097      if (!result) {
2098        els.step1Error.textContent = 'De prijs kon nog niet worden berekend.';
2099        return;
2100      }
2101
2102      els.step1Error.textContent = '';
2103      fillHiddenFields(result);
2104
2105      let summaryHtml = '<div class="db-summary-mini">';
2106      summaryHtml += '<strong>Arrangement:</strong><span>' + result.arrangementLabel + '</span>';
2107      summaryHtml += '<strong>Aantal personen:</strong><span>' + result.personen + '</span>';
2108      summaryHtml += '<strong>Duur:</strong><span>' + String(result.effectiveDuration).replace('.', ',') + ' uur</span>';
2109      summaryHtml += '<strong>Boot:</strong><span>' + result.bootType + '</span>';
2110      summaryHtml += '<strong>Totaal indicatie:</strong><span>' + euroWhole(result.total) + '</span>';
2111      summaryHtml += '<strong>Ca. prijs per persoon:</strong><span>' + euro(result.pricePerPerson) + ' p.p.</span>';
2112      summaryHtml += '</div>';
2113
2114      const extrasReadable = buildExtrasReadable();
2115      if (extrasReadable) {
2116        summaryHtml += '<div style="margin-top:8px;font-size:13px;line-height:1.4;"><strong>Extra’s:</strong> ' + extrasReadable + '</div>';
2117      }
2118
2119      els.step2Summary.innerHTML = summaryHtml;
2120
2121      if (state.calcDate && !els.contactDate.value) {
2122        els.contactDate.value = state.calcDate;
2123      }
2124
2125      els.step1.classList.remove('active');
2126      els.step2.classList.add('active');
2127      els.progress1.classList.remove('active');
2128      els.progress2.classList.add('active');
2129    });
2130
2131    els.prevStep.addEventListener('click', function () {
2132      els.step2.classList.remove('active');
2133      els.step1.classList.add('active');
2134      els.progress2.classList.remove('active');
2135      els.progress1.classList.add('active');
2136    });
2137
2138    if (els.form.dataset.submitBound === 'yes') return;
2139    els.form.dataset.submitBound = 'yes';
2140
2141    els.form.addEventListener('submit', function (e) {
2142      e.preventDefault();
2143      e.stopPropagation();
2144
2145      if (isSubmitting || formWasSubmitted) return;
2146
2147      function getHiddenValue(id) {
2148        const el = root.querySelector('#' + id);
2149        return el ? el.value : '';
2150      }
2151
2152      if (!els.contactName.value.trim()) {
2153        els.step2Error.textContent = 'Vul je volledige naam in.';
2154        return;
2155      }
2156      if (!els.contactEmail.value.trim()) {
2157        els.step2Error.textContent = 'Vul je e-mailadres in.';
2158        return;
2159      }
2160      if (!els.contactPhone.value.trim()) {
2161        els.step2Error.textContent = 'Vul je telefoonnummer in.';
2162        return;
2163      }
2164      if (!els.contactDate.value) {
2165        els.step2Error.textContent = 'Kies een gewenste datum.';
2166        return;
2167      }
2168      if (!els.contactStarttime.value) {
2169        els.step2Error.textContent = 'Kies een gewenste starttijd.';
2170        return;
2171      }
2172      if (!els.contactOccasion.value) {
2173        els.step2Error.textContent = 'Kies een gelegenheid.';
2174        return;
2175      }
2176      if (needsGroupComposition(els.contactOccasion.value) && !els.contactGroup.value) {
2177        els.step2Error.textContent = 'Kies de samenstelling van het gezelschap.';
2178        return;
2179      }
2180      if (!els.contactTerms.checked) {
2181        els.step2Error.textContent = 'Bevestig dat je akkoord gaat met de algemene voorwaarden.';
2182        return;
2183      }
2184
2185      els.step2Error.textContent = '';
2186      els.submitStatus.innerHTML = '<div class="db-success">Aanvraag wordt verzonden...</div>';
2187      setSubmitBusy(true);
2188
2189      const payload = {
2190        volledige_naam: els.contactName.value.trim(),
2191        telefoonnummer: els.contactPhone.value.trim(),
2192        emailadres: els.contactEmail.value.trim(),
2193        bedrijfsnaam: els.contactCompany.value.trim() || 'NVT',
2194        datum: els.contactDate.value,
2195        starttijd: els.contactStarttime.value,
2196        gelegenheid: els.contactOccasion.value,
2197        samenstelling_gezelschap: els.contactGroup.value || '',
2198        opmerkingen: els.contactNotes.value.trim(),
2199
2200        arrangement: getHiddenValue('hidden_calc_arrangement'),
2201        arrangement_key: getHiddenValue('hidden_calc_arrangement_key'),
2202        personen: getHiddenValue('hidden_calc_personen'),
2203        duur: getHiddenValue('hidden_calc_duur') ? getHiddenValue('hidden_calc_duur') + ' uur' : '',
2204        effectieve_duur: getHiddenValue('hidden_calc_effective_duur') ? getHiddenValue('hidden_calc_effective_duur') + ' uur' : '',
2205        boottype: getHiddenValue('hidden_calc_boot_type'),
2206        zone: getHiddenValue('hidden_calc_zone'),
2207        zaterdag: getHiddenValue('hidden_calc_is_zaterdag'),
2208        totaalprijs: getHiddenValue('hidden_calc_prijs_totaal') ? '€' + getHiddenValue('hidden_calc_prijs_totaal') : '',
2209        prijs_per_persoon: getHiddenValue('hidden_calc_prijs_pp'),
2210        extras: buildExtrasReadable(),
2211        samenvatting: getHiddenValue('hidden_calc_samenvatting'),
2212
2213        price_lines_json: getHiddenValue('hidden_calc_price_lines_json'),
2214        calc_json: getHiddenValue('hidden_calc_json'),
2215
2216        hapjes_keuze: getHiddenValue('hidden_calc_hapjes_keuze'),
2217        warme_hapjes: getHiddenValue('hidden_calc_hapjes'),
2218        warme_hapjes_type: getHiddenValue('hidden_calc_hapjes_type'),
2219        borrelplank: getHiddenValue('hidden_calc_borrelplank'),
2220        dessert: getHiddenValue('hidden_calc_dessert'),
2221        gids: getHiddenValue('hidden_calc_gids'),
2222        bbq_halal: getHiddenValue('hidden_calc_bbq_halal')
2223      };
2224
2225      try {
2226        payload.price_lines = JSON.parse(payload.price_lines_json || '[]');
2227        payload.prijsregels = payload.price_lines;
2228      } catch (err) {
2229        payload.price_lines = [];
2230        payload.prijsregels = [];
2231      }
2232
2233      fetch('/wp-json/domstadboot/v1/aanvraag', {
2234        method: 'POST',
2235        headers: {
2236          'Content-Type': 'application/json'
2237        },
2238        body: JSON.stringify(payload)
2239      })
2240      .then(function (response) {
2241        return response.json();
2242      })
2243      .then(function (data) {
2244        if (data && data.success && data.mail_sent) {
2245          disableEntireFormAfterSuccess();
2246          showBigSuccessMessage();
2247        } else {
2248          els.submitStatus.innerHTML = '<div class="db-error">De aanvraag kon niet goed worden verzonden. Probeer het opnieuw.</div>';
2249          setSubmitBusy(false);
2250        }
2251      })
2252      .catch(function () {
2253        els.submitStatus.innerHTML = '<div class="db-error">Er ging iets mis bij het verzenden. Probeer het opnieuw.</div>';
2254        setSubmitBusy(false);
2255      });
2256    });
2257
2258    renderPersonOptions();
2259    updateGroupCompositionVisibility();
2260    recalculate();
2261  }
2262
2263  // ИЗМЕНЕНО: инициализируем ОДИН конкретный экземпляр (scoped к его root).
2264  // Скрытую копию (закрытый попап) поднимаем только когда она станет видимой.
2265  function initFlow(root) {
2266    if (!root || root.dataset.dbFlowInit === 'yes') return;
2267
2268    var popupContainer = root.closest('.dialog-widget, .elementor-popup-modal, .elementor-location-popup');
2269    var rootVisible = root.offsetParent !== null;
2270    var popupVisible = popupContainer ? popupContainer.offsetParent !== null : true;
2271
2272    if (!rootVisible || !popupVisible) return;
2273
2274    createPopupFlow(root);
2275  }
2276
2277  // ИЗМЕНЕНО: проходим ПО ВСЕМ экземплярам на странице.
2278  // querySelectorAll('#id') возвращает все элементы с этим id
2279  // (в отличие от getElementById, который брал только первый).
2280  function initAllFlows() {
2281    document.querySelectorAll('#domstadboot-popup-flow').forEach(initFlow);
2282  }
2283
2284  window.addEventListener('elementor/popup/show', function () {
2285    setTimeout(initAllFlows, 50);
2286    setTimeout(initAllFlows, 200);
2287    setTimeout(initAllFlows, 500);
2288  });
2289
2290  window.addEventListener('load', function () {
2291    setTimeout(initAllFlows, 300);
2292  });
2293
2294  // Встроенная (видимая) копия поднимается сразу, не дожидаясь события попапа.
2295  if (document.readyState === 'loading') {
2296    document.addEventListener('DOMContentLoaded', initAllFlows);
2297  } else {
2298    initAllFlows();
2299  }
2300})();
2301</script>
2301				</div>
2302				</div>
2303					</div>
2304		</div>
2305					</div>
2306		</section>
2307					</div>
2308		</div>
2309					</div>
2310		</section>
2311				<section class="elementor-section elementor-top-section elementor-element elementor-element-77a20ac5 elementor-section-full_width elementor-reverse-mobile elementor-section-content-middle elementor-section-height-default elementor-section-height-default" data-id="77a20ac5" data-element_type="section" data-e-type="section">
2312						<div class="elementor-container elementor-column-gap-no">
2313					<div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-e696a89" data-id="e696a89" data-element_type="column" data-e-type="column" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
2314			<div class="elementor-widget-wrap elementor-element-populated">
2315						<div class="elementor-element elementor-element-a136e3d elementor-widget elementor-widget-google_maps" data-id="a136e3d" data-element_type="widget" data-e-type="widget" data-widget_type="google_maps.default">
2316				<div class="elementor-widget-container">
2317							<div class="elementor-custom-embed">
2318			<iframe loading="lazy"
2319					src="https://www.google.com/maps/embed/v1/place?key=AIzaSyBtARCBXorHSKzmBSF5nlXFmwuwsxXTpf0&#038;q=Domstadboot&#038;zoom=17"
2320					title="Domstadboot"
2321					aria-label="Domstadboot"
2322			></iframe>
2323		</div>
2324						</div>
2325				</div>
2326					</div>
2327		</div>
2328				<div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-fa25c82" data-id="fa25c82" data-element_type="column" data-e-type="column">
2329			<div class="elementor-widget-wrap elementor-element-populated">
2330						<div class="elementor-element elementor-element-6cef04d3 elementor-widget elementor-widget-heading" data-id="6cef04d3" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
2331				<div class="elementor-widget-container">
2332					<h2 class="elementor-heading-title elementor-size-default">Opstaplocaties</h2>				</div>
2333				</div>
2334				<div class="elementor-element elementor-element-17d051e6 elementor-widget elementor-widget-icon-box" data-id="17d051e6" data-element_type="widget" data-e-type="widget" data-widget_type="icon-box.default">
2335				<div class="elementor-widget-container">
2336							<div class="elementor-icon-box-wrapper">
2337
2338			
2339						<div class="elementor-icon-box-content">
2340
2341									<h4 class="elementor-icon-box-title">
2342						<a href="https://www.google.com/maps/place/Domstadboot/@52.0890479,5.1186402,548m/data=!3m2!1e3!4b1!4m6!3m5!1s0x47c66f5a930394ed:0xd2b4f9cff97434a1!8m2!3d52.0890479!4d5.1212151!16s%2Fg%2F11hbh8vqg2?entry=ttu&#038;g_ep=EgoyMDI2MDQwNS4wIKXMDSoASAFQAw%3D%3D" >
2343							Adres Dinertochten &amp; zaterdagen:						</a>
2344					</h4>
2345				
2346									<p class="elementor-icon-box-description">
2347						Oudegracht 181<br>Utrecht 
2348
2349					</p>
2350				
2351			</div>
2352			
2353		</div>
2354						</div>
2355				</div>
2356				<div class="elementor-element elementor-element-14756c6 elementor-widget elementor-widget-icon-box" data-id="14756c6" data-element_type="widget" data-e-type="widget" data-widget_type="icon-box.default">
2357				<div class="elementor-widget-container">
2358							<div class="elementor-icon-box-wrapper">
2359
2360			
2361						<div class="elementor-icon-box-content">
2362
2363									<h4 class="elementor-icon-box-title">
2364						<span  >
2365							Adres borreltocht doordeweeks						</span>
2366					</h4>
2367				
2368									<p class="elementor-icon-box-description">
2369						Wittevrouwensingel 100<br>Utrecht
2370
2371					</p>
2372				
2373			</div>
2374			
2375		</div>
2376						</div>
2377				</div>
2378				<div class="elementor-element elementor-element-bb2d86d elementor-widget elementor-widget-heading" data-id="bb2d86d" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
2379				<div class="elementor-widget-container">
2380					<h6 class="elementor-heading-title elementor-size-default">Let op: de definieve opstaplocatie kan afwijken, controleer altijd uw bevestigingsmail!</h6>				</div>
2381				</div>
2382					</div>
2383		</div>
2384					</div>
2385		</section>
2386				<section class="elementor-section elementor-top-section elementor-element elementor-element-ced791c elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="ced791c" data-element_type="section" data-e-type="section">
2387						<div class="elementor-container elementor-column-gap-default">
2388					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-286cee6" data-id="286cee6" data-element_type="column" data-e-type="column">
2389			<div class="elementor-widget-wrap">
2390							</div>
2391		</div>
2392					</div>
2393		</section>
2394				</div>
2395				<div class="post-tags">
2396					</div>
2397			</div>
2398
2399	
2400</main>
2401
2402			<footer data-elementor-type="footer" data-elementor-id="4639" class="elementor elementor-4639 elementor-location-footer" data-elementor-post-type="elementor_library">
2403					<section class="elementor-section elementor-top-section elementor-element elementor-element-33bc82bf elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="33bc82bf" data-element_type="section" data-e-type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
2404						<div class="elementor-container elementor-column-gap-default">
2405					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7c27de73" data-id="7c27de73" data-element_type="column" data-e-type="column">
2406			<div class="elementor-widget-wrap elementor-element-populated">
2407						<div class="elementor-element elementor-element-2330cd46 elementor-widget elementor-widget-heading" data-id="2330cd46" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
2408				<div class="elementor-widget-container">
2409					<h3 class="elementor-heading-title elementor-size-default">Vragen? Mail ons 24/7 op <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cfa6a1a9a08faba0a2bcbbaeabada0a0bbe1a1a3">[email&#160;protected]</a></h3>
2409				</div>
2410				</div>
2411					</div>
2412		</div>
2413					</div>
2414		</section>
2415				<footer class="elementor-section elementor-top-section elementor-element elementor-element-4a3dab34 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="4a3dab34" data-element_type="section" data-e-type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
2416						<div class="elementor-container elementor-column-gap-no">
2417					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f6a593c" data-id="f6a593c" data-element_type="column" data-e-type="column">
2418			<div class="elementor-widget-wrap elementor-element-populated">
2419						<section class="elementor-section elementor-inner-section elementor-element elementor-element-7c74703 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7c74703" data-element_type="section" data-e-type="section">
2420						<div class="elementor-container elementor-column-gap-default">
2421					<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-d7cd664" data-id="d7cd664" data-element_type="column" data-e-type="column">
2422			<div class="elementor-widget-wrap elementor-element-populated">
2423						<div class="elementor-element elementor-element-522418c elementor-widget elementor-widget-heading" data-id="522418c" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
2424				<div class="elementor-widget-container">
2425					<div class="elementor-heading-title elementor-size-default">Uitgelicht</div>				</div>
2426				</div>
2427				<div class="elementor-element elementor-element-3e1e018 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="3e1e018" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default">
2428				<div class="elementor-widget-container">
2429							<ul class="elementor-icon-list-items">
2430							<li class="elementor-icon-list-item">
2431											<a href="https://domstadboot.nl/">
2432
2433											<span class="elementor-icon-list-text">Home</span>
2434											</a>
2435									</li>
2436								<li class="elementor-icon-list-item">
2437											<a href="https://domstadboot.nl/werken-bij-domstadboot/">
2438
2439											<span class="elementor-icon-list-text">Werken bij Domstadboot</span>
2440											</a>
2441									</li>
2442								<li class="elementor-icon-list-item">
2443											<a href="https://domstadboot.nl/domstadboot-boot-huren-utrecht/">
2444
2445											<span class="elementor-icon-list-text">Boot huren Utrecht</span>
2446											</a>
2447									</li>
2448								<li class="elementor-icon-list-item">
2449											<a href="https://domstadboot.nl/boottocht-utrecht/">
2450
2451											<span class="elementor-icon-list-text">Boottocht Utrecht</span>
2452											</a>
2453									</li>
2454								<li class="elementor-icon-list-item">
2455											<a href="https://domstadboot.nl/sloep-huren-utrecht/">
2456
2457											<span class="elementor-icon-list-text">Sloep huren Utrecht</span>
2458											</a>
2459									</li>
2460								<li class="elementor-icon-list-item">
2461											<a href="https://domstadboot.nl/blog/">
2462
2463											<span class="elementor-icon-list-text">Blog</span>
2464											</a>
2465									</li>
2466								<li class="elementor-icon-list-item">
2467											<a href="https://domstadboot.nl/veelgestelde-vragen/">
2468
2469											<span class="elementor-icon-list-text">Veelgestelde vragen</span>
2470											</a>
2471									</li>
2472						</ul>
2473						</div>
2474				</div>
2475					</div>
2476		</div>
2477				<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-d60a2a6" data-id="d60a2a6" data-element_type="column" data-e-type="column">
2478			<div class="elementor-widget-wrap elementor-element-populated">
2479						<div class="elementor-element elementor-element-3fedce1 elementor-widget elementor-widget-heading" data-id="3fedce1" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
2480				<div class="elementor-widget-container">
2481					<div class="elementor-heading-title elementor-size-default">Arrangementen</div>
2481				</div>
2482				</div>
2483				<div class="elementor-element elementor-element-5c3022d elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="5c3022d" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default">
2484				<div class="elementor-widget-container">
2485							<ul class="elementor-icon-list-items">
2486							<li class="elementor-icon-list-item">
2487											<a href="https://domstadboot.nl/borrelboot-utrecht/">
2488
2489											<span class="elementor-icon-list-text">Varen &amp; Borrelen</span>
2490											</a>
2491									</li>
2492								<li class="elementor-icon-list-item">
2493											<a href="https://domstadboot.nl/picknicken-op-de-boot-utrecht/">
2494
2495											<span class="elementor-icon-list-text">Varen &amp; Lunchen</span>
2496											</a>
2497									</li>
2498								<li class="elementor-icon-list-item">
2499											<a href="https://domstadboot.nl/rondvaart-utrecht-met-high-tea/">
2500
2501											<span class="elementor-icon-list-text">Varen &amp; High-tea</span>
2502											</a>
2503									</li>
2504								<li class="elementor-icon-list-item">
2505											<a href="https://domstadboot.nl/tapas-arrangement-utrecht">
2506
2507											<span class="elementor-icon-list-text">Varen &amp; Tapas Diner</span>
2508											</a>
2509									</li>
2510								<li class="elementor-icon-list-item">
2511											<a href="https://domstadboot.nl/bbq-boot-utrecht/">
2512
2513											<span class="elementor-icon-list-text">Varen &amp; BBQ Diner</span>
2514											</a>
2515									</li>
2516								<li class="elementor-icon-list-item">
2517											<a href="https://domstadboot.nl/pizza-boot-utrecht/">
2518
2519											<span class="elementor-icon-list-text">Varen &amp; Pizza Diner</span>
2520											</a>
2521									</li>
2522								<li class="elementor-icon-list-item">
2523											<a href="https://domstadboot.nl/wijnproeverij/">
2524
2525											<span class="elementor-icon-list-text">Varen &amp; Wijnproeverij</span>
2526											</a>
2527									</li>
2528						</ul>
2529						</div>
2530				</div>
2531					</div>
2532		</div>
2533				<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-72f71fe" data-id="72f71fe" data-element_type="column" data-e-type="column">
2534			<div class="elementor-widget-wrap elementor-element-populated">
2535						<div class="elementor-element elementor-element-1069503 elementor-widget elementor-widget-heading" data-id="1069503" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
2536				<div class="elementor-widget-container">
2537					<div class="elementor-heading-title elementor-size-default">Speciale tochten</div>				</div>
2538				</div>
2539				<div class="elementor-element elementor-element-254e546 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="254e546" data-element_type="widget" data-e-type="widget" data-widget_type="icon-list.default">
2540				<div class="elementor-widget-container">
2541							<ul class="elementor-icon-list-items">
2542							<li class="elementor-icon-list-item">
2543											<a href="https://domstadboot.nl/bruiloft-boot-utrecht/">
2544
2545											<span class="elementor-icon-list-text">Varen op je Bruiloft</span>
2546											</a>
2547									</li>
2548								<li class="elementor-icon-list-item">
2549										<span class="elementor-icon-list-text">Babyshower &amp; Gender reveal</span>
2550									</li>
2551								<li class="elementor-icon-list-item">
2552											<a href="https://domstadboot.nl/een-boot-huren-in-utrecht-het-perfecte-bedrijfsuitje/">
2553
2554											<span class="elementor-icon-list-text">Bedrijfsuitje</span>
2555											</a>
2556									</li>
2557								<li class="elementor-icon-list-item">
2558											<a href="https://domstadboot.nl/uitvaart-boot-utrecht/">
2559
2560											<span class="elementor-icon-list-text">Uitvaart</span>
2561											</a>
2562									</li>
2563								<li class="elementor-icon-list-item">
2564											<a href="https://domstadboot.nl/vaarroutes-utrecht/">
2565
2566											<span class="elementor-icon-list-text">Vaarroutes</span>
2567											</a>
2568									</li>
2569								<li class="elementor-icon-list-item">
2570											<span class="elementor-icon-list-icon">
2571							<i aria-hidden="true" class="fas fa-location-arrow"></i>						</span>
2572										<span class="elementor-icon-list-text">1,5 uur stadsgracht &amp; oostsingels</span>
2573									</li>
2574								<li class="elementor-icon-list-item">
2575											<span class="elementor-icon-list-icon">
2576							<i aria-hidden="true" class="fas fa-location-arrow"></i>						</span>
2577										<span class="elementor-icon-list-text">2 uur stadsgracht &amp; alle singels</span>
2578									</li>
2579								<li class="elementor-icon-list-item">
2580											<span class="elementor-icon-list-icon">
2581							<i aria-hidden="true" class="fas fa-location-arrow"></i>						</span>
2582										<span class="elementor-icon-list-text">3 uur Kromme Rijn</span>
2583									</li>
2584						</ul>
2585						</div>
2586				</div>
2587					</div>
2588		</div>
2589					</div>
2590		</section>
2591				<div class="elementor-element elementor-element-6155c6be elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="6155c6be" data-element_type="widget" data-e-type="widget" data-widget_type="divider.default">
2592				<div class="elementor-widget-container">
2593							<div class="elementor-divider">
2594			<span class="elementor-divider-separator">
2595						</span>
2596		</div>
2597						</div>
2598				</div>
2599				<section class="elementor-section elementor-inner-section elementor-element elementor-element-14d635d1 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="14d635d1" data-element_type="section" data-e-type="section">
2600						<div class="elementor-container elementor-column-gap-default">
2601					<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-54e63cb" data-id="54e63cb" data-element_type="column" data-e-type="column">
2602			<div class="elementor-widget-wrap elementor-element-populated">
2603						<div class="elementor-element elementor-element-3c8893aa elementor-widget elementor-widget-heading" data-id="3c8893aa" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
2604				<div class="elementor-widget-container">
2605					<p class="elementor-heading-title elementor-size-default">© 2026 All rights reserved | <a href="/sitemap">Sitemap</a></p>				</div>
2606				</div>
2607				<div class="elementor-element elementor-element-eade103 elementor-widget elementor-widget-html" data-id="eade103" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
2608				<div class="elementor-widget-container">
vendor: 114 bytes, lines 2608-2609
2608
2609					<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
2609<script>
2610(function(open) {
2611  XMLHttpRequest.prototype.open = function(method, url) {
2612    this.addEventListener('load', function() {
2613      if (url.includes('admin-ajax.php') && this.responseURL.includes('admin-ajax.php') && this.status === 200) {
2614        window.dataLayer = window.dataLayer || [];
2615        window.dataLayer.push({
2616          'event': 'elementorFormSubmitXHR',
2617          'ajaxResponse': this.responseText
2618        });
2619        console.log('🔥 Elementor AJAX form submission detected!');
2620      }
2621    });
2622    open.apply(this, arguments);
2623  };
2624})(XMLHttpRequest.prototype.open);
2625</script>
2625
2626				</div>
2627				</div>
2628					</div>
2629		</div>
2630				<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-7a49fc3" data-id="7a49fc3" data-element_type="column" data-e-type="column">
2631			<div class="elementor-widget-wrap elementor-element-populated">
2632						<div class="elementor-element elementor-element-6b91ff3 elementor-widget elementor-widget-text-editor" data-id="6b91ff3" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
2633				<div class="elementor-widget-container">
2634									<p>Op al onze overeenkomsten zijn onze <a href="https://b3ztx5.myrdbx.io/algemene-voorwaarden">algemene voorwaarden</a> van toepassing. Lees hier ons <a title="Domstadboot – Privacybeleid" href="https://domstadboot.nl/domstadboot-privacybeleid/">privacybeleid</a>.</p><p>U gaat ook akkoord met onze <a href="https://domstadboot.nl/gedragsregels">gedragsregels</a>.</p>								</div>
2635				</div>
2636					</div>
2637		</div>
2638					</div>
2639		</section>
2640					</div>
2641		</div>
2642					</div>
2643		</footer>
2644				</footer>
2645		
2646<script type="speculationrules">
2647{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/hello-elementor/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
2648</script>
2648
2649<?php if ( function_exists( 'gtm4wp_the_gtm_tag' ) ) { gtm4wp_the_gtm_tag(); } ?>
2650<!-- GTM Container placement set to footer -->
2651<!-- Google Tag Manager (noscript) -->
2652				<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5WT74M2" height="0" width="0" style="display:none;visibility:hidden" aria-hidden="true"></iframe></noscript>
2653<!-- End Google Tag Manager (noscript) -->		<div data-elementor-type="popup" data-elementor-id="6818" class="elementor elementor-6818 elementor-location-popup" data-elementor-settings="{&quot;entrance_animation&quot;:&quot;fadeIn&quot;,&quot;entrance_animation_duration&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:1,&quot;sizes&quot;:[]},&quot;open_selector&quot;:&quot;a[href=\&quot;#pricecalculatorpopup\&quot;]&quot;,&quot;a11y_navigation&quot;:&quot;yes&quot;,&quot;timing&quot;:[]}" data-elementor-post-type="elementor_library">
2654					<section class="elementor-section elementor-top-section elementor-element elementor-element-b5d04a6 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="b5d04a6" data-element_type="section" data-e-type="section">
2655						<div class="elementor-container elementor-column-gap-default">
2656					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0231d90" data-id="0231d90" data-element_type="column" data-e-type="column">
2657			<div class="elementor-widget-wrap elementor-element-populated">
2658						<div class="elementor-element elementor-element-a15bc48 elementor-widget__width-inherit elementor-widget elementor-widget-html" data-id="a15bc48" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
2659				<div class="elementor-widget-container">
2660					<div id="domstadboot-popup-flow" style="max-width:1180px;margin:0 auto;padding:12px 16px;background:#fff;border-radius:10px;font-family:Montserrat,sans-serif;color:#1f2937;">
2661  <style>
2662    #domstadboot-popup-flow * { box-sizing: border-box; }
2663
2664    #domstadboot-popup-flow h2,
2665    #domstadboot-popup-flow h3 {
2666      font-family: Merriweather, serif;
2667      color: #003366;
2668      margin: 0 0 6px;
2669      line-height: 1.15;
2670    }
2671
2672    #domstadboot-popup-flow .db-header {
2673      display: flex;
2674      align-items: flex-start;
2675      justify-content: space-between;
2676      gap: 20px;
2677      margin-bottom: 8px;
2678    }
2679
2680    #domstadboot-popup-flow .db-logo-wrap {
2681      display: flex;
2682      align-items: flex-start;
2683      gap: 14px;
2684      padding-right: 8px;
2685      flex-shrink: 0;
2686    }
2687
2688    #domstadboot-popup-flow .db-logo {
2689      height: 68px;
2690      width: auto;
2691      opacity: .96;
2692      flex-shrink: 0;
2693      margin-top: 2px;
2694    }
2695
2696    #domstadboot-popup-flow .db-step { display: none; }
2697    #domstadboot-popup-flow .db-step.active { display: block; }
2698
2699    #domstadboot-popup-flow .db-grid {
2700      display: grid;
2701      grid-template-columns: 1fr 1fr;
2702      gap: 10px 14px;
2703    }
2704
2705    #domstadboot-popup-flow .db-grid-single {
2706      display: grid;
2707      grid-template-columns: 1fr;
2708      gap: 10px;
2709    }
2710
2711    #domstadboot-popup-flow .db-step1-layout {
2712      display: grid;
2713      grid-template-columns: 1.02fr 0.98fr;
2714      gap: 14px;
2715      align-items: start;
2716      margin-top: 10px;
2717    }
2718
2719    #domstadboot-popup-flow .db-field label {
2720      display: block;
2721      font-weight: 600;
2722      margin-bottom: 4px;
2723      color: #1f2937;
2724      font-size: 13px;
2725      line-height: 1.25;
2726    }
2727
2728    #domstadboot-popup-flow input[type="text"],
2729    #domstadboot-popup-flow input[type="email"],
2730    #domstadboot-popup-flow input[type="tel"],
2731    #domstadboot-popup-flow input[type="date"],
2732    #domstadboot-popup-flow select,
2733    #domstadboot-popup-flow textarea {
2734      width: 100%;
2735      padding: 9px 10px;
2736      border: 1px solid #cfd8e3;
2737      border-radius: 8px;
2738      font-size: 14px;
2739      background: #fff;
2740      line-height: 1.25;
2741    }
2742
2743    #domstadboot-popup-flow textarea {
2744      min-height: 88px;
2745      resize: vertical;
2746    }
2747
2748    #domstadboot-popup-flow select:disabled,
2749    #domstadboot-popup-flow input:disabled,
2750    #domstadboot-popup-flow textarea:disabled {
2751      background: #f3f4f6;
2752      color: #6b7280;
2753      cursor: not-allowed;
2754    }
2755
2756    #domstadboot-popup-flow option:disabled { color: #9ca3af; }
2757
2758    #domstadboot-popup-flow .db-card {
2759      background: #f8fbff;
2760      border: 1px solid #d9e9f7;
2761      border-radius: 10px;
2762      padding: 11px 12px;
2763    }
2764
2765    #domstadboot-popup-flow .db-progress {
2766      display: flex;
2767      gap: 8px;
2768      margin-bottom: 8px;
2769    }
2770
2771    #domstadboot-popup-flow .db-progress-item {
2772      flex: 1;
2773      padding: 8px 10px;
2774      border-radius: 999px;
2775      background: #eef3f8;
2776      color: #5c7085;
2777      font-weight: 600;
2778      text-align: center;
2779      font-size: 12px;
2780      line-height: 1.2;
2781    }
2782
2783    #domstadboot-popup-flow .db-progress-item.active {
2784      background: #003366;
2785      color: #fff;
2786    }
2787
2788    #domstadboot-popup-flow .db-result {
2789      background: #f6f6f6;
2790      border-radius: 10px;
2791      padding: 12px 14px;
2792      margin-top: 0;
2793    }
2794
2795    #domstadboot-popup-flow .db-price-line {
2796      display: flex;
2797      justify-content: space-between;
2798      gap: 12px;
2799      padding: 4px 0;
2800      border-bottom: 1px solid #e5e7eb;
2801      font-size: 13px;
2802      line-height: 1.3;
2803    }
2804
2805    #domstadboot-popup-flow .db-price-line:last-child { border-bottom: 0; }
2806
2807    #domstadboot-popup-flow .db-price-line .db-price-label small {
2808      display: block;
2809      color: #667085;
2810      font-size: 11px;
2811      line-height: 1.3;
2812      margin-top: 1px;
2813    }
2814
2815    #domstadboot-popup-flow .db-total {
2816      font-size: 19px;
2817      font-weight: 700;
2818      color: #003366;
2819      margin-top: 8px;
2820      line-height: 1.15;
2821    }
2822
2823    #domstadboot-popup-flow .db-pp {
2824      font-size: 14px;
2825      margin-top: 3px;
2826      line-height: 1.25;
2827    }
2828
2829    #domstadboot-popup-flow .db-buttons {
2830      display: flex;
2831      gap: 10px;
2832      margin-top: 12px;
2833      flex-wrap: wrap;
2834    }
2835
2836    #domstadboot-popup-flow .db-buttons-step1 {
2837      justify-content: flex-start;
2838      padding-top: 2px;
2839    }
2840
2841    #domstadboot-popup-flow .db-btn {
2842      appearance: none;
2843      border: 0;
2844      border-radius: 8px;
2845      padding: 12px 18px;
2846      font-size: 14px;
2847      font-weight: 700;
2848      cursor: pointer;
2849      min-width: 170px;
2850      line-height: 1.2;
2851    }
2852
2853    #domstadboot-popup-flow .db-btn-primary {
2854      background: #003366;
2855      color: #fff;
2856    }
2857
2858    #domstadboot-popup-flow .db-btn-secondary {
2859      background: #eef3f8;
2860      color: #003366;
2861    }
2862
2863    #domstadboot-popup-flow .db-btn[disabled] {
2864      opacity: .6;
2865      cursor: not-allowed;
2866    }
2867
2868    #domstadboot-popup-flow .db-note {
2869      font-size: 11px;
2870      color: #5b6775;
2871      margin-top: 4px;
2872      line-height: 1.3;
2873    }
2874
2875    #domstadboot-popup-flow .db-inline-note {
2876      font-size: 11px;
2877      color: #667085;
2878      margin-top: 4px;
2879      line-height: 1.3;
2880    }
2881
2882    #domstadboot-popup-flow .db-message-box {
2883      background: #f8fbff;
2884      border: 1px solid #d9e9f7;
2885      border-radius: 8px;
2886      padding: 8px 10px;
2887      margin-top: 8px;
2888    }
2889
2890    #domstadboot-popup-flow .db-message-box div {
2891      font-size: 11px;
2892      color: #244b6b;
2893      margin-bottom: 4px;
2894      line-height: 1.3;
2895    }
2896
2897    #domstadboot-popup-flow .db-message-box div:last-child { margin-bottom: 0; }
2898
2899    #domstadboot-popup-flow .db-arrangement-note {
2900      background: #fff7ed;
2901      border: 1px solid #fed7aa;
2902      color: #9a3412;
2903      border-radius: 8px;
2904      padding: 8px 10px;
2905      font-size: 12px;
2906      line-height: 1.35;
2907      margin-top: 6px;
2908    }
2909
2910    #domstadboot-popup-flow .db-error {
2911      color: #b42318;
2912      font-size: 12px;
2913      margin-top: 8px;
2914      line-height: 1.3;
2915    }
2916
2917    #domstadboot-popup-flow .db-success {
2918      background: #ecfdf3;
2919      border: 1px solid #abefc6;
2920      color: #067647;
2921      border-radius: 8px;
2922      padding: 12px 14px;
2923      font-size: 13px;
2924      margin-top: 12px;
2925      line-height: 1.35;
2926    }
2927
2928    #domstadboot-popup-flow .db-success-big-wrap {
2929      display: flex;
2930      align-items: center;
2931      justify-content: center;
2932      min-height: 420px;
2933      padding: 20px;
2934    }
2935
2936    #domstadboot-popup-flow .db-success-big {
2937      max-width: 760px;
2938      width: 100%;
2939      background: linear-gradient(180deg, #f8fbff 0%, #ffffff 100%);
2940      border: 1px solid #d9e9f7;
2941      border-radius: 20px;
2942      padding: 34px 28px;
2943      text-align: center;
2944      box-shadow: 0 10px 30px rgba(0, 51, 102, .08);
2945    }
2946
2947    #domstadboot-popup-flow .db-success-big h2 {
2948      font-size: 40px;
2949      margin-bottom: 12px;
2950      color: #003366;
2951    }
2952
2953    #domstadboot-popup-flow .db-success-big p {
2954      margin: 10px 0;
2955      font-size: 18px;
2956      line-height: 1.6;
2957      color: #1f2937;
2958    }
2959
2960    #domstadboot-popup-flow .db-checkbox {
2961      display: block;
2962      margin-bottom: 6px;
2963      line-height: 1.35;
2964      cursor: pointer;
2965      font-size: 13px;
2966    }
2967
2968    #domstadboot-popup-flow .db-checkbox input {
2969      margin-right: 8px;
2970      transform: translateY(1px);
2971    }
2972
2973    #domstadboot-popup-flow .db-required {
2974      color: #b42318;
2975      margin-left: 4px;
2976    }
2977
2978    #domstadboot-popup-flow .db-terms-link {
2979      color: #003366;
2980      text-decoration: underline;
2981    }
2982
2983    #domstadboot-popup-flow .db-hidden { display: none !important; }
2984
2985    #domstadboot-popup-flow .db-step1-title,
2986    #domstadboot-popup-flow .db-step2-title {
2987      font-size: 24px;
2988      margin-bottom: 4px;
2989    }
2990
2991    #domstadboot-popup-flow .db-extras-grid {
2992      display: grid;
2993      grid-template-columns: 1fr 1fr;
2994      gap: 4px 16px;
2995    }
2996
2997    #domstadboot-popup-flow .db-extras-grid-single {
2998      display: grid;
2999      grid-template-columns: 1fr;
3000      gap: 4px;
3001    }
3002
3003    #domstadboot-popup-flow .db-hapjes-wrap {
3004      margin-top: 8px;
3005      max-width: 420px;
3006    }
3007
3008    #domstadboot-popup-flow .db-summary-mini {
3009      display: grid;
3010      grid-template-columns: auto 1fr;
3011      gap: 2px 8px;
3012      font-size: 13px;
3013      line-height: 1.35;
3014    }
3015
3016    #domstadboot-popup-flow .db-summary-mini strong { color: #1f2937; }
3017
3018    @media (max-width: 980px) {
3019      #domstadboot-popup-flow .db-step1-layout { grid-template-columns: 1fr; }
3020      #domstadboot-popup-flow .db-grid { grid-template-columns: 1fr; }
3021    }
3022
3023    @media (max-width: 767px) {
3024      #domstadboot-popup-flow { padding: 14px 14px; }
3025      #domstadboot-popup-flow .db-buttons { flex-direction: column; }
3026      #domstadboot-popup-flow .db-btn { width: 100%; }
3027      #domstadboot-popup-flow .db-header {
3028        align-items: flex-start;
3029        flex-direction: column;
3030      }
3031      #domstadboot-popup-flow .db-logo { height: 54px; }
3032      #domstadboot-popup-flow .db-extras-grid,
3033      #domstadboot-popup-flow .db-extras-grid-single { grid-template-columns: 1fr; }
3034      #domstadboot-popup-flow .db-hapjes-wrap { max-width: 100%; }
3035      #domstadboot-popup-flow .db-success-big h2 { font-size: 30px; }
3036      #domstadboot-popup-flow .db-success-big p { font-size: 16px; }
3037    }
3038  </style>
3039
3040  <div class="db-header">
3041    <div style="flex:1;">
3042      <div class="db-progress">
3043        <div id="db-progress-1" class="db-progress-item active">1. Wensen &amp; prijs</div>
3044        <div id="db-progress-2" class="db-progress-item">2. Gegevens &amp; verzenden</div>
3045      </div>
3046    </div>
3047    <div class="db-logo-wrap">
3048      <img class="db-logo" src="https://domstadboot.nl/wp-content/uploads/2022/06/Domstadboot_logo_14.png" alt="Domstadboot logo">
3049    </div>
3050  </div>
3051
3052  <form id="db-popup-form" novalidate>
3053    <div id="db-step-1" class="db-step active">
3054      <h2 class="db-step1-title">Vul hier jullie wensen in</h2>
3055      <div class="db-note">Kies jullie wensen en bekijk direct de prijsindicatie.</div>
3056
3057      <div class="db-step1-layout">
3058        <div>
3059          <div class="db-grid">
3060            <div class="db-field">
3061              <label for="calc_personen">Aantal personen</label>
3062              <select id="calc_personen" name="calc_personen"></select>
3063            </div>
3064
3065            <div class="db-field">
3066              <label for="calc_arrangement">Arrangement</label>
3067              <select id="calc_arrangement" name="calc_arrangement">
3068                <option value="">Kies een arrangement</option>
3069              </select>
3070              <div id="calc_arrangement_note"></div>
3071            </div>
3072
3073            <div class="db-field">
3074              <label for="calc_duur">Duur</label>
3075              <select id="calc_duur" name="calc_duur">
3076                <option value="">Kies eerst een arrangement</option>
3077              </select>
3078            </div>
3079
3080            <div class="db-field">
3081              <label for="calc_date_for_price">Datum van de tocht</label>
3082              <input type="date" id="calc_date_for_price" name="calc_date_for_price">
3083              <div class="db-inline-note">Op zaterdag geldt een toeslag van €5 p.p. op elk arrangement.</div>
3084            </div>
3085          </div>
3086
3087          <div id="calc_extras" style="margin-top:10px;"></div>
3088
3089          <div class="db-buttons db-buttons-step1">
3090            <button type="button" id="db-next-step" class="db-btn db-btn-primary">Volgende</button>
3091          </div>
3092        </div>
3093
3094        <div>
3095          <div id="calc_result"></div>
3096          <div id="calc_messages"></div>
3097        </div>
3098      </div>
3099
3100      <div id="db-step-1-error" class="db-error"></div>
3101    </div>
3102
3103    <div id="db-step-2" class="db-step">
3104      <h2 class="db-step2-title">Vul jullie gegevens in</h2>
3105      <div class="db-note">Jullie keuzes en prijsindicatie nemen we direct mee in de aanvraag.</div>
3106
3107      <div class="db-card" style="margin-top:12px;">
3108        <h3 style="font-size:17px;">Samenvatting aanvraag</h3>
3109        <div id="db-step-2-summary" style="font-size:13px;line-height:1.45;"></div>
3110      </div>
3111
3112      <div class="db-grid" style="margin-top:12px;">
3113        <div class="db-field">
3114          <label for="contact_name">Volledige naam<span class="db-required">*</span></label>
3115          <input type="text" id="contact_name" name="contact_name" required>
3116        </div>
3117
3118        <div class="db-field">
3119          <label for="contact_email">E-mailadres<span class="db-required">*</span></label>
3120          <input type="email" id="contact_email" name="contact_email" required>
3121        </div>
3122
3123        <div class="db-field">
3124          <label for="contact_phone">Telefoonnummer<span class="db-required">*</span></label>
3125          <input type="tel" id="contact_phone" name="contact_phone" required>
3126        </div>
3127
3128        <div class="db-field">
3129          <label for="contact_company">Bedrijfsnaam</label>
3130          <input type="text" id="contact_company" name="contact_company">
3131        </div>
3132
3133        <div class="db-field">
3134          <label for="contact_date">Gewenste datum<span class="db-required">*</span></label>
3135          <input type="date" id="contact_date" name="contact_date" required>
3136        </div>
3137
3138        <div class="db-field">
3139          <label for="contact_starttime">Gewenste starttijd<span class="db-required">*</span></label>
3140          <select id="contact_starttime" name="contact_starttime" required>
3141            <option value="">Kies een starttijd</option>
3142          </select>
3143        </div>
3144
3145        <div class="db-field">
3146          <label for="contact_occasion">Gelegenheid / soort uitje<span class="db-required">*</span></label>
3147          <select id="contact_occasion" name="contact_occasion" required>
3148            <option value="">Kies een gelegenheid</option>
3149            <option value="Bedrijfsuitje">Bedrijfsuitje</option>
3150            <option value="Vriendenuitje">Vriendenuitje</option>
3151            <option value="Familieuitje">Familieuitje</option>
3152            <option value="Bruiloft">Bruiloft</option>
3153            <option value="Evenement">Evenement</option>
3154            <option value="Vrijgezellenfeest">Vrijgezellenfeest</option>
3155            <option value="Anders">Anders</option>
3156          </select>
3157        </div>
3158
3159        <div class="db-field db-hidden" id="contact_group_wrap">
3160          <label for="contact_group">Samenstelling gezelschap<span class="db-required">*</span></label>
3161          <select id="contact_group" name="contact_group">
3162            <option value="">Kies een samenstelling</option>
3163            <option value="Alleen mannen">Alleen mannen</option>
3164            <option value="Alleen vrouwen">Alleen vrouwen</option>
3165            <option value="Gemengd">Gemengd</option>
3166          </select>
3167        </div>
3168      </div>
3169
3170      <div class="db-grid-single" style="margin-top:10px;">
3171        <div class="db-field">
3172          <label for="contact_notes">Opmerkingen, wensen of dieetwensen</label>
3173          <textarea id="contact_notes" name="contact_notes" placeholder="Zijn er nog bijzonderheden, wensen of dieetwensen waar we rekening mee kunnen houden?"></textarea>
3174        </div>
3175
3176        <div class="db-field">
3177          <label class="db-checkbox">
3178            <input type="checkbox" id="contact_terms" name="contact_terms" required>
3179            Ik ga akkoord met de <a class="db-terms-link" href="https://domstadboot.nl/algemene-voorwaarden/" target="_blank" rel="noopener">algemene voorwaarden</a><span class="db-required">*</span>
3180          </label>
3181        </div>
3182      </div>
3183
3184      <input type="hidden" id="hidden_calc_zone" name="hidden_calc_zone">
3185      <input type="hidden" id="hidden_calc_boot_type" name="hidden_calc_boot_type">
3186      <input type="hidden" id="hidden_calc_arrangement" name="hidden_calc_arrangement">
3187      <input type="hidden" id="hidden_calc_arrangement_key" name="hidden_calc_arrangement_key">
3188      <input type="hidden" id="hidden_calc_personen" name="hidden_calc_personen">
3189      <input type="hidden" id="hidden_calc_duur" name="hidden_calc_duur">
3190      <input type="hidden" id="hidden_calc_effectieve_duur" name="hidden_calc_effectieve_duur">
3191      <input type="hidden" id="hidden_calc_prijs_totaal" name="hidden_calc_prijs_totaal">
3192      <input type="hidden" id="hidden_calc_prijs_pp" name="hidden_calc_prijs_pp">
3193      <input type="hidden" id="hidden_calc_samenvatting" name="hidden_calc_samenvatting">
3194      <input type="hidden" id="hidden_calc_json" name="hidden_calc_json">
3195      <input type="hidden" id="hidden_calc_price_lines_json" name="hidden_calc_price_lines_json">
3196      <input type="hidden" id="hidden_calc_hapjes" name="hidden_calc_hapjes">
3197      <input type="hidden" id="hidden_calc_hapjes_type" name="hidden_calc_hapjes_type">
3198      <input type="hidden" id="hidden_calc_borrelplank" name="hidden_calc_borrelplank">
3199      <input type="hidden" id="hidden_calc_dessert" name="hidden_calc_dessert">
3200      <input type="hidden" id="hidden_calc_gids" name="hidden_calc_gids">
3201      <input type="hidden" id="hidden_calc_is_zaterdag" name="hidden_calc_is_zaterdag">
3202      <input type="hidden" id="hidden_calc_hapjes_keuze" name="hidden_calc_hapjes_keuze">
3203      <input type="hidden" id="hidden_calc_bbq_halal" name="hidden_calc_bbq_halal">
3204
3205      <div id="db-step-2-error" class="db-error"></div>
3206      <div id="db-submit-status"></div>
3207
3208      <div class="db-buttons">
3209        <button type="button" id="db-prev-step" class="db-btn db-btn-secondary">Terug</button>
3210        <button type="submit" id="db-submit" class="db-btn db-btn-primary">Aanvraag verzenden</button>
3211      </div>
3212    </div>
3213  </form>
3214</div>
3215
3216<script>
3217(function () {
3218  // ГЛАВНОЕ ИЗМЕНЕНИЕ 1: никакого общего флага и никакого getElementById.
3219  // Каждая копия формы на странице инициализируется независимо.
3220
3221  function createQuarterHourOptions(selectEl) {
3222    if (!selectEl || selectEl.dataset.filled === 'yes') return;
3223
3224    let html = '<option value="">Kies een starttijd</option>';
3225
3226    for (let h = 8; h <= 23; h++) {
3227      for (let m = 0; m < 60; m += 15) {
3228        const hh = String(h).padStart(2, '0');
3229        const mm = String(m).padStart(2, '0');
3230        html += '<option value="' + hh + ':' + mm + '">' + hh + ':' + mm + '</option>';
3231      }
3232    }
3233
3234    selectEl.innerHTML = html;
3235    selectEl.dataset.filled = 'yes';
3236  }
3237
3238  // ГЛАВНОЕ ИЗМЕНЕНИЕ 2: root приходит аргументом; флаг инициализации
3239  // хранится на самом элементе, а не в общей переменной модуля.
3240  function createPopupFlow(root) {
3241    if (!root) return;
3242    if (root.dataset.dbFlowInit === 'yes') return;
3243    root.dataset.dbFlowInit = 'yes';
3244
3245    const CONFIG = {
3246      zones: {
3247        A: { min: 6, max: 12, boot: 'Barbara' },
3248        B: { min: 13, max: 35, boot: 'Domstadboot' },
3249        C: { min: 36, max: 48, boot: 'Twee boten' }
3250      },
3251      vaartarief: { A: 200, B: 300, C: 500 },
3252      extraVaarHalfuur: { A: 50, B: 75, C: 125 },
3253      drank: { basis: 15, zaterdagBasis: 20, extraHalfuur: 5 },
3254      warmeHapjes: { piecesPerPerson: 5, pricePerPiece: 1.5 },
3255      gids: 100,
3256      gidsExtraHalfuur: 25,
3257      dessertPP: 10,
3258      lunchPP: 27.5,
3259      highteaPP: 27.5,
3260      koffieTheePP: 7.5,
3261      lunchDrankUpgradePP: 10,
3262      proseccoUpgradePP: 7.5,
3263      highTeaDrankUpgradePP: 10,
3264      wijnPP: 65,
3265      tapasPP: 65,
3266      bbqPP: 70,
3267      bbqHalalPP: 3,
3268      pizza15PP: 57.5,
3269      pizza20PP: 65,
3270      kurkPP: 5,
3271      borrelplankStaffels: [75, 100, 125, 150, 175, 200, 250, 300, 350, 400],
3272      saturdaySurchargePP: 5,
3273      minPersonsForWijn: 10,
3274      minPersonsForTapas: 10,
3275      minPersonsForBbq: 10,
3276      minPersonsForLunch: 10,
3277      billingMinimumWijn: 12,
3278      billingMinimumTapas: 12,
3279      billingMinimumBbq: 12
3280    };
3281
3282    const ARRANGEMENTS = {
3283      drank: {
3284        label: 'Drank arrangement',
3285        zones: ['A', 'B', 'C'],
3286        durations: [1.5, 2, 2.5],
3287        extras: ['hapjes_keuze', 'gids', 'warme_hapjes', 'borrelplank']
3288      },
3289      pizza: {
3290        label: 'Pizza',
3291        zones: ['A', 'B', 'C'],
3292        durations: [1.5, 2, 2.5],
3293        extras: ['dessert']
3294      },
3295      wijn: {
3296        label: 'Wijnproeverij',
3297        zones: ['A', 'B', 'C'],
3298        durations: [2, 2.5],
3299        extras: []
3300      },
3301      tapas: {
3302        label: 'Tapas Dinner',
3303        zones: ['A', 'B', 'C'],
3304        durations: [2, 2.5],
3305        extras: ['dessert']
3306      },
3307      bbq: {
3308        label: 'BBQ Dinner',
3309        zones: ['A', 'B', 'C'],
3310        durations: [2, 2.5],
3311        extras: ['dessert', 'bbq_halal']
3312      },
3313      lunch: {
3314        label: 'Lunch',
3315        zones: ['A', 'B'],
3316        durations: [1.5, 2, 2.5],
3317        extras: ['koffie_thee', 'drank_upgrade', 'borrelplank']
3318      },
3319      hightea: {
3320        label: 'High Tea',
3321        zones: ['B', 'C'],
3322        durations: [1.5, 2, 2.5],
3323        extras: ['prosecco_upgrade', 'drank_upgrade', 'borrelplank']
3324      },
3325      kurk: {
3326        label: 'Geen arrangement / kurkengeld',
3327        zones: ['A', 'B', 'C'],
3328        durations: [1.5, 2, 2.5],
3329        extras: []
3330      }
3331    };
3332
3333    const PIZZA_BARBARA_PRICES = {
3334      1.5: {
3335        6: 475,
3336        7: 500,
3337        8: 525,
3338        9: 550,
3339        10: 575
3340      },
3341      2: {
3342        6: 550,
3343        7: 575,
3344        8: 600,
3345        9: 625,
3346        10: 650
3347      }
3348    };
3349
3350    const state = {
3351      personen: 12,
3352      arrangement: '',
3353      duur: '',
3354      calcDate: '',
3355      extras: {
3356        hapjes_keuze: '',
3357        gids: false,
3358        warme_hapjes: false,
3359        warme_hapjes_type: '',
3360        borrelplank: false,
3361        dessert: false,
3362        koffie_thee: false,
3363        drank_upgrade: false,
3364        prosecco_upgrade: false,
3365        bbq_halal: false
3366      }
3367    };
3368
3369    let isSubmitting = false;
3370    let formWasSubmitted = false;
3371
3372    const els = {
3373      form: root.querySelector('#db-popup-form'),
3374      step1: root.querySelector('#db-step-1'),
3375      step2: root.querySelector('#db-step-2'),
3376      progress1: root.querySelector('#db-progress-1'),
3377      progress2: root.querySelector('#db-progress-2'),
3378      nextStep: root.querySelector('#db-next-step'),
3379      prevStep: root.querySelector('#db-prev-step'),
3380      submitBtn: root.querySelector('#db-submit'),
3381      step1Error: root.querySelector('#db-step-1-error'),
3382      step2Error: root.querySelector('#db-step-2-error'),
3383      submitStatus: root.querySelector('#db-submit-status'),
3384      personen: root.querySelector('#calc_personen'),
3385      arrangement: root.querySelector('#calc_arrangement'),
3386      arrangementNote: root.querySelector('#calc_arrangement_note'),
3387      duur: root.querySelector('#calc_duur'),
3388      calcDate: root.querySelector('#calc_date_for_price'),
3389      extras: root.querySelector('#calc_extras'),
3390      result: root.querySelector('#calc_result'),
3391      messages: root.querySelector('#calc_messages'),
3392      step2Summary: root.querySelector('#db-step-2-summary'),
3393      contactName: root.querySelector('#contact_name'),
3394      contactEmail: root.querySelector('#contact_email'),
3395      contactPhone: root.querySelector('#contact_phone'),
3396      contactCompany: root.querySelector('#contact_company'),
3397      contactDate: root.querySelector('#contact_date'),
3398      contactStarttime: root.querySelector('#contact_starttime'),
3399      contactOccasion: root.querySelector('#contact_occasion'),
3400      contactGroupWrap: root.querySelector('#contact_group_wrap'),
3401      contactGroup: root.querySelector('#contact_group'),
3402      contactNotes: root.querySelector('#contact_notes'),
3403      contactTerms: root.querySelector('#contact_terms')
3404    };
3405
3406    createQuarterHourOptions(els.contactStarttime);
3407
3408    // ГЛАВНОЕ ИЗМЕНЕНИЕ 3 (фикс закрытия попапа при клике на label):
3409    // из-за одинаковых id на странице <label for="..."> указывает на ПЕРВОЕ
3410    // поле с этим id (вне этой копии/попапа). Клик по label браузер шлёт на то
3411    // внешнее поле, и Elementor считает это кликом вне попапа -> закрывает его.
3412    // Один делегированный обработчик на root: отменяем стандартное поведение
3413    // (preventDefault) и сами фокусируем/переключаем нужное поле ВНУТРИ root.
3414    // Делегирование обязательно, т.к. часть label создаётся динамически
3415    // (calc_hapjes_keuze, calc_warme_hapjes_type) при каждом пересчёте.
3416    root.addEventListener('click', function (e) {
3417      const label = e.target.closest('label[for]');
3418      if (!label || !root.contains(label)) return;
3419
3420      const targetId = label.getAttribute('for');
3421      if (!targetId) return;
3422
3423      const escapedId = (window.CSS && CSS.escape) ? CSS.escape(targetId) : targetId;
3424      const target = root.querySelector('#' + escapedId);
3425      if (!target) return;
3426
3427      e.preventDefault();
3428
3429      if (target.type === 'checkbox' || target.type === 'radio') {
3430        target.checked = !target.checked;
3431        target.dispatchEvent(new Event('change', { bubbles: true }));
3432      } else if (typeof target.focus === 'function') {
3433        target.focus();
3434      }
3435    });
3436
3437    function euro(value) {
3438      return '€' + Number(value).toLocaleString('nl-NL', {
3439        minimumFractionDigits: 2,
3440        maximumFractionDigits: 2
3441      });
3442    }
3443
3444    function euroWhole(value) {
3445      return '€' + Math.round(value).toLocaleString('nl-NL');
3446    }
3447
3448    function roundToHalf(value) {
3449      return Math.round(value * 2) / 2;
3450    }
3451
3452    function getZone(personen) {
3453      if (personen >= 6 && personen <= 12) return 'A';
3454      if (personen >= 13 && personen <= 35) return 'B';
3455      if (personen >= 36 && personen <= 48) return 'C';
3456      return null;
3457    }
3458
3459    function getBillablePersons(arrangement, persons) {
3460      if (arrangement === 'wijn') return Math.max(persons, CONFIG.billingMinimumWijn);
3461      if (arrangement === 'tapas') return Math.max(persons, CONFIG.billingMinimumTapas);
3462      if (arrangement === 'bbq') return Math.max(persons, CONFIG.billingMinimumBbq);
3463      return persons;
3464    }
3465
3466    function getMinimumPersonsForArrangement(arrangement) {
3467      if (arrangement === 'wijn') return CONFIG.minPersonsForWijn;
3468      if (arrangement === 'tapas') return CONFIG.minPersonsForTapas;
3469      if (arrangement === 'bbq') return CONFIG.minPersonsForBbq;
3470      if (arrangement === 'lunch') return CONFIG.minPersonsForLunch;
3471      return 0;
3472    }
3473
3474    function isArrangementDisabledForPersons(key, persons, saturday) {
3475      if (key === 'kurk' && saturday) return true;
3476
3477      const minimum = getMinimumPersonsForArrangement(key);
3478      if (minimum && persons < minimum) return true;
3479
3480      return false;
3481    }
3482
3483    function getDisabledArrangementReason(key, persons, saturday) {
3484      if (key === 'kurk' && saturday) return 'niet mogelijk op zaterdag';
3485
3486      const minimum = getMinimumPersonsForArrangement(key);
3487      if (minimum && persons < minimum) return 'te boeken vanaf ' + minimum + ' personen';
3488
3489      return '';
3490    }
3491
3492    function getBootType(zone, arrangement, personen) {
3493      if (arrangement === 'lunch') {
3494        return 'Domstadboot';
3495      }
3496
3497      if ((arrangement === 'bbq' || arrangement === 'tapas') && personen <= 12) {
3498        return 'Domstadboot';
3499      }
3500
3501      return CONFIG.zones[zone] ? CONFIG.zones[zone].boot : '';
3502    }
3503
3504    function isSaturday(dateString) {
3505      if (!dateString) return false;
3506      const d = new Date(dateString + 'T12:00:00');
3507      return d.getDay() === 6;
3508    }
3509
3510    function needsGroupComposition(occasion) {
3511      return occasion === 'Vriendenuitje' || occasion === 'Vrijgezellenfeest';
3512    }
3513
3514    function updateGroupCompositionVisibility() {
3515      const show = needsGroupComposition(els.contactOccasion.value);
3516
3517      if (show) {
3518        els.contactGroupWrap.classList.remove('db-hidden');
3519        els.contactGroup.required = true;
3520      } else {
3521        els.contactGroupWrap.classList.add('db-hidden');
3522        els.contactGroup.required = false;
3523        els.contactGroup.value = '';
3524      }
3525    }
3526
3527    function calculateBorrelplankPrice(personen) {
3528      const target = personen * 7.5;
3529      const staffels = CONFIG.borrelplankStaffels;
3530
3531      let best = staffels[0];
3532      let bestDiff = Math.abs(best - target);
3533
3534      for (const price of staffels) {
3535        const diff = Math.abs(price - target);
3536
3537        if (diff < bestDiff) {
3538          best = price;
3539          bestDiff = diff;
3540        } else if (diff === bestDiff && price < best) {
3541          best = price;
3542        }
3543      }
3544
3545      return best;
3546    }
3547
3548    function getVisibleArrangements(zone, saturday, personen) {
3549      return Object.entries(ARRANGEMENTS)
3550        .filter(function (entry) {
3551          const key = entry[0];
3552          const cfg = entry[1];
3553
3554          if (['wijn', 'tapas', 'bbq'].includes(key)) return true;
3555
3556          return cfg.zones.includes(zone);
3557        })
3558        .map(function (entry) {
3559          const key = entry[0];
3560          const cfg = entry[1];
3561          const reason = getDisabledArrangementReason(key, personen, saturday);
3562
3563          return {
3564            key,
3565            label: cfg.label,
3566            disabled: Boolean(reason),
3567            reason
3568          };
3569        });
3570    }
3571
3572    function renderPersonOptions() {
3573      let html = '';
3574
3575      for (let i = 6; i <= 48; i++) {
3576        html += '<option value="' + i + '">' + i + (i === 48 ? ' (max online)' : '') + '</option>';
3577      }
3578
3579      els.personen.innerHTML = html;
3580      els.personen.value = String(state.personen || 12);
3581    }
3582
3583    function renderArrangementOptions() {
3584      const zone = getZone(state.personen);
3585      const saturday = isSaturday(state.calcDate);
3586      const visible = getVisibleArrangements(zone, saturday, state.personen);
3587
3588      let html = '<option value="">Kies een arrangement</option>';
3589
3590      visible.forEach(function (item) {
3591        const label = item.reason ? item.label + ' (' + item.reason + ')' : item.label;
3592        html += '<option value="' + item.key + '"' + (item.disabled ? ' disabled' : '') + '>' + label + '</option>';
3593      });
3594
3595      els.arrangement.innerHTML = html;
3596
3597      const selectedItem = visible.find(function (v) {
3598        return v.key === state.arrangement;
3599      });
3600
3601      const isValid = state.arrangement && selectedItem && !selectedItem.disabled;
3602
3603      if (isValid) {
3604        els.arrangement.value = state.arrangement;
3605      } else {
3606        state.arrangement = '';
3607        els.arrangement.value = '';
3608      }
3609
3610      renderArrangementNote();
3611    }
3612
3613    function renderArrangementNote() {
3614      if (!els.arrangementNote) return;
3615
3616      let html = '';
3617
3618      if (['wijn', 'tapas', 'bbq'].includes(state.arrangement) && state.personen < 12) {
3619        html = '<div class="db-arrangement-note">Dit arrangement is te boeken vanaf 10 personen maar voor de prijs van 12 personen.</div>';
3620      }
3621
3622      els.arrangementNote.innerHTML = html;
3623    }
3624
3625    function renderDurationOptions() {
3626      if (!state.arrangement) {
3627        els.duur.innerHTML = '<option value="">Kies eerst een arrangement</option>';
3628        state.duur = '';
3629        return;
3630      }
3631
3632      const durations = ARRANGEMENTS[state.arrangement].durations;
3633      let html = '<option value="">Kies een duur</option>';
3634
3635      durations.forEach(function (d) {
3636        html += '<option value="' + d + '">' + String(d).replace('.', ',') + ' uur</option>';
3637      });
3638
3639      els.duur.innerHTML = html;
3640
3641      if (durations.includes(Number(state.duur))) {
3642        els.duur.value = String(state.duur);
3643      } else {
3644        state.duur = '';
3645        els.duur.value = '';
3646      }
3647    }
3648
3649    function resetExtras() {
3650      state.extras = {
3651        hapjes_keuze: '',
3652        gids: false,
3653        warme_hapjes: false,
3654        warme_hapjes_type: '',
3655        borrelplank: false,
3656        dessert: false,
3657        koffie_thee: false,
3658        drank_upgrade: false,
3659        prosecco_upgrade: false,
3660        bbq_halal: false
3661      };
3662    }
3663
3664    function buildExtrasReadable() {
3665      const extras = [];
3666
3667      if (state.arrangement === 'drank') {
3668        if (state.extras.hapjes_keuze === 'ja') extras.push('Hapjes: ja');
3669        if (state.extras.hapjes_keuze === 'nee') extras.push('Hapjes: nee');
3670      }
3671
3672      if (state.extras.gids) extras.push('Gids');
3673      if (state.extras.borrelplank && state.arrangement !== 'wijn') extras.push('Luxe borrelplank');
3674      if (state.extras.dessert) extras.push('Dessertplank');
3675      if (state.extras.koffie_thee) extras.push('Koffie en thee');
3676      if (state.extras.drank_upgrade) extras.push('Drankupgrade');
3677      if (state.extras.prosecco_upgrade) extras.push('Onbeperkt prosecco');
3678      if (state.extras.bbq_halal) extras.push('Halal BBQ voor gehele groep');
3679
3680      if (state.extras.warme_hapjes) {
3681        if (state.extras.warme_hapjes_type) {
3682          let hapjesLabel = state.extras.warme_hapjes_type;
3683
3684          if (hapjesLabel === 'vlees') hapjesLabel = 'Bittergarnituur vlees';
3685          if (hapjesLabel === 'vega') hapjesLabel = 'Bittergarnituur vega';
3686          if (hapjesLabel === 'gemengd') hapjesLabel = 'Bittergarnituur gemengd';
3687          if (hapjesLabel === 'bitterballen') hapjesLabel = 'Bitterballen';
3688
3689          extras.push('Warme hapjes, ' + hapjesLabel);
3690        } else {
3691          extras.push('Warme hapjes');
3692        }
3693      }
3694
3695      if (state.arrangement === 'wijn') {
3696        extras.push('Luxe borrelplank inbegrepen');
3697      }
3698
3699      return extras.join(', ');
3700    }
3701
3702    function renderExtras() {
3703      if (!state.arrangement) {
3704        els.extras.innerHTML = '';
3705        return;
3706      }
3707
3708      const extras = ARRANGEMENTS[state.arrangement].extras || [];
3709
3710      let html = '<div class="db-card">';
3711      html += '<div style="font-weight:700;margin-bottom:8px;color:#003366;font-size:13px;">Extra opties</div>';
3712
3713      if (extras.includes('hapjes_keuze')) {
3714        html += '<div style="margin-bottom:10px;">';
3715        html += '<label for="calc_hapjes_keuze" style="display:block;margin-bottom:4px;font-weight:600;font-size:12px;">Willen jullie daar hapjes bij?<span class="db-required">*</span></label>';
3716        html += '<select id="calc_hapjes_keuze">';
3717        html += '<option value="">Maak een keuze</option>';
3718        html += '<option value="nee"' + (state.extras.hapjes_keuze === 'nee' ? ' selected' : '') + '>Nee, geen hapjes</option>';
3719        html += '<option value="ja"' + (state.extras.hapjes_keuze === 'ja' ? ' selected' : '') + '>Ja, graag hapjes erbij</option>';
3720        html += '</select>';
3721        html += '</div>';
3722      }
3723
3724      const showHapjesOptions = state.arrangement !== 'drank' || state.extras.hapjes_keuze === 'ja';
3725      const useSingleColumn = state.arrangement === 'drank';
3726
3727      html += '<div class="' + (useSingleColumn ? 'db-extras-grid-single' : 'db-extras-grid') + '">';
3728
3729      function checkbox(id, label, checked) {
3730        return '<label class="db-checkbox"><input type="checkbox" data-extra="' + id + '" ' + (checked ? 'checked' : '') + '><span>' + label + '</span></label>';
3731      }
3732
3733      if (extras.includes('gids')) {
3734        html += checkbox('gids', 'Gids aan boord (' + euro(calculateGuidePrice(getEffectiveDuration())) + ')', state.extras.gids);
3735      }
3736
3737      if (showHapjesOptions) {
3738        if (extras.includes('warme_hapjes')) {
3739          html += checkbox('warme_hapjes', 'Warme hapjes, 5 stuks p.p. (' + euro(CONFIG.warmeHapjes.piecesPerPerson * CONFIG.warmeHapjes.pricePerPiece) + ' p.p.)', state.extras.warme_hapjes);
3740        }
3741
3742        if (extras.includes('borrelplank')) {
3743          html += checkbox('borrelplank', 'Luxe borrelplank', state.extras.borrelplank);
3744        }
3745      }
3746
3747      if (extras.includes('dessert')) {
3748        html += checkbox('dessert', 'Dessertplank (' + euro(CONFIG.dessertPP) + ' p.p.)', state.extras.dessert);
3749      }
3750
3751      if (extras.includes('koffie_thee')) {
3752        html += checkbox('koffie_thee', 'Koffie en thee (' + euro(CONFIG.koffieTheePP) + ' p.p.)', state.extras.koffie_thee);
3753      }
3754
3755      if (extras.includes('drank_upgrade')) {
3756        html += checkbox('drank_upgrade', 'Drankupgrade (' + euro(CONFIG.lunchDrankUpgradePP) + ' p.p. voor de eerste 1,5 uur)', state.extras.drank_upgrade);
3757      }
3758
3759      if (extras.includes('prosecco_upgrade')) {
3760        html += checkbox('prosecco_upgrade', 'Onbeperkt prosecco (' + euro(CONFIG.proseccoUpgradePP) + ' p.p.)', state.extras.prosecco_upgrade);
3761      }
3762
3763      if (extras.includes('bbq_halal')) {
3764        html += checkbox('bbq_halal', 'Halal BBQ voor hele groep (+' + euro(CONFIG.bbqHalalPP) + ' p.p.)', state.extras.bbq_halal);
3765      }
3766
3767      html += '</div>';
3768
3769      if (state.extras.warme_hapjes && extras.includes('warme_hapjes') && showHapjesOptions) {
3770        html += '<div class="db-hapjes-wrap">';
3771        html += '<label for="calc_warme_hapjes_type" style="display:block;margin-bottom:4px;font-weight:600;font-size:12px;">Welke warme hapjes willen jullie?</label>';
3772        html += '<select id="calc_warme_hapjes_type">';
3773        html += '<option value="">Kies een soort</option>';
3774        html += '<option value="bitterballen"' + (state.extras.warme_hapjes_type === 'bitterballen' ? ' selected' : '') + '>Bitterballen</option>';
3775        html += '<option value="vlees"' + (state.extras.warme_hapjes_type === 'vlees' ? ' selected' : '') + '>Bittergarnituur vlees</option>';
3776        html += '<option value="vega"' + (state.extras.warme_hapjes_type === 'vega' ? ' selected' : '') + '>Bittergarnituur vega</option>';
3777        html += '<option value="gemengd"' + (state.extras.warme_hapjes_type === 'gemengd' ? ' selected' : '') + '>Bittergarnituur gemengd</option>';
3778        html += '</select>';
3779        html += '</div>';
3780      }
3781
3782      if (state.arrangement === 'drank' && state.extras.hapjes_keuze === 'ja') {
3783        html += '<div class="db-inline-note" style="margin-top:6px;">Kies hierbij minimaal warme hapjes of een luxe borrelplank.</div>';
3784      }
3785
3786      if (state.arrangement === 'wijn') {
3787        html += '<div class="db-inline-note" style="margin-top:6px;">Bij de wijnproeverij is de luxe borrelplank standaard inbegrepen.</div>';
3788      }
3789
3790      if (state.extras.dessert && extras.includes('dessert')) {
3791        html += '<div class="db-inline-note" style="margin-top:6px;">Een dessertplank voegt automatisch 30 minuten extra vaartijd toe.</div>';
3792      }
3793
3794      html += '</div>';
3795
3796      els.extras.innerHTML = html;
3797
3798      const hapjesKeuzeSelect = root.querySelector('#calc_hapjes_keuze');
3799      if (hapjesKeuzeSelect) {
3800        hapjesKeuzeSelect.addEventListener('change', function () {
3801          state.extras.hapjes_keuze = this.value;
3802
3803          if (this.value === 'nee') {
3804            state.extras.warme_hapjes = false;
3805            state.extras.warme_hapjes_type = '';
3806            state.extras.borrelplank = false;
3807          }
3808
3809          renderExtras();
3810          recalculate();
3811        });
3812      }
3813
3814      els.extras.querySelectorAll('input[type="checkbox"][data-extra]').forEach(function (input) {
3815        input.addEventListener('change', function () {
3816          const key = this.getAttribute('data-extra');
3817          state.extras[key] = this.checked;
3818
3819          if (key === 'warme_hapjes' && !this.checked) {
3820            state.extras.warme_hapjes_type = '';
3821          }
3822
3823          renderExtras();
3824          recalculate();
3825        });
3826      });
3827
3828      const hapjesTypeSelect = root.querySelector('#calc_warme_hapjes_type');
3829      if (hapjesTypeSelect) {
3830        hapjesTypeSelect.addEventListener('change', function () {
3831          state.extras.warme_hapjes_type = this.value;
3832          recalculate();
3833        });
3834      }
3835    }
3836
3837    function getEffectiveDuration() {
3838      let duration = Number(state.duur || 0);
3839
3840      if (state.extras.dessert) {
3841        duration += 0.5;
3842      }
3843
3844      return duration;
3845    }
3846
3847    function calculateGuidePrice(effectiveDuration) {
3848      const duration = Number(effectiveDuration || state.duur || 1.5);
3849      const extraHalfHours = Math.max(0, (duration - 1.5) / 0.5);
3850      return CONFIG.gids + (extraHalfHours * CONFIG.gidsExtraHalfuur);
3851    }
3852
3853    function getBaseDuration(arrangement) {
3854      if (['wijn', 'tapas', 'bbq'].includes(arrangement)) return 2;
3855      if (arrangement === 'pizza') return Number(state.duur) === 1.5 ? 1.5 : 2;
3856      return 1.5;
3857    }
3858
3859    function calculateBoatCost(zone, arrangement, effectiveDuration, personen) {
3860      const includesBoating = ['pizza', 'wijn', 'tapas', 'bbq'].includes(arrangement);
3861      const baseDuration = getBaseDuration(arrangement);
3862      const boatZone = (
3863        arrangement === 'lunch' ||
3864        ((arrangement === 'bbq' || arrangement === 'tapas') && personen <= 12)
3865      ) ? 'B' : zone;
3866
3867      let boatCost = 0;
3868      let extraBoatCost = 0;
3869
3870      if (!includesBoating) {
3871        boatCost = CONFIG.vaartarief[boatZone];
3872      }
3873
3874      if (effectiveDuration > baseDuration) {
3875        const extraBlocks = (effectiveDuration - baseDuration) / 0.5;
3876        extraBoatCost = extraBlocks * CONFIG.extraVaarHalfuur[boatZone];
3877      }
3878
3879      return {
3880        boatCost,
3881        extraBoatCost
3882      };
3883    }
3884
3885    function describeBaseArrangement(zone, arrangement, persons, selectedDuration, saturday) {
3886      switch (arrangement) {
3887        case 'drank':
3888          return {
3889            amount: persons * (saturday ? CONFIG.drank.zaterdagBasis : CONFIG.drank.basis),
3890            label: 'Drank arrangement voor 1,5 uur',
3891            meta: persons + ' x ' + euro(saturday ? CONFIG.drank.zaterdagBasis : CONFIG.drank.basis) + ' p.p.'
3892          };
3893
3894        case 'pizza': {
3895          const durationKey = Number(selectedDuration) === 1.5 ? 1.5 : 2;
3896          const pp = durationKey === 1.5 ? CONFIG.pizza15PP : CONFIG.pizza20PP;
3897          const saturdayPP = pp + (saturday ? CONFIG.saturdaySurchargePP : 0);
3898
3899          if (zone === 'A' && persons <= 10 && PIZZA_BARBARA_PRICES[durationKey]) {
3900            return {
3901              amount: PIZZA_BARBARA_PRICES[durationKey][persons] + (saturday ? persons * CONFIG.saturdaySurchargePP : 0),
3902              label: 'Pizza pakket',
3903              meta: 'Inclusief ' + String(durationKey).replace('.', ',') + ' uur varen, pizza en onbeperkt drank'
3904            };
3905          }
3906
3907          return {
3908            amount: persons * saturdayPP,
3909            label: 'Pizza pakket',
3910            meta: persons + ' x ' + euro(saturdayPP) + ' p.p. (incl. ' + String(durationKey).replace('.', ',') + ' uur varen, pizza en onbeperkt drank)'
3911          };
3912        }
3913
3914        case 'wijn': {
3915          const pp = CONFIG.wijnPP + (saturday ? CONFIG.saturdaySurchargePP : 0);
3916          const billablePersons = getBillablePersons(arrangement, persons);
3917
3918          return {
3919            amount: billablePersons * pp,
3920            label: 'Wijnproeverij pakket',
3921            meta: billablePersons + ' x ' + euro(pp) + ' p.p. (incl. 2 uur varen, wijnproeverij, onbeperkt drank en luxe borrelplank)'
3922          };
3923        }
3924
3925        case 'tapas': {
3926          const pp = CONFIG.tapasPP + (saturday ? CONFIG.saturdaySurchargePP : 0);
3927          const billablePersons = getBillablePersons(arrangement, persons);
3928
3929          return {
3930            amount: billablePersons * pp,
3931            label: 'Tapas pakket',
3932            meta: billablePersons + ' x ' + euro(pp) + ' p.p. (incl. 2 uur varen, tapas en onbeperkt drank)'
3933          };
3934        }
3935
3936        case 'bbq': {
3937          const pp = CONFIG.bbqPP + (saturday ? CONFIG.saturdaySurchargePP : 0);
3938          const billablePersons = getBillablePersons(arrangement, persons);
3939
3940          return {
3941            amount: billablePersons * pp,
3942            label: 'BBQ pakket',
3943            meta: billablePersons + ' x ' + euro(pp) + ' p.p. (incl. 2 uur varen, BBQ en onbeperkt drank)'
3944          };
3945        }
3946
3947        case 'lunch': {
3948          const pp = CONFIG.lunchPP + (saturday ? CONFIG.saturdaySurchargePP : 0);
3949
3950          return {
3951            amount: persons * pp,
3952            label: 'Lunch',
3953            meta: persons + ' x ' + euro(pp) + ' p.p.'
3954          };
3955        }
3956
3957        case 'hightea': {
3958          const pp = CONFIG.highteaPP + (saturday ? CONFIG.saturdaySurchargePP : 0);
3959
3960          return {
3961            amount: persons * pp,
3962            label: 'High Tea',
3963            meta: persons + ' x ' + euro(pp) + ' p.p.'
3964          };
3965        }
3966
3967        case 'kurk':
3968          return {
3969            amount: persons * CONFIG.kurkPP,
3970            label: 'Kurkengeld voor 1,5 uur',
3971            meta: persons + ' x ' + euro(CONFIG.kurkPP) + ' p.p.'
3972          };
3973
3974        default:
3975          return {
3976            amount: 0,
3977            label: '',
3978            meta: ''
3979          };
3980      }
3981    }
3982
3983    function calculateExtraDrinkCost(arrangement, effectiveDuration, persons) {
3984      const baseDuration = getBaseDuration(arrangement);
3985
3986      if (effectiveDuration <= baseDuration) return 0;
3987
3988      const extraBlocks = (effectiveDuration - baseDuration) / 0.5;
3989      const drinkPersons = getBillablePersons(arrangement, persons);
3990
3991      if (['drank'].includes(arrangement)) {
3992        return extraBlocks * persons * CONFIG.drank.extraHalfuur;
3993      }
3994
3995      if (['pizza', 'wijn', 'tapas', 'bbq'].includes(arrangement)) {
3996        return extraBlocks * drinkPersons * CONFIG.drank.extraHalfuur;
3997      }
3998
3999      if (arrangement === 'lunch' && state.extras.drank_upgrade) {
4000        return extraBlocks * persons * CONFIG.drank.extraHalfuur;
4001      }
4002
4003      if (arrangement === 'hightea' && (state.extras.drank_upgrade || state.extras.prosecco_upgrade)) {
4004        return extraBlocks * persons * CONFIG.drank.extraHalfuur;
4005      }
4006
4007      return 0;
4008    }
4009
4010    function calculateExtras(arrangement, persons, effectiveDuration) {
4011      const lines = [];
4012      let total = 0;
4013      const billablePersons = getBillablePersons(arrangement, persons);
4014
4015      if (state.extras.gids) {
4016        const guidePrice = calculateGuidePrice(effectiveDuration);
4017        const extraHalfHours = Math.max(0, (Number(effectiveDuration) - 1.5) / 0.5);
4018
4019        lines.push({
4020          key: 'gids',
4021          label: 'Gids aan boord',
4022          meta: extraHalfHours > 0 ? '€25,00 per extra half uur na 1,5 uur' : '',
4023          amount: guidePrice
4024        });
4025
4026        total += guidePrice;
4027      }
4028
4029      if (state.extras.warme_hapjes) {
4030        const hapjesPrice = persons * CONFIG.warmeHapjes.piecesPerPerson * CONFIG.warmeHapjes.pricePerPiece;
4031        let hapjesLabel = 'Warme hapjes';
4032
4033        if (state.extras.warme_hapjes_type) {
4034          if (state.extras.warme_hapjes_type === 'bitterballen') hapjesLabel = 'Warme hapjes, Bitterballen';
4035          if (state.extras.warme_hapjes_type === 'vlees') hapjesLabel = 'Warme hapjes, Bittergarnituur vlees';
4036          if (state.extras.warme_hapjes_type === 'vega') hapjesLabel = 'Warme hapjes, Bittergarnituur vega';
4037          if (state.extras.warme_hapjes_type === 'gemengd') hapjesLabel = 'Warme hapjes, Bittergarnituur gemengd';
4038        }
4039
4040        lines.push({
4041          key: 'warme_hapjes',
4042          label: hapjesLabel,
4043          meta: persons + ' x ' + euro(CONFIG.warmeHapjes.piecesPerPerson * CONFIG.warmeHapjes.pricePerPiece) + ' p.p.',
4044          amount: hapjesPrice
4045        });
4046
4047        total += hapjesPrice;
4048      }
4049
4050      if (state.extras.borrelplank && arrangement !== 'wijn') {
4051        const plankPrice = calculateBorrelplankPrice(persons);
4052
4053        lines.push({
4054          key: 'borrelplank',
4055          label: 'Luxe borrelplank',
4056          meta: '',
4057          amount: plankPrice
4058        });
4059
4060        total += plankPrice;
4061      }
4062
4063      if (state.extras.dessert) {
4064        const price = billablePersons * CONFIG.dessertPP;
4065
4066        lines.push({
4067          key: 'dessert',
4068          label: 'Dessertplank',
4069          meta: billablePersons + ' x ' + euro(CONFIG.dessertPP) + ' p.p.',
4070          amount: price
4071        });
4072
4073        total += price;
4074      }
4075
4076      if (arrangement === 'lunch' && state.extras.koffie_thee) {
4077        const price = persons * CONFIG.koffieTheePP;
4078
4079        lines.push({
4080          key: 'koffie_thee',
4081          label: 'Koffie en thee',
4082          meta: persons + ' x ' + euro(CONFIG.koffieTheePP) + ' p.p.',
4083          amount: price
4084        });
4085
4086        total += price;
4087      }
4088
4089      if (arrangement === 'lunch' && state.extras.drank_upgrade) {
4090        const price = persons * CONFIG.lunchDrankUpgradePP;
4091
4092        lines.push({
4093          key: 'drank_upgrade',
4094          label: 'Drankupgrade voor de eerste 1,5 uur',
4095          meta: persons + ' x ' + euro(CONFIG.lunchDrankUpgradePP) + ' p.p.',
4096          amount: price
4097        });
4098
4099        total += price;
4100      }
4101
4102      if (arrangement === 'hightea' && state.extras.prosecco_upgrade) {
4103        const price = persons * CONFIG.proseccoUpgradePP;
4104
4105        lines.push({
4106          key: 'prosecco_upgrade',
4107          label: 'Onbeperkt prosecco',
4108          meta: persons + ' x ' + euro(CONFIG.proseccoUpgradePP) + ' p.p.',
4109          amount: price
4110        });
4111
4112        total += price;
4113      }
4114
4115      if (arrangement === 'hightea' && state.extras.drank_upgrade) {
4116        const price = persons * CONFIG.highTeaDrankUpgradePP;
4117
4118        lines.push({
4119          key: 'drank_upgrade',
4120          label: 'Drankupgrade voor de eerste 1,5 uur',
4121          meta: persons + ' x ' + euro(CONFIG.highTeaDrankUpgradePP) + ' p.p.',
4122          amount: price
4123        });
4124
4125        total += price;
4126      }
4127
4128      if (arrangement === 'bbq' && state.extras.bbq_halal) {
4129        const price = billablePersons * CONFIG.bbqHalalPP;
4130
4131        lines.push({
4132          key: 'bbq_halal',
4133          label: 'Halal BBQ toeslag',
4134          meta: billablePersons + ' x ' + euro(CONFIG.bbqHalalPP) + ' p.p.',
4135          amount: price
4136        });
4137
4138        total += price;
4139      }
4140
4141      return {
4142        total,
4143        lines
4144      };
4145    }
4146
4147    function getMessages(zone, arrangement, saturday, personen) {
4148      const messages = [
4149        'Prijsindicatie op basis van jullie huidige keuzes.',
4150        'De prijs per persoon kan nog iets veranderen als het aantal deelnemers wijzigt.'
4151      ];
4152
4153      if (!state.calcDate) {
4154        messages.push('Op zaterdag geldt een toeslag van €5 p.p. op elk arrangement.');
4155      }
4156
4157      if (zone === 'C') {
4158        messages.push('Voor 36 t/m 48 personen varen we verdeeld over twee boten.');
4159      }
4160
4161      if (arrangement === 'drank' && state.extras.hapjes_keuze === 'ja') {
4162        messages.push('Kies hierbij minimaal warme hapjes of een luxe borrelplank.');
4163      }
4164
4165      if (arrangement === 'kurk' && saturday) {
4166        messages.push('Kurkengeld is niet mogelijk op zaterdag.');
4167      }
4168
4169      if (arrangement === 'wijn') {
4170        messages.push('Bij de wijnproeverij is de luxe borrelplank inbegrepen.');
4171      }
4172
4173      if (['wijn', 'tapas', 'bbq'].includes(arrangement) && personen < 12) {
4174        messages.push('Dit arrangement is te boeken vanaf 10 personen maar voor de prijs van 12 personen.');
4175      }
4176
4177      if ((arrangement === 'tapas' || arrangement === 'bbq') && personen <= 12) {
4178        messages.push(ARRANGEMENTS[arrangement].label + ' bij maximaal 12 personen wordt ingepland op de Domstadboot.');
4179      }
4180
4181      return messages;
4182    }
4183
4184    function buildSummary(arrangementLabel, effectiveDuration) {
4185      const extras = [];
4186
4187      if (state.extras.gids) extras.push('gids');
4188      if (state.extras.warme_hapjes) extras.push(state.extras.warme_hapjes_type ? 'warme hapjes, ' + state.extras.warme_hapjes_type : 'warme hapjes');
4189      if (state.extras.borrelplank && state.arrangement !== 'wijn') extras.push('luxe borrelplank');
4190      if (state.extras.dessert) extras.push('dessertplank');
4191      if (state.extras.koffie_thee) extras.push('koffie en thee');
4192      if (state.extras.drank_upgrade) extras.push('drankupgrade');
4193      if (state.extras.prosecco_upgrade) extras.push('onbeperkt prosecco');
4194      if (state.extras.bbq_halal) extras.push('halal BBQ voor gehele groep');
4195      if (state.arrangement === 'drank' && state.extras.hapjes_keuze === 'nee') extras.push('zonder hapjes');
4196      if (state.arrangement === 'wijn') extras.push('incl. luxe borrelplank');
4197
4198      return state.personen + ' personen, ' + arrangementLabel + ', ' + String(effectiveDuration).replace('.', ',') + ' uur' + (extras.length ? ', met ' + extras.join(', ') : '') + '.';
4199    }
4200
4201    function calculatePrice() {
4202      const persons = Number(state.personen);
4203      const arrangement = state.arrangement;
4204      const duration = Number(state.duur);
4205
4206      if (!persons || !arrangement || !duration) return null;
4207
4208      const zone = getZone(persons);
4209      const saturday = isSaturday(state.calcDate);
4210
4211      if (isArrangementDisabledForPersons(arrangement, persons, saturday)) return null;
4212
4213      const bootType = getBootType(zone, arrangement, persons);
4214      const arrangementLabel = ARRANGEMENTS[arrangement].label;
4215      const effectiveDuration = getEffectiveDuration();
4216      const base = describeBaseArrangement(zone, arrangement, persons, duration, saturday);
4217      const boat = calculateBoatCost(zone, arrangement, effectiveDuration, persons);
4218      const extraDrinkCost = calculateExtraDrinkCost(arrangement, effectiveDuration, persons);
4219      const extras = calculateExtras(arrangement, persons, effectiveDuration);
4220      const rawTotal = base.amount + boat.boatCost + boat.extraBoatCost + extraDrinkCost + extras.total;
4221      const priceLines = [];
4222
4223      if (base.amount > 0) {
4224        priceLines.push({
4225          key: 'basis',
4226          label: base.label,
4227          meta: base.meta || '',
4228          amount: base.amount
4229        });
4230      }
4231
4232      if (boat.boatCost > 0) {
4233        priceLines.push({
4234          key: 'vaartarief',
4235          label: 'Vaartarief voor 1,5 uur',
4236          meta: '',
4237          amount: boat.boatCost
4238        });
4239      }
4240
4241      if (boat.extraBoatCost > 0) {
4242        priceLines.push({
4243          key: 'extra_vaartijd',
4244          label: 'Extra vaartijd',
4245          meta: 'Verlenging van de tocht',
4246          amount: boat.extraBoatCost
4247        });
4248      }
4249
4250      if (extraDrinkCost > 0) {
4251        priceLines.push({
4252          key: 'extra_drank',
4253          label: 'Verlenging drankarrangement',
4254          meta: getBillablePersons(arrangement, persons) + ' x ' + euro(CONFIG.drank.extraHalfuur) + ' p.p. per half uur',
4255          amount: extraDrinkCost
4256        });
4257      }
4258
4259      extras.lines.forEach(function (line) {
4260        priceLines.push(line);
4261      });
4262
4263      return {
4264        zone,
4265        bootType,
4266        arrangementKey: arrangement,
4267        arrangementLabel,
4268        personen: persons,
4269        billablePersons: getBillablePersons(arrangement, persons),
4270        duur: duration,
4271        effectiveDuration,
4272        priceLines,
4273        total: Math.round(rawTotal * 100) / 100,
4274        pricePerPerson: roundToHalf(rawTotal / persons),
4275        messages: getMessages(zone, arrangement, saturday, persons),
4276        summaryText: buildSummary(arrangementLabel, effectiveDuration),
4277        saturday
4278      };
4279    }
4280
4281    function renderResult(result) {
4282      if (!result) {
4283        els.result.innerHTML = '';
4284        els.messages.innerHTML = '';
4285        return;
4286      }
4287
4288      let html = '<div class="db-result">';
4289      html += '<div style="font-size:18px;font-weight:700;color:#003366;margin-bottom:6px;line-height:1.15;">Jullie prijsindicatie</div>';
4290      html += '<div style="font-size:13px;margin-bottom:10px;line-height:1.35;"><strong>Samenvatting:</strong> ' + result.summaryText + '</div>';
4291
4292      result.priceLines.forEach(function (line) {
4293        html += '<div class="db-price-line">';
4294        html += '<div class="db-price-label">';
4295        html += '<div>' + line.label + '</div>';
4296
4297        if (line.meta) {
4298          html += '<small>' + line.meta + '</small>';
4299        }
4300
4301        html += '</div>';
4302        html += '<div style="white-space:nowrap;font-weight:600;">' + euro(line.amount) + '</div>';
4303        html += '</div>';
4304      });
4305
4306      html += '<div class="db-total">Totaal: ' + euro(result.total) + '</div>';
4307      html += '<div class="db-pp">Ca. ' + euro(result.pricePerPerson) + ' p.p.</div>';
4308      html += '</div>';
4309
4310      els.result.innerHTML = html;
4311
4312      if (result.messages && result.messages.length) {
4313        els.messages.innerHTML = '<div class="db-message-box">' + result.messages.map(function (msg) {
4314          return '<div>' + msg + '</div>';
4315        }).join('') + '</div>';
4316      } else {
4317        els.messages.innerHTML = '';
4318      }
4319    }
4320
4321    function fillHiddenField(id, value) {
4322      const field = root.querySelector('#' + id);
4323
4324      if (field) {
4325        field.value = value;
4326      }
4327    }
4328
4329    function buildCalcJson(result) {
4330      return JSON.stringify({
4331        zone: result.zone,
4332        bootType: result.bootType,
4333        arrangement: result.arrangementLabel,
4334        arrangementKey: result.arrangementKey,
4335        personen: result.personen,
4336        billablePersons: result.billablePersons,
4337        duur: result.duur,
4338        effectiveDuration: result.effectiveDuration,
4339        effectieveDuur: result.effectiveDuration,
4340        zaterdag: result.saturday ? 'ja' : 'nee',
4341        calcDate: state.calcDate || '',
4342        extras: state.extras,
4343        total: result.total,
4344        pricePerPerson: result.pricePerPerson,
4345        messages: result.messages,
4346        summary: result.summaryText,
4347        lines: result.priceLines
4348      });
4349    }
4350
4351    function buildPriceLinesJson(result) {
4352      return JSON.stringify(result ? result.priceLines : []);
4353    }
4354
4355    function fillHiddenFields(result) {
4356      if (!result) return;
4357
4358      fillHiddenField('hidden_calc_zone', result.zone);
4359      fillHiddenField('hidden_calc_boot_type', result.bootType);
4360      fillHiddenField('hidden_calc_arrangement', result.arrangementLabel);
4361      fillHiddenField('hidden_calc_arrangement_key', result.arrangementKe
4361y);
4362      fillHiddenField('hidden_calc_personen', result.personen);
4363      fillHiddenField('hidden_calc_duur', String(result.duur).replace('.', ','));
4364      fillHiddenField('hidden_calc_effectieve_duur', String(result.effectiveDuration).replace('.', ','));
4365      fillHiddenField('hidden_calc_prijs_totaal', result.total);
4366      fillHiddenField('hidden_calc_prijs_pp', euro(result.pricePerPerson));
4367      fillHiddenField('hidden_calc_samenvatting', result.summaryText);
4368      fillHiddenField('hidden_calc_json', buildCalcJson(result));
4369      fillHiddenField('hidden_calc_price_lines_json', buildPriceLinesJson(result));
4370      fillHiddenField('hidden_calc_hapjes', state.extras.warme_hapjes ? 'ja' : 'nee');
4371      fillHiddenField('hidden_calc_hapjes_type', state.extras.warme_hapjes_type || '');
4372      fillHiddenField('hidden_calc_borrelplank', state.extras.borrelplank ? 'ja' : 'nee');
4373      fillHiddenField('hidden_calc_dessert', state.extras.dessert ? 'ja' : 'nee');
4374      fillHiddenField('hidden_calc_gids', state.extras.gids ? 'ja' : 'nee');
4375      fillHiddenField('hidden_calc_is_zaterdag', result.saturday ? 'ja' : 'nee');
4376      fillHiddenField('hidden_calc_hapjes_keuze', state.extras.hapjes_keuze || '');
4377      fillHiddenField('hidden_calc_bbq_halal', state.extras.bbq_halal ? 'ja' : 'nee');
4378    }
4379
4380    function recalculate() {
4381      renderArrangementOptions();
4382      renderDurationOptions();
4383      renderExtras();
4384
4385      const result = calculatePrice();
4386
4387      renderResult(result);
4388      fillHiddenFields(result);
4389    }
4390
4391    function setSubmitBusy(busy) {
4392      isSubmitting = busy;
4393
4394      if (els.submitBtn) {
4395        els.submitBtn.disabled = busy || formWasSubmitted;
4396        els.submitBtn.textContent = busy ? 'Bezig met verzenden...' : 'Aanvraag verzenden';
4397      }
4398
4399      if (els.prevStep) {
4400        els.prevStep.disabled = busy || formWasSubmitted;
4401      }
4402    }
4403
4404    function disableEntireFormAfterSuccess() {
4405      formWasSubmitted = true;
4406
4407      root.querySelectorAll('input, select, textarea, button').forEach(function (el) {
4408        el.disabled = true;
4409      });
4410    }
4411
4412    function showBigSuccessMessage() {
4413      const fullName = els.contactName && els.contactName.value ? els.contactName.value.trim() : '';
4414      const firstName = fullName ? fullName.split(/\s+/)[0] : 'daar';
4415
4416      const successHtml = `
4417        <div class="db-success-big-wrap">
4418          <div class="db-success-big">
4419            <h2>Ahoy ${firstName}, je aanvraag is gelukt!</h2>
4420            <p>Bedankt voor jullie aanvraag bij Domstadboot.</p>
4421            <p>Onze planner <strong>Tessa</strong> komt binnen <strong>24 uur</strong> bij jullie terug met een passende offerte.</p>
4422            <p>Heb je in de tussentijd nog vragen? Dan kun je gewoon reageren op onze mail of kijk op onze website bij de veelgestelde vragen.</p>
4423          </div>
4424        </div>
4425      `;
4426
4427      els.form.innerHTML = successHtml;
4428    }
4429
4430    els.personen.addEventListener('change', function () {
4431      state.personen = Number(this.value);
4432
4433      if (state.arrangement && isArrangementDisabledForPersons(state.arrangement, state.personen, isSaturday(state.calcDate))) {
4434        state.arrangement = '';
4435        state.duur = '';
4436        resetExtras();
4437      }
4438
4439      recalculate();
4440    });
4441
4442    els.arrangement.addEventListener('change', function () {
4443      state.arrangement = this.value;
4444      state.duur = '';
4445      resetExtras();
4446      recalculate();
4447    });
4448
4449    els.duur.addEventListener('change', function () {
4450      state.duur = this.value;
4451      recalculate();
4452    });
4453
4454    els.calcDate.addEventListener('change', function () {
4455      state.calcDate = this.value;
4456
4457      if (state.arrangement === 'kurk' && isSaturday(this.value)) {
4458        state.arrangement = '';
4459      }
4460
4461      recalculate();
4462    });
4463
4464    els.contactOccasion.addEventListener('change', function () {
4465      updateGroupCompositionVisibility();
4466    });
4467
4468    els.nextStep.addEventListener('click', function () {
4469      const result = calculatePrice();
4470
4471      if (!state.arrangement) {
4472        els.step1Error.textContent = 'Kies eerst een arrangement.';
4473        return;
4474      }
4475
4476      if (isArrangementDisabledForPersons(state.arrangement, state.personen, isSaturday(state.calcDate))) {
4477        els.step1Error.textContent = 'Dit arrangement is niet beschikbaar voor het gekozen aantal personen of de gekozen datum.';
4478        return;
4479      }
4480
4481      if (!state.duur) {
4482        els.step1Error.textContent = 'Kies eerst een duur.';
4483        return;
4484      }
4485
4486      if (state.arrangement === 'drank' && !state.extras.hapjes_keuze) {
4487        els.step1Error.textContent = 'Geef eerst aan of jullie wel of geen hapjes willen.';
4488        return;
4489      }
4490
4491      if (state.arrangement === 'drank' && state.extras.hapjes_keuze === 'ja' && !state.extras.warme_hapjes && !state.extras.borrelplank) {
4492        els.step1Error.textContent = 'Kies bij hapjes minimaal warme hapjes of een luxe borrelplank.';
4493        return;
4494      }
4495
4496      if (state.extras.warme_hapjes && !state.extras.warme_hapjes_type) {
4497        els.step1Error.textContent = 'Kies ook welk type warme hapjes je wilt.';
4498        return;
4499      }
4500
4501      if (!result) {
4502        els.step1Error.textContent = 'De prijs kon nog niet worden berekend.';
4503        return;
4504      }
4505
4506      els.step1Error.textContent = '';
4507
4508      fillHiddenFields(result);
4509
4510      let summaryHtml = '<div class="db-summary-mini">';
4511      summaryHtml += '<strong>Arrangement:</strong><span>' + result.arrangementLabel + '</span>';
4512      summaryHtml += '<strong>Aantal personen:</strong><span>' + result.personen + '</span>';
4513
4514      if (['wijn', 'tapas', 'bbq'].includes(result.arrangementKe
4514y) && result.personen < result.billablePersons) {
4515        summaryHtml += '<strong>Tarief:</strong><span>Tarief vanaf ' + result.billablePersons + ' personen</span>';
4516      }
4517
4518      summaryHtml += '<strong>Duur:</strong><span>' + String(result.effectiveDuration).replace('.', ',') + ' uur</span>';
4519      summaryHtml += '<strong>Boot:</strong><span>' + result.bootType + '</span>';
4520      summaryHtml += '<strong>Totaal indicatie:</strong><span>' + euro(result.total) + '</span>';
4521      summaryHtml += '<strong>Ca. prijs per persoon:</strong><span>' + euro(result.pricePerPerson) + ' p.p.</span>';
4522      summaryHtml += '</div>';
4523
4524      const extrasReadable = buildExtrasReadable();
4525
4526      if (extrasReadable) {
4527        summaryHtml += '<div style="margin-top:8px;font-size:13px;line-height:1.4;"><strong>Extra’s:</strong> ' + extrasReadable + '</div>';
4528      }
4529
4530      els.step2Summary.innerHTML = summaryHtml;
4531
4532      if (state.calcDate && !els.contactDate.value) {
4533        els.contactDate.value = state.calcDate;
4534      }
4535
4536      els.step1.classList.remove('active');
4537      els.step2.classList.add('active');
4538      els.progress1.classList.remove('active');
4539      els.progress2.classList.add('active');
4540    });
4541
4542    els.prevStep.addEventListener('click', function () {
4543      els.step2.classList.remove('active');
4544      els.step1.classList.add('active');
4545      els.progress2.classList.remove('active');
4546      els.progress1.classList.add('active');
4547    });
4548
4549    if (els.form.dataset.submitBound === 'yes') return;
4550    els.form.dataset.submitBound = 'yes';
4551
4552    els.form.addEventListener('submit', function (e) {
4553      e.preventDefault();
4554      e.stopPropagation();
4555
4556      if (isSubmitting || formWasSubmitted) return;
4557
4558      function getHiddenValue(id) {
4559        const el = root.querySelector('#' + id);
4560        return el ? el.value : '';
4561      }
4562
4563      if (!els.contactName.value.trim()) {
4564        els.step2Error.textContent = 'Vul je volledige naam in.';
4565        return;
4566      }
4567
4568      if (!els.contactEmail.value.trim()) {
4569        els.step2Error.textContent = 'Vul je e-mailadres in.';
4570        return;
4571      }
4572
4573      if (!els.contactPhone.value.trim()) {
4574        els.step2Error.textContent = 'Vul je telefoonnummer in.';
4575        return;
4576      }
4577
4578      if (!els.contactDate.value) {
4579        els.step2Error.textContent = 'Kies een gewenste datum.';
4580        return;
4581      }
4582
4583      if (!els.contactStarttime.value) {
4584        els.step2Error.textContent = 'Kies een gewenste starttijd.';
4585        return;
4586      }
4587
4588      if (!els.contactOccasion.value) {
4589        els.step2Error.textContent = 'Kies een gelegenheid.';
4590        return;
4591      }
4592
4593      if (needsGroupComposition(els.contactOccasion.value) && !els.contactGroup.value) {
4594        els.step2Error.textContent = 'Kies de samenstelling van het gezelschap.';
4595        return;
4596      }
4597
4598      if (!els.contactTerms.checked) {
4599        els.step2Error.textContent = 'Bevestig dat je akkoord gaat met de algemene voorwaarden.';
4600        return;
4601      }
4602
4603      els.step2Error.textContent = '';
4604      els.submitStatus.innerHTML = '<div class="db-success">Aanvraag wordt verzonden...</div>';
4605
4606      setSubmitBusy(true);
4607
4608      const hiddenDuur = getHiddenValue('hidden_calc_duur');
4609      const hiddenEffectieveDuur = getHiddenValue('hidden_calc_effectieve_duur');
4610
4611      const payload = {
4612        volledige_naam: els.contactName.value.trim(),
4613        telefoonnummer: els.contactPhone.value.trim(),
4614        emailadres: els.contactEmail.value.trim(),
4615        bedrijfsnaam: els.contactCompany.value.trim() || 'NVT',
4616        datum: els.contactDate.value,
4617        starttijd: els.contactStarttime.value,
4618        gelegenheid: els.contactOccasion.value,
4619        samenstelling_gezelschap: els.contactGroup.value || '',
4620        opmerkingen: els.contactNotes.value.trim(),
4621        arrangement: getHiddenValue('hidden_calc_arrangement'),
4622        arrangement_key: getHiddenValue('hidden_calc_arrangement_key'),
4623        personen: getHiddenValue('hidden_calc_personen'),
4624        duur: hiddenDuur ? hiddenDuur + ' uur' : '',
4625        effectieve_duur: hiddenEffectieveDuur ? hiddenEffectieveDuur + ' uur' : '',
4626        boottype: getHiddenValue('hidden_calc_boot_type'),
4627        zone: getHiddenValue('hidden_calc_zone'),
4628        zaterdag: getHiddenValue('hidden_calc_is_zaterdag'),
4629        totaalprijs: getHiddenValue('hidden_calc_prijs_totaal') ? '€' + getHiddenValue('hidden_calc_prijs_totaal') : '',
4630        prijs_per_persoon: getHiddenValue('hidden_calc_prijs_pp'),
4631        extras: buildExtrasReadable(),
4632        samenvatting: getHiddenValue('hidden_calc_samenvatting'),
4633        price_lines_json: getHiddenValue('hidden_calc_price_lines_json'),
4634        calc_json: getHiddenValue('hidden_calc_json'),
4635        hapjes_keuze: getHiddenValue('hidden_calc_hapjes_keuze'),
4636        warme_hapjes: getHiddenValue('hidden_calc_hapjes'),
4637        warme_hapjes_type: getHiddenValue('hidden_calc_hapjes_type'),
4638        borrelplank: getHiddenValue('hidden_calc_borrelplank'),
4639        dessert: getHiddenValue('hidden_calc_dessert'),
4640        gids: getHiddenValue('hidden_calc_gids'),
4641        bbq_halal: getHiddenValue('hidden_calc_bbq_halal')
4642      };
4643
4644      try {
4645        payload.price_lines = JSON.parse(payload.price_lines_json || '[]');
4646        payload.prijsregels = payload.price_lines;
4647      } catch (err) {
4648        payload.price_lines = [];
4649        payload.prijsregels = [];
4650      }
4651
4652      fetch('/wp-json/domstadboot/v1/aanvraag', {
4653        method: 'POST',
4654        headers: {
4655          'Content-Type': 'application/json'
4656        },
4657        body: JSON.stringify(payload)
4658      })
4659      .then(function (response) {
4660        return response.json();
4661      })
4662      .then(function (data) {
4663        if (data && data.success && data.mail_sent) {
4664          const totalValue = Number(getHiddenValue('hidden_calc_prijs_totaal') || 0) || 0;
4665
4666          window.dataLayer = window.dataLayer || [];
4667          window.dataLayer.push({
4668            event: 'domstadboot_form_success',
4669            form_name: 'aanvraagformulier',
4670            value: totalValue,
4671            currency: 'EUR',
4672            offerte_totaal: totalValue,
4673            arrangement: payload.arrangement_key || payload.arrangement || '',
4674            personen: Number(payload.personen) || 0,
4675            boottype: payload.boottype || '',
4676            duur: payload.effectieve_duur || payload.duur || ''
4677          });
4678
4679          disableEntireFormAfterSuccess();
4680          showBigSuccessMessage();
4681        } else {
4682          els.submitStatus.innerHTML = '<div class="db-error">De aanvraag kon niet goed worden verzonden. Probeer het opnieuw.</div>';
4683          setSubmitBusy(false);
4684        }
4685      })
4686      .catch(function () {
4687        els.submitStatus.innerHTML = '<div class="db-error">Er ging iets mis bij het verzenden. Probeer het opnieuw.</div>';
4688        setSubmitBusy(false);
4689      });
4690    });
4691
4692    renderPersonOptions();
4693    updateGroupCompositionVisibility();
4694    recalculate();
4695  }
4696
4697  // ГЛАВНОЕ ИЗМЕНЕНИЕ 4: инициализируем КАЖДУЮ копию формы на странице.
4698  // Скрытую копию (закрытый попап) поднимаем только когда она станет видимой.
4699  function initFlow(root) {
4700    if (!root || root.dataset.dbFlowInit === 'yes') return;
4701
4702    const popupContainer = root.closest('.dialog-widget, .elementor-popup-modal, .elementor-location-popup');
4703    const rootVisible = root.offsetParent !== null;
4704    const popupVisible = popupContainer ? popupContainer.offsetParent !== null : true;
4705
4706    if (!rootVisible || !popupVisible) return;
4707
4708    createPopupFlow(root);
4709  }
4710
4711  // querySelectorAll('#id') возвращает ВСЕ элементы с этим id
4712  // (в отличие от getElementById, который брал только первый).
4713  function initAllFlows() {
4714    document.querySelectorAll('#domstadboot-popup-flow').forEach(initFlow);
4715  }
4716
4717  window.addEventListener('elementor/popup/show', function () {
4718    setTimeout(initAllFlows, 50);
4719    setTimeout(initAllFlows, 200);
4720    setTimeout(initAllFlows, 500);
4721  });
4722
4723  window.addEventListener('load', function () {
4724    setTimeout(initAllFlows, 300);
4725  });
4726
4727  // Встроенная (видимая) копия поднимается сразу, не дожидаясь события попапа.
4728  if (document.readyState === 'loading') {
4729    document.addEventListener('DOMContentLoaded', initAllFlows);
4730  } else {
4731    initAllFlows();
4732  }
4733})();
4734</script>
4734				</div>
4735				</div>
4736					</div>
4737		</div>
4738					</div>
4739		</section>
4740				</div>
4741		<!-- FareHarbor plugin activated -->
4741<script src="https://fareharbor.com/embeds/api/v1/?autolightframe=yes"></script>
4741<!-- Instagram Feed JS -->
4742<script type="text/javascript">
4743var sbiajaxurl = "https://domstadboot.nl/wp-admin/admin-ajax.php";
4744</script>
4744
4745			
4745<script>
4746				const lazyloadRunObserver = () => {
4747					const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` );
4748					const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => {
4749						entries.forEach( ( entry ) => {
4750							if ( entry.isIntersecting ) {
4751								let lazyloadBackground = entry.target;
4752								if( lazyloadBackground ) {
4753									lazyloadBackground.classList.add( 'e-lazyloaded' );
4754								}
4755								lazyloadBackgroundObserver.unobserve( entry.target );
4756							}
4757						});
4758					}, { rootMargin: '200px 0px 200px 0px' } );
4759					lazyloadBackgrounds.forEach( ( lazyloadBackground ) => {
4760						lazyloadBackgroundObserver.observe( lazyloadBackground );
4761					} );
4762				};
4763				const events = [
4764					'DOMContentLoaded',
4765					'elementor/lazyload/observe',
4766				];
4767				events.forEach( ( event ) => {
4768					document.addEventListener( event, lazyloadRunObserver );
4769				} );
4770			</script>
4770
4771			<link rel='stylesheet' id='elementor-post-6818-css' href='https://domstadboot.nl/wp-content/uploads/elementor/css/post-6818.css?ver=1788179079' media='all' />
4772<link rel='stylesheet' id='e-animation-fadeIn-css' href='https://domstadboot.nl/wp-content/plugins/elementor/assets/lib/animations/styles/fadeIn.min.css?ver=4.0.1' media='all' />
4773<link rel='stylesheet' id='e-popup-css' href='https://domstadboot.nl/wp-content/plugins/elementor-pro/assets/css/conditionals/popup.min.css?ver=3.32.2' media='all' />
4774<script id="ht_ctc_app_js-js-extra">
4775var ht_ctc_chat_var = {"number":"31618426144","pre_filled":"Ahoy! \r\n\r\nMijn naam is:\r\nGewenste datum: \r\nAantal personen:\r\nAantal uur: \r\nGewenste tijdstip: \r\nVraag:","dis_m":"hide","dis_d":"hide","css":"cursor: pointer; z-index: 99999999;","pos_d":"position: fixed; bottom: 15px; right: 15px;","pos_m":"position: fixed; bottom: 15px; right: 15px;","side_d":"right","side_m":"right","schedule":"no","se":"150","ani":"no-animation","page_id":"3265","url_structure_d":"web","url_target_d":"_blank","ga":"yes","gtm":"1","fb":"yes","display":"no","webhook_format":"json","g_init":"default","g_an_event_name":"chat: {number}","gtm_event_name":"Click to Chat","pixel_event_name":"Click to Chat by HoliThemes"};
4776var ht_ctc_variables = {"g_an_event_name":"chat: {number}","gtm_event_name":"Click to Chat","pixel_event_type":"trackCustom","pixel_event_name":"Click to Chat by HoliThemes","g_an_params_v4":[{"key":"event_category","value":"Click to Chat for WhatsApp"},{"key":"event_label","value":"{title}, {url}"}],"g_an_params":["g_an_param_1","g_an_param_2"],"g_an_param_1":{"key":"event_category","value":"Click to Chat for WhatsApp"},"g_an_param_2":{"key":"event_label","value":"{title}, {url}"},"pixel_params_v4":[{"key":"Category","value":"Click to Chat for WhatsApp"},{"key":"ID","value":"{number}"},{"key":"Title","value":"{title}"},{"key":"URL","value":"{url}"}],"pixel_params":["pixel_param_1","pixel_param_2","pixel_param_3","pixel_param_4"],"pixel_param_1":{"key":"Category","value":"Click to Chat for WhatsApp"},"pixel_param_2":{"key":"ID","value":"{number}"},"pixel_param_3":{"key":"Title","value":"{title}"},"pixel_param_4":{"key":"URL","value":"{url}"},"gtm_params_v4":[{"key":"type","value":"chat"},{"key":"number","value":"{number}"},{"key":"title","value":"{title}"},{"key":"url","value":"{url}"},{"key":"ref","value":"dataLayer push"}],"gtm_params":["gtm_param_1","gtm_param_2","gtm_param_3","gtm_param_4","gtm_param_5"],"gtm_param_1":{"key":"type","value":"chat"},"gtm_param_2":{"key":"number","value":"{number}"},"gtm_param_3":{"key":"title","value":"{title}"},"gtm_param_4":{"key":"url","value":"{url}"},"gtm_param_5":{"key":"ref","value":"dataLayer push"}};
4777//# sourceURL=ht_ctc_app_js-js-extra
4778</script>
vendor: 1 bytes, line 4778
4778
4779<script data-wp-strategy="defer" defer id="ht_ctc_app_js-js" src="https://domstadboot.nl/wp-content/plugins/click-to-chat-for-whatsapp/new/inc/assets/js/app.js?ver=4.43"></script>
vendor: 1 bytes, line 4779
4779
4780<script id="gtm4wp-form-move-tracker-js" src="https://domstadboot.nl/wp-content/plugins/duracelltomi-google-tag-manager/dist/js/gtm4wp-form-move-tracker.js?ver=1.22.3"></script>
vendor: 1 bytes, line 4780
4780
4781<script id="hello-theme-frontend-js" src="https://domstadboot.nl/wp-content/themes/hello-elementor/assets/js/hello-frontend.min.js?ver=3.0.1"></script>
vendor: 1 bytes, line 4781
4781
4782<script id="elementor-webpack-runtime-js" src="https://domstadboot.nl/wp-content/plugins/elementor/assets/js/webpack.runtime.min.js?ver=4.0.1"></script>
vendor: 1 bytes, line 4782
4782
4783<script id="elementor-frontend-modules-js" src="https://domstadboot.nl/wp-content/plugins/elementor/assets/js/frontend-modules.min.js?ver=4.0.1"></script>
vendor: 1 bytes, line 4783
4783
4784<script id="jquery-ui-core-js-before">
4785jQuery.uiBackCompat = true;
4786//# sourceURL=jquery-ui-core-js-before
4787</script>
vendor: 1 bytes, line 4787
4787
4788<script id="jquery-ui-core-js" src="https://domstadboot.nl/wp-includes/js/jquery/ui/core.min.js?ver=1.14.2"></script>
vendor: 1 bytes, line 4788
4788
4789<script id="elementor-frontend-js-before">
4790var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Deel via Facebook","shareOnTwitter":"Deel via Twitter","pinIt":"Pin dit","download":"Downloaden","downloadImage":"Download afbeelding","fullscreen":"Volledig scherm","zoom":"Zoom","share":"Delen","playVideo":"Video afspelen","previous":"Vorige","next":"Volgende","close":"Sluiten","a11yCarouselPrevSlideMessage":"Vorige slide","a11yCarouselNextSlideMessage":"Volgende slide","a11yCarouselFirstSlideMessage":"Ga naar de eerste slide","a11yCarouselLastSlideMessage":"Ga naar de laatste slide","a11yCarouselPaginationBulletMessage":"Ga naar slide"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobiel portret","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobiel landschap","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet portret","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet landschap","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Breedbeeld","value":2400,"default_value":2400,"direction":"min","is_enabled":false}},"hasCustomBreakpoints":false},"version":"4.0.1","is_static":false,"experimentalFeatures":{"additional_custom_breakpoints":true,"theme_builder_v2":true,"hello-theme-header-footer":true,"global_classes_should_enforce_capabilities":true,"e_variables":true,"e_opt_in_v4_page":true,"e_components":true,"e_interactions":true,"e_widget_creation":true,"import-export-customization":true,"e_pro_variables":true},"urls":{"assets":"https:\/\/domstadboot.nl\/wp-content\/plugins\/elementor\/assets\/","ajaxurl":"https:\/\/domstadboot.nl\/wp-admin\/admin-ajax.php","uploadUrl":"https:\/\/domstadboot.nl\/wp-content\/uploads"},"nonces":{"floatingButtonsClickTracking":"74f779941f","atomicFormsSendForm":"d5b29d953b"},"swiperClass":"swiper","settings":{"page":[],"editorPreferences":[]},"kit":{"active_breakpoints":["viewport_mobile","viewport_tablet"],"global_image_lightbox":"yes","lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description","hello_header_logo_type":"logo","hello_header_menu_layout":"horizontal","hello_footer_logo_type":"logo"},"post":{"id":3265,"title":"Domstadboot%20-%20contact%20%7C%20Voor%20al%20uw%20vragen%20%7C%20Domstadboot","excerpt":"","featuredImage":false}};
4791//# sourceURL=elementor-frontend-js-before
4792</script>
vendor: 1 bytes, line 4792
4792
4793<script id="elementor-frontend-js" src="https://domstadboot.nl/wp-content/plugins/elementor/assets/js/frontend.min.js?ver=4.0.1"></script>
vendor: 1 bytes, line 4793
4793
4794<script id="smartmenus-js" src="https://domstadboot.nl/wp-content/plugins/elementor-pro/assets/lib/smartmenus/jquery.smartmenus.min.js?ver=1.2.1"></script>
vendor: 1 bytes, line 4794
4794
4795<script id="googlesitekit-events-provider-optin-monster-js" src="https://domstadboot.nl/wp-content/plugins/google-site-kit/dist/assets/js/googlesitekit-events-provider-optin-monster-a55d3b3fec7811cde2bc.js" defer></script>
vendor: 132 bytes, lines 4795-4796
4795
4796<script id="elementor-recaptcha_v3-api-js" src="https://www.google.com/recaptcha/api.js?render=explicit&#038;ver=3.32.2"></script>
4797<script id="elementor-pro-webpack-runtime-js" src="https://domstadboot.nl/wp-content/plugins/elementor-pro/assets/js/webpack-pro.runtime.min.js?ver=3.32.2"></script>
vendor: 1 bytes, line 4797
4797
4798<script id="wp-hooks-js" src="https://domstadboot.nl/wp-includes/js/dist/hooks.min.js?ver=f0f188028580e8dc1255"></script>
vendor: 1 bytes, line 4798
4798
4799<script id="wp-i18n-js" src="https://domstadboot.nl/wp-includes/js/dist/i18n.min.js?ver=1dfe7db3940c23ea9216"></script>
vendor: 1 bytes, line 4799
4799
4800<script id="wp-i18n-js-after">
4801wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } );
4802//# sourceURL=wp-i18n-js-after
4803</script>
vendor: 1 bytes, line 4803
4803
4804<script id="elementor-pro-frontend-js-before">
4805var ElementorProFrontendConfig = {"ajaxurl":"https:\/\/domstadboot.nl\/wp-admin\/admin-ajax.php","nonce":"64fb071dae","urls":{"assets":"https:\/\/domstadboot.nl\/wp-content\/plugins\/elementor-pro\/assets\/","rest":"https:\/\/domstadboot.nl\/wp-json\/"},"settings":{"lazy_load_background_images":true},"popup":{"hasPopUps":true},"shareButtonsNetworks":{"facebook":{"title":"Facebook","has_counter":true},"twitter":{"title":"Twitter"},"linkedin":{"title":"LinkedIn","has_counter":true},"pinterest":{"title":"Pinterest","has_counter":true},"reddit":{"title":"Reddit","has_counter":true},"vk":{"title":"VK","has_counter":true},"odnoklassniki":{"title":"OK","has_counter":true},"tumblr":{"title":"Tumblr"},"digg":{"title":"Digg"},"skype":{"title":"Skype"},"stumbleupon":{"title":"StumbleUpon","has_counter":true},"mix":{"title":"Mix"},"telegram":{"title":"Telegram"},"pocket":{"title":"Pocket","has_counter":true},"xing":{"title":"XING","has_counter":true},"whatsapp":{"title":"WhatsApp"},"email":{"title":"Email"},"print":{"title":"Print"},"x-twitter":{"title":"X"},"threads":{"title":"Threads"}},"facebook_sdk":{"lang":"nl_NL","app_id":""},"lottie":{"defaultAnimationUrl":"https:\/\/domstadboot.nl\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}};
4806//# sourceURL=elementor-pro-frontend-js-before
4807</script>
vendor: 1 bytes, line 4807
4807
4808<script id="elementor-pro-frontend-js" src="https://domstadboot.nl/wp-content/plugins/elementor-pro/assets/js/frontend.min.js?ver=3.32.2"></script>
vendor: 1 bytes, line 4808
4808
4809<script id="pro-elements-handlers-js" src="https://domstadboot.nl/wp-content/plugins/elementor-pro/assets/js/elements-handlers.min.js?ver=3.32.2"></script>
vendor: 1 bytes, line 4809
4809
4810<script id="wp-emoji-settings" type="application/json">
4811{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://domstadboot.nl/wp-includes/js/wp-emoji-release.min.js?ver=7.1"}}
4812</script>
vendor: 1 bytes, line 4812
4812
4813<script type="module">
4814/*! This file is auto-generated */
4815var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});
4816//# sourceURL=https://domstadboot.nl/wp-includes/js/wp-emoji-loader.min.js
4817</script>
4817
4818
4819<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":"693bc75b6ee24bff9e803524d25af32c","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 4819
4819
4820<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a468c7d9fd674f55',t:'MTc5MTMzMjg1Mg=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
4820</body>
4821</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.