{"id":542,"date":"2025-02-13T08:25:22","date_gmt":"2025-02-13T07:25:22","guid":{"rendered":"https:\/\/cuilpilapan.com\/services\/"},"modified":"2026-01-24T19:48:43","modified_gmt":"2026-01-25T01:48:43","slug":"services","status":"publish","type":"page","link":"https:\/\/cuilpilapan.com\/es\/services\/","title":{"rendered":"Tours"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"542\" class=\"elementor elementor-542\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ecdc542 e-con-full e-flex e-con e-parent\" data-id=\"ecdc542\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-341f31e e-con-full e-flex e-con e-child\" data-id=\"341f31e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e05a237 elementor-widget elementor-widget-spacer\" data-id=\"e05a237\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c607c23 elementor-widget elementor-widget-heading\" data-id=\"c607c23\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Tours <\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dc56f06 elementor-widget elementor-widget-spacer\" data-id=\"dc56f06\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e166422 elementor-widget elementor-widget-text-editor\" data-id=\"e166422\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Sum\u00e9rgete en la naturaleza y descubre paisajes espectaculares en nuestro exclusivo tour de senderismo. Dise\u00f1ado para entusiastas de la aventura y la exploraci\u00f3n, este tour te llevar\u00e1 a trav\u00e9s de algunas de las atracciones naturales m\u00e1s impresionantes de Guanacaste.<\/p>\t\t\t\t\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<div class=\"elementor-element elementor-element-1ea260a e-flex e-con-boxed e-con e-parent\" data-id=\"1ea260a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-53e9612 e-con-full e-flex e-con e-child\" data-id=\"53e9612\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7179047 elementor-widget elementor-widget-heading\" data-id=\"7179047\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"minitour-dedia\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Aventura Esencial: Cascada y Puente Colgante<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9db05f7 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"9db05f7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2fb8d9e elementor-widget__width-initial elementor-arrows-position-inside elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel\" data-id=\"2fb8d9e\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;slides_to_show&quot;:&quot;1&quot;,&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;infinite&quot;:&quot;yes&quot;,&quot;effect&quot;:&quot;slide&quot;,&quot;speed&quot;:500}\" data-widget_type=\"image-carousel.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-image-carousel-wrapper swiper\" role=\"region\" aria-roledescription=\"carousel\" aria-label=\"Carrusel de im\u00e1genes\" dir=\"ltr\">\n\t\t\t<div class=\"elementor-image-carousel swiper-wrapper\" aria-live=\"off\">\n\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"1 de 3\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/7-scaled-rbmy5ufbqhwxd4a5xkewqvv3y4wlmlqdawsfc1gyww.jpg\" alt=\"7\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"2 de 3\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/DJI_0386-scaled-rbmym32xtg59ykox3l4utsbtfsuwmc7evakfu5e3eo.jpg\" alt=\"DCIM100MEDIADJI_0386.JPG\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"3 de 3\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/DSC_3656-1-scaled-rbxjk2h299k020d72j54k3zvzedq59rnp7hbyrj5j4.jpg\" alt=\"DSC_3656 (1)\" \/><\/figure><\/div>\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-prev\" role=\"button\" tabindex=\"0\">\n\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-left\" viewbox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M646 125C629 125 613 133 604 142L308 442C296 454 292 471 292 487 292 504 296 521 308 533L604 854C617 867 629 875 646 875 663 875 679 871 692 858 704 846 713 829 713 812 713 796 708 779 692 767L438 487 692 225C700 217 708 204 708 187 708 171 704 154 692 142 675 129 663 125 646 125Z\"><\/path><\/svg>\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-next\" role=\"button\" tabindex=\"0\">\n\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-right\" viewbox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M696 533C708 521 713 504 713 487 713 471 708 454 696 446L400 146C388 133 375 125 354 125 338 125 325 129 313 142 300 154 292 171 292 187 292 204 296 221 308 233L563 492 304 771C292 783 288 800 288 817 288 833 296 850 308 863 321 871 338 875 354 875 371 875 388 867 400 854L696 533Z\"><\/path><\/svg>\t\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"swiper-pagination\"><\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-18e4ffe elementor-widget-mobile__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"18e4ffe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"107\" data-end=\"421\">Este recorrido est\u00e1 dise\u00f1ado para quienes desean vivir la naturaleza sin necesidad de gran condici\u00f3n f\u00edsica. Son 3 km de senderos accesibles que te llevan a descubrir dos puntos imperdibles: un imponente puente colgante y la oportunidad de visitar una de nuestras cataratas, Nakura o Paolita (a elecci\u00f3n del visitante).<\/p><p data-start=\"423\" data-end=\"608\">Adem\u00e1s, durante el recorrido tendr\u00e1s la oportunidad de refrescarte en sus aguas cristalinas y acceder hasta el r\u00edo para disfrutar de un ba\u00f1o rodeado de la pureza del bosque tropical.<\/p><p data-start=\"610\" data-end=\"986\">\u2728\ud83e\udda5 <strong data-start=\"614\" data-end=\"666\">Extra opcional (+$10 por persona):<\/strong><br data-start=\"666\" data-end=\"669\" \/>Avistamiento de perezosos Haz tu experiencia a\u00fan m\u00e1s especial visitando nuestra parcela de perezosos. Contar\u00e1s con binoculares y un telescopio para observarlos de cerca, acompa\u00f1ado por un gu\u00eda que te ayudar\u00e1 a descubrir cada detalle. Adem\u00e1s, podr\u00e1s aprovechar el tiempo para buscar m\u00e1s fauna silvestre, incluyendo aves tropicales, ya sea en los senderos o desde nuestro rancho.<\/p><p data-start=\"988\" data-end=\"1198\">La duraci\u00f3n de este tour puede personalizarse seg\u00fan tu ritmo e intereses, y tambi\u00e9n contamos con otros extras disponibles que puedes solicitar al momento de tu reserva para hacer tu experiencia a\u00fan m\u00e1s c\u00f3moda y completa.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8da3b89 elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"8da3b89\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div style=\"text-align:center; margin:1px 0;\">\r\n    <button\r\n        onclick=\"openBookingForm(this)\"\r\n        data-tour=\"Essential Adventure\"\r\n        data-desc=\"Total tour distance: 3 km \/ 1.86 miles (round trip), with an approximate duration of 2 hours.\"\r\n        data-precio-adulto-nacional=\"13800\"\r\n        data-precio-adulto-extranjero=\"30\"\r\n        data-precio-nino-nacional=\"6900\"\r\n        data-precio-nino-extranjero=\"20\"\r\n        style=\"background:#ff1a50; color:white; font-size:15px; padding:15px 77px; border:none; border-radius:30px; cursor:pointer; box-shadow: 0 4px 10px rgba(255, 26, 80, 0.4);\">\r\n        RESERVAR\r\n    <\/button>\r\n<\/div>\r\n\r\n<div id=\"bookingModal\" style=\"display:none; position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.7); z-index:9999; overflow:auto;\">\r\n    <div style=\"background:#fff; max-width:750px; margin:50px auto; padding:30px; border-radius:15px; position:relative; box-shadow: 0 5px 15px rgba(0,0,0,0.3);\">\r\n\r\n        <button onclick=\"closeBookingForm()\" style=\"position:absolute; top:15px; right:15px; font-size:24px; background:none; border:none; cursor:pointer; color:#333;\">\u2716<\/button>\r\n\r\n        <h2 style=\"text-align:center; margin-bottom:10px; color:#2E7D32; font-size:26px;\" id=\"tourTitle\"><\/h2>\r\n        <p style=\"text-align:center; margin-bottom:25px; color:#555;\" id=\"tourDesc\"><\/p>\r\n\r\n        <form id=\"bookingForm\" onsubmit=\"event.preventDefault();\" action=\"\">\r\n\r\n            <div style=\"margin-top:20px; margin-bottom:16px;\">\r\n                <label for=\"fecha\" class=\"form-label\"><b>\ud83d\udcc5 Fecha (Seleccionar fecha):<\/b><\/label><span id=\"fecha-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <input type=\"date\" id=\"fecha\" class=\"input\" required onchange=\"calcularTotal()\">\r\n                <span id=\"fecha-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <div style=\"margin-bottom:12px;\">\r\n                <label for=\"hora\" class=\"form-label\"><b>Hora (Seleccionar hora):<\/b><\/label><span id=\"hora-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <select id=\"hora\" class=\"input\">\r\n                    <option value=\"\" selected disabled>Select a time<\/option>\r\n                    <option value=\"8:00 am\">8:00 am<\/option>\r\n                    <option value=\"9:00 am\">9:00 am<\/option>\r\n                    <option value=\"10:00 am\">10:00 am<\/option>\r\n                    <option value=\"1:00 pm\">1:00 pm<\/option>\r\n                    <option value=\"2:00 pm\">2:00 pm<\/option>\r\n                <\/select>\r\n                <span id=\"hora-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <div style=\"margin-bottom:12px;\">\r\n                <label for=\"tipoVisitante\" class=\"form-label\"><b>Tipo de visitante (extranjero o residente):<\/b><\/label><span id=\"tipoVisitante-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <select id=\"tipoVisitante\" class=\"input\" onchange=\"onVisitorTypeChange(); calcularTotal()\">\r\n                    <option value=\"\" selected disabled>Select visitor type<\/option>\r\n                    <option value=\"extranjero\">Foreign \/ Extranjero<\/option>\r\n                    <option value=\"nacional\">Local \/ Nacional<\/option>\r\n                <\/select>\r\n                <span id=\"tipoVisitante-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <div id=\"guideLanguageDiv\" style=\"display:none; margin-bottom:15px;\">\r\n                <label for=\"guideLanguage\" class=\"form-label\"><b>Seleccionar idioma del gu\u00eda:<\/b><\/label><span id=\"guideLanguage-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <select id=\"guideLanguage\" class=\"input\">\r\n                    <option value=\"\" selected disabled>Select guide language<\/option>\r\n                    <option value=\"English\">English<\/option>\r\n                    <option value=\"Spanish\">Spanish<\/option>\r\n                <\/select>\r\n                <p class=\"note\"><i>Elige el idioma del gu\u00eda.<\/i><\/p>\r\n                <span id=\"guideLanguage-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n<h3 class=\"section-title\">Viajeros<\/h3>\r\n<p class=\"section-note\">Los precios var\u00edan seg\u00fan la edad y el n\u00famero de personas.<\/p>\r\n<p class=\"note\"><i>Total de viajeros: <span id=\"totalTravelers\" style=\"font-weight:bold;\">0<\/span><\/i><\/p>\r\n<p class=\"note discount-note\" id=\"discountNote\" style=\"display:none;\"><i>Descuentos de hasta un 30% disponibles para grupos grandes y reservas anticipadas.<\/i><\/p>\r\n\r\n<div class=\"traveler-row\">\r\n<div class=\"traveler-info\">\r\n<label for=\"adultos\" class=\"traveler-label\">Adultos (13-70 a\u00f1os):<span class=\"discount-tag discount-green\">-0%<\/span><\/label>\r\n<\/div>\r\n<div class=\"quantity-control\">\r\n<button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"adultos\">-<\/button>\r\n<input type=\"number\" id=\"adultos\" min=\"0\" value=\"0\" class=\"input-num\" oninput=\"calcularTotal()\">\r\n<button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"adultos\">+<\/button>\r\n<\/div>\r\n<\/div>\r\n<div class=\"traveler-row\">\r\n<div class=\"traveler-info\">\r\n<label for=\"ninos\" class=\"traveler-label\">Ni\u00f1os (5-12 a\u00f1os):<span class=\"discount-tag discount-green\">-50%*<\/span><\/label>\r\n<\/div>\r\n<div class=\"quantity-control\">\r\n<button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"ninos\">-<\/button>\r\n<input type=\"number\" id=\"ninos\" min=\"0\" value=\"0\" class=\"input-num\" oninput=\"calcularTotal()\">\r\n<button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"ninos\">+<\/button>\r\n<\/div>\r\n<\/div>\r\n<div class=\"traveler-row\">\r\n<div class=\"traveler-info\">\r\n<label for=\"bebes\" class=\"traveler-label\">Beb\u00e9s (0-4 a\u00f1os):<span class=\"discount-tag discount-green\">FREE*<\/span><\/label>\r\n<\/div>\r\n<div class=\"quantity-control\">\r\n<button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"bebes\">-<\/button>\r\n<input type=\"number\" id=\"bebes\" min=\"0\" value=\"0\" class=\"input-num\" oninput=\"calcularTotal()\">\r\n<button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"bebes\">+<\/button>\r\n<\/div>\r\n<\/div>\r\n\r\n<h3 class=\"section-title\">Agregar extras<\/h3>\r\n<p class=\"section-note\">Selecciona los art\u00edculos adicionales que necesitas y agrega la cantidad.<\/p>\r\n\r\n<div class=\"extra-item no-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" style=\"display:block;\">\r\n            <input type=\"checkbox\" id=\"extraPerezoso\" onchange=\"calcularTotal()\"> \r\n            Tour de Perezosos y Aves Tropicales (<span id=\"precioPerezoso\" class=\"price-span\" style=\"color:black;\">$10<\/span> por persona)\r\n        <\/label>\r\n        <p class=\"note\" style=\"margin-left:25px; margin-top:2px;\">\r\n            <i>(Incluye el uso de binoculares y telescopio)<\/i>\r\n        <\/p>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\" style=\"visibility:hidden; height:36px; border:none; width:110px; margin-left:10px;\"><\/div>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"botellasAgua\">Agua embotellada (<span id=\"precioAgua\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"botellasAgua\">-<\/button>\r\n        <input type=\"number\" id=\"botellasAgua\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"botellasAgua\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkAgua\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numToallas\">Toallas (<span id=\"precioToallas\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numToallas\">-<\/button>\r\n        <input type=\"number\" id=\"numToallas\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numToallas\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkToallas\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numSnacks\">Snacks Granuts (<span id=\"precioSnacks\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numSnacks\">-<\/button>\r\n        <input type=\"number\" id=\"numSnacks\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numSnacks\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkSnacks\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numPonchos\">Ponchos para la lluvia<span id=\"precioPonchos\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numPonchos\">-<\/button>\r\n        <input type=\"number\" id=\"numPonchos\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numPonchos\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkPonchos\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row final-extra-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numBinoculares\">Uso de binoculares (<span id=\"precioBinoculares\" class=\"price-span\" style=\"color:black;\">$5<\/span>)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numBinoculares\">-<\/button>\r\n        <input type=\"number\" id=\"numBinoculares\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numBinoculares\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkBinoculares\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<p class=\"note\" style=\"margin-left: 0; margin-top: -5px; margin-bottom: 20px; text-align: left; font-size: 0.85em; width: 100%;\">\r\n    <i>(Solo disponible si NO selecciona el Tour de Perezosos y Aves Tropicales)<\/i>\r\n<\/p>\r\n            <h3 class=\"section-title\">Informaci\u00f3n del cliente<\/h3>\r\n\r\n            <label for=\"nombre\" class=\"form-label\">Nombre completo:<\/label><span id=\"nombre-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n            <input type=\"text\" id=\"nombre\" class=\"input\" style=\"margin-bottom:6px;\">\r\n            <span id=\"nombre-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n\r\n            <label for=\"email\" class=\"form-label\">Email:<\/label><span id=\"email-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n            <input type=\"email\" id=\"email\" class=\"input\" style=\"margin-bottom:6px;\">\r\n            <span id=\"email-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n\r\n            <label for=\"acompanantes\" class=\"form-label\">Nombres de acompa\u00f1antes: <span id=\"acompanantes-note\" style=\"font-weight:normal; font-size:0.9em; color:#555;\">(Requerido si hay 2 o m\u00e1s viajeros)<\/span><\/label><span id=\"acompanantes-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n            <textarea id=\"acompanantes\" class=\"input\" style=\"margin-bottom:12px;\" placeholder=\"Enumera los nombres de los compa\u00f1eros separados por comas\"><\/textarea>\r\n            <span id=\"acompanantes-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n\r\n            <div style=\"margin:10px 0;\">\r\n                <style>\r\n                    #acceptTermsLink {\r\n                        color: #1A237E;\r\n                        font-weight: bold;\r\n                        text-decoration: none;\r\n                        transition: color 0.3s;\r\n                    }\r\n                    #acceptTermsLink:hover {\r\n                        color: #0D1033;\r\n                        text-decoration: underline;\r\n                    }\r\n                <\/style>\r\n                <label>\r\n                    <input type=\"checkbox\" id=\"acceptTerms\" style=\"margin-right:8px;\" onchange=\"clearFieldError(this)\">\r\n                    <span style=\"color:black;\">He le\u00eddo y acepto el <\/span>\r\n                    <a id=\"acceptTermsLink\" href=\"https:\/\/cuilpilapan.com\/es\/terms-and-conditions\/\" target=\"_blank\">T\u00e9rminos y Condiciones<\/a>\r\n                    <span style=\"color:black;\"> y doy mi consentimiento para el uso de mis datos personales para el proceso de reserva.<\/span>\r\n                <\/label>\r\n                <span id=\"terms-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <h2 style=\"margin-top: 8px; font-size: 28px; color: #333;\">Total: <span id=\"total\" style=\"color:#ff8c00;\">$0<\/span><\/h2>\r\n            <div id=\"discountApplied\" style=\"margin-bottom:8px; font-weight:bold; color:#2d6a4f; display:none;\"><\/div>\r\n            <div id=\"totalAfterDiscount\" style=\"margin-bottom:8px; font-weight:normal; text-decoration:line-through; color:#aaa; display:none;\"><\/div>\r\n\r\n            <div id=\"tilopayDepositNote\" style=\"background: #e6f7ff; border: 1px solid #91d5ff; padding: 10px; border-radius: 5px; margin-top: 10px;\">\r\n                <strong style=\"color: #0056b3;\">NOTA IMPORTANTE:<\/strong> Al reservar, se cobrar\u00e1 un dep\u00f3sito por\r\n                <span id=\"depositAmountDisplay\" style=\"font-weight:bold;\"><\/span> (\u20a17000 local \/ $15 extranjero). El monto restante debe pagarse al llegar.\r\n            <\/div>\r\n\r\n            <div id=\"guiaOpcionalDiv\" style=\"display:none; margin:15px 0;\">\r\n                <label><input type=\"checkbox\" id=\"extraGuia\" onchange=\"calcularTotal()\"> Gu\u00eda opcional (\u20a16000)<\/label>\r\n            <\/div>\r\n\r\n            <div style=\"background:#f9f9f9; padding:15px; border-radius:10px; box-shadow:0 2px 6px rgba(0,0,0,0.1); margin-top:20px;\">\r\n                <b>Recomendaciones:<\/b> Elige el tour que se adapte a tu capacidad f\u00edsica para disfrutar plenamente de la aventura.  \nLleva ropa adecuada, ropa extra, bocadillos, agua para mantenerte hidratado y cualquier medicamento personal si tienes una condici\u00f3n m\u00e9dica.  \nNo dudes en hacer cualquier pregunta.\r\n            <\/div>\r\n\r\n            <div style=\"text-align:center; margin-top:25px;\">\r\n                <button id=\"btnProceed\" onclick=\"onProceedToPayment()\" style=\"background:#ff8c00; color:white; font-size:18px; padding:15px 40px; border:none; border-radius:30px; cursor:pointer; margin-bottom:10px; box-shadow: 0 4px 10px rgba(255, 140, 0, 0.4);\">\r\n                    Proceder a la reserva \/ Proceder al pago\r\n                <\/button>\r\n            <\/div>\r\n\r\n            <div id=\"paymentSection\" style=\"display:none; margin-top:25px; border-top:1px solid #eee; padding-top:16px;\">\r\n                <h3 class=\"section-title\" style=\"font-size:20px;\">Seleccione su m\u00e9todo de pago \/ Select payment method<\/h3>\r\n                \r\n                <div style=\"display:flex; flex-direction:column; gap:12px;\">\r\n\r\n                    <label style=\"display:flex; align-items:center; gap:10px; padding:10px; border:1px solid #ddd; border-radius:10px; cursor:pointer; transition:transform 0.2s; background:#fafafa;\">\r\n                        <input type=\"radio\" name=\"paymentMethod\" value=\"tarjeta\" onchange=\"onPaymentMethodChange()\" style=\"transform:scale(1.3); margin-right:6px;\">\r\n                        <img decoding=\"async\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/10\/WhatsApp-Image-2025-10-22-at-3.59.08-PM.jpeg\"\r\n                            alt=\"Tilopay\" width=\"50\" height=\"50\" style=\"border-radius:8px; transition:transform 0.3s;\">\r\n                        <span style=\"font-size:16px;\">Tarjeta de Cr\u00e9dito\/D\u00e9bito (Tilopay) - Solo Dep\u00f3sito<\/span>\r\n                    <\/label>\r\n\r\n                    <label style=\"display:flex; align-items:center; gap:10px; padding:10px; border:1px solid #ddd; border-radius:10px; cursor:pointer; transition:transform 0.2s; background:#fafafa;\">\r\n                        <input type=\"radio\" name=\"paymentMethod\" value=\"simpe\" onchange=\"onPaymentMethodChange()\" style=\"transform:scale(1.3); margin-right:6px;\">\r\n                        <img decoding=\"async\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/10\/WhatsApp-Image-2025-10-22-at-3.57.36-PM.jpeg\"\r\n                            alt=\"Simpe M\u00f3vil\" width=\"50\" height=\"50\" style=\"border-radius:8px; transition:transform 0.3s;\">\r\n                        <span style=\"font-size:16px;\">Simpe M\u00f3vil - Solo Dep\u00f3sito (o pago completo)<\/span>\r\n                    <\/label>\r\n\r\n                    <label style=\"display:flex; align-items:center; gap:10px; padding:10px; border:1px solid #ddd; border-radius:10px; cursor:pointer; transition:transform 0.2s; background:#fafafa;\">\r\n                        <input type=\"radio\" name=\"paymentMethod\" value=\"binance\" onchange=\"onPaymentMethodChange()\" style=\"transform:scale(1.3); margin-right:6px;\">\r\n                        <img decoding=\"async\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/10\/WhatsApp-Image-2025-10-22-at-3.56.45-PM.jpeg\"\r\n                            alt=\"Binance\" width=\"50\" height=\"50\" style=\"border-radius:8px; transition:transform 0.3s;\">\r\n                        <span style=\"font-size:16px;\">Pago Binance (USDT) - Solo Dep\u00f3sito (o pago completo)<\/span>\r\n                    <\/label>\r\n                <\/div>\r\n\r\n<style>\r\n#paymentSection label:hover {\r\ntransform: scale(1.03);\r\nbackground: #fffbe6;\r\nbox-shadow: 0 2px 6px rgba(0,0,0,0.1);\r\n}\r\n#paymentSection img:hover {\r\ntransform: scale(1.1) rotate(3deg);\r\n}\r\n<\/style>\r\n\r\n<div id=\"paymentDetails\" style=\"margin-top:12px;\"><\/div>\r\n\r\n<div id=\"tilopayButtonContainer\" style=\"text-align:center; margin-top:20px; display:none;\">\r\n<button type=\"button\" onclick=\"handleCardPayment()\"\r\n                        style=\"                            background-color: #007bff;                            color: white;                            padding: 15px 30px;                            border: none;                            border-radius: 5px;                            font-size: 18px;                            cursor: pointer;                            box-shadow: 0 4px 6px rgba(0,0,0,0.1);                            transition: background-color 0.3s;                        \"\r\n                        onmouseover=\"this.style.backgroundColor='#0056b3'\"\r\n                        onmouseout=\"this.style.backgroundColor='#007bff'\"\r\n                    >\r\n                        \ud83d\udcb3 Pagar dep\u00f3sito ahora con tarjeta.\r\n                    <\/button>\r\n                    <p style=\"margin-top:10px; font-size:0.9em; color:#555;\">Ser\u00e1s redirigido a la pasarela de pago Tilopay en esta pesta\u00f1a.<\/p>\r\n                <\/div>\r\n            <\/div>\r\n\r\n        <input type=\"hidden\" name=\"trp-form-language\" value=\"es\"\/><\/form>\r\n\r\n    <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* Estilos Globales *\/\r\n.input, textarea, select { width:100%; padding:10px; margin:3px 0; border:1px solid #ddd; border-radius:8px; display:block; box-sizing: border-box; }\r\n\r\n\/* 1. ESTILO PARA DESHABILITAR D\u00cdAS ANTERIORES EN EL CALENDARIO *\/\r\ninput[type=\"date\"] { font-family: inherit; color: #333; }\r\n\/* MEJORA 1: Estilo para d\u00edas inv\u00e1lidos en Safari\/iOS *\/\r\ninput[type=\"date\"]:not([value=\"\"]):invalid { box-shadow: 0 0 5px rgba(231,76,60,0.6); }\r\n\r\n.input-num { width: 40px; text-align: center; border: none; padding: 0; -moz-appearance: textfield; }\r\n.input-num::-webkit-inner-spin-button, .input-num::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }\r\n\r\n.form-label { display:block; margin-bottom:6px; font-weight: 500; color: #333; }\r\n.note { font-size:0.9em; color:#555; margin:3px 0 5px 0; }\r\n.section-title { margin-top:20px; margin-bottom:10px; font-size:24px; color:#555; border-bottom: 2px solid #ddd; padding-bottom: 5px; }\r\n.section-note { margin-top:8px; margin-bottom:15px; font-weight:normal; color:#444; font-size:16px; }\r\n\r\n\/* Traveler Quantity Controls - REESTRUCTURADO PARA ESTILO ORIGINAL HORIZONTAL *\/\r\n.traveler-row { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; padding: 10px 0; border-bottom: 1px solid #eee; }\r\n.traveler-row:last-child { border-bottom: none; margin-bottom: 0; }\r\n.traveler-info { display: flex; align-items: center; } \/* Contenedor para label y descuento *\/\r\n.traveler-label { font-size: 16px; color: #333; display: flex; align-items: center; gap: 10px; margin-right: 15px; }\r\n.quantity-control { display: flex; align-items: center; border: 1px solid #ccc; border-radius: 5px; overflow: hidden; }\r\n.qty-btn { background: #f7f7f7; border: none; color: #555; padding: 8px 10px; cursor: pointer; font-weight: bold; font-size: 16px; transition: background 0.2s; line-height: 1; height: 36px; box-sizing: border-box; }\r\n.qty-btn:hover { background: #eee; color: #000; }\r\n.qty-btn:active { background: #ddd; }\r\n.input-num { padding: 8px 0; height: 36px; box-sizing: border-box; font-size: 16px; }\r\n\r\n\/* Discount Tags (Mantiene el estilo verde) *\/\r\n.discount-tag { background: #e9f5e9; color: #2E7D32; padding: 3px 8px; border-radius: 10px; font-size: 14px; font-weight: bold; margin-left: 0; white-space: nowrap; }\r\n\r\n\r\n\/* Extras with Quantity - REESTRUCTURADO PARA ESTILO TRAVELERS (MEJORA SOLICITADA) *\/\r\n\/* Contenedor principal para cada extra: similar a .traveler-row *\/\r\n.extra-item {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: flex-start; \/* Alineaci\u00f3n arriba para que las notas no muevan el control *\/\r\n    padding: 10px 0;\r\n    border-bottom: 1px solid #eee;\r\n}\r\n.extra-item.final-extra-row { border-bottom: none; }\r\n.extra-label-info {\r\n    display: flex;\r\n    flex-direction: column;\r\n    flex-grow: 1;\r\n    margin-right: 15px;\r\n}\r\n.extra-label { \r\n    font-size: 16px; \r\n    color: #333; \r\n    display: flex; \r\n    align-items: center; \r\n    margin-bottom: 0; \r\n}\r\n.extra-label input[type=\"checkbox\"] { \r\n    width: auto; \r\n    margin-right: 10px; \r\n}\r\n.extra-item .note { \r\n    margin-left: 25px; \/* Alineaci\u00f3n con el texto del label *\/\r\n    margin-top: 2px;\r\n    margin-bottom: 0; \r\n    font-size: 0.85em;\r\n}\r\n\r\n\r\n.price-span { font-weight: bold; color: #000; }\r\n.extra-qty-control { margin-left: 0; }\r\n.extra-num { width: 40px !important; }\r\n\r\n\/* Error visual *\/\r\n.invalid-field { border-color:#e74c3c !important; box-shadow: 0 0 4px rgba(231,76,60,0.4); }\r\n.field-error { color:#e74c3c; font-size:0.9em; display:block; margin-top:4px; }\r\n.field-asterisk { color:#e74c3c; font-weight:bold; margin-left:6px; font-size:1.2em; vertical-align:middle; }\r\n\r\n\/* Small helper for payment details box *\/\r\n#paymentDetails { background:#fafafa; padding:12px; border-radius:8px; border:1px dashed #ddd; margin-top:10px; }\r\n.payment-note { background:#fff3cd; padding:10px; border-radius:6px; margin-bottom:8px; border:1px solid #ffeeba; }\r\n.action-btn { display:inline-block; margin:6px 6px 0 0; padding:10px 14px; border-radius:8px; text-decoration:none; cursor:pointer; }\r\n.btn-green { background:#25d366; color:#fff; }\r\n.btn-blue { background:#0072c6; color:#fff; }\r\n.btn-gray { background:#6c757d; color:#fff; }\r\n<\/style>\r\n\r\n<script>\r\n\/* ---------- Helpers and state (Mantener sin cambios) ---------- *\/\r\nlet currentButton = null;\r\nconst CR_OFFSET_MINUTES = -6 * 60; \/\/ Costa Rica UTC-6 => -360 minutes\r\nconst ADMIN_WHATSAPP = '50660110640';\r\nconst ADMIN_EMAIL = 'contacto@cuilpilapan.com'; \/\/ Correo para recibir notificaciones\r\n\r\n\/\/ CONFIGURACI\u00d3N DE TILOPAY\r\nconst TILO_LINK_COLONES = 'https:\/\/tp.cr\/l\/MTYyMTQ3';\r\nconst DEPOSIT_COLONES = 7000;\r\nconst TILO_LINK_USD = 'https:\/\/tp.cr\/l\/MTYyMTQ4';\r\nconst DEPOSIT_USD = 15.00;\r\n\r\nconst RETURN_URL = 'https:\/\/cuilpilapan.com\/payment-success\/';\r\nconst SAVE_URL = '\/save_pending_reservation.php'; \/\/ URL para guardar la reserva antes de redirigir\r\nconst SEND_BOOKING_URL = '\/send_booking.php'; \/\/ URL para Simpe\/Binance\r\n\r\n\/\/ Simpe \/ Binance details\r\nconst SIMPE_PHONE = '60110640';\r\nconst SIMPE_NAME = 'Cuipilapan Sociedad Civil';\r\nconst BINANCE_ID = '450335940';\r\n\r\n\/\/ localStorage key to persist reservation data *after* redirection to Tilopay\r\nconst STORAGE_KEY = 'reservaCuilpilapan_v1';\r\nlet _lastComputed = {}; \/\/ Almacena el \u00faltimo c\u00e1lculo para el env\u00edo PHP\r\n\r\n\/**\r\n * Genera una referencia de pedido \u00fanica.\r\n * Formato: CUP-AAAAMMDD-RANDOM\r\n *\/\r\nfunction generateOrderReference() {\r\n    const date = new Date();\r\n    const dateStr = date.getFullYear().toString() +\r\n                    (date.getMonth() + 1).toString().padStart(2, '0') +\r\n                    date.getDate().toString().padStart(2, '0');\r\n    const randomStr = Math.random().toString(36).substring(2, 7).toUpperCase();\r\n    \/\/ Usamos \"CUP\" + la fecha + un random para la referencia que enviamos a Tilopay\r\n    return `CUP-${dateStr}-${randomStr}`;\r\n}\r\n\r\nfunction formatCurrency(amount, tipo) {\r\n    if (tipo === 'nacional') {\r\n        return '\u20a1' + Math.round(amount);\r\n    } else {\r\n        return '$' + Number(amount).toFixed(2);\r\n    }\r\n}\r\n\r\n\/* ---------- small UI helpers for errors (Mantener sin cambios) ---------- *\/\r\nfunction showFieldError(inputEl, message) {\r\n    if (!inputEl) return;\r\n    inputEl.classList.add('invalid-field');\r\n\r\n    \/\/ error span\r\n    const errId = inputEl.id + '-error';\r\n    let err = document.getElementById(errId);\r\n    if (!err) {\r\n        err = document.createElement('span');\r\n        err.id = errId;\r\n        err.className = 'field-error';\r\n        inputEl.parentNode.insertBefore(err, inputEl.nextSibling);\r\n    }\r\n    err.innerText = message;\r\n    err.style.display = 'block';\r\n\r\n    \/\/ asterisk\r\n    const starId = inputEl.id + '-asterisk';\r\n    let star = document.getElementById(starId);\r\n    if (!star) {\r\n        star = document.createElement('span');\r\n        star.id = starId;\r\n        star.className = 'field-asterisk';\r\n        star.innerText = '*';\r\n        \/\/ try to insert near the label if exists\r\n        const label = document.querySelector('label[for=\"' + inputEl.id + '\"]');\r\n        if (label && label.parentNode) {\r\n            label.parentNode.insertBefore(star, label.nextSibling);\r\n        } else {\r\n            \/\/ fallback: insert before input\r\n            inputEl.parentNode.insertBefore(star, inputEl);\r\n        }\r\n    }\r\n    star.style.display = 'inline';\r\n}\r\n\r\nfunction clearFieldError(inputEl) {\r\n    if (!inputEl) return;\r\n    inputEl.classList.remove('invalid-field');\r\n    const err = document.getElementById(inputEl.id + '-error');\r\n    if (err) { err.style.display = 'none'; err.innerText = ''; }\r\n    const star = document.getElementById(inputEl.id + '-asterisk');\r\n    if (star) star.style.display = 'none';\r\n}\r\n\r\n\/* ---------- Open \/ Close (Mantener sin cambios) ---------- *\/\r\nfunction openBookingForm(button) {\r\n    currentButton = button;\r\n    document.getElementById('bookingModal').style.display = 'block';\r\n    document.getElementById('tourTitle').innerText = button.getAttribute('data-tour') || 'Tour';\r\n    document.getElementById('tourDesc').innerText = button.getAttribute('data-desc') || '';\r\n\r\n    \/\/ 1. Aplicar restricci\u00f3n de calendario al abrir el modal\r\n    applyDateRestriction();\r\n\r\n    \/\/ reset UI errors and values if desired\r\n    clearAllFieldErrors();\r\n\r\n    \/\/ hide payment section\r\n    document.getElementById('paymentSection').style.display = 'none';\r\n    document.getElementById('paymentDetails').innerHTML = '';\r\n    document.getElementById('tilopayButtonContainer').style.display = 'none';\r\n\r\n    \/\/ Reset radio buttons\r\n    const radios = document.getElementsByName('paymentMethod');\r\n    for (let r of radios) r.checked = false;\r\n\r\n    document.getElementById('btnProceed').style.display = 'inline-block';\r\n\r\n    \/\/ Vuelva a calcular cuando se abre para obtener los precios correctos\r\n    calcularTotal();\r\n}\r\n\r\nfunction closeBookingForm() {\r\n    document.getElementById('bookingModal').style.display = 'none';\r\n}\r\n\r\n\/* 1. L\u00d3GICA DE CALENDARIO: Restringir fechas anteriores al d\u00eda actual (Costa Rica) *\/\r\nfunction applyDateRestriction() {\r\n    const fechaEl = document.getElementById('fecha');\r\n    if (!fechaEl) return;\r\n\r\n    \/\/ Calcular la fecha de hoy en Costa Rica (UTC-6)\r\n    const now = new Date();\r\n    const localOffsetMin = now.getTimezoneOffset(); \/\/ Offset local en minutos\r\n    const utcNowMs = now.getTime() + (localOffsetMin * 60000);\r\n    const crNowMs = utcNowMs + (CR_OFFSET_MINUTES * 60000);\r\n    const crToday = new Date(crNowMs);\r\n        \r\n    \/\/ Formatear a YYYY-MM-DD\r\n    const year = crToday.getFullYear();\r\n    const month = (crToday.getMonth() + 1).toString().padStart(2, '0');\r\n    const day = crToday.getDate().toString().padStart(2, '0');\r\n    const minDate = `${year}-${month}-${day}`;\r\n\r\n    \/\/ Establecer la fecha m\u00ednima para navegadores compatibles (Android, Desktop)\r\n    fechaEl.min = minDate;\r\n    \r\n    \/\/ MEJORA 1: A\u00f1adir un listener para validar en iOS\/navegadores que no respetan 'min'\r\n    fechaEl.addEventListener('change', function() {\r\n        const selectedDate = new Date(this.value);\r\n        \/\/ Crear una fecha de referencia de hoy a medianoche UTC\r\n        const todayRef = new Date(Date.UTC(crToday.getFullYear(), crToday.getMonth(), crToday.getDate()));\r\n\r\n        if (selectedDate < todayRef) {\r\n            \/\/ El d\u00eda seleccionado es anterior a hoy (Costa Rica)\r\n            this.setCustomValidity('The selected date cannot be in the past \/ La fecha seleccionada no puede ser anterior a hoy.');\r\n            this.classList.add('invalid-field');\r\n            showFieldError(this, 'The selected date cannot be in the past \/ La fecha seleccionada no puede ser anterior a hoy.');\r\n        } else {\r\n            this.setCustomValidity(''); \/\/ Limpiar el mensaje de error del navegador\r\n            clearFieldError(this);\r\n        }\r\n    });\r\n}\r\n\r\n\/* ---------- When visitor type changes (Mantener sin cambios) ---------- *\/\r\nfunction onVisitorTypeChange(){\r\n    const tipo = document.getElementById('tipoVisitante').value;\r\n    document.getElementById('guideLanguageDiv').style.display = (tipo === 'extranjero') ? 'block' : 'none';\r\n    calcularTotal();\r\n}\r\n\r\n\/* ---------- Core calculation (uses currentButton data-* prices) (C\u00d3DIGO COMPLETO) ---------- *\/\r\nfunction calcularTotal() {\r\n    if (!currentButton) return;\r\n\r\n    \/\/ get visitor type (if empty, temporarily treat as 'nacional' for price display)\r\n    let tipo = document.getElementById('tipoVisitante').value;\r\n    if (!tipo) tipo = 'nacional';\r\n\r\n    \/\/ travelers\r\n    let adultos = parseInt(document.getElementById('adultos').value) || 0;\r\n    let ninos = parseInt(document.getElementById('ninos').value) || 0;\r\n    let bebes = parseInt(document.getElementById('bebes').value) || 0;\r\n    let totalViajeros = adultos + ninos + bebes;\r\n    document.getElementById('totalTravelers').innerText = totalViajeros;\r\n\r\n    \/\/ base prices from data-* attributes on the button\r\n    let precioAdultoNac = parseFloat(currentButton.getAttribute('data-precio-adulto-nacional')) || 0;\r\n    let precioAdultoExt = parseFloat(currentButton.getAttribute('data-precio-adulto-extranjero')) || 0;\r\n    let precioAdulto = (tipo === 'nacional') ? precioAdultoNac : precioAdultoExt;\r\n    let precioNino = precioAdulto \/ 2;\r\n\r\n    \/\/ extras unit prices (local vs foreign)\r\n    let precioExtraPerezoso = (tipo === 'nacional') ? 3500 : 10;\r\n    let precioAgua = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioToallas = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioSnacks = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioPonchos = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioBinoculares = (tipo === 'nacional') ? 2000 : 5;\r\n\r\n    \/\/ quantities & selections\r\n    let extraPerezoso = document.getElementById('extraPerezoso').checked;\r\n    let botellasAgua = parseInt(document.getElementById('botellasAgua').value) || 0;\r\n    let numToallas = parseInt(document.getElementById('numToallas').value) || 0;\r\n    let numSnacks = parseInt(document.getElementById('numSnacks').value) || 0;\r\n    let numPonchos = parseInt(document.getElementById('numPonchos').value) || 0;\r\n    let numBinoculares = parseInt(document.getElementById('numBinoculares').value) || 0;\r\n    let guiaOpcional = document.getElementById('extraGuia')?.checked || false;\r\n\r\n    \/\/ start total with ticket prices (babies free)\r\n    let total = (adultos * precioAdulto) + (ninos * precioNino);\r\n\r\n    \/\/ extras\r\n    if (extraPerezoso) {\r\n        total += (adultos + ninos) * precioExtraPerezoso;\r\n    }\r\n    total += botellasAgua * precioAgua;\r\n    total += numToallas * precioToallas;\r\n    total += numSnacks * precioSnacks;\r\n    total += numPonchos * precioPonchos;\r\n\r\n    \/\/ Logic: Binoculars only available if Sloth Tour is NOT selected\r\n    if (numBinoculares > 0 && !extraPerezoso) {\r\n        total += numBinoculares * precioBinoculares;\r\n    } else if (extraPerezoso) {\r\n        \/\/ Force binocular quantity to 0 if sloth tour is checked\r\n        document.getElementById('numBinoculares').value = 0;\r\n    }\r\n    \r\n    if (guiaOpcional) total += (tipo === 'nacional' ? 6000 : 0); \/\/ Gu\u00eda Opcional: \u20a16000 (asumo solo para nacionales)\r\n\r\n    \/\/ 6. L\u00d3GICA DE DESCUENTOS MEJORADA\r\n    \r\n    \/\/ A. Descuento por cantidad de viajeros\r\n    let groupDiscount = 0;\r\n    if (totalViajeros >= 25) {\r\n        groupDiscount = 30; \/\/ 30% for 25+\r\n    } else if (totalViajeros > 14) {\r\n        groupDiscount = 20; \/\/ 20% for 15+\r\n    } else if (totalViajeros >= 10) {\r\n        groupDiscount = 15; \/\/ 15% for 10+\r\n    } else if (totalViajeros >= 6) {\r\n        groupDiscount = 10; \/\/ 10% for 6+\r\n    }\r\n\r\n    \/\/ B. Descuento por anticipaci\u00f3n de reserva\r\n    const fechaVal = document.getElementById('fecha').value;\r\n    let earlyDays = 0;\r\n    let earlyDiscount = 0;\r\n    if (fechaVal) {\r\n        const parts = fechaVal.split('-');\r\n        if (parts.length === 3) {\r\n            const y = parseInt(parts[0],10), m = parseInt(parts[1],10), d = parseInt(parts[2],10);\r\n            \/\/ compute CR now midnight reference\r\n            const now = new Date();\r\n            const localOffsetMin = now.getTimezoneOffset();\r\n            const utcNowMs = Date.now() + (localOffsetMin * 60000);\r\n            const crNowMs = utcNowMs + (CR_OFFSET_MINUTES * 60000);\r\n            const crNow = new Date(crNowMs);\r\n            \/\/ difference in days between (selected date) and current CR date\r\n            const selDate = new Date(Date.UTC(y, m-1, d));\r\n            const crToday = new Date(Date.UTC(crNow.getFullYear(), crNow.getMonth(), crNow.getDate()));\r\n            const diffMs = selDate - crToday;\r\n            earlyDays = Math.floor(diffMs \/ (1000*60*60*24));\r\n            \r\n            if (earlyDays >= 14) {\r\n                earlyDiscount = 20; \/\/ 20% for 2 weeks or more\r\n            } else if (earlyDays >= 7) {\r\n                earlyDiscount = 10; \/\/ 10% for 1 week or more\r\n            }\r\n        }\r\n    }\r\n    \r\n    \/\/ C. Descuento total (El m\u00e1ximo de A o B) + Adicional\r\n    let baseDiscount = Math.max(groupDiscount, earlyDiscount);\r\n    let additionalDiscount = 0;\r\n\r\n    \/\/ Descuento adicional por combinar grupo y anticipaci\u00f3n\r\n    if (groupDiscount > 0) {\r\n        if (earlyDays >= 14) {\r\n            additionalDiscount = 4; \/\/ 4% adicional por 2 semanas y grupo\r\n        } else if (earlyDays >= 7) {\r\n            additionalDiscount = 2; \/\/ 2% adicional por 1 semana y grupo\r\n        }\r\n    }\r\n    \r\n    let totalDiscountPercent = baseDiscount + additionalDiscount;\r\n\r\n    \/\/ Guardamos el total bruto (RAW TOTAL)\r\n    let rawTotal = total;\r\n\r\n    \/\/ aplicamos descuento\r\n    let discountedTotal = total;\r\n    let discountText = '';\r\n    if (totalDiscountPercent > 0) {\r\n        discountedTotal = total * (1 - totalDiscountPercent \/ 100);\r\n        discountText = `\ud83d\udcb0 Discount Applied: ${totalDiscountPercent}% (Group: ${groupDiscount}%, Early: ${earlyDiscount}%, Additional: ${additionalDiscount}%)`;\r\n    }\r\n\r\n    \/\/ Redondear a n\u00fameros enteros para colones (ya que Tilopay lo requiere entero)\r\n    if (tipo === 'nacional') {\r\n        rawTotal = Math.ceil(rawTotal);\r\n        discountedTotal = Math.ceil(discountedTotal);\r\n    }\r\n\r\n    \/\/ ----------------------------------------------------\r\n    \/\/ VISUALIZACI\u00d3N EN EL FORMULARIO (HTML)\r\n    \/\/ ----------------------------------------------------\r\n\r\n    document.getElementById('total').innerText = formatCurrency(discountedTotal, tipo);\r\n\r\n    if (totalDiscountPercent > 0) {\r\n        document.getElementById('discountApplied').style.display = 'block';\r\n        document.getElementById('discountApplied').innerText = discountText;\r\n\r\n        document.getElementById('totalAfterDiscount').style.display = 'block';\r\n        document.getElementById('totalAfterDiscount').innerText = `Total before discount: ${formatCurrency(rawTotal, tipo)}`;\r\n    } else {\r\n        document.getElementById('discountApplied').style.display = 'none';\r\n        document.getElementById('totalAfterDiscount').style.display = 'none';\r\n    }\r\n\r\n    document.getElementById('discountNote').style.display = (totalViajeros >= 6 || earlyDays >= 7) ? 'block' : 'none';\r\n\r\n    \/\/ show\/hide guiaOpcionalDiv\r\n    if (tipo === 'nacional' && totalViajeros < 4) {\r\n        document.getElementById('guiaOpcionalDiv').style.display = 'block';\r\n    } else {\r\n        document.getElementById('guiaOpcionalDiv').style.display = 'none';\r\n        document.getElementById('extraGuia').checked = false; \/\/ Desactivar si se oculta\r\n    }\r\n\r\n    \/\/ update unit-price labels\r\n    document.getElementById('precioPerezoso').innerText = formatCurrency(precioExtraPerezoso, tipo);\r\n    document.getElementById('precioAgua').innerText = formatCurrency(precioAgua, tipo);\r\n    document.getElementById('precioToallas').innerText = formatCurrency(precioToallas, tipo);\r\n    document.getElementById('precioSnacks').innerText = formatCurrency(precioSnacks, tipo);\r\n    document.getElementById('precioPonchos').innerText = formatCurrency(precioPonchos, tipo);\r\n    document.getElementById('precioBinoculares').innerText = formatCurrency(precioBinoculares, tipo);\r\n\r\n    \/\/ 2. Actualizar la nota de dep\u00f3sito\r\n    const depositDisplayEl = document.getElementById('depositAmountDisplay');\r\n    const depositAmountText = tipo === 'nacional' ? formatCurrency(DEPOSIT_COLONES, 'nacional') : formatCurrency(DEPOSIT_USD, 'extranjero');\r\n    if (depositDisplayEl) {\r\n        depositDisplayEl.innerText = depositAmountText;\r\n    }\r\n    \/\/ Actualizar la nota importante para reflejar el tipo y el monto\r\n    const tilopayNoteEl = document.getElementById('tilopayDepositNote');\r\n    if (tilopayNoteEl) {\r\n        tilopayNoteEl.innerHTML = `<strong style=\"color: #0056b3;\">IMPORTANT NOTE:<\/strong> When booking, a deposit will be charged for \r\n            <span id=\"depositAmountDisplay\" style=\"font-weight:bold;\">${depositAmountText}<\/span>. The remaining amount must be canceled upon arrival.`;\r\n    }\r\n\r\n\r\n    \/\/ store computed numeric totals for PHP and Tilopay\r\n    _lastComputed = {\r\n        rawTotal: rawTotal,\r\n        discountPercent: totalDiscountPercent,\r\n        discountedTotal: discountedTotal,\r\n        currencyType: tipo\r\n    };\r\n}\r\n\r\n\/* ---------- Validation and UI helpers (C\u00d3DIGO MODIFICADO) ---------- *\/\r\nfunction clearAllFieldErrors() {\r\n    const ids = ['fecha','hora','tipoVisitante','guideLanguage','nombre','email','acompanantes','acceptTerms'];\r\n    ids.forEach(id => {\r\n        const el = document.getElementById(id);\r\n        if (el) clearFieldError(el);\r\n    });\r\n    const termsErr = document.getElementById('terms-error');\r\n    if(termsErr) termsErr.style.display = 'none';\r\n}\r\n\r\nfunction validateAll() {\r\n    clearAllFieldErrors();\r\n    let valid = true;\r\n\r\n    \/\/ travelers\r\n    const adultos = parseInt(document.getElementById('adultos').value) || 0;\r\n    const ninos = parseInt(document.getElementById('ninos').value) || 0;\r\n    const bebes = parseInt(document.getElementById('bebes').value) || 0;\r\n    const totalViajeros = adultos + ninos + bebes;\r\n\r\n    \/\/ VALIDACION 1: M\u00ednimo de 1 viajero (MODIFICADO DE 2 A 1)\r\n    if (totalViajeros < 1) {\r\n        const adultosEl = document.getElementById('adultos');\r\n        showFieldError(adultosEl, 'Minimum 1 traveler required \/ Se requiere m\u00ednimo 1 viajero');\r\n        valid = false;\r\n    }\r\n\r\n    \/\/ name\r\n    const nombreEl = document.getElementById('nombre');\r\n    const nombre = (nombreEl.value || '').trim();\r\n    if (!nombre) { showFieldError(nombreEl, 'Please enter full name \/ Por favor ingrese su nombre completo'); valid = false; }\r\n\r\n    \/\/ email\r\n    const emailEl = document.getElementById('email');\r\n    const email = (emailEl.value || '').trim();\r\n    const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\r\n    if (!email) { showFieldError(emailEl, 'Please enter email address \/ Por favor ingrese su correo'); valid = false; }\r\n    else if (!emailRegex.test(email)) { showFieldError(emailEl, 'Please enter a valid email address \/ Por favor ingrese un correo v\u00e1lido'); valid = false; }\r\n\r\n    \/\/ visitor type\r\n    const tipoEl = document.getElementById('tipoVisitante');\r\n    const tipo = tipoEl.value;\r\n    if (!tipo) { showFieldError(tipoEl, 'Please select visitor type \/ Seleccione tipo de visitante'); valid = false; }\r\n\r\n    \/\/ if extranjero -> guide language required\r\n    if (tipo === 'extranjero') {\r\n        const glEl = document.getElementById('guideLanguage');\r\n        const glVal = (glEl.value || '').trim();\r\n        if (!glVal) { showFieldError(glEl, 'Please select the guide language \/ Seleccione idioma del gu\u00eda'); valid = false; }\r\n    }\r\n\r\n    \/\/ date\r\n    const fechaEl = document.getElementById('fecha');\r\n    const fechaVal = fechaEl.value;\r\n    \/\/ La validaci\u00f3n de fecha antigua se ejecuta en applyDateRestriction\/change listener, aqu\u00ed solo revisamos si est\u00e1 vac\u00eda.\r\n    if (!fechaVal) { showFieldError(fechaEl, 'Please select a valid date \/ Por favor seleccione una fecha'); valid = false; }\r\n    \/\/ Volvemos a ejecutar la validaci\u00f3n de fecha para asegurarnos de que el customValidity est\u00e9 bien\r\n    if (fechaEl.customValidity && fechaEl.customValidity !== '') {\r\n        showFieldError(fechaEl, fechaEl.customValidity);\r\n        valid = false;\r\n    }\r\n\r\n\r\n    \/\/ time\r\n    const horaEl = document.getElementById('hora');\r\n    const horaVal = horaEl.value;\r\n    if (!horaVal) { showFieldError(horaEl, 'Please select a valid time \/ Por favor seleccione una hora'); valid = false; }\r\n\r\n    \/\/ VALIDACION 2: Nombres de acompa\u00f1antes OBLIGATORIO si son 2 o m\u00e1s viajeros\r\n    const acompEl = document.getElementById('acompanantes');\r\n    const acompVal = (acompEl.value || '').trim();\r\n    if (totalViajeros >= 2 && acompVal.length < 3) {\r\n        showFieldError(acompEl, 'Please list companion names when there are 2 or more people \/ Por favor liste los acompa\u00f1antes cuando hay 2 o m\u00e1s personas.');\r\n        valid = false;\r\n    }\r\n\r\n\r\n    \/\/ terms checkbox required\r\n    const accept = document.getElementById('acceptTerms');\r\n    if (!accept || !accept.checked) {\r\n        const termsErr = document.getElementById('terms-error');\r\n        termsErr.innerText = 'Debe aceptar los T\u00e9rminos y Condiciones y el uso de datos antes de continuar \/ You must accept Terms & Conditions and data usage.';\r\n        termsErr.style.display = 'block';\r\n        valid = false;\r\n    }\r\n\r\n    return valid;\r\n}\r\n\r\n\/* ---------- Gather form data for submission\/storage (Mantener sin cambios) ---------- *\/\r\nfunction gatherFormData() {\r\n    const tour = document.getElementById('tourTitle').innerText;\r\n    const nombre = document.getElementById('nombre').value.trim();\r\n    const fecha = document.getElementById('fecha').value;\r\n    const hora = document.getElementById('hora').value;\r\n    const tipo = document.getElementById('tipoVisitante').value;\r\n    const email = document.getElementById('email').value || 'N\/A';\r\n    const adultos = document.getElementById('adultos').value || '0';\r\n    const ninos = document.getElementById('ninos').value || '0';\r\n    const bebes = document.getElementById('bebes').value || '0';\r\n    const acompanantes = document.getElementById('acompanantes').value || '';\r\n    const guideLang = document.getElementById('guideLanguage').value || '';\r\n    const total = document.getElementById('total').innerText || '';\r\n    const discountText = document.getElementById('discountApplied').innerText || '';\r\n    const totalAfter = document.getElementById('totalAfterDiscount').innerText || '';\r\n    \/\/ No usamos 'comentarios' por ahora ya que no hay campo, pero se deja para el futuro.\r\n    const comentarios = '';\r\n\r\n    \/\/ extras array\r\n    let extrasArr = [];\r\n    if (document.getElementById('extraPerezoso')?.checked) extrasArr.push('Sloth & Tropical Birds Tour');\r\n    if ((parseInt(document.getElementById('botellasAgua')?.value) || 0) > 0) extrasArr.push('Bottled Water (' + document.getElementById('botellasAgua').value + ')');\r\n    if ((parseInt(document.getElementById('numToallas')?.value) || 0) > 0) extrasArr.push('Towels (' + document.getElementById('numToallas').value + ')');\r\n    if ((parseInt(document.getElementById('numSnacks')?.value) || 0) > 0) extrasArr.push('Snacks (' + document.getElementById('numSnacks').value + ')');\r\n    if ((parseInt(document.getElementById('numPonchos')?.value) || 0) > 0) extrasArr.push('Ponchos (' + document.getElementById('numPonchos').value + ')');\r\n    if ((parseInt(document.getElementById('numBinoculares')?.value) || 0) > 0 && !document.getElementById('extraPerezoso')?.checked) extrasArr.push('Binoculars (' + document.getElementById('numBinoculares').value + ')');\r\n    if (document.getElementById('extraGuia')?.checked) extrasArr.push('Optional Guide (\u20a16000)');\r\n    const extrasText = extrasArr.length ? extrasArr.join('\\n- ') : 'None';\r\n\r\n    \/\/ also include computed numeric totals if available\r\n    const computed = _lastComputed || {};\r\n    return {\r\n        tour, nombre, fecha, hora, tipo, email, adultos, ninos, bebes, acompanantes, guideLang, total, extrasText, discountText, totalAfter, comentarios,\r\n        rawTotal: computed.rawTotal || null,\r\n        discountedTotal: computed.discountedTotal || null,\r\n        currencyType: computed.currencyType || (document.getElementById('tipoVisitante').value || 'nacional')\r\n    };\r\n}\r\n\r\n\/* ---------- Proceed to payment (shows payment method options) (Mantener sin cambios) ---------- *\/\r\nfunction onProceedToPayment() {\r\n    \/\/ validate\r\n    if (!validateAll()) {\r\n        const firstInvalid = document.querySelector('.invalid-field');\r\n        if (firstInvalid) firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        return;\r\n    }\r\n    \/\/ show payment area\r\n    document.getElementById('paymentSection').style.display = 'block';\r\n    \/\/ hide proceed button to avoid duplicate\r\n    document.getElementById('btnProceed').style.display = 'none';\r\n\r\n    \/\/ Scroll payment section into view\r\n    document.getElementById('paymentSection').scrollIntoView({behavior: 'smooth', block: 'center'});\r\n\r\n    \/\/ Force run change handler to display details for selected (if any)\r\n    onPaymentMethodChange();\r\n}\r\n\r\n\/* ---------- Save reservation to server (for webhook) - \u00a1MODIFICADA! ---------- *\/\r\nfunction persistReservation(formData, paymentMethodLabel, orderReference, depositAmount, depositCurrency) {\r\n    const payload = Object.assign({}, formData, {\r\n        paymentMethod: paymentMethodLabel,\r\n        orderReference: orderReference,\r\n        depositAmount: depositAmount, \/\/ Se\u00f1a (monto a pagar en Tilopay)\r\n        depositCurrency: depositCurrency, \/\/ Moneda de la se\u00f1a\r\n        savedAt: new Date().toISOString()\r\n    });\r\n\r\n    \/\/ Guardar localmente solo para la p\u00e1gina de \u00e9xito, si la queremos usar de fallback.\r\n    try {\r\n        localStorage.setItem(STORAGE_KEY, JSON.stringify(payload));\r\n    } catch (e) {\r\n        console.error('Error saving reservation to localStorage (continuando con server)', e);\r\n    }\r\n\r\n    \/\/ 2. Guardar en el servidor (para que el webhook lo encuentre)\r\n    \/\/ Usamos async\/await para forzar que el guardado ocurra antes de la redirecci\u00f3n\r\n    return fetch(SAVE_URL, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application\/json' },\r\n        body: JSON.stringify(payload)\r\n    })\r\n    .then(response => response.json())\r\n    .then(data => {\r\n        if (!data.success) {\r\n            console.error('Error: La reserva NO se guard\u00f3 en el servidor:', data.message);\r\n            return false; \/\/ Bloquea la compra si no se guarda en el servidor\r\n        }\r\n        console.log(\"Reserva guardada en el servidor con \u00e9xito:\", orderReference);\r\n        return true;\r\n    })\r\n    .catch(error => {\r\n        console.error('Error de red al guardar en el servidor:', error);\r\n        return false;\r\n    });\r\n}\r\n\r\n\r\n\/* ---------- FUNCI\u00d3N DE PAGO CON TARJETA - \u00a1MODIFICADA! ---------- *\/\r\nasync function handleCardPayment() {\r\n    \/\/ 1. Re-validar los datos por seguridad\r\n    if (!validateAll()) {\r\n        alert('Please complete all form data correctly before proceeding to payment. \/ Por favor, complete todos los datos del formulario correctamente antes de pagar.');\r\n        const firstInvalid = document.querySelector('.invalid-field');\r\n        if (firstInvalid) firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        return;\r\n    }\r\n\r\n    const btn = document.querySelector('#tilopayButtonContainer button');\r\n    btn.disabled = true;\r\n    const originalText = btn.innerText;\r\n    btn.innerText = 'Saving reservation... \/ Guardando reserva...';\r\n\r\n    const reservationData = gatherFormData();\r\n\r\n    \/\/ 2. Generar Referencia \u00danica\r\n    reservationData.orderReference = generateOrderReference(); \/\/ Usaremos este valor como 'reference' en Tilopay\r\n\r\n    \/\/ 3. Obtener el monto de SE\u00d1A y configurar la moneda\r\n    const isUSD = reservationData.currencyType !== 'nacional';\r\n\r\n    let tilopayAmount;\r\n    let tilopayCurrency;\r\n    let tilopayLink;\r\n\r\n    if (isUSD) {\r\n        \/\/ Extranjeros: Se\u00f1a fija de $15.00 USD\r\n        tilopayAmount = DEPOSIT_USD.toFixed(2);\r\n        tilopayCurrency = 'USD';\r\n        tilopayLink = TILO_LINK_USD;\r\n    } else {\r\n        \/\/ Nacionales: Se\u00f1a fija de \u20a17000 CRC\r\n        tilopayAmount = DEPOSIT_COLONES;\r\n        tilopayCurrency = 'CRC';\r\n        tilopayLink = TILO_LINK_COLONES;\r\n    }\r\n\r\n    \/\/ 4. Guardar Datos de Reserva en el servidor ANTES de la redirecci\u00f3n\r\n    const savedToServer = await persistReservation(reservationData, 'Card (Tilopay - Deposit)', reservationData.orderReference, tilopayAmount, tilopayCurrency);\r\n\r\n    if (!savedToServer) {\r\n        alert(\"\u274c Error: Could not secure reservation on the server. Please try again. \/ No se pudo asegurar la reserva en el servidor. Intente nuevamente.\");\r\n        btn.disabled = false;\r\n        btn.innerText = originalText;\r\n        return;\r\n    }\r\n\r\n    \/\/ 5. Construir URL de Tilopay\r\n    const conceptText = encodeURIComponent(`Reservation: ${reservationData.tour}. Total: ${reservationData.total}. Deposit: ${tilopayCurrency} ${tilopayAmount}`);\r\n\r\n    const tilopayUrl = `${tilopayLink}?` +\r\n                        `amount=${tilopayAmount}` +\r\n                        `&currency=${tilopayCurrency}` +\r\n                        `&reference=${reservationData.orderReference}` + \/\/ \u00a1CRUCIAL! Tilopay nos devuelve este valor como 'reference' en el webhook.\r\n                        `&description=${conceptText}` +\r\n                        `&return_url=${RETURN_URL}`;\r\n\r\n    \/\/ 6. Redirigir a Tilopay (en la misma pesta\u00f1a)\r\n    btn.innerText = 'Redirecting to Tilopay... \/ Redirigiendo a Tilopay...';\r\n    window.location.href = tilopayUrl;\r\n}\r\n\r\n\/* ---------- Handle selection of payment method (C\u00d3DIGO MODIFICADO PARA SIMPE\/BINANCE) ---------- *\/\r\nfunction onPaymentMethodChange() {\r\n    const selected = document.querySelector('input[name=\"paymentMethod\"]:checked');\r\n    const detailsEl = document.getElementById('paymentDetails');\r\n    const tilopayBtnContainer = document.getElementById('tilopayButtonContainer');\r\n\r\n    detailsEl.innerHTML = '';\r\n    tilopayBtnContainer.style.display = 'none';\r\n\r\n    if (!selected) return;\r\n\r\n    const method = selected.value;\r\n    const data = gatherFormData();\r\n    const isUSD = data.currencyType !== 'nacional';\r\n    const depositAmountColones = formatCurrency(DEPOSIT_COLONES, 'nacional');\r\n    const depositAmountUSD = formatCurrency(DEPOSIT_USD, 'extranjero');\r\n\r\n    \/\/ Put a summary at top\r\n    const summaryHtml = `<div style=\"margin-bottom:8px;\"><strong>Summary:<\/strong><br>Tour: ${data.tour}<br>Date: ${data.fecha} ${data.hora}<br>Name: ${data.nombre}<br>Total Tour: ${data.total}<br>${data.discountText ? data.discountText + '<br>' + (data.totalAfter ? data.totalAfter : '') : ''}<\/div>`;\r\n    detailsEl.insertAdjacentHTML('beforeend', summaryHtml);\r\n\r\n    if (method === 'tarjeta') {\r\n        detailsEl.insertAdjacentHTML('beforeend', `\r\n            <div class=\"payment-note\">\r\n                <strong>Card Payment (Tilopay - Deposit)<\/strong><br>\r\n                Only the deposit of <strong>${isUSD ? depositAmountUSD : depositAmountColones}<\/strong> will be charged. The remainder is paid on site.<br>\r\n                <br>You will be redirected to the secure Tilopay payment gateway in this tab.\r\n            <\/div>\r\n        `);\r\n        \/\/ Mostrar el bot\u00f3n de pago con tarjeta\r\n        tilopayBtnContainer.style.display = 'block';\r\n        \r\n        \/\/ MEJORA 2: Forzar scroll hacia el bot\u00f3n de pago de Tilopay al seleccionarlo\r\n        setTimeout(() => {\r\n            tilopayBtnContainer.scrollIntoView({behavior: 'smooth', block: 'nearest'});\r\n        }, 100);\r\n\r\n    } else if (method === 'simpe' || method === 'binance') {\r\n        \/\/ --- L\u00d3GICA DE SUBIDA DE COMPROBANTE CON PHP ---\r\n        const isSimpe = method === 'simpe';\r\n        const paymentLabel = isSimpe ? 'Simpe M\u00f3vil' : 'Binance (USDT)';\r\n        const phoneOrID = isSimpe ? SIMPE_PHONE : BINANCE_ID;\r\n        const nameOrTitle = isSimpe ? SIMPE_NAME : 'Wallet ID';\r\n        const noteTitle = isSimpe ? 'Payment by Simpe M\u00f3vil' : 'Payment by Binance (USDT)';\r\n        \/\/ Obtenemos el monto a pagar, ya sea en CRC o USD\r\n        const totalToPay = data.total;\r\n        \r\n        \/\/ 3. Y 4. Textos de Simpe\/Binance (MODIFICADOS)\r\n        const depositAmount = isUSD ? depositAmountUSD : depositAmountColones;\r\n        \r\n        const instruction = `<div class=\"payment-note\">\r\n            <strong>${noteTitle}<\/strong><br>\r\n            Please make a deposit payment of <strong>${depositAmount}<\/strong> to <strong>${nameOrTitle}<\/strong>: <strong>${phoneOrID}<\/strong>.\r\n            <br><br>\r\n            The deposit amount will be **deducted from your total payment** on the day of the tour.\r\n            <br>\r\n            *Note: You have the option to pay the full amount (${totalToPay}) if you prefer to simplify management.*\r\n        <\/div>`;\r\n\r\n        \/\/ El campo de subida de archivo y el bot\u00f3n que llama a sendBookingByPHP\r\n        const uploadForm = `\r\n            <div style=\"border: 1px dashed #ff8c00; padding: 15px; border-radius: 8px; margin-top: 15px;\">\r\n                <p style=\"font-weight:bold; margin-bottom:10px;\">FINAL STEP: Upload your receipt to confirm your booking (English\/Spanish)<\/p>\r\n                <p style=\"margin-bottom:10px; font-size:0.9em;\">**We will confirm your payment to create your reservation.**<\/p>\r\n                <div class=\"form-group\" style=\"margin-bottom: 20px;\">\r\n                    <label for=\"comprobanteFile\"><b>Attach Payment Receipt (JPEG, PNG, PDF):<\/b><\/label>\r\n                    <input type=\"file\" id=\"comprobanteFile\" class=\"input\" accept=\"image\/jpeg,image\/png,application\/pdf\">\r\n                    <span id=\"comprobanteFile-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n                <button class=\"action-btn btn-blue\" type=\"button\" onclick=\"sendBookingByPHP('${paymentLabel}', 'deposit')\">\r\n                    Upload Receipt and Confirm Booking by Email\r\n                <\/button>\r\n            <\/div>\r\n            <p style=\"margin-top:10px;\">Optional: If you prefer to send via WhatsApp without attaching here, click: <a id=\"whatsappButton\" class=\"action-btn btn-green\" target=\"_blank\" href=\"#\">Send WhatsApp Message<\/a><\/p>\r\n            `;\r\n\r\n        detailsEl.insertAdjacentHTML('beforeend', instruction + uploadForm);\r\n        \r\n        \/\/ 5. L\u00f3gica del bot\u00f3n de WhatsApp (MEJORADA)\r\n        const whatsappButton = document.getElementById('whatsappButton');\r\n        if (whatsappButton) {\r\n            \/\/ La URL de WhatsApp se genera aqu\u00ed con toda la informaci\u00f3n\r\n            const whatsappMessage = `Hello, I made a booking with the following details:\\n\\n` +\r\n                `*Tour:* ${data.tour}\\n` +\r\n                `*Date:* ${data.fecha} at ${data.hora}\\n` +\r\n                `*Name:* ${data.nombre} (${data.email})\\n` +\r\n                `*Travelers:* ${parseInt(data.adultos)+parseInt(data.ninos)+parseInt(data.bebes)}\\n` +\r\n                `*Companion Names:* ${data.acompanantes || 'None'}\\n` +\r\n                `*Total Paid\/Deposit:* ${depositAmount} (for Simpe\/Binance)\\n` +\r\n                `*Total Tour Price:* ${data.total}\\n\\n` +\r\n                `I attach the payment receipt for the deposit\/full amount via ${paymentLabel}. Please confirm my reservation.`;\r\n            \r\n            whatsappButton.href = `https:\/\/wa.me\/${ADMIN_WHATSAPP}?text=${encodeURIComponent(whatsappMessage)}`;\r\n        }\r\n\r\n        detailsEl.scrollIntoView({behavior: 'smooth', block: 'center'});\r\n    }\r\n}\r\n\r\n\/* ---------- Funci\u00f3n de env\u00edo de datos y archivo (fetch con FormData) para Simpe\/Binance (C\u00d3DIGO MODIFICADO PARA MENSAJE DE \u00c9XITO) ---------- *\/\r\nfunction sendBookingByPHP(paymentMethod, paymentType) {\r\n    \/\/ 1. Validaciones\r\n    if (!validateAll()) {\r\n        const firstInvalid = document.querySelector('.invalid-field');\r\n        if (firstInvalid) firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        return;\r\n    }\r\n\r\n    const comprobanteFileEl = document.getElementById('comprobanteFile');\r\n    if (!comprobanteFileEl || !comprobanteFileEl.files.length) {\r\n        showFieldError(comprobanteFileEl, 'You must attach the payment receipt to send the booking. \/ Debe adjuntar el comprobante de pago para enviar la reserva.');\r\n        return;\r\n    }\r\n    clearFieldError(comprobanteFileEl);\r\n\r\n    \/\/ 2. Construir FormData (clave para enviar archivos)\r\n    const formData = new FormData();\r\n    const data = gatherFormData();\r\n    const isUSD = data.currencyType !== 'nacional';\r\n    const depositAmount = isUSD ? DEPOSIT_USD : DEPOSIT_COLONES;\r\n\r\n    \/\/ Adjuntar campos de texto\r\n    Object.keys(data).forEach(key => {\r\n        formData.append(key, data[key]);\r\n    });\r\n    \/\/ Adjuntar datos de c\u00e1lculo y m\u00e9todo de pago\r\n    formData.append('paymentMethod', paymentMethod);\r\n    formData.append('rawTotal', _lastComputed.rawTotal);\r\n    formData.append('discountedTotal', _lastComputed.discountedTotal);\r\n    formData.append('discountPercent', _lastComputed.discountPercent);\r\n    \/\/ Para Simpe\/Binance indicamos el pago de la se\u00f1a, aunque el usuario pueda haber pagado el total\r\n    formData.append('paymentAmount', depositAmount);\r\n    formData.append('paymentCurrency', _lastComputed.currencyType === 'nacional' ? 'CRC' : 'USD');\r\n    \/\/ Adjuntar el archivo (la clave 'comprobante' debe coincidir con el PHP)\r\n    formData.append('comprobante', comprobanteFileEl.files[0]);\r\n\r\n    \/\/ 3. Ejecutar el env\u00edo (AJAX \/ fetch)\r\n    const btn = document.querySelector(`[onclick=\"sendBookingByPHP('${paymentMethod}', 'deposit')\"]`);\r\n    const originalText = btn.innerText;\r\n    btn.disabled = true;\r\n    btn.innerText = 'Sending... \/ Enviando...';\r\n\r\n    fetch(SEND_BOOKING_URL, {\r\n        method: 'POST',\r\n        body: formData\r\n    })\r\n    .then(response => {\r\n        const contentType = response.headers.get(\"content-type\");\r\n        if (contentType && contentType.indexOf(\"application\/json\") !== -1) {\r\n            return response.json();\r\n        } else {\r\n            return response.text().then(text => {\r\n                console.error('Raw PHP Error:', text);\r\n                throw new Error(\"Response is not JSON. Server or PHP error: \" + text.substring(0, 100) + '...');\r\n            });\r\n        }\r\n    })\r\n    .then(data => {\r\n        if (data.success) {\r\n            \/\/ 7. Mensaje de \u00e9xito BILING\u00dcE MEJORADO\r\n            alert('\u2705 Booking and receipt successfully sent!\\n\\nWe have sent the details to your email and the administrator. \/ \u00a1Reserva y comprobante enviados exitosamente! Hemos enviado los detalles a su correo y al administrador.');\r\n            closeBookingForm();\r\n        } else {\r\n            console.error('Server error:', data.message);\r\n            alert('\u274c Error sending booking: ' + (data.message || ''));\r\n        }\r\n    })\r\n    .catch(error => {\r\n        console.error('Connection\/Upload error:', error.message);\r\n        alert('\u274c Connection Error. Email could not be sent. Check browser console.');\r\n    })\r\n    .finally(() => {\r\n        btn.disabled = false;\r\n        btn.innerText = originalText;\r\n    });\r\n}\r\n\r\n\/\/ ----------------------------------------------------\r\n\/\/ L\u00f3gica para los nuevos botones de Cantidad (+\/-) (Sin cambios)\r\n\/\/ ----------------------------------------------------\r\nfunction updateQuantity(targetId, delta) {\r\n    const inputEl = document.getElementById(targetId);\r\n    if (!inputEl) return;\r\n    \r\n    let currentValue = parseInt(inputEl.value) || 0;\r\n    let newValue = currentValue + delta;\r\n    \r\n    \/\/ Constraints (min=0 is already set in HTML, but good to re-check)\r\n    if (newValue < 0) {\r\n        newValue = 0;\r\n    }\r\n\r\n    inputEl.value = newValue;\r\n    \r\n    \/\/ Simulate input\/change event to trigger calculation\r\n    if (['adultos','ninos','bebes','fecha'].includes(targetId) || targetId.startsWith('num') || targetId.startsWith('botellas')) {\r\n        calcularTotal();\r\n    }\r\n}\r\n\r\n\/* ---------- Attach events to clear errors and recalc (Modificada para incluir los botones +\/-) ---------- *\/\r\ndocument.addEventListener('DOMContentLoaded', function(){\r\n    const ids = ['tipoVisitante','adultos','ninos','bebes','extraPerezoso','botellasAgua','numToallas','numSnacks','numPonchos','numBinoculares','extraGuia','fecha','hora','nombre','email','acompanantes','guideLanguage','acceptTerms'];\r\n    ids.forEach(id => {\r\n        const el = document.getElementById(id);\r\n        if (el) {\r\n            \/\/ Unificar eventos para recalcular y limpiar error\r\n            const eventNames = (el.type === 'text' || el.type === 'email' || el.type === 'textarea') ? ['input', 'change'] : ['change'];\r\n            eventNames.forEach(eventName => {\r\n                el.addEventListener(eventName, function(){\r\n                    clearFieldError(el);\r\n                    \/\/ Calcular total solo en campos que afectan el precio\r\n                    if (['adultos','ninos','bebes','tipoVisitante','extraPerezoso','botellasAgua','numToallas','numSnacks','numPonchos','numBinoculares','extraGuia','fecha'].includes(id)) {\r\n                        calcularTotal();\r\n                    }\r\n                });\r\n            });\r\n        }\r\n    });\r\n    \r\n    \/\/ Attach event listeners for the +\/- buttons\r\n    document.querySelectorAll('.qty-btn').forEach(button => {\r\n        button.addEventListener('click', function() {\r\n            const targetId = this.getAttribute('data-target');\r\n            const delta = this.classList.contains('plus-btn') ? 1 : -1;\r\n            updateQuantity(targetId, delta);\r\n        });\r\n    });\r\n\r\n\/\/ Forzar un c\u00e1lculo al cargar para asegurar que la nota de dep\u00f3sito est\u00e9 correcta inicialmente\r\n    calcularTotal();\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-26b5d04 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"26b5d04\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-046b05d elementor-widget elementor-widget-spacer\" data-id=\"046b05d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-536e712 e-flex e-con-boxed e-con e-parent\" data-id=\"536e712\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-40cb7f1 elementor-widget elementor-widget-heading\" data-id=\"40cb7f1\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"AventuraPlus\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Aventura Plus: Cascadas y Puente Colgante<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fe2f389 elementor-widget elementor-widget-spacer\" data-id=\"fe2f389\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c01bfaa elementor-widget__width-initial elementor-arrows-position-inside elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel\" data-id=\"c01bfaa\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;slides_to_show&quot;:&quot;1&quot;,&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;infinite&quot;:&quot;yes&quot;,&quot;effect&quot;:&quot;slide&quot;,&quot;speed&quot;:500}\" data-widget_type=\"image-carousel.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-image-carousel-wrapper swiper\" role=\"region\" aria-roledescription=\"carousel\" aria-label=\"Carrusel de im\u00e1genes\" dir=\"ltr\">\n\t\t\t<div class=\"elementor-image-carousel swiper-wrapper\" aria-live=\"off\">\n\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"1 de 4\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/Catarata-Editada-scaled-rbxkvn305eofnj9ja3fdr3tqbfwhpsmlko40cwzum8.jpg\" alt=\"{&quot;tiktok_developers_3p_anchor_params&quot;:&quot;{&quot;capability_name&quot;:&quot;retouch_edit_tool&quot;,&quot;picture_template_id&quot;:&quot;&quot;,&quot;source_type&quot;:&quot;vicut&quot;,&quot;client_key&quot;:&quot;aw889s25wozf8s7e&quot;}&quot;,&quot;editType&quot;:&quot;image_edit&quot;,&quot;pictureId&quot;:&quot;B66E1CC4-A9EF-452E-A6F7-ADC7154AEF89&quot;,&quot;exportType&quot;:&quot;image_export&quot;,&quot;data&quot;:{},&quot;source_type&quot;:&quot;vicut&quot;}\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"2 de 4\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/DSC_3898-1-scaled-rbmy8tkxdlzm4nyijuqdn4tno28g03jrpn5s1l237k.jpg\" alt=\"DSC_3898\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"3 de 4\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/IMG_1672-scaled-rbxkoaycsymv13x74f97sgh7e62cmui0wcski5vh6o.jpg\" alt=\"{&quot;exportType&quot;:&quot;image_export&quot;,&quot;pictureId&quot;:&quot;C8C79CF5-95FE-4E76-9C02-D571A061ED7B&quot;,&quot;editType&quot;:&quot;image_edit&quot;,&quot;source_type&quot;:&quot;vicut&quot;,&quot;data&quot;:{},&quot;tiktok_developers_3p_anchor_params&quot;:&quot;{&quot;picture_template_id&quot;:&quot;&quot;,&quot;client_key&quot;:&quot;aw889s25wozf8s7e&quot;,&quot;source_type&quot;:&quot;vicut&quot;,&quot;capability_name&quot;:&quot;retouch_edit_tool&quot;}&quot;}\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"4 de 4\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/Puente-Arana-scaled-r43fahwm8fpmxzwplv7lzg7pkwa7uvle6nf8to7lq8.jpg\" alt=\"Puente Aran\u0303a\" \/><\/figure><\/div>\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-prev\" role=\"button\" tabindex=\"0\">\n\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-left\" viewbox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M646 125C629 125 613 133 604 142L308 442C296 454 292 471 292 487 292 504 296 521 308 533L604 854C617 867 629 875 646 875 663 875 679 871 692 858 704 846 713 829 713 812 713 796 708 779 692 767L438 487 692 225C700 217 708 204 708 187 708 171 704 154 692 142 675 129 663 125 646 125Z\"><\/path><\/svg>\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-next\" role=\"button\" tabindex=\"0\">\n\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-right\" viewbox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M696 533C708 521 713 504 713 487 713 471 708 454 696 446L400 146C388 133 375 125 354 125 338 125 325 129 313 142 300 154 292 171 292 187 292 204 296 221 308 233L563 492 304 771C292 783 288 800 288 817 288 833 296 850 308 863 321 871 338 875 354 875 371 875 388 867 400 854L696 533Z\"><\/path><\/svg>\t\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"swiper-pagination\"><\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ffe0c77 e-flex e-con-boxed e-con e-parent\" data-id=\"ffe0c77\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-3121125 e-con-full e-flex e-con e-child\" data-id=\"3121125\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a9196df elementor-widget-mobile__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"a9196df\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"78\" data-end=\"467\">Este recorrido est\u00e1 dise\u00f1ado para quienes desean vivir la naturaleza con un poquito m\u00e1s de aventura, sin necesidad de gran condici\u00f3n f\u00edsica. Son aproximadamente 3,5 km de senderos accesibles, lo que representa 500 metros adicionales respecto al tour Aventura Esencial, y te lleva a descubrir tres puntos imperdibles: un imponente puente colgante y la oportunidad de visitar dos cataratas (Nakuru\u00a0y Paolita).<\/p><p data-start=\"469\" data-end=\"626\">Durante el recorrido, podr\u00e1s refrescarte en sus aguas cristalinas y acceder hasta el r\u00edo para disfrutar de un ba\u00f1o rodeado de la pureza del bosque tropical.<\/p><p data-start=\"628\" data-end=\"1004\">\u2728\ud83e\udda5 <strong data-start=\"632\" data-end=\"684\">Extra opcional (+$10 por persona):<\/strong><br data-start=\"684\" data-end=\"687\" \/>Avistamiento de perezosos Haz tu experiencia a\u00fan m\u00e1s especial visitando nuestra parcela de perezosos. Contar\u00e1s con binoculares y un telescopio para observarlos de cerca, acompa\u00f1ado por un gu\u00eda que te ayudar\u00e1 a descubrir cada detalle. Adem\u00e1s, podr\u00e1s aprovechar el tiempo para buscar m\u00e1s fauna silvestre, incluyendo aves tropicales, ya sea en los senderos o desde nuestro rancho.<\/p><p data-start=\"1006\" data-end=\"1216\">La duraci\u00f3n de este tour puede personalizarse seg\u00fan tu ritmo e intereses, y tambi\u00e9n contamos con otros extras disponibles que puedes solicitar al momento de tu reserva para hacer tu experiencia a\u00fan m\u00e1s c\u00f3moda y completa.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-209075b elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"209075b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div style=\"text-align:center; margin:1px 0;\">\r\n    <button\r\n        onclick=\"openBookingForm(this)\"\r\n        data-tour=\"Adventure Plus\"\r\n        data-desc=\"Total tour distance: 3,5 km \/ 2.17 miles (round trip), with an approximate duration from 2 to 3 hours.\"\r\n        data-precio-adulto-nacional=\"17600\"\r\n        data-precio-adulto-extranjero=\"40\"\r\n        data-precio-nino-nacional=\"8800\"\r\n        data-precio-nino-extranjero=\"25\"\r\n        style=\"background:#ff1a50; color:white; font-size:15px; padding:15px 77px; border:none; border-radius:30px; cursor:pointer; box-shadow: 0 4px 10px rgba(255, 26, 80, 0.4);\">\r\n        RESERVAR\r\n    <\/button>\r\n<\/div>\r\n\r\n<div id=\"bookingModal\" style=\"display:none; position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.7); z-index:9999; overflow:auto;\">\r\n    <div style=\"background:#fff; max-width:750px; margin:50px auto; padding:30px; border-radius:15px; position:relative; box-shadow: 0 5px 15px rgba(0,0,0,0.3);\">\r\n\r\n        <button onclick=\"closeBookingForm()\" style=\"position:absolute; top:15px; right:15px; font-size:24px; background:none; border:none; cursor:pointer; color:#333;\">\u2716<\/button>\r\n\r\n        <h2 style=\"text-align:center; margin-bottom:10px; color:#2E7D32; font-size:26px;\" id=\"tourTitle\"><\/h2>\r\n        <p style=\"text-align:center; margin-bottom:25px; color:#555;\" id=\"tourDesc\"><\/p>\r\n\r\n        <form id=\"bookingForm\" onsubmit=\"event.preventDefault();\" action=\"\">\r\n\r\n            <div style=\"margin-top:20px; margin-bottom:16px;\">\r\n                <label for=\"fecha\" class=\"form-label\"><b>\ud83d\udcc5 Fecha (Seleccionar fecha):<\/b><\/label><span id=\"fecha-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <input type=\"date\" id=\"fecha\" class=\"input\" required onchange=\"calcularTotal()\">\r\n                <span id=\"fecha-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <div style=\"margin-bottom:12px;\">\r\n                <label for=\"hora\" class=\"form-label\"><b>Hora (Seleccionar hora):<\/b><\/label><span id=\"hora-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <select id=\"hora\" class=\"input\">\r\n                    <option value=\"\" selected disabled>Select a time<\/option>\r\n                    <option value=\"8:00 am\">8:00 am<\/option>\r\n                    <option value=\"9:00 am\">9:00 am<\/option>\r\n                    <option value=\"10:00 am\">10:00 am<\/option>\r\n                    <option value=\"1:00 pm\">1:00 pm<\/option>\r\n                    <option value=\"2:00 pm\">2:00 pm<\/option>\r\n                <\/select>\r\n                <span id=\"hora-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <div style=\"margin-bottom:12px;\">\r\n                <label for=\"tipoVisitante\" class=\"form-label\"><b>Tipo de visitante (extranjero o residente):<\/b><\/label><span id=\"tipoVisitante-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <select id=\"tipoVisitante\" class=\"input\" onchange=\"onVisitorTypeChange(); calcularTotal()\">\r\n                    <option value=\"\" selected disabled>Select visitor type<\/option>\r\n                    <option value=\"extranjero\">Foreign \/ Extranjero<\/option>\r\n                    <option value=\"nacional\">Local \/ Nacional<\/option>\r\n                <\/select>\r\n                <span id=\"tipoVisitante-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <div id=\"guideLanguageDiv\" style=\"display:none; margin-bottom:15px;\">\r\n                <label for=\"guideLanguage\" class=\"form-label\"><b>Seleccionar idioma del gu\u00eda:<\/b><\/label><span id=\"guideLanguage-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <select id=\"guideLanguage\" class=\"input\">\r\n                    <option value=\"\" selected disabled>Select guide language<\/option>\r\n                    <option value=\"English\">English<\/option>\r\n                    <option value=\"Spanish\">Spanish<\/option>\r\n                <\/select>\r\n                <p class=\"note\"><i>Elige el idioma del gu\u00eda.<\/i><\/p>\r\n                <span id=\"guideLanguage-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n<h3 class=\"section-title\">Viajeros<\/h3>\r\n<p class=\"section-note\">Los precios var\u00edan seg\u00fan la edad y el n\u00famero de personas.<\/p>\r\n<p class=\"note\"><i>Total de viajeros: <span id=\"totalTravelers\" style=\"font-weight:bold;\">0<\/span><\/i><\/p>\r\n<p class=\"note discount-note\" id=\"discountNote\" style=\"display:none;\"><i>Descuentos de hasta un 30% disponibles para grupos grandes y reservas anticipadas.<\/i><\/p>\r\n\r\n<div class=\"traveler-row\">\r\n<div class=\"traveler-info\">\r\n<label for=\"adultos\" class=\"traveler-label\">Adultos (13-70 a\u00f1os):<span class=\"discount-tag discount-green\">-0%<\/span><\/label>\r\n<\/div>\r\n<div class=\"quantity-control\">\r\n<button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"adultos\">-<\/button>\r\n<input type=\"number\" id=\"adultos\" min=\"0\" value=\"0\" class=\"input-num\" oninput=\"calcularTotal()\">\r\n<button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"adultos\">+<\/button>\r\n<\/div>\r\n<\/div>\r\n<div class=\"traveler-row\">\r\n<div class=\"traveler-info\">\r\n<label for=\"ninos\" class=\"traveler-label\">Ni\u00f1os (5-12 a\u00f1os):<span class=\"discount-tag discount-green\">-50%*<\/span><\/label>\r\n<\/div>\r\n<div class=\"quantity-control\">\r\n<button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"ninos\">-<\/button>\r\n<input type=\"number\" id=\"ninos\" min=\"0\" value=\"0\" class=\"input-num\" oninput=\"calcularTotal()\">\r\n<button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"ninos\">+<\/button>\r\n<\/div>\r\n<\/div>\r\n<div class=\"traveler-row\">\r\n<div class=\"traveler-info\">\r\n<label for=\"bebes\" class=\"traveler-label\">Beb\u00e9s (0-4 a\u00f1os):<span class=\"discount-tag discount-green\">FREE*<\/span><\/label>\r\n<\/div>\r\n<div class=\"quantity-control\">\r\n<button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"bebes\">-<\/button>\r\n<input type=\"number\" id=\"bebes\" min=\"0\" value=\"0\" class=\"input-num\" oninput=\"calcularTotal()\">\r\n<button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"bebes\">+<\/button>\r\n<\/div>\r\n<\/div>\r\n\r\n<h3 class=\"section-title\">Agregar extras<\/h3>\r\n<p class=\"section-note\">Selecciona los art\u00edculos adicionales que necesitas y agrega la cantidad.<\/p>\r\n\r\n<div class=\"extra-item no-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" style=\"display:block;\">\r\n            <input type=\"checkbox\" id=\"extraPerezoso\" onchange=\"calcularTotal()\"> \r\n            Tour de Perezosos y Aves Tropicales (<span id=\"precioPerezoso\" class=\"price-span\" style=\"color:black;\">$10<\/span> por persona)\r\n        <\/label>\r\n        <p class=\"note\" style=\"margin-left:25px; margin-top:2px;\">\r\n            <i>(Incluye el uso de binoculares y telescopio)<\/i>\r\n        <\/p>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\" style=\"visibility:hidden; height:36px; border:none; width:110px; margin-left:10px;\"><\/div>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"botellasAgua\">Agua embotellada (<span id=\"precioAgua\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"botellasAgua\">-<\/button>\r\n        <input type=\"number\" id=\"botellasAgua\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"botellasAgua\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkAgua\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numToallas\">Toallas (<span id=\"precioToallas\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numToallas\">-<\/button>\r\n        <input type=\"number\" id=\"numToallas\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numToallas\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkToallas\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numSnacks\">Snacks Granuts (<span id=\"precioSnacks\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numSnacks\">-<\/button>\r\n        <input type=\"number\" id=\"numSnacks\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numSnacks\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkSnacks\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numPonchos\">Ponchos para la lluvia<span id=\"precioPonchos\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numPonchos\">-<\/button>\r\n        <input type=\"number\" id=\"numPonchos\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numPonchos\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkPonchos\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row final-extra-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numBinoculares\">Uso de binoculares (<span id=\"precioBinoculares\" class=\"price-span\" style=\"color:black;\">$5<\/span>)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numBinoculares\">-<\/button>\r\n        <input type=\"number\" id=\"numBinoculares\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numBinoculares\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkBinoculares\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<p class=\"note\" style=\"margin-left: 0; margin-top: -5px; margin-bottom: 20px; text-align: left; font-size: 0.85em; width: 100%;\">\r\n    <i>(Solo disponible si NO selecciona el Tour de Perezosos y Aves Tropicales)<\/i>\r\n<\/p>\r\n            <h3 class=\"section-title\">Informaci\u00f3n del cliente<\/h3>\r\n\r\n            <label for=\"nombre\" class=\"form-label\">Nombre completo:<\/label><span id=\"nombre-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n            <input type=\"text\" id=\"nombre\" class=\"input\" style=\"margin-bottom:6px;\">\r\n            <span id=\"nombre-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n\r\n            <label for=\"email\" class=\"form-label\">Email:<\/label><span id=\"email-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n            <input type=\"email\" id=\"email\" class=\"input\" style=\"margin-bottom:6px;\">\r\n            <span id=\"email-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n\r\n            <label for=\"acompanantes\" class=\"form-label\">Nombres de acompa\u00f1antes: <span id=\"acompanantes-note\" style=\"font-weight:normal; font-size:0.9em; color:#555;\">(Requerido si hay 2 o m\u00e1s viajeros)<\/span><\/label><span id=\"acompanantes-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n            <textarea id=\"acompanantes\" class=\"input\" style=\"margin-bottom:12px;\" placeholder=\"Enumera los nombres de los compa\u00f1eros separados por comas\"><\/textarea>\r\n            <span id=\"acompanantes-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n\r\n            <div style=\"margin:10px 0;\">\r\n                <style>\r\n                    #acceptTermsLink {\r\n                        color: #1A237E;\r\n                        font-weight: bold;\r\n                        text-decoration: none;\r\n                        transition: color 0.3s;\r\n                    }\r\n                    #acceptTermsLink:hover {\r\n                        color: #0D1033;\r\n                        text-decoration: underline;\r\n                    }\r\n                <\/style>\r\n                <label>\r\n                    <input type=\"checkbox\" id=\"acceptTerms\" style=\"margin-right:8px;\" onchange=\"clearFieldError(this)\">\r\n                    <span style=\"color:black;\">He le\u00eddo y acepto el <\/span>\r\n                    <a id=\"acceptTermsLink\" href=\"https:\/\/cuilpilapan.com\/es\/terms-and-conditions\/\" target=\"_blank\">T\u00e9rminos y Condiciones<\/a>\r\n                    <span style=\"color:black;\"> y doy mi consentimiento para el uso de mis datos personales para el proceso de reserva.<\/span>\r\n                <\/label>\r\n                <span id=\"terms-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <h2 style=\"margin-top: 8px; font-size: 28px; color: #333;\">Total: <span id=\"total\" style=\"color:#ff8c00;\">$0<\/span><\/h2>\r\n            <div id=\"discountApplied\" style=\"margin-bottom:8px; font-weight:bold; color:#2d6a4f; display:none;\"><\/div>\r\n            <div id=\"totalAfterDiscount\" style=\"margin-bottom:8px; font-weight:normal; text-decoration:line-through; color:#aaa; display:none;\"><\/div>\r\n\r\n            <div id=\"tilopayDepositNote\" style=\"background: #e6f7ff; border: 1px solid #91d5ff; padding: 10px; border-radius: 5px; margin-top: 10px;\">\r\n                <strong style=\"color: #0056b3;\">NOTA IMPORTANTE:<\/strong> Al reservar, se cobrar\u00e1 un dep\u00f3sito por\r\n                <span id=\"depositAmountDisplay\" style=\"font-weight:bold;\"><\/span> (\u20a17000 local \/ $15 extranjero). El monto restante debe pagarse al llegar.\r\n            <\/div>\r\n\r\n            <div id=\"guiaOpcionalDiv\" style=\"display:none; margin:15px 0;\">\r\n                <label><input type=\"checkbox\" id=\"extraGuia\" onchange=\"calcularTotal()\"> Gu\u00eda opcional (\u20a16000)<\/label>\r\n            <\/div>\r\n\r\n            <div style=\"background:#f9f9f9; padding:15px; border-radius:10px; box-shadow:0 2px 6px rgba(0,0,0,0.1); margin-top:20px;\">\r\n                <b>Recomendaciones:<\/b> Elige el tour que se adapte a tu capacidad f\u00edsica para disfrutar plenamente de la aventura.  \nLleva ropa adecuada, ropa extra, bocadillos, agua para mantenerte hidratado y cualquier medicamento personal si tienes una condici\u00f3n m\u00e9dica.  \nNo dudes en hacer cualquier pregunta.\r\n            <\/div>\r\n\r\n            <div style=\"text-align:center; margin-top:25px;\">\r\n                <button id=\"btnProceed\" onclick=\"onProceedToPayment()\" style=\"background:#ff8c00; color:white; font-size:18px; padding:15px 40px; border:none; border-radius:30px; cursor:pointer; margin-bottom:10px; box-shadow: 0 4px 10px rgba(255, 140, 0, 0.4);\">\r\n                    Proceder a la reserva \/ Proceder al pago\r\n                <\/button>\r\n            <\/div>\r\n\r\n            <div id=\"paymentSection\" style=\"display:none; margin-top:25px; border-top:1px solid #eee; padding-top:16px;\">\r\n                <h3 class=\"section-title\" style=\"font-size:20px;\">Seleccione su m\u00e9todo de pago \/ Select payment method<\/h3>\r\n                \r\n                <div style=\"display:flex; flex-direction:column; gap:12px;\">\r\n\r\n                    <label style=\"display:flex; align-items:center; gap:10px; padding:10px; border:1px solid #ddd; border-radius:10px; cursor:pointer; transition:transform 0.2s; background:#fafafa;\">\r\n                        <input type=\"radio\" name=\"paymentMethod\" value=\"tarjeta\" onchange=\"onPaymentMethodChange()\" style=\"transform:scale(1.3); margin-right:6px;\">\r\n                        <img decoding=\"async\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/10\/WhatsApp-Image-2025-10-22-at-3.59.08-PM.jpeg\"\r\n                            alt=\"Tilopay\" width=\"50\" height=\"50\" style=\"border-radius:8px; transition:transform 0.3s;\">\r\n                        <span style=\"font-size:16px;\">Tarjeta de Cr\u00e9dito\/D\u00e9bito (Tilopay) - Solo Dep\u00f3sito<\/span>\r\n                    <\/label>\r\n\r\n                    <label style=\"display:flex; align-items:center; gap:10px; padding:10px; border:1px solid #ddd; border-radius:10px; cursor:pointer; transition:transform 0.2s; background:#fafafa;\">\r\n                        <input type=\"radio\" name=\"paymentMethod\" value=\"simpe\" onchange=\"onPaymentMethodChange()\" style=\"transform:scale(1.3); margin-right:6px;\">\r\n                        <img decoding=\"async\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/10\/WhatsApp-Image-2025-10-22-at-3.57.36-PM.jpeg\"\r\n                            alt=\"Simpe M\u00f3vil\" width=\"50\" height=\"50\" style=\"border-radius:8px; transition:transform 0.3s;\">\r\n                        <span style=\"font-size:16px;\">Simpe M\u00f3vil - Solo Dep\u00f3sito (o pago completo)<\/span>\r\n                    <\/label>\r\n\r\n                    <label style=\"display:flex; align-items:center; gap:10px; padding:10px; border:1px solid #ddd; border-radius:10px; cursor:pointer; transition:transform 0.2s; background:#fafafa;\">\r\n                        <input type=\"radio\" name=\"paymentMethod\" value=\"binance\" onchange=\"onPaymentMethodChange()\" style=\"transform:scale(1.3); margin-right:6px;\">\r\n                        <img decoding=\"async\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/10\/WhatsApp-Image-2025-10-22-at-3.56.45-PM.jpeg\"\r\n                            alt=\"Binance\" width=\"50\" height=\"50\" style=\"border-radius:8px; transition:transform 0.3s;\">\r\n                        <span style=\"font-size:16px;\">Pago Binance (USDT) - Solo Dep\u00f3sito (o pago completo)<\/span>\r\n                    <\/label>\r\n                <\/div>\r\n\r\n<style>\r\n#paymentSection label:hover {\r\ntransform: scale(1.03);\r\nbackground: #fffbe6;\r\nbox-shadow: 0 2px 6px rgba(0,0,0,0.1);\r\n}\r\n#paymentSection img:hover {\r\ntransform: scale(1.1) rotate(3deg);\r\n}\r\n<\/style>\r\n\r\n<div id=\"paymentDetails\" style=\"margin-top:12px;\"><\/div>\r\n\r\n<div id=\"tilopayButtonContainer\" style=\"text-align:center; margin-top:20px; display:none;\">\r\n<button type=\"button\" onclick=\"handleCardPayment()\"\r\n                        style=\"                            background-color: #007bff;                            color: white;                            padding: 15px 30px;                            border: none;                            border-radius: 5px;                            font-size: 18px;                            cursor: pointer;                            box-shadow: 0 4px 6px rgba(0,0,0,0.1);                            transition: background-color 0.3s;                        \"\r\n                        onmouseover=\"this.style.backgroundColor='#0056b3'\"\r\n                        onmouseout=\"this.style.backgroundColor='#007bff'\"\r\n                    >\r\n                        \ud83d\udcb3 Pagar dep\u00f3sito ahora con tarjeta.\r\n                    <\/button>\r\n                    <p style=\"margin-top:10px; font-size:0.9em; color:#555;\">Ser\u00e1s redirigido a la pasarela de pago Tilopay en esta pesta\u00f1a.<\/p>\r\n                <\/div>\r\n            <\/div>\r\n\r\n        <input type=\"hidden\" name=\"trp-form-language\" value=\"es\"\/><\/form>\r\n\r\n    <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* Estilos Globales *\/\r\n.input, textarea, select { width:100%; padding:10px; margin:3px 0; border:1px solid #ddd; border-radius:8px; display:block; box-sizing: border-box; }\r\n\r\n\/* 1. ESTILO PARA DESHABILITAR D\u00cdAS ANTERIORES EN EL CALENDARIO *\/\r\ninput[type=\"date\"] { font-family: inherit; color: #333; }\r\n\/* MEJORA 1: Estilo para d\u00edas inv\u00e1lidos en Safari\/iOS *\/\r\ninput[type=\"date\"]:not([value=\"\"]):invalid { box-shadow: 0 0 5px rgba(231,76,60,0.6); }\r\n\r\n.input-num { width: 40px; text-align: center; border: none; padding: 0; -moz-appearance: textfield; }\r\n.input-num::-webkit-inner-spin-button, .input-num::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }\r\n\r\n.form-label { display:block; margin-bottom:6px; font-weight: 500; color: #333; }\r\n.note { font-size:0.9em; color:#555; margin:3px 0 5px 0; }\r\n.section-title { margin-top:20px; margin-bottom:10px; font-size:24px; color:#555; border-bottom: 2px solid #ddd; padding-bottom: 5px; }\r\n.section-note { margin-top:8px; margin-bottom:15px; font-weight:normal; color:#444; font-size:16px; }\r\n\r\n\/* Traveler Quantity Controls - REESTRUCTURADO PARA ESTILO ORIGINAL HORIZONTAL *\/\r\n.traveler-row { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; padding: 10px 0; border-bottom: 1px solid #eee; }\r\n.traveler-row:last-child { border-bottom: none; margin-bottom: 0; }\r\n.traveler-info { display: flex; align-items: center; } \/* Contenedor para label y descuento *\/\r\n.traveler-label { font-size: 16px; color: #333; display: flex; align-items: center; gap: 10px; margin-right: 15px; }\r\n.quantity-control { display: flex; align-items: center; border: 1px solid #ccc; border-radius: 5px; overflow: hidden; }\r\n.qty-btn { background: #f7f7f7; border: none; color: #555; padding: 8px 10px; cursor: pointer; font-weight: bold; font-size: 16px; transition: background 0.2s; line-height: 1; height: 36px; box-sizing: border-box; }\r\n.qty-btn:hover { background: #eee; color: #000; }\r\n.qty-btn:active { background: #ddd; }\r\n.input-num { padding: 8px 0; height: 36px; box-sizing: border-box; font-size: 16px; }\r\n\r\n\/* Discount Tags (Mantiene el estilo verde) *\/\r\n.discount-tag { background: #e9f5e9; color: #2E7D32; padding: 3px 8px; border-radius: 10px; font-size: 14px; font-weight: bold; margin-left: 0; white-space: nowrap; }\r\n\r\n\r\n\/* Extras with Quantity - REESTRUCTURADO PARA ESTILO TRAVELERS (MEJORA SOLICITADA) *\/\r\n\/* Contenedor principal para cada extra: similar a .traveler-row *\/\r\n.extra-item {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: flex-start; \/* Alineaci\u00f3n arriba para que las notas no muevan el control *\/\r\n    padding: 10px 0;\r\n    border-bottom: 1px solid #eee;\r\n}\r\n.extra-item.final-extra-row { border-bottom: none; }\r\n.extra-label-info {\r\n    display: flex;\r\n    flex-direction: column;\r\n    flex-grow: 1;\r\n    margin-right: 15px;\r\n}\r\n.extra-label { \r\n    font-size: 16px; \r\n    color: #333; \r\n    display: flex; \r\n    align-items: center; \r\n    margin-bottom: 0; \r\n}\r\n.extra-label input[type=\"checkbox\"] { \r\n    width: auto; \r\n    margin-right: 10px; \r\n}\r\n.extra-item .note { \r\n    margin-left: 25px; \/* Alineaci\u00f3n con el texto del label *\/\r\n    margin-top: 2px;\r\n    margin-bottom: 0; \r\n    font-size: 0.85em;\r\n}\r\n\r\n\r\n.price-span { font-weight: bold; color: #000; }\r\n.extra-qty-control { margin-left: 0; }\r\n.extra-num { width: 40px !important; }\r\n\r\n\/* Error visual *\/\r\n.invalid-field { border-color:#e74c3c !important; box-shadow: 0 0 4px rgba(231,76,60,0.4); }\r\n.field-error { color:#e74c3c; font-size:0.9em; display:block; margin-top:4px; }\r\n.field-asterisk { color:#e74c3c; font-weight:bold; margin-left:6px; font-size:1.2em; vertical-align:middle; }\r\n\r\n\/* Small helper for payment details box *\/\r\n#paymentDetails { background:#fafafa; padding:12px; border-radius:8px; border:1px dashed #ddd; margin-top:10px; }\r\n.payment-note { background:#fff3cd; padding:10px; border-radius:6px; margin-bottom:8px; border:1px solid #ffeeba; }\r\n.action-btn { display:inline-block; margin:6px 6px 0 0; padding:10px 14px; border-radius:8px; text-decoration:none; cursor:pointer; }\r\n.btn-green { background:#25d366; color:#fff; }\r\n.btn-blue { background:#0072c6; color:#fff; }\r\n.btn-gray { background:#6c757d; color:#fff; }\r\n<\/style>\r\n\r\n<script>\r\n\/* ---------- Helpers and state (Mantener sin cambios) ---------- *\/\r\nlet currentButton = null;\r\nconst CR_OFFSET_MINUTES = -6 * 60; \/\/ Costa Rica UTC-6 => -360 minutes\r\nconst ADMIN_WHATSAPP = '50660110640';\r\nconst ADMIN_EMAIL = 'contacto@cuilpilapan.com'; \/\/ Correo para recibir notificaciones\r\n\r\n\/\/ CONFIGURACI\u00d3N DE TILOPAY\r\nconst TILO_LINK_COLONES = 'https:\/\/tp.cr\/l\/MTYyMTQ3';\r\nconst DEPOSIT_COLONES = 7000;\r\nconst TILO_LINK_USD = 'https:\/\/tp.cr\/l\/MTYyMTQ4';\r\nconst DEPOSIT_USD = 15.00;\r\n\r\nconst RETURN_URL = 'https:\/\/cuilpilapan.com\/payment-success\/';\r\nconst SAVE_URL = '\/save_pending_reservation.php'; \/\/ URL para guardar la reserva antes de redirigir\r\nconst SEND_BOOKING_URL = '\/send_booking.php'; \/\/ URL para Simpe\/Binance\r\n\r\n\/\/ Simpe \/ Binance details\r\nconst SIMPE_PHONE = '60110640';\r\nconst SIMPE_NAME = 'Cuipilapan Sociedad Civil';\r\nconst BINANCE_ID = '450335940';\r\n\r\n\/\/ localStorage key to persist reservation data *after* redirection to Tilopay\r\nconst STORAGE_KEY = 'reservaCuilpilapan_v1';\r\nlet _lastComputed = {}; \/\/ Almacena el \u00faltimo c\u00e1lculo para el env\u00edo PHP\r\n\r\n\/**\r\n * Genera una referencia de pedido \u00fanica.\r\n * Formato: CUP-AAAAMMDD-RANDOM\r\n *\/\r\nfunction generateOrderReference() {\r\n    const date = new Date();\r\n    const dateStr = date.getFullYear().toString() +\r\n                    (date.getMonth() + 1).toString().padStart(2, '0') +\r\n                    date.getDate().toString().padStart(2, '0');\r\n    const randomStr = Math.random().toString(36).substring(2, 7).toUpperCase();\r\n    \/\/ Usamos \"CUP\" + la fecha + un random para la referencia que enviamos a Tilopay\r\n    return `CUP-${dateStr}-${randomStr}`;\r\n}\r\n\r\nfunction formatCurrency(amount, tipo) {\r\n    if (tipo === 'nacional') {\r\n        return '\u20a1' + Math.round(amount);\r\n    } else {\r\n        return '$' + Number(amount).toFixed(2);\r\n    }\r\n}\r\n\r\n\/* ---------- small UI helpers for errors (Mantener sin cambios) ---------- *\/\r\nfunction showFieldError(inputEl, message) {\r\n    if (!inputEl) return;\r\n    inputEl.classList.add('invalid-field');\r\n\r\n    \/\/ error span\r\n    const errId = inputEl.id + '-error';\r\n    let err = document.getElementById(errId);\r\n    if (!err) {\r\n        err = document.createElement('span');\r\n        err.id = errId;\r\n        err.className = 'field-error';\r\n        inputEl.parentNode.insertBefore(err, inputEl.nextSibling);\r\n    }\r\n    err.innerText = message;\r\n    err.style.display = 'block';\r\n\r\n    \/\/ asterisk\r\n    const starId = inputEl.id + '-asterisk';\r\n    let star = document.getElementById(starId);\r\n    if (!star) {\r\n        star = document.createElement('span');\r\n        star.id = starId;\r\n        star.className = 'field-asterisk';\r\n        star.innerText = '*';\r\n        \/\/ try to insert near the label if exists\r\n        const label = document.querySelector('label[for=\"' + inputEl.id + '\"]');\r\n        if (label && label.parentNode) {\r\n            label.parentNode.insertBefore(star, label.nextSibling);\r\n        } else {\r\n            \/\/ fallback: insert before input\r\n            inputEl.parentNode.insertBefore(star, inputEl);\r\n        }\r\n    }\r\n    star.style.display = 'inline';\r\n}\r\n\r\nfunction clearFieldError(inputEl) {\r\n    if (!inputEl) return;\r\n    inputEl.classList.remove('invalid-field');\r\n    const err = document.getElementById(inputEl.id + '-error');\r\n    if (err) { err.style.display = 'none'; err.innerText = ''; }\r\n    const star = document.getElementById(inputEl.id + '-asterisk');\r\n    if (star) star.style.display = 'none';\r\n}\r\n\r\n\/* ---------- Open \/ Close (Mantener sin cambios) ---------- *\/\r\nfunction openBookingForm(button) {\r\n    currentButton = button;\r\n    document.getElementById('bookingModal').style.display = 'block';\r\n    document.getElementById('tourTitle').innerText = button.getAttribute('data-tour') || 'Tour';\r\n    document.getElementById('tourDesc').innerText = button.getAttribute('data-desc') || '';\r\n\r\n    \/\/ 1. Aplicar restricci\u00f3n de calendario al abrir el modal\r\n    applyDateRestriction();\r\n\r\n    \/\/ reset UI errors and values if desired\r\n    clearAllFieldErrors();\r\n\r\n    \/\/ hide payment section\r\n    document.getElementById('paymentSection').style.display = 'none';\r\n    document.getElementById('paymentDetails').innerHTML = '';\r\n    document.getElementById('tilopayButtonContainer').style.display = 'none';\r\n\r\n    \/\/ Reset radio buttons\r\n    const radios = document.getElementsByName('paymentMethod');\r\n    for (let r of radios) r.checked = false;\r\n\r\n    document.getElementById('btnProceed').style.display = 'inline-block';\r\n\r\n    \/\/ Vuelva a calcular cuando se abre para obtener los precios correctos\r\n    calcularTotal();\r\n}\r\n\r\nfunction closeBookingForm() {\r\n    document.getElementById('bookingModal').style.display = 'none';\r\n}\r\n\r\n\/* 1. L\u00d3GICA DE CALENDARIO: Restringir fechas anteriores al d\u00eda actual (Costa Rica) *\/\r\nfunction applyDateRestriction() {\r\n    const fechaEl = document.getElementById('fecha');\r\n    if (!fechaEl) return;\r\n\r\n    \/\/ Calcular la fecha de hoy en Costa Rica (UTC-6)\r\n    const now = new Date();\r\n    const localOffsetMin = now.getTimezoneOffset(); \/\/ Offset local en minutos\r\n    const utcNowMs = now.getTime() + (localOffsetMin * 60000);\r\n    const crNowMs = utcNowMs + (CR_OFFSET_MINUTES * 60000);\r\n    const crToday = new Date(crNowMs);\r\n        \r\n    \/\/ Formatear a YYYY-MM-DD\r\n    const year = crToday.getFullYear();\r\n    const month = (crToday.getMonth() + 1).toString().padStart(2, '0');\r\n    const day = crToday.getDate().toString().padStart(2, '0');\r\n    const minDate = `${year}-${month}-${day}`;\r\n\r\n    \/\/ Establecer la fecha m\u00ednima para navegadores compatibles (Android, Desktop)\r\n    fechaEl.min = minDate;\r\n    \r\n    \/\/ MEJORA 1: A\u00f1adir un listener para validar en iOS\/navegadores que no respetan 'min'\r\n    fechaEl.addEventListener('change', function() {\r\n        const selectedDate = new Date(this.value);\r\n        \/\/ Crear una fecha de referencia de hoy a medianoche UTC\r\n        const todayRef = new Date(Date.UTC(crToday.getFullYear(), crToday.getMonth(), crToday.getDate()));\r\n\r\n        if (selectedDate < todayRef) {\r\n            \/\/ El d\u00eda seleccionado es anterior a hoy (Costa Rica)\r\n            this.setCustomValidity('The selected date cannot be in the past \/ La fecha seleccionada no puede ser anterior a hoy.');\r\n            this.classList.add('invalid-field');\r\n            showFieldError(this, 'The selected date cannot be in the past \/ La fecha seleccionada no puede ser anterior a hoy.');\r\n        } else {\r\n            this.setCustomValidity(''); \/\/ Limpiar el mensaje de error del navegador\r\n            clearFieldError(this);\r\n        }\r\n    });\r\n}\r\n\r\n\/* ---------- When visitor type changes (Mantener sin cambios) ---------- *\/\r\nfunction onVisitorTypeChange(){\r\n    const tipo = document.getElementById('tipoVisitante').value;\r\n    document.getElementById('guideLanguageDiv').style.display = (tipo === 'extranjero') ? 'block' : 'none';\r\n    calcularTotal();\r\n}\r\n\r\n\/* ---------- Core calculation (uses currentButton data-* prices) (C\u00d3DIGO COMPLETO) ---------- *\/\r\nfunction calcularTotal() {\r\n    if (!currentButton) return;\r\n\r\n    \/\/ get visitor type (if empty, temporarily treat as 'nacional' for price display)\r\n    let tipo = document.getElementById('tipoVisitante').value;\r\n    if (!tipo) tipo = 'nacional';\r\n\r\n    \/\/ travelers\r\n    let adultos = parseInt(document.getElementById('adultos').value) || 0;\r\n    let ninos = parseInt(document.getElementById('ninos').value) || 0;\r\n    let bebes = parseInt(document.getElementById('bebes').value) || 0;\r\n    let totalViajeros = adultos + ninos + bebes;\r\n    document.getElementById('totalTravelers').innerText = totalViajeros;\r\n\r\n    \/\/ base prices from data-* attributes on the button\r\n    let precioAdultoNac = parseFloat(currentButton.getAttribute('data-precio-adulto-nacional')) || 0;\r\n    let precioAdultoExt = parseFloat(currentButton.getAttribute('data-precio-adulto-extranjero')) || 0;\r\n    let precioAdulto = (tipo === 'nacional') ? precioAdultoNac : precioAdultoExt;\r\n    let precioNino = precioAdulto \/ 2;\r\n\r\n    \/\/ extras unit prices (local vs foreign)\r\n    let precioExtraPerezoso = (tipo === 'nacional') ? 3500 : 10;\r\n    let precioAgua = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioToallas = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioSnacks = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioPonchos = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioBinoculares = (tipo === 'nacional') ? 2000 : 5;\r\n\r\n    \/\/ quantities & selections\r\n    let extraPerezoso = document.getElementById('extraPerezoso').checked;\r\n    let botellasAgua = parseInt(document.getElementById('botellasAgua').value) || 0;\r\n    let numToallas = parseInt(document.getElementById('numToallas').value) || 0;\r\n    let numSnacks = parseInt(document.getElementById('numSnacks').value) || 0;\r\n    let numPonchos = parseInt(document.getElementById('numPonchos').value) || 0;\r\n    let numBinoculares = parseInt(document.getElementById('numBinoculares').value) || 0;\r\n    let guiaOpcional = document.getElementById('extraGuia')?.checked || false;\r\n\r\n    \/\/ start total with ticket prices (babies free)\r\n    let total = (adultos * precioAdulto) + (ninos * precioNino);\r\n\r\n    \/\/ extras\r\n    if (extraPerezoso) {\r\n        total += (adultos + ninos) * precioExtraPerezoso;\r\n    }\r\n    total += botellasAgua * precioAgua;\r\n    total += numToallas * precioToallas;\r\n    total += numSnacks * precioSnacks;\r\n    total += numPonchos * precioPonchos;\r\n\r\n    \/\/ Logic: Binoculars only available if Sloth Tour is NOT selected\r\n    if (numBinoculares > 0 && !extraPerezoso) {\r\n        total += numBinoculares * precioBinoculares;\r\n    } else if (extraPerezoso) {\r\n        \/\/ Force binocular quantity to 0 if sloth tour is checked\r\n        document.getElementById('numBinoculares').value = 0;\r\n    }\r\n    \r\n    if (guiaOpcional) total += (tipo === 'nacional' ? 6000 : 0); \/\/ Gu\u00eda Opcional: \u20a16000 (asumo solo para nacionales)\r\n\r\n    \/\/ 6. L\u00d3GICA DE DESCUENTOS MEJORADA\r\n    \r\n    \/\/ A. Descuento por cantidad de viajeros\r\n    let groupDiscount = 0;\r\n    if (totalViajeros >= 25) {\r\n        groupDiscount = 30; \/\/ 30% for 25+\r\n    } else if (totalViajeros > 14) {\r\n        groupDiscount = 20; \/\/ 20% for 15+\r\n    } else if (totalViajeros >= 10) {\r\n        groupDiscount = 15; \/\/ 15% for 10+\r\n    } else if (totalViajeros >= 6) {\r\n        groupDiscount = 10; \/\/ 10% for 6+\r\n    }\r\n\r\n    \/\/ B. Descuento por anticipaci\u00f3n de reserva\r\n    const fechaVal = document.getElementById('fecha').value;\r\n    let earlyDays = 0;\r\n    let earlyDiscount = 0;\r\n    if (fechaVal) {\r\n        const parts = fechaVal.split('-');\r\n        if (parts.length === 3) {\r\n            const y = parseInt(parts[0],10), m = parseInt(parts[1],10), d = parseInt(parts[2],10);\r\n            \/\/ compute CR now midnight reference\r\n            const now = new Date();\r\n            const localOffsetMin = now.getTimezoneOffset();\r\n            const utcNowMs = Date.now() + (localOffsetMin * 60000);\r\n            const crNowMs = utcNowMs + (CR_OFFSET_MINUTES * 60000);\r\n            const crNow = new Date(crNowMs);\r\n            \/\/ difference in days between (selected date) and current CR date\r\n            const selDate = new Date(Date.UTC(y, m-1, d));\r\n            const crToday = new Date(Date.UTC(crNow.getFullYear(), crNow.getMonth(), crNow.getDate()));\r\n            const diffMs = selDate - crToday;\r\n            earlyDays = Math.floor(diffMs \/ (1000*60*60*24));\r\n            \r\n            if (earlyDays >= 14) {\r\n                earlyDiscount = 20; \/\/ 20% for 2 weeks or more\r\n            } else if (earlyDays >= 7) {\r\n                earlyDiscount = 10; \/\/ 10% for 1 week or more\r\n            }\r\n        }\r\n    }\r\n    \r\n    \/\/ C. Descuento total (El m\u00e1ximo de A o B) + Adicional\r\n    let baseDiscount = Math.max(groupDiscount, earlyDiscount);\r\n    let additionalDiscount = 0;\r\n\r\n    \/\/ Descuento adicional por combinar grupo y anticipaci\u00f3n\r\n    if (groupDiscount > 0) {\r\n        if (earlyDays >= 14) {\r\n            additionalDiscount = 4; \/\/ 4% adicional por 2 semanas y grupo\r\n        } else if (earlyDays >= 7) {\r\n            additionalDiscount = 2; \/\/ 2% adicional por 1 semana y grupo\r\n        }\r\n    }\r\n    \r\n    let totalDiscountPercent = baseDiscount + additionalDiscount;\r\n\r\n    \/\/ Guardamos el total bruto (RAW TOTAL)\r\n    let rawTotal = total;\r\n\r\n    \/\/ aplicamos descuento\r\n    let discountedTotal = total;\r\n    let discountText = '';\r\n    if (totalDiscountPercent > 0) {\r\n        discountedTotal = total * (1 - totalDiscountPercent \/ 100);\r\n        discountText = `\ud83d\udcb0 Discount Applied: ${totalDiscountPercent}% (Group: ${groupDiscount}%, Early: ${earlyDiscount}%, Additional: ${additionalDiscount}%)`;\r\n    }\r\n\r\n    \/\/ Redondear a n\u00fameros enteros para colones (ya que Tilopay lo requiere entero)\r\n    if (tipo === 'nacional') {\r\n        rawTotal = Math.ceil(rawTotal);\r\n        discountedTotal = Math.ceil(discountedTotal);\r\n    }\r\n\r\n    \/\/ ----------------------------------------------------\r\n    \/\/ VISUALIZACI\u00d3N EN EL FORMULARIO (HTML)\r\n    \/\/ ----------------------------------------------------\r\n\r\n    document.getElementById('total').innerText = formatCurrency(discountedTotal, tipo);\r\n\r\n    if (totalDiscountPercent > 0) {\r\n        document.getElementById('discountApplied').style.display = 'block';\r\n        document.getElementById('discountApplied').innerText = discountText;\r\n\r\n        document.getElementById('totalAfterDiscount').style.display = 'block';\r\n        document.getElementById('totalAfterDiscount').innerText = `Total before discount: ${formatCurrency(rawTotal, tipo)}`;\r\n    } else {\r\n        document.getElementById('discountApplied').style.display = 'none';\r\n        document.getElementById('totalAfterDiscount').style.display = 'none';\r\n    }\r\n\r\n    document.getElementById('discountNote').style.display = (totalViajeros >= 6 || earlyDays >= 7) ? 'block' : 'none';\r\n\r\n    \/\/ show\/hide guiaOpcionalDiv\r\n    if (tipo === 'nacional' && totalViajeros < 4) {\r\n        document.getElementById('guiaOpcionalDiv').style.display = 'block';\r\n    } else {\r\n        document.getElementById('guiaOpcionalDiv').style.display = 'none';\r\n        document.getElementById('extraGuia').checked = false; \/\/ Desactivar si se oculta\r\n    }\r\n\r\n    \/\/ update unit-price labels\r\n    document.getElementById('precioPerezoso').innerText = formatCurrency(precioExtraPerezoso, tipo);\r\n    document.getElementById('precioAgua').innerText = formatCurrency(precioAgua, tipo);\r\n    document.getElementById('precioToallas').innerText = formatCurrency(precioToallas, tipo);\r\n    document.getElementById('precioSnacks').innerText = formatCurrency(precioSnacks, tipo);\r\n    document.getElementById('precioPonchos').innerText = formatCurrency(precioPonchos, tipo);\r\n    document.getElementById('precioBinoculares').innerText = formatCurrency(precioBinoculares, tipo);\r\n\r\n    \/\/ 2. Actualizar la nota de dep\u00f3sito\r\n    const depositDisplayEl = document.getElementById('depositAmountDisplay');\r\n    const depositAmountText = tipo === 'nacional' ? formatCurrency(DEPOSIT_COLONES, 'nacional') : formatCurrency(DEPOSIT_USD, 'extranjero');\r\n    if (depositDisplayEl) {\r\n        depositDisplayEl.innerText = depositAmountText;\r\n    }\r\n    \/\/ Actualizar la nota importante para reflejar el tipo y el monto\r\n    const tilopayNoteEl = document.getElementById('tilopayDepositNote');\r\n    if (tilopayNoteEl) {\r\n        tilopayNoteEl.innerHTML = `<strong style=\"color: #0056b3;\">IMPORTANT NOTE:<\/strong> When booking, a deposit will be charged for \r\n            <span id=\"depositAmountDisplay\" style=\"font-weight:bold;\">${depositAmountText}<\/span>. The remaining amount must be canceled upon arrival.`;\r\n    }\r\n\r\n\r\n    \/\/ store computed numeric totals for PHP and Tilopay\r\n    _lastComputed = {\r\n        rawTotal: rawTotal,\r\n        discountPercent: totalDiscountPercent,\r\n        discountedTotal: discountedTotal,\r\n        currencyType: tipo\r\n    };\r\n}\r\n\r\n\/* ---------- Validation and UI helpers (C\u00d3DIGO MODIFICADO) ---------- *\/\r\nfunction clearAllFieldErrors() {\r\n    const ids = ['fecha','hora','tipoVisitante','guideLanguage','nombre','email','acompanantes','acceptTerms'];\r\n    ids.forEach(id => {\r\n        const el = document.getElementById(id);\r\n        if (el) clearFieldError(el);\r\n    });\r\n    const termsErr = document.getElementById('terms-error');\r\n    if(termsErr) termsErr.style.display = 'none';\r\n}\r\n\r\nfunction validateAll() {\r\n    clearAllFieldErrors();\r\n    let valid = true;\r\n\r\n    \/\/ travelers\r\n    const adultos = parseInt(document.getElementById('adultos').value) || 0;\r\n    const ninos = parseInt(document.getElementById('ninos').value) || 0;\r\n    const bebes = parseInt(document.getElementById('bebes').value) || 0;\r\n    const totalViajeros = adultos + ninos + bebes;\r\n\r\n    \/\/ VALIDACION 1: M\u00ednimo de 1 viajero (MODIFICADO DE 2 A 1)\r\n    if (totalViajeros < 1) {\r\n        const adultosEl = document.getElementById('adultos');\r\n        showFieldError(adultosEl, 'Minimum 1 traveler required \/ Se requiere m\u00ednimo 1 viajero');\r\n        valid = false;\r\n    }\r\n\r\n    \/\/ name\r\n    const nombreEl = document.getElementById('nombre');\r\n    const nombre = (nombreEl.value || '').trim();\r\n    if (!nombre) { showFieldError(nombreEl, 'Please enter full name \/ Por favor ingrese su nombre completo'); valid = false; }\r\n\r\n    \/\/ email\r\n    const emailEl = document.getElementById('email');\r\n    const email = (emailEl.value || '').trim();\r\n    const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\r\n    if (!email) { showFieldError(emailEl, 'Please enter email address \/ Por favor ingrese su correo'); valid = false; }\r\n    else if (!emailRegex.test(email)) { showFieldError(emailEl, 'Please enter a valid email address \/ Por favor ingrese un correo v\u00e1lido'); valid = false; }\r\n\r\n    \/\/ visitor type\r\n    const tipoEl = document.getElementById('tipoVisitante');\r\n    const tipo = tipoEl.value;\r\n    if (!tipo) { showFieldError(tipoEl, 'Please select visitor type \/ Seleccione tipo de visitante'); valid = false; }\r\n\r\n    \/\/ if extranjero -> guide language required\r\n    if (tipo === 'extranjero') {\r\n        const glEl = document.getElementById('guideLanguage');\r\n        const glVal = (glEl.value || '').trim();\r\n        if (!glVal) { showFieldError(glEl, 'Please select the guide language \/ Seleccione idioma del gu\u00eda'); valid = false; }\r\n    }\r\n\r\n    \/\/ date\r\n    const fechaEl = document.getElementById('fecha');\r\n    const fechaVal = fechaEl.value;\r\n    \/\/ La validaci\u00f3n de fecha antigua se ejecuta en applyDateRestriction\/change listener, aqu\u00ed solo revisamos si est\u00e1 vac\u00eda.\r\n    if (!fechaVal) { showFieldError(fechaEl, 'Please select a valid date \/ Por favor seleccione una fecha'); valid = false; }\r\n    \/\/ Volvemos a ejecutar la validaci\u00f3n de fecha para asegurarnos de que el customValidity est\u00e9 bien\r\n    if (fechaEl.customValidity && fechaEl.customValidity !== '') {\r\n        showFieldError(fechaEl, fechaEl.customValidity);\r\n        valid = false;\r\n    }\r\n\r\n\r\n    \/\/ time\r\n    const horaEl = document.getElementById('hora');\r\n    const horaVal = horaEl.value;\r\n    if (!horaVal) { showFieldError(horaEl, 'Please select a valid time \/ Por favor seleccione una hora'); valid = false; }\r\n\r\n    \/\/ VALIDACION 2: Nombres de acompa\u00f1antes OBLIGATORIO si son 2 o m\u00e1s viajeros\r\n    const acompEl = document.getElementById('acompanantes');\r\n    const acompVal = (acompEl.value || '').trim();\r\n    if (totalViajeros >= 2 && acompVal.length < 3) {\r\n        showFieldError(acompEl, 'Please list companion names when there are 2 or more people \/ Por favor liste los acompa\u00f1antes cuando hay 2 o m\u00e1s personas.');\r\n        valid = false;\r\n    }\r\n\r\n\r\n    \/\/ terms checkbox required\r\n    const accept = document.getElementById('acceptTerms');\r\n    if (!accept || !accept.checked) {\r\n        const termsErr = document.getElementById('terms-error');\r\n        termsErr.innerText = 'Debe aceptar los T\u00e9rminos y Condiciones y el uso de datos antes de continuar \/ You must accept Terms & Conditions and data usage.';\r\n        termsErr.style.display = 'block';\r\n        valid = false;\r\n    }\r\n\r\n    return valid;\r\n}\r\n\r\n\/* ---------- Gather form data for submission\/storage (Mantener sin cambios) ---------- *\/\r\nfunction gatherFormData() {\r\n    const tour = document.getElementById('tourTitle').innerText;\r\n    const nombre = document.getElementById('nombre').value.trim();\r\n    const fecha = document.getElementById('fecha').value;\r\n    const hora = document.getElementById('hora').value;\r\n    const tipo = document.getElementById('tipoVisitante').value;\r\n    const email = document.getElementById('email').value || 'N\/A';\r\n    const adultos = document.getElementById('adultos').value || '0';\r\n    const ninos = document.getElementById('ninos').value || '0';\r\n    const bebes = document.getElementById('bebes').value || '0';\r\n    const acompanantes = document.getElementById('acompanantes').value || '';\r\n    const guideLang = document.getElementById('guideLanguage').value || '';\r\n    const total = document.getElementById('total').innerText || '';\r\n    const discountText = document.getElementById('discountApplied').innerText || '';\r\n    const totalAfter = document.getElementById('totalAfterDiscount').innerText || '';\r\n    \/\/ No usamos 'comentarios' por ahora ya que no hay campo, pero se deja para el futuro.\r\n    const comentarios = '';\r\n\r\n    \/\/ extras array\r\n    let extrasArr = [];\r\n    if (document.getElementById('extraPerezoso')?.checked) extrasArr.push('Sloth & Tropical Birds Tour');\r\n    if ((parseInt(document.getElementById('botellasAgua')?.value) || 0) > 0) extrasArr.push('Bottled Water (' + document.getElementById('botellasAgua').value + ')');\r\n    if ((parseInt(document.getElementById('numToallas')?.value) || 0) > 0) extrasArr.push('Towels (' + document.getElementById('numToallas').value + ')');\r\n    if ((parseInt(document.getElementById('numSnacks')?.value) || 0) > 0) extrasArr.push('Snacks (' + document.getElementById('numSnacks').value + ')');\r\n    if ((parseInt(document.getElementById('numPonchos')?.value) || 0) > 0) extrasArr.push('Ponchos (' + document.getElementById('numPonchos').value + ')');\r\n    if ((parseInt(document.getElementById('numBinoculares')?.value) || 0) > 0 && !document.getElementById('extraPerezoso')?.checked) extrasArr.push('Binoculars (' + document.getElementById('numBinoculares').value + ')');\r\n    if (document.getElementById('extraGuia')?.checked) extrasArr.push('Optional Guide (\u20a16000)');\r\n    const extrasText = extrasArr.length ? extrasArr.join('\\n- ') : 'None';\r\n\r\n    \/\/ also include computed numeric totals if available\r\n    const computed = _lastComputed || {};\r\n    return {\r\n        tour, nombre, fecha, hora, tipo, email, adultos, ninos, bebes, acompanantes, guideLang, total, extrasText, discountText, totalAfter, comentarios,\r\n        rawTotal: computed.rawTotal || null,\r\n        discountedTotal: computed.discountedTotal || null,\r\n        currencyType: computed.currencyType || (document.getElementById('tipoVisitante').value || 'nacional')\r\n    };\r\n}\r\n\r\n\/* ---------- Proceed to payment (shows payment method options) (Mantener sin cambios) ---------- *\/\r\nfunction onProceedToPayment() {\r\n    \/\/ validate\r\n    if (!validateAll()) {\r\n        const firstInvalid = document.querySelector('.invalid-field');\r\n        if (firstInvalid) firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        return;\r\n    }\r\n    \/\/ show payment area\r\n    document.getElementById('paymentSection').style.display = 'block';\r\n    \/\/ hide proceed button to avoid duplicate\r\n    document.getElementById('btnProceed').style.display = 'none';\r\n\r\n    \/\/ Scroll payment section into view\r\n    document.getElementById('paymentSection').scrollIntoView({behavior: 'smooth', block: 'center'});\r\n\r\n    \/\/ Force run change handler to display details for selected (if any)\r\n    onPaymentMethodChange();\r\n}\r\n\r\n\/* ---------- Save reservation to server (for webhook) - \u00a1MODIFICADA! ---------- *\/\r\nfunction persistReservation(formData, paymentMethodLabel, orderReference, depositAmount, depositCurrency) {\r\n    const payload = Object.assign({}, formData, {\r\n        paymentMethod: paymentMethodLabel,\r\n        orderReference: orderReference,\r\n        depositAmount: depositAmount, \/\/ Se\u00f1a (monto a pagar en Tilopay)\r\n        depositCurrency: depositCurrency, \/\/ Moneda de la se\u00f1a\r\n        savedAt: new Date().toISOString()\r\n    });\r\n\r\n    \/\/ Guardar localmente solo para la p\u00e1gina de \u00e9xito, si la queremos usar de fallback.\r\n    try {\r\n        localStorage.setItem(STORAGE_KEY, JSON.stringify(payload));\r\n    } catch (e) {\r\n        console.error('Error saving reservation to localStorage (continuando con server)', e);\r\n    }\r\n\r\n    \/\/ 2. Guardar en el servidor (para que el webhook lo encuentre)\r\n    \/\/ Usamos async\/await para forzar que el guardado ocurra antes de la redirecci\u00f3n\r\n    return fetch(SAVE_URL, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application\/json' },\r\n        body: JSON.stringify(payload)\r\n    })\r\n    .then(response => response.json())\r\n    .then(data => {\r\n        if (!data.success) {\r\n            console.error('Error: La reserva NO se guard\u00f3 en el servidor:', data.message);\r\n            return false; \/\/ Bloquea la compra si no se guarda en el servidor\r\n        }\r\n        console.log(\"Reserva guardada en el servidor con \u00e9xito:\", orderReference);\r\n        return true;\r\n    })\r\n    .catch(error => {\r\n        console.error('Error de red al guardar en el servidor:', error);\r\n        return false;\r\n    });\r\n}\r\n\r\n\r\n\/* ---------- FUNCI\u00d3N DE PAGO CON TARJETA - \u00a1MODIFICADA! ---------- *\/\r\nasync function handleCardPayment() {\r\n    \/\/ 1. Re-validar los datos por seguridad\r\n    if (!validateAll()) {\r\n        alert('Please complete all form data correctly before proceeding to payment. \/ Por favor, complete todos los datos del formulario correctamente antes de pagar.');\r\n        const firstInvalid = document.querySelector('.invalid-field');\r\n        if (firstInvalid) firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        return;\r\n    }\r\n\r\n    const btn = document.querySelector('#tilopayButtonContainer button');\r\n    btn.disabled = true;\r\n    const originalText = btn.innerText;\r\n    btn.innerText = 'Saving reservation... \/ Guardando reserva...';\r\n\r\n    const reservationData = gatherFormData();\r\n\r\n    \/\/ 2. Generar Referencia \u00danica\r\n    reservationData.orderReference = generateOrderReference(); \/\/ Usaremos este valor como 'reference' en Tilopay\r\n\r\n    \/\/ 3. Obtener el monto de SE\u00d1A y configurar la moneda\r\n    const isUSD = reservationData.currencyType !== 'nacional';\r\n\r\n    let tilopayAmount;\r\n    let tilopayCurrency;\r\n    let tilopayLink;\r\n\r\n    if (isUSD) {\r\n        \/\/ Extranjeros: Se\u00f1a fija de $15.00 USD\r\n        tilopayAmount = DEPOSIT_USD.toFixed(2);\r\n        tilopayCurrency = 'USD';\r\n        tilopayLink = TILO_LINK_USD;\r\n    } else {\r\n        \/\/ Nacionales: Se\u00f1a fija de \u20a17000 CRC\r\n        tilopayAmount = DEPOSIT_COLONES;\r\n        tilopayCurrency = 'CRC';\r\n        tilopayLink = TILO_LINK_COLONES;\r\n    }\r\n\r\n    \/\/ 4. Guardar Datos de Reserva en el servidor ANTES de la redirecci\u00f3n\r\n    const savedToServer = await persistReservation(reservationData, 'Card (Tilopay - Deposit)', reservationData.orderReference, tilopayAmount, tilopayCurrency);\r\n\r\n    if (!savedToServer) {\r\n        alert(\"\u274c Error: Could not secure reservation on the server. Please try again. \/ No se pudo asegurar la reserva en el servidor. Intente nuevamente.\");\r\n        btn.disabled = false;\r\n        btn.innerText = originalText;\r\n        return;\r\n    }\r\n\r\n    \/\/ 5. Construir URL de Tilopay\r\n    const conceptText = encodeURIComponent(`Reservation: ${reservationData.tour}. Total: ${reservationData.total}. Deposit: ${tilopayCurrency} ${tilopayAmount}`);\r\n\r\n    const tilopayUrl = `${tilopayLink}?` +\r\n                        `amount=${tilopayAmount}` +\r\n                        `&currency=${tilopayCurrency}` +\r\n                        `&reference=${reservationData.orderReference}` + \/\/ \u00a1CRUCIAL! Tilopay nos devuelve este valor como 'reference' en el webhook.\r\n                        `&description=${conceptText}` +\r\n                        `&return_url=${RETURN_URL}`;\r\n\r\n    \/\/ 6. Redirigir a Tilopay (en la misma pesta\u00f1a)\r\n    btn.innerText = 'Redirecting to Tilopay... \/ Redirigiendo a Tilopay...';\r\n    window.location.href = tilopayUrl;\r\n}\r\n\r\n\/* ---------- Handle selection of payment method (C\u00d3DIGO MODIFICADO PARA SIMPE\/BINANCE) ---------- *\/\r\nfunction onPaymentMethodChange() {\r\n    const selected = document.querySelector('input[name=\"paymentMethod\"]:checked');\r\n    const detailsEl = document.getElementById('paymentDetails');\r\n    const tilopayBtnContainer = document.getElementById('tilopayButtonContainer');\r\n\r\n    detailsEl.innerHTML = '';\r\n    tilopayBtnContainer.style.display = 'none';\r\n\r\n    if (!selected) return;\r\n\r\n    const method = selected.value;\r\n    const data = gatherFormData();\r\n    const isUSD = data.currencyType !== 'nacional';\r\n    const depositAmountColones = formatCurrency(DEPOSIT_COLONES, 'nacional');\r\n    const depositAmountUSD = formatCurrency(DEPOSIT_USD, 'extranjero');\r\n\r\n    \/\/ Put a summary at top\r\n    const summaryHtml = `<div style=\"margin-bottom:8px;\"><strong>Summary:<\/strong><br>Tour: ${data.tour}<br>Date: ${data.fecha} ${data.hora}<br>Name: ${data.nombre}<br>Total Tour: ${data.total}<br>${data.discountText ? data.discountText + '<br>' + (data.totalAfter ? data.totalAfter : '') : ''}<\/div>`;\r\n    detailsEl.insertAdjacentHTML('beforeend', summaryHtml);\r\n\r\n    if (method === 'tarjeta') {\r\n        detailsEl.insertAdjacentHTML('beforeend', `\r\n            <div class=\"payment-note\">\r\n                <strong>Card Payment (Tilopay - Deposit)<\/strong><br>\r\n                Only the deposit of <strong>${isUSD ? depositAmountUSD : depositAmountColones}<\/strong> will be charged. The remainder is paid on site.<br>\r\n                <br>You will be redirected to the secure Tilopay payment gateway in this tab.\r\n            <\/div>\r\n        `);\r\n        \/\/ Mostrar el bot\u00f3n de pago con tarjeta\r\n        tilopayBtnContainer.style.display = 'block';\r\n        \r\n        \/\/ MEJORA 2: Forzar scroll hacia el bot\u00f3n de pago de Tilopay al seleccionarlo\r\n        setTimeout(() => {\r\n            tilopayBtnContainer.scrollIntoView({behavior: 'smooth', block: 'nearest'});\r\n        }, 100);\r\n\r\n    } else if (method === 'simpe' || method === 'binance') {\r\n        \/\/ --- L\u00d3GICA DE SUBIDA DE COMPROBANTE CON PHP ---\r\n        const isSimpe = method === 'simpe';\r\n        const paymentLabel = isSimpe ? 'Simpe M\u00f3vil' : 'Binance (USDT)';\r\n        const phoneOrID = isSimpe ? SIMPE_PHONE : BINANCE_ID;\r\n        const nameOrTitle = isSimpe ? SIMPE_NAME : 'Wallet ID';\r\n        const noteTitle = isSimpe ? 'Payment by Simpe M\u00f3vil' : 'Payment by Binance (USDT)';\r\n        \/\/ Obtenemos el monto a pagar, ya sea en CRC o USD\r\n        const totalToPay = data.total;\r\n        \r\n        \/\/ 3. Y 4. Textos de Simpe\/Binance (MODIFICADOS)\r\n        const depositAmount = isUSD ? depositAmountUSD : depositAmountColones;\r\n        \r\n        const instruction = `<div class=\"payment-note\">\r\n            <strong>${noteTitle}<\/strong><br>\r\n            Please make a deposit payment of <strong>${depositAmount}<\/strong> to <strong>${nameOrTitle}<\/strong>: <strong>${phoneOrID}<\/strong>.\r\n            <br><br>\r\n            The deposit amount will be **deducted from your total payment** on the day of the tour.\r\n            <br>\r\n            *Note: You have the option to pay the full amount (${totalToPay}) if you prefer to simplify management.*\r\n        <\/div>`;\r\n\r\n        \/\/ El campo de subida de archivo y el bot\u00f3n que llama a sendBookingByPHP\r\n        const uploadForm = `\r\n            <div style=\"border: 1px dashed #ff8c00; padding: 15px; border-radius: 8px; margin-top: 15px;\">\r\n                <p style=\"font-weight:bold; margin-bottom:10px;\">FINAL STEP: Upload your receipt to confirm your booking (English\/Spanish)<\/p>\r\n                <p style=\"margin-bottom:10px; font-size:0.9em;\">**We will confirm your payment to create your reservation.**<\/p>\r\n                <div class=\"form-group\" style=\"margin-bottom: 20px;\">\r\n                    <label for=\"comprobanteFile\"><b>Attach Payment Receipt (JPEG, PNG, PDF):<\/b><\/label>\r\n                    <input type=\"file\" id=\"comprobanteFile\" class=\"input\" accept=\"image\/jpeg,image\/png,application\/pdf\">\r\n                    <span id=\"comprobanteFile-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n                <button class=\"action-btn btn-blue\" type=\"button\" onclick=\"sendBookingByPHP('${paymentLabel}', 'deposit')\">\r\n                    Upload Receipt and Confirm Booking by Email\r\n                <\/button>\r\n            <\/div>\r\n            <p style=\"margin-top:10px;\">Optional: If you prefer to send via WhatsApp without attaching here, click: <a id=\"whatsappButton\" class=\"action-btn btn-green\" target=\"_blank\" href=\"#\">Send WhatsApp Message<\/a><\/p>\r\n            `;\r\n\r\n        detailsEl.insertAdjacentHTML('beforeend', instruction + uploadForm);\r\n        \r\n        \/\/ 5. L\u00f3gica del bot\u00f3n de WhatsApp (MEJORADA)\r\n        const whatsappButton = document.getElementById('whatsappButton');\r\n        if (whatsappButton) {\r\n            \/\/ La URL de WhatsApp se genera aqu\u00ed con toda la informaci\u00f3n\r\n            const whatsappMessage = `Hello, I made a booking with the following details:\\n\\n` +\r\n                `*Tour:* ${data.tour}\\n` +\r\n                `*Date:* ${data.fecha} at ${data.hora}\\n` +\r\n                `*Name:* ${data.nombre} (${data.email})\\n` +\r\n                `*Travelers:* ${parseInt(data.adultos)+parseInt(data.ninos)+parseInt(data.bebes)}\\n` +\r\n                `*Companion Names:* ${data.acompanantes || 'None'}\\n` +\r\n                `*Total Paid\/Deposit:* ${depositAmount} (for Simpe\/Binance)\\n` +\r\n                `*Total Tour Price:* ${data.total}\\n\\n` +\r\n                `I attach the payment receipt for the deposit\/full amount via ${paymentLabel}. Please confirm my reservation.`;\r\n            \r\n            whatsappButton.href = `https:\/\/wa.me\/${ADMIN_WHATSAPP}?text=${encodeURIComponent(whatsappMessage)}`;\r\n        }\r\n\r\n        detailsEl.scrollIntoView({behavior: 'smooth', block: 'center'});\r\n    }\r\n}\r\n\r\n\/* ---------- Funci\u00f3n de env\u00edo de datos y archivo (fetch con FormData) para Simpe\/Binance (C\u00d3DIGO MODIFICADO PARA MENSAJE DE \u00c9XITO) ---------- *\/\r\nfunction sendBookingByPHP(paymentMethod, paymentType) {\r\n    \/\/ 1. Validaciones\r\n    if (!validateAll()) {\r\n        const firstInvalid = document.querySelector('.invalid-field');\r\n        if (firstInvalid) firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        return;\r\n    }\r\n\r\n    const comprobanteFileEl = document.getElementById('comprobanteFile');\r\n    if (!comprobanteFileEl || !comprobanteFileEl.files.length) {\r\n        showFieldError(comprobanteFileEl, 'You must attach the payment receipt to send the booking. \/ Debe adjuntar el comprobante de pago para enviar la reserva.');\r\n        return;\r\n    }\r\n    clearFieldError(comprobanteFileEl);\r\n\r\n    \/\/ 2. Construir FormData (clave para enviar archivos)\r\n    const formData = new FormData();\r\n    const data = gatherFormData();\r\n    const isUSD = data.currencyType !== 'nacional';\r\n    const depositAmount = isUSD ? DEPOSIT_USD : DEPOSIT_COLONES;\r\n\r\n    \/\/ Adjuntar campos de texto\r\n    Object.keys(data).forEach(key => {\r\n        formData.append(key, data[key]);\r\n    });\r\n    \/\/ Adjuntar datos de c\u00e1lculo y m\u00e9todo de pago\r\n    formData.append('paymentMethod', paymentMethod);\r\n    formData.append('rawTotal', _lastComputed.rawTotal);\r\n    formData.append('discountedTotal', _lastComputed.discountedTotal);\r\n    formData.append('discountPercent', _lastComputed.discountPercent);\r\n    \/\/ Para Simpe\/Binance indicamos el pago de la se\u00f1a, aunque el usuario pueda haber pagado el total\r\n    formData.append('paymentAmount', depositAmount);\r\n    formData.append('paymentCurrency', _lastComputed.currencyType === 'nacional' ? 'CRC' : 'USD');\r\n    \/\/ Adjuntar el archivo (la clave 'comprobante' debe coincidir con el PHP)\r\n    formData.append('comprobante', comprobanteFileEl.files[0]);\r\n\r\n    \/\/ 3. Ejecutar el env\u00edo (AJAX \/ fetch)\r\n    const btn = document.querySelector(`[onclick=\"sendBookingByPHP('${paymentMethod}', 'deposit')\"]`);\r\n    const originalText = btn.innerText;\r\n    btn.disabled = true;\r\n    btn.innerText = 'Sending... \/ Enviando...';\r\n\r\n    fetch(SEND_BOOKING_URL, {\r\n        method: 'POST',\r\n        body: formData\r\n    })\r\n    .then(response => {\r\n        const contentType = response.headers.get(\"content-type\");\r\n        if (contentType && contentType.indexOf(\"application\/json\") !== -1) {\r\n            return response.json();\r\n        } else {\r\n            return response.text().then(text => {\r\n                console.error('Raw PHP Error:', text);\r\n                throw new Error(\"Response is not JSON. Server or PHP error: \" + text.substring(0, 100) + '...');\r\n            });\r\n        }\r\n    })\r\n    .then(data => {\r\n        if (data.success) {\r\n            \/\/ 7. Mensaje de \u00e9xito BILING\u00dcE MEJORADO\r\n            alert('\u2705 Booking and receipt successfully sent!\\n\\nWe have sent the details to your email and the administrator. \/ \u00a1Reserva y comprobante enviados exitosamente! Hemos enviado los detalles a su correo y al administrador.');\r\n            closeBookingForm();\r\n        } else {\r\n            console.error('Server error:', data.message);\r\n            alert('\u274c Error sending booking: ' + (data.message || ''));\r\n        }\r\n    })\r\n    .catch(error => {\r\n        console.error('Connection\/Upload error:', error.message);\r\n        alert('\u274c Connection Error. Email could not be sent. Check browser console.');\r\n    })\r\n    .finally(() => {\r\n        btn.disabled = false;\r\n        btn.innerText = originalText;\r\n    });\r\n}\r\n\r\n\/\/ ----------------------------------------------------\r\n\/\/ L\u00f3gica para los nuevos botones de Cantidad (+\/-) (Sin cambios)\r\n\/\/ ----------------------------------------------------\r\nfunction updateQuantity(targetId, delta) {\r\n    const inputEl = document.getElementById(targetId);\r\n    if (!inputEl) return;\r\n    \r\n    let currentValue = parseInt(inputEl.value) || 0;\r\n    let newValue = currentValue + delta;\r\n    \r\n    \/\/ Constraints (min=0 is already set in HTML, but good to re-check)\r\n    if (newValue < 0) {\r\n        newValue = 0;\r\n    }\r\n\r\n    inputEl.value = newValue;\r\n    \r\n    \/\/ Simulate input\/change event to trigger calculation\r\n    if (['adultos','ninos','bebes','fecha'].includes(targetId) || targetId.startsWith('num') || targetId.startsWith('botellas')) {\r\n        calcularTotal();\r\n    }\r\n}\r\n\r\n\/* ---------- Attach events to clear errors and recalc (Modificada para incluir los botones +\/-) ---------- *\/\r\ndocument.addEventListener('DOMContentLoaded', function(){\r\n    const ids = ['tipoVisitante','adultos','ninos','bebes','extraPerezoso','botellasAgua','numToallas','numSnacks','numPonchos','numBinoculares','extraGuia','fecha','hora','nombre','email','acompanantes','guideLanguage','acceptTerms'];\r\n    ids.forEach(id => {\r\n        const el = document.getElementById(id);\r\n        if (el) {\r\n            \/\/ Unificar eventos para recalcular y limpiar error\r\n            const eventNames = (el.type === 'text' || el.type === 'email' || el.type === 'textarea') ? ['input', 'change'] : ['change'];\r\n            eventNames.forEach(eventName => {\r\n                el.addEventListener(eventName, function(){\r\n                    clearFieldError(el);\r\n                    \/\/ Calcular total solo en campos que afectan el precio\r\n                    if (['adultos','ninos','bebes','tipoVisitante','extraPerezoso','botellasAgua','numToallas','numSnacks','numPonchos','numBinoculares','extraGuia','fecha'].includes(id)) {\r\n                        calcularTotal();\r\n                    }\r\n                });\r\n            });\r\n        }\r\n    });\r\n    \r\n    \/\/ Attach event listeners for the +\/- buttons\r\n    document.querySelectorAll('.qty-btn').forEach(button => {\r\n        button.addEventListener('click', function() {\r\n            const targetId = this.getAttribute('data-target');\r\n            const delta = this.classList.contains('plus-btn') ? 1 : -1;\r\n            updateQuantity(targetId, delta);\r\n        });\r\n    });\r\n\r\n\/\/ Forzar un c\u00e1lculo al cargar para asegurar que la nota de dep\u00f3sito est\u00e9 correcta inicialmente\r\n    calcularTotal();\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-da4c648 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"da4c648\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-efa33c7 elementor-widget elementor-widget-spacer\" data-id=\"efa33c7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9cf5423 elementor-widget elementor-widget-spacer\" data-id=\"9cf5423\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-acca3c3 elementor-widget elementor-widget-spacer\" data-id=\"acca3c3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-21b6538 e-con-full e-flex e-con e-parent\" data-id=\"21b6538\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-53815d2 elementor-widget elementor-widget-heading\" data-id=\"53815d2\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"Expedici\u00f3n\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Expedici\u00f3n Miravalles: Miradores y Cascada<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-322d4ee elementor-widget elementor-widget-spacer\" data-id=\"322d4ee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8bf04dd elementor-widget__width-initial elementor-arrows-position-inside elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel\" data-id=\"8bf04dd\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;slides_to_show&quot;:&quot;1&quot;,&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;infinite&quot;:&quot;yes&quot;,&quot;effect&quot;:&quot;slide&quot;,&quot;speed&quot;:500}\" data-widget_type=\"image-carousel.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-image-carousel-wrapper swiper\" role=\"region\" aria-roledescription=\"carousel\" aria-label=\"Carrusel de im\u00e1genes\" dir=\"ltr\">\n\t\t\t<div class=\"elementor-image-carousel swiper-wrapper\" aria-live=\"off\">\n\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"1 de 6\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/IMG_20250809_085852-scaled-rbxk23zjfs94wk5qptwbx23egngcw4e6ii9ukys43k.jpg\" alt=\"IMG_20250809_085852\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"2 de 6\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/DJI_0163-scaled-r43bru5jb4bohlw07m8ehwunwqknn5rhrqqtse0e68.jpg\" alt=\"DCIM100MEDIADJI_0163.JPG\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"3 de 6\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/DSC_3716-1-scaled-rbxj429zvtn8d1m5j42tlnebu79q2t875zkos59hhc.jpg\" alt=\"DSC_3716 (1)\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"4 de 6\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/IMG_20250809_095108-scaled-rbxk3r7deci77zrq41hts55fvxchd1x9qndftecb7k.jpg\" alt=\"IMG_20250809_095108\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"5 de 6\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/3-scaled-rbmy7r1jleiuwnihsw2oawjrb9ie8iarwcevd8n8ao.jpg\" alt=\"3\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"6 de 6\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/DJI_0386-scaled-rbmym32xtg59ykox3l4utsbtfsuwmc7evakfu5e3eo.jpg\" alt=\"DCIM100MEDIADJI_0386.JPG\" \/><\/figure><\/div>\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-prev\" role=\"button\" tabindex=\"0\">\n\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-left\" viewbox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M646 125C629 125 613 133 604 142L308 442C296 454 292 471 292 487 292 504 296 521 308 533L604 854C617 867 629 875 646 875 663 875 679 871 692 858 704 846 713 829 713 812 713 796 708 779 692 767L438 487 692 225C700 217 708 204 708 187 708 171 704 154 692 142 675 129 663 125 646 125Z\"><\/path><\/svg>\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-next\" role=\"button\" tabindex=\"0\">\n\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-right\" viewbox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M696 533C708 521 713 504 713 487 713 471 708 454 696 446L400 146C388 133 375 125 354 125 338 125 325 129 313 142 300 154 292 171 292 187 292 204 296 221 308 233L563 492 304 771C292 783 288 800 288 817 288 833 296 850 308 863 321 871 338 875 354 875 371 875 388 867 400 854L696 533Z\"><\/path><\/svg>\t\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"swiper-pagination\"><\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-06f686a elementor-widget-mobile__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"06f686a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"78\" data-end=\"307\">Descubre maravillosos miradores con vistas espectaculares hacia la provincia de Guanacaste, panor\u00e1micas del Parque Nacional Jorge Manuel Dengo, impresionantes ca\u00f1ones. Una experiencia 360\u00b0 entre naturaleza y aventura que te dejar\u00e1 sin aliento.<\/p><p data-start=\"309\" data-end=\"522\">Este tour est\u00e1 pensado para personas con buena condici\u00f3n f\u00edsica, recorriendo 10 km de senderos de dificultad media a alta. Los caminos son c\u00f3modos y seguros, ideales para quienes buscan una aventura m\u00e1s intensa.<\/p><p data-start=\"524\" data-end=\"657\">Adem\u00e1s, incluye el imponente puente colgante y la posibilidad de visitar una catarata a elecci\u00f3n del turista, como en nuestros otros tours.<\/p><p data-start=\"659\" data-end=\"878\">Si prefieres un recorrido m\u00e1s ligero, puedes optar por realizar el tour sin la catarata, reduciendo la caminata en 500 metros y la dificultad. En este caso, tambi\u00e9n es posible consultar el precio solo por la experiencia de los miradores.<\/p><p data-start=\"880\" data-end=\"1085\">Para hacer tu experiencia a\u00fan m\u00e1s especial, contamos con varios extras disponibles, incluyendo binoculares, que te permitir\u00e1n observar de cerca la fauna, aves y detalles del paisaje, y disfrutar al m\u00e1ximo cada momento<\/p><p data-start=\"1087\" data-end=\"1284\">La duraci\u00f3n aproximada del tour es de 5 a 6 horas. Es muy importante traer snacks y agua o comprarlos en nuestra recepci\u00f3n para mantener la energ\u00eda y la hidrataci\u00f3n durante la caminata.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b0818e9 elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"b0818e9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div style=\"text-align:center; margin:1px 0;\">\r\n    <button\r\n        onclick=\"openBookingForm(this)\"\r\n        data-tour=\"Miravalles Expedition\"\r\n        data-desc=\"Total tour distance: 10 km \/ 6.2 miles (round trip), with an approximate duration of 6 hours.\"\r\n        data-precio-adulto-nacional=\"17900\"\r\n        data-precio-adulto-extranjero=\"40\"\r\n        data-precio-nino-nacional=\"8950\"\r\n        data-precio-nino-extranjero=\"25\"\r\n        style=\"background:#ff1a50; color:white; font-size:15px; padding:15px 77px; border:none; border-radius:30px; cursor:pointer; box-shadow: 0 4px 10px rgba(255, 26, 80, 0.4);\">\r\n        RESERVAR\r\n    <\/button>\r\n<\/div>\r\n\r\n<div id=\"bookingModal\" style=\"display:none; position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.7); z-index:9999; overflow:auto;\">\r\n    <div style=\"background:#fff; max-width:750px; margin:50px auto; padding:30px; border-radius:15px; position:relative; box-shadow: 0 5px 15px rgba(0,0,0,0.3);\">\r\n\r\n        <button onclick=\"closeBookingForm()\" style=\"position:absolute; top:15px; right:15px; font-size:24px; background:none; border:none; cursor:pointer; color:#333;\">\u2716<\/button>\r\n\r\n        <h2 style=\"text-align:center; margin-bottom:10px; color:#2E7D32; font-size:26px;\" id=\"tourTitle\"><\/h2>\r\n        <p style=\"text-align:center; margin-bottom:25px; color:#555;\" id=\"tourDesc\"><\/p>\r\n\r\n        <form id=\"bookingForm\" onsubmit=\"event.preventDefault();\" action=\"\">\r\n\r\n            <div style=\"margin-top:20px; margin-bottom:16px;\">\r\n                <label for=\"fecha\" class=\"form-label\"><b>\ud83d\udcc5 Fecha (Seleccionar fecha):<\/b><\/label><span id=\"fecha-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <input type=\"date\" id=\"fecha\" class=\"input\" required onchange=\"calcularTotal()\">\r\n                <span id=\"fecha-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <div style=\"margin-bottom:12px;\">\r\n                <label for=\"hora\" class=\"form-label\"><b>Hora (Seleccionar hora):<\/b><\/label><span id=\"hora-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <select id=\"hora\" class=\"input\">\r\n                    <option value=\"\" selected disabled>Select a time<\/option>\r\n                    <option value=\"8:00 am\">8:00 am<\/option>\r\n                    <option value=\"9:00 am\">9:00 am<\/option>\r\n                    <option value=\"10:00 am\">10:00 am<\/option>\r\n                    <option value=\"1:00 pm\">1:00 pm<\/option>\r\n                    <option value=\"2:00 pm\">2:00 pm<\/option>\r\n                <\/select>\r\n                <span id=\"hora-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <div style=\"margin-bottom:12px;\">\r\n                <label for=\"tipoVisitante\" class=\"form-label\"><b>Tipo de visitante (extranjero o residente):<\/b><\/label><span id=\"tipoVisitante-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <select id=\"tipoVisitante\" class=\"input\" onchange=\"onVisitorTypeChange(); calcularTotal()\">\r\n                    <option value=\"\" selected disabled>Select visitor type<\/option>\r\n                    <option value=\"extranjero\">Foreign \/ Extranjero<\/option>\r\n                    <option value=\"nacional\">Local \/ Nacional<\/option>\r\n                <\/select>\r\n                <span id=\"tipoVisitante-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <div id=\"guideLanguageDiv\" style=\"display:none; margin-bottom:15px;\">\r\n                <label for=\"guideLanguage\" class=\"form-label\"><b>Seleccionar idioma del gu\u00eda:<\/b><\/label><span id=\"guideLanguage-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <select id=\"guideLanguage\" class=\"input\">\r\n                    <option value=\"\" selected disabled>Select guide language<\/option>\r\n                    <option value=\"English\">English<\/option>\r\n                    <option value=\"Spanish\">Spanish<\/option>\r\n                <\/select>\r\n                <p class=\"note\"><i>Elige el idioma del gu\u00eda.<\/i><\/p>\r\n                <span id=\"guideLanguage-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n<h3 class=\"section-title\">Viajeros<\/h3>\r\n<p class=\"section-note\">Los precios var\u00edan seg\u00fan la edad y el n\u00famero de personas.<\/p>\r\n<p class=\"note\"><i>Total de viajeros: <span id=\"totalTravelers\" style=\"font-weight:bold;\">0<\/span><\/i><\/p>\r\n<p class=\"note discount-note\" id=\"discountNote\" style=\"display:none;\"><i>Descuentos de hasta un 30% disponibles para grupos grandes y reservas anticipadas.<\/i><\/p>\r\n\r\n<div class=\"traveler-row\">\r\n<div class=\"traveler-info\">\r\n<label for=\"adultos\" class=\"traveler-label\">Adultos (13-70 a\u00f1os):<span class=\"discount-tag discount-green\">-0%<\/span><\/label>\r\n<\/div>\r\n<div class=\"quantity-control\">\r\n<button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"adultos\">-<\/button>\r\n<input type=\"number\" id=\"adultos\" min=\"0\" value=\"0\" class=\"input-num\" oninput=\"calcularTotal()\">\r\n<button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"adultos\">+<\/button>\r\n<\/div>\r\n<\/div>\r\n<div class=\"traveler-row\">\r\n<div class=\"traveler-info\">\r\n<label for=\"ninos\" class=\"traveler-label\">Ni\u00f1os (5-12 a\u00f1os):<span class=\"discount-tag discount-green\">-50%*<\/span><\/label>\r\n<\/div>\r\n<div class=\"quantity-control\">\r\n<button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"ninos\">-<\/button>\r\n<input type=\"number\" id=\"ninos\" min=\"0\" value=\"0\" class=\"input-num\" oninput=\"calcularTotal()\">\r\n<button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"ninos\">+<\/button>\r\n<\/div>\r\n<\/div>\r\n<div class=\"traveler-row\">\r\n<div class=\"traveler-info\">\r\n<label for=\"bebes\" class=\"traveler-label\">Beb\u00e9s (0-4 a\u00f1os):<span class=\"discount-tag discount-green\">FREE*<\/span><\/label>\r\n<\/div>\r\n<div class=\"quantity-control\">\r\n<button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"bebes\">-<\/button>\r\n<input type=\"number\" id=\"bebes\" min=\"0\" value=\"0\" class=\"input-num\" oninput=\"calcularTotal()\">\r\n<button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"bebes\">+<\/button>\r\n<\/div>\r\n<\/div>\r\n\r\n<h3 class=\"section-title\">Agregar extras<\/h3>\r\n<p class=\"section-note\">Selecciona los art\u00edculos adicionales que necesitas y agrega la cantidad.<\/p>\r\n\r\n<div class=\"extra-item no-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" style=\"display:block;\">\r\n            <input type=\"checkbox\" id=\"extraPerezoso\" onchange=\"calcularTotal()\"> \r\n            Tour de Perezosos y Aves Tropicales (<span id=\"precioPerezoso\" class=\"price-span\" style=\"color:black;\">$10<\/span> por persona)\r\n        <\/label>\r\n        <p class=\"note\" style=\"margin-left:25px; margin-top:2px;\">\r\n            <i>(Incluye el uso de binoculares y telescopio)<\/i>\r\n        <\/p>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\" style=\"visibility:hidden; height:36px; border:none; width:110px; margin-left:10px;\"><\/div>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"botellasAgua\">Agua embotellada (<span id=\"precioAgua\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"botellasAgua\">-<\/button>\r\n        <input type=\"number\" id=\"botellasAgua\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"botellasAgua\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkAgua\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numToallas\">Toallas (<span id=\"precioToallas\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numToallas\">-<\/button>\r\n        <input type=\"number\" id=\"numToallas\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numToallas\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkToallas\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numSnacks\">Snacks Granuts (<span id=\"precioSnacks\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numSnacks\">-<\/button>\r\n        <input type=\"number\" id=\"numSnacks\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numSnacks\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkSnacks\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numPonchos\">Ponchos para la lluvia<span id=\"precioPonchos\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numPonchos\">-<\/button>\r\n        <input type=\"number\" id=\"numPonchos\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numPonchos\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkPonchos\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row final-extra-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numBinoculares\">Uso de binoculares (<span id=\"precioBinoculares\" class=\"price-span\" style=\"color:black;\">$5<\/span>)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numBinoculares\">-<\/button>\r\n        <input type=\"number\" id=\"numBinoculares\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numBinoculares\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkBinoculares\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<p class=\"note\" style=\"margin-left: 0; margin-top: -5px; margin-bottom: 20px; text-align: left; font-size: 0.85em; width: 100%;\">\r\n    <i>(Solo disponible si NO selecciona el Tour de Perezosos y Aves Tropicales)<\/i>\r\n<\/p>\r\n            <h3 class=\"section-title\">Informaci\u00f3n del cliente<\/h3>\r\n\r\n            <label for=\"nombre\" class=\"form-label\">Nombre completo:<\/label><span id=\"nombre-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n            <input type=\"text\" id=\"nombre\" class=\"input\" style=\"margin-bottom:6px;\">\r\n            <span id=\"nombre-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n\r\n            <label for=\"email\" class=\"form-label\">Email:<\/label><span id=\"email-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n            <input type=\"email\" id=\"email\" class=\"input\" style=\"margin-bottom:6px;\">\r\n            <span id=\"email-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n\r\n            <label for=\"acompanantes\" class=\"form-label\">Nombres de acompa\u00f1antes: <span id=\"acompanantes-note\" style=\"font-weight:normal; font-size:0.9em; color:#555;\">(Requerido si hay 2 o m\u00e1s viajeros)<\/span><\/label><span id=\"acompanantes-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n            <textarea id=\"acompanantes\" class=\"input\" style=\"margin-bottom:12px;\" placeholder=\"Enumera los nombres de los compa\u00f1eros separados por comas\"><\/textarea>\r\n            <span id=\"acompanantes-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n\r\n            <div style=\"margin:10px 0;\">\r\n                <style>\r\n                    #acceptTermsLink {\r\n                        color: #1A237E;\r\n                        font-weight: bold;\r\n                        text-decoration: none;\r\n                        transition: color 0.3s;\r\n                    }\r\n                    #acceptTermsLink:hover {\r\n                        color: #0D1033;\r\n                        text-decoration: underline;\r\n                    }\r\n                <\/style>\r\n                <label>\r\n                    <input type=\"checkbox\" id=\"acceptTerms\" style=\"margin-right:8px;\" onchange=\"clearFieldError(this)\">\r\n                    <span style=\"color:black;\">He le\u00eddo y acepto el <\/span>\r\n                    <a id=\"acceptTermsLink\" href=\"https:\/\/cuilpilapan.com\/es\/terms-and-conditions\/\" target=\"_blank\">T\u00e9rminos y Condiciones<\/a>\r\n                    <span style=\"color:black;\"> y doy mi consentimiento para el uso de mis datos personales para el proceso de reserva.<\/span>\r\n                <\/label>\r\n                <span id=\"terms-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <h2 style=\"margin-top: 8px; font-size: 28px; color: #333;\">Total: <span id=\"total\" style=\"color:#ff8c00;\">$0<\/span><\/h2>\r\n            <div id=\"discountApplied\" style=\"margin-bottom:8px; font-weight:bold; color:#2d6a4f; display:none;\"><\/div>\r\n            <div id=\"totalAfterDiscount\" style=\"margin-bottom:8px; font-weight:normal; text-decoration:line-through; color:#aaa; display:none;\"><\/div>\r\n\r\n            <div id=\"tilopayDepositNote\" style=\"background: #e6f7ff; border: 1px solid #91d5ff; padding: 10px; border-radius: 5px; margin-top: 10px;\">\r\n                <strong style=\"color: #0056b3;\">NOTA IMPORTANTE:<\/strong> Al reservar, se cobrar\u00e1 un dep\u00f3sito por\r\n                <span id=\"depositAmountDisplay\" style=\"font-weight:bold;\"><\/span> (\u20a17000 local \/ $15 extranjero). El monto restante debe pagarse al llegar.\r\n            <\/div>\r\n\r\n            <div id=\"guiaOpcionalDiv\" style=\"display:none; margin:15px 0;\">\r\n                <label><input type=\"checkbox\" id=\"extraGuia\" onchange=\"calcularTotal()\"> Gu\u00eda opcional (\u20a16000)<\/label>\r\n            <\/div>\r\n\r\n            <div style=\"background:#f9f9f9; padding:15px; border-radius:10px; box-shadow:0 2px 6px rgba(0,0,0,0.1); margin-top:20px;\">\r\n                <b>Recomendaciones:<\/b> Elige el tour que se adapte a tu capacidad f\u00edsica para disfrutar plenamente de la aventura.  \nLleva ropa adecuada, ropa extra, bocadillos, agua para mantenerte hidratado y cualquier medicamento personal si tienes una condici\u00f3n m\u00e9dica.  \nNo dudes en hacer cualquier pregunta.\r\n            <\/div>\r\n\r\n            <div style=\"text-align:center; margin-top:25px;\">\r\n                <button id=\"btnProceed\" onclick=\"onProceedToPayment()\" style=\"background:#ff8c00; color:white; font-size:18px; padding:15px 40px; border:none; border-radius:30px; cursor:pointer; margin-bottom:10px; box-shadow: 0 4px 10px rgba(255, 140, 0, 0.4);\">\r\n                    Proceder a la reserva \/ Proceder al pago\r\n                <\/button>\r\n            <\/div>\r\n\r\n            <div id=\"paymentSection\" style=\"display:none; margin-top:25px; border-top:1px solid #eee; padding-top:16px;\">\r\n                <h3 class=\"section-title\" style=\"font-size:20px;\">Seleccione su m\u00e9todo de pago \/ Select payment method<\/h3>\r\n                \r\n                <div style=\"display:flex; flex-direction:column; gap:12px;\">\r\n\r\n                    <label style=\"display:flex; align-items:center; gap:10px; padding:10px; border:1px solid #ddd; border-radius:10px; cursor:pointer; transition:transform 0.2s; background:#fafafa;\">\r\n                        <input type=\"radio\" name=\"paymentMethod\" value=\"tarjeta\" onchange=\"onPaymentMethodChange()\" style=\"transform:scale(1.3); margin-right:6px;\">\r\n                        <img decoding=\"async\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/10\/WhatsApp-Image-2025-10-22-at-3.59.08-PM.jpeg\"\r\n                            alt=\"Tilopay\" width=\"50\" height=\"50\" style=\"border-radius:8px; transition:transform 0.3s;\">\r\n                        <span style=\"font-size:16px;\">Tarjeta de Cr\u00e9dito\/D\u00e9bito (Tilopay) - Solo Dep\u00f3sito<\/span>\r\n                    <\/label>\r\n\r\n                    <label style=\"display:flex; align-items:center; gap:10px; padding:10px; border:1px solid #ddd; border-radius:10px; cursor:pointer; transition:transform 0.2s; background:#fafafa;\">\r\n                        <input type=\"radio\" name=\"paymentMethod\" value=\"simpe\" onchange=\"onPaymentMethodChange()\" style=\"transform:scale(1.3); margin-right:6px;\">\r\n                        <img decoding=\"async\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/10\/WhatsApp-Image-2025-10-22-at-3.57.36-PM.jpeg\"\r\n                            alt=\"Simpe M\u00f3vil\" width=\"50\" height=\"50\" style=\"border-radius:8px; transition:transform 0.3s;\">\r\n                        <span style=\"font-size:16px;\">Simpe M\u00f3vil - Solo Dep\u00f3sito (o pago completo)<\/span>\r\n                    <\/label>\r\n\r\n                    <label style=\"display:flex; align-items:center; gap:10px; padding:10px; border:1px solid #ddd; border-radius:10px; cursor:pointer; transition:transform 0.2s; background:#fafafa;\">\r\n                        <input type=\"radio\" name=\"paymentMethod\" value=\"binance\" onchange=\"onPaymentMethodChange()\" style=\"transform:scale(1.3); margin-right:6px;\">\r\n                        <img decoding=\"async\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/10\/WhatsApp-Image-2025-10-22-at-3.56.45-PM.jpeg\"\r\n                            alt=\"Binance\" width=\"50\" height=\"50\" style=\"border-radius:8px; transition:transform 0.3s;\">\r\n                        <span style=\"font-size:16px;\">Pago Binance (USDT) - Solo Dep\u00f3sito (o pago completo)<\/span>\r\n                    <\/label>\r\n                <\/div>\r\n\r\n<style>\r\n#paymentSection label:hover {\r\ntransform: scale(1.03);\r\nbackground: #fffbe6;\r\nbox-shadow: 0 2px 6px rgba(0,0,0,0.1);\r\n}\r\n#paymentSection img:hover {\r\ntransform: scale(1.1) rotate(3deg);\r\n}\r\n<\/style>\r\n\r\n<div id=\"paymentDetails\" style=\"margin-top:12px;\"><\/div>\r\n\r\n<div id=\"tilopayButtonContainer\" style=\"text-align:center; margin-top:20px; display:none;\">\r\n<button type=\"button\" onclick=\"handleCardPayment()\"\r\n                        style=\"                            background-color: #007bff;                            color: white;                            padding: 15px 30px;                            border: none;                            border-radius: 5px;                            font-size: 18px;                            cursor: pointer;                            box-shadow: 0 4px 6px rgba(0,0,0,0.1);                            transition: background-color 0.3s;                        \"\r\n                        onmouseover=\"this.style.backgroundColor='#0056b3'\"\r\n                        onmouseout=\"this.style.backgroundColor='#007bff'\"\r\n                    >\r\n                        \ud83d\udcb3 Pagar dep\u00f3sito ahora con tarjeta.\r\n                    <\/button>\r\n                    <p style=\"margin-top:10px; font-size:0.9em; color:#555;\">Ser\u00e1s redirigido a la pasarela de pago Tilopay en esta pesta\u00f1a.<\/p>\r\n                <\/div>\r\n            <\/div>\r\n\r\n        <input type=\"hidden\" name=\"trp-form-language\" value=\"es\"\/><\/form>\r\n\r\n    <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* Estilos Globales *\/\r\n.input, textarea, select { width:100%; padding:10px; margin:3px 0; border:1px solid #ddd; border-radius:8px; display:block; box-sizing: border-box; }\r\n\r\n\/* 1. ESTILO PARA DESHABILITAR D\u00cdAS ANTERIORES EN EL CALENDARIO *\/\r\ninput[type=\"date\"] { font-family: inherit; color: #333; }\r\n\/* MEJORA 1: Estilo para d\u00edas inv\u00e1lidos en Safari\/iOS *\/\r\ninput[type=\"date\"]:not([value=\"\"]):invalid { box-shadow: 0 0 5px rgba(231,76,60,0.6); }\r\n\r\n.input-num { width: 40px; text-align: center; border: none; padding: 0; -moz-appearance: textfield; }\r\n.input-num::-webkit-inner-spin-button, .input-num::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }\r\n\r\n.form-label { display:block; margin-bottom:6px; font-weight: 500; color: #333; }\r\n.note { font-size:0.9em; color:#555; margin:3px 0 5px 0; }\r\n.section-title { margin-top:20px; margin-bottom:10px; font-size:24px; color:#555; border-bottom: 2px solid #ddd; padding-bottom: 5px; }\r\n.section-note { margin-top:8px; margin-bottom:15px; font-weight:normal; color:#444; font-size:16px; }\r\n\r\n\/* Traveler Quantity Controls - REESTRUCTURADO PARA ESTILO ORIGINAL HORIZONTAL *\/\r\n.traveler-row { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; padding: 10px 0; border-bottom: 1px solid #eee; }\r\n.traveler-row:last-child { border-bottom: none; margin-bottom: 0; }\r\n.traveler-info { display: flex; align-items: center; } \/* Contenedor para label y descuento *\/\r\n.traveler-label { font-size: 16px; color: #333; display: flex; align-items: center; gap: 10px; margin-right: 15px; }\r\n.quantity-control { display: flex; align-items: center; border: 1px solid #ccc; border-radius: 5px; overflow: hidden; }\r\n.qty-btn { background: #f7f7f7; border: none; color: #555; padding: 8px 10px; cursor: pointer; font-weight: bold; font-size: 16px; transition: background 0.2s; line-height: 1; height: 36px; box-sizing: border-box; }\r\n.qty-btn:hover { background: #eee; color: #000; }\r\n.qty-btn:active { background: #ddd; }\r\n.input-num { padding: 8px 0; height: 36px; box-sizing: border-box; font-size: 16px; }\r\n\r\n\/* Discount Tags (Mantiene el estilo verde) *\/\r\n.discount-tag { background: #e9f5e9; color: #2E7D32; padding: 3px 8px; border-radius: 10px; font-size: 14px; font-weight: bold; margin-left: 0; white-space: nowrap; }\r\n\r\n\r\n\/* Extras with Quantity - REESTRUCTURADO PARA ESTILO TRAVELERS (MEJORA SOLICITADA) *\/\r\n\/* Contenedor principal para cada extra: similar a .traveler-row *\/\r\n.extra-item {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: flex-start; \/* Alineaci\u00f3n arriba para que las notas no muevan el control *\/\r\n    padding: 10px 0;\r\n    border-bottom: 1px solid #eee;\r\n}\r\n.extra-item.final-extra-row { border-bottom: none; }\r\n.extra-label-info {\r\n    display: flex;\r\n    flex-direction: column;\r\n    flex-grow: 1;\r\n    margin-right: 15px;\r\n}\r\n.extra-label { \r\n    font-size: 16px; \r\n    color: #333; \r\n    display: flex; \r\n    align-items: center; \r\n    margin-bottom: 0; \r\n}\r\n.extra-label input[type=\"checkbox\"] { \r\n    width: auto; \r\n    margin-right: 10px; \r\n}\r\n.extra-item .note { \r\n    margin-left: 25px; \/* Alineaci\u00f3n con el texto del label *\/\r\n    margin-top: 2px;\r\n    margin-bottom: 0; \r\n    font-size: 0.85em;\r\n}\r\n\r\n\r\n.price-span { font-weight: bold; color: #000; }\r\n.extra-qty-control { margin-left: 0; }\r\n.extra-num { width: 40px !important; }\r\n\r\n\/* Error visual *\/\r\n.invalid-field { border-color:#e74c3c !important; box-shadow: 0 0 4px rgba(231,76,60,0.4); }\r\n.field-error { color:#e74c3c; font-size:0.9em; display:block; margin-top:4px; }\r\n.field-asterisk { color:#e74c3c; font-weight:bold; margin-left:6px; font-size:1.2em; vertical-align:middle; }\r\n\r\n\/* Small helper for payment details box *\/\r\n#paymentDetails { background:#fafafa; padding:12px; border-radius:8px; border:1px dashed #ddd; margin-top:10px; }\r\n.payment-note { background:#fff3cd; padding:10px; border-radius:6px; margin-bottom:8px; border:1px solid #ffeeba; }\r\n.action-btn { display:inline-block; margin:6px 6px 0 0; padding:10px 14px; border-radius:8px; text-decoration:none; cursor:pointer; }\r\n.btn-green { background:#25d366; color:#fff; }\r\n.btn-blue { background:#0072c6; color:#fff; }\r\n.btn-gray { background:#6c757d; color:#fff; }\r\n<\/style>\r\n\r\n<script>\r\n\/* ---------- Helpers and state (Mantener sin cambios) ---------- *\/\r\nlet currentButton = null;\r\nconst CR_OFFSET_MINUTES = -6 * 60; \/\/ Costa Rica UTC-6 => -360 minutes\r\nconst ADMIN_WHATSAPP = '50660110640';\r\nconst ADMIN_EMAIL = 'contacto@cuilpilapan.com'; \/\/ Correo para recibir notificaciones\r\n\r\n\/\/ CONFIGURACI\u00d3N DE TILOPAY\r\nconst TILO_LINK_COLONES = 'https:\/\/tp.cr\/l\/MTYyMTQ3';\r\nconst DEPOSIT_COLONES = 7000;\r\nconst TILO_LINK_USD = 'https:\/\/tp.cr\/l\/MTYyMTQ4';\r\nconst DEPOSIT_USD = 15.00;\r\n\r\nconst RETURN_URL = 'https:\/\/cuilpilapan.com\/payment-success\/';\r\nconst SAVE_URL = '\/save_pending_reservation.php'; \/\/ URL para guardar la reserva antes de redirigir\r\nconst SEND_BOOKING_URL = '\/send_booking.php'; \/\/ URL para Simpe\/Binance\r\n\r\n\/\/ Simpe \/ Binance details\r\nconst SIMPE_PHONE = '60110640';\r\nconst SIMPE_NAME = 'Cuipilapan Sociedad Civil';\r\nconst BINANCE_ID = '450335940';\r\n\r\n\/\/ localStorage key to persist reservation data *after* redirection to Tilopay\r\nconst STORAGE_KEY = 'reservaCuilpilapan_v1';\r\nlet _lastComputed = {}; \/\/ Almacena el \u00faltimo c\u00e1lculo para el env\u00edo PHP\r\n\r\n\/**\r\n * Genera una referencia de pedido \u00fanica.\r\n * Formato: CUP-AAAAMMDD-RANDOM\r\n *\/\r\nfunction generateOrderReference() {\r\n    const date = new Date();\r\n    const dateStr = date.getFullYear().toString() +\r\n                    (date.getMonth() + 1).toString().padStart(2, '0') +\r\n                    date.getDate().toString().padStart(2, '0');\r\n    const randomStr = Math.random().toString(36).substring(2, 7).toUpperCase();\r\n    \/\/ Usamos \"CUP\" + la fecha + un random para la referencia que enviamos a Tilopay\r\n    return `CUP-${dateStr}-${randomStr}`;\r\n}\r\n\r\nfunction formatCurrency(amount, tipo) {\r\n    if (tipo === 'nacional') {\r\n        return '\u20a1' + Math.round(amount);\r\n    } else {\r\n        return '$' + Number(amount).toFixed(2);\r\n    }\r\n}\r\n\r\n\/* ---------- small UI helpers for errors (Mantener sin cambios) ---------- *\/\r\nfunction showFieldError(inputEl, message) {\r\n    if (!inputEl) return;\r\n    inputEl.classList.add('invalid-field');\r\n\r\n    \/\/ error span\r\n    const errId = inputEl.id + '-error';\r\n    let err = document.getElementById(errId);\r\n    if (!err) {\r\n        err = document.createElement('span');\r\n        err.id = errId;\r\n        err.className = 'field-error';\r\n        inputEl.parentNode.insertBefore(err, inputEl.nextSibling);\r\n    }\r\n    err.innerText = message;\r\n    err.style.display = 'block';\r\n\r\n    \/\/ asterisk\r\n    const starId = inputEl.id + '-asterisk';\r\n    let star = document.getElementById(starId);\r\n    if (!star) {\r\n        star = document.createElement('span');\r\n        star.id = starId;\r\n        star.className = 'field-asterisk';\r\n        star.innerText = '*';\r\n        \/\/ try to insert near the label if exists\r\n        const label = document.querySelector('label[for=\"' + inputEl.id + '\"]');\r\n        if (label && label.parentNode) {\r\n            label.parentNode.insertBefore(star, label.nextSibling);\r\n        } else {\r\n            \/\/ fallback: insert before input\r\n            inputEl.parentNode.insertBefore(star, inputEl);\r\n        }\r\n    }\r\n    star.style.display = 'inline';\r\n}\r\n\r\nfunction clearFieldError(inputEl) {\r\n    if (!inputEl) return;\r\n    inputEl.classList.remove('invalid-field');\r\n    const err = document.getElementById(inputEl.id + '-error');\r\n    if (err) { err.style.display = 'none'; err.innerText = ''; }\r\n    const star = document.getElementById(inputEl.id + '-asterisk');\r\n    if (star) star.style.display = 'none';\r\n}\r\n\r\n\/* ---------- Open \/ Close (Mantener sin cambios) ---------- *\/\r\nfunction openBookingForm(button) {\r\n    currentButton = button;\r\n    document.getElementById('bookingModal').style.display = 'block';\r\n    document.getElementById('tourTitle').innerText = button.getAttribute('data-tour') || 'Tour';\r\n    document.getElementById('tourDesc').innerText = button.getAttribute('data-desc') || '';\r\n\r\n    \/\/ 1. Aplicar restricci\u00f3n de calendario al abrir el modal\r\n    applyDateRestriction();\r\n\r\n    \/\/ reset UI errors and values if desired\r\n    clearAllFieldErrors();\r\n\r\n    \/\/ hide payment section\r\n    document.getElementById('paymentSection').style.display = 'none';\r\n    document.getElementById('paymentDetails').innerHTML = '';\r\n    document.getElementById('tilopayButtonContainer').style.display = 'none';\r\n\r\n    \/\/ Reset radio buttons\r\n    const radios = document.getElementsByName('paymentMethod');\r\n    for (let r of radios) r.checked = false;\r\n\r\n    document.getElementById('btnProceed').style.display = 'inline-block';\r\n\r\n    \/\/ Vuelva a calcular cuando se abre para obtener los precios correctos\r\n    calcularTotal();\r\n}\r\n\r\nfunction closeBookingForm() {\r\n    document.getElementById('bookingModal').style.display = 'none';\r\n}\r\n\r\n\/* 1. L\u00d3GICA DE CALENDARIO: Restringir fechas anteriores al d\u00eda actual (Costa Rica) *\/\r\nfunction applyDateRestriction() {\r\n    const fechaEl = document.getElementById('fecha');\r\n    if (!fechaEl) return;\r\n\r\n    \/\/ Calcular la fecha de hoy en Costa Rica (UTC-6)\r\n    const now = new Date();\r\n    const localOffsetMin = now.getTimezoneOffset(); \/\/ Offset local en minutos\r\n    const utcNowMs = now.getTime() + (localOffsetMin * 60000);\r\n    const crNowMs = utcNowMs + (CR_OFFSET_MINUTES * 60000);\r\n    const crToday = new Date(crNowMs);\r\n        \r\n    \/\/ Formatear a YYYY-MM-DD\r\n    const year = crToday.getFullYear();\r\n    const month = (crToday.getMonth() + 1).toString().padStart(2, '0');\r\n    const day = crToday.getDate().toString().padStart(2, '0');\r\n    const minDate = `${year}-${month}-${day}`;\r\n\r\n    \/\/ Establecer la fecha m\u00ednima para navegadores compatibles (Android, Desktop)\r\n    fechaEl.min = minDate;\r\n    \r\n    \/\/ MEJORA 1: A\u00f1adir un listener para validar en iOS\/navegadores que no respetan 'min'\r\n    fechaEl.addEventListener('change', function() {\r\n        const selectedDate = new Date(this.value);\r\n        \/\/ Crear una fecha de referencia de hoy a medianoche UTC\r\n        const todayRef = new Date(Date.UTC(crToday.getFullYear(), crToday.getMonth(), crToday.getDate()));\r\n\r\n        if (selectedDate < todayRef) {\r\n            \/\/ El d\u00eda seleccionado es anterior a hoy (Costa Rica)\r\n            this.setCustomValidity('The selected date cannot be in the past \/ La fecha seleccionada no puede ser anterior a hoy.');\r\n            this.classList.add('invalid-field');\r\n            showFieldError(this, 'The selected date cannot be in the past \/ La fecha seleccionada no puede ser anterior a hoy.');\r\n        } else {\r\n            this.setCustomValidity(''); \/\/ Limpiar el mensaje de error del navegador\r\n            clearFieldError(this);\r\n        }\r\n    });\r\n}\r\n\r\n\/* ---------- When visitor type changes (Mantener sin cambios) ---------- *\/\r\nfunction onVisitorTypeChange(){\r\n    const tipo = document.getElementById('tipoVisitante').value;\r\n    document.getElementById('guideLanguageDiv').style.display = (tipo === 'extranjero') ? 'block' : 'none';\r\n    calcularTotal();\r\n}\r\n\r\n\/* ---------- Core calculation (uses currentButton data-* prices) (C\u00d3DIGO COMPLETO) ---------- *\/\r\nfunction calcularTotal() {\r\n    if (!currentButton) return;\r\n\r\n    \/\/ get visitor type (if empty, temporarily treat as 'nacional' for price display)\r\n    let tipo = document.getElementById('tipoVisitante').value;\r\n    if (!tipo) tipo = 'nacional';\r\n\r\n    \/\/ travelers\r\n    let adultos = parseInt(document.getElementById('adultos').value) || 0;\r\n    let ninos = parseInt(document.getElementById('ninos').value) || 0;\r\n    let bebes = parseInt(document.getElementById('bebes').value) || 0;\r\n    let totalViajeros = adultos + ninos + bebes;\r\n    document.getElementById('totalTravelers').innerText = totalViajeros;\r\n\r\n    \/\/ base prices from data-* attributes on the button\r\n    let precioAdultoNac = parseFloat(currentButton.getAttribute('data-precio-adulto-nacional')) || 0;\r\n    let precioAdultoExt = parseFloat(currentButton.getAttribute('data-precio-adulto-extranjero')) || 0;\r\n    let precioAdulto = (tipo === 'nacional') ? precioAdultoNac : precioAdultoExt;\r\n    let precioNino = precioAdulto \/ 2;\r\n\r\n    \/\/ extras unit prices (local vs foreign)\r\n    let precioExtraPerezoso = (tipo === 'nacional') ? 3500 : 10;\r\n    let precioAgua = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioToallas = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioSnacks = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioPonchos = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioBinoculares = (tipo === 'nacional') ? 2000 : 5;\r\n\r\n    \/\/ quantities & selections\r\n    let extraPerezoso = document.getElementById('extraPerezoso').checked;\r\n    let botellasAgua = parseInt(document.getElementById('botellasAgua').value) || 0;\r\n    let numToallas = parseInt(document.getElementById('numToallas').value) || 0;\r\n    let numSnacks = parseInt(document.getElementById('numSnacks').value) || 0;\r\n    let numPonchos = parseInt(document.getElementById('numPonchos').value) || 0;\r\n    let numBinoculares = parseInt(document.getElementById('numBinoculares').value) || 0;\r\n    let guiaOpcional = document.getElementById('extraGuia')?.checked || false;\r\n\r\n    \/\/ start total with ticket prices (babies free)\r\n    let total = (adultos * precioAdulto) + (ninos * precioNino);\r\n\r\n    \/\/ extras\r\n    if (extraPerezoso) {\r\n        total += (adultos + ninos) * precioExtraPerezoso;\r\n    }\r\n    total += botellasAgua * precioAgua;\r\n    total += numToallas * precioToallas;\r\n    total += numSnacks * precioSnacks;\r\n    total += numPonchos * precioPonchos;\r\n\r\n    \/\/ Logic: Binoculars only available if Sloth Tour is NOT selected\r\n    if (numBinoculares > 0 && !extraPerezoso) {\r\n        total += numBinoculares * precioBinoculares;\r\n    } else if (extraPerezoso) {\r\n        \/\/ Force binocular quantity to 0 if sloth tour is checked\r\n        document.getElementById('numBinoculares').value = 0;\r\n    }\r\n    \r\n    if (guiaOpcional) total += (tipo === 'nacional' ? 6000 : 0); \/\/ Gu\u00eda Opcional: \u20a16000 (asumo solo para nacionales)\r\n\r\n    \/\/ 6. L\u00d3GICA DE DESCUENTOS MEJORADA\r\n    \r\n    \/\/ A. Descuento por cantidad de viajeros\r\n    let groupDiscount = 0;\r\n    if (totalViajeros >= 25) {\r\n        groupDiscount = 30; \/\/ 30% for 25+\r\n    } else if (totalViajeros > 14) {\r\n        groupDiscount = 20; \/\/ 20% for 15+\r\n    } else if (totalViajeros >= 10) {\r\n        groupDiscount = 15; \/\/ 15% for 10+\r\n    } else if (totalViajeros >= 6) {\r\n        groupDiscount = 10; \/\/ 10% for 6+\r\n    }\r\n\r\n    \/\/ B. Descuento por anticipaci\u00f3n de reserva\r\n    const fechaVal = document.getElementById('fecha').value;\r\n    let earlyDays = 0;\r\n    let earlyDiscount = 0;\r\n    if (fechaVal) {\r\n        const parts = fechaVal.split('-');\r\n        if (parts.length === 3) {\r\n            const y = parseInt(parts[0],10), m = parseInt(parts[1],10), d = parseInt(parts[2],10);\r\n            \/\/ compute CR now midnight reference\r\n            const now = new Date();\r\n            const localOffsetMin = now.getTimezoneOffset();\r\n            const utcNowMs = Date.now() + (localOffsetMin * 60000);\r\n            const crNowMs = utcNowMs + (CR_OFFSET_MINUTES * 60000);\r\n            const crNow = new Date(crNowMs);\r\n            \/\/ difference in days between (selected date) and current CR date\r\n            const selDate = new Date(Date.UTC(y, m-1, d));\r\n            const crToday = new Date(Date.UTC(crNow.getFullYear(), crNow.getMonth(), crNow.getDate()));\r\n            const diffMs = selDate - crToday;\r\n            earlyDays = Math.floor(diffMs \/ (1000*60*60*24));\r\n            \r\n            if (earlyDays >= 14) {\r\n                earlyDiscount = 20; \/\/ 20% for 2 weeks or more\r\n            } else if (earlyDays >= 7) {\r\n                earlyDiscount = 10; \/\/ 10% for 1 week or more\r\n            }\r\n        }\r\n    }\r\n    \r\n    \/\/ C. Descuento total (El m\u00e1ximo de A o B) + Adicional\r\n    let baseDiscount = Math.max(groupDiscount, earlyDiscount);\r\n    let additionalDiscount = 0;\r\n\r\n    \/\/ Descuento adicional por combinar grupo y anticipaci\u00f3n\r\n    if (groupDiscount > 0) {\r\n        if (earlyDays >= 14) {\r\n            additionalDiscount = 4; \/\/ 4% adicional por 2 semanas y grupo\r\n        } else if (earlyDays >= 7) {\r\n            additionalDiscount = 2; \/\/ 2% adicional por 1 semana y grupo\r\n        }\r\n    }\r\n    \r\n    let totalDiscountPercent = baseDiscount + additionalDiscount;\r\n\r\n    \/\/ Guardamos el total bruto (RAW TOTAL)\r\n    let rawTotal = total;\r\n\r\n    \/\/ aplicamos descuento\r\n    let discountedTotal = total;\r\n    let discountText = '';\r\n    if (totalDiscountPercent > 0) {\r\n        discountedTotal = total * (1 - totalDiscountPercent \/ 100);\r\n        discountText = `\ud83d\udcb0 Discount Applied: ${totalDiscountPercent}% (Group: ${groupDiscount}%, Early: ${earlyDiscount}%, Additional: ${additionalDiscount}%)`;\r\n    }\r\n\r\n    \/\/ Redondear a n\u00fameros enteros para colones (ya que Tilopay lo requiere entero)\r\n    if (tipo === 'nacional') {\r\n        rawTotal = Math.ceil(rawTotal);\r\n        discountedTotal = Math.ceil(discountedTotal);\r\n    }\r\n\r\n    \/\/ ----------------------------------------------------\r\n    \/\/ VISUALIZACI\u00d3N EN EL FORMULARIO (HTML)\r\n    \/\/ ----------------------------------------------------\r\n\r\n    document.getElementById('total').innerText = formatCurrency(discountedTotal, tipo);\r\n\r\n    if (totalDiscountPercent > 0) {\r\n        document.getElementById('discountApplied').style.display = 'block';\r\n        document.getElementById('discountApplied').innerText = discountText;\r\n\r\n        document.getElementById('totalAfterDiscount').style.display = 'block';\r\n        document.getElementById('totalAfterDiscount').innerText = `Total before discount: ${formatCurrency(rawTotal, tipo)}`;\r\n    } else {\r\n        document.getElementById('discountApplied').style.display = 'none';\r\n        document.getElementById('totalAfterDiscount').style.display = 'none';\r\n    }\r\n\r\n    document.getElementById('discountNote').style.display = (totalViajeros >= 6 || earlyDays >= 7) ? 'block' : 'none';\r\n\r\n    \/\/ show\/hide guiaOpcionalDiv\r\n    if (tipo === 'nacional' && totalViajeros < 4) {\r\n        document.getElementById('guiaOpcionalDiv').style.display = 'block';\r\n    } else {\r\n        document.getElementById('guiaOpcionalDiv').style.display = 'none';\r\n        document.getElementById('extraGuia').checked = false; \/\/ Desactivar si se oculta\r\n    }\r\n\r\n    \/\/ update unit-price labels\r\n    document.getElementById('precioPerezoso').innerText = formatCurrency(precioExtraPerezoso, tipo);\r\n    document.getElementById('precioAgua').innerText = formatCurrency(precioAgua, tipo);\r\n    document.getElementById('precioToallas').innerText = formatCurrency(precioToallas, tipo);\r\n    document.getElementById('precioSnacks').innerText = formatCurrency(precioSnacks, tipo);\r\n    document.getElementById('precioPonchos').innerText = formatCurrency(precioPonchos, tipo);\r\n    document.getElementById('precioBinoculares').innerText = formatCurrency(precioBinoculares, tipo);\r\n\r\n    \/\/ 2. Actualizar la nota de dep\u00f3sito\r\n    const depositDisplayEl = document.getElementById('depositAmountDisplay');\r\n    const depositAmountText = tipo === 'nacional' ? formatCurrency(DEPOSIT_COLONES, 'nacional') : formatCurrency(DEPOSIT_USD, 'extranjero');\r\n    if (depositDisplayEl) {\r\n        depositDisplayEl.innerText = depositAmountText;\r\n    }\r\n    \/\/ Actualizar la nota importante para reflejar el tipo y el monto\r\n    const tilopayNoteEl = document.getElementById('tilopayDepositNote');\r\n    if (tilopayNoteEl) {\r\n        tilopayNoteEl.innerHTML = `<strong style=\"color: #0056b3;\">IMPORTANT NOTE:<\/strong> When booking, a deposit will be charged for \r\n            <span id=\"depositAmountDisplay\" style=\"font-weight:bold;\">${depositAmountText}<\/span>. The remaining amount must be canceled upon arrival.`;\r\n    }\r\n\r\n\r\n    \/\/ store computed numeric totals for PHP and Tilopay\r\n    _lastComputed = {\r\n        rawTotal: rawTotal,\r\n        discountPercent: totalDiscountPercent,\r\n        discountedTotal: discountedTotal,\r\n        currencyType: tipo\r\n    };\r\n}\r\n\r\n\/* ---------- Validation and UI helpers (C\u00d3DIGO MODIFICADO) ---------- *\/\r\nfunction clearAllFieldErrors() {\r\n    const ids = ['fecha','hora','tipoVisitante','guideLanguage','nombre','email','acompanantes','acceptTerms'];\r\n    ids.forEach(id => {\r\n        const el = document.getElementById(id);\r\n        if (el) clearFieldError(el);\r\n    });\r\n    const termsErr = document.getElementById('terms-error');\r\n    if(termsErr) termsErr.style.display = 'none';\r\n}\r\n\r\nfunction validateAll() {\r\n    clearAllFieldErrors();\r\n    let valid = true;\r\n\r\n    \/\/ travelers\r\n    const adultos = parseInt(document.getElementById('adultos').value) || 0;\r\n    const ninos = parseInt(document.getElementById('ninos').value) || 0;\r\n    const bebes = parseInt(document.getElementById('bebes').value) || 0;\r\n    const totalViajeros = adultos + ninos + bebes;\r\n\r\n    \/\/ VALIDACION 1: M\u00ednimo de 1 viajero (MODIFICADO DE 2 A 1)\r\n    if (totalViajeros < 1) {\r\n        const adultosEl = document.getElementById('adultos');\r\n        showFieldError(adultosEl, 'Minimum 1 traveler required \/ Se requiere m\u00ednimo 1 viajero');\r\n        valid = false;\r\n    }\r\n\r\n    \/\/ name\r\n    const nombreEl = document.getElementById('nombre');\r\n    const nombre = (nombreEl.value || '').trim();\r\n    if (!nombre) { showFieldError(nombreEl, 'Please enter full name \/ Por favor ingrese su nombre completo'); valid = false; }\r\n\r\n    \/\/ email\r\n    const emailEl = document.getElementById('email');\r\n    const email = (emailEl.value || '').trim();\r\n    const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\r\n    if (!email) { showFieldError(emailEl, 'Please enter email address \/ Por favor ingrese su correo'); valid = false; }\r\n    else if (!emailRegex.test(email)) { showFieldError(emailEl, 'Please enter a valid email address \/ Por favor ingrese un correo v\u00e1lido'); valid = false; }\r\n\r\n    \/\/ visitor type\r\n    const tipoEl = document.getElementById('tipoVisitante');\r\n    const tipo = tipoEl.value;\r\n    if (!tipo) { showFieldError(tipoEl, 'Please select visitor type \/ Seleccione tipo de visitante'); valid = false; }\r\n\r\n    \/\/ if extranjero -> guide language required\r\n    if (tipo === 'extranjero') {\r\n        const glEl = document.getElementById('guideLanguage');\r\n        const glVal = (glEl.value || '').trim();\r\n        if (!glVal) { showFieldError(glEl, 'Please select the guide language \/ Seleccione idioma del gu\u00eda'); valid = false; }\r\n    }\r\n\r\n    \/\/ date\r\n    const fechaEl = document.getElementById('fecha');\r\n    const fechaVal = fechaEl.value;\r\n    \/\/ La validaci\u00f3n de fecha antigua se ejecuta en applyDateRestriction\/change listener, aqu\u00ed solo revisamos si est\u00e1 vac\u00eda.\r\n    if (!fechaVal) { showFieldError(fechaEl, 'Please select a valid date \/ Por favor seleccione una fecha'); valid = false; }\r\n    \/\/ Volvemos a ejecutar la validaci\u00f3n de fecha para asegurarnos de que el customValidity est\u00e9 bien\r\n    if (fechaEl.customValidity && fechaEl.customValidity !== '') {\r\n        showFieldError(fechaEl, fechaEl.customValidity);\r\n        valid = false;\r\n    }\r\n\r\n\r\n    \/\/ time\r\n    const horaEl = document.getElementById('hora');\r\n    const horaVal = horaEl.value;\r\n    if (!horaVal) { showFieldError(horaEl, 'Please select a valid time \/ Por favor seleccione una hora'); valid = false; }\r\n\r\n    \/\/ VALIDACION 2: Nombres de acompa\u00f1antes OBLIGATORIO si son 2 o m\u00e1s viajeros\r\n    const acompEl = document.getElementById('acompanantes');\r\n    const acompVal = (acompEl.value || '').trim();\r\n    if (totalViajeros >= 2 && acompVal.length < 3) {\r\n        showFieldError(acompEl, 'Please list companion names when there are 2 or more people \/ Por favor liste los acompa\u00f1antes cuando hay 2 o m\u00e1s personas.');\r\n        valid = false;\r\n    }\r\n\r\n\r\n    \/\/ terms checkbox required\r\n    const accept = document.getElementById('acceptTerms');\r\n    if (!accept || !accept.checked) {\r\n        const termsErr = document.getElementById('terms-error');\r\n        termsErr.innerText = 'Debe aceptar los T\u00e9rminos y Condiciones y el uso de datos antes de continuar \/ You must accept Terms & Conditions and data usage.';\r\n        termsErr.style.display = 'block';\r\n        valid = false;\r\n    }\r\n\r\n    return valid;\r\n}\r\n\r\n\/* ---------- Gather form data for submission\/storage (Mantener sin cambios) ---------- *\/\r\nfunction gatherFormData() {\r\n    const tour = document.getElementById('tourTitle').innerText;\r\n    const nombre = document.getElementById('nombre').value.trim();\r\n    const fecha = document.getElementById('fecha').value;\r\n    const hora = document.getElementById('hora').value;\r\n    const tipo = document.getElementById('tipoVisitante').value;\r\n    const email = document.getElementById('email').value || 'N\/A';\r\n    const adultos = document.getElementById('adultos').value || '0';\r\n    const ninos = document.getElementById('ninos').value || '0';\r\n    const bebes = document.getElementById('bebes').value || '0';\r\n    const acompanantes = document.getElementById('acompanantes').value || '';\r\n    const guideLang = document.getElementById('guideLanguage').value || '';\r\n    const total = document.getElementById('total').innerText || '';\r\n    const discountText = document.getElementById('discountApplied').innerText || '';\r\n    const totalAfter = document.getElementById('totalAfterDiscount').innerText || '';\r\n    \/\/ No usamos 'comentarios' por ahora ya que no hay campo, pero se deja para el futuro.\r\n    const comentarios = '';\r\n\r\n    \/\/ extras array\r\n    let extrasArr = [];\r\n    if (document.getElementById('extraPerezoso')?.checked) extrasArr.push('Sloth & Tropical Birds Tour');\r\n    if ((parseInt(document.getElementById('botellasAgua')?.value) || 0) > 0) extrasArr.push('Bottled Water (' + document.getElementById('botellasAgua').value + ')');\r\n    if ((parseInt(document.getElementById('numToallas')?.value) || 0) > 0) extrasArr.push('Towels (' + document.getElementById('numToallas').value + ')');\r\n    if ((parseInt(document.getElementById('numSnacks')?.value) || 0) > 0) extrasArr.push('Snacks (' + document.getElementById('numSnacks').value + ')');\r\n    if ((parseInt(document.getElementById('numPonchos')?.value) || 0) > 0) extrasArr.push('Ponchos (' + document.getElementById('numPonchos').value + ')');\r\n    if ((parseInt(document.getElementById('numBinoculares')?.value) || 0) > 0 && !document.getElementById('extraPerezoso')?.checked) extrasArr.push('Binoculars (' + document.getElementById('numBinoculares').value + ')');\r\n    if (document.getElementById('extraGuia')?.checked) extrasArr.push('Optional Guide (\u20a16000)');\r\n    const extrasText = extrasArr.length ? extrasArr.join('\\n- ') : 'None';\r\n\r\n    \/\/ also include computed numeric totals if available\r\n    const computed = _lastComputed || {};\r\n    return {\r\n        tour, nombre, fecha, hora, tipo, email, adultos, ninos, bebes, acompanantes, guideLang, total, extrasText, discountText, totalAfter, comentarios,\r\n        rawTotal: computed.rawTotal || null,\r\n        discountedTotal: computed.discountedTotal || null,\r\n        currencyType: computed.currencyType || (document.getElementById('tipoVisitante').value || 'nacional')\r\n    };\r\n}\r\n\r\n\/* ---------- Proceed to payment (shows payment method options) (Mantener sin cambios) ---------- *\/\r\nfunction onProceedToPayment() {\r\n    \/\/ validate\r\n    if (!validateAll()) {\r\n        const firstInvalid = document.querySelector('.invalid-field');\r\n        if (firstInvalid) firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        return;\r\n    }\r\n    \/\/ show payment area\r\n    document.getElementById('paymentSection').style.display = 'block';\r\n    \/\/ hide proceed button to avoid duplicate\r\n    document.getElementById('btnProceed').style.display = 'none';\r\n\r\n    \/\/ Scroll payment section into view\r\n    document.getElementById('paymentSection').scrollIntoView({behavior: 'smooth', block: 'center'});\r\n\r\n    \/\/ Force run change handler to display details for selected (if any)\r\n    onPaymentMethodChange();\r\n}\r\n\r\n\/* ---------- Save reservation to server (for webhook) - \u00a1MODIFICADA! ---------- *\/\r\nfunction persistReservation(formData, paymentMethodLabel, orderReference, depositAmount, depositCurrency) {\r\n    const payload = Object.assign({}, formData, {\r\n        paymentMethod: paymentMethodLabel,\r\n        orderReference: orderReference,\r\n        depositAmount: depositAmount, \/\/ Se\u00f1a (monto a pagar en Tilopay)\r\n        depositCurrency: depositCurrency, \/\/ Moneda de la se\u00f1a\r\n        savedAt: new Date().toISOString()\r\n    });\r\n\r\n    \/\/ Guardar localmente solo para la p\u00e1gina de \u00e9xito, si la queremos usar de fallback.\r\n    try {\r\n        localStorage.setItem(STORAGE_KEY, JSON.stringify(payload));\r\n    } catch (e) {\r\n        console.error('Error saving reservation to localStorage (continuando con server)', e);\r\n    }\r\n\r\n    \/\/ 2. Guardar en el servidor (para que el webhook lo encuentre)\r\n    \/\/ Usamos async\/await para forzar que el guardado ocurra antes de la redirecci\u00f3n\r\n    return fetch(SAVE_URL, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application\/json' },\r\n        body: JSON.stringify(payload)\r\n    })\r\n    .then(response => response.json())\r\n    .then(data => {\r\n        if (!data.success) {\r\n            console.error('Error: La reserva NO se guard\u00f3 en el servidor:', data.message);\r\n            return false; \/\/ Bloquea la compra si no se guarda en el servidor\r\n        }\r\n        console.log(\"Reserva guardada en el servidor con \u00e9xito:\", orderReference);\r\n        return true;\r\n    })\r\n    .catch(error => {\r\n        console.error('Error de red al guardar en el servidor:', error);\r\n        return false;\r\n    });\r\n}\r\n\r\n\r\n\/* ---------- FUNCI\u00d3N DE PAGO CON TARJETA - \u00a1MODIFICADA! ---------- *\/\r\nasync function handleCardPayment() {\r\n    \/\/ 1. Re-validar los datos por seguridad\r\n    if (!validateAll()) {\r\n        alert('Please complete all form data correctly before proceeding to payment. \/ Por favor, complete todos los datos del formulario correctamente antes de pagar.');\r\n        const firstInvalid = document.querySelector('.invalid-field');\r\n        if (firstInvalid) firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        return;\r\n    }\r\n\r\n    const btn = document.querySelector('#tilopayButtonContainer button');\r\n    btn.disabled = true;\r\n    const originalText = btn.innerText;\r\n    btn.innerText = 'Saving reservation... \/ Guardando reserva...';\r\n\r\n    const reservationData = gatherFormData();\r\n\r\n    \/\/ 2. Generar Referencia \u00danica\r\n    reservationData.orderReference = generateOrderReference(); \/\/ Usaremos este valor como 'reference' en Tilopay\r\n\r\n    \/\/ 3. Obtener el monto de SE\u00d1A y configurar la moneda\r\n    const isUSD = reservationData.currencyType !== 'nacional';\r\n\r\n    let tilopayAmount;\r\n    let tilopayCurrency;\r\n    let tilopayLink;\r\n\r\n    if (isUSD) {\r\n        \/\/ Extranjeros: Se\u00f1a fija de $15.00 USD\r\n        tilopayAmount = DEPOSIT_USD.toFixed(2);\r\n        tilopayCurrency = 'USD';\r\n        tilopayLink = TILO_LINK_USD;\r\n    } else {\r\n        \/\/ Nacionales: Se\u00f1a fija de \u20a17000 CRC\r\n        tilopayAmount = DEPOSIT_COLONES;\r\n        tilopayCurrency = 'CRC';\r\n        tilopayLink = TILO_LINK_COLONES;\r\n    }\r\n\r\n    \/\/ 4. Guardar Datos de Reserva en el servidor ANTES de la redirecci\u00f3n\r\n    const savedToServer = await persistReservation(reservationData, 'Card (Tilopay - Deposit)', reservationData.orderReference, tilopayAmount, tilopayCurrency);\r\n\r\n    if (!savedToServer) {\r\n        alert(\"\u274c Error: Could not secure reservation on the server. Please try again. \/ No se pudo asegurar la reserva en el servidor. Intente nuevamente.\");\r\n        btn.disabled = false;\r\n        btn.innerText = originalText;\r\n        return;\r\n    }\r\n\r\n    \/\/ 5. Construir URL de Tilopay\r\n    const conceptText = encodeURIComponent(`Reservation: ${reservationData.tour}. Total: ${reservationData.total}. Deposit: ${tilopayCurrency} ${tilopayAmount}`);\r\n\r\n    const tilopayUrl = `${tilopayLink}?` +\r\n                        `amount=${tilopayAmount}` +\r\n                        `&currency=${tilopayCurrency}` +\r\n                        `&reference=${reservationData.orderReference}` + \/\/ \u00a1CRUCIAL! Tilopay nos devuelve este valor como 'reference' en el webhook.\r\n                        `&description=${conceptText}` +\r\n                        `&return_url=${RETURN_URL}`;\r\n\r\n    \/\/ 6. Redirigir a Tilopay (en la misma pesta\u00f1a)\r\n    btn.innerText = 'Redirecting to Tilopay... \/ Redirigiendo a Tilopay...';\r\n    window.location.href = tilopayUrl;\r\n}\r\n\r\n\/* ---------- Handle selection of payment method (C\u00d3DIGO MODIFICADO PARA SIMPE\/BINANCE) ---------- *\/\r\nfunction onPaymentMethodChange() {\r\n    const selected = document.querySelector('input[name=\"paymentMethod\"]:checked');\r\n    const detailsEl = document.getElementById('paymentDetails');\r\n    const tilopayBtnContainer = document.getElementById('tilopayButtonContainer');\r\n\r\n    detailsEl.innerHTML = '';\r\n    tilopayBtnContainer.style.display = 'none';\r\n\r\n    if (!selected) return;\r\n\r\n    const method = selected.value;\r\n    const data = gatherFormData();\r\n    const isUSD = data.currencyType !== 'nacional';\r\n    const depositAmountColones = formatCurrency(DEPOSIT_COLONES, 'nacional');\r\n    const depositAmountUSD = formatCurrency(DEPOSIT_USD, 'extranjero');\r\n\r\n    \/\/ Put a summary at top\r\n    const summaryHtml = `<div style=\"margin-bottom:8px;\"><strong>Summary:<\/strong><br>Tour: ${data.tour}<br>Date: ${data.fecha} ${data.hora}<br>Name: ${data.nombre}<br>Total Tour: ${data.total}<br>${data.discountText ? data.discountText + '<br>' + (data.totalAfter ? data.totalAfter : '') : ''}<\/div>`;\r\n    detailsEl.insertAdjacentHTML('beforeend', summaryHtml);\r\n\r\n    if (method === 'tarjeta') {\r\n        detailsEl.insertAdjacentHTML('beforeend', `\r\n            <div class=\"payment-note\">\r\n                <strong>Card Payment (Tilopay - Deposit)<\/strong><br>\r\n                Only the deposit of <strong>${isUSD ? depositAmountUSD : depositAmountColones}<\/strong> will be charged. The remainder is paid on site.<br>\r\n                <br>You will be redirected to the secure Tilopay payment gateway in this tab.\r\n            <\/div>\r\n        `);\r\n        \/\/ Mostrar el bot\u00f3n de pago con tarjeta\r\n        tilopayBtnContainer.style.display = 'block';\r\n        \r\n        \/\/ MEJORA 2: Forzar scroll hacia el bot\u00f3n de pago de Tilopay al seleccionarlo\r\n        setTimeout(() => {\r\n            tilopayBtnContainer.scrollIntoView({behavior: 'smooth', block: 'nearest'});\r\n        }, 100);\r\n\r\n    } else if (method === 'simpe' || method === 'binance') {\r\n        \/\/ --- L\u00d3GICA DE SUBIDA DE COMPROBANTE CON PHP ---\r\n        const isSimpe = method === 'simpe';\r\n        const paymentLabel = isSimpe ? 'Simpe M\u00f3vil' : 'Binance (USDT)';\r\n        const phoneOrID = isSimpe ? SIMPE_PHONE : BINANCE_ID;\r\n        const nameOrTitle = isSimpe ? SIMPE_NAME : 'Wallet ID';\r\n        const noteTitle = isSimpe ? 'Payment by Simpe M\u00f3vil' : 'Payment by Binance (USDT)';\r\n        \/\/ Obtenemos el monto a pagar, ya sea en CRC o USD\r\n        const totalToPay = data.total;\r\n        \r\n        \/\/ 3. Y 4. Textos de Simpe\/Binance (MODIFICADOS)\r\n        const depositAmount = isUSD ? depositAmountUSD : depositAmountColones;\r\n        \r\n        const instruction = `<div class=\"payment-note\">\r\n            <strong>${noteTitle}<\/strong><br>\r\n            Please make a deposit payment of <strong>${depositAmount}<\/strong> to <strong>${nameOrTitle}<\/strong>: <strong>${phoneOrID}<\/strong>.\r\n            <br><br>\r\n            The deposit amount will be **deducted from your total payment** on the day of the tour.\r\n            <br>\r\n            *Note: You have the option to pay the full amount (${totalToPay}) if you prefer to simplify management.*\r\n        <\/div>`;\r\n\r\n        \/\/ El campo de subida de archivo y el bot\u00f3n que llama a sendBookingByPHP\r\n        const uploadForm = `\r\n            <div style=\"border: 1px dashed #ff8c00; padding: 15px; border-radius: 8px; margin-top: 15px;\">\r\n                <p style=\"font-weight:bold; margin-bottom:10px;\">FINAL STEP: Upload your receipt to confirm your booking (English\/Spanish)<\/p>\r\n                <p style=\"margin-bottom:10px; font-size:0.9em;\">**We will confirm your payment to create your reservation.**<\/p>\r\n                <div class=\"form-group\" style=\"margin-bottom: 20px;\">\r\n                    <label for=\"comprobanteFile\"><b>Attach Payment Receipt (JPEG, PNG, PDF):<\/b><\/label>\r\n                    <input type=\"file\" id=\"comprobanteFile\" class=\"input\" accept=\"image\/jpeg,image\/png,application\/pdf\">\r\n                    <span id=\"comprobanteFile-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n                <button class=\"action-btn btn-blue\" type=\"button\" onclick=\"sendBookingByPHP('${paymentLabel}', 'deposit')\">\r\n                    Upload Receipt and Confirm Booking by Email\r\n                <\/button>\r\n            <\/div>\r\n            <p style=\"margin-top:10px;\">Optional: If you prefer to send via WhatsApp without attaching here, click: <a id=\"whatsappButton\" class=\"action-btn btn-green\" target=\"_blank\" href=\"#\">Send WhatsApp Message<\/a><\/p>\r\n            `;\r\n\r\n        detailsEl.insertAdjacentHTML('beforeend', instruction + uploadForm);\r\n        \r\n        \/\/ 5. L\u00f3gica del bot\u00f3n de WhatsApp (MEJORADA)\r\n        const whatsappButton = document.getElementById('whatsappButton');\r\n        if (whatsappButton) {\r\n            \/\/ La URL de WhatsApp se genera aqu\u00ed con toda la informaci\u00f3n\r\n            const whatsappMessage = `Hello, I made a booking with the following details:\\n\\n` +\r\n                `*Tour:* ${data.tour}\\n` +\r\n                `*Date:* ${data.fecha} at ${data.hora}\\n` +\r\n                `*Name:* ${data.nombre} (${data.email})\\n` +\r\n                `*Travelers:* ${parseInt(data.adultos)+parseInt(data.ninos)+parseInt(data.bebes)}\\n` +\r\n                `*Companion Names:* ${data.acompanantes || 'None'}\\n` +\r\n                `*Total Paid\/Deposit:* ${depositAmount} (for Simpe\/Binance)\\n` +\r\n                `*Total Tour Price:* ${data.total}\\n\\n` +\r\n                `I attach the payment receipt for the deposit\/full amount via ${paymentLabel}. Please confirm my reservation.`;\r\n            \r\n            whatsappButton.href = `https:\/\/wa.me\/${ADMIN_WHATSAPP}?text=${encodeURIComponent(whatsappMessage)}`;\r\n        }\r\n\r\n        detailsEl.scrollIntoView({behavior: 'smooth', block: 'center'});\r\n    }\r\n}\r\n\r\n\/* ---------- Funci\u00f3n de env\u00edo de datos y archivo (fetch con FormData) para Simpe\/Binance (C\u00d3DIGO MODIFICADO PARA MENSAJE DE \u00c9XITO) ---------- *\/\r\nfunction sendBookingByPHP(paymentMethod, paymentType) {\r\n    \/\/ 1. Validaciones\r\n    if (!validateAll()) {\r\n        const firstInvalid = document.querySelector('.invalid-field');\r\n        if (firstInvalid) firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        return;\r\n    }\r\n\r\n    const comprobanteFileEl = document.getElementById('comprobanteFile');\r\n    if (!comprobanteFileEl || !comprobanteFileEl.files.length) {\r\n        showFieldError(comprobanteFileEl, 'You must attach the payment receipt to send the booking. \/ Debe adjuntar el comprobante de pago para enviar la reserva.');\r\n        return;\r\n    }\r\n    clearFieldError(comprobanteFileEl);\r\n\r\n    \/\/ 2. Construir FormData (clave para enviar archivos)\r\n    const formData = new FormData();\r\n    const data = gatherFormData();\r\n    const isUSD = data.currencyType !== 'nacional';\r\n    const depositAmount = isUSD ? DEPOSIT_USD : DEPOSIT_COLONES;\r\n\r\n    \/\/ Adjuntar campos de texto\r\n    Object.keys(data).forEach(key => {\r\n        formData.append(key, data[key]);\r\n    });\r\n    \/\/ Adjuntar datos de c\u00e1lculo y m\u00e9todo de pago\r\n    formData.append('paymentMethod', paymentMethod);\r\n    formData.append('rawTotal', _lastComputed.rawTotal);\r\n    formData.append('discountedTotal', _lastComputed.discountedTotal);\r\n    formData.append('discountPercent', _lastComputed.discountPercent);\r\n    \/\/ Para Simpe\/Binance indicamos el pago de la se\u00f1a, aunque el usuario pueda haber pagado el total\r\n    formData.append('paymentAmount', depositAmount);\r\n    formData.append('paymentCurrency', _lastComputed.currencyType === 'nacional' ? 'CRC' : 'USD');\r\n    \/\/ Adjuntar el archivo (la clave 'comprobante' debe coincidir con el PHP)\r\n    formData.append('comprobante', comprobanteFileEl.files[0]);\r\n\r\n    \/\/ 3. Ejecutar el env\u00edo (AJAX \/ fetch)\r\n    const btn = document.querySelector(`[onclick=\"sendBookingByPHP('${paymentMethod}', 'deposit')\"]`);\r\n    const originalText = btn.innerText;\r\n    btn.disabled = true;\r\n    btn.innerText = 'Sending... \/ Enviando...';\r\n\r\n    fetch(SEND_BOOKING_URL, {\r\n        method: 'POST',\r\n        body: formData\r\n    })\r\n    .then(response => {\r\n        const contentType = response.headers.get(\"content-type\");\r\n        if (contentType && contentType.indexOf(\"application\/json\") !== -1) {\r\n            return response.json();\r\n        } else {\r\n            return response.text().then(text => {\r\n                console.error('Raw PHP Error:', text);\r\n                throw new Error(\"Response is not JSON. Server or PHP error: \" + text.substring(0, 100) + '...');\r\n            });\r\n        }\r\n    })\r\n    .then(data => {\r\n        if (data.success) {\r\n            \/\/ 7. Mensaje de \u00e9xito BILING\u00dcE MEJORADO\r\n            alert('\u2705 Booking and receipt successfully sent!\\n\\nWe have sent the details to your email and the administrator. \/ \u00a1Reserva y comprobante enviados exitosamente! Hemos enviado los detalles a su correo y al administrador.');\r\n            closeBookingForm();\r\n        } else {\r\n            console.error('Server error:', data.message);\r\n            alert('\u274c Error sending booking: ' + (data.message || ''));\r\n        }\r\n    })\r\n    .catch(error => {\r\n        console.error('Connection\/Upload error:', error.message);\r\n        alert('\u274c Connection Error. Email could not be sent. Check browser console.');\r\n    })\r\n    .finally(() => {\r\n        btn.disabled = false;\r\n        btn.innerText = originalText;\r\n    });\r\n}\r\n\r\n\/\/ ----------------------------------------------------\r\n\/\/ L\u00f3gica para los nuevos botones de Cantidad (+\/-) (Sin cambios)\r\n\/\/ ----------------------------------------------------\r\nfunction updateQuantity(targetId, delta) {\r\n    const inputEl = document.getElementById(targetId);\r\n    if (!inputEl) return;\r\n    \r\n    let currentValue = parseInt(inputEl.value) || 0;\r\n    let newValue = currentValue + delta;\r\n    \r\n    \/\/ Constraints (min=0 is already set in HTML, but good to re-check)\r\n    if (newValue < 0) {\r\n        newValue = 0;\r\n    }\r\n\r\n    inputEl.value = newValue;\r\n    \r\n    \/\/ Simulate input\/change event to trigger calculation\r\n    if (['adultos','ninos','bebes','fecha'].includes(targetId) || targetId.startsWith('num') || targetId.startsWith('botellas')) {\r\n        calcularTotal();\r\n    }\r\n}\r\n\r\n\/* ---------- Attach events to clear errors and recalc (Modificada para incluir los botones +\/-) ---------- *\/\r\ndocument.addEventListener('DOMContentLoaded', function(){\r\n    const ids = ['tipoVisitante','adultos','ninos','bebes','extraPerezoso','botellasAgua','numToallas','numSnacks','numPonchos','numBinoculares','extraGuia','fecha','hora','nombre','email','acompanantes','guideLanguage','acceptTerms'];\r\n    ids.forEach(id => {\r\n        const el = document.getElementById(id);\r\n        if (el) {\r\n            \/\/ Unificar eventos para recalcular y limpiar error\r\n            const eventNames = (el.type === 'text' || el.type === 'email' || el.type === 'textarea') ? ['input', 'change'] : ['change'];\r\n            eventNames.forEach(eventName => {\r\n                el.addEventListener(eventName, function(){\r\n                    clearFieldError(el);\r\n                    \/\/ Calcular total solo en campos que afectan el precio\r\n                    if (['adultos','ninos','bebes','tipoVisitante','extraPerezoso','botellasAgua','numToallas','numSnacks','numPonchos','numBinoculares','extraGuia','fecha'].includes(id)) {\r\n                        calcularTotal();\r\n                    }\r\n                });\r\n            });\r\n        }\r\n    });\r\n    \r\n    \/\/ Attach event listeners for the +\/- buttons\r\n    document.querySelectorAll('.qty-btn').forEach(button => {\r\n        button.addEventListener('click', function() {\r\n            const targetId = this.getAttribute('data-target');\r\n            const delta = this.classList.contains('plus-btn') ? 1 : -1;\r\n            updateQuantity(targetId, delta);\r\n        });\r\n    });\r\n\r\n\/\/ Forzar un c\u00e1lculo al cargar para asegurar que la nota de dep\u00f3sito est\u00e9 correcta inicialmente\r\n    calcularTotal();\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-43cf814 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"43cf814\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-439b90c elementor-widget elementor-widget-spacer\" data-id=\"439b90c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b139ebc elementor-widget elementor-widget-heading\" data-id=\"b139ebc\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"Encuentro\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\u201cEncuentro Salvaje: Perezosos y Aves Tropicales\u201d<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7589ba0 elementor-widget elementor-widget-spacer\" data-id=\"7589ba0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3e719bc elementor-widget__width-initial elementor-arrows-position-inside elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel\" data-id=\"3e719bc\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;slides_to_show&quot;:&quot;1&quot;,&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;infinite&quot;:&quot;yes&quot;,&quot;effect&quot;:&quot;slide&quot;,&quot;speed&quot;:500}\" data-widget_type=\"image-carousel.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-image-carousel-wrapper swiper\" role=\"region\" aria-roledescription=\"carousel\" aria-label=\"Carrusel de im\u00e1genes\" dir=\"ltr\">\n\t\t\t<div class=\"elementor-image-carousel swiper-wrapper\" aria-live=\"off\">\n\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"1 de 5\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/DSC_3682-2-scaled-rbxk8arafiq3c565l06wtzvn8yyckdykd4vxbjlt4w.jpg\" alt=\"DSC_3682 (2)\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"2 de 5\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/DSC_3995-scaled-rbxhhwzf3s1o5g2s2h8nutmsx3vawvdyu6qd0xh8e8.jpg\" alt=\"DSC_3995\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"3 de 5\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/Tucan--rcepfv03qlmp8c0ly17algtuj3k53t2yxrb2xgft8g.jpg\" alt=\"Tuca\u0301n\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"4 de 5\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/Toledo-rcepgii2hgival2h4tcytswddqcbg8o9czm7xdgyww.jpg\" alt=\"Toledo\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"5 de 5\" data-no-translation-aria-label=\"\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/Alcon-Blanco-rceph44cuncgpm72mkpdx5fz1ldrda233ymdyqkwxs.jpg\" alt=\"Alco\u0301n Blanco\" \/><\/figure><\/div>\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-prev\" role=\"button\" tabindex=\"0\">\n\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-left\" viewbox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M646 125C629 125 613 133 604 142L308 442C296 454 292 471 292 487 292 504 296 521 308 533L604 854C617 867 629 875 646 875 663 875 679 871 692 858 704 846 713 829 713 812 713 796 708 779 692 767L438 487 692 225C700 217 708 204 708 187 708 171 704 154 692 142 675 129 663 125 646 125Z\"><\/path><\/svg>\t\t\t\t\t<\/div>\n\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-next\" role=\"button\" tabindex=\"0\">\n\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-right\" viewbox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M696 533C708 521 713 504 713 487 713 471 708 454 696 446L400 146C388 133 375 125 354 125 338 125 325 129 313 142 300 154 292 171 292 187 292 204 296 221 308 233L563 492 304 771C292 783 288 800 288 817 288 833 296 850 308 863 321 871 338 875 354 875 371 875 388 867 400 854L696 533Z\"><\/path><\/svg>\t\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"swiper-pagination\"><\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-63f71d2 e-flex e-con-boxed e-con e-parent\" data-id=\"63f71d2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3713005 elementor-widget elementor-widget-spacer\" data-id=\"3713005\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8732ece elementor-widget-mobile__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"8732ece\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"77\" data-end=\"284\">Explora nuestros senderos cerca del rancho y descubre la incre\u00edble vida silvestre de Miravalles. Tendr\u00e1s la oportunidad de avistar perezosos, tucanes y muchas especies end\u00e9micas, todo dentro de un entorno seguro y accesible.<\/p><p data-start=\"286\" data-end=\"426\">El tour incluye binoculares y un telescopio, lo que te permite disfrutar de aves y perezosos incluso desde nuestro rancho, sin necesidad de largas caminatas.<\/p><p data-start=\"428\" data-end=\"654\">Es adecuado para todas las edades, y la duraci\u00f3n y la distancia se pueden personalizar seg\u00fan tu ritmo e intereses. Si lo deseas, el recorrido se puede ampliar para aquellos que quieran explorar m\u00e1s y aprovechar al m\u00e1ximo la experiencia.<\/p><p data-start=\"656\" data-end=\"781\">Experimenta la naturaleza de cerca, aprende sobre las especies locales y captura momentos inolvidables en este encuentro \u00fanico con la fauna salvaje.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8152314 e-flex e-con-boxed e-con e-parent\" data-id=\"8152314\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-38328f3 elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"38328f3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div style=\"text-align:center; margin:1px 0;\">\r\n    <button\r\n        onclick=\"openBookingForm(this)\"\r\n        data-tour=\"Wild Encounter: Sloths & Tropical Birds\"\r\n        data-desc=\"customizable duration and distance.\"\r\n        data-precio-adulto-nacional=\"13800\"\r\n        data-precio-adulto-extranjero=\"30\"\r\n        data-precio-nino-nacional=\"6900\"\r\n        data-precio-nino-extranjero=\"20\"\r\n        style=\"background:#ff1a50; color:white; font-size:15px; padding:15px 77px; border:none; border-radius:30px; cursor:pointer; box-shadow: 0 4px 10px rgba(255, 26, 80, 0.4);\">\r\n        RESERVAR\r\n    <\/button>\r\n<\/div>\r\n\r\n<div id=\"bookingModal\" style=\"display:none; position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.7); z-index:9999; overflow:auto;\">\r\n    <div style=\"background:#fff; max-width:750px; margin:50px auto; padding:30px; border-radius:15px; position:relative; box-shadow: 0 5px 15px rgba(0,0,0,0.3);\">\r\n\r\n        <button onclick=\"closeBookingForm()\" style=\"position:absolute; top:15px; right:15px; font-size:24px; background:none; border:none; cursor:pointer; color:#333;\">\u2716<\/button>\r\n\r\n        <h2 style=\"text-align:center; margin-bottom:10px; color:#2E7D32; font-size:26px;\" id=\"tourTitle\"><\/h2>\r\n        <p style=\"text-align:center; margin-bottom:25px; color:#555;\" id=\"tourDesc\"><\/p>\r\n\r\n        <form id=\"bookingForm\" onsubmit=\"event.preventDefault();\" action=\"\">\r\n\r\n            <div style=\"margin-top:20px; margin-bottom:16px;\">\r\n                <label for=\"fecha\" class=\"form-label\"><b>\ud83d\udcc5 Fecha (Seleccionar fecha):<\/b><\/label><span id=\"fecha-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <input type=\"date\" id=\"fecha\" class=\"input\" required onchange=\"calcularTotal()\">\r\n                <span id=\"fecha-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <div style=\"margin-bottom:12px;\">\r\n                <label for=\"hora\" class=\"form-label\"><b>Hora (Seleccionar hora):<\/b><\/label><span id=\"hora-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <select id=\"hora\" class=\"input\">\r\n                    <option value=\"\" selected disabled>Select a time<\/option>\r\n                    <option value=\"8:00 am\">8:00 am<\/option>\r\n                    <option value=\"9:00 am\">9:00 am<\/option>\r\n                    <option value=\"10:00 am\">10:00 am<\/option>\r\n                    <option value=\"1:00 pm\">1:00 pm<\/option>\r\n                    <option value=\"2:00 pm\">2:00 pm<\/option>\r\n                <\/select>\r\n                <span id=\"hora-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <div style=\"margin-bottom:12px;\">\r\n                <label for=\"tipoVisitante\" class=\"form-label\"><b>Tipo de visitante (extranjero o residente):<\/b><\/label><span id=\"tipoVisitante-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <select id=\"tipoVisitante\" class=\"input\" onchange=\"onVisitorTypeChange(); calcularTotal()\">\r\n                    <option value=\"\" selected disabled>Select visitor type<\/option>\r\n                    <option value=\"extranjero\">Foreign \/ Extranjero<\/option>\r\n                    <option value=\"nacional\">Local \/ Nacional<\/option>\r\n                <\/select>\r\n                <span id=\"tipoVisitante-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <div id=\"guideLanguageDiv\" style=\"display:none; margin-bottom:15px;\">\r\n                <label for=\"guideLanguage\" class=\"form-label\"><b>Seleccionar idioma del gu\u00eda:<\/b><\/label><span id=\"guideLanguage-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n                <select id=\"guideLanguage\" class=\"input\">\r\n                    <option value=\"\" selected disabled>Select guide language<\/option>\r\n                    <option value=\"English\">English<\/option>\r\n                    <option value=\"Spanish\">Spanish<\/option>\r\n                <\/select>\r\n                <p class=\"note\"><i>Elige el idioma del gu\u00eda.<\/i><\/p>\r\n                <span id=\"guideLanguage-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n<h3 class=\"section-title\">Viajeros<\/h3>\r\n<p class=\"section-note\">Los precios var\u00edan seg\u00fan la edad y el n\u00famero de personas.<\/p>\r\n<p class=\"note\"><i>Total de viajeros: <span id=\"totalTravelers\" style=\"font-weight:bold;\">0<\/span><\/i><\/p>\r\n<p class=\"note discount-note\" id=\"discountNote\" style=\"display:none;\"><i>Descuentos de hasta un 30% disponibles para grupos grandes y reservas anticipadas.<\/i><\/p>\r\n\r\n<div class=\"traveler-row\">\r\n<div class=\"traveler-info\">\r\n<label for=\"adultos\" class=\"traveler-label\">Adultos (13-70 a\u00f1os):<span class=\"discount-tag discount-green\">-0%<\/span><\/label>\r\n<\/div>\r\n<div class=\"quantity-control\">\r\n<button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"adultos\">-<\/button>\r\n<input type=\"number\" id=\"adultos\" min=\"0\" value=\"0\" class=\"input-num\" oninput=\"calcularTotal()\">\r\n<button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"adultos\">+<\/button>\r\n<\/div>\r\n<\/div>\r\n<div class=\"traveler-row\">\r\n<div class=\"traveler-info\">\r\n<label for=\"ninos\" class=\"traveler-label\">Ni\u00f1os (5-12 a\u00f1os):<span class=\"discount-tag discount-green\">-50%*<\/span><\/label>\r\n<\/div>\r\n<div class=\"quantity-control\">\r\n<button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"ninos\">-<\/button>\r\n<input type=\"number\" id=\"ninos\" min=\"0\" value=\"0\" class=\"input-num\" oninput=\"calcularTotal()\">\r\n<button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"ninos\">+<\/button>\r\n<\/div>\r\n<\/div>\r\n<div class=\"traveler-row\">\r\n<div class=\"traveler-info\">\r\n<label for=\"bebes\" class=\"traveler-label\">Beb\u00e9s (0-4 a\u00f1os):<span class=\"discount-tag discount-green\">FREE*<\/span><\/label>\r\n<\/div>\r\n<div class=\"quantity-control\">\r\n<button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"bebes\">-<\/button>\r\n<input type=\"number\" id=\"bebes\" min=\"0\" value=\"0\" class=\"input-num\" oninput=\"calcularTotal()\">\r\n<button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"bebes\">+<\/button>\r\n<\/div>\r\n<\/div>\r\n\r\n<h3 class=\"section-title\">Agregar extras<\/h3>\r\n<p class=\"section-note\">Selecciona los art\u00edculos adicionales que necesitas y agrega la cantidad.<\/p>\r\n\r\n<div class=\"extra-item no-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" style=\"display:block;\">\r\n            <input type=\"checkbox\" id=\"extraPerezoso\" onchange=\"calcularTotal()\"> \r\n            Tour de Perezosos y Aves Tropicales (<span id=\"precioPerezoso\" class=\"price-span\" style=\"color:black;\">$10<\/span> por persona)\r\n        <\/label>\r\n        <p class=\"note\" style=\"margin-left:25px; margin-top:2px;\">\r\n            <i>(Incluye el uso de binoculares y telescopio)<\/i>\r\n        <\/p>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\" style=\"visibility:hidden; height:36px; border:none; width:110px; margin-left:10px;\"><\/div>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"botellasAgua\">Agua embotellada (<span id=\"precioAgua\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"botellasAgua\">-<\/button>\r\n        <input type=\"number\" id=\"botellasAgua\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"botellasAgua\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkAgua\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numToallas\">Toallas (<span id=\"precioToallas\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numToallas\">-<\/button>\r\n        <input type=\"number\" id=\"numToallas\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numToallas\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkToallas\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numSnacks\">Snacks Granuts (<span id=\"precioSnacks\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numSnacks\">-<\/button>\r\n        <input type=\"number\" id=\"numSnacks\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numSnacks\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkSnacks\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numPonchos\">Ponchos para la lluvia<span id=\"precioPonchos\" class=\"price-span\" style=\"color:black;\">$2<\/span> c\/u)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numPonchos\">-<\/button>\r\n        <input type=\"number\" id=\"numPonchos\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numPonchos\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkPonchos\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<div class=\"extra-item with-qty-row final-extra-row\">\r\n    <div class=\"extra-label-info\">\r\n        <label class=\"extra-label\" for=\"numBinoculares\">Uso de binoculares (<span id=\"precioBinoculares\" class=\"price-span\" style=\"color:black;\">$5<\/span>)<\/label>\r\n    <\/div>\r\n    <div class=\"quantity-control extra-qty-control\">\r\n        <button type=\"button\" class=\"qty-btn minus-btn\" data-target=\"numBinoculares\">-<\/button>\r\n        <input type=\"number\" id=\"numBinoculares\" min=\"0\" value=\"0\" class=\"input-num extra-num\" oninput=\"calcularTotal()\">\r\n        <button type=\"button\" class=\"qty-btn plus-btn\" data-target=\"numBinoculares\">+<\/button>\r\n    <\/div>\r\n    <input type=\"checkbox\" id=\"checkBinoculares\" onchange=\"calcularTotal()\" style=\"display:none;\"\/>\r\n<\/div>\r\n\r\n<p class=\"note\" style=\"margin-left: 0; margin-top: -5px; margin-bottom: 20px; text-align: left; font-size: 0.85em; width: 100%;\">\r\n    <i>(Solo disponible si NO selecciona el Tour de Perezosos y Aves Tropicales)<\/i>\r\n<\/p>\r\n            <h3 class=\"section-title\">Informaci\u00f3n del cliente<\/h3>\r\n\r\n            <label for=\"nombre\" class=\"form-label\">Nombre completo:<\/label><span id=\"nombre-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n            <input type=\"text\" id=\"nombre\" class=\"input\" style=\"margin-bottom:6px;\">\r\n            <span id=\"nombre-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n\r\n            <label for=\"email\" class=\"form-label\">Email:<\/label><span id=\"email-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n            <input type=\"email\" id=\"email\" class=\"input\" style=\"margin-bottom:6px;\">\r\n            <span id=\"email-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n\r\n            <label for=\"acompanantes\" class=\"form-label\">Nombres de acompa\u00f1antes: <span id=\"acompanantes-note\" style=\"font-weight:normal; font-size:0.9em; color:#555;\">(Requerido si hay 2 o m\u00e1s viajeros)<\/span><\/label><span id=\"acompanantes-asterisk\" class=\"field-asterisk\" style=\"display:none\">*<\/span>\r\n            <textarea id=\"acompanantes\" class=\"input\" style=\"margin-bottom:12px;\" placeholder=\"Enumera los nombres de los compa\u00f1eros separados por comas\"><\/textarea>\r\n            <span id=\"acompanantes-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n\r\n            <div style=\"margin:10px 0;\">\r\n                <style>\r\n                    #acceptTermsLink {\r\n                        color: #1A237E;\r\n                        font-weight: bold;\r\n                        text-decoration: none;\r\n                        transition: color 0.3s;\r\n                    }\r\n                    #acceptTermsLink:hover {\r\n                        color: #0D1033;\r\n                        text-decoration: underline;\r\n                    }\r\n                <\/style>\r\n                <label>\r\n                    <input type=\"checkbox\" id=\"acceptTerms\" style=\"margin-right:8px;\" onchange=\"clearFieldError(this)\">\r\n                    <span style=\"color:black;\">He le\u00eddo y acepto el <\/span>\r\n                    <a id=\"acceptTermsLink\" href=\"https:\/\/cuilpilapan.com\/es\/terms-and-conditions\/\" target=\"_blank\">T\u00e9rminos y Condiciones<\/a>\r\n                    <span style=\"color:black;\"> y doy mi consentimiento para el uso de mis datos personales para el proceso de reserva.<\/span>\r\n                <\/label>\r\n                <span id=\"terms-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n\r\n            <h2 style=\"margin-top: 8px; font-size: 28px; color: #333;\">Total: <span id=\"total\" style=\"color:#ff8c00;\">$0<\/span><\/h2>\r\n            <div id=\"discountApplied\" style=\"margin-bottom:8px; font-weight:bold; color:#2d6a4f; display:none;\"><\/div>\r\n            <div id=\"totalAfterDiscount\" style=\"margin-bottom:8px; font-weight:normal; text-decoration:line-through; color:#aaa; display:none;\"><\/div>\r\n\r\n            <div id=\"tilopayDepositNote\" style=\"background: #e6f7ff; border: 1px solid #91d5ff; padding: 10px; border-radius: 5px; margin-top: 10px;\">\r\n                <strong style=\"color: #0056b3;\">NOTA IMPORTANTE:<\/strong> Al reservar, se cobrar\u00e1 un dep\u00f3sito por\r\n                <span id=\"depositAmountDisplay\" style=\"font-weight:bold;\"><\/span> (\u20a17000 local \/ $15 extranjero). El monto restante debe pagarse al llegar.\r\n            <\/div>\r\n\r\n            <div id=\"guiaOpcionalDiv\" style=\"display:none; margin:15px 0;\">\r\n                <label><input type=\"checkbox\" id=\"extraGuia\" onchange=\"calcularTotal()\"> Gu\u00eda opcional (\u20a16000)<\/label>\r\n            <\/div>\r\n\r\n            <div style=\"background:#f9f9f9; padding:15px; border-radius:10px; box-shadow:0 2px 6px rgba(0,0,0,0.1); margin-top:20px;\">\r\n                <b>Recomendaciones:<\/b> Elige el tour que se adapte a tu capacidad f\u00edsica para disfrutar plenamente de la aventura.  \nLleva ropa adecuada, ropa extra, bocadillos, agua para mantenerte hidratado y cualquier medicamento personal si tienes una condici\u00f3n m\u00e9dica.  \nNo dudes en hacer cualquier pregunta.\r\n            <\/div>\r\n\r\n            <div style=\"text-align:center; margin-top:25px;\">\r\n                <button id=\"btnProceed\" onclick=\"onProceedToPayment()\" style=\"background:#ff8c00; color:white; font-size:18px; padding:15px 40px; border:none; border-radius:30px; cursor:pointer; margin-bottom:10px; box-shadow: 0 4px 10px rgba(255, 140, 0, 0.4);\">\r\n                    Proceder a la reserva \/ Proceder al pago\r\n                <\/button>\r\n            <\/div>\r\n\r\n            <div id=\"paymentSection\" style=\"display:none; margin-top:25px; border-top:1px solid #eee; padding-top:16px;\">\r\n                <h3 class=\"section-title\" style=\"font-size:20px;\">Seleccione su m\u00e9todo de pago \/ Select payment method<\/h3>\r\n                \r\n                <div style=\"display:flex; flex-direction:column; gap:12px;\">\r\n\r\n                    <label style=\"display:flex; align-items:center; gap:10px; padding:10px; border:1px solid #ddd; border-radius:10px; cursor:pointer; transition:transform 0.2s; background:#fafafa;\">\r\n                        <input type=\"radio\" name=\"paymentMethod\" value=\"tarjeta\" onchange=\"onPaymentMethodChange()\" style=\"transform:scale(1.3); margin-right:6px;\">\r\n                        <img decoding=\"async\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/10\/WhatsApp-Image-2025-10-22-at-3.59.08-PM.jpeg\"\r\n                            alt=\"Tilopay\" width=\"50\" height=\"50\" style=\"border-radius:8px; transition:transform 0.3s;\">\r\n                        <span style=\"font-size:16px;\">Tarjeta de Cr\u00e9dito\/D\u00e9bito (Tilopay) - Solo Dep\u00f3sito<\/span>\r\n                    <\/label>\r\n\r\n                    <label style=\"display:flex; align-items:center; gap:10px; padding:10px; border:1px solid #ddd; border-radius:10px; cursor:pointer; transition:transform 0.2s; background:#fafafa;\">\r\n                        <input type=\"radio\" name=\"paymentMethod\" value=\"simpe\" onchange=\"onPaymentMethodChange()\" style=\"transform:scale(1.3); margin-right:6px;\">\r\n                        <img decoding=\"async\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/10\/WhatsApp-Image-2025-10-22-at-3.57.36-PM.jpeg\"\r\n                            alt=\"Simpe M\u00f3vil\" width=\"50\" height=\"50\" style=\"border-radius:8px; transition:transform 0.3s;\">\r\n                        <span style=\"font-size:16px;\">Simpe M\u00f3vil - Solo Dep\u00f3sito (o pago completo)<\/span>\r\n                    <\/label>\r\n\r\n                    <label style=\"display:flex; align-items:center; gap:10px; padding:10px; border:1px solid #ddd; border-radius:10px; cursor:pointer; transition:transform 0.2s; background:#fafafa;\">\r\n                        <input type=\"radio\" name=\"paymentMethod\" value=\"binance\" onchange=\"onPaymentMethodChange()\" style=\"transform:scale(1.3); margin-right:6px;\">\r\n                        <img decoding=\"async\" src=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/10\/WhatsApp-Image-2025-10-22-at-3.56.45-PM.jpeg\"\r\n                            alt=\"Binance\" width=\"50\" height=\"50\" style=\"border-radius:8px; transition:transform 0.3s;\">\r\n                        <span style=\"font-size:16px;\">Pago Binance (USDT) - Solo Dep\u00f3sito (o pago completo)<\/span>\r\n                    <\/label>\r\n                <\/div>\r\n\r\n<style>\r\n#paymentSection label:hover {\r\ntransform: scale(1.03);\r\nbackground: #fffbe6;\r\nbox-shadow: 0 2px 6px rgba(0,0,0,0.1);\r\n}\r\n#paymentSection img:hover {\r\ntransform: scale(1.1) rotate(3deg);\r\n}\r\n<\/style>\r\n\r\n<div id=\"paymentDetails\" style=\"margin-top:12px;\"><\/div>\r\n\r\n<div id=\"tilopayButtonContainer\" style=\"text-align:center; margin-top:20px; display:none;\">\r\n<button type=\"button\" onclick=\"handleCardPayment()\"\r\n                        style=\"                            background-color: #007bff;                            color: white;                            padding: 15px 30px;                            border: none;                            border-radius: 5px;                            font-size: 18px;                            cursor: pointer;                            box-shadow: 0 4px 6px rgba(0,0,0,0.1);                            transition: background-color 0.3s;                        \"\r\n                        onmouseover=\"this.style.backgroundColor='#0056b3'\"\r\n                        onmouseout=\"this.style.backgroundColor='#007bff'\"\r\n                    >\r\n                        \ud83d\udcb3 Pagar dep\u00f3sito ahora con tarjeta.\r\n                    <\/button>\r\n                    <p style=\"margin-top:10px; font-size:0.9em; color:#555;\">Ser\u00e1s redirigido a la pasarela de pago Tilopay en esta pesta\u00f1a.<\/p>\r\n                <\/div>\r\n            <\/div>\r\n\r\n        <input type=\"hidden\" name=\"trp-form-language\" value=\"es\"\/><\/form>\r\n\r\n    <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* Estilos Globales *\/\r\n.input, textarea, select { width:100%; padding:10px; margin:3px 0; border:1px solid #ddd; border-radius:8px; display:block; box-sizing: border-box; }\r\n\r\n\/* 1. ESTILO PARA DESHABILITAR D\u00cdAS ANTERIORES EN EL CALENDARIO *\/\r\ninput[type=\"date\"] { font-family: inherit; color: #333; }\r\n\/* MEJORA 1: Estilo para d\u00edas inv\u00e1lidos en Safari\/iOS *\/\r\ninput[type=\"date\"]:not([value=\"\"]):invalid { box-shadow: 0 0 5px rgba(231,76,60,0.6); }\r\n\r\n.input-num { width: 40px; text-align: center; border: none; padding: 0; -moz-appearance: textfield; }\r\n.input-num::-webkit-inner-spin-button, .input-num::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }\r\n\r\n.form-label { display:block; margin-bottom:6px; font-weight: 500; color: #333; }\r\n.note { font-size:0.9em; color:#555; margin:3px 0 5px 0; }\r\n.section-title { margin-top:20px; margin-bottom:10px; font-size:24px; color:#555; border-bottom: 2px solid #ddd; padding-bottom: 5px; }\r\n.section-note { margin-top:8px; margin-bottom:15px; font-weight:normal; color:#444; font-size:16px; }\r\n\r\n\/* Traveler Quantity Controls - REESTRUCTURADO PARA ESTILO ORIGINAL HORIZONTAL *\/\r\n.traveler-row { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; padding: 10px 0; border-bottom: 1px solid #eee; }\r\n.traveler-row:last-child { border-bottom: none; margin-bottom: 0; }\r\n.traveler-info { display: flex; align-items: center; } \/* Contenedor para label y descuento *\/\r\n.traveler-label { font-size: 16px; color: #333; display: flex; align-items: center; gap: 10px; margin-right: 15px; }\r\n.quantity-control { display: flex; align-items: center; border: 1px solid #ccc; border-radius: 5px; overflow: hidden; }\r\n.qty-btn { background: #f7f7f7; border: none; color: #555; padding: 8px 10px; cursor: pointer; font-weight: bold; font-size: 16px; transition: background 0.2s; line-height: 1; height: 36px; box-sizing: border-box; }\r\n.qty-btn:hover { background: #eee; color: #000; }\r\n.qty-btn:active { background: #ddd; }\r\n.input-num { padding: 8px 0; height: 36px; box-sizing: border-box; font-size: 16px; }\r\n\r\n\/* Discount Tags (Mantiene el estilo verde) *\/\r\n.discount-tag { background: #e9f5e9; color: #2E7D32; padding: 3px 8px; border-radius: 10px; font-size: 14px; font-weight: bold; margin-left: 0; white-space: nowrap; }\r\n\r\n\r\n\/* Extras with Quantity - REESTRUCTURADO PARA ESTILO TRAVELERS (MEJORA SOLICITADA) *\/\r\n\/* Contenedor principal para cada extra: similar a .traveler-row *\/\r\n.extra-item {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: flex-start; \/* Alineaci\u00f3n arriba para que las notas no muevan el control *\/\r\n    padding: 10px 0;\r\n    border-bottom: 1px solid #eee;\r\n}\r\n.extra-item.final-extra-row { border-bottom: none; }\r\n.extra-label-info {\r\n    display: flex;\r\n    flex-direction: column;\r\n    flex-grow: 1;\r\n    margin-right: 15px;\r\n}\r\n.extra-label { \r\n    font-size: 16px; \r\n    color: #333; \r\n    display: flex; \r\n    align-items: center; \r\n    margin-bottom: 0; \r\n}\r\n.extra-label input[type=\"checkbox\"] { \r\n    width: auto; \r\n    margin-right: 10px; \r\n}\r\n.extra-item .note { \r\n    margin-left: 25px; \/* Alineaci\u00f3n con el texto del label *\/\r\n    margin-top: 2px;\r\n    margin-bottom: 0; \r\n    font-size: 0.85em;\r\n}\r\n\r\n\r\n.price-span { font-weight: bold; color: #000; }\r\n.extra-qty-control { margin-left: 0; }\r\n.extra-num { width: 40px !important; }\r\n\r\n\/* Error visual *\/\r\n.invalid-field { border-color:#e74c3c !important; box-shadow: 0 0 4px rgba(231,76,60,0.4); }\r\n.field-error { color:#e74c3c; font-size:0.9em; display:block; margin-top:4px; }\r\n.field-asterisk { color:#e74c3c; font-weight:bold; margin-left:6px; font-size:1.2em; vertical-align:middle; }\r\n\r\n\/* Small helper for payment details box *\/\r\n#paymentDetails { background:#fafafa; padding:12px; border-radius:8px; border:1px dashed #ddd; margin-top:10px; }\r\n.payment-note { background:#fff3cd; padding:10px; border-radius:6px; margin-bottom:8px; border:1px solid #ffeeba; }\r\n.action-btn { display:inline-block; margin:6px 6px 0 0; padding:10px 14px; border-radius:8px; text-decoration:none; cursor:pointer; }\r\n.btn-green { background:#25d366; color:#fff; }\r\n.btn-blue { background:#0072c6; color:#fff; }\r\n.btn-gray { background:#6c757d; color:#fff; }\r\n<\/style>\r\n\r\n<script>\r\n\/* ---------- Helpers and state (Mantener sin cambios) ---------- *\/\r\nlet currentButton = null;\r\nconst CR_OFFSET_MINUTES = -6 * 60; \/\/ Costa Rica UTC-6 => -360 minutes\r\nconst ADMIN_WHATSAPP = '50660110640';\r\nconst ADMIN_EMAIL = 'contacto@cuilpilapan.com'; \/\/ Correo para recibir notificaciones\r\n\r\n\/\/ CONFIGURACI\u00d3N DE TILOPAY\r\nconst TILO_LINK_COLONES = 'https:\/\/tp.cr\/l\/MTYyMTQ3';\r\nconst DEPOSIT_COLONES = 7000;\r\nconst TILO_LINK_USD = 'https:\/\/tp.cr\/l\/MTYyMTQ4';\r\nconst DEPOSIT_USD = 15.00;\r\n\r\nconst RETURN_URL = 'https:\/\/cuilpilapan.com\/payment-success\/';\r\nconst SAVE_URL = '\/save_pending_reservation.php'; \/\/ URL para guardar la reserva antes de redirigir\r\nconst SEND_BOOKING_URL = '\/send_booking.php'; \/\/ URL para Simpe\/Binance\r\n\r\n\/\/ Simpe \/ Binance details\r\nconst SIMPE_PHONE = '60110640';\r\nconst SIMPE_NAME = 'Cuipilapan Sociedad Civil';\r\nconst BINANCE_ID = '450335940';\r\n\r\n\/\/ localStorage key to persist reservation data *after* redirection to Tilopay\r\nconst STORAGE_KEY = 'reservaCuilpilapan_v1';\r\nlet _lastComputed = {}; \/\/ Almacena el \u00faltimo c\u00e1lculo para el env\u00edo PHP\r\n\r\n\/**\r\n * Genera una referencia de pedido \u00fanica.\r\n * Formato: CUP-AAAAMMDD-RANDOM\r\n *\/\r\nfunction generateOrderReference() {\r\n    const date = new Date();\r\n    const dateStr = date.getFullYear().toString() +\r\n                    (date.getMonth() + 1).toString().padStart(2, '0') +\r\n                    date.getDate().toString().padStart(2, '0');\r\n    const randomStr = Math.random().toString(36).substring(2, 7).toUpperCase();\r\n    \/\/ Usamos \"CUP\" + la fecha + un random para la referencia que enviamos a Tilopay\r\n    return `CUP-${dateStr}-${randomStr}`;\r\n}\r\n\r\nfunction formatCurrency(amount, tipo) {\r\n    if (tipo === 'nacional') {\r\n        return '\u20a1' + Math.round(amount);\r\n    } else {\r\n        return '$' + Number(amount).toFixed(2);\r\n    }\r\n}\r\n\r\n\/* ---------- small UI helpers for errors (Mantener sin cambios) ---------- *\/\r\nfunction showFieldError(inputEl, message) {\r\n    if (!inputEl) return;\r\n    inputEl.classList.add('invalid-field');\r\n\r\n    \/\/ error span\r\n    const errId = inputEl.id + '-error';\r\n    let err = document.getElementById(errId);\r\n    if (!err) {\r\n        err = document.createElement('span');\r\n        err.id = errId;\r\n        err.className = 'field-error';\r\n        inputEl.parentNode.insertBefore(err, inputEl.nextSibling);\r\n    }\r\n    err.innerText = message;\r\n    err.style.display = 'block';\r\n\r\n    \/\/ asterisk\r\n    const starId = inputEl.id + '-asterisk';\r\n    let star = document.getElementById(starId);\r\n    if (!star) {\r\n        star = document.createElement('span');\r\n        star.id = starId;\r\n        star.className = 'field-asterisk';\r\n        star.innerText = '*';\r\n        \/\/ try to insert near the label if exists\r\n        const label = document.querySelector('label[for=\"' + inputEl.id + '\"]');\r\n        if (label && label.parentNode) {\r\n            label.parentNode.insertBefore(star, label.nextSibling);\r\n        } else {\r\n            \/\/ fallback: insert before input\r\n            inputEl.parentNode.insertBefore(star, inputEl);\r\n        }\r\n    }\r\n    star.style.display = 'inline';\r\n}\r\n\r\nfunction clearFieldError(inputEl) {\r\n    if (!inputEl) return;\r\n    inputEl.classList.remove('invalid-field');\r\n    const err = document.getElementById(inputEl.id + '-error');\r\n    if (err) { err.style.display = 'none'; err.innerText = ''; }\r\n    const star = document.getElementById(inputEl.id + '-asterisk');\r\n    if (star) star.style.display = 'none';\r\n}\r\n\r\n\/* ---------- Open \/ Close (Mantener sin cambios) ---------- *\/\r\nfunction openBookingForm(button) {\r\n    currentButton = button;\r\n    document.getElementById('bookingModal').style.display = 'block';\r\n    document.getElementById('tourTitle').innerText = button.getAttribute('data-tour') || 'Tour';\r\n    document.getElementById('tourDesc').innerText = button.getAttribute('data-desc') || '';\r\n\r\n    \/\/ 1. Aplicar restricci\u00f3n de calendario al abrir el modal\r\n    applyDateRestriction();\r\n\r\n    \/\/ reset UI errors and values if desired\r\n    clearAllFieldErrors();\r\n\r\n    \/\/ hide payment section\r\n    document.getElementById('paymentSection').style.display = 'none';\r\n    document.getElementById('paymentDetails').innerHTML = '';\r\n    document.getElementById('tilopayButtonContainer').style.display = 'none';\r\n\r\n    \/\/ Reset radio buttons\r\n    const radios = document.getElementsByName('paymentMethod');\r\n    for (let r of radios) r.checked = false;\r\n\r\n    document.getElementById('btnProceed').style.display = 'inline-block';\r\n\r\n    \/\/ Vuelva a calcular cuando se abre para obtener los precios correctos\r\n    calcularTotal();\r\n}\r\n\r\nfunction closeBookingForm() {\r\n    document.getElementById('bookingModal').style.display = 'none';\r\n}\r\n\r\n\/* 1. L\u00d3GICA DE CALENDARIO: Restringir fechas anteriores al d\u00eda actual (Costa Rica) *\/\r\nfunction applyDateRestriction() {\r\n    const fechaEl = document.getElementById('fecha');\r\n    if (!fechaEl) return;\r\n\r\n    \/\/ Calcular la fecha de hoy en Costa Rica (UTC-6)\r\n    const now = new Date();\r\n    const localOffsetMin = now.getTimezoneOffset(); \/\/ Offset local en minutos\r\n    const utcNowMs = now.getTime() + (localOffsetMin * 60000);\r\n    const crNowMs = utcNowMs + (CR_OFFSET_MINUTES * 60000);\r\n    const crToday = new Date(crNowMs);\r\n        \r\n    \/\/ Formatear a YYYY-MM-DD\r\n    const year = crToday.getFullYear();\r\n    const month = (crToday.getMonth() + 1).toString().padStart(2, '0');\r\n    const day = crToday.getDate().toString().padStart(2, '0');\r\n    const minDate = `${year}-${month}-${day}`;\r\n\r\n    \/\/ Establecer la fecha m\u00ednima para navegadores compatibles (Android, Desktop)\r\n    fechaEl.min = minDate;\r\n    \r\n    \/\/ MEJORA 1: A\u00f1adir un listener para validar en iOS\/navegadores que no respetan 'min'\r\n    fechaEl.addEventListener('change', function() {\r\n        const selectedDate = new Date(this.value);\r\n        \/\/ Crear una fecha de referencia de hoy a medianoche UTC\r\n        const todayRef = new Date(Date.UTC(crToday.getFullYear(), crToday.getMonth(), crToday.getDate()));\r\n\r\n        if (selectedDate < todayRef) {\r\n            \/\/ El d\u00eda seleccionado es anterior a hoy (Costa Rica)\r\n            this.setCustomValidity('The selected date cannot be in the past \/ La fecha seleccionada no puede ser anterior a hoy.');\r\n            this.classList.add('invalid-field');\r\n            showFieldError(this, 'The selected date cannot be in the past \/ La fecha seleccionada no puede ser anterior a hoy.');\r\n        } else {\r\n            this.setCustomValidity(''); \/\/ Limpiar el mensaje de error del navegador\r\n            clearFieldError(this);\r\n        }\r\n    });\r\n}\r\n\r\n\/* ---------- When visitor type changes (Mantener sin cambios) ---------- *\/\r\nfunction onVisitorTypeChange(){\r\n    const tipo = document.getElementById('tipoVisitante').value;\r\n    document.getElementById('guideLanguageDiv').style.display = (tipo === 'extranjero') ? 'block' : 'none';\r\n    calcularTotal();\r\n}\r\n\r\n\/* ---------- Core calculation (uses currentButton data-* prices) (C\u00d3DIGO COMPLETO) ---------- *\/\r\nfunction calcularTotal() {\r\n    if (!currentButton) return;\r\n\r\n    \/\/ get visitor type (if empty, temporarily treat as 'nacional' for price display)\r\n    let tipo = document.getElementById('tipoVisitante').value;\r\n    if (!tipo) tipo = 'nacional';\r\n\r\n    \/\/ travelers\r\n    let adultos = parseInt(document.getElementById('adultos').value) || 0;\r\n    let ninos = parseInt(document.getElementById('ninos').value) || 0;\r\n    let bebes = parseInt(document.getElementById('bebes').value) || 0;\r\n    let totalViajeros = adultos + ninos + bebes;\r\n    document.getElementById('totalTravelers').innerText = totalViajeros;\r\n\r\n    \/\/ base prices from data-* attributes on the button\r\n    let precioAdultoNac = parseFloat(currentButton.getAttribute('data-precio-adulto-nacional')) || 0;\r\n    let precioAdultoExt = parseFloat(currentButton.getAttribute('data-precio-adulto-extranjero')) || 0;\r\n    let precioAdulto = (tipo === 'nacional') ? precioAdultoNac : precioAdultoExt;\r\n    let precioNino = precioAdulto \/ 2;\r\n\r\n    \/\/ extras unit prices (local vs foreign)\r\n    let precioExtraPerezoso = (tipo === 'nacional') ? 3500 : 10;\r\n    let precioAgua = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioToallas = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioSnacks = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioPonchos = (tipo === 'nacional') ? 1000 : 2;\r\n    let precioBinoculares = (tipo === 'nacional') ? 2000 : 5;\r\n\r\n    \/\/ quantities & selections\r\n    let extraPerezoso = document.getElementById('extraPerezoso').checked;\r\n    let botellasAgua = parseInt(document.getElementById('botellasAgua').value) || 0;\r\n    let numToallas = parseInt(document.getElementById('numToallas').value) || 0;\r\n    let numSnacks = parseInt(document.getElementById('numSnacks').value) || 0;\r\n    let numPonchos = parseInt(document.getElementById('numPonchos').value) || 0;\r\n    let numBinoculares = parseInt(document.getElementById('numBinoculares').value) || 0;\r\n    let guiaOpcional = document.getElementById('extraGuia')?.checked || false;\r\n\r\n    \/\/ start total with ticket prices (babies free)\r\n    let total = (adultos * precioAdulto) + (ninos * precioNino);\r\n\r\n    \/\/ extras\r\n    if (extraPerezoso) {\r\n        total += (adultos + ninos) * precioExtraPerezoso;\r\n    }\r\n    total += botellasAgua * precioAgua;\r\n    total += numToallas * precioToallas;\r\n    total += numSnacks * precioSnacks;\r\n    total += numPonchos * precioPonchos;\r\n\r\n    \/\/ Logic: Binoculars only available if Sloth Tour is NOT selected\r\n    if (numBinoculares > 0 && !extraPerezoso) {\r\n        total += numBinoculares * precioBinoculares;\r\n    } else if (extraPerezoso) {\r\n        \/\/ Force binocular quantity to 0 if sloth tour is checked\r\n        document.getElementById('numBinoculares').value = 0;\r\n    }\r\n    \r\n    if (guiaOpcional) total += (tipo === 'nacional' ? 6000 : 0); \/\/ Gu\u00eda Opcional: \u20a16000 (asumo solo para nacionales)\r\n\r\n    \/\/ 6. L\u00d3GICA DE DESCUENTOS MEJORADA\r\n    \r\n    \/\/ A. Descuento por cantidad de viajeros\r\n    let groupDiscount = 0;\r\n    if (totalViajeros >= 25) {\r\n        groupDiscount = 30; \/\/ 30% for 25+\r\n    } else if (totalViajeros > 14) {\r\n        groupDiscount = 20; \/\/ 20% for 15+\r\n    } else if (totalViajeros >= 10) {\r\n        groupDiscount = 15; \/\/ 15% for 10+\r\n    } else if (totalViajeros >= 6) {\r\n        groupDiscount = 10; \/\/ 10% for 6+\r\n    }\r\n\r\n    \/\/ B. Descuento por anticipaci\u00f3n de reserva\r\n    const fechaVal = document.getElementById('fecha').value;\r\n    let earlyDays = 0;\r\n    let earlyDiscount = 0;\r\n    if (fechaVal) {\r\n        const parts = fechaVal.split('-');\r\n        if (parts.length === 3) {\r\n            const y = parseInt(parts[0],10), m = parseInt(parts[1],10), d = parseInt(parts[2],10);\r\n            \/\/ compute CR now midnight reference\r\n            const now = new Date();\r\n            const localOffsetMin = now.getTimezoneOffset();\r\n            const utcNowMs = Date.now() + (localOffsetMin * 60000);\r\n            const crNowMs = utcNowMs + (CR_OFFSET_MINUTES * 60000);\r\n            const crNow = new Date(crNowMs);\r\n            \/\/ difference in days between (selected date) and current CR date\r\n            const selDate = new Date(Date.UTC(y, m-1, d));\r\n            const crToday = new Date(Date.UTC(crNow.getFullYear(), crNow.getMonth(), crNow.getDate()));\r\n            const diffMs = selDate - crToday;\r\n            earlyDays = Math.floor(diffMs \/ (1000*60*60*24));\r\n            \r\n            if (earlyDays >= 14) {\r\n                earlyDiscount = 20; \/\/ 20% for 2 weeks or more\r\n            } else if (earlyDays >= 7) {\r\n                earlyDiscount = 10; \/\/ 10% for 1 week or more\r\n            }\r\n        }\r\n    }\r\n    \r\n    \/\/ C. Descuento total (El m\u00e1ximo de A o B) + Adicional\r\n    let baseDiscount = Math.max(groupDiscount, earlyDiscount);\r\n    let additionalDiscount = 0;\r\n\r\n    \/\/ Descuento adicional por combinar grupo y anticipaci\u00f3n\r\n    if (groupDiscount > 0) {\r\n        if (earlyDays >= 14) {\r\n            additionalDiscount = 4; \/\/ 4% adicional por 2 semanas y grupo\r\n        } else if (earlyDays >= 7) {\r\n            additionalDiscount = 2; \/\/ 2% adicional por 1 semana y grupo\r\n        }\r\n    }\r\n    \r\n    let totalDiscountPercent = baseDiscount + additionalDiscount;\r\n\r\n    \/\/ Guardamos el total bruto (RAW TOTAL)\r\n    let rawTotal = total;\r\n\r\n    \/\/ aplicamos descuento\r\n    let discountedTotal = total;\r\n    let discountText = '';\r\n    if (totalDiscountPercent > 0) {\r\n        discountedTotal = total * (1 - totalDiscountPercent \/ 100);\r\n        discountText = `\ud83d\udcb0 Discount Applied: ${totalDiscountPercent}% (Group: ${groupDiscount}%, Early: ${earlyDiscount}%, Additional: ${additionalDiscount}%)`;\r\n    }\r\n\r\n    \/\/ Redondear a n\u00fameros enteros para colones (ya que Tilopay lo requiere entero)\r\n    if (tipo === 'nacional') {\r\n        rawTotal = Math.ceil(rawTotal);\r\n        discountedTotal = Math.ceil(discountedTotal);\r\n    }\r\n\r\n    \/\/ ----------------------------------------------------\r\n    \/\/ VISUALIZACI\u00d3N EN EL FORMULARIO (HTML)\r\n    \/\/ ----------------------------------------------------\r\n\r\n    document.getElementById('total').innerText = formatCurrency(discountedTotal, tipo);\r\n\r\n    if (totalDiscountPercent > 0) {\r\n        document.getElementById('discountApplied').style.display = 'block';\r\n        document.getElementById('discountApplied').innerText = discountText;\r\n\r\n        document.getElementById('totalAfterDiscount').style.display = 'block';\r\n        document.getElementById('totalAfterDiscount').innerText = `Total before discount: ${formatCurrency(rawTotal, tipo)}`;\r\n    } else {\r\n        document.getElementById('discountApplied').style.display = 'none';\r\n        document.getElementById('totalAfterDiscount').style.display = 'none';\r\n    }\r\n\r\n    document.getElementById('discountNote').style.display = (totalViajeros >= 6 || earlyDays >= 7) ? 'block' : 'none';\r\n\r\n    \/\/ show\/hide guiaOpcionalDiv\r\n    if (tipo === 'nacional' && totalViajeros < 4) {\r\n        document.getElementById('guiaOpcionalDiv').style.display = 'block';\r\n    } else {\r\n        document.getElementById('guiaOpcionalDiv').style.display = 'none';\r\n        document.getElementById('extraGuia').checked = false; \/\/ Desactivar si se oculta\r\n    }\r\n\r\n    \/\/ update unit-price labels\r\n    document.getElementById('precioPerezoso').innerText = formatCurrency(precioExtraPerezoso, tipo);\r\n    document.getElementById('precioAgua').innerText = formatCurrency(precioAgua, tipo);\r\n    document.getElementById('precioToallas').innerText = formatCurrency(precioToallas, tipo);\r\n    document.getElementById('precioSnacks').innerText = formatCurrency(precioSnacks, tipo);\r\n    document.getElementById('precioPonchos').innerText = formatCurrency(precioPonchos, tipo);\r\n    document.getElementById('precioBinoculares').innerText = formatCurrency(precioBinoculares, tipo);\r\n\r\n    \/\/ 2. Actualizar la nota de dep\u00f3sito\r\n    const depositDisplayEl = document.getElementById('depositAmountDisplay');\r\n    const depositAmountText = tipo === 'nacional' ? formatCurrency(DEPOSIT_COLONES, 'nacional') : formatCurrency(DEPOSIT_USD, 'extranjero');\r\n    if (depositDisplayEl) {\r\n        depositDisplayEl.innerText = depositAmountText;\r\n    }\r\n    \/\/ Actualizar la nota importante para reflejar el tipo y el monto\r\n    const tilopayNoteEl = document.getElementById('tilopayDepositNote');\r\n    if (tilopayNoteEl) {\r\n        tilopayNoteEl.innerHTML = `<strong style=\"color: #0056b3;\">IMPORTANT NOTE:<\/strong> When booking, a deposit will be charged for \r\n            <span id=\"depositAmountDisplay\" style=\"font-weight:bold;\">${depositAmountText}<\/span>. The remaining amount must be canceled upon arrival.`;\r\n    }\r\n\r\n\r\n    \/\/ store computed numeric totals for PHP and Tilopay\r\n    _lastComputed = {\r\n        rawTotal: rawTotal,\r\n        discountPercent: totalDiscountPercent,\r\n        discountedTotal: discountedTotal,\r\n        currencyType: tipo\r\n    };\r\n}\r\n\r\n\/* ---------- Validation and UI helpers (C\u00d3DIGO MODIFICADO) ---------- *\/\r\nfunction clearAllFieldErrors() {\r\n    const ids = ['fecha','hora','tipoVisitante','guideLanguage','nombre','email','acompanantes','acceptTerms'];\r\n    ids.forEach(id => {\r\n        const el = document.getElementById(id);\r\n        if (el) clearFieldError(el);\r\n    });\r\n    const termsErr = document.getElementById('terms-error');\r\n    if(termsErr) termsErr.style.display = 'none';\r\n}\r\n\r\nfunction validateAll() {\r\n    clearAllFieldErrors();\r\n    let valid = true;\r\n\r\n    \/\/ travelers\r\n    const adultos = parseInt(document.getElementById('adultos').value) || 0;\r\n    const ninos = parseInt(document.getElementById('ninos').value) || 0;\r\n    const bebes = parseInt(document.getElementById('bebes').value) || 0;\r\n    const totalViajeros = adultos + ninos + bebes;\r\n\r\n    \/\/ VALIDACION 1: M\u00ednimo de 1 viajero (MODIFICADO DE 2 A 1)\r\n    if (totalViajeros < 1) {\r\n        const adultosEl = document.getElementById('adultos');\r\n        showFieldError(adultosEl, 'Minimum 1 traveler required \/ Se requiere m\u00ednimo 1 viajero');\r\n        valid = false;\r\n    }\r\n\r\n    \/\/ name\r\n    const nombreEl = document.getElementById('nombre');\r\n    const nombre = (nombreEl.value || '').trim();\r\n    if (!nombre) { showFieldError(nombreEl, 'Please enter full name \/ Por favor ingrese su nombre completo'); valid = false; }\r\n\r\n    \/\/ email\r\n    const emailEl = document.getElementById('email');\r\n    const email = (emailEl.value || '').trim();\r\n    const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\r\n    if (!email) { showFieldError(emailEl, 'Please enter email address \/ Por favor ingrese su correo'); valid = false; }\r\n    else if (!emailRegex.test(email)) { showFieldError(emailEl, 'Please enter a valid email address \/ Por favor ingrese un correo v\u00e1lido'); valid = false; }\r\n\r\n    \/\/ visitor type\r\n    const tipoEl = document.getElementById('tipoVisitante');\r\n    const tipo = tipoEl.value;\r\n    if (!tipo) { showFieldError(tipoEl, 'Please select visitor type \/ Seleccione tipo de visitante'); valid = false; }\r\n\r\n    \/\/ if extranjero -> guide language required\r\n    if (tipo === 'extranjero') {\r\n        const glEl = document.getElementById('guideLanguage');\r\n        const glVal = (glEl.value || '').trim();\r\n        if (!glVal) { showFieldError(glEl, 'Please select the guide language \/ Seleccione idioma del gu\u00eda'); valid = false; }\r\n    }\r\n\r\n    \/\/ date\r\n    const fechaEl = document.getElementById('fecha');\r\n    const fechaVal = fechaEl.value;\r\n    \/\/ La validaci\u00f3n de fecha antigua se ejecuta en applyDateRestriction\/change listener, aqu\u00ed solo revisamos si est\u00e1 vac\u00eda.\r\n    if (!fechaVal) { showFieldError(fechaEl, 'Please select a valid date \/ Por favor seleccione una fecha'); valid = false; }\r\n    \/\/ Volvemos a ejecutar la validaci\u00f3n de fecha para asegurarnos de que el customValidity est\u00e9 bien\r\n    if (fechaEl.customValidity && fechaEl.customValidity !== '') {\r\n        showFieldError(fechaEl, fechaEl.customValidity);\r\n        valid = false;\r\n    }\r\n\r\n\r\n    \/\/ time\r\n    const horaEl = document.getElementById('hora');\r\n    const horaVal = horaEl.value;\r\n    if (!horaVal) { showFieldError(horaEl, 'Please select a valid time \/ Por favor seleccione una hora'); valid = false; }\r\n\r\n    \/\/ VALIDACION 2: Nombres de acompa\u00f1antes OBLIGATORIO si son 2 o m\u00e1s viajeros\r\n    const acompEl = document.getElementById('acompanantes');\r\n    const acompVal = (acompEl.value || '').trim();\r\n    if (totalViajeros >= 2 && acompVal.length < 3) {\r\n        showFieldError(acompEl, 'Please list companion names when there are 2 or more people \/ Por favor liste los acompa\u00f1antes cuando hay 2 o m\u00e1s personas.');\r\n        valid = false;\r\n    }\r\n\r\n\r\n    \/\/ terms checkbox required\r\n    const accept = document.getElementById('acceptTerms');\r\n    if (!accept || !accept.checked) {\r\n        const termsErr = document.getElementById('terms-error');\r\n        termsErr.innerText = 'Debe aceptar los T\u00e9rminos y Condiciones y el uso de datos antes de continuar \/ You must accept Terms & Conditions and data usage.';\r\n        termsErr.style.display = 'block';\r\n        valid = false;\r\n    }\r\n\r\n    return valid;\r\n}\r\n\r\n\/* ---------- Gather form data for submission\/storage (Mantener sin cambios) ---------- *\/\r\nfunction gatherFormData() {\r\n    const tour = document.getElementById('tourTitle').innerText;\r\n    const nombre = document.getElementById('nombre').value.trim();\r\n    const fecha = document.getElementById('fecha').value;\r\n    const hora = document.getElementById('hora').value;\r\n    const tipo = document.getElementById('tipoVisitante').value;\r\n    const email = document.getElementById('email').value || 'N\/A';\r\n    const adultos = document.getElementById('adultos').value || '0';\r\n    const ninos = document.getElementById('ninos').value || '0';\r\n    const bebes = document.getElementById('bebes').value || '0';\r\n    const acompanantes = document.getElementById('acompanantes').value || '';\r\n    const guideLang = document.getElementById('guideLanguage').value || '';\r\n    const total = document.getElementById('total').innerText || '';\r\n    const discountText = document.getElementById('discountApplied').innerText || '';\r\n    const totalAfter = document.getElementById('totalAfterDiscount').innerText || '';\r\n    \/\/ No usamos 'comentarios' por ahora ya que no hay campo, pero se deja para el futuro.\r\n    const comentarios = '';\r\n\r\n    \/\/ extras array\r\n    let extrasArr = [];\r\n    if (document.getElementById('extraPerezoso')?.checked) extrasArr.push('Sloth & Tropical Birds Tour');\r\n    if ((parseInt(document.getElementById('botellasAgua')?.value) || 0) > 0) extrasArr.push('Bottled Water (' + document.getElementById('botellasAgua').value + ')');\r\n    if ((parseInt(document.getElementById('numToallas')?.value) || 0) > 0) extrasArr.push('Towels (' + document.getElementById('numToallas').value + ')');\r\n    if ((parseInt(document.getElementById('numSnacks')?.value) || 0) > 0) extrasArr.push('Snacks (' + document.getElementById('numSnacks').value + ')');\r\n    if ((parseInt(document.getElementById('numPonchos')?.value) || 0) > 0) extrasArr.push('Ponchos (' + document.getElementById('numPonchos').value + ')');\r\n    if ((parseInt(document.getElementById('numBinoculares')?.value) || 0) > 0 && !document.getElementById('extraPerezoso')?.checked) extrasArr.push('Binoculars (' + document.getElementById('numBinoculares').value + ')');\r\n    if (document.getElementById('extraGuia')?.checked) extrasArr.push('Optional Guide (\u20a16000)');\r\n    const extrasText = extrasArr.length ? extrasArr.join('\\n- ') : 'None';\r\n\r\n    \/\/ also include computed numeric totals if available\r\n    const computed = _lastComputed || {};\r\n    return {\r\n        tour, nombre, fecha, hora, tipo, email, adultos, ninos, bebes, acompanantes, guideLang, total, extrasText, discountText, totalAfter, comentarios,\r\n        rawTotal: computed.rawTotal || null,\r\n        discountedTotal: computed.discountedTotal || null,\r\n        currencyType: computed.currencyType || (document.getElementById('tipoVisitante').value || 'nacional')\r\n    };\r\n}\r\n\r\n\/* ---------- Proceed to payment (shows payment method options) (Mantener sin cambios) ---------- *\/\r\nfunction onProceedToPayment() {\r\n    \/\/ validate\r\n    if (!validateAll()) {\r\n        const firstInvalid = document.querySelector('.invalid-field');\r\n        if (firstInvalid) firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        return;\r\n    }\r\n    \/\/ show payment area\r\n    document.getElementById('paymentSection').style.display = 'block';\r\n    \/\/ hide proceed button to avoid duplicate\r\n    document.getElementById('btnProceed').style.display = 'none';\r\n\r\n    \/\/ Scroll payment section into view\r\n    document.getElementById('paymentSection').scrollIntoView({behavior: 'smooth', block: 'center'});\r\n\r\n    \/\/ Force run change handler to display details for selected (if any)\r\n    onPaymentMethodChange();\r\n}\r\n\r\n\/* ---------- Save reservation to server (for webhook) - \u00a1MODIFICADA! ---------- *\/\r\nfunction persistReservation(formData, paymentMethodLabel, orderReference, depositAmount, depositCurrency) {\r\n    const payload = Object.assign({}, formData, {\r\n        paymentMethod: paymentMethodLabel,\r\n        orderReference: orderReference,\r\n        depositAmount: depositAmount, \/\/ Se\u00f1a (monto a pagar en Tilopay)\r\n        depositCurrency: depositCurrency, \/\/ Moneda de la se\u00f1a\r\n        savedAt: new Date().toISOString()\r\n    });\r\n\r\n    \/\/ Guardar localmente solo para la p\u00e1gina de \u00e9xito, si la queremos usar de fallback.\r\n    try {\r\n        localStorage.setItem(STORAGE_KEY, JSON.stringify(payload));\r\n    } catch (e) {\r\n        console.error('Error saving reservation to localStorage (continuando con server)', e);\r\n    }\r\n\r\n    \/\/ 2. Guardar en el servidor (para que el webhook lo encuentre)\r\n    \/\/ Usamos async\/await para forzar que el guardado ocurra antes de la redirecci\u00f3n\r\n    return fetch(SAVE_URL, {\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application\/json' },\r\n        body: JSON.stringify(payload)\r\n    })\r\n    .then(response => response.json())\r\n    .then(data => {\r\n        if (!data.success) {\r\n            console.error('Error: La reserva NO se guard\u00f3 en el servidor:', data.message);\r\n            return false; \/\/ Bloquea la compra si no se guarda en el servidor\r\n        }\r\n        console.log(\"Reserva guardada en el servidor con \u00e9xito:\", orderReference);\r\n        return true;\r\n    })\r\n    .catch(error => {\r\n        console.error('Error de red al guardar en el servidor:', error);\r\n        return false;\r\n    });\r\n}\r\n\r\n\r\n\/* ---------- FUNCI\u00d3N DE PAGO CON TARJETA - \u00a1MODIFICADA! ---------- *\/\r\nasync function handleCardPayment() {\r\n    \/\/ 1. Re-validar los datos por seguridad\r\n    if (!validateAll()) {\r\n        alert('Please complete all form data correctly before proceeding to payment. \/ Por favor, complete todos los datos del formulario correctamente antes de pagar.');\r\n        const firstInvalid = document.querySelector('.invalid-field');\r\n        if (firstInvalid) firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        return;\r\n    }\r\n\r\n    const btn = document.querySelector('#tilopayButtonContainer button');\r\n    btn.disabled = true;\r\n    const originalText = btn.innerText;\r\n    btn.innerText = 'Saving reservation... \/ Guardando reserva...';\r\n\r\n    const reservationData = gatherFormData();\r\n\r\n    \/\/ 2. Generar Referencia \u00danica\r\n    reservationData.orderReference = generateOrderReference(); \/\/ Usaremos este valor como 'reference' en Tilopay\r\n\r\n    \/\/ 3. Obtener el monto de SE\u00d1A y configurar la moneda\r\n    const isUSD = reservationData.currencyType !== 'nacional';\r\n\r\n    let tilopayAmount;\r\n    let tilopayCurrency;\r\n    let tilopayLink;\r\n\r\n    if (isUSD) {\r\n        \/\/ Extranjeros: Se\u00f1a fija de $15.00 USD\r\n        tilopayAmount = DEPOSIT_USD.toFixed(2);\r\n        tilopayCurrency = 'USD';\r\n        tilopayLink = TILO_LINK_USD;\r\n    } else {\r\n        \/\/ Nacionales: Se\u00f1a fija de \u20a17000 CRC\r\n        tilopayAmount = DEPOSIT_COLONES;\r\n        tilopayCurrency = 'CRC';\r\n        tilopayLink = TILO_LINK_COLONES;\r\n    }\r\n\r\n    \/\/ 4. Guardar Datos de Reserva en el servidor ANTES de la redirecci\u00f3n\r\n    const savedToServer = await persistReservation(reservationData, 'Card (Tilopay - Deposit)', reservationData.orderReference, tilopayAmount, tilopayCurrency);\r\n\r\n    if (!savedToServer) {\r\n        alert(\"\u274c Error: Could not secure reservation on the server. Please try again. \/ No se pudo asegurar la reserva en el servidor. Intente nuevamente.\");\r\n        btn.disabled = false;\r\n        btn.innerText = originalText;\r\n        return;\r\n    }\r\n\r\n    \/\/ 5. Construir URL de Tilopay\r\n    const conceptText = encodeURIComponent(`Reservation: ${reservationData.tour}. Total: ${reservationData.total}. Deposit: ${tilopayCurrency} ${tilopayAmount}`);\r\n\r\n    const tilopayUrl = `${tilopayLink}?` +\r\n                        `amount=${tilopayAmount}` +\r\n                        `&currency=${tilopayCurrency}` +\r\n                        `&reference=${reservationData.orderReference}` + \/\/ \u00a1CRUCIAL! Tilopay nos devuelve este valor como 'reference' en el webhook.\r\n                        `&description=${conceptText}` +\r\n                        `&return_url=${RETURN_URL}`;\r\n\r\n    \/\/ 6. Redirigir a Tilopay (en la misma pesta\u00f1a)\r\n    btn.innerText = 'Redirecting to Tilopay... \/ Redirigiendo a Tilopay...';\r\n    window.location.href = tilopayUrl;\r\n}\r\n\r\n\/* ---------- Handle selection of payment method (C\u00d3DIGO MODIFICADO PARA SIMPE\/BINANCE) ---------- *\/\r\nfunction onPaymentMethodChange() {\r\n    const selected = document.querySelector('input[name=\"paymentMethod\"]:checked');\r\n    const detailsEl = document.getElementById('paymentDetails');\r\n    const tilopayBtnContainer = document.getElementById('tilopayButtonContainer');\r\n\r\n    detailsEl.innerHTML = '';\r\n    tilopayBtnContainer.style.display = 'none';\r\n\r\n    if (!selected) return;\r\n\r\n    const method = selected.value;\r\n    const data = gatherFormData();\r\n    const isUSD = data.currencyType !== 'nacional';\r\n    const depositAmountColones = formatCurrency(DEPOSIT_COLONES, 'nacional');\r\n    const depositAmountUSD = formatCurrency(DEPOSIT_USD, 'extranjero');\r\n\r\n    \/\/ Put a summary at top\r\n    const summaryHtml = `<div style=\"margin-bottom:8px;\"><strong>Summary:<\/strong><br>Tour: ${data.tour}<br>Date: ${data.fecha} ${data.hora}<br>Name: ${data.nombre}<br>Total Tour: ${data.total}<br>${data.discountText ? data.discountText + '<br>' + (data.totalAfter ? data.totalAfter : '') : ''}<\/div>`;\r\n    detailsEl.insertAdjacentHTML('beforeend', summaryHtml);\r\n\r\n    if (method === 'tarjeta') {\r\n        detailsEl.insertAdjacentHTML('beforeend', `\r\n            <div class=\"payment-note\">\r\n                <strong>Card Payment (Tilopay - Deposit)<\/strong><br>\r\n                Only the deposit of <strong>${isUSD ? depositAmountUSD : depositAmountColones}<\/strong> will be charged. The remainder is paid on site.<br>\r\n                <br>You will be redirected to the secure Tilopay payment gateway in this tab.\r\n            <\/div>\r\n        `);\r\n        \/\/ Mostrar el bot\u00f3n de pago con tarjeta\r\n        tilopayBtnContainer.style.display = 'block';\r\n        \r\n        \/\/ MEJORA 2: Forzar scroll hacia el bot\u00f3n de pago de Tilopay al seleccionarlo\r\n        setTimeout(() => {\r\n            tilopayBtnContainer.scrollIntoView({behavior: 'smooth', block: 'nearest'});\r\n        }, 100);\r\n\r\n    } else if (method === 'simpe' || method === 'binance') {\r\n        \/\/ --- L\u00d3GICA DE SUBIDA DE COMPROBANTE CON PHP ---\r\n        const isSimpe = method === 'simpe';\r\n        const paymentLabel = isSimpe ? 'Simpe M\u00f3vil' : 'Binance (USDT)';\r\n        const phoneOrID = isSimpe ? SIMPE_PHONE : BINANCE_ID;\r\n        const nameOrTitle = isSimpe ? SIMPE_NAME : 'Wallet ID';\r\n        const noteTitle = isSimpe ? 'Payment by Simpe M\u00f3vil' : 'Payment by Binance (USDT)';\r\n        \/\/ Obtenemos el monto a pagar, ya sea en CRC o USD\r\n        const totalToPay = data.total;\r\n        \r\n        \/\/ 3. Y 4. Textos de Simpe\/Binance (MODIFICADOS)\r\n        const depositAmount = isUSD ? depositAmountUSD : depositAmountColones;\r\n        \r\n        const instruction = `<div class=\"payment-note\">\r\n            <strong>${noteTitle}<\/strong><br>\r\n            Please make a deposit payment of <strong>${depositAmount}<\/strong> to <strong>${nameOrTitle}<\/strong>: <strong>${phoneOrID}<\/strong>.\r\n            <br><br>\r\n            The deposit amount will be **deducted from your total payment** on the day of the tour.\r\n            <br>\r\n            *Note: You have the option to pay the full amount (${totalToPay}) if you prefer to simplify management.*\r\n        <\/div>`;\r\n\r\n        \/\/ El campo de subida de archivo y el bot\u00f3n que llama a sendBookingByPHP\r\n        const uploadForm = `\r\n            <div style=\"border: 1px dashed #ff8c00; padding: 15px; border-radius: 8px; margin-top: 15px;\">\r\n                <p style=\"font-weight:bold; margin-bottom:10px;\">FINAL STEP: Upload your receipt to confirm your booking (English\/Spanish)<\/p>\r\n                <p style=\"margin-bottom:10px; font-size:0.9em;\">**We will confirm your payment to create your reservation.**<\/p>\r\n                <div class=\"form-group\" style=\"margin-bottom: 20px;\">\r\n                    <label for=\"comprobanteFile\"><b>Attach Payment Receipt (JPEG, PNG, PDF):<\/b><\/label>\r\n                    <input type=\"file\" id=\"comprobanteFile\" class=\"input\" accept=\"image\/jpeg,image\/png,application\/pdf\">\r\n                    <span id=\"comprobanteFile-error\" class=\"field-error\" style=\"display:none\"><\/span>\r\n            <\/div>\r\n                <button class=\"action-btn btn-blue\" type=\"button\" onclick=\"sendBookingByPHP('${paymentLabel}', 'deposit')\">\r\n                    Upload Receipt and Confirm Booking by Email\r\n                <\/button>\r\n            <\/div>\r\n            <p style=\"margin-top:10px;\">Optional: If you prefer to send via WhatsApp without attaching here, click: <a id=\"whatsappButton\" class=\"action-btn btn-green\" target=\"_blank\" href=\"#\">Send WhatsApp Message<\/a><\/p>\r\n            `;\r\n\r\n        detailsEl.insertAdjacentHTML('beforeend', instruction + uploadForm);\r\n        \r\n        \/\/ 5. L\u00f3gica del bot\u00f3n de WhatsApp (MEJORADA)\r\n        const whatsappButton = document.getElementById('whatsappButton');\r\n        if (whatsappButton) {\r\n            \/\/ La URL de WhatsApp se genera aqu\u00ed con toda la informaci\u00f3n\r\n            const whatsappMessage = `Hello, I made a booking with the following details:\\n\\n` +\r\n                `*Tour:* ${data.tour}\\n` +\r\n                `*Date:* ${data.fecha} at ${data.hora}\\n` +\r\n                `*Name:* ${data.nombre} (${data.email})\\n` +\r\n                `*Travelers:* ${parseInt(data.adultos)+parseInt(data.ninos)+parseInt(data.bebes)}\\n` +\r\n                `*Companion Names:* ${data.acompanantes || 'None'}\\n` +\r\n                `*Total Paid\/Deposit:* ${depositAmount} (for Simpe\/Binance)\\n` +\r\n                `*Total Tour Price:* ${data.total}\\n\\n` +\r\n                `I attach the payment receipt for the deposit\/full amount via ${paymentLabel}. Please confirm my reservation.`;\r\n            \r\n            whatsappButton.href = `https:\/\/wa.me\/${ADMIN_WHATSAPP}?text=${encodeURIComponent(whatsappMessage)}`;\r\n        }\r\n\r\n        detailsEl.scrollIntoView({behavior: 'smooth', block: 'center'});\r\n    }\r\n}\r\n\r\n\/* ---------- Funci\u00f3n de env\u00edo de datos y archivo (fetch con FormData) para Simpe\/Binance (C\u00d3DIGO MODIFICADO PARA MENSAJE DE \u00c9XITO) ---------- *\/\r\nfunction sendBookingByPHP(paymentMethod, paymentType) {\r\n    \/\/ 1. Validaciones\r\n    if (!validateAll()) {\r\n        const firstInvalid = document.querySelector('.invalid-field');\r\n        if (firstInvalid) firstInvalid.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        return;\r\n    }\r\n\r\n    const comprobanteFileEl = document.getElementById('comprobanteFile');\r\n    if (!comprobanteFileEl || !comprobanteFileEl.files.length) {\r\n        showFieldError(comprobanteFileEl, 'You must attach the payment receipt to send the booking. \/ Debe adjuntar el comprobante de pago para enviar la reserva.');\r\n        return;\r\n    }\r\n    clearFieldError(comprobanteFileEl);\r\n\r\n    \/\/ 2. Construir FormData (clave para enviar archivos)\r\n    const formData = new FormData();\r\n    const data = gatherFormData();\r\n    const isUSD = data.currencyType !== 'nacional';\r\n    const depositAmount = isUSD ? DEPOSIT_USD : DEPOSIT_COLONES;\r\n\r\n    \/\/ Adjuntar campos de texto\r\n    Object.keys(data).forEach(key => {\r\n        formData.append(key, data[key]);\r\n    });\r\n    \/\/ Adjuntar datos de c\u00e1lculo y m\u00e9todo de pago\r\n    formData.append('paymentMethod', paymentMethod);\r\n    formData.append('rawTotal', _lastComputed.rawTotal);\r\n    formData.append('discountedTotal', _lastComputed.discountedTotal);\r\n    formData.append('discountPercent', _lastComputed.discountPercent);\r\n    \/\/ Para Simpe\/Binance indicamos el pago de la se\u00f1a, aunque el usuario pueda haber pagado el total\r\n    formData.append('paymentAmount', depositAmount);\r\n    formData.append('paymentCurrency', _lastComputed.currencyType === 'nacional' ? 'CRC' : 'USD');\r\n    \/\/ Adjuntar el archivo (la clave 'comprobante' debe coincidir con el PHP)\r\n    formData.append('comprobante', comprobanteFileEl.files[0]);\r\n\r\n    \/\/ 3. Ejecutar el env\u00edo (AJAX \/ fetch)\r\n    const btn = document.querySelector(`[onclick=\"sendBookingByPHP('${paymentMethod}', 'deposit')\"]`);\r\n    const originalText = btn.innerText;\r\n    btn.disabled = true;\r\n    btn.innerText = 'Sending... \/ Enviando...';\r\n\r\n    fetch(SEND_BOOKING_URL, {\r\n        method: 'POST',\r\n        body: formData\r\n    })\r\n    .then(response => {\r\n        const contentType = response.headers.get(\"content-type\");\r\n        if (contentType && contentType.indexOf(\"application\/json\") !== -1) {\r\n            return response.json();\r\n        } else {\r\n            return response.text().then(text => {\r\n                console.error('Raw PHP Error:', text);\r\n                throw new Error(\"Response is not JSON. Server or PHP error: \" + text.substring(0, 100) + '...');\r\n            });\r\n        }\r\n    })\r\n    .then(data => {\r\n        if (data.success) {\r\n            \/\/ 7. Mensaje de \u00e9xito BILING\u00dcE MEJORADO\r\n            alert('\u2705 Booking and receipt successfully sent!\\n\\nWe have sent the details to your email and the administrator. \/ \u00a1Reserva y comprobante enviados exitosamente! Hemos enviado los detalles a su correo y al administrador.');\r\n            closeBookingForm();\r\n        } else {\r\n            console.error('Server error:', data.message);\r\n            alert('\u274c Error sending booking: ' + (data.message || ''));\r\n        }\r\n    })\r\n    .catch(error => {\r\n        console.error('Connection\/Upload error:', error.message);\r\n        alert('\u274c Connection Error. Email could not be sent. Check browser console.');\r\n    })\r\n    .finally(() => {\r\n        btn.disabled = false;\r\n        btn.innerText = originalText;\r\n    });\r\n}\r\n\r\n\/\/ ----------------------------------------------------\r\n\/\/ L\u00f3gica para los nuevos botones de Cantidad (+\/-) (Sin cambios)\r\n\/\/ ----------------------------------------------------\r\nfunction updateQuantity(targetId, delta) {\r\n    const inputEl = document.getElementById(targetId);\r\n    if (!inputEl) return;\r\n    \r\n    let currentValue = parseInt(inputEl.value) || 0;\r\n    let newValue = currentValue + delta;\r\n    \r\n    \/\/ Constraints (min=0 is already set in HTML, but good to re-check)\r\n    if (newValue < 0) {\r\n        newValue = 0;\r\n    }\r\n\r\n    inputEl.value = newValue;\r\n    \r\n    \/\/ Simulate input\/change event to trigger calculation\r\n    if (['adultos','ninos','bebes','fecha'].includes(targetId) || targetId.startsWith('num') || targetId.startsWith('botellas')) {\r\n        calcularTotal();\r\n    }\r\n}\r\n\r\n\/* ---------- Attach events to clear errors and recalc (Modificada para incluir los botones +\/-) ---------- *\/\r\ndocument.addEventListener('DOMContentLoaded', function(){\r\n    const ids = ['tipoVisitante','adultos','ninos','bebes','extraPerezoso','botellasAgua','numToallas','numSnacks','numPonchos','numBinoculares','extraGuia','fecha','hora','nombre','email','acompanantes','guideLanguage','acceptTerms'];\r\n    ids.forEach(id => {\r\n        const el = document.getElementById(id);\r\n        if (el) {\r\n            \/\/ Unificar eventos para recalcular y limpiar error\r\n            const eventNames = (el.type === 'text' || el.type === 'email' || el.type === 'textarea') ? ['input', 'change'] : ['change'];\r\n            eventNames.forEach(eventName => {\r\n                el.addEventListener(eventName, function(){\r\n                    clearFieldError(el);\r\n                    \/\/ Calcular total solo en campos que afectan el precio\r\n                    if (['adultos','ninos','bebes','tipoVisitante','extraPerezoso','botellasAgua','numToallas','numSnacks','numPonchos','numBinoculares','extraGuia','fecha'].includes(id)) {\r\n                        calcularTotal();\r\n                    }\r\n                });\r\n            });\r\n        }\r\n    });\r\n    \r\n    \/\/ Attach event listeners for the +\/- buttons\r\n    document.querySelectorAll('.qty-btn').forEach(button => {\r\n        button.addEventListener('click', function() {\r\n            const targetId = this.getAttribute('data-target');\r\n            const delta = this.classList.contains('plus-btn') ? 1 : -1;\r\n            updateQuantity(targetId, delta);\r\n        });\r\n    });\r\n\r\n\/\/ Forzar un c\u00e1lculo al cargar para asegurar que la nota de dep\u00f3sito est\u00e9 correcta inicialmente\r\n    calcularTotal();\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-41d540f e-flex e-con-boxed e-con e-parent\" data-id=\"41d540f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c24a97d elementor-widget elementor-widget-spacer\" data-id=\"c24a97d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Tours Immerse yourself in nature and discover spectacular landscapes on our exclusive hiking tour. Designed for adventure and exploration enthusiasts, this tour will take you through some of the most impressive natural attractions in Guanacaste. Essential Adventure: Waterfall &amp; Hanging Bridge This tour is designed for those who want to experience nature without requiring a [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"unboxed","site-sidebar-style":"unboxed","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"enabled","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-542","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tours - Cuilpilapan | Adventure Tours in Guanacaste<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cuilpilapan.com\/es\/services\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tours - Cuilpilapan | Adventure Tours in Guanacaste\" \/>\n<meta property=\"og:description\" content=\"Tours Immerse yourself in nature and discover spectacular landscapes on our exclusive hiking tour. Designed for adventure and exploration enthusiasts, this tour will take you through some of the most impressive natural attractions in Guanacaste. Essential Adventure: Waterfall &amp; Hanging Bridge This tour is designed for those who want to experience nature without requiring a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cuilpilapan.com\/es\/services\/\" \/>\n<meta property=\"og:site_name\" content=\"Cuilpilapan | Adventure Tours in Guanacaste\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/share\/17HdeKKdL8\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-25T01:48:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/7-scaled-rbmy5ufbqhwxd4a5xkewqvv3y4wlmlqdawsfc1gyww.jpg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"15 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/cuilpilapan.com\\\/services\\\/\",\"url\":\"https:\\\/\\\/cuilpilapan.com\\\/services\\\/\",\"name\":\"Tours - Cuilpilapan | Adventure Tours in Guanacaste\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/cuilpilapan.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/cuilpilapan.com\\\/services\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/cuilpilapan.com\\\/services\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cuilpilapan.com\\\/wp-content\\\/uploads\\\/elementor\\\/thumbs\\\/7-scaled-rbmy5ufbqhwxd4a5xkewqvv3y4wlmlqdawsfc1gyww.jpg\",\"datePublished\":\"2025-02-13T07:25:22+00:00\",\"dateModified\":\"2026-01-25T01:48:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/cuilpilapan.com\\\/services\\\/#breadcrumb\"},\"inLanguage\":\"es-CR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/cuilpilapan.com\\\/services\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es-CR\",\"@id\":\"https:\\\/\\\/cuilpilapan.com\\\/services\\\/#primaryimage\",\"url\":\"https:\\\/\\\/cuilpilapan.com\\\/wp-content\\\/uploads\\\/elementor\\\/thumbs\\\/7-scaled-rbmy5ufbqhwxd4a5xkewqvv3y4wlmlqdawsfc1gyww.jpg\",\"contentUrl\":\"https:\\\/\\\/cuilpilapan.com\\\/wp-content\\\/uploads\\\/elementor\\\/thumbs\\\/7-scaled-rbmy5ufbqhwxd4a5xkewqvv3y4wlmlqdawsfc1gyww.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/cuilpilapan.com\\\/services\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/cuilpilapan.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tours\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/cuilpilapan.com\\\/#website\",\"url\":\"https:\\\/\\\/cuilpilapan.com\\\/\",\"name\":\"Cuilpilapan | Adventure Tours in Guanacaste\",\"description\":\"Discover Cuilpilap\u00e1n \u2013 a Colorful River in Fortuna de Bagaces, Guanacaste. Experience hiking, crystal-clear waters, waterfalls, hanging bridges, and sustainable tours, just minutes from R\u00edo Perdido, Y\u00f6k\u00f6 Hot Springs, Guayac\u00e1n Hot Springs, and Colinas del Miravalles. Perfect for travelers looking for things to do near Miravalles Volcano and Bagaces in Costa Rica.\",\"publisher\":{\"@id\":\"https:\\\/\\\/cuilpilapan.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/cuilpilapan.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es-CR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/cuilpilapan.com\\\/#organization\",\"name\":\"Cuilpilapan | Adventure Tours in Guanacaste\",\"url\":\"https:\\\/\\\/cuilpilapan.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es-CR\",\"@id\":\"https:\\\/\\\/cuilpilapan.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/cuilpilapan.com\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/cropped-WhatsApp-Image-2025-01-12-at-11.47.21-AM-1.jpeg\",\"contentUrl\":\"https:\\\/\\\/cuilpilapan.com\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/cropped-WhatsApp-Image-2025-01-12-at-11.47.21-AM-1.jpeg\",\"width\":500,\"height\":312,\"caption\":\"Cuilpilapan | Adventure Tours in Guanacaste\"},\"image\":{\"@id\":\"https:\\\/\\\/cuilpilapan.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/share\\\/17HdeKKdL8\\\/\",\"https:\\\/\\\/www.tiktok.com\\\/@cuilpilapan?_t=ZM-90Irm1QBNbI&_r=1\",\"https:\\\/\\\/share.google\\\/UYFQTVugflTXCXXHA\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tours - Cuilpilapan | Adventure Tours in Guanacaste","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cuilpilapan.com\/es\/services\/","og_locale":"es_ES","og_type":"article","og_title":"Tours - Cuilpilapan | Adventure Tours in Guanacaste","og_description":"Tours Immerse yourself in nature and discover spectacular landscapes on our exclusive hiking tour. Designed for adventure and exploration enthusiasts, this tour will take you through some of the most impressive natural attractions in Guanacaste. Essential Adventure: Waterfall &amp; Hanging Bridge This tour is designed for those who want to experience nature without requiring a [&hellip;]","og_url":"https:\/\/cuilpilapan.com\/es\/services\/","og_site_name":"Cuilpilapan | Adventure Tours in Guanacaste","article_publisher":"https:\/\/www.facebook.com\/share\/17HdeKKdL8\/","article_modified_time":"2026-01-25T01:48:43+00:00","og_image":[{"url":"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/7-scaled-rbmy5ufbqhwxd4a5xkewqvv3y4wlmlqdawsfc1gyww.jpg","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"15 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/cuilpilapan.com\/services\/","url":"https:\/\/cuilpilapan.com\/services\/","name":"Tours - Cuilpilapan | Adventure Tours in Guanacaste","isPartOf":{"@id":"https:\/\/cuilpilapan.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cuilpilapan.com\/services\/#primaryimage"},"image":{"@id":"https:\/\/cuilpilapan.com\/services\/#primaryimage"},"thumbnailUrl":"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/7-scaled-rbmy5ufbqhwxd4a5xkewqvv3y4wlmlqdawsfc1gyww.jpg","datePublished":"2025-02-13T07:25:22+00:00","dateModified":"2026-01-25T01:48:43+00:00","breadcrumb":{"@id":"https:\/\/cuilpilapan.com\/services\/#breadcrumb"},"inLanguage":"es-CR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cuilpilapan.com\/services\/"]}]},{"@type":"ImageObject","inLanguage":"es-CR","@id":"https:\/\/cuilpilapan.com\/services\/#primaryimage","url":"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/7-scaled-rbmy5ufbqhwxd4a5xkewqvv3y4wlmlqdawsfc1gyww.jpg","contentUrl":"https:\/\/cuilpilapan.com\/wp-content\/uploads\/elementor\/thumbs\/7-scaled-rbmy5ufbqhwxd4a5xkewqvv3y4wlmlqdawsfc1gyww.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/cuilpilapan.com\/services\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/cuilpilapan.com\/"},{"@type":"ListItem","position":2,"name":"Tours"}]},{"@type":"WebSite","@id":"https:\/\/cuilpilapan.com\/#website","url":"https:\/\/cuilpilapan.com\/","name":"Cuilpilapan | Tours de Aventura en Guanacaste","description":"Discover Cuilpilap\u00e1n \u2013 a Colorful River in Fortuna de Bagaces, Guanacaste. Experience hiking, crystal-clear waters, waterfalls, hanging bridges, and sustainable tours, just minutes from R\u00edo Perdido, Y\u00f6k\u00f6 Hot Springs, Guayac\u00e1n Hot Springs, and Colinas del Miravalles. Perfect for travelers looking for things to do near Miravalles Volcano and Bagaces in Costa Rica.","publisher":{"@id":"https:\/\/cuilpilapan.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cuilpilapan.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es-CR"},{"@type":"Organization","@id":"https:\/\/cuilpilapan.com\/#organization","name":"Cuilpilapan | Tours de Aventura en Guanacaste","url":"https:\/\/cuilpilapan.com\/","logo":{"@type":"ImageObject","inLanguage":"es-CR","@id":"https:\/\/cuilpilapan.com\/#\/schema\/logo\/image\/","url":"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/02\/cropped-WhatsApp-Image-2025-01-12-at-11.47.21-AM-1.jpeg","contentUrl":"https:\/\/cuilpilapan.com\/wp-content\/uploads\/2025\/02\/cropped-WhatsApp-Image-2025-01-12-at-11.47.21-AM-1.jpeg","width":500,"height":312,"caption":"Cuilpilapan | Adventure Tours in Guanacaste"},"image":{"@id":"https:\/\/cuilpilapan.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/share\/17HdeKKdL8\/","https:\/\/www.tiktok.com\/@cuilpilapan?_t=ZM-90Irm1QBNbI&_r=1","https:\/\/share.google\/UYFQTVugflTXCXXHA"]}]}},"_links":{"self":[{"href":"https:\/\/cuilpilapan.com\/es\/wp-json\/wp\/v2\/pages\/542","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cuilpilapan.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cuilpilapan.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cuilpilapan.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cuilpilapan.com\/es\/wp-json\/wp\/v2\/comments?post=542"}],"version-history":[{"count":1636,"href":"https:\/\/cuilpilapan.com\/es\/wp-json\/wp\/v2\/pages\/542\/revisions"}],"predecessor-version":[{"id":7268,"href":"https:\/\/cuilpilapan.com\/es\/wp-json\/wp\/v2\/pages\/542\/revisions\/7268"}],"wp:attachment":[{"href":"https:\/\/cuilpilapan.com\/es\/wp-json\/wp\/v2\/media?parent=542"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}