{"id":57290,"date":"2026-09-09T11:04:04","date_gmt":"2026-09-09T09:04:04","guid":{"rendered":"https:\/\/triptherapie.nl\/?page_id=57290"},"modified":"2026-09-11T23:28:17","modified_gmt":"2026-09-11T21:28:17","slug":"pricing-for-on-site-session","status":"publish","type":"page","link":"https:\/\/triptherapie.nl\/en\/prijsberekening-sessie-op-locatie\/","title":{"rendered":"On-site price calculation session"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"57290\" class=\"elementor elementor-57290\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2cd8a5c e-con-full e-flex e-con e-parent\" data-id=\"2cd8a5c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-8f5f951 e-con-full e-flex e-con e-child\" data-id=\"8f5f951\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5b35a0b elementor-widget elementor-widget-menu-anchor\" data-id=\"5b35a0b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"menu-anchor.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-menu-anchor\" id=\"bereken\"><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-85e64e4 elementor-widget elementor-widget-heading\" data-id=\"85e64e4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\" class=\"elementor-heading-title elementor-size-default\" id=\"prijsberekening-sessie-op-locatie\">Prijsberekening sessie op locatie<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ccec76f elementor-widget elementor-widget-text-editor\" data-id=\"ccec76f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p style=\"text-align: center;\">Reken hier eenvoudig uit wat de prijs is voor een priv\u00e9 psychedelische sessie voor \u00e9\u00e9n tot drie deelnemers op jouw eigen of op \u00e9\u00e9n van onze locaties. Bij sessies op de locaties van Triptherapie is altijd \u00e9\u00e9n overnachting plus eten en drinken inbegrepen.<\/p><p style=\"text-align: center;\">Witte tekst: De begeleider werkt op jouw locatie.<br \/><span style=\"color: #ff6600;\">Oranje tekst<\/span>: De begeleider woont net buiten jouw werkgebied, maar in overleg lukt het vaak wel.<br \/><span style=\"color: #ff0000;\">Rode tekst<\/span>: Je woont te ver weg. Overweeg om een accommodatie dichterbij te huren, een andere begeleider of deelname aan een <span style=\"color: #cc99ff;\"><a style=\"color: #cc99ff;\" href=\"https:\/\/triptherapie.nl\/groepssessies\/#agenda-open-groep-ceremonies\">groepsceremonie op \u00e9\u00e9n van onze locaties<\/a><\/span>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2ae879c elementor-widget elementor-widget-text-editor\" data-id=\"2ae879c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h3 style=\"text-align: center;\" style=\"text-align: center;\" id=\"voer-uw-gewenste-locatie-in\">Voer uw gewenste locatie in:<\/h3>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-db0a7b7 elementor-widget elementor-widget-html\" data-id=\"db0a7b7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\"\/>\n  <style>\n    html, body { height: 100%; margin: 0; padding: 0; }\n\n    #distance-tool {\n      margin: 20px auto;\n      padding: 0 10px;\n      max-width: 1200px;\n    }\n\n    .input-container {\n      display: flex;\n      align-items: center;\n      margin-bottom: 20px;\n      gap: 16px;\n      flex-wrap: wrap;\n    }\n\n    .input-container input,\n    .input-container button {\n      box-sizing: border-box;\n      height: 52px;\n      font-size: 17px;\n    }\n\n    .input-container input {\n      flex: 1;\n      min-width: 260px;\n      padding: 8px 16px;\n    }\n\n    .calculate-btn {\n      padding: 8px 22px;\n      color: white;\n      background-color: #b20091;\n      border: none;\n      cursor: pointer;\n    }\n\n    .calculate-btn:hover {\n      opacity: 0.92;\n    }\n\n    .content-container {\n      display: flex;\n      flex-direction: column;\n      gap: 20px;\n    }\n\n    .left-column,\n    .right-column {\n      width: 100%;\n    }\n\n    @media (min-width: 768px) {\n      .content-container {\n        flex-direction: row;\n        align-items: flex-start;\n      }\n\n      .left-column {\n        flex: 1.15;\n        min-width: 0;\n      }\n\n      .right-column {\n        flex: 0.85;\n        min-width: 0;\n      }\n    }\n\n    .person-controls {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      gap: 8px;\n      margin: 0 0 18px 0;\n      text-align: center;\n    }\n\n    .map-controls {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      gap: 8px;\n      margin: 0 0 18px 0;\n      text-align: center;\n    }\n\n    .toggle-label {\n      font-weight: 700;\n      color: inherit;\n    }\n\n    .toggle-group {\n      display: inline-flex;\n      flex-wrap: wrap;\n      justify-content: center;\n      gap: 10px;\n    }\n\n    .toggle-group input[type=\"radio\"] {\n      position: absolute;\n      opacity: 0;\n      pointer-events: none;\n    }\n\n    .toggle-option {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      min-height: 42px;\n      min-width: 125px;\n      padding: 8px 14px;\n      border: none;\n      background-color: black;\n      color: white;\n      cursor: pointer;\n      user-select: none;\n      font-size: 16px;\n      line-height: 1.2;\n      transition: opacity 0.2s ease;\n      box-sizing: border-box;\n      text-align: center;\n    }\n\n    .toggle-option:hover {\n      opacity: 0.92;\n    }\n\n    .toggle-group input[type=\"radio\"]:checked + .toggle-option {\n      background-color: #7d0066;\n      color: white;\n    }\n\n    #results {\n      margin-top: 0;\n    }\n\n    .dropdown {\n      position: relative;\n      display: inline-flex;\n      align-items: center;\n      cursor: pointer;\n    }\n\n    .dropdown-content {\n      display: none;\n      position: fixed;\n      background-color: white;\n      box-shadow: 0 8px 16px rgba(0,0,0,0.2);\n      z-index: 999999;\n      min-width: 220px;\n      border-radius: 5px;\n      padding: 5px;\n      gap: 5px;\n      flex-direction: row;\n      align-items: stretch;\n    }\n\n    .dropdown-content a {\n      color: black;\n      padding: 10px;\n      text-decoration: none;\n      display: inline-block;\n      white-space: nowrap;\n      border-radius: 4px;\n    }\n\n    .dropdown-content a:hover {\n      background-color: #f1f1f1;\n    }\n\n    .strike td {\n      color: red;\n      text-decoration: line-through;\n    }\n\n    .table-container {\n      width: 100%;\n      overflow-x: auto;\n      margin-bottom: 18px;\n    }\n\n    #map {\n      width: 100%;\n      height: 340px;\n      margin-top: 0;\n      position: relative;\n      top: 0;\n    }\n\n    .explanation-row {\n      margin-top: 24px;\n    }\n\n    .explanation-toggle {\n      width: 100%;\n      background: linear-gradient(90deg, #00000050 0%, #0000004d 100%) !important;\n      color: white;\n      border: none;\n      padding: 12px 16px;\n      font-size: 17px;\n      text-align: left;\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      box-sizing: border-box;\n    }\n\n    .explanation-toggle:hover {\n      opacity: 0.92;\n    }\n\n    .explanation-toggle .icon {\n      transition: transform 0.2s ease;\n    }\n\n    .explanation-toggle.active .icon {\n      transform: rotate(180deg);\n    }\n\n    .explanation-content {\n      display: none;\n      border: 1px solid #222;\n      border-top: none;\n      padding: 18px;\n      background: black;\n      color: white;\n      line-height: 1.6;\n    }\n\n    .explanation-content.open {\n      display: block;\n    }\n\n    .explanation-content h2 {\n      margin: 0 0 12px 0;\n      font-size: 24px;\n      color: #f5f5f5;\n    }\n\n    .explanation-content h3 {\n      margin: 22px 0 10px 0;\n      font-size: 20px;\n      color: #f5f5f5;\n    }\n\n    .explanation-content p {\n      margin: 0 0 14px 0;\n    }\n\n    .explanation-content a {\n      color: #ff66d9;\n    }\n\n    @media (max-width: 1024px) {\n      .input-container {\n        gap: 10px;\n        margin-bottom: 16px;\n      }\n\n      .input-container input,\n      .input-container button {\n        height: 46px;\n        font-size: 16px;\n      }\n\n      .input-container input {\n        padding: 6px 12px;\n      }\n\n      .calculate-btn {\n        padding: 6px 18px;\n      }\n\n      .toggle-group {\n        gap: 8px;\n      }\n\n      .toggle-option {\n        min-width: 100px;\n        min-height: 36px;\n        padding: 6px 10px;\n        font-size: 14px;\n      }\n\n      .explanation-toggle {\n        font-size: 16px;\n      }\n    }\n\n    @media (max-width: 600px) {\n      .table-container table td,\n      .table-container table th {\n        padding: calc(5px * 0.75) !important;\n      }\n\n      .input-container {\n        gap: 8px;\n        margin-bottom: 14px;\n      }\n\n      .input-container input,\n      .input-container button {\n        height: 42px;\n        font-size: 15px;\n      }\n\n      .input-container input {\n        padding: 6px 10px;\n        min-width: 0;\n      }\n\n      .calculate-btn {\n        padding: 6px 14px;\n      }\n\n      .toggle-group {\n        gap: 6px;\n      }\n\n      .toggle-option {\n        min-width: 88px;\n        min-height: 34px;\n        padding: 6px 9px;\n        font-size: 13px;\n      }\n\n      .toggle-label {\n        font-size: 15px;\n      }\n\n      .explanation-content {\n        padding: 14px;\n      }\n\n      .explanation-content h2 {\n        font-size: 21px;\n      }\n\n      .explanation-content h3 {\n        font-size: 18px;\n      }\n    }\n  <\/style>\n<\/head>\n\n<body>\n  <div id=\"distance-tool\">\n    <div class=\"input-container\">\n      <label for=\"startLocation\" style=\"display:none;\"><\/label>\n      <input type=\"text\" id=\"startLocation\" placeholder=\"Bijv. Amsterdam\">\n      <button id=\"calculateBtn\" class=\"calculate-btn\">Bereken<\/button>\n    <\/div>\n\n    <div class=\"content-container\">\n      <div class=\"left-column\">\n        <div class=\"person-controls\">\n          <div class=\"toggle-label\">Aantal personen:<\/div>\n          <div class=\"toggle-group\" id=\"personCountGroup\">\n            <input type=\"radio\" name=\"personCount\" id=\"persons1\" value=\"1\" checked>\n            <label class=\"toggle-option\" for=\"persons1\">E\u00e9n<\/label>\n\n            <input type=\"radio\" name=\"personCount\" id=\"persons2\" value=\"2\">\n            <label class=\"toggle-option\" for=\"persons2\">Twee<\/label>\n\n            <input type=\"radio\" name=\"personCount\" id=\"persons3\" value=\"3\">\n            <label class=\"toggle-option\" for=\"persons3\">Drie<\/label>\n          <\/div>\n        <\/div>\n\n        <div id=\"results\"><\/div>\n      <\/div>\n\n      <div class=\"right-column\">\n        <div class=\"map-controls\">\n          <div class=\"toggle-label\">Kaartweergave:<\/div>\n          <div class=\"toggle-group\" id=\"sessionTypeGroup\">\n            <input type=\"radio\" name=\"sessionType\" id=\"mapOwn\" value=\"own\" checked>\n            <label class=\"toggle-option\" for=\"mapOwn\">Eigen locatie<\/label>\n\n            <input type=\"radio\" name=\"sessionType\" id=\"mapLocation\" value=\"location\">\n            <label class=\"toggle-option\" for=\"mapLocation\">Triptherapie locatie<\/label>\n          <\/div>\n        <\/div>\n\n        <div id=\"map\"><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"explanation-row\">\n      <button id=\"explanationToggle\" class=\"explanation-toggle\" type=\"button\" aria-expanded=\"false\">\n        <span>Uitleg gebruik rekentool<\/span>\n        <span class=\"icon\"><i class=\"fa-solid fa-chevron-down\"><\/i><\/span>\n      <\/button>\n\n      <div id=\"explanationContent\" class=\"explanation-content\">\n        <h2 id=\"uitleg-van-alle-mogelijkheden-binnen-deze-keuzehulp\">Uitleg van alle mogelijkheden binnen deze keuzehulp<\/h2>\n\n        <p>Deze tool is bedoeld om snel inzicht te geven in de verschillende manieren waarop een sessie via Triptherapie kan worden ingepland. De tool combineert drie dingen in \u00e9\u00e9n overzicht. Je kunt het aantal personen kiezen, je kunt een startlocatie invoeren om afstanden en reistijden te laten berekenen, en je kunt wisselen tussen kaartweergave voor sessies op eigen locatie of sessies op een Triptherapie-locatie. Daardoor krijg je niet alleen een prijsindicatie, maar ook direct een praktisch beeld van welke begeleiders of locaties het meest logisch zijn.<\/p>\n\n        <p>De opbouw is als volgt. Links zie je de keuze voor het aantal personen en daaronder de twee tabellen. In de eerste tabel staan de begeleiders voor sessies op eigen locatie. In de tweede tabel staan de vaste Triptherapie-locaties. Rechts zie je de kaart. Met de kaartweergave kies je of je op de kaart de begeleiders of juist de locaties wilt zien. De tabellen blijven zichtbaar, zodat je beide soorten opties altijd naast elkaar kunt vergelijken.<\/p>\n\n        <h3 id=\"startlocatie-invoeren-en-berekenen\">Startlocatie invoeren en berekenen<\/h3>\n        <p>Bovenaan vul je een plaats of adres in, bijvoorbeeld Amsterdam. Daarna druk je op de knop Bereken. De tool gebruikt die invoer om twee soorten informatie te tonen.<\/p>\n\n        <p>Bij de begeleiders op eigen locatie wordt gekeken naar afstand, reistijd, reiskosten en het totaalbedrag. Daardoor zie je niet alleen wie beschikbaar of logisch is qua werkgebied, maar ook wat dat financieel betekent.<\/p>\n\n        <p>Bij de Triptherapie-locaties wordt gekeken naar de afstand en reistijd vanaf jouw ingevoerde locatie naar de gekozen vaste locatie. Daar komt geen extra reiskostenberekening voor de begeleider bovenop, want het gaat dan om een sessie op een vaste plek van Triptherapie.<\/p>\n\n        <p>Als je geen startlocatie invult, toont de tool nog steeds alle begeleiders en alle locaties met hun basisprijzen voor het gekozen aantal personen. Zodra je wel een locatie invult, worden de berekeningen toegevoegd.<\/p>\n\n        <h3 id=\"aantal-personen\">Aantal personen<\/h3>\n        <p>De optie Aantal personen staat boven de tabellen in de linkerkolom. Daarmee bepaal je voor hoeveel mensen de prijs wordt berekend. De tool rekent met drie keuzes.<\/p>\n\n        <p>Bij 1 persoon geldt de basisprijs.<\/p>\n        <p>Bij 2 personen wordt er 500 euro toegevoegd aan de basisprijs.<\/p>\n        <p>Bij 3 personen wordt er in totaal 1000 euro toegevoegd aan de basisprijs.<\/p>\n\n        <p>Dat betekent dat de tool automatisch meebeweegt als je wisselt tussen \u00e9\u00e9n, twee of drie personen. Zowel de begeleiderstabel als de locatietabel worden dan opnieuw berekend. Zo zie je meteen wat het verschil is tussen een individuele sessie, een duo-sessie of een sessie voor drie personen met \u00e9\u00e9n begeleider.<\/p>\n\n        <h3 id=\"sessie-op-eigen-accommodatie\">Sessie op eigen accommodatie<\/h3>\n        <p>Wanneer je kijkt naar de begeleiders, gaat het om sessies op een locatie van de klant. Dat kan bijvoorbeeld thuis zijn, in een hotel, in een Airbnb of in een andere geschikte priv\u00e9omgeving. In de tabel zie je per begeleider de woonplaats, of na berekening de afstand, reiskosten, reistijd en het totaalbedrag.<\/p>\n\n        <p>De tool houdt hier ook rekening met praktische grenzen. Sommige begeleiders zijn sneller inzetbaar binnen een groter gebied, terwijl voor anderen de maximale reistijd beperkter is. Daardoor zie je soms begeleiders in normale tekst, soms in oranje, en soms doorgestreept in rood. Dat helpt om onderscheid te maken tussen goed passend, nog net mogelijk of praktisch minder geschikt.<\/p>\n\n        <p>Deze tabel is vooral nuttig voor mensen die liever in hun eigen vertrouwde omgeving werken, of die willen onderzoeken welke begeleider financieel en praktisch het best past bij hun locatie.<\/p>\n\n        <h3 id=\"sessie-op-een-triptherapie-locatie\">Sessie op een Triptherapie-locatie<\/h3>\n        <p>De tweede tabel laat de vaste locaties van Triptherapie zien. Dit zijn locaties waar je naartoe reist in plaats van dat een begeleider naar jou toe komt. In dit overzicht zie je de plaats, en na berekening ook de afstand en reistijd vanaf jouw startlocatie. Het totaalbedrag verandert mee met het aantal personen.<\/p>\n\n        <p>Deze optie is handig wanneer je liever gebruikmaakt van een vaste setting die al geschikt is voor de sessie. In dat geval vergelijk je niet zozeer begeleiders op reistijd, maar vooral de verschillende locaties en hun totaalprijs.<\/p>\n\n        <h3 id=\"kaartweergave\">Kaartweergave<\/h3>\n        <p>Rechts staat de kaart. Boven de kaart kies je met de kaartweergave wat je op de kaart wilt zien.<\/p>\n\n        <p>Kies je voor Eigen accommodatie, dan toont de kaart de begeleiders. Je ziet dan waar de verschillende begeleiders zich ongeveer bevinden. Als je een startlocatie hebt ingevuld en op Bereken hebt gedrukt, kunnen ook routes worden weergegeven.<\/p>\n\n        <p>Kies je voor Triptherapie locatie, dan toont de kaart juist de vaste locaties. Daardoor kun je visueel zien welke locatie geografisch het handigst ligt ten opzichte van jouw vertrekpunt.<\/p>\n\n        <p>De kaartweergave verandert alleen de kaart. De tabellen links blijven beide zichtbaar, zodat je tijdens het vergelijken niet hoeft te wisselen tussen schermen.<\/p>\n\n        <h3 id=\"uitleg-van-de-begeleidersopties\">Uitleg van de begeleidersopties<\/h3>\n        <div id=\"explanationGuidesList\"><\/div>\n\n        <h3 id=\"uitleg-van-de-vaste-locaties\">Uitleg van de vaste locaties<\/h3>\n        <div id=\"explanationLocationsList\"><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <script src=\"https:\/\/maps.googleapis.com\/maps\/api\/js?key=AIzaSyCi5hCWfsu72vYKb5s0C5_1yxOYxLBVh8E&callback=initMap\" async defer><\/script>\n\n  <script>\n    \/* =========================================================================\n     * CONFIGURATIE\n     * Alles wat je regelmatig wilt aanpassen staat hieronder. De rest van de\n     * code leest deze gegevens uit en hoeft niet aangepast te worden.\n     * ========================================================================= *\/\n    const CONFIG = {\n      \/\/ Bedrag dat wordt toegevoegd aan de basisprijs per extra persoon\n      \/\/ (bij 2 personen +1x dit bedrag, bij 3 personen +2x dit bedrag).\n      extraPersonFee: 500,\n\n      \/\/ Reiskosten worden berekend over de RETOUR (heen + terug).\n      \/\/ Aantal retour-reisminuten dat \"gratis\" is. Retourreistijd boven dit aantal\n      \/\/ minuten kost CONFIG.travelCostPerMinute euro per minuut.\n      travelCostFreeMinutes: 30,\n      \/\/ Prijs per minuut boven de vrije retour-reistijd.\n      travelCostPerMinute: 1,\n\n      \/\/ Aantal retour-kilometers dat \"gratis\" is. Retourafstand boven dit aantal\n      \/\/ kilometers kost CONFIG.travelCostPerKm euro per kilometer.\n      travelCostFreeKm: 30,\n      \/\/ Prijs per kilometer boven de vrije retour-afstand (0,50 = 50 cent per km,\n      \/\/ wat neerkomt op 1 euro per enkele-reis-km boven de vrije grens).\n      travelCostPerKm: 0.5,\n\n      \/\/ Extra marge in minuten: een begeleider die net buiten zijn maxTravelTime\n      \/\/ valt (maar binnen maxTravelTime + deze marge) wordt nog getoond, in het oranje.\n      orangeBufferMinutes: 30,\n\n      \/\/ Begeleiders voor sessies op de eigen locatie van de klant.\n      \/\/ Een begeleider toevoegen: voeg een nieuw object toe aan deze lijst.\n      \/\/ Een begeleider verwijderen: verwijder het bijbehorende object.\n      \/\/\n      \/\/   name          - naam van de begeleider (moet uniek zijn)\n      \/\/   address, city - adres waarvandaan de reisafstand wordt berekend\n      \/\/   basePrice     - startprijs voor 1 persoon (exclusief reiskosten)\n      \/\/   color         - kleur van de marker\/route op de kaart (hex)\n      \/\/   maxTravelTime - maximale reistijd in minuten waarbinnen deze begeleider\n      \/\/                   nog beschikbaar is (daarna wordt hij doorgestreept getoond)\n      \/\/   profileUrl \/ reviewUrl \/ bookingUrl - links in de tabel-dropdown en de uitleg\n      \/\/                   (laat een veld weg of leeg als er geen link is)\n      guides: [\n        {\n          name: \"Marcel\", address: \"2204 CB Noordwijk\", city: \"Noordwijk\",\n          basePrice: 850, color: \"#8B0000\", maxTravelTime: 150,\n          profileUrl: \"https:\/\/triptherapie.nl\/personeel\/marcel\/\",\n          reviewUrl: \"https:\/\/trip-forum.nl\/recensie-truffel-therapie-marcel\/\",\n          bookingUrl: \"https:\/\/triptherapie.nl\/reserveringen\/book-marcel-own-location\/\"\n        },\n        {\n          name: \"Reineke\", address: \"3142 CA Maassluis\", city: \"Maassluis\",\n          basePrice: 850, color: \"#006400\", maxTravelTime: 45,\n          profileUrl: \"https:\/\/triptherapie.nl\/personeel\/reineke\/\",\n          reviewUrl: \"https:\/\/trip-forum.nl\/ervaringen-truffel-reineke\/\",\n          bookingUrl: \"https:\/\/triptherapie.nl\/reserveringen\/agenda-reineke\/\"\n        },\n        {\n          name: \"Sascha\", address: \"1404 HC Bussum\", city: \"Bussum\",\n          basePrice: 850, color: \"#006666\", maxTravelTime: 60,\n          profileUrl: \"https:\/\/triptherapie.nl\/personeel\/sascha\/\",\n          reviewUrl: \"https:\/\/trip-forum.nl\/recensies-sascha\/\",\n          bookingUrl: \"https:\/\/triptherapie.nl\/reserveringen\/book-psychedelic-session-own-location-sascha\/\"\n        },\n        {\n          name: \"Gijs\", address: \"5231 EK Den Bosch\", city: \"Den Bosch\",\n          basePrice: 850, color: \"#8B4513\", maxTravelTime: 45,\n          profileUrl: \"https:\/\/triptherapie.nl\/personeel\/gijs\/\",\n          reviewUrl: \"https:\/\/trip-forum.nl\/recensies-gijs\/\",\n          bookingUrl: \"https:\/\/triptherapie.nl\/reserveringen\/book-psychedelic-session-own-location-gijs\/\"\n        },\n        {\n          name: \"Ronald\", address: \"5554 SH Valkenswaard\", city: \"Valkenswaard\",\n          basePrice: 950, color: \"#4B0082\", maxTravelTime: 45,\n          profileUrl: \"https:\/\/triptherapie.nl\/personeel\/ronald\/\",\n          reviewUrl: \"https:\/\/trip-forum.nl\/recensies-ronald\/\",\n          bookingUrl: \"https:\/\/triptherapie.nl\/reserveringen\/book-psychedelic-session-own-location-ronald\/\"\n        },\n        {\n          name: \"Janneke\", address: \"2204 CB Noordwijk\", city: \"Noordwijk\",\n          basePrice: 750, color: \"#00008B\", maxTravelTime: 30,\n          profileUrl: \"https:\/\/triptherapie.nl\/personeel\/janneke\/\",\n          reviewUrl: \"https:\/\/trip-forum.nl\/review-janneke\/\",\n          bookingUrl: \"https:\/\/triptherapie.nl\/reserveringen\/book-janneke-own-location\/\"\n        },\n        {\n          name: \"Elke\", address: \"4554 AN Westdorpe\", city: \"Westdorpe\",\n          basePrice: 850, color: \"#07708B\", maxTravelTime: 180,\n          profileUrl: \"https:\/\/triptherapie.nl\/personeel\/elke\/\",\n          reviewUrl: \"https:\/\/trip-forum.nl\/review-elke\/\",\n          bookingUrl: \"https:\/\/triptherapie.nl\/reserveringen\/agenda-elke\/\"\n        }\n      ],\n\n      \/\/ Vaste Triptherapie-locaties waar de klant naartoe reist.\n      \/\/ Een locatie toevoegen: voeg een nieuw object toe aan deze lijst.\n      \/\/ Een locatie verwijderen: verwijder het bijbehorende object.\n      \/\/\n      \/\/   name              - naam van de locatie\n      \/\/   address, city     - adres van de locatie\n      \/\/   basePrice         - totaalprijs voor 1 persoon\n      \/\/   color             - kleur van de marker\/route op de kaart (hex)\n      \/\/   infoUrl \/ bookingUrl - links in de tabel-dropdown en de uitleg\n      locations: [\n        {\n          name: \"De Bedding\", address: \"5231 EK Den Bosch\", city: \"Den Bosch\",\n          basePrice: 850, color: \"#b20091\",\n          infoUrl: \"https:\/\/triptherapie.nl\/locatie\/bedding-den-bosch\/\",\n          bookingUrl: \"https:\/\/triptherapie.nl\/reserveringen\/book-psychedelic-session-own-location-gijs\/\"\n        },\n        {\n          name: \"Sancta Psychedelica\", address: \"2204 CB Noordwijk\", city: \"Noordwijk\",\n          basePrice: 1050, color: \"#c2185b\",\n          infoUrl: \"https:\/\/triptherapie.nl\/locatie\/sancta-psychedelica-noordwijk\/\",\n          bookingUrl: \"https:\/\/triptherapie.nl\/reserveringen\/sancta-psychedelica-noordwijk-reserveren\/\"\n        }\n        \/\/ Psychedelic Loft (Schiedam) is verwijderd. Om een locatie terug te\n        \/\/ zetten, voeg gewoon een nieuw object met dezelfde velden toe.\n      ]\n    };\n    \/* ========================= EINDE CONFIGURATIE ========================= *\/\n\n    let destinations = [];\n    let locations = [];\n    let visibleGuideNames = null;\n\n    function getPersonCount() {\n      const checked = document.querySelector('input[name=\"personCount\"]:checked');\n      const value = checked ? parseInt(checked.value, 10) : 1;\n      return [1, 2, 3].includes(value) ? value : 1;\n    }\n\n    function getExtraPersonsPrice() {\n      return (getPersonCount() - 1) * CONFIG.extraPersonFee;\n    }\n\n    function getSessionType() {\n      const checked = document.querySelector('input[name=\"sessionType\"]:checked');\n      return checked ? checked.value : \"own\";\n    }\n\n    function rebuildPricingData() {\n      const extra = getExtraPersonsPrice();\n\n      destinations = CONFIG.guides.map(item => ({\n        ...item,\n        addition: item.basePrice + extra\n      }));\n\n      locations = CONFIG.locations.map(item => ({\n        ...item,\n        price: item.basePrice + extra\n      }));\n\n      const urlParams = new URLSearchParams(window.location.search);\n      const guidesParam = urlParams.getAll(\"guide\");\n\n      if (guidesParam.length > 0) {\n        const guideFilter = [];\n        guidesParam.forEach(p => p.split(\",\").forEach(g => guideFilter.push(g.trim().toLowerCase())));\n\n        destinations = destinations.filter(dest =>\n          guideFilter.includes(dest.name.toLowerCase())\n        );\n      }\n    }\n\n    rebuildPricingData();\n\n    let map;\n    let directionsService;\n    let directionsRenderers = [];\n    let geocoder;\n    let markers = [];\n    let markerBounds;\n    let overlay;\n    let alternateTick = 0;\n    let activeDropdown = null;\n    let hideDropdownTimer = null;\n\n    function clearDirections() {\n      directionsRenderers.forEach(r => r.setMap(null));\n      directionsRenderers = [];\n    }\n\n    function clearMarkers() {\n      markers.forEach(m => m.setMap(null));\n      markers = [];\n    }\n\n    function escapeHtml(text) {\n      return String(text)\n        .replaceAll(\"&\", \"&amp;\")\n        .replaceAll(\"<\", \"&lt;\")\n        .replaceAll(\">\", \"&gt;\")\n        .replaceAll('\"', \"&quot;\")\n        .replaceAll(\"'\", \"&#039;\");\n    }\n\n    function getDropdownWrapper(label, linksHtml) {\n      const iconHTML = '<i class=\"fa-solid fa-up-right-from-square\" style=\"color: white; margin-left: 4px;\" title=\"Klik hier voor meer informatie\"><\/i>';\n      return (\n        \"<div class='dropdown'>\" +\n          \"<span>\" + escapeHtml(label) + \"<\/span>\" + iconHTML +\n          \"<div class='dropdown-content'>\" + linksHtml + \"<\/div>\" +\n        \"<\/div>\"\n      );\n    }\n\n    \/\/ Bouwt de dropdown-links voor een begeleider op basis van CONFIG.guides.\n    function getDropdownHTML(name) {\n      const guide = CONFIG.guides.find(g => g.name === name);\n      if (!guide) return escapeHtml(name);\n\n      let links = \"\";\n      if (guide.bookingUrl) links += \"<a href='\" + guide.bookingUrl + \"' target='_blank' rel='noopener'>Reserveren<\/a>\";\n      if (guide.profileUrl) links += \"<a href='\" + guide.profileUrl + \"' target='_blank' rel='noopener'>Profiel<\/a>\";\n      if (guide.reviewUrl) links += \"<a href='\" + guide.reviewUrl + \"' target='_blank' rel='noopener'>Recensies<\/a>\";\n\n      return getDropdownWrapper(guide.name, links);\n    }\n\n    \/\/ Bouwt de dropdown-links voor een locatie op basis van CONFIG.locations.\n    function getLocationDropdownHTML(name) {\n      const location = CONFIG.locations.find(l => l.name === name);\n      if (!location) return escapeHtml(name);\n\n      let links = \"\";\n      if (location.infoUrl) links += \"<a href='\" + location.infoUrl + \"' target='_blank' rel='noopener'>Locatie info<\/a>\";\n      if (location.bookingUrl) links += \"<a href='\" + location.bookingUrl + \"' target='_blank' rel='noopener'>Reserveren<\/a>\";\n\n      return getDropdownWrapper(location.name, links);\n    }\n\n    \/\/ Vult de \"Uitleg\" sectie onderaan automatisch met alle begeleiders en\n    \/\/ locaties uit CONFIG, zodat je die tekst niet apart hoeft bij te werken.\n    function renderExplanationLists() {\n      const guidesContainer = document.getElementById(\"explanationGuidesList\");\n      if (guidesContainer) {\n        guidesContainer.innerHTML = CONFIG.guides.map(guide => {\n          let links = \"\";\n          if (guide.profileUrl) links += \"<a href='\" + guide.profileUrl + \"' target='_blank' rel='noopener'>Meer informatie over \" + escapeHtml(guide.name) + \"<\/a><br>\";\n          if (guide.reviewUrl) links += \"<a href='\" + guide.reviewUrl + \"' target='_blank' rel='noopener'>Recensies over \" + escapeHtml(guide.name) + \"<\/a><br>\";\n          if (guide.bookingUrl) links += \"<a href='\" + guide.bookingUrl + \"' target='_blank' rel='noopener'>Reserveren met \" + escapeHtml(guide.name) + \" op eigen locatie<\/a>\";\n          return \"<p><strong>\" + escapeHtml(guide.name) + \"<\/strong><br>\" + links + \"<\/p>\";\n        }).join(\"\");\n      }\n\n      const locationsContainer = document.getElementById(\"explanationLocationsList\");\n      if (locationsContainer) {\n        locationsContainer.innerHTML = CONFIG.locations.map(location => {\n          let links = \"\";\n          if (location.infoUrl) links += \"<a href='\" + location.infoUrl + \"' target='_blank' rel='noopener'>Meer informatie over \" + escapeHtml(location.name) + \"<\/a><br>\";\n          if (location.bookingUrl) links += \"<a href='\" + location.bookingUrl + \"' target='_blank' rel='noopener'>Reserveren bij \" + escapeHtml(location.name) + \"<\/a>\";\n          return \"<p><strong>\" + escapeHtml(location.name) + \"<\/strong><br>\" + links + \"<\/p>\";\n        }).join(\"\");\n      }\n    }\n\n    function showGuidesTable() {\n      const hasInput = document.getElementById(\"startLocation\").value.trim() !== \"\";\n      let html = '<div class=\"table-container\">';\n      html += \"<table style='width:100%; border-collapse:collapse;' border='1' cellpadding='5'>\";\n      html += \"<tr style='background: #000428; color: white;'>\";\n      html += \"<th>Begeleider<\/th>\";\n      html += hasInput ? \"<th>Afstand<\/th>\" : \"<th>Woonplaats<\/th>\";\n      if (hasInput) html += \"<th>Reis<\/th><th>Reistijd<\/th>\";\n      html += \"<th>Totaal<\/th>\";\n      html += \"<\/tr>\";\n\n      destinations.forEach(dest => {\n        html += \"<tr>\";\n        html += \"<td>\" + getDropdownHTML(dest.name) + \"<\/td>\";\n        html += \"<td>\" + escapeHtml(dest.city) + \"<\/td>\";\n        if (hasInput) html += \"<td>\u20ac0<\/td><td>-<\/td>\";\n        html += \"<td>\u20ac\" + dest.addition + \"<\/td>\";\n        html += \"<\/tr>\";\n      });\n\n      html += \"<\/table><\/div>\";\n      return html;\n    }\n\n    function showLocationsTable() {\n      let html = '<div class=\"table-container\">';\n      html += \"<table style='width:100%; border-collapse:collapse;' border='1' cellpadding='5'>\";\n      html += \"<tr style='background: #b20091; color: white;'>\";\n      html += \"<th>Onze locaties<\/th><th>Plaats<\/th><th>Totaal<\/th>\";\n      html += \"<\/tr>\";\n\n      locations.forEach(loc => {\n        html += \"<tr>\";\n        html += \"<td>\" + getLocationDropdownHTML(loc.name) + \"<\/td>\";\n        html += \"<td>\" + escapeHtml(loc.city) + \"<\/td>\";\n        html += \"<td>\u20ac\" + loc.price + \"<\/td>\";\n        html += \"<\/tr>\";\n      });\n\n      html += \"<\/table><\/div>\";\n      return html;\n    }\n\n    function showBothTables() {\n      rebuildPricingData();\n      visibleGuideNames = null;\n      document.getElementById(\"results\").innerHTML = showGuidesTable() + showLocationsTable();\n      initDropdowns();\n    }\n\n    function addOriginMarker(originAddress) {\n      geocoder.geocode({ address: originAddress }, function(results, status) {\n        if (status === google.maps.GeocoderStatus.OK) {\n          const pos = results[0].geometry.location;\n          const marker = new google.maps.Marker({\n            map,\n            position: pos,\n            title: \"Startlocatie\",\n            icon: \"http:\/\/maps.google.com\/mapfiles\/ms\/icons\/blue-dot.png\"\n          });\n          marker.isRotatingMarker = false;\n          markers.push(marker);\n          markerBounds.extend(marker.getPosition());\n        }\n      });\n    }\n\n    function hexToRgb(hex) {\n      hex = (hex || \"\").replace(\/^#\/, \"\");\n      if (hex.length !== 6) return null;\n      const bigint = parseInt(hex, 16);\n      return { r: (bigint >> 16) & 255, g: (bigint >> 8) & 255, b: bigint & 255 };\n    }\n\n    function getAdjustedSVGIcon(markerLike, markerType) {\n      const color = markerLike.customColor || \"#8B0000\";\n      const rgb = hexToRgb(color);\n      if (!rgb) return null;\n\n      let width = 150;\n      let height = 28;\n      let radius = 5;\n\n      if (markerType === \"guide\") {\n        width = 60;\n        height = 20;\n        radius = 3;\n      }\n\n      const rgbaColor = `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 1)`;\n      const svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\n        <rect x=\"0\" y=\"0\" width=\"${width}\" height=\"${height}\" rx=\"${radius}\" ry=\"${radius}\" fill=\"${rgbaColor}\"\/>\n      <\/svg>`;\n\n      return {\n        url: \"data:image\/svg+xml;charset=UTF-8,\" + encodeURIComponent(svg),\n        scaledSize: new google.maps.Size(width, height),\n        anchor: new google.maps.Point(width \/ 2, height \/ 2),\n        labelOrigin: new google.maps.Point(width \/ 2, height \/ 2)\n      };\n    }\n\n    function addNamedMarker(item, origin) {\n      const address = item.address + \", \" + item.city + \", Nederland\";\n      const markerType = locations.some(loc => loc.name === item.name) ? \"location\" : \"guide\";\n\n      geocoder.geocode({ address }, function(results, status) {\n        if (status === google.maps.GeocoderStatus.OK) {\n          const pos = results[0].geometry.location;\n\n          const marker = new google.maps.Marker({\n            map,\n            position: pos,\n            title: item.name,\n            icon: getAdjustedSVGIcon({ customColor: item.color }, markerType),\n            label: {\n              text: item.name,\n              color: \"white\",\n              fontSize: markerType === \"guide\" ? \"10px\" : \"11px\",\n              fontWeight: \"bold\"\n            }\n          });\n\n          marker.customColor = item.color;\n          marker.isRotatingMarker = true;\n          markers.push(marker);\n          markerBounds.extend(marker.getPosition());\n\n          marker.addListener(\"click\", function() {\n            const startLoc = document.getElementById(\"startLocation\").value.trim();\n            if (!startLoc) {\n              alert(\"Voer een startlocatie in om de route te tonen.\");\n              return;\n            }\n            drawRoute(startLoc, address, item.color);\n          });\n\n          if (origin) drawRoute(origin, address, item.color);\n        }\n      });\n    }\n\n    function showAllMarkers() {\n      rebuildPricingData();\n      clearMarkers();\n      clearDirections();\n      markerBounds = new google.maps.LatLngBounds();\n\n      const sessionType = getSessionType();\n      let items = sessionType === \"location\" ? locations : destinations;\n\n      if (sessionType === \"own\" && Array.isArray(visibleGuideNames)) {\n        items = items.filter(item => visibleGuideNames.includes(item.name));\n      }\n\n      items.forEach(item => addNamedMarker(item, null));\n    }\n\n    function alternateMarkerZIndex() {\n      if (!overlay || !overlay.getProjection()) return;\n\n      const rotatingMarkers = markers.filter(m => m.isRotatingMarker);\n      const n = rotatingMarkers.length;\n      if (n === 0) return;\n\n      const proj = overlay.getProjection();\n      const positions = rotatingMarkers.map(m => proj.fromLatLngToDivPixel(m.getPosition()));\n\n      const overlappingIndices = [];\n      for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n          const dx = positions[i].x - positions[j].x;\n          const dy = positions[i].y - positions[j].y;\n          const d = Math.sqrt(dx * dx + dy * dy);\n          if (d < 40) {\n            if (!overlappingIndices.includes(i)) overlappingIndices.push(i);\n            if (!overlappingIndices.includes(j)) overlappingIndices.push(j);\n          }\n        }\n      }\n\n      for (let i = 0; i < n; i++) {\n        if (!overlappingIndices.includes(i)) rotatingMarkers[i].setZIndex(100);\n      }\n\n      if (overlappingIndices.length > 0) {\n        const topPos = alternateTick % overlappingIndices.length;\n        overlappingIndices.forEach((markerIndex, posIndex) => {\n          rotatingMarkers[markerIndex].setZIndex(posIndex === topPos ? 200 : -1);\n        });\n        alternateTick++;\n      }\n    }\n\n    function getQueryParam(param) {\n      const urlParams = new URLSearchParams(window.location.search);\n      return urlParams.get(param);\n    }\n\n    function updateURLWithSearch(searchTerm) {\n      const url = new URL(window.location);\n      const params = new URLSearchParams(url.search);\n\n      if (searchTerm && searchTerm.trim() !== \"\") params.set(\"zoek\", searchTerm.trim());\n      else params.delete(\"zoek\");\n\n      url.search = params.toString();\n      history.replaceState(null, \"\", url.toString());\n    }\n\n    function isAddressInNetherlands(geocodeResult) {\n      if (!geocodeResult || !geocodeResult.address_components) return false;\n\n      const countryComponent = geocodeResult.address_components.find(component =>\n        component.types && component.types.includes(\"country\")\n      );\n\n      if (!countryComponent) return false;\n\n      const countryLong = (countryComponent.long_name || \"\").toLowerCase();\n      const countryShort = (countryComponent.short_name || \"\").toLowerCase();\n\n      return countryLong === \"netherlands\" || countryLong === \"nederland\" || countryShort === \"nl\";\n    }\n\n    function initMap() {\n      map = new google.maps.Map(document.getElementById(\"map\"), {\n        center: { lat: 52.1326, lng: 5.2913 },\n        zoom: 7,\n        mapTypeControl: false,\n        streetViewControl: false,\n        styles: [{ featureType: \"poi\", elementType: \"all\", stylers: [{ visibility: \"off\" }] }]\n      });\n\n      directionsService = new google.maps.DirectionsService();\n      geocoder = new google.maps.Geocoder();\n      markerBounds = new google.maps.LatLngBounds();\n\n      overlay = new google.maps.OverlayView();\n      overlay.onAdd = function() {};\n      overlay.draw = function() {};\n      overlay.onRemove = function() {};\n      overlay.setMap(map);\n\n      setInterval(alternateMarkerZIndex, 5000);\n\n      const zoekterm = getQueryParam(\"zoek\");\n      if (zoekterm) {\n        document.getElementById(\"startLocation\").value = zoekterm;\n        calculateDistances();\n      } else {\n        showBothTables();\n        showAllMarkers();\n      }\n    }\n\n    function drawRoute(originAddress, destAddress, color) {\n      geocoder.geocode({ address: originAddress }, function(resultsOrigin, statusOrigin) {\n        if (statusOrigin !== google.maps.GeocoderStatus.OK) return;\n\n        const originLocation = resultsOrigin[0].geometry.location;\n\n        geocoder.geocode({ address: destAddress }, function(resultsDest, statusDest) {\n          if (statusDest !== google.maps.GeocoderStatus.OK) return;\n\n          const destLocation = resultsDest[0].geometry.location;\n\n          directionsService.route({\n            origin: originLocation,\n            destination: destLocation,\n            travelMode: google.maps.TravelMode.DRIVING\n          }, function(response, status) {\n            if (status === \"OK\") {\n              const renderer = new google.maps.DirectionsRenderer({\n                suppressMarkers: true,\n                preserveViewport: true,\n                polylineOptions: { strokeColor: color, strokeOpacity: 0.5, strokeWeight: 5 }\n              });\n              renderer.setMap(map);\n              renderer.setDirections(response);\n              directionsRenderers.push(renderer);\n            }\n          });\n        });\n      });\n    }\n\n    function renderOutsideNetherlandsTables() {\n      rebuildPricingData();\n      visibleGuideNames = [];\n\n      let html = \"\";\n      html += '<div class=\"table-container\">';\n      html += \"<table style='width:100%; border-collapse:collapse;' border='1' cellpadding='5'>\";\n      html += \"<tr style='background: #000428; color: white;'>\";\n      html += \"<th>Begeleider<\/th><th>Afstand<\/th><th>Reis<\/th><th>Reistijd<\/th><th>Totaal<\/th>\";\n      html += \"<\/tr>\";\n\n      destinations.forEach(dest => {\n        html += \"<tr class='strike'>\";\n        html += \"<td>\" + escapeHtml(dest.name) + \"<\/td>\";\n        html += \"<td><\/td><td><\/td><td><\/td><td><\/td>\";\n        html += \"<\/tr>\";\n      });\n\n      html += \"<\/table><\/div>\";\n      html += showLocationsTable();\n\n      document.getElementById(\"results\").innerHTML = html;\n      initDropdowns();\n    }\n\n    function calculateDistances() {\n      rebuildPricingData();\n\n      const origin = document.getElementById(\"startLocation\").value.trim();\n      const sessionType = getSessionType();\n      updateURLWithSearch(origin);\n\n      if (!origin) {\n        visibleGuideNames = null;\n        showBothTables();\n        showAllMarkers();\n        return;\n      }\n\n      geocoder.geocode({ address: origin }, function(originResults, originStatus) {\n        if (originStatus !== google.maps.GeocoderStatus.OK || !originResults || !originResults[0]) {\n          alert(\"De ingevoerde locatie kon niet goed worden gevonden.\");\n          visibleGuideNames = null;\n          showBothTables();\n          showAllMarkers();\n          return;\n        }\n\n        const originInNetherlands = isAddressInNetherlands(originResults[0]);\n\n        if (!originInNetherlands) {\n          clearDirections();\n          renderOutsideNetherlandsTables();\n          showAllMarkers();\n          return;\n        }\n\n        clearDirections();\n        clearMarkers();\n        markerBounds = new google.maps.LatLngBounds();\n        addOriginMarker(origin);\n\n        const guideAddresses = destinations.map(d => d.address + \", \" + d.city + \", Nederland\");\n        const locationAddresses = locations.map(l => l.address + \", \" + l.city + \", Nederland\");\n        const service = new google.maps.DistanceMatrixService();\n\n        service.getDistanceMatrix({\n          origins: [origin],\n          destinations: guideAddresses,\n          travelMode: google.maps.TravelMode.DRIVING,\n          unitSystem: google.maps.UnitSystem.METRIC\n        }, function(guidesResponse, guidesStatus) {\n          if (guidesStatus !== google.maps.DistanceMatrixStatus.OK) {\n            alert(\"Er is een fout opgetreden: \" + guidesStatus);\n            visibleGuideNames = null;\n            showBothTables();\n            return;\n          }\n\n          service.getDistanceMatrix({\n            origins: [origin],\n            destinations: locationAddresses,\n            travelMode: google.maps.TravelMode.DRIVING,\n            unitSystem: google.maps.UnitSystem.METRIC\n          }, function(locationsResponse, locationsStatus) {\n            if (locationsStatus !== google.maps.DistanceMatrixStatus.OK) {\n              alert(\"Er is een fout opgetreden: \" + locationsStatus);\n              visibleGuideNames = null;\n              showBothTables();\n              return;\n            }\n\n            const guideResultsArray = [];\n            const guideElements = guidesResponse.rows[0].elements;\n\n            for (let i = 0; i < guideElements.length; i++) {\n              const element = guideElements[i];\n              const item = destinations[i];\n\n              if (element.status === \"OK\") {\n                const distanceMeters = element.distance.value;\n                const oneWayKm = distanceMeters \/ 1000;\n                const oneWayDisplay = Math.round(oneWayKm);\n                const travelTimeMinutes = element.duration.value \/ 60;\n\n                \/\/ Retour (heen + terug)\n                const roundTripKm = oneWayKm * 2;\n                const roundTripMinutes = travelTimeMinutes * 2;\n\n                \/\/ Afstandscomponent: eerste 15 km van de RETOUR gratis, daarna \u20ac0,50 per km\n                const billableKm = Math.max(0, roundTripKm - CONFIG.travelCostFreeKm);\n                const distanceCost = billableKm * CONFIG.travelCostPerKm;\n\n                \/\/ Tijdscomponent: eerste 15 minuten van de RETOUR gratis, daarna \u20ac1 per minuut\n                const billableMinutes = Math.max(0, roundTripMinutes - CONFIG.travelCostFreeMinutes);\n                const timeCost = billableMinutes * CONFIG.travelCostPerMinute;\n\n                let travelCostCalculated = Math.round(distanceCost + timeCost);\n\n                const maxTime = item.maxTravelTime;\n\n                if (travelTimeMinutes <= maxTime) {\n                  guideResultsArray.push({\n                    name: item.name,\n                    distance: oneWayDisplay,\n                    travelCost: travelCostCalculated,\n                    totalPrice: travelCostCalculated + item.addition,\n                    travelTime: travelTimeMinutes,\n                    strike: false,\n                    orange: false,\n                    group: 1,\n                    sortPrice: travelCostCalculated + item.addition\n                  });\n                } else if (travelTimeMinutes <= maxTime + CONFIG.orangeBufferMinutes) {\n                  guideResultsArray.push({\n                    name: item.name,\n                    distance: oneWayDisplay,\n                    travelCost: travelCostCalculated,\n                    totalPrice: travelCostCalculated + item.addition,\n                    travelTime: travelTimeMinutes,\n                    strike: false,\n                    orange: true,\n                    group: 2,\n                    sortPrice: travelCostCalculated + item.addition\n                  });\n                } else {\n                  guideResultsArray.push({\n                    name: item.name,\n                    distance: oneWayDisplay,\n                    travelCost: \"-\",\n                    totalPrice: \"-\",\n                    travelTime: travelTimeMinutes,\n                    strike: true,\n                    orange: false,\n                    group: 3,\n                    sortPrice: Infinity\n                  });\n                }\n              } else {\n                guideResultsArray.push({\n                  name: item.name,\n                  distance: \"-\",\n                  travelCost: \"-\",\n                  totalPrice: \"-\",\n                  travelTime: \"-\",\n                  strike: true,\n                  orange: false,\n                  group: 3,\n                  sortPrice: Infinity\n                });\n              }\n            }\n\n            guideResultsArray.sort((a, b) => (a.group !== b.group) ? (a.group - b.group) : (a.sortPrice - b.sortPrice));\n\n            visibleGuideNames = guideResultsArray\n              .filter(item => !item.strike)\n              .map(item => item.name);\n\n            const locationResultsArray = [];\n            const locationElements = locationsResponse.rows[0].elements;\n\n            for (let i = 0; i < locationElements.length; i++) {\n              const element = locationElements[i];\n              const item = locations[i];\n\n              if (element.status === \"OK\") {\n                const oneWayKm = element.distance.value \/ 1000;\n                const oneWayDisplay = Math.round(oneWayKm);\n                const travelTimeMinutes = element.duration.value \/ 60;\n\n                locationResultsArray.push({\n                  name: item.name,\n                  city: item.city,\n                  distance: oneWayDisplay,\n                  travelTime: travelTimeMinutes,\n                  totalPrice: item.price,\n                  sortPrice: item.price\n                });\n              }\n            }\n\n            locationResultsArray.sort((a, b) => a.sortPrice - b.sortPrice);\n\n            let html = \"\";\n\n            html += '<div class=\"table-container\">';\n            html += \"<table style='width:100%; border-collapse:collapse;' border='1' cellpadding='5'>\";\n            html += \"<tr style='background: #000428; color: white;'>\";\n            html += \"<th>Begeleider<\/th><th>Afstand<\/th><th>Reis<\/th><th>Reistijd<\/th><th>Totaal<\/th>\";\n            html += \"<\/tr>\";\n\n            guideResultsArray.forEach(item => {\n              if (item.strike) html += \"<tr class='strike'>\";\n              else if (item.orange) html += \"<tr style='color: orange;'>\";\n              else html += \"<tr>\";\n\n              if (item.strike) {\n                html += \"<td>\" + escapeHtml(item.name) + \"<\/td>\";\n              } else {\n                html += \"<td>\" + getDropdownHTML(item.name) + \"<\/td>\";\n              }\n\n              html += \"<td>\" + item.distance + (item.distance !== \"-\" ? \" km\" : \"\") + \"<\/td>\";\n              html += \"<td>\" + (item.strike ? \"\" : (item.travelCost !== \"-\" ? \"\u20ac\" + item.travelCost : item.travelCost)) + \"<\/td>\";\n              html += \"<td>\" + (item.travelTime !== \"-\" ? Math.round(item.travelTime) + \" min\" : item.travelTime) + \"<\/td>\";\n              html += \"<td>\" + (item.strike ? \"\" : \"\u20ac\" + item.totalPrice) + \"<\/td>\";\n              html += \"<\/tr>\";\n            });\n\n            html += \"<\/table><\/div>\";\n\n            html += '<div class=\"table-container\">';\n            html += \"<table style='width:100%; border-collapse:collapse;' border='1' cellpadding='5'>\";\n            html += \"<tr style='background: #b20091; color: white;'>\";\n            html += \"<th>Onze locaties<\/th><th>Plaats<\/th><th>Afstand<\/th><th>Reistijd<\/th><th>Totaal<\/th>\";\n            html += \"<\/tr>\";\n\n            locationResultsArray.forEach(item => {\n              html += \"<tr>\";\n              html += \"<td>\" + getLocationDropdownHTML(item.name) + \"<\/td>\";\n              html += \"<td>\" + escapeHtml(item.city) + \"<\/td>\";\n              html += \"<td>\" + item.distance + \" km<\/td>\";\n              html += \"<td>\" + Math.round(item.travelTime) + \" min<\/td>\";\n              html += \"<td>\u20ac\" + item.totalPrice + \"<\/td>\";\n              html += \"<\/tr>\";\n            });\n\n            html += \"<\/table><\/div>\";\n\n            document.getElementById(\"results\").innerHTML = html;\n            initDropdowns();\n\n            let mapItems = sessionType === \"location\"\n              ? locations\n              : destinations.filter(item => visibleGuideNames.includes(item.name));\n\n            mapItems.forEach(item => addNamedMarker(item, origin));\n\n            setTimeout(function() {\n              if (!markerBounds.isEmpty()) {\n                map.fitBounds(markerBounds);\n              }\n            }, 1500);\n          });\n        });\n      });\n    }\n\n    function positionDropdown(trigger, menu) {\n      menu.style.display = \"flex\";\n\n      const rect = trigger.getBoundingClientRect();\n      const menuRect = menu.getBoundingClientRect();\n      const gap = 6;\n\n      let left = rect.left;\n      let top = rect.top - menuRect.height - gap;\n\n      if (left + menuRect.width > window.innerWidth - 8) {\n        left = window.innerWidth - menuRect.width - 8;\n      }\n      if (left < 8) left = 8;\n\n      if (top < 8) {\n        top = rect.bottom + gap;\n      }\n\n      if (top + menuRect.height > window.innerHeight - 8) {\n        top = Math.max(8, window.innerHeight - menuRect.height - 8);\n      }\n\n      menu.style.left = left + \"px\";\n      menu.style.top = top + \"px\";\n    }\n\n    function hideActiveDropdown() {\n      if (!activeDropdown) return;\n      activeDropdown.style.display = \"none\";\n      activeDropdown = null;\n    }\n\n    function initDropdowns() {\n      hideActiveDropdown();\n\n      const dropdowns = document.querySelectorAll(\".dropdown\");\n\n      dropdowns.forEach(dropdown => {\n        const menu = dropdown.querySelector(\".dropdown-content\");\n        if (!menu) return;\n\n        dropdown.addEventListener(\"mouseenter\", function() {\n          clearTimeout(hideDropdownTimer);\n          if (activeDropdown && activeDropdown !== menu) {\n            activeDropdown.style.display = \"none\";\n          }\n          activeDropdown = menu;\n          positionDropdown(dropdown, menu);\n        });\n\n        dropdown.addEventListener(\"mouseleave\", function() {\n          clearTimeout(hideDropdownTimer);\n          hideDropdownTimer = setTimeout(() => {\n            if (activeDropdown === menu) {\n              hideActiveDropdown();\n            }\n          }, 120);\n        });\n\n        menu.addEventListener(\"mouseenter\", function() {\n          clearTimeout(hideDropdownTimer);\n        });\n\n        menu.addEventListener(\"mouseleave\", function() {\n          clearTimeout(hideDropdownTimer);\n          hideDropdownTimer = setTimeout(() => {\n            if (activeDropdown === menu) {\n              hideActiveDropdown();\n            }\n          }, 120);\n        });\n      });\n    }\n\n    function initExplanationToggle() {\n      const toggle = document.getElementById(\"explanationToggle\");\n      const content = document.getElementById(\"explanationContent\");\n\n      if (!toggle || !content) return;\n\n      toggle.addEventListener(\"click\", function() {\n        const isOpen = content.classList.toggle(\"open\");\n        toggle.classList.toggle(\"active\", isOpen);\n        toggle.setAttribute(\"aria-expanded\", isOpen ? \"true\" : \"false\");\n      });\n    }\n\n    window.addEventListener(\"scroll\", function() {\n      hideActiveDropdown();\n    }, true);\n\n    window.addEventListener(\"resize\", function() {\n      hideActiveDropdown();\n    });\n\n    let debounceTimer;\n    document.getElementById(\"startLocation\").addEventListener(\"input\", function() {\n      clearTimeout(debounceTimer);\n      debounceTimer = setTimeout(calculateDistances, 1000);\n    });\n\n    document.getElementById(\"calculateBtn\").addEventListener(\"click\", calculateDistances);\n\n    document.getElementById(\"startLocation\").addEventListener(\"keydown\", function(e) {\n      if (e.key === \"Enter\") calculateDistances();\n    });\n\n    document.querySelectorAll('input[name=\"personCount\"]').forEach(input => {\n      input.addEventListener(\"change\", function() {\n        calculateDistances();\n      });\n    });\n\n    document.querySelectorAll('input[name=\"sessionType\"]').forEach(input => {\n      input.addEventListener(\"change\", function() {\n        calculateDistances();\n      });\n    });\n\n    renderExplanationLists();\n    initExplanationToggle();\n  <\/script>\n<\/body>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Prijsberekening sessie op locatie Reken hier eenvoudig uit wat de prijs is voor een priv\u00e9 psychedelische sessie voor \u00e9\u00e9n tot drie deelnemers op jouw eigen of op \u00e9\u00e9n van onze locaties. Bij sessies op de locaties van Triptherapie is altijd \u00e9\u00e9n overnachting plus eten en drinken inbegrepen. Witte tekst: De begeleider werkt op jouw locatie.Oranje [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-57290","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/triptherapie.nl\/en\/wp-json\/wp\/v2\/pages\/57290","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/triptherapie.nl\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/triptherapie.nl\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/triptherapie.nl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/triptherapie.nl\/en\/wp-json\/wp\/v2\/comments?post=57290"}],"version-history":[{"count":18,"href":"https:\/\/triptherapie.nl\/en\/wp-json\/wp\/v2\/pages\/57290\/revisions"}],"predecessor-version":[{"id":57449,"href":"https:\/\/triptherapie.nl\/en\/wp-json\/wp\/v2\/pages\/57290\/revisions\/57449"}],"wp:attachment":[{"href":"https:\/\/triptherapie.nl\/en\/wp-json\/wp\/v2\/media?parent=57290"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}