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 » feed" href="https://domstadboot.nl/feed/" /> 28<link rel="alternate" type="application/rss+xml" title="Domstadboot » 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&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="{"background_background":"classic"}"> 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="{"background_background":"classic"}"> 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 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&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="{"background_background":"classic"}"> 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="{"background_background":"classic"}"> 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="{"full_width":"stretch","layout":"horizontal","submenu_icon":{"value":"<i class=\"fas fa-caret-down\" aria-hidden=\"true\"><\/i>","library":"fa-solid"},"toggle":"burger"}" 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="{"_animation":"zoomIn","_animation_delay":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="{"background_background":"classic"}"> 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 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="{"step_next_label":"Volgende","step_previous_label":"Vorige","button_width":"100","step_type":"number_text","step_icon_shape":"circle"}" 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()#&+*-=.]+" 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="{"background_background":"classic"}"> 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="{"background_background":"classic"}"> 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&q=Domstadboot&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&g_ep=EgoyMDI2MDQwNS4wIKXMDSoASAFQAw%3D%3D" > 2343 Adres Dinertochten & 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="{"background_background":"classic"}"> 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 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="{"background_background":"classic"}"> 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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="{"entrance_animation":"fadeIn","entrance_animation_duration":{"unit":"px","size":1,"sizes":[]},"open_selector":"a[href=\"#pricecalculatorpopup\"]","a11y_navigation":"yes","timing":[]}" 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 & prijs</div> 3044 <div id="db-progress-2" class="db-progress-item">2. Gegevens & 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&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.