{"id":10978,"date":"2026-01-07T06:23:36","date_gmt":"2026-01-07T10:23:36","guid":{"rendered":"https:\/\/www.atacama.tours\/?page_id=10978"},"modified":"2026-07-10T02:34:25","modified_gmt":"2026-07-10T06:34:25","slug":"planificador-de-itinerarios","status":"publish","type":"page","link":"https:\/\/www.atacama.tours\/en\/planificador-de-itinerarios\/","title":{"rendered":"Itinerary planner in San Pedro de Atacama"},"content":{"rendered":"\n<style>\n\/* 1. CONTENEDOR DEL T\u00cdTULO PRINCIPAL (100% INDEPENDIENTE) *\/\n.om-main-title-sec {\n    width: 100% !important;\n    max-width: 900px;\n    margin: clamp(40px, 8vh, 60px) auto clamp(20px, 4vh, 40px) auto;\n    padding: 0 15px; \n    text-align: center;\n    box-sizing: border-box !important;\n}\n\n\/* 2. ICONO SVG NATIVO (SIN PLUGINS) *\/\n.om-main-title-sec svg {\n    width: clamp(35px, 6vw, 45px);\n    height: clamp(35px, 6vw, 45px);\n    stroke: #FF8700; \/* Naranja Corporativo *\/\n    margin-bottom: 15px;\n    display: inline-block;\n    animation: omPopIn 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;\n}\n\n\/* 3. T\u00cdTULO H1 ESTANDARIZADO *\/\n.om-main-title-sec h1 {\n    font-family: 'Poppins', sans-serif !important;\n    font-weight: 900;\n    color: #12374C; \/* Azul Corporativo [cite: 2026-02-02] *\/\n    font-size: clamp(32px, 6vw, 54px) !important; \n    line-height: 1.1;\n    margin: 0;\n    text-transform: uppercase;\n    letter-spacing: -1px;\n    word-wrap: break-word;\n    overflow-wrap: break-word;\n}\n\n\/* 4. RESALTE DE COLOR *\/\n.om-main-title-sec h1 span.om-highlight {\n    color: #ff6b00; \/* Naranja Corporativo *\/\n    display: block; \n    margin-top: 5px;\n}\n\n\/* ANIMACI\u00d3N LIGERA *\/\n@keyframes omPopIn {\n    0% { opacity: 0; transform: scale(0.5); }\n    100% { opacity: 1; transform: scale(1); }\n}\n\n\/* AJUSTES PARA M\u00d3VILES PEQUE\u00d1OS *\/\n@media (max-width: 480px) {\n    .om-main-title-sec {\n        margin-top: 30px;\n        margin-bottom: 20px;\n    }\n}\n<\/style>\n\n<div class=\"om-main-title-sec\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"><\/rect>\n        <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"><\/line>\n        <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"><\/line>\n        <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"><\/line>\n    <\/svg>\n    \n    <h1>\n        Planificador de itinerarios en\n        <span class=\"om-highlight\">San Pedro de Atacama<\/span>\n    <\/h1>\n<\/div>\n\n\n\n<div id=\"planner-tool\">\n  <div id=\"global-alert-container\" class=\"alert-wrapper\" style=\"display: none;\">\n    <div class=\"alert-box\">\n      <span>\u2139\ufe0f El itinerario se organiza considerando horarios, esfuerzo y altura para evitar errores comunes en Atacama.<\/span>\n    <\/div>\n  <\/div>\n\n  <section id=\"view-mode\" class=\"view active\">\n    <div class=\"centered-layout\">\n      <header class=\"tool-header\">\n        <h3>Dise\u00f1a tu itinerario para vivir San Pedro de Atacama<\/h3>\n        <p>Una herramienta gratuita para organizar tu viaje d\u00eda por d\u00eda, considerando horarios, altitud y nivel de esfuerzo. Hecha por gente que conoce el desierto.<\/p>\n        <h4>Elige c\u00f3mo quieres empezar<\/h4>\n      <\/header>\n\n      <div class=\"mode-selection-wrapper\">\n        <button class=\"mode-card\" onclick=\"showView('selection')\">\n          <strong>Ya s\u00e9 qu\u00e9 quiero ver<\/strong>\n          <p>Selecciona los tours que te interesan y los organizamos en un itinerario inteligente al instante.<\/p>\n          <span class=\"action-text\">\u2192 Elegir mis tours<\/span>\n        <\/button>\n\n        <div class=\"selection-divider\">\n          <span>o tambi\u00e9n<\/span>\n        <\/div>\n\n        <button class=\"mode-card\" onclick=\"startWizard()\">\n          <strong>No s\u00e9 por d\u00f3nde empezar<\/strong>\n          <p>Responde unas preguntas r\u00e1pidas y te sugerimos un itinerario hecho a tu medida, seg\u00fan tus d\u00edas, intereses y experiencia con la altitud.<\/p>\n          <span class=\"action-text\">\u2192 Ay\u00fadame a decidir<\/span>\n        <\/button>\n      <\/div>\n\n      <div class=\"alert-box secondary-alert\" style=\"margin-top: 32px; justify-content: center;\">\n        \u2139\ufe0f Podr\u00e1s modificar el itinerario antes de descargar el PDF profesional.\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section id=\"view-wizard\" class=\"view\">\n    <div class=\"centered-layout\">\n      <header class=\"tool-header\">\n        <h3>Modo asistido<\/h3>\n      <\/header>\n      <div id=\"wizard-form\" class=\"mode-container wizard-gap\"><\/div>\n    <\/div>\n  <\/section>\n\n  <section id=\"view-selection\" class=\"view\">\n    <div class=\"selection-layout\">\n      <header class=\"tool-header\">\n        <h3>Configuraci\u00f3n del itinerario<\/h3>\n        <div id=\"status-bar\" class=\"status-bar\">Tours a\u00f1adidos: 0<\/div>\n      <\/header>\n\n      <div id=\"tour-grid\" class=\"tour-grid-2x4\"><\/div>\n\n      <div class=\"sticky-footer\">\n        <button class=\"btn-secondary\" onclick=\"resetApp()\">Reinicio<\/button>\n        <button id=\"btn-to-itinerary\" class=\"btn-primary\" disabled onclick=\"handleGenerate()\">Ver mi itinerario \u2192<\/button>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section id=\"view-result\" class=\"view\">\n    <div class=\"result-wrapper\">\n      <header class=\"tool-header\">\n        <button class=\"btn-back\" onclick=\"showView('selection')\">\u2190 Ajustar selecci\u00f3n<\/button>\n        <h3 style=\"margin-top: 24px;\">Tu itinerario est\u00e1 listo<\/h3>\n        <p>Lo organizamos respetando tiempos, altitud y nivel de exigencia.\nPuedes ajustarlo cuantas veces necesites antes de descargarlo.<\/p>\n        <div id=\"expert-interpretation\" class=\"interpretation-box\"><\/div>\n      <\/header>\n\n      <div class=\"paper-clean\">\n        <div id=\"itinerary-content\"><\/div>\n      <\/div>\n\n      <div class=\"pax-selector\">\n        <span class=\"pax-label\">N\u00famero de pasajeros<\/span>\n        <div class=\"pax-stepper\">\n          <button type=\"button\" onclick=\"changePax(-1)\" aria-label=\"Quitar pasajero\">\u2212<\/button>\n          <span id=\"pax-count\">2<\/span>\n          <button type=\"button\" onclick=\"changePax(1)\" aria-label=\"Agregar pasajero\">+<\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"result-footer\" style=\"margin-top: 24px; padding-bottom: 60px; display: flex; gap: 16px; justify-content: center;\">\n        <button class=\"btn-secondary\" onclick=\"resetApp()\">Reiniciar planificador<\/button>\n        <button class=\"btn-primary\" onclick=\"openLeadForm()\">Descargar itinerario en PDF<\/button>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- POPUP LEAD FLUENT FORMS -->\n  <div id=\"lead-popup\" class=\"lead-popup\">\n    <div class=\"lead-popup-box\">\n\n      <button class=\"lead-popup-close\" onclick=\"closeLeadForm()\" aria-label=\"Cerrar formulario\">\n        \u00d7\n      <\/button>\n\n      <h3 class=\"lead-popup-title\">\n        Recibe tu itinerario\n      <\/h3>\n\n      <p class=\"lead-popup-text\">\n        Completa tus datos para descargar el PDF y recibir una copia en tu correo.\n      <\/p>\n\n      <div class='fluentform ff-default fluentform_wrapper_19 ffs_default_wrap'><form data-form_id=\"19\" id=\"fluentform_19\" class=\"frm-fluent-form fluent_form_19 ff-el-form-top ff_form_instance_19_1 ff-form-loading ffs_default\" data-form_instance=\"ff_form_instance_19_1\" method=\"POST\" ><fieldset  style=\"border: none!important;margin: 0!important;padding: 0!important;background-color: transparent!important;box-shadow: none!important;outline: none!important; min-inline-size: 100%;\">\n                    <legend class=\"ff_screen_reader_title\" style=\"display: block; margin: 0!important;padding: 0!important;height: 0!important;text-indent: -999999px;width: 0!important;overflow:hidden;\">Formulario de itinerario<\/legend><input type='hidden' name='__fluent_form_embded_post_id' value='10978' \/><input type=\"hidden\" id=\"_fluentform_19_fluentformnonce\" name=\"_fluentform_19_fluentformnonce\" value=\"d60846a281\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/10978\" \/><div data-type=\"name-element\" data-name=\"names\" class=\" ff-field_container ff-name-field-wrapper\" ><div class='ff-t-container'><div class='ff-t-cell '><div class='ff-el-group ff-el-form-top'><div class=\"ff-el-input--label asterisk-right\"><label for='ff_19_names_first_name_' id='label_ff_19_names_first_name_' >Nombre<\/label><\/div><div class='ff-el-input--content'><input type=\"text\" name=\"names[first_name]\" id=\"ff_19_names_first_name_\" class=\"ff-el-form-control\" placeholder=\"Introduce tu nombre\" aria-invalid=\"false\" aria-required=false><\/div><\/div><\/div><\/div><\/div><div class='ff-el-group'><div class=\"ff-el-input--label asterisk-right\"><label for='ff_19_input_text' id='label_ff_19_input_text' aria-label=\"Tel\u00e9fono\">Tel\u00e9fono <\/label><\/div><div class='ff-el-input--content'><input type=\"text\" name=\"input_text\" class=\"ff-el-form-control\" data-name=\"input_text\" id=\"ff_19_input_text\"  aria-invalid=\"false\" aria-required=false><\/div><\/div><div class='ff-el-group'><div class=\"ff-el-input--label asterisk-right\"><label for='ff_19_email' id='label_ff_19_email' aria-label=\"Correo electr\u00f3nico\">Correo electr\u00f3nico<\/label><\/div><div class='ff-el-input--content'><input type=\"email\" name=\"email\" id=\"ff_19_email\" class=\"ff-el-form-control\" data-name=\"email\"  aria-invalid=\"false\" aria-required=false><\/div><\/div><div class='ff-el-group'><div class=\"ff-el-input--label asterisk-right\"><label for='ff_19_datetime' id='label_ff_19_datetime' aria-label=\"Fecha de viaje\">Fecha de viaje<\/label><\/div><div class='ff-el-input--content'><input  aria-label='Fecha de viaje Use arrow keys to navigate dates. Press enter to select a date.'  aria-haspopup='dialog' data-type-datepicker data-format='d\/m\/Y' type=\"text\" name=\"datetime\" id=\"ff_19_datetime\" class=\"ff-el-form-control ff-el-datepicker\" data-name=\"datetime\"  aria-invalid='false' aria-required=false><\/div><\/div><div class='ff-el-group ff-text-left ff_submit_btn_wrapper'><button type=\"submit\" class=\"ff-btn ff-btn-submit ff-btn-md ff_btn_style\"  aria-label=\"Enviar\">Enviar<\/button><\/div><\/fieldset><\/form><div id='fluentform_19_errors' class='ff-errors-in-stack ff_form_instance_19_1 ff-form-loading_errors ff_form_instance_19_1_errors'><\/div><\/div>            <script type=\"text\/javascript\">\n                window.fluent_form_ff_form_instance_19_1 = {\"id\":\"19\",\"ajaxUrl\":\"https:\\\/\\\/www.atacama.tours\\\/wp-admin\\\/admin-ajax.php\",\"settings\":{\"layout\":{\"labelPlacement\":\"top\",\"asteriskPlacement\":\"asterisk-right\",\"helpMessagePlacement\":\"with_label\",\"errorMessagePlacement\":\"inline\",\"cssClassName\":\"\"},\"restrictions\":{\"denyEmptySubmission\":{\"enabled\":false}}},\"form_instance\":\"ff_form_instance_19_1\",\"form_id_selector\":\"fluentform_19\",\"rules\":{\"names[first_name]\":{\"required\":{\"value\":false,\"message\":\"This field is required\",\"global_message\":\"Este campo es obligatorio\",\"global\":true}},\"names[middle_name]\":{\"required\":{\"value\":false,\"message\":\"This field is required\",\"global_message\":\"Este campo es obligatorio\",\"global\":true}},\"names[last_name]\":{\"required\":{\"value\":false,\"message\":\"This field is required\",\"global_message\":\"Este campo es obligatorio\",\"global\":true}},\"input_text\":{\"required\":{\"value\":false,\"message\":\"This field is required\",\"global_message\":\"Este campo es obligatorio\",\"global\":true}},\"email\":{\"required\":{\"value\":false,\"message\":\"This field is required\",\"global_message\":\"Este campo es obligatorio\",\"global\":true},\"email\":{\"value\":true,\"message\":\"This field must contain a valid email\",\"global_message\":\"Este campo debe contener un correo electr\\u00f3nico v\\u00e1lido\",\"global\":true}},\"datetime\":{\"required\":{\"value\":false,\"message\":\"This field is required\",\"global_message\":\"Este campo es obligatorio\",\"global\":true}}},\"debounce_time\":300,\"file_upload_settings\":[]};\n                            <\/script>\n            \n\n    <\/div>\n  <\/div>\n<\/div>\n\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\n\n<style>\n  :root {\n    --dark: #111827;\n    --gray-med: #6b7280;\n    --border: #E5E7EB;\n    --alert-bg: #FFF7CC;\n    --alert-border: #F2C94C;\n    --bg-main: #ffffff;\n  }\n\n  #planner-tool {\n    width: 100%;\n    margin: 0 auto;\n    font-family: 'Inter', sans-serif;\n    color: var(--dark);\n    background: white;\n  }\n\n  .centered-layout {\n    max-width: 760px;\n    margin: 40px auto;\n    text-align: center;\n  }\n\n  .selection-layout {\n    max-width: 1000px;\n    margin: 20px auto;\n  }\n\n  .view {\n    display: none;\n    padding: 24px;\n    animation: fadeIn 0.3s ease;\n    background: white;\n  }\n\n  .view.active {\n    display: block;\n  }\n\n  @keyframes fadeIn {\n    from {\n      opacity: 0;\n      transform: translateY(4px);\n    }\n\n    to {\n      opacity: 1;\n      transform: translateY(0);\n    }\n  }\n\n  .tool-header h3 {\n    font-size: 28px;\n    font-weight: 700;\n    margin-bottom: 24px;\n    letter-spacing: -1px;\n  }\n\n  .mode-selection-wrapper {\n    display: flex;\n    flex-direction: column;\n    gap: 0;\n  }\n\n  .selection-divider {\n    position: relative;\n    height: 60px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n\n  .selection-divider::before {\n    content: \"\";\n    position: absolute;\n    width: 100%;\n    height: 1px;\n    background: var(--border);\n    z-index: 1;\n  }\n\n  .selection-divider span {\n    background: #fff;\n    padding: 0 20px;\n    color: var(--gray-med);\n    font-size: 14px;\n    z-index: 2;\n    font-weight: 500;\n  }\n\n  .alert-wrapper {\n    padding: 0 24px 20px 24px;\n    max-width: 1000px;\n    margin: 0 auto;\n  }\n\n  .alert-box {\n    background: var(--alert-bg) !important;\n    border-left: 4px solid var(--alert-border);\n    padding: 14px 20px;\n    font-size: 14px;\n    color: #111 !important;\n    text-align: left;\n  }\n\n  .interpretation-box {\n    margin-bottom: 24px;\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n  }\n\n  .tour-grid-2x4 {\n    display: grid;\n    grid-template-columns: repeat(2, 1fr);\n    gap: 16px;\n    margin-bottom: 120px;\n  }\n\n  .mode-card,\n  .tour-item {\n    background-color: #ffffff !important;\n    border: 1px solid var(--border) !important;\n    border-radius: 12px;\n    padding: 20px;\n    text-align: left;\n    cursor: pointer;\n    transition: all 0.2s ease;\n    width: 100%;\n    color: var(--dark) !important;\n    white-space: normal !important;\n  }\n\n  .mode-card:hover,\n  .tour-item:hover {\n    background-color: #F8FAFC !important;\n    border-color: var(--dark) !important;\n  }\n\n  .mode-card.selected,\n  .tour-item.selected {\n    background-color: var(--alert-bg) !important;\n    border-color: var(--alert-border) !important;\n    border-left: 6px solid var(--alert-border) !important;\n  }\n\n  .btn-primary {\n    background: var(--dark);\n    color: #fff;\n    border: none;\n    padding: 16px 32px;\n    font-weight: 700;\n    cursor: pointer;\n    border-radius: 8px;\n    font-size: 16px;\n  }\n\n  .btn-primary:disabled {\n    background: #ccc;\n    cursor: not-allowed;\n  }\n\n  .btn-secondary {\n    background: #fff;\n    border: 1px solid var(--dark);\n    padding: 16px 32px;\n    font-weight: 700;\n    cursor: pointer;\n    border-radius: 8px;\n    font-size: 16px;\n  }\n\n  .btn-availability {\n    background-color: var(--dark);\n    color: #ffffff !important;\n    text-decoration: none;\n    padding: 12px 24px;\n    border-radius: 6px;\n    font-size: 14px;\n    font-weight: 700;\n    display: inline-flex;\n    justify-content: center;\n    align-items: center;\n    margin-top: 12px;\n  }\n\n  .sticky-footer {\n    position: fixed;\n    bottom: 0;\n    left: 0;\n    width: 100%;\n    background: #fff;\n    border-top: 1px solid var(--border);\n    padding: 24px;\n    display: flex;\n    justify-content: center;\n    gap: 16px;\n    z-index: 100;\n    box-shadow: 0 -4px 15px rgba(0,0,0,0.05);\n  }\n\n  .result-wrapper {\n    max-width: 800px;\n    margin: 0 auto;\n    background: white;\n  }\n\n  .paper-clean {\n    background: #fff;\n    padding: 20px 0;\n    border-radius: 0;\n  }\n\n  .day-label {\n    font-size: 12px;\n    font-weight: 800;\n    color: var(--gray-med);\n    text-transform: uppercase;\n    border-bottom: 1px solid #eee;\n    padding-bottom: 8px;\n    margin-bottom: 24px;\n    display: block;\n  }\n\n  .btn-back {\n    background: none;\n    border: none;\n    color: var(--gray-med);\n    cursor: pointer;\n    font-weight: 600;\n    padding: 0;\n    margin-bottom: 10px;\n  }\n\n  \/* SELECTOR DE PASAJEROS *\/\n  .pax-selector {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 16px;\n    margin: 32px auto 4px;\n    flex-wrap: wrap;\n  }\n\n  .pax-label {\n    font-weight: 700;\n    color: var(--dark);\n    font-size: 16px;\n  }\n\n  .pax-stepper {\n    display: inline-flex;\n    align-items: center;\n    border: 1px solid var(--border);\n    border-radius: 10px;\n    overflow: hidden;\n  }\n\n  .pax-stepper button {\n    width: 44px;\n    height: 44px;\n    border: none;\n    background: #fff;\n    font-size: 22px;\n    font-weight: 700;\n    cursor: pointer;\n    color: var(--dark);\n  }\n\n  .pax-stepper button:hover {\n    background: #F8FAFC;\n  }\n\n  .pax-stepper span {\n    min-width: 48px;\n    text-align: center;\n    font-size: 18px;\n    font-weight: 800;\n    border-left: 1px solid var(--border);\n    border-right: 1px solid var(--border);\n    padding: 0 6px;\n    line-height: 44px;\n  }\n\n  @media (max-width: 768px) {\n    .tour-grid-2x4 {\n      grid-template-columns: 1fr;\n    }\n\n    .result-footer {\n      flex-direction: column;\n    }\n\n    .result-footer button {\n      width: 100%;\n    }\n  }\n\n  .timeline {\n    max-width: 700px;\n    margin: 40px auto;\n    font-family: Inter, sans-serif;\n  }\n\n  .timeline .day-label {\n    font-weight: 800;\n    color: #6b7280;\n    margin-bottom: 24px;\n    display: block;\n    text-transform: uppercase;\n    border-bottom: 1px solid #e5e7eb;\n    padding-bottom: 8px;\n  }\n\n  .timeline .event {\n    position: relative;\n    padding-left: 32px;\n    margin-bottom: 32px;\n  }\n\n  .timeline .event::before {\n    content: \"\";\n    position: absolute;\n    left: 6px;\n    top: 4px;\n    width: 12px;\n    height: 12px;\n    background: #111827;\n    border-radius: 50%;\n  }\n\n  .timeline .event::after {\n    content: \"\";\n    position: absolute;\n    left: 11px;\n    top: 18px;\n    width: 2px;\n    height: 100%;\n    background: #e5e7eb;\n  }\n\n  .timeline .event:last-child::after {\n    display: none;\n  }\n\n  .timeline .event h4 {\n    margin: 0;\n    font-size: 18px;\n    font-weight: 700;\n  }\n\n  .timeline .event p {\n    margin: 4px 0;\n    color: #6b7280;\n    font-size: 14px;\n  }\n\n  .timeline .event a {\n    font-size: 13px;\n    font-weight: 700;\n    color: #111827;\n    text-decoration: underline;\n  }\n\n  \/* POPUP LEAD *\/\n  .lead-popup {\n    display: none;\n    position: fixed;\n    inset: 0;\n    background: rgba(0,0,0,.65);\n    z-index: 99999;\n    justify-content: center;\n    align-items: center;\n    padding: 20px;\n    box-sizing: border-box;\n  }\n\n  .lead-popup-box {\n    background: #ffffff;\n    width: 100%;\n    max-width: 520px;\n    border-radius: 20px;\n    padding: 40px 30px;\n    position: relative;\n    box-shadow: 0 24px 70px rgba(0,0,0,.22);\n    box-sizing: border-box;\n  }\n\n  .lead-popup-close {\n    position: absolute;\n    top: 14px;\n    right: 18px;\n    border: none;\n    background: none;\n    font-size: 30px;\n    line-height: 1;\n    cursor: pointer;\n    color: #111827;\n  }\n\n  .lead-popup-title {\n    font-family: 'Poppins', sans-serif;\n    font-size: 30px;\n    font-weight: 800;\n    line-height: 1.2;\n    color: #111827;\n    margin: 0 0 10px;\n  }\n\n  .lead-popup-text {\n    font-family: 'Open Sans', sans-serif;\n    font-size: 16px;\n    line-height: 1.6;\n    color: #6b7280;\n    margin: 0 0 24px;\n  }\n\n  @media(max-width:768px) {\n    .lead-popup-box {\n      padding: 34px 24px;\n      border-radius: 18px;\n    }\n\n    .lead-popup-title {\n      font-size: 24px;\n    }\n\n    .lead-popup-text {\n      font-size: 15px;\n    }\n  }\n<\/style>\n\n<script>\n  const TOUR_URLS = {\n    \"The Roofless - Tour astron\u00f3mico\": \"https:\/\/www.atacama.tours\/astronomico\/\",\n    \"Valle de la Luna\": \"https:\/\/www.atacama.tours\/tour\/valle-de-la-luna\/\",\n    \"Geyser del Tatio\": \"https:\/\/www.atacama.tours\/tour\/geyser-del-tatio\/\",\n    \"Valle del Arco\u00edris\": \"https:\/\/www.atacama.tours\/tour\/valle-del-arcoiris\/\",\n    \"Laguna Cejar\": \"https:\/\/www.atacama.tours\/tour\/laguna-cejar\/\",\n    \"Vallecito\": \"https:\/\/www.atacama.tours\/tour\/tour-al-vallecito\/\",\n    \"Chaxa, Toconao y Jere\": \"https:\/\/www.atacama.tours\/tour\/tour-chaxa-toconao-y-jere\/\",\n  };\n\n  const TOURS = [\n    { id: \"at\", name: \"The Roofless - Tour astron\u00f3mico\", slot: \"09:00 PM - 11:30 PM\", alt: \"Baja\", type: \"LOW\", dawn: false },\n    { id: \"vl\", name: \"Valle de la Luna\", slot: \"03:30 PM - 07:30 PM\", alt: \"Baja\", type: \"LOW\", dawn: false },\n    { id: \"gt\", name: \"Geyser del Tatio\", slot: \"05:00 AM - 12:00 PM\", alt: \"Alta\", type: \"HIGH\", dawn: true },\n    { id: \"va\", name: \"Valle del Arco\u00edris\", slot: \"08:30 AM - 01:30 PM\", alt: \"Baja\", type: \"LOW\", dawn: false },\n    { id: \"lc\", name: \"Laguna Cejar\", slot: \"03:00 PM - 07:00 PM\", alt: \"Baja\", type: \"LOW\", dawn: false },\n    { id: \"vc\", name: \"Vallecito\", slot: \"AM \/ PM\", alt: \"Baja\", type: \"LOW\", dawn: false },\n    { id: \"ctj\", name: \"Chaxa, Toconao y Jere\", slot: \"AM\", alt: \"Media\", type: \"MID\", dawn: false }\n  ];\n\n  \/* =========================================================================\n     CONFIG DEL PDF  \u00b7  edita estos bloques cuando tengas im\u00e1genes y precios\n     ========================================================================= *\/\n\n  \/* Datos de cabecera. D\u00e9jalos fijos aqu\u00ed, o set\u00e9alos desde el formulario\n     antes de generar el PDF (ver nota al final del script). *\/\n  const ITINERARY_CONFIG = {\n    travelerName: \"\",     \/\/ Ej: \"Alexander Busch\"  -> se muestra en \"Itinerary ...\"\n    passengers: 2,        \/\/ N\u00ba de pasajeros\n    startDate: null,      \/\/ \"YYYY-MM-DD\" ej \"2026-01-13\". Si es null -> \"D\u00eda 1, 2, 3...\"\n    labelPassengers: \"NUMBER OF PASSENGERS\",\n    labelTours: \"TOTAL TOURS\",\n    labelTotal: \"TOTAL\",\n    priceLabel: \"Tour price\",\n    infoTitle: \"IMPORTANT INFORMATION\"\n  };\n\n  \/* Precios por tour en CLP (n\u00famero, sin puntos ni s\u00edmbolo).\n     Deja 0 si a\u00fan no lo tienes: se mostrar\u00e1 \"\u2014\". *\/\n  const TOUR_PRICES = {\n    at:  400000,   \/\/ The Roofless - Tour astron\u00f3mico\n    vl:  450000,   \/\/ Valle de la Luna\n    gt:  600000,   \/\/ Geyser del Tatio\n    va:  500000,   \/\/ Valle del Arco\u00edris\n    lc:  500000,   \/\/ Laguna Cejar\n    vc:  500000,   \/\/ Vallecito\n    ctj: 500000    \/\/ Chaxa, Toconao y Jere\n  };\n\n  \/* URLs de im\u00e1genes por tour. D\u00e9jalas vac\u00edas por ahora; cuando tengas las\n     URLs, p\u00e9galas aqu\u00ed. Deben permitir CORS (im\u00e1genes del propio dominio\n     atacama.tours funcionan sin problema). *\/\n  const TOUR_IMAGES = {\n    at:  \"https:\/\/www.atacama.tours\/wp-content\/uploads\/2026\/04\/Foto-de-tour-astronomico-.webp\",         \/\/ The Roofless - Tour astron\u00f3mico\n    vl:  \"https:\/\/www.atacama.tours\/wp-content\/uploads\/2025\/06\/Valle-de-la-Luna.webp\",                  \/\/ Valle de la Luna\n    gt:  \"https:\/\/www.atacama.tours\/wp-content\/uploads\/2025\/06\/Geyser-del-Tatio.webp\",                  \/\/ Geyser del Tatio\n    va:  \"https:\/\/www.atacama.tours\/wp-content\/uploads\/2025\/06\/Valle-del-arcoiris.webp\",                \/\/ Valle del Arco\u00edris\n    lc:  \"https:\/\/www.atacama.tours\/wp-content\/uploads\/2025\/06\/Laguna-cejar.webp\",                      \/\/ Laguna Cejar\n    vc:  \"https:\/\/www.atacama.tours\/wp-content\/uploads\/2026\/05\/Tour-al-Vallecito-imagen-principal-.webp\",\/\/ Vallecito\n    ctj: \"https:\/\/www.atacama.tours\/wp-content\/uploads\/2026\/04\/Tour-Chaxa-Toconao-y-Jere.webp\"          \/\/ Chaxa, Toconao y Jere\n  };\n\n  \/* Im\u00e1genes de tours combinados que a\u00fan NO est\u00e1n en el array TOURS.\n     Si alg\u00fan d\u00eda los agregas, ya tienes la URL a mano:\n     Lagunas Altipl\u00e1nicas y Chaxa: https:\/\/www.atacama.tours\/wp-content\/uploads\/2025\/06\/vista-increible-de-lagunas-altiplanicas.webp\n     Geyser del Tatio y Termas de Puritama: https:\/\/www.atacama.tours\/wp-content\/uploads\/2025\/06\/Termas-de-Puritama.webp\n     Ruta de los Salares: https:\/\/www.atacama.tours\/wp-content\/uploads\/2025\/06\/Ruta-de-los-Salares.webp\n     Piedras Rojas y Lagunas Altipl\u00e1nicas: https:\/\/www.atacama.tours\/wp-content\/uploads\/2025\/06\/Piedras-Rojas-y-lagunas-altiplanicas.webp *\/\n\n  \/* Texto del bloque inferior (IMPORTANT INFORMATION). Ed\u00edtalo libremente. *\/\n  const INFO_LINES = [\n    \"To make a reservation, you must pay 50% of the total tour price. The remaining balance is due after the first tour.\",\n    \"The prices indicated here are for private service with a certified guide, transportation, entrances fees and meals as appropriate (breakfast and\/or lunch, snacks).\",\n    \"For your safety, at AtacamaTours, we will NEVER ask you to transfer your money to personal or third-party accounts. Payments will always be made through a Business Account or WebPay.\",\n    \"Changes or cancellations will be in accordance with our terms and conditions. https:\/\/www.atacama.tours\/terminos-y-condiciones\/\",\n    \"Park entrance fees are not included and must be paid ONLY in cash or by bank transfer.\",\n    \"Recommendations for each tour will be sent one day in advance.\",\n    \"The pick-up time is 20 minutes. If the time limit is reached, please call (no text messages) +56 9 5000 0081 or +56 9 7838 0416.\",\n    \"By making payment, you accept the terms and conditions described above.\"\n  ];\n\n  \/* ========================================================================= *\/\n\n  let selection = new Set();\n  let travelers = 2;\n  let wizAns = {};\n  let wizStep = 1;\n  let pdfDownloadAfterLeadLock = false;\n\n  function initSelectionGrid() {\n    const grid = document.getElementById('tour-grid');\n    grid.innerHTML = '';\n\n    TOURS.forEach(t => {\n      const card = document.createElement('div');\n      card.className = `tour-item ${selection.has(t.id) ? 'selected' : ''}`;\n      card.onclick = () => toggleTour(t.id, card);\n      card.innerHTML = `\n        <div><h3>${t.name}<\/h3><p>${t.slot} \u00b7 Altitud ${t.alt}<\/p><\/div>\n        <button class=\"btn-primary\" style=\"width:100%; font-size:13px; padding:10px; margin-top:20px;\">\n          ${selection.has(t.id) ? '\u2713 SELECCIONADO' : 'A\u00d1ADIR AL PLAN'}\n        <\/button>\n      `;\n      grid.appendChild(card);\n    });\n\n    updateStats();\n  }\n\n  function toggleTour(id, el) {\n    selection.has(id) ? selection.delete(id) : selection.add(id);\n    initSelectionGrid();\n  }\n\n  function updateStats() {\n    document.getElementById('status-bar').innerText = `Tours a\u00f1adidos: ${selection.size}`;\n    document.getElementById('btn-to-itinerary').disabled = selection.size === 0;\n  }\n\n  function showView(id) {\n    document.querySelectorAll('.view').forEach(v => v.classList.remove('active'));\n    document.getElementById(`view-${id}`).classList.add('active');\n\n    const alert = document.getElementById('global-alert-container');\n    alert.style.display = (id === 'selection') ? 'block' : 'none';\n\n    if (id === 'selection') initSelectionGrid();\n\n    window.scrollTo(0, 0);\n  }\n\n  function startWizard() {\n    wizStep = 1;\n    renderWizard();\n    showView('wizard');\n  }\n\n  function renderWizard() {\n    const container = document.getElementById('wizard-form');\n    container.innerHTML = '';\n\n    const questions = [\n      { q: \"\u00bfCu\u00e1ntos d\u00edas tienes en Atacama?\", o: [\"1-2\", \"3-4\", \"5+\"], k: \"days\" },\n      { q: \"\u00bfEs tu primera vez en altura?\", o: [\"S\u00ed\", \"No\"], k: \"alt\" },\n      { q: \"\u00bfQu\u00e9 te interesa m\u00e1s?\", o: [\"Paisajes\", \"Relajaci\u00f3n\", \"Experiencias\", \"Astronom\u00eda\"], k: \"int\" },\n      { q: \"\u00bfQu\u00e9 ritmo prefieres?\", o: [\"Tranquilo\", \"Normal\", \"Intenso\"], k: \"pace\" }\n    ];\n\n    const curr = questions[wizStep - 1];\n\n    container.innerHTML = `<h3>${curr.q}<\/h3><p style=\"color:#888; margin-bottom:12px;\">Pregunta ${wizStep} de 4<\/p>`;\n\n    curr.o.forEach(opt => {\n      const btn = document.createElement('button');\n      btn.className = 'mode-card';\n      btn.style.marginBottom = \"16px\";\n      btn.innerHTML = `<strong>${opt}<\/strong>`;\n\n      btn.onclick = () => {\n        wizAns[curr.k] = opt;\n\n        if (wizStep < 4) {\n          wizStep++;\n          renderWizard();\n        } else {\n          applyWizard();\n        }\n      };\n\n      container.appendChild(btn);\n    });\n  }\n\n  function applyWizard() {\n    selection.clear();\n    selection.add('vl');\n\n    if (wizAns.alt === 'No') selection.add('gt');\n    if (wizAns.int === 'Astronom\u00eda') selection.add('at');\n    if (wizAns.days !== '1-2') selection.add('lc');\n\n    showView('selection');\n  }\n\n  function handleGenerate() {\n    const content = document.getElementById('itinerary-content');\n    const expertBox = document.getElementById('expert-interpretation');\n\n    content.innerHTML = '';\n    expertBox.innerHTML = '';\n\n    const list = TOURS\n      .filter(t => selection.has(t.id))\n      .sort((a, b) => (a.type === 'HIGH' ? 1 : -1));\n\n    const rules = [\n      { cond: list.length === 1, msg: \"\u2139\ufe0f Itinerario de actividad \u00fanica: ideal para una escala corta o jornada de descanso activa.\" },\n      { cond: list.every(t => t.type === 'LOW'), msg: \"\u2705 Perfil de aclimataci\u00f3n: Este plan es excelente para sus primeras 48h en Atacama al evitar alturas extremas.\" },\n      { cond: list.some(t => t.type === 'HIGH') && list.some(t => t.type === 'LOW'), msg: \"\u26a0\ufe0f Combinaci\u00f3n mixta: Se ha priorizado el orden l\u00f3gico. Realice siempre los tours de baja altura antes que los Altipl\u00e1nicos.\" },\n      { cond: list.some(t => t.name === \"Piedras Rojas\") || list.some(t => t.name === \"Ruta de los salares\"), msg: \"\ud83c\udfd4\ufe0f Jornada Altipl\u00e1nica: Estos tours superan los 4.000m. Hidr\u00e1tese el doble de lo habitual el d\u00eda previo.\" },\n      { cond: list.some(t => t.dawn), msg: \"\u2744\ufe0f Alerta T\u00e9rmica: El amanecer en los Geysers o Salares implica temperaturas bajo cero. Use el sistema de vestimenta por capas.\" },\n      { cond: list.some(t => t.name === \"Laguna Cejar\") || list.some(t => t.name === \"Termas de Puritama\"), msg: \"\ud83d\udca7 Hidro-Recuperaci\u00f3n: El agua en Atacama agota minerales. Use protector solar biodegradable incluso en el agua.\" },\n      { cond: list.length > 4, msg: \"\ud83c\udfc3 Ritmo Exigente: Su itinerario est\u00e1 saturado. Asegure al menos 7 horas de sue\u00f1o para evitar el mal de monta\u00f1a por fatiga.\" },\n      { cond: list.some(t => t.name === \"The Roofless - Tour astron\u00f3mico\"), msg: \"\ud83c\udf0c Observaci\u00f3n Nocturna: La noche en el desierto es muy fr\u00eda. No conf\u00ede en el clima diurno; abr\u00edguese intensamente para esta actividad.\" },\n      { cond: list.some(t => t.name === \"Valle de la Luna\"), msg: \"\ud83c\udfdc\ufe0f Exposici\u00f3n Solar: La radiaci\u00f3n en el Valle es extrema. Use sombrero de ala ancha y reaplique bloqueador cada 2 horas.\" },\n      { cond: true, msg: \"\ud83d\udd52 Puntualidad: Los pick-ups pueden variar 30min. Est\u00e9 listo en el lobby desde la hora marcada para no retrasar la ruta.\" }\n    ];\n\n    rules.forEach(r => {\n      if (r.cond) expertBox.innerHTML += `<div class=\"alert-box\">${r.msg}<\/div>`;\n    });\n\n    let days = [];\n\n    for (let i = 0; i < list.length; i += 2) {\n      days.push(list.slice(i, i + 2));\n    }\n\n    days.forEach((dTours, idx) => {\n      const timeline = document.createElement('div');\n      timeline.className = 'timeline';\n\n      timeline.innerHTML = `<span class=\"day-label\">D\u00cdA ${idx + 1}<\/span>`;\n\n      dTours.forEach(t => {\n        const url = TOUR_URLS[t.name] || \"#\";\n\n        timeline.innerHTML += `\n          <div class=\"event\">\n            <h4>${t.name}<\/h4>\n            <p>${t.slot} \u00b7 Altitud ${t.alt}<\/p>\n            <a href=\"${url}\" target=\"_blank\">Ver disponibilidad<\/a>\n          <\/div>\n        `;\n      });\n\n      content.appendChild(timeline);\n    });\n\n    showView('result');\n  }\n\n  function resetApp() {\n    selection.clear();\n    wizAns = {};\n    travelers = 2;\n    ITINERARY_CONFIG.passengers = 2;\n    const pc = document.getElementById('pax-count');\n    if (pc) pc.innerText = '2';\n    showView('mode');\n  }\n\n  function changePax(delta) {\n    travelers = Math.min(20, Math.max(1, travelers + delta));\n    ITINERARY_CONFIG.passengers = travelers;\n    const el = document.getElementById('pax-count');\n    if (el) el.innerText = travelers;\n  }\n\n  function openLeadForm() {\n    const popup = document.getElementById('lead-popup');\n\n    if (popup) {\n      popup.style.display = 'flex';\n    }\n  }\n\n  function closeLeadForm() {\n    const popup = document.getElementById('lead-popup');\n\n    if (popup) {\n      popup.style.display = 'none';\n    }\n  }\n\n  function downloadPDFAfterLeadSubmission() {\n    if (pdfDownloadAfterLeadLock) {\n      return;\n    }\n\n    pdfDownloadAfterLeadLock = true;\n\n    closeLeadForm();\n\n    setTimeout(function () {\n      generatePDF();\n\n      setTimeout(function () {\n        pdfDownloadAfterLeadLock = false;\n      }, 1500);\n\n    }, 600);\n  }\n\n  function bindFluentFormDownloadEvent() {\n    if (!window.jQuery) {\n      setTimeout(bindFluentFormDownloadEvent, 300);\n      return;\n    }\n\n    const $ = window.jQuery;\n\n    $(document).off('fluentform_submission_success.atacamaPdfDownload');\n\n    $(document).on('fluentform_submission_success.atacamaPdfDownload', function (event, response) {\n      const target = event && event.target ? event.target : null;\n      const $target = target ? $(target) : $();\n\n      const responseFormId = response ? (response.form_id || response.formId || response.id) : null;\n      const detailFormId = event && event.detail ? (event.detail.formId || event.detail.form_id || event.detail.id) : null;\n\n      const isForm19 =\n        String(responseFormId) === '19' ||\n        String(detailFormId) === '19' ||\n        $target.closest('#lead-popup').length > 0 ||\n        $target.closest('form').attr('data-form_id') === '19' ||\n        $target.closest('form').attr('id') === 'fluentform_19' ||\n        $target.closest('.fluent_form_19').length > 0;\n\n      if (isForm19) {\n        downloadPDFAfterLeadSubmission();\n      }\n    });\n\n    $(document).ajaxComplete(function (event, xhr, settings) {\n      const popup = document.getElementById('lead-popup');\n\n      if (!popup || popup.style.display !== 'flex') {\n        return;\n      }\n\n      let responseText = '';\n\n      try {\n        responseText = xhr.responseText || '';\n      } catch (e) {\n        responseText = '';\n      }\n\n      if (!responseText) {\n        return;\n      }\n\n      const looksLikeFluentSuccess =\n        responseText.indexOf('\"success\":true') !== -1 ||\n        responseText.indexOf('\"success\": true') !== -1 ||\n        responseText.indexOf('fluentform') !== -1 ||\n        responseText.indexOf('fluent_form') !== -1;\n\n      const hasForm19 =\n        responseText.indexOf('\"form_id\":19') !== -1 ||\n        responseText.indexOf('\"form_id\":\"19\"') !== -1 ||\n        responseText.indexOf('\"formId\":19') !== -1 ||\n        responseText.indexOf('\"formId\":\"19\"') !== -1 ||\n        popup.innerHTML.indexOf('fluentform_19') !== -1 ||\n        popup.innerHTML.indexOf('fluent_form_19') !== -1;\n\n      if (looksLikeFluentSuccess && hasForm19) {\n        downloadPDFAfterLeadSubmission();\n      }\n    });\n  }\n\n  bindFluentFormDownloadEvent();\n\n  document.addEventListener('fluentform_submission_success', function (event) {\n    const detail = event && event.detail ? event.detail : {};\n    const formId = detail.formId || detail.form_id || detail.id;\n\n    if (String(formId) === '19') {\n      downloadPDFAfterLeadSubmission();\n    }\n  });\n\n  function getImageDataUrl(url, callback) {\n    const img = new Image();\n    img.crossOrigin = \"anonymous\";\n\n    img.onload = function () {\n      const canvas = document.createElement(\"canvas\");\n      canvas.width = img.naturalWidth;\n      canvas.height = img.naturalHeight;\n\n      const ctx = canvas.getContext(\"2d\");\n      ctx.drawImage(img, 0, 0);\n\n      try {\n        callback(canvas.toDataURL(\"image\/png\"));\n      } catch (e) {\n        callback(null);\n      }\n    };\n\n    img.onerror = function () {\n      callback(null);\n    };\n\n    img.src = url;\n  }\n\n  \/* =========================================================================\n     GENERADOR DE PDF  \u00b7  dise\u00f1o tipo planilla (FECHA \u00b7 AM \u00b7 PM)\n     ========================================================================= *\/\n\n  const PDF_LOGO_URL = \"https:\/\/www.atacama.tours\/wp-content\/uploads\/2022\/08\/logo_1-1.png\";\n\n  \/* Formatea CLP -> \"$4.200.000\" *\/\n  function formatCLP(n) {\n    if (!n || isNaN(n)) return \"\u2014\";\n    return \"$\" + Number(n).toLocaleString(\"es-CL\");\n  }\n\n  \/* Decide si un tour va en columna AM o PM seg\u00fan su slot *\/\n  function tourHalf(slot) {\n    const s = (slot || \"\").toUpperCase();\n    const iAM = s.indexOf(\"AM\");\n    const iPM = s.indexOf(\"PM\");\n    if (iAM === -1 && iPM === -1) return \"AM\";\n    if (iAM === -1) return \"PM\";\n    if (iPM === -1) return \"AM\";\n    return iAM < iPM ? \"AM\" : \"PM\";\n  }\n\n  \/* Divide el nombre: \"Valle de la Luna\" -> {sub:\"Valle de la\", big:\"LUNA\"} *\/\n  function splitTitle(name) {\n    const parts = (name || \"\").split(\" \");\n    if (parts.length <= 1) return { sub: \"\", big: (name || \"\").toUpperCase() };\n    const big = parts.pop();\n    return { sub: parts.join(\" \"), big: big.toUpperCase() };\n  }\n\n  \/* Fecha en espa\u00f1ol: \"mi\u00e9rcoles 13 de enero\" *\/\n  function formatSpanishDate(dateObj) {\n    const dias = [\"domingo\", \"lunes\", \"martes\", \"mi\u00e9rcoles\", \"jueves\", \"viernes\", \"s\u00e1bado\"];\n    const meses = [\"enero\", \"febrero\", \"marzo\", \"abril\", \"mayo\", \"junio\", \"julio\",\n      \"agosto\", \"septiembre\", \"octubre\", \"noviembre\", \"diciembre\"];\n    return `${dias[dateObj.getDay()]} ${dateObj.getDate()} de ${meses[dateObj.getMonth()]}`;\n  }\n\n  \/* Carga un <img> con CORS habilitado *\/\n  function loadImageEl(url, cb) {\n    const img = new Image();\n    img.crossOrigin = \"anonymous\";\n    img.onload = function () { cb(img); };\n    img.onerror = function () { cb(null); };\n    img.src = url;\n  }\n\n  \/* Recorta la imagen tipo \"cover\" (llena sin deformar) a cwPx x chPx *\/\n  function coverCrop(img, cwPx, chPx) {\n    try {\n      const canvas = document.createElement(\"canvas\");\n      canvas.width = cwPx;\n      canvas.height = chPx;\n      const ctx = canvas.getContext(\"2d\");\n      const ir = img.naturalWidth \/ img.naturalHeight;\n      const cr = cwPx \/ chPx;\n      let sw, sh, sx, sy;\n      if (ir > cr) { sh = img.naturalHeight; sw = sh * cr; sx = (img.naturalWidth - sw) \/ 2; sy = 0; }\n      else { sw = img.naturalWidth; sh = sw \/ cr; sx = 0; sy = (img.naturalHeight - sh) \/ 2; }\n      ctx.drawImage(img, sx, sy, sw, sh, 0, 0, cwPx, chPx);\n      \/\/ degradado inferior suave horneado en la imagen (para leer el titulo)\n      var gh = Math.round(chPx * 0.62);\n      var grad = ctx.createLinearGradient(0, chPx - gh, 0, chPx);\n      grad.addColorStop(0, \"rgba(8,31,43,0)\");\n      grad.addColorStop(0.55, \"rgba(8,31,43,0.45)\");\n      grad.addColorStop(1, \"rgba(8,31,43,0.88)\");\n      ctx.fillStyle = grad;\n      ctx.fillRect(0, chPx - gh, cwPx, gh);\n      return canvas.toDataURL(\"image\/png\");\n    } catch (e) {\n      return null;\n    }\n  }\n\n  \/* Agrupa los tours en d\u00edas (mismo criterio que la app) y asigna AM \/ PM *\/\n  function buildDayPlan(list) {\n    const plan = [];\n    for (let i = 0; i < list.length; i += 2) {\n      const chunk = list.slice(i, i + 2);\n      if (chunk.length === 1) {\n        plan.push({ single: chunk[0], am: null, pm: null });\n      } else {\n        let am = null, pm = null;\n        chunk.forEach(t => {\n          const h = tourHalf(t.slot);\n          if (h === \"PM\" && !pm) pm = t;\n          else if (!am) am = t;\n          else pm = t;\n        });\n        plan.push({ single: null, am: am, pm: pm });\n      }\n    }\n    return plan;\n  }\n\n  \/* Carga y recorta (cover) todas las im\u00e1genes necesarias seg\u00fan su celda *\/\n  function loadCroppedImages(jobs, cb) {\n    const out = {};\n    let pending = jobs.length;\n    if (!pending) { cb(out); return; }\n    const SCALE = 12;\n    const HPX = Math.round(32 * SCALE);\n    jobs.forEach(j => {\n      const url = TOUR_IMAGES[j.id];\n      if (!url) { out[j.id] = null; if (--pending === 0) cb(out); return; }\n      loadImageEl(url, function (img) {\n        out[j.id] = img ? coverCrop(img, Math.round(j.w * SCALE), HPX) : null;\n        if (--pending === 0) cb(out);\n      });\n    });\n  }\n\n  function generatePDF() {\n    if (!window.jspdf || !window.jspdf.jsPDF) {\n      alert(\"No se pudo cargar el generador de PDF. Por favor intenta nuevamente.\");\n      return;\n    }\n\n    ITINERARY_CONFIG.passengers = travelers;\n    ITINERARY_CONFIG.travelerName = \"\";\n\n    const list = TOURS\n      .filter(t => selection.has(t.id))\n      .sort((a, b) => (a.type === 'HIGH' ? 1 : -1));\n\n    const plan = buildDayPlan(list);\n\n    \/\/ ancho (mm) de la celda de cada tour, para recortarlo a su proporci\u00f3n exacta\n    const IMG_AREA_W = 144, HALF_W = 71.7;\n    const jobs = [];\n    plan.forEach(d => {\n      if (d.single) jobs.push({ id: d.single.id, w: IMG_AREA_W });\n      else { if (d.am) jobs.push({ id: d.am.id, w: HALF_W }); if (d.pm) jobs.push({ id: d.pm.id, w: HALF_W }); }\n    });\n\n    getImageDataUrl(PDF_LOGO_URL, function (logoData) {\n      loadCroppedImages(jobs, function (images) {\n        renderItineraryPDF(logoData, images, plan);\n      });\n    });\n  }\n\n  function renderItineraryPDF(logoData, images, plan) {\n    const { jsPDF } = window.jspdf;\n    const doc = new jsPDF();\n\n    const pageW = doc.internal.pageSize.getWidth();\n    const pageH = doc.internal.pageSize.getHeight();\n\n    const C = {\n      navy:      [18, 55, 76],\n      navyDark:  [8, 31, 43],\n      orange:    [255, 107, 0],\n      orangeDeep:[214, 88, 0],\n      orangeSoft:[255, 150, 70],\n      muted:     [120, 128, 140],\n      border:    [226, 232, 236],\n      soft:      [241, 245, 249],\n      white:     [255, 255, 255],\n      lightTxt:  [236, 241, 245]\n    };\n    const fill = c => doc.setFillColor(c[0], c[1], c[2]);\n    const draw = c => doc.setDrawColor(c[0], c[1], c[2]);\n    const txt  = c => doc.setTextColor(c[0], c[1], c[2]);\n\n    const margin = 12;\n    const contentW = pageW - margin * 2;\n    const dateW = 42;\n    const imgX = margin + dateW;\n    const imgAreaW = pageW - margin - imgX;\n    const amW = imgAreaW \/ 2, pmW = imgAreaW \/ 2;\n    const amX = imgX, pmX = imgX + amW;\n    const imgH = 32, barH = 8.5, gap = 0.7;\n\n    \/\/ total\n    let total = 0;\n    plan.forEach(d => {\n      [d.single, d.am, d.pm].forEach(t => { if (t) total += (Number(TOUR_PRICES[t.id]) || 0); });\n    });\n\n    let y = 0;\n\n    \/* ---- celda de imagen (recortada) o placeholder + t\u00edtulo superpuesto ---- *\/\n    function drawTourCell(tour, x, w, rowY) {\n      const img = tour ? images[tour.id] : null;\n      if (img) {\n        doc.addImage(img, \"PNG\", x, rowY, w, imgH);\n      } else {\n        fill(C.navy);\n        doc.rect(x, rowY, w, imgH, \"F\");\n        fill(C.navyDark);\n        doc.rect(x, rowY, w, 4, \"F\");\n      }\n      if (tour) {\n        const p = splitTitle(tour.name);\n        if (p.sub) {\n          doc.setFont(\"helvetica\", \"normal\");\n          doc.setFontSize(8);\n          txt(C.lightTxt);\n          doc.text(p.sub, x + w \/ 2, rowY + imgH - 11, { align: \"center\" });\n        }\n        doc.setFont(\"helvetica\", \"bold\");\n        doc.setFontSize(15);\n        txt(C.white);\n        const b = doc.splitTextToSize(p.big, w - 6);\n        doc.text(b, x + w \/ 2, rowY + imgH - 4, { align: \"center\" });\n      }\n    }\n\n    function drawCompactHeader() {\n      fill(C.navy); doc.rect(0, 0, pageW, 15, \"F\");\n      doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(10); txt(C.white);\n      doc.text(\"Itinerario \u00b7 Atacama Tours\", margin, 10);\n      fill(C.orange); doc.rect(0, 15, pageW, 1.4, \"F\");\n    }\n\n    function drawFooter() {\n      draw(C.border); doc.setLineWidth(0.3);\n      doc.line(margin, pageH - 16, pageW - margin, pageH - 16);\n      doc.setFont(\"helvetica\", \"normal\"); doc.setFontSize(8.5); txt(C.muted);\n      doc.text(\"Atacama Tours \u00b7 San Pedro de Atacama\", margin, pageH - 10);\n      doc.text(\"P\u00e1gina \" + doc.internal.getNumberOfPages(), pageW - 30, pageH - 10);\n    }\n\n    function checkPageBreak(space) {\n      if (y + space > pageH - 22) {\n        drawFooter();\n        doc.addPage();\n        drawCompactHeader();\n        y = 26;\n      }\n    }\n\n    \/* ============================= HEADER ============================= *\/\n    if (logoData) doc.addImage(logoData, \"PNG\", pageW \/ 2 - 30, 9, 60, 20);\n\n    const name = (ITINERARY_CONFIG.travelerName || \"\").trim();\n    doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(13); txt(C.navy);\n    doc.text(\"Itinerary\" + (name ? \" \" + name : \"\"), pageW \/ 2, 36, { align: \"center\" });\n    doc.setFont(\"helvetica\", \"normal\"); doc.setFontSize(8); txt(C.muted);\n    doc.text(\"by atacama.tours\", pageW \/ 2, 41, { align: \"center\" });\n    fill(C.orange); doc.roundedRect(margin, 44, contentW, 1.6, 1, 1, \"F\");\n\n    \/* ---- pills: pasajeros \/ n\u00ba de tours \/ total ---- *\/\n    const numTours = plan.reduce(function (a, d) {\n      return a + (d.single ? 1 : 0) + (d.am ? 1 : 0) + (d.pm ? 1 : 0);\n    }, 0);\n    const pillH = 16, gapP = 6, pillY = 49;\n    const pillW = (contentW - gapP * 2) \/ 3;\n    const stats = [\n      [ITINERARY_CONFIG.labelPassengers, String(ITINERARY_CONFIG.passengers)],\n      [ITINERARY_CONFIG.labelTours, String(numTours)],\n      [ITINERARY_CONFIG.labelTotal, formatCLP(total)]\n    ];\n    stats.forEach(function (row, i) {\n      const x = margin + i * (pillW + gapP);\n      fill(C.soft); draw(C.border); doc.setLineWidth(0.3);\n      doc.roundedRect(x, pillY, pillW, pillH, 3, 3, \"FD\");\n      fill(C.orange); doc.roundedRect(x, pillY, 2.2, pillH, 1, 1, \"F\");\n      doc.setFont(\"helvetica\", \"normal\"); doc.setFontSize(6.6); txt(C.muted);\n      doc.text(row[0], x + pillW \/ 2 + 1, pillY + 6, { align: \"center\" });\n      doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(12); txt(C.navy);\n      doc.text(row[1], x + pillW \/ 2 + 1, pillY + 13, { align: \"center\" });\n    });\n    y = pillY + pillH + 9;\n\n    \/* ---- encabezados FECHA \/ AM \/ PM ---- *\/\n    doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(8.5); txt(C.navy);\n    doc.text(\"FECHA\", margin + dateW \/ 2, y, { align: \"center\" });\n    doc.text(\"AM\", amX + amW \/ 2, y, { align: \"center\" });\n    doc.text(\"PM\", pmX + pmW \/ 2, y, { align: \"center\" });\n    y += 3.5;\n\n    \/* ---- fecha base ---- *\/\n    let baseDate = null;\n    if (ITINERARY_CONFIG.startDate) {\n      const p = ITINERARY_CONFIG.startDate.split(\"-\");\n      if (p.length === 3) baseDate = new Date(+p[0], +p[1] - 1, +p[2]);\n    }\n\n    \/* ---- filas ---- *\/\n    plan.forEach(function (d, idx) {\n      checkPageBreak(imgH + barH + 9);\n      const rowY = y;\n\n      \/\/ fecha\n      fill(C.navy); doc.rect(margin, rowY, dateW, imgH, \"F\");\n      fill(C.orange); doc.rect(margin, rowY, 2, imgH, \"F\");\n      doc.setFont(\"helvetica\", \"normal\"); doc.setFontSize(8); txt(C.white);\n      let dateText;\n      if (baseDate) {\n        const dd = new Date(baseDate);\n        dd.setDate(dd.getDate() + idx);\n        dateText = formatSpanishDate(dd);\n      } else {\n        dateText = \"D\u00eda \" + (idx + 1);\n      }\n      const dl = doc.splitTextToSize(dateText, dateW - 8);\n      doc.text(dl, margin + dateW \/ 2 + 1, rowY + imgH \/ 2 - (dl.length - 1) * 2 + 1, { align: \"center\" });\n\n      \/\/ im\u00e1genes\n      if (d.single) {\n        drawTourCell(d.single, imgX, imgAreaW, rowY);\n      } else {\n        drawTourCell(d.am, amX, amW - gap \/ 2, rowY);\n        drawTourCell(d.pm, pmX + gap \/ 2, pmW - gap \/ 2, rowY);\n      }\n\n      \/\/ barra de precios\n      const barY = rowY + imgH + gap;\n      fill(C.orange); doc.rect(margin, barY, contentW, barH, \"F\");\n      fill(C.orangeDeep); doc.rect(margin, barY, dateW, barH, \"F\");\n      doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(7.5); txt(C.white);\n      doc.text(ITINERARY_CONFIG.priceLabel, margin + dateW \/ 2, barY + 5.6, { align: \"center\" });\n      doc.setFontSize(8.5);\n      if (d.single) {\n        doc.text(formatCLP(TOUR_PRICES[d.single.id]), imgX + imgAreaW \/ 2, barY + 5.8, { align: \"center\" });\n      } else {\n        if (d.am) doc.text(formatCLP(TOUR_PRICES[d.am.id]), amX + amW \/ 2, barY + 5.8, { align: \"center\" });\n        if (d.pm) doc.text(formatCLP(TOUR_PRICES[d.pm.id]), pmX + pmW \/ 2, barY + 5.8, { align: \"center\" });\n      }\n\n      \/\/ borde sutil del bloque de imagen\n      draw(C.border); doc.setLineWidth(0.3);\n      doc.rect(margin, rowY, contentW, imgH, \"S\");\n\n      y = barY + barH + 7;\n    });\n\n    \/* ---- bot\u00f3n WhatsApp (opcional) ---- *\/\n    checkPageBreak(20);\n    y += 2;\n    const btnW = 124, btnH = 13, btnX = (pageW - btnW) \/ 2;\n    fill(C.navy); doc.roundedRect(btnX, y, btnW, btnH, 3, 3, \"F\");\n    draw(C.orange); doc.setLineWidth(0.7); doc.roundedRect(btnX, y, btnW, btnH, 3, 3, \"S\");\n    doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(10); txt(C.white);\n    doc.textWithLink(\"Revisar mi itinerario por WhatsApp\",\n      pageW \/ 2 - doc.getTextWidth(\"Revisar mi itinerario por WhatsApp\") \/ 2, y + 8.4,\n      { url: \"https:\/\/api.whatsapp.com\/send?phone=56977834208\" });\n    y += btnH + 9;\n\n    \/* ---- bloque IMPORTANT INFORMATION ---- *\/\n    doc.setFontSize(8);\n    const wrapped = INFO_LINES.map(l => doc.splitTextToSize(l, contentW - 20));\n    const totalLines = wrapped.reduce((s, w) => s + w.length, 0);\n    const blockH = 15 + totalLines * 4 + INFO_LINES.length * 2 + 4;\n\n    checkPageBreak(blockH + 4);\n    const boxY = y;\n    fill(C.navy); doc.roundedRect(margin, boxY, contentW, blockH, 3, 3, \"F\");\n    fill(C.orange); doc.roundedRect(margin, boxY, 2.4, blockH, 1, 1, \"F\");\n    doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(10); txt(C.orangeSoft);\n    doc.text(ITINERARY_CONFIG.infoTitle, margin + 7, boxY + 9);\n    doc.setFont(\"helvetica\", \"normal\"); doc.setFontSize(8);\n    let ty = boxY + 16;\n    wrapped.forEach(function (w) {\n      fill(C.orange); doc.circle(margin + 8, ty - 1.2, 0.7, \"F\");\n      txt(C.lightTxt); doc.text(w, margin + 11, ty);\n      ty += w.length * 4 + 2;\n    });\n\n    y = boxY + blockH;\n\n    drawFooter();\n    doc.save(\"itinerario-atacama.pdf\");\n  }\n\n  \/* -----------------------------------------------------------------------------\n     NOTA: para rellenar nombre \/ pasajeros \/ fecha desde el Fluent Form, setea\n     los valores antes de generar el PDF, p.ej:\n       ITINERARY_CONFIG.travelerName = \"Alexander Busch\";\n       ITINERARY_CONFIG.passengers   = 2;\n       ITINERARY_CONFIG.startDate    = \"2026-01-13\";\n     Puedes hacerlo dentro de downloadPDFAfterLeadSubmission() antes de generatePDF().\n     --------------------------------------------------------------------------- *\/\n<\/script>\n\n\n\n<style>\n\/* 1. CONTENEDOR FAQ (100% NATIVO Y RESPONSIVO) *\/\n#planner-faqs * {\n    box-sizing: border-box !important;\n}\n\n#planner-faqs {\n    width: 100% !important;\n    max-width: 850px;\n    margin: 60px auto;\n    padding: 0 15px;\n    font-family: 'Open Sans', sans-serif;\n    color: #12374c;\n    overflow-x: hidden;\n}\n\n\/* 2. T\u00cdTULO ESTANDARIZADO H2 *\/\n#planner-faqs h2 {\n    font-family: 'Poppins', sans-serif !important;\n    text-align: center;\n    color: #12374c;\n    font-weight: 800;\n    line-height: 1.2;\n    margin-bottom: 40px;\n    letter-spacing: -0.5px;\n    font-size: clamp(26px, 4vw, 40px) !important;\n    width: 100%;\n}\n\n\/* 3. ACORDE\u00d3N Y TARJETAS *\/\n.faq-accordion {\n    width: 100%;\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n}\n\n.faq-item {\n    width: 100%;\n    border: 1px solid #e5e7eb;\n    background-color: #ffffff;\n    border-radius: 12px;\n    overflow: hidden;\n    transition: all 0.3s ease;\n}\n\n\/* Estado Activo *\/\n.faq-item.active {\n    border-color: #FF8700;\n    box-shadow: 0 8px 20px rgba(255, 135, 0, 0.15);\n}\n\n.faq-question {\n    width: 100%;\n    background: transparent;\n    border: none;\n    padding: 20px 15px !important;\n    text-align: left;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    cursor: pointer;\n    font-family: 'Poppins', sans-serif !important;\n    font-size: 16px;\n    font-weight: 700;\n    color: #111827;\n    transition: all 0.3s ease;\n    outline: none;\n    white-space: normal !important;\n}\n\n.faq-question span {\n    flex: 1 1 auto;\n    min-width: 0;\n    display: block;\n    white-space: normal !important;\n    word-wrap: break-word;\n    overflow-wrap: break-word;\n    line-height: 1.4;\n    padding-right: 15px;\n}\n\n\/* INTERACCI\u00d3N *\/\n.faq-question:hover,\n.faq-item.active .faq-question {\n    background-color: #FF8700 !important;\n    color: #ffffff !important;\n}\n\n\/* ICONO *\/\n.faq-question svg {\n    width: 20px;\n    height: 20px;\n    stroke: #12374c;\n    flex-shrink: 0;\n    transition: transform 0.4s ease, stroke 0.3s ease;\n}\n\n.faq-question:hover svg,\n.faq-item.active svg {\n    stroke: #ffffff !important;\n}\n\n.faq-item.active svg {\n    transform: rotate(180deg);\n}\n\n\/* RESPUESTAS *\/\n.faq-answer {\n    display: none;\n    width: 100%;\n    padding: 20px 15px !important;\n    font-family: 'Open Sans', sans-serif !important;\n    font-weight: 400 !important;\n    font-size: 16px !important;\n    line-height: 1.6;\n    color: #4b5563;\n    background-color: #ffffff;\n    word-wrap: break-word;\n    overflow-wrap: break-word;\n}\n\n.faq-item.active .faq-answer {\n    display: block;\n    animation: omFade 0.3s ease-out;\n}\n\n@keyframes omFade {\n    from { opacity: 0; transform: translateY(-5px); }\n    to { opacity: 1; transform: translateY(0); }\n}\n\n\/* CTA FINAL *\/\n.om-final-cta {\n    text-align: center;\n    margin-top: 60px;\n}\n\n.om-final-cta h2 {\n    margin-bottom: 18px !important;\n}\n\n.om-final-cta p {\n    font-family: 'Open Sans', sans-serif;\n    font-size: 16px;\n    line-height: 1.7;\n    color: #12374c;\n    max-width: 650px;\n    margin: 0 auto 30px auto;\n}\n\n.om-final-btn {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    gap: 10px;\n\n    background: #12374c;\n    color: #ffffff !important;\n\n    padding: 18px 34px;\n\n    border-radius: 14px;\n\n    font-family: 'Poppins', sans-serif;\n    font-size: 15px;\n    font-weight: 700;\n    text-transform: uppercase;\n\n    transition: all 0.3s ease;\n\n    box-shadow: 0 12px 28px rgba(5,48,153,0.18);\n}\n\n.om-final-btn:hover {\n    transform: translateY(-3px);\n    background: #12374c;\n    box-shadow: 0 18px 36px rgba(5,48,153,0.24);\n}\n\n@media (max-width: 480px) {\n\n    #planner-faqs {\n        padding: 0 10px;\n    }\n\n    .om-final-btn {\n        width: 100%;\n        padding: 17px 20px;\n        font-size: 14px;\n    }\n}\n<\/style>\n\n<section id=\"planner-faqs\">\n\n  <h2>Preguntas frecuentes sobre tu itinerario en Atacama<\/h2>\n\n  <div class=\"faq-accordion\">\n\n    <!-- 1 -->\n    <div class=\"faq-item\">\n      <button class=\"faq-question\">\n          <span>\u00bfCu\u00e1ntos d\u00edas necesito para conocer San Pedro de Atacama?<\/span>\n\n          <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n              <polyline points=\"6 9 12 15 18 9\"><\/polyline>\n          <\/svg>\n      <\/button>\n\n      <div class=\"faq-answer\">\n        Lo m\u00ednimo recomendable son 4 d\u00edas, que te permiten hacer tres tours con un d\u00eda de aclimataci\u00f3n. Lo ideal son 5 a 6 d\u00edas si quieres conocer los principales atractivos sin prisa. El planificador te ayuda a distribuirlos seg\u00fan tu tiempo.\n      <\/div>\n    <\/div>\n\n    <!-- 2 -->\n    <div class=\"faq-item\">\n      <button class=\"faq-question\">\n          <span>\u00bfC\u00f3mo organiza los tours este planificador?<\/span>\n\n          <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n              <polyline points=\"6 9 12 15 18 9\"><\/polyline>\n          <\/svg>\n      <\/button>\n\n      <div class=\"faq-answer\">\n        La herramienta considera tres factores: altitud (para favorecer aclimataci\u00f3n progresiva y evitar el mal de puna), horarios (evitando combinaciones imposibles como madrugadas con jornadas intensas) y nivel de exigencia f\u00edsica (para que no termines agotado a mitad de viaje).\n      <\/div>\n    <\/div>\n\n    <!-- 3 -->\n    <div class=\"faq-item\">\n      <button class=\"faq-question\">\n          <span>\u00bfPor qu\u00e9 la altitud importa tanto en San Pedro?<\/span>\n\n          <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n              <polyline points=\"6 9 12 15 18 9\"><\/polyline>\n          <\/svg>\n      <\/button>\n\n      <div class=\"faq-answer\">\n        San Pedro est\u00e1 a 2.400 msnm, pero algunos tours suben a m\u00e1s de 4.000 msnm (Geyser del Tatio: 4.320 msnm). Sin aclimataci\u00f3n previa, esto puede provocar mal de puna. El planificador ordena tus d\u00edas para que subas en altura gradualmente.\n      <\/div>\n    <\/div>\n\n    <!-- 4 -->\n    <div class=\"faq-item\">\n      <button class=\"faq-question\">\n          <span>\u00bfPuedo modificar el itinerario despu\u00e9s de generarlo?<\/span>\n\n          <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n              <polyline points=\"6 9 12 15 18 9\"><\/polyline>\n          <\/svg>\n      <\/button>\n\n      <div class=\"faq-answer\">\n        S\u00ed. Puedes ajustar tu selecci\u00f3n de tours y regenerar el plan todas las veces que necesites antes de descargar el PDF. La herramienta es flexible y se adapta a tus preferencias.\n      <\/div>\n    <\/div>\n\n    <!-- 5 -->\n    <div class=\"faq-item\">\n      <button class=\"faq-question\">\n          <span>\u00bfSe pueden combinar varios tours en un mismo d\u00eda?<\/span>\n\n          <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n              <polyline points=\"6 9 12 15 18 9\"><\/polyline>\n          <\/svg>\n      <\/button>\n\n      <div class=\"faq-answer\">\n        No siempre, el sistema eval\u00faa horarios, duraci\u00f3n y tiempos de recuperaci\u00f3n para proponer combinaciones viables y evitar jornadas excesivas o dif\u00edciles de sostener.\n      <\/div>\n    <\/div>\n\n    <!-- 6 -->\n    <div class=\"faq-item\">\n      <button class=\"faq-question\">\n          <span>\u00bfQu\u00e9 incluye el PDF que descargo?<\/span>\n\n          <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n              <polyline points=\"6 9 12 15 18 9\"><\/polyline>\n          <\/svg>\n      <\/button>\n\n      <div class=\"faq-answer\">\n        Un itinerario profesional organizado por d\u00edas, con horarios, informaci\u00f3n de cada tour, niveles de altitud y recomendaciones clave para tu viaje. Dise\u00f1ado para que llegues con todo ordenado y sin sorpresas.\n      <\/div>\n    <\/div>\n\n    <!-- 7 -->\n    <div class=\"faq-item\">\n      <button class=\"faq-question\">\n          <span>\u00bfCrear el itinerario implica una reserva?<\/span>\n\n          <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n              <polyline points=\"6 9 12 15 18 9\"><\/polyline>\n          <\/svg>\n      <\/button>\n\n      <div class=\"faq-answer\">\n        No. El itinerario es una herramienta de planificaci\u00f3n previa que te permite organizar tu viaje y revisar la disponibilidad de cada tour antes de tomar una decisi\u00f3n.\n      <\/div>\n    <\/div>\n\n  <\/div>\n\n  <!-- CTA FINAL -->\n  <div class=\"om-final-cta\">\n\n      <h2>\u00bfListo para vivir tu itinerario?<\/h2>\n\n      <p>\n          Una vez tengas tu plan armado, escr\u00edbenos. Coordinamos fechas,\n          horarios y resolvemos cualquier duda antes de que viajes.\n      <\/p>\n\n      <a href=\"https:\/\/api.whatsapp.com\/send\/?phone=56977834208\" target=\"_blank\" rel=\"noopener nofollow\" class=\"om-final-btn\">\n          Hablar con un asesor por WhatsApp \u2192\n      <\/a>\n\n  <\/div>\n\n<\/section>\n\n<script>\ndocument.querySelectorAll('.faq-question').forEach(btn => {\n  btn.addEventListener('click', () => {\n    const item = btn.parentElement;\n    item.classList.toggle('active');\n  });\n});\n<\/script>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Planificador de itinerarios en San Pedro de Atacama \u2139\ufe0f El itinerario se organiza considerando horarios, esfuerzo y altura para evitar errores comunes en Atacama. Dise\u00f1a tu itinerario para vivir San Pedro de Atacama Una herramienta gratuita para organizar tu viaje d\u00eda por d\u00eda, considerando horarios, altitud y nivel de esfuerzo. Hecha por gente que conoce [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":11040,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"postBodyCss":"","postBodyMargin":[],"postBodyPadding":[],"postBodyBackground":{"backgroundType":"classic","gradient":""},"footnotes":""},"class_list":["post-10978","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/www.atacama.tours\/en\/wp-json\/wp\/v2\/pages\/10978","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.atacama.tours\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.atacama.tours\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.atacama.tours\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.atacama.tours\/en\/wp-json\/wp\/v2\/comments?post=10978"}],"version-history":[{"count":15,"href":"https:\/\/www.atacama.tours\/en\/wp-json\/wp\/v2\/pages\/10978\/revisions"}],"predecessor-version":[{"id":14156,"href":"https:\/\/www.atacama.tours\/en\/wp-json\/wp\/v2\/pages\/10978\/revisions\/14156"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.atacama.tours\/en\/wp-json\/wp\/v2\/media\/11040"}],"wp:attachment":[{"href":"https:\/\/www.atacama.tours\/en\/wp-json\/wp\/v2\/media?parent=10978"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}