{"id":16574,"date":"2025-11-21T10:15:43","date_gmt":"2025-11-21T10:15:43","guid":{"rendered":"https:\/\/royalairportconcierge.com\/?page_id=16574"},"modified":"2026-04-10T08:54:00","modified_gmt":"2026-04-10T08:54:00","slug":"book-service","status":"publish","type":"page","link":"https:\/\/royalairportconcierge.com\/fr\/book-service\/","title":{"rendered":"Service des livres"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"16574\" class=\"elementor elementor-16574\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-fc69d79 elementor-section-height-min-height elementor-section-boxed elementor-section-height-default elementor-section-items-middle\" data-id=\"fc69d79\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ce9935f\" data-id=\"ce9935f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-aa22234 elementor-widget elementor-widget-heading\" data-id=\"aa22234\" 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\">Book Service<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d44e7cb elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"d44e7cb\" 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-0835a17 elementor-widget elementor-widget-heading\" data-id=\"0835a17\" 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<span class=\"elementor-heading-title elementor-size-default\">\n<b>Someone from our team will respond immediately during extended business hours<\/b><\/span>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6e38621 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6e38621\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-099e2f8\" data-id=\"099e2f8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a0f90cc elementor-widget elementor-widget-jet-form-builder-form\" data-id=\"a0f90cc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"jet-form-builder-form.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<link rel='stylesheet' id='wp-block-library-css' href='https:\/\/royalairportconcierge.com\/wp-includes\/css\/dist\/block-library\/style.min.css?ver=6.9.4' media='all' \/>\n<style id=\"jet-form-builder-18048-inline-css\"><\/style><form  class=\"jet-form-builder layout-column submit-type-ajax\" action=\"https:\/\/royalairportconcierge.com\/fr\/wp-json\/wp\/v2\/pages\/16574\/?Nt429Z=WFj3336JB3d8&amp;method=reload\" method=\"POST\" data-form-id=\"18048\" data-layout=\"column\" enctype=\"multipart\/form-data\" novalidate=\"null\" ssr_validation_method=\"rest\"><input type=\"hidden\" id=\"_wpnonce\" name=\"_wpnonce\" value=\"aa1233364a\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/fr\/wp-json\/wp\/v2\/pages\/16574\" \/>\r\n<input type=\"hidden\" name=\"_jfb_current_render_states[]\" value=\"DEFAULT.STATE\" data-jfb-sync \/><input type=\"hidden\" class=\"jet-form-builder__field hidden-field\" name=\"_jet_engine_booking_form_id\" data-field-name=\"_jet_engine_booking_form_id\" value=\"18048\">\n<input type=\"hidden\" class=\"jet-form-builder__field hidden-field\" name=\"_jet_engine_refer\" data-field-name=\"_jet_engine_refer\" value=\"https:\/\/royalairportconcierge.com\/fr\/wp-json\/wp\/v2\/pages\/16574\/\">\n<input type=\"hidden\" class=\"jet-form-builder__field hidden-field\" name=\"__queried_post_id\" data-field-name=\"__queried_post_id\" value=\"16574\">\n<div  class=\"jet-form-builder-row field-type-text-field\" >\n<div class=\"jet-form-builder__label\">\r\n<div class=\"jet-form-builder__label-text\">Passenger Name <span class=\"jet-form-builder__required\">*<\/span><\/div><\/div><div class=\"jet-form-builder__field-wrap\">\n\t\t\t\t<input placeholder=\"John Doe (*)\" required=\"required\" name=\"name\" id=\"name\" type=\"text\" data-field-name=\"name\" class=\"jet-form-builder__field text-field namerow\" data-jfb-sync=\"null\" autocomplete=\"off_mydjstYc\">\n\t\t\t\t\t<\/div>\n<\/div>\n\n<div  class=\"jet-form-builder-row field-type-text-field\" >\n<div class=\"jet-form-builder__label\">\r\n<div class=\"jet-form-builder__label-text\">Email <span class=\"jet-form-builder__required\">*<\/span><\/div><\/div><div class=\"jet-form-builder__field-wrap\">\n\t\t\t\t<input placeholder=\"youremail@domain.com (*)\" required=\"required\" name=\"email\" id=\"email\" type=\"email\" data-field-name=\"email\" class=\"jet-form-builder__field text-field emailrow\" data-jfb-sync=\"null\" autocomplete=\"off_ZMaupR7v\">\n\t\t\t\t\t<\/div>\n<\/div>\n\n<div  class=\"jet-form-builder-row field-type-text-field\" >\n<div class=\"jet-form-builder__label\">\r\n<div class=\"jet-form-builder__label-text\">Phone <span class=\"jet-form-builder__required\">*<\/span><\/div><\/div><div class=\"jet-form-builder__field-wrap\">\n\t\t\t\t<input placeholder=\"+1 (202) 555-5151 (*)\" required=\"required\" name=\"phone\" id=\"phone\" type=\"tel\" data-field-name=\"phone\" class=\"jet-form-builder__field text-field phonerow\" data-jfb-sync=\"null\" autocomplete=\"off_aSC3mJ1c\">\n\t\t\t\t\t<\/div>\n<\/div>\n\n\n<div id=\"passenger-luggage-selector\">\n    <div id=\"passenger-luggage-display\">\n        <div>\n            <span class=\"passengers-display\">1 Passenger<\/span> - \n            <span class=\"luggage-display\">0 Luggage<\/span>\n        <\/div>\n        <span class=\"arrow\">\u25bc<\/span>\n    <\/div>\n    <div id=\"passenger-luggage-dropdown\">\n        <div class=\"counter-row\">\n            <span class=\"counter-label\">Passengers<\/span>\n            <div class=\"counter-controls\">\n                <button type=\"button\" class=\"minus-passenger\">-<\/button>\n                <span class=\"value\" id=\"passenger-count\">1<\/span>\n                <button type=\"button\" class=\"plus-passenger\">+<\/button>\n            <\/div>\n        <\/div>\n        <div class=\"counter-row\">\n            <span class=\"counter-label\">Luggage<\/span>\n            <div class=\"counter-controls\">\n                <button type=\"button\" class=\"minus-luggage\">-<\/button>\n                <span class=\"value\" id=\"luggage-count\">0<\/span>\n                <button type=\"button\" class=\"plus-luggage\">+<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n\n\n\n<div  class=\"jet-form-builder-row field-type-number-field\" >\n<div class=\"jet-form-builder__field-wrap\">\n\t\t<input type=\"number\" class=\"jet-form-builder__field text-field npassengersrow\" placeholder=\"1\" name=\"number_of_passengers\" data-field-name=\"number_of_passengers\" id=\"number_of_passengers\" data-jfb-sync=\"null\">\n\t<\/div>\n<\/div>\n\n<div  class=\"jet-form-builder-row field-type-number-field\" >\n<div class=\"jet-form-builder__field-wrap\">\n\t\t<input type=\"number\" class=\"jet-form-builder__field text-field nluggage\" placeholder=\"0\" name=\"number_of_luggage\" data-field-name=\"number_of_luggage\" id=\"number_of_luggage\" data-jfb-sync=\"null\">\n\t<\/div>\n<\/div>\n\n\n<input type=\"hidden\" class=\"captcha-token\" name=\"_captcha_token\" value=\"\"\/>\n\n\n<div  class=\"jet-form-builder-row field-type-repeater-field\" >\n<div class=\"jet-form-builder__label\">\r\n<div class=\"jet-form-builder__label-text\">Flight Legs<\/div><\/div><div class=\"jet-form-builder__field-wrap\"><div data-repeater=\"1\" data-field-name=\"flight_legs\" name=\"flight_legs\"  class=\"jet-form-builder-repeater jet-form-builder__field flightlegtitle\" data-jfb-sync=\"null\">\n<template class=\"jet-form-builder-repeater__initial\"><div class=\"jet-form-builder-repeater__row\" data-repeater-row=\"1\"><div class=\"jet-form-builder-repeater__row-fields\">\n<div  class=\"jet-form-builder-row field-type-select-field wp-block-jet-forms-select-field\">\n<div class=\"jet-form-builder__label\">\r\n<div class=\"jet-form-builder__label-text\">Type of Service <span class=\"jet-form-builder__required\">*<\/span><\/div><\/div><div class=\"jet-form-builder__field-wrap\">\n\t<select class=\"jet-form-builder__field select-field typeservicerow\" required=\"required\" name=\"flight_legs[__i__][type_of_service]\" data-field-name=\"type_of_service\" id=\"flight_legs___i___type_of_service\" data-jfb-sync=\"null\">\n\t\t<option value=\"Type of service\"  data-calculate=\"Type of service\">Type of service<\/option><option value=\"Arrival\" >Arrival<\/option><option value=\"Departure\" >Departure<\/option><option value=\"Connection\" >Connection<\/option>\t<\/select>\n<\/div>\n<\/div>\n\n<div  class=\"jet-form-builder-row field-type-date-field\" >\n<div class=\"jet-form-builder__label\">\r\n<div class=\"jet-form-builder__label-text\">Date <span class=\"jet-form-builder__required\">*<\/span><\/div><\/div><input class=\"jet-form-builder__field date-field datelegrow\" required=\"required\" name=\"flight_legs[__i__][date]\" type=\"date\" data-field-name=\"date\" id=\"flight_legs___i___date\" data-jfb-sync=\"null\">\n<\/div>\n\n<div  class=\"jet-form-builder-row field-type-select-field wp-block-jet-forms-select-field\">\n<div class=\"jet-form-builder__label\">\r\n<div class=\"jet-form-builder__label-text\">Airline<\/div><\/div><div class=\"jet-form-builder__field-wrap\">\n\t<select class=\"jet-form-builder__field select-field\" name=\"flight_legs[__i__][aerolineas]\" data-field-name=\"aerolineas\" id=\"flight_legs___i___aerolineas\" data-jfb-sync=\"null\">\n\t\t\t<\/select>\n<\/div>\n<\/div>\n\n<div  data-value=\"[{&quot;id&quot;:6158,&quot;conditions&quot;:[{&quot;__visible&quot;:true,&quot;field&quot;:&quot;date&quot;,&quot;operator&quot;:&quot;equal&quot;,&quot;value&quot;:&quot;connection&quot;}],&quot;to_set&quot;:&quot;test&quot;},{&quot;id&quot;:4736,&quot;conditions&quot;:[{&quot;__visible&quot;:true,&quot;value&quot;:&quot;&quot;}],&quot;to_set&quot;:&quot;&quot;}]\" class=\"jet-form-builder-row field-type-text-field\" >\n<div class=\"jet-form-builder__label\">\r\n<div class=\"jet-form-builder__label-text\">Flight<\/div><\/div><div class=\"jet-form-builder__field-wrap\">\n\t\t\t\t<input placeholder=\"Flight: 613\" name=\"flight_legs[__i__][flight]\" id=\"flight_legs___i___flight\" type=\"text\" data-field-name=\"flight\" class=\"jet-form-builder__field text-field flightrow\" data-jfb-sync=\"null\" autocomplete=\"off_TZ43Othe\">\n\t\t\t\t\t<\/div>\n<\/div>\n\n<div  class=\"jet-form-builder-row field-type-text-field\" >\n<div class=\"jet-form-builder__label\">\r\n<div class=\"jet-form-builder__label-text\">Arriving Flight <\/div><\/div><div class=\"jet-form-builder__field-wrap\">\n\t\t\t\t<input placeholder=\"Flight: AA613\" name=\"flight_legs[__i__][arriving_flight]\" id=\"flight_legs___i___arriving_flight\" type=\"text\" data-field-name=\"arriving_flight\" class=\"jet-form-builder__field text-field arrivingflightrow\" data-jfb-sync=\"null\" autocomplete=\"off_2TXtk46a\">\n\t\t\t\t\t<\/div>\n<\/div>\n\n\n<input type=\"hidden\" class=\"jet-form-builder__field hidden-field fromairport\" name=\"flight_legs[__i__][fromairport]\" data-field-name=\"fromairport\" data-jfb-sync=\"null\" value=\"16574\">\n\n\n\n<div  class=\"jet-form-builder-row field-type-select-field wp-block-jet-forms-select-field\">\n<div class=\"jet-form-builder__label\">\r\n<div class=\"jet-form-builder__label-text\">Airline<\/div><\/div><div class=\"jet-form-builder__field-wrap\">\n\t<select class=\"jet-form-builder__field select-field aerolineas_connect\" name=\"flight_legs[__i__][aerolineas_connect]\" data-field-name=\"aerolineas_connect\" id=\"flight_legs___i___aerolineas_connect\" data-jfb-sync=\"null\">\n\t\t\t<\/select>\n<\/div>\n<\/div>\n\n<div  class=\"jet-form-builder-row field-type-text-field\" >\n<div class=\"jet-form-builder__label\">\r\n<div class=\"jet-form-builder__label-text\">Departing Flight<\/div><\/div><div class=\"jet-form-builder__field-wrap\">\n\t\t\t\t<input placeholder=\"Flight: AA613\" name=\"flight_legs[__i__][departing_flight]\" id=\"flight_legs___i___departing_flight\" type=\"text\" data-field-name=\"departing_flight\" class=\"jet-form-builder__field text-field departingflightrow\" data-jfb-sync=\"null\" autocomplete=\"off_lpb4B7CZ\">\n\t\t\t\t\t<\/div>\n<\/div>\n\n\n<input type=\"hidden\" class=\"jet-form-builder__field hidden-field toairport\" name=\"flight_legs[__i__][toairport]\" data-field-name=\"toairport\" data-jfb-sync=\"null\">\n\n\n\n\n<input type=\"hidden\" class=\"jet-form-builder__field hidden-field\" name=\"flight_legs[__i__][airport]\" data-field-name=\"airport\" data-jfb-sync=\"null\">\n\n\n<\/div><div class=\"jet-form-builder-repeater__row-remove\"><button type=\"button\" class=\"jet-form-builder-repeater__remove\">&times;<\/button><\/div><\/div><\/template>\n<div class=\"jet-form-builder-repeater__items\"><\/div><div class=\"jet-form-builder-repeater__actions\">\n                <button type=\"button\" class=\"jet-form-builder-repeater__new\">Add new<\/button>\n                <\/div><\/div><\/div>\n<\/div>\n\n<div  class=\"jet-form-builder-row field-type-textarea-field\" >\n<div class=\"jet-form-builder__label\">\r\n<div class=\"jet-form-builder__label-text\">Special Instructions (Optional)<\/div><\/div><div class=\"jet-form-builder__field-wrap\">\n\t\t<textarea class=\"jet-form-builder__field textarea-field specialrow\" placeholder=\"Add any special requests or additional information here...\" name=\"special_instructions_optional\" data-field-name=\"special_instructions_optional\" id=\"special_instructions_optional\" data-jfb-sync=\"null\"><\/textarea>\n\t<\/div>\n<\/div>\n\n<div  class=\"jet-form-builder-row field-type-submit-field\" >\n\t<div data-type=\"submit\" class=\"jet-form-builder__action-button-wrapper jet-form-builder__submit-wrap\">\n\t<button class=\"jet-form-builder__action-button jet-form-builder__submit submit-type-ajax\" type=\"submit\">Submit Booking Request<\/button>\n\t<\/div>\n\t\n<\/div>\n\n\n\n\n<input type=\"hidden\" class=\"jet-form-builder__field hidden-field\" name=\"url_anterior\" data-field-name=\"url_anterior\" data-jfb-sync=\"null\">\n\n\t<div class=\"jet-form-builder-messages-wrap\" data-form-id=\"18048\"><\/div>\n<\/form>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ce48f7c elementor-widget elementor-widget-shortcode\" data-id=\"ce48f7c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">    <script>\r\n        document.addEventListener('DOMContentLoaded', function () {\r\n\r\n            function bindJetFormBuilderTracking(attempt) {\r\n                const currentAttempt = attempt || 0;\r\n\r\n                if (typeof JetFormBuilder === 'undefined' || !JetFormBuilder.events || typeof JetFormBuilder.events.subscribe !== 'function') {\r\n                    if (currentAttempt < 20) {\r\n                        window.setTimeout(function () {\r\n                            bindJetFormBuilderTracking(currentAttempt + 1);\r\n                        }, 300);\r\n                    } else {\r\n                        console.warn('JetFormBuilder no detectado');\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                console.log('PostHog + JetFormBuilder (identify + booking + webhook) activo');\r\n\r\n                JetFormBuilder.events.subscribe(\r\n                    'submit.success',\r\n                    function (response, form) {\r\n\r\n                        let email = null;\r\n                        let name = null;\r\n                        let serviceDate = null;\r\n                        let airport = null;\r\n                        let bookingId = null;\r\n\r\n                        \/\/ Extraer campos del formulario\r\n                        Object.keys(form.fields).forEach(function (key) {\r\n                            const field = form.fields[key];\r\n\r\n                            if (field.type === 'email') {\r\n                                email = field.value;\r\n                            }\r\n\r\n                            if (key.toLowerCase().includes('name')) {\r\n                                name = field.value;\r\n                            }\r\n\r\n                            if (key.toLowerCase().includes('date')) {\r\n                                serviceDate = field.value;\r\n                            }\r\n\r\n                            if (key.toLowerCase().includes('airport')) {\r\n                                airport = field.value;\r\n                            }\r\n                        });\r\n\r\n                        if (!email) {\r\n                            console.warn('Booking sin email \u2014 abortado');\r\n                            return;\r\n                        }\r\n\r\n                        if (typeof posthog === 'undefined') {\r\n                            console.warn('PostHog no cargado');\r\n                            return;\r\n                        }\r\n\r\n                        \/* =========================\r\n                           1. IDENTIFY (YA VALIDADO)\r\n                           ========================= *\/\r\n                        posthog.identify(email, {\r\n                            email: email,\r\n                            name: name || null,\r\n                            source: 'JetForm Booking'\r\n                        });\r\n\r\n                        \/* =========================\r\n                           2. EVENTO BOOKING COMPLETED\r\n                           ========================= *\/\r\n                        posthog.capture('booking_completed', {\r\n                            booking_id: bookingId || 'pending',\r\n                            booker_email: email,\r\n                            service_date: serviceDate,\r\n                            airport: airport,\r\n                            status: 'pending',\r\n                            created_at: new Date().toISOString()\r\n                        });\r\n\r\n                        \/* =========================\r\n                           3. WEBHOOK (URL PENDIENTE)\r\n                           ========================= *\/\r\n                        fetch('PENDIENTE_BACKEND_WEBHOOK_URL', {\r\n                            method: 'POST',\r\n                            headers: {\r\n                                'Content-Type': 'application\/json'\r\n                            },\r\n                            body: JSON.stringify({\r\n                                event: 'booking_submitted',\r\n                                distinct_id: email, \/\/ CR\u00cdTICO: mismo que identify\r\n                                properties: {\r\n                                    booking_id: bookingId || 'pending',\r\n                                    booker_email: email,\r\n                                    service_date: serviceDate,\r\n                                    airport: airport,\r\n                                    status: 'pending',\r\n                                    created_at: new Date().toISOString()\r\n                                }\r\n                            })\r\n                        }).catch(err => {\r\n                            console.error('Error enviando webhook booking:', err);\r\n                        });\r\n\r\n                    }\r\n                );\r\n            }\r\n\r\n            bindJetFormBuilderTracking(0);\r\n        });\r\n    <\/script>\r\n\r\n\r\n\r\n    <script>\r\n        document.addEventListener(\"DOMContentLoaded\", function () {\r\n\r\n            \/\/ === FUNCI\u00d3N QUE ACTIVA EL DATEPICKER NATIVO ===\r\n            function forceNativeDatepicker(field) {\r\n                \/\/ Para evitar duplicar handlers\r\n                field.addEventListener(\"click\", (e) => {\r\n                    try {\r\n                        if (e.isTrusted && field.showPicker) {\r\n                            field.showPicker();\r\n                        }\r\n                    } catch (err) {\r\n                        \/\/ Evitar que crashee si es un clic sint\u00e9tico\r\n                    }\r\n                });\r\n            }\r\n\r\n            \/\/ === APLICAR A TODOS LOS CAMPOS YA CARGADOS ===\r\n            function initDateFields() {\r\n                const dateFields = document.querySelectorAll('input[type=\"date\"].datelegrow');\r\n                dateFields.forEach(field => forceNativeDatepicker(field));\r\n            }\r\n\r\n            initDateFields();\r\n\r\n            \/\/ === MUTATION OBSERVER PARA REPEATERS ===\r\n            const observer = new MutationObserver(() => {\r\n                initDateFields(); \/\/ Cada vez que JetFormBuilder agrega un campo nuevo, lo activamos\r\n            });\r\n\r\n            observer.observe(document.body, {\r\n                childList: true,\r\n                subtree: true\r\n            });\r\n\r\n        });\r\n    <\/script>\r\n\r\n\r\n    <script src=\"https:\/\/code.jquery.com\/jquery-3.7.1.min.js\"><\/script>\r\n    <script>\r\n        jQuery(function ($) {\r\n\r\n            \/\/ Copiar arriving -> flight para una fila concreta\r\n            function copyValue($row) {\r\n                const $arriving = $row.find('.arrivingflightrow');\r\n                const $flight = $row.find('.flightrow');\r\n\r\n                if ($arriving.length && $flight.length) {\r\n                    $flight.val($arriving.val());\r\n                }\r\n            }\r\n\r\n            \/\/ Activar listeners en una fila\r\n            function initRow($row) {\r\n                const $arriving = $row.find('.arrivingflightrow');\r\n                if (!$arriving.length) return;\r\n\r\n                \/\/ Copiar inicialmente\r\n                copyValue($row);\r\n\r\n                \/\/ Escuchar cambios\r\n                $arriving.off('.flightcopy').on('input.flightcopy change.flightcopy', function () {\r\n                    copyValue($row);\r\n                });\r\n            }\r\n\r\n            \/\/ Inicializar filas existentes al cargar\r\n            $('.jet-form-builder-repeater__row').each(function () {\r\n                initRow($(this));\r\n            });\r\n\r\n            \/\/ Detectar filas nuevas con MutationObserver (no invasivo)\r\n            const observer = new MutationObserver(function (mutations) {\r\n                mutations.forEach(function (mutation) {\r\n                    $(mutation.addedNodes).each(function () {\r\n                        const $node = $(this);\r\n\r\n                        if ($node.hasClass('jet-form-builder-repeater__row')) {\r\n                            \/\/ JetForm crea inputs con un peque\u00f1o delay\r\n                            setTimeout(() => initRow($node), 10);\r\n                        }\r\n                    });\r\n                });\r\n            });\r\n\r\n            observer.observe(document.body, { childList: true, subtree: true });\r\n\r\n        });\r\n    <\/script>\r\n\r\n\r\n    <!-- MENSAJE FIJO DESPU\u00c9S DEL BOT\u00d3N DE ENV\u00cdO -->\r\n    <style>\r\n        \/* Icono por defecto (desktop) *\/\r\n        #fixed-jfb-success-message .jfb-success-icon {\r\n            width: 26px;\r\n            height: 26px;\r\n            border-radius: 50%;\r\n            background: #000;\r\n            color: #fff;\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: center;\r\n            font-weight: bold;\r\n            font-size: 14px;\r\n            flex-shrink: 0;\r\n        }\r\n\r\n        \/* Mobile *\/\r\n        @media (max-width: 768px) {\r\n            #fixed-jfb-success-message .jfb-success-icon {\r\n                width: 35px;\r\n                height: 35px;\r\n                font-size: 20px;\r\n            }\r\n        }\r\n    <\/style>\r\n\r\n    <script>\r\n        (function () {\r\n            window.apiFormAllowMessageScroll = false;\r\n\r\n            var successHtml = '\\\r\n                                        <div id=\"fixed-jfb-success-message\" style=\"\\\r\n                                          margin-top: 20px;\\\r\n                                          padding: 16px;\\\r\n                                          border-radius: 10px;\\\r\n                                          background: #ffffff;\\\r\n                                          border: 1px solid #ddd;\\\r\n                                          box-shadow: rgba(0, 0, 0, 0.08) 0px 4px 12px;\\\r\n                                          display: flex;\\\r\n                                          align-items: center;\\\r\n                                          gap: 12px;\\\r\n                                          color: #000;\\\r\n                                          font-size: 14px;\\\r\n                                        \">\\\r\n                                          <div class=\"jfb-success-icon\">\u2713<\/div>\\\r\n                                          <div>\\\r\n                                            <strong style=\"display:block; font-size:15px;\">Booking request submitted successfully!<\/strong>\\\r\n                                            Someone from our team will get in touch within an hour during extended business hours.\\\r\n                                          <\/div>\\\r\n                                        <\/div>';\r\n\r\n            function insertFixedMessage() {\r\n                if (document.getElementById('fixed-jfb-success-message')) return;\r\n\r\n                var submitWrapper = document.querySelector('.jet-form-builder-row.field-type-submit-field');\r\n                if (!submitWrapper || typeof submitWrapper.insertAdjacentHTML !== 'function') return;\r\n\r\n                submitWrapper.insertAdjacentHTML('afterend', successHtml);\r\n            }\r\n\r\n            var observer = new MutationObserver(function (muts) {\r\n                for (var i = 0; i < muts.length; i++) {\r\n                    var m = muts[i];\r\n                    if (!m.addedNodes) continue;\r\n\r\n                    for (var j = 0; j < m.addedNodes.length; j++) {\r\n                        var node = m.addedNodes[j];\r\n                        if (node.nodeType !== 1) continue;\r\n\r\n                        var isSuccess = node.classList?.contains('jet-form-builder-message--success') || node.querySelector?.('.jet-form-builder-message--success');\r\n                        var isError = node.classList?.contains('jet-form-builder-message--error') || node.querySelector?.('.jet-form-builder-message--error');\r\n\r\n                        if (isSuccess || isError) {\r\n                            if (isSuccess) {\r\n                                insertFixedMessage();\r\n                            }\r\n\r\n                            if (window.apiFormAllowMessageScroll === true) {\r\n                                \/\/ Microanimacion de scroll hacia el mensaje de exito o error solo cuando el submit vino del modal\r\n                                setTimeout(function () {\r\n                                    var target = (node.classList && node.classList.contains('jet-form-builder-message'))\r\n                                        ? node\r\n                                        : (node.querySelector ? node.querySelector('.jet-form-builder-message') : null);\r\n                                    if (!target) target = node;\r\n\r\n                                    if (isSuccess && document.getElementById('fixed-jfb-success-message')) {\r\n                                        target = document.getElementById('fixed-jfb-success-message');\r\n                                    }\r\n\r\n                                    if (target && typeof jQuery !== 'undefined') {\r\n                                        jQuery('html, body').animate({ scrollTop: jQuery(target).offset().top - 150 }, 500);\r\n                                    } else if (target) {\r\n                                        target.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n                                    }\r\n\r\n                                    window.apiFormAllowMessageScroll = false;\r\n                                }, 300);\r\n                            } else {\r\n                                window.apiFormAllowMessageScroll = false;\r\n                            }\r\n\r\n                            return;\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n\r\n            observer.observe(document.body, { childList: true, subtree: true });\r\n\r\n            if (document.querySelector('.jet-form-builder-message--success')) {\r\n                insertFixedMessage();\r\n            }\r\n\r\n            \/\/ Si ya hay un mensaje al cargar, no forzamos scroll automatico\r\n            var exMsg = document.querySelector('.jet-form-builder-message--success, .jet-form-builder-message--error');\r\n            if (exMsg) {\r\n                window.apiFormAllowMessageScroll = false;\r\n            }\r\n\r\n\r\n\r\n        })();\r\n    <\/script>\r\n\r\n\r\n    <!--CAMBIAR ICONOS DEL TYPE OF SERVICE-->\r\n    <html lang=\"es\">\r\n\r\n    <head>\r\n        <meta charset=\"UTF-8\">\r\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n        <title>Selector de Servicio<\/title>\r\n\r\n        <!-- FONT AWESOME -->\r\n        <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.5.0\/css\/all.min.css\">\r\n\r\n        <style>\r\n            \/* Ocultar los selects originales pero mantenerlos funcionales *\/\r\n            .jet-form-builder__field-wrap {\r\n                position: relative;\r\n            }\r\n\r\n            .typeservicerow {\r\n                position: absolute !important;\r\n                left: -9999px !important;\r\n                opacity: 0 !important;\r\n                pointer-events: none !important;\r\n            }\r\n\r\n            \/* Select personalizado *\/\r\n            .custom-service-select {\r\n                width: 100%;\r\n                padding: 12px 15px;\r\n                border: 2px solid #e0e0e0;\r\n                border-radius: 8px;\r\n                background: white;\r\n                cursor: pointer;\r\n                display: flex;\r\n                align-items: center;\r\n                gap: 12px;\r\n                font-size: 14px;\r\n                transition: all 0.3s ease;\r\n                position: relative;\r\n                z-index: 9998 !important;\r\n            }\r\n\r\n            .custom-service-select:hover {\r\n                border-color: #007cba;\r\n            }\r\n\r\n            .custom-service-select.open {\r\n                border-color: #007cba;\r\n                border-bottom-left-radius: 0;\r\n                border-bottom-right-radius: 0;\r\n                z-index: 9999 !important;\r\n            }\r\n\r\n            .selected-service {\r\n                display: flex;\r\n                align-items: center;\r\n                gap: 12px;\r\n                flex-grow: 1;\r\n            }\r\n\r\n            .service-icon i {\r\n                font-size: 20px;\r\n                color: #555;\r\n            }\r\n\r\n            .dropdown-arrow {\r\n                transition: transform 0.3s ease;\r\n                color: #666;\r\n            }\r\n\r\n            .open .dropdown-arrow {\r\n                transform: rotate(180deg);\r\n            }\r\n\r\n            .custom-options-container {\r\n                position: absolute;\r\n                top: 100%;\r\n                left: 0;\r\n                width: 100%;\r\n                background: white;\r\n                border: 2px solid #007cba;\r\n                border-top: none;\r\n                border-bottom-left-radius: 8px;\r\n                border-bottom-right-radius: 8px;\r\n                z-index: 10000 !important;\r\n                display: none;\r\n                box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);\r\n                max-height: 300px;\r\n                overflow-y: auto;\r\n            }\r\n\r\n            .custom-service-option {\r\n                padding: 12px 15px;\r\n                display: flex;\r\n                align-items: center;\r\n                gap: 12px;\r\n                cursor: pointer;\r\n                transition: background-color 0.2s;\r\n                border-bottom: 1px solid #f0f0f0;\r\n                background: white;\r\n            }\r\n\r\n            .custom-service-option:last-child {\r\n                border-bottom: none;\r\n            }\r\n\r\n            .custom-service-option:hover {\r\n                background-color: #f8f9fa;\r\n            }\r\n\r\n            .custom-service-option.selected {\r\n                background-color: #f0f7ff;\r\n            }\r\n\r\n            .custom-service-container {\r\n                position: relative;\r\n                margin-bottom: 15px;\r\n            }\r\n\r\n            .select2-container,\r\n            .jet-form-builder,\r\n            .elementor-widget-container {\r\n                z-index: 1 !important;\r\n                position: relative;\r\n            }\r\n        <\/style>\r\n    <\/head>\r\n\r\n    <body>\r\n\r\n        <div class=\"elementor-widget-container\">\r\n            <!-- Aqu\u00ed va tu JetForm -->\r\n        <\/div>\r\n\r\n        <script>\r\n            document.addEventListener('DOMContentLoaded', function () {\r\n\r\n                \/\/ ICONOS MODERNOS (Font Awesome)\r\n                const serviceIcons = {\r\n                    '': { icon: '<i class=\"fa-solid fa-list\"><\/i>', text: 'Type of service' },\r\n                    'Arrival': { icon: '<i class=\"fa-solid fa-plane-arrival\"><\/i>', text: 'Arrival' },\r\n                    'Departure': { icon: '<i class=\"fa-solid fa-plane-departure\"><\/i>', text: 'Departure' },\r\n                    'Connection': { icon: '<i class=\"fa-solid fa-right-left\"><\/i>', text: 'Connection' }\r\n                };\r\n\r\n                function createCustomSelect(originalSelect) {\r\n                    const wrapper = originalSelect.parentElement;\r\n\r\n                    const customContainer = document.createElement('div');\r\n                    customContainer.className = 'custom-service-container';\r\n\r\n                    const customSelect = document.createElement('div');\r\n                    customSelect.className = 'custom-service-select';\r\n\r\n                    const selectedService = document.createElement('div');\r\n                    selectedService.className = 'selected-service';\r\n\r\n                    const icon = document.createElement('div');\r\n                    icon.className = 'service-icon';\r\n                    icon.innerHTML = serviceIcons[''].icon;\r\n\r\n                    const text = document.createElement('span');\r\n                    text.className = 'selected-text';\r\n                    text.textContent = serviceIcons[''].text;\r\n\r\n                    const arrow = document.createElement('div');\r\n                    arrow.className = 'dropdown-arrow';\r\n                    arrow.textContent = '\u25bc';\r\n\r\n                    selectedService.appendChild(icon);\r\n                    selectedService.appendChild(text);\r\n                    customSelect.appendChild(selectedService);\r\n                    customSelect.appendChild(arrow);\r\n\r\n                    const optionsContainer = document.createElement('div');\r\n                    optionsContainer.className = 'custom-options-container';\r\n\r\n                    Array.from(originalSelect.options).forEach(option => {\r\n                        if (option.value === '') return;\r\n\r\n                        const customOption = document.createElement('div');\r\n                        customOption.className = 'custom-service-option';\r\n                        customOption.setAttribute('data-value', option.value);\r\n\r\n                        const optionIcon = document.createElement('div');\r\n                        optionIcon.className = 'service-icon';\r\n                        optionIcon.innerHTML = serviceIcons[option.value]?.icon || '<i class=\"fa-solid fa-list\"><\/i>';\r\n\r\n                        const optionText = document.createElement('span');\r\n                        optionText.textContent = option.text;\r\n\r\n                        customOption.appendChild(optionIcon);\r\n                        customOption.appendChild(optionText);\r\n                        optionsContainer.appendChild(customOption);\r\n\r\n                        customOption.addEventListener('click', function () {\r\n                            const value = this.getAttribute('data-value');\r\n                            const service = serviceIcons[value];\r\n\r\n                            if (service) {\r\n                                icon.innerHTML = service.icon;\r\n                                text.textContent = service.text;\r\n\r\n                                originalSelect.value = value;\r\n\r\n                                customSelect.classList.remove('open');\r\n                                optionsContainer.style.display = 'none';\r\n\r\n                                ['change', 'input', 'click'].forEach(eventType => {\r\n                                    const event = new Event(eventType, { bubbles: true });\r\n                                    originalSelect.dispatchEvent(event);\r\n                                });\r\n\r\n                                optionsContainer.querySelectorAll('.custom-service-option').forEach(opt => {\r\n                                    opt.classList.remove('selected');\r\n                                });\r\n                                this.classList.add('selected');\r\n                            }\r\n                        });\r\n                    });\r\n\r\n                    customContainer.appendChild(customSelect);\r\n                    customContainer.appendChild(optionsContainer);\r\n                    wrapper.appendChild(customContainer);\r\n\r\n                    customSelect.addEventListener('click', function (e) {\r\n                        e.stopPropagation();\r\n                        const isOpen = customSelect.classList.contains('open');\r\n\r\n                        document.querySelectorAll('.custom-service-select').forEach(sel => sel.classList.remove('open'));\r\n                        document.querySelectorAll('.custom-options-container').forEach(opt => opt.style.display = 'none');\r\n\r\n                        if (!isOpen) {\r\n                            customSelect.classList.add('open');\r\n                            optionsContainer.style.display = 'block';\r\n                            optionsContainer.style.zIndex = '10000';\r\n                        }\r\n                    });\r\n\r\n                    originalSelect.addEventListener('change', function () {\r\n                        const value = this.value;\r\n                        const service = serviceIcons[value];\r\n\r\n                        if (service) {\r\n                            icon.innerHTML = service.icon;\r\n                            text.textContent = service.text;\r\n\r\n                            optionsContainer.querySelectorAll('.custom-service-option').forEach(opt => {\r\n                                opt.classList.remove('selected');\r\n                                if (opt.getAttribute('data-value') === value) opt.classList.add('selected');\r\n                            });\r\n                        }\r\n                    });\r\n\r\n                    if (originalSelect.value && originalSelect.value !== '') {\r\n                        const service = serviceIcons[originalSelect.value];\r\n                        if (service) {\r\n                            icon.innerHTML = service.icon;\r\n                            text.textContent = service.text;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                function initCustomSelects() {\r\n                    const serviceSelects = document.querySelectorAll('select.typeservicerow');\r\n\r\n                    serviceSelects.forEach(select => {\r\n                        if (!select.parentElement.querySelector('.custom-service-container')) {\r\n                            createCustomSelect(select);\r\n                        }\r\n                    });\r\n                }\r\n\r\n                const observer = new MutationObserver(function (mutations) {\r\n                    let shouldUpdate = false;\r\n\r\n                    mutations.forEach(function (mutation) {\r\n                        if (mutation.addedNodes.length) {\r\n                            mutation.addedNodes.forEach(function (node) {\r\n                                if (node.nodeType === 1) {\r\n                                    if (node.querySelector && node.querySelector('select.typeservicerow')) shouldUpdate = true;\r\n                                    if (node.matches && node.matches('select.typeservicerow')) shouldUpdate = true;\r\n                                }\r\n                            });\r\n                        }\r\n                    });\r\n\r\n                    if (shouldUpdate) setTimeout(initCustomSelects, 100);\r\n                });\r\n\r\n                initCustomSelects();\r\n\r\n                observer.observe(document.body, {\r\n                    childList: true,\r\n                    subtree: true\r\n                });\r\n\r\n                document.addEventListener('click', function () {\r\n                    document.querySelectorAll('.custom-service-select').forEach(sel => sel.classList.remove('open'));\r\n                    document.querySelectorAll('.custom-options-container').forEach(opt => opt.style.display = 'none');\r\n                });\r\n\r\n            });\r\n        <\/script>\r\n\r\n    <\/body>\r\n\r\n    <\/html>\r\n\r\n\r\n    <!--\/* ---------------------------------------------\r\n   BLOQUEO DE ESPACIOS PARA CAMPOS DE VUELO\r\n   (Detecta filas a\u00f1adidas o visibles con MutationObserver)\r\n   --------------------------------------------- *\/-->\r\n    <script>\r\n\r\n\r\n        (function ($) {\r\n\r\n            \/\/ Adjuntar bloqueo a un input individual (evita duplicados)\r\n            function attachSpaceBlockerToInput($input) {\r\n                if (!$input || !$input.length) return;\r\n                if ($input.attr('data-space-blocked') === '1') return;\r\n                $input.attr('data-space-blocked', '1');\r\n\r\n                \/\/ prevenir tecla espacio\r\n                $input.on('keydown.spaceBlock', function (e) {\r\n                    if (e.key === ' ') {\r\n                        e.preventDefault();\r\n                    }\r\n                });\r\n\r\n                \/\/ manejar pegado (paste) y input\r\n                $input.on('paste.spaceBlock', function (e) {\r\n                    \/\/ Leer clipboard (async) y sanitizar\r\n                    e.preventDefault();\r\n                    const clipboard = (e.originalEvent || e).clipboardData || window.clipboardData;\r\n                    let text = clipboard ? clipboard.getData('text') : '';\r\n                    text = text.replace(\/\\s+\/g, '');\r\n                    \/\/ insertar en la posici\u00f3n del cursor si es necesario\r\n                    const el = this;\r\n                    const start = el.selectionStart || 0;\r\n                    const end = el.selectionEnd || 0;\r\n                    const cur = $(this).val() || '';\r\n                    const newVal = cur.slice(0, start) + text + cur.slice(end);\r\n                    $(this).val(newVal);\r\n                    \/\/ ubicar cursor al final del texto pegado\r\n                    setTimeout(() => {\r\n                        el.setSelectionRange(start + text.length, start + text.length);\r\n                        $(el).trigger('input'); \/\/ por si hay l\u00f3gica dependiente\r\n                    }, 0);\r\n                });\r\n\r\n                \/\/ eliminar espacios en input (typing, autocompletes, etc.)\r\n                $input.on('input.spaceBlock', function () {\r\n                    const old = $(this).val() || '';\r\n                    const clean = old.replace(\/\\s+\/g, '');\r\n                    if (old !== clean) {\r\n                        $(this).val(clean);\r\n                        \/\/ ajustar cursor al final (seguro)\r\n                        try {\r\n                            const el = this;\r\n                            const pos = clean.length;\r\n                            el.setSelectionRange(pos, pos);\r\n                        } catch (err) { }\r\n                    }\r\n                });\r\n            }\r\n\r\n            \/\/ Buscar y adjuntar bloqueo en una fila concreta (row jQuery element)\r\n            function attachSpaceBlockerToRow($row) {\r\n                if (!$row || !$row.length) return;\r\n                \/\/ buscar inputs por las clases que mostraste en el DOM\r\n                const selectors = 'input.flightrow, input.arrivingflightrow, input.departingflightrow';\r\n                $row.find(selectors).each(function () {\r\n                    attachSpaceBlockerToInput($(this));\r\n                });\r\n            }\r\n\r\n            \/\/ Adjuntar a todas las filas ya existentes\r\n            function attachToExistingRows() {\r\n                $('.jet-form-builder-repeater__row').each(function () {\r\n                    attachSpaceBlockerToRow($(this));\r\n                });\r\n            }\r\n\r\n            \/\/ Observer para nuevas filas o cambios dentro del repeater\r\n            function initRepeaterObserver() {\r\n                const container = document.querySelector('.jet-form-builder-repeater');\r\n                if (!container) return;\r\n\r\n                const observer = new MutationObserver(function (mutations) {\r\n                    mutations.forEach(function (mutation) {\r\n                        \/\/ Si se agregan nodos: buscar inputs dentro de ellos\r\n                        if (mutation.addedNodes && mutation.addedNodes.length) {\r\n                            mutation.addedNodes.forEach(function (node) {\r\n                                if (node.nodeType !== 1) return;\r\n                                const $node = $(node);\r\n\r\n                                \/\/ Si la fila completa fue a\u00f1adida\r\n                                if ($node.hasClass('jet-form-builder-repeater__row')) {\r\n                                    attachSpaceBlockerToRow($node);\r\n                                } else {\r\n                                    \/\/ por si a\u00f1adieron un fragmento que contiene filas o inputs\r\n                                    $node.find('.jet-form-builder-repeater__row').each(function () {\r\n                                        attachSpaceBlockerToRow($(this));\r\n                                    });\r\n                                    \/\/ tambi\u00e9n buscar inputs sueltos dentro del subtree\r\n                                    $node.find('input.flightrow, input.arrivingflightrow, input.departingflightrow').each(function () {\r\n                                        attachSpaceBlockerToInput($(this));\r\n                                    });\r\n                                }\r\n                            });\r\n                        }\r\n\r\n                        \/\/ Si cambian atributos (p. ej. display style) -> buscar visibilidad nueva\r\n                        if (mutation.type === 'attributes' && mutation.target) {\r\n                            const $t = $(mutation.target);\r\n                            \/\/ si el target es un campo input que nos interesa\r\n                            if ($t.is('input.flightrow, input.arrivingflightrow, input.departingflightrow')) {\r\n                                attachSpaceBlockerToInput($t);\r\n                            } else {\r\n                                \/\/ si cambiaron atributos en una fila, reintentar attach\r\n                                if ($t.closest('.jet-form-builder-repeater__row').length) {\r\n                                    attachSpaceBlockerToRow($t.closest('.jet-form-builder-repeater__row'));\r\n                                }\r\n                            }\r\n                        }\r\n                    });\r\n                });\r\n\r\n                observer.observe(container, {\r\n                    childList: true,\r\n                    subtree: true,\r\n                    attributes: true,\r\n                    attributeFilter: ['style', 'class', 'hidden', 'data-index']\r\n                });\r\n\r\n                \/\/ Tambi\u00e9n retornar el observer por si quieres detenerlo despu\u00e9s\r\n                return observer;\r\n            }\r\n\r\n            \/\/ Tambi\u00e9n atamos al evento 'click' del add new (por compatibilidad)\r\n            $(document).on('click', '.jet-form-builder-repeater__new', function () {\r\n                \/\/ Esperar un poco para que la nueva fila se inyecte y luego adjuntar\r\n                setTimeout(function () {\r\n                    const $last = $('.jet-form-builder-repeater__row').last();\r\n                    attachSpaceBlockerToRow($last);\r\n                }, 80);\r\n            });\r\n\r\n            \/\/ Adem\u00e1s, cuando cambie type_of_service en una fila, re-intentar attach (por si muestra inputs condicionales)\r\n            $(document).on('change', 'select[name*=\"type_of_service\"], select.typeservicerow', function () {\r\n                const $row = $(this).closest('.jet-form-builder-repeater__row');\r\n                \/\/ peque\u00f1o delay para que la l\u00f3gica que muestra\/oculta campos haga su trabajo\r\n                setTimeout(function () {\r\n                    attachSpaceBlockerToRow($row);\r\n                }, 50);\r\n            });\r\n\r\n            \/\/ Inicializaci\u00f3n: adjuntar a las filas existentes y arrancar observer\r\n            attachToExistingRows();\r\n            initRepeaterObserver();\r\n\r\n        })(jQuery);\r\n\r\n\r\n    <\/script>\r\n\r\n    <script src=\"https:\/\/code.jquery.com\/jquery-3.7.1.min.js\"><\/script>\r\n    <script>\r\n        jQuery(document).ready(function ($) {\r\n            \/\/ Retrasamos la ejecuci\u00f3n 2 segundos\r\n            setTimeout(function () {\r\n                \/\/ Seleccionamos la fila que contiene el textarea\r\n                var $textareaRow = $('#special_instructions_optional').closest('.jet-form-builder-row');\r\n\r\n                if ($textareaRow.length) {\r\n                    \/\/ 1. Ocultamos el label original\r\n                    $textareaRow.find('.jet-form-builder__label').hide();\r\n\r\n                    \/\/ 2. Ocultamos el textarea al inicio\r\n                    $textareaRow.find('.jet-form-builder__field-wrap').hide();\r\n\r\n                    \/\/ 3. Creamos un toggle din\u00e1mico\r\n                    var $toggle = $('<div class=\"accordion-toggle\">Special Instructions (Optional)<\/div>');\r\n                    $toggle.css({\r\n                        'cursor': 'pointer',\r\n                        'background': '#f1f5f9',\r\n                        'padding': '10px 15px',\r\n                        'border': '1px solid #dce1e6',\r\n                        'border-radius': '5px',\r\n                        'font-weight': 'bold',\r\n                        'margin-bottom': '5px'\r\n                    });\r\n\r\n                    \/\/ Insertamos el toggle antes del textarea\r\n                    $textareaRow.find('.jet-form-builder__field-wrap').before($toggle);\r\n\r\n                    \/\/ 4. Click para mostrar\/ocultar el textarea\r\n                    $toggle.on('click', function () {\r\n                        $textareaRow.find('.jet-form-builder__field-wrap').slideToggle(300, function () {\r\n                            \/\/ Cambiar color de fondo seg\u00fan estado\r\n                            $toggle.css('background', $(this).is(':visible') ? '#e2e8f0' : '#f1f5f9');\r\n                        });\r\n                    });\r\n                }\r\n            }, 500); \/\/ 2000 ms = 2 segundos\r\n        });\r\n    <\/script>\r\n\r\n\r\n    <script>\r\n        document.addEventListener('DOMContentLoaded', () => {\r\n            const select = document.querySelector('.typeservicerow');\r\n            const display = document.getElementById('customSelectDisplay');\r\n            const optionsContainer = document.getElementById('customOptions');\r\n            const displayText = document.getElementById('customSelectText');\r\n            if (!select || !display || !optionsContainer || !displayText) return;\r\n\r\n            const options = optionsContainer.querySelectorAll('.custom-option');\r\n\r\n            \/\/ Funci\u00f3n para actualizar selecci\u00f3n\r\n            function selectOption(value, text) {\r\n                displayText.textContent = text;\r\n                select.value = value;\r\n                select.dispatchEvent(new Event('change'));\r\n                options.forEach(opt => opt.classList.remove('selected'));\r\n                const selected = optionsContainer.querySelector(`[data-value=\"${value}\"]`);\r\n                if (selected) selected.classList.add('selected');\r\n                optionsContainer.style.display = 'none';\r\n            }\r\n\r\n            \/\/ Inicializar con valor actual\r\n            if (select.value && select.value !== 'typeofservice') {\r\n                const text = select.options[select.selectedIndex].text;\r\n                selectOption(select.value, text);\r\n            }\r\n\r\n            \/\/ Mostrar\/ocultar opciones\r\n            display.addEventListener('click', (e) => {\r\n                e.stopPropagation();\r\n                optionsContainer.style.display = optionsContainer.style.display === 'flex' ? 'none' : 'flex';\r\n                optionsContainer.style.flexDirection = 'column';\r\n            });\r\n\r\n            \/\/ Selecci\u00f3n de opci\u00f3n\r\n            options.forEach(option => {\r\n                option.addEventListener('click', (e) => {\r\n                    e.stopPropagation();\r\n                    selectOption(option.dataset.value, option.textContent.trim());\r\n                });\r\n            });\r\n\r\n            \/\/ Cerrar dropdown al hacer click fuera\r\n            document.addEventListener('click', () => {\r\n                optionsContainer.style.display = 'none';\r\n            });\r\n        });\r\n    <\/script>\r\n\r\n    <!-- Mostrar y ocultar campos del type service y airline -->\r\n\r\n    <style>\r\n        .jfb-hidden {\r\n            visibility: hidden !important;\r\n            height: 0 !important;\r\n            margin: 0 !important;\r\n            padding-top: 0 !important;\r\n            padding-bottom: 0 !important;\r\n            overflow: hidden !important;\r\n        }\r\n\r\n        .jfb-hidden>* {\r\n            display: none !important;\r\n        }\r\n    <\/style>\r\n\r\n    <script src=\"https:\/\/code.jquery.com\/jquery-3.7.1.min.js\"><\/script>\r\n    <script>\r\n        jQuery(function ($) {\r\n\r\n            \/* -------------------------------\r\n               CONTENEDOR REAL DE CADA CAMPO\r\n            --------------------------------*\/\r\n            function fieldContainer($el) {\r\n                var $c = $el.closest('.jet-form-builder-field');\r\n                if ($c.length) return $c;\r\n\r\n                $c = $el.closest('.jet-form-builder-row');\r\n                if ($c.length) return $c;\r\n\r\n                return $el.parent();\r\n            }\r\n\r\n            \/* -------------------------------\r\n               OCULTAR SOLO CAMPOS DE VUELO\r\n            --------------------------------*\/\r\n            function hideFlightInputs($row, excludeFields = []) {\r\n\r\n                if (!excludeFields.includes('flightrow')) {\r\n                    fieldContainer($row.find('.flightrow')).addClass('jfb-hidden');\r\n                }\r\n                if (!excludeFields.includes('arrivingflightrow')) {\r\n                    fieldContainer($row.find('.arrivingflightrow')).addClass('jfb-hidden');\r\n                }\r\n                if (!excludeFields.includes('departingflightrow')) {\r\n                    fieldContainer($row.find('.departingflightrow')).addClass('jfb-hidden');\r\n                }\r\n                if (!excludeFields.includes('aerolineasconnectrow')) {\r\n                    fieldContainer($row.find('.aerolineas_connect')).addClass('jfb-hidden');\r\n                }\r\n            }\r\n\r\n            \/* -------------------------------\r\n               MOSTRAR \/ OCULTAR CAMPOS\r\n            --------------------------------*\/\r\n            function showFlight($row) {\r\n                fieldContainer($row.find('.flightrow')).removeClass('jfb-hidden');\r\n            }\r\n\r\n            function showArrivingDeparting($row) {\r\n                fieldContainer($row.find('.arrivingflightrow')).removeClass('jfb-hidden');\r\n                fieldContainer($row.find('.departingflightrow')).removeClass('jfb-hidden');\r\n            }\r\n\r\n            function forceHideArrivingDeparting($row) {\r\n                fieldContainer($row.find('.arrivingflightrow')).addClass('jfb-hidden');\r\n                fieldContainer($row.find('.departingflightrow')).addClass('jfb-hidden');\r\n            }\r\n\r\n            function forceHideFlight($row) {\r\n                fieldContainer($row.find('.flightrow')).addClass('jfb-hidden');\r\n            }\r\n\r\n            function showAerolineasConnect($row) {\r\n                fieldContainer($row.find('.aerolineas_connect')).removeClass('jfb-hidden');\r\n            }\r\n\r\n            function forceHideAerolineasConnect($row) {\r\n                fieldContainer($row.find('.aerolineas_connect')).addClass('jfb-hidden');\r\n            }\r\n\r\n            \/* -------------------------------\r\n               L\u00d3GICA PRINCIPAL\r\n            --------------------------------*\/\r\n            function applyLogic(row) {\r\n                var $row = $(row);\r\n                var val = $row.find('.typeservicerow').val();\r\n\r\n                \/\/ Ocultar campos de vuelo seg\u00fan tipo\r\n                if (val === \"Connection\") {\r\n                    hideFlightInputs($row, ['arrivingflightrow', 'departingflightrow']);\r\n                } else {\r\n                    hideFlightInputs($row);\r\n                }\r\n\r\n                \/\/ Fecha siempre visible\r\n                fieldContainer($row.find('.datelegrow')).removeClass('jfb-hidden').show();\r\n\r\n                if (val === \"Arrival\" || val === \"Departure\") {\r\n                    showFlight($row);\r\n                    forceHideArrivingDeparting($row);\r\n                } else if (val === \"Connection\") {\r\n                    showArrivingDeparting($row);\r\n                    forceHideFlight($row);\r\n                }\r\n\r\n                \/* -----------------------------------\r\n                   aerolineas_connect \u2192 regla correcta\r\n                   Arrival \u2192 oculto\r\n                   Departure \u2192 oculto\r\n                   Connection \u2192 visible\r\n                -----------------------------------*\/\r\n                if (val === \"Arrival\" || val === \"Departure\") {\r\n                    forceHideAerolineasConnect($row);\r\n                } else {\r\n                    showAerolineasConnect($row); \/\/ incluye Connection\r\n                }\r\n            }\r\n\r\n            \/* INICIALIZAR FILAS EXISTENTES *\/\r\n            $('.jet-form-builder-repeater__row').each(function () {\r\n                applyLogic(this);\r\n            });\r\n\r\n            \/* SELECT CHANGE *\/\r\n            $(document).on('change', '.typeservicerow', function () {\r\n                applyLogic($(this).closest('.jet-form-builder-repeater__row'));\r\n            });\r\n\r\n            \/* OBSERVER *\/\r\n            var container = document.querySelector('.jet-form-builder-repeater__items');\r\n\r\n            if (container) {\r\n                var observer = new MutationObserver(function (muts) {\r\n                    muts.forEach(function (m) {\r\n                        m.addedNodes.forEach(function (node) {\r\n\r\n                            if (node.nodeType !== 1) return;\r\n                            if (!node.classList.contains('jet-form-builder-repeater__row')) return;\r\n\r\n                            var $node = $(node);\r\n\r\n                            hideFlightInputs($node);\r\n\r\n                            setTimeout(function () {\r\n                                applyLogic($node);\r\n                            }, 25);\r\n                        });\r\n                    });\r\n                });\r\n\r\n                observer.observe(container, { childList: true, subtree: true });\r\n            }\r\n\r\n            \/* AUTO ADD NEW *\/\r\n            setTimeout(function () {\r\n                var btn = document.querySelector('.jet-form-builder-repeater__new');\r\n                if (btn) btn.click();\r\n            }, 300);\r\n\r\n        });\r\n    <\/script>\r\n\r\n\r\n    <style>\r\n        \/* Desaparece el bot\u00f3n y su contenedor sin dejar huecos *\/\r\n        .d-none {\r\n            display: none !important;\r\n            visibility: hidden !important;\r\n            height: 0 !important;\r\n            margin: 0 !important;\r\n            padding: 0 !important;\r\n        }\r\n\r\n        \/* CENTRAR EL BOT\u00d3N DE SUBMIT *\/\r\n        .jet-form-builder-row.field-type-submit-field,\r\n        .jet-form-builder__submit-wrap {\r\n            display: flex !important;\r\n            justify-content: center !important;\r\n            width: 100% !important;\r\n        }\r\n\r\n        \/* Forzar el mensaje de validacion de vuelos a una nueva fila completa *\/\r\n        .flight-leg-api-info-persistent {\r\n            display: block !important;\r\n            width: 100% !important;\r\n            max-width: 100% !important;\r\n            flex: 0 0 100% !important;\r\n            margin-top: 34px !important;\r\n            text-align: center !important;\r\n            background: transparent !important;\r\n            background-color: transparent !important;\r\n            box-shadow: none !important;\r\n            border: 0 !important;\r\n        }\r\n\r\n        .flight-leg-api-info-persistent>div {\r\n            display: block;\r\n            width: 100%;\r\n            line-height: 1.3;\r\n            background: transparent !important;\r\n            background-color: transparent !important;\r\n            box-shadow: none !important;\r\n            border: 0 !important;\r\n        }\r\n\r\n        .flight-leg-api-info-persistent>div[style*=\"dc3545\"] {\r\n            color: #ef3340 !important;\r\n            font-size: clamp(20px, 2vw, 26px) !important;\r\n            font-weight: 700 !important;\r\n            font-style: italic !important;\r\n        }\r\n\r\n        \/* Validacion flotante tipo Bootstrap *\/\r\n        .jet-form-builder .email-bootstrap-feedback,\r\n        .jet-form-builder .required-bootstrap-feedback {\r\n            position: absolute;\r\n            top: calc(100% + 10px);\r\n            left: 16px;\r\n            display: block;\r\n            min-width: 250px;\r\n            max-width: min(320px, calc(100% - 16px));\r\n            padding: 10px 14px 10px 46px;\r\n            border-radius: 4px;\r\n            border: 1px solid rgba(0, 0, 0, 0.28);\r\n            background: #fff;\r\n            box-shadow: 0 6px 16px rgba(0, 0, 0, 0.18);\r\n            font-size: 14px;\r\n            line-height: 1.35;\r\n            color: #333333;\r\n            opacity: 0;\r\n            visibility: hidden;\r\n            transform: translateY(-4px);\r\n            transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.18s ease;\r\n            z-index: 50;\r\n            pointer-events: none;\r\n        }\r\n\r\n        .jet-form-builder .email-bootstrap-feedback::before,\r\n        .jet-form-builder .required-bootstrap-feedback::before {\r\n            content: \"\";\r\n            position: absolute;\r\n            left: 16px;\r\n            top: -8px;\r\n            width: 14px;\r\n            height: 14px;\r\n            background: #ffffff;\r\n            border-left: 1px solid rgba(0, 0, 0, 0.28);\r\n            border-top: 1px solid rgba(0, 0, 0, 0.28);\r\n            transform: rotate(45deg);\r\n        }\r\n\r\n        .jet-form-builder .email-bootstrap-feedback::after,\r\n        .jet-form-builder .required-bootstrap-feedback::after {\r\n            content: \"!\";\r\n            position: absolute;\r\n            left: 12px;\r\n            top: 50%;\r\n            width: 22px;\r\n            height: 22px;\r\n            margin-top: -11px;\r\n            border-radius: 4px;\r\n            background: #ff8a00;\r\n            color: #ffffff;\r\n            font-size: 16px;\r\n            font-weight: 700;\r\n            line-height: 22px;\r\n            text-align: center;\r\n        }\r\n\r\n        .jet-form-builder .email-bootstrap-feedback.is-visible,\r\n        .jet-form-builder .required-bootstrap-feedback.is-visible {\r\n            opacity: 1;\r\n            visibility: visible;\r\n            transform: translateY(0);\r\n        }\r\n\r\n        .jet-form-builder input[type=\"email\"].is-invalid,\r\n        .jet-form-builder input.is-invalid,\r\n        .jet-form-builder textarea.is-invalid,\r\n        .jet-form-builder select.is-invalid {\r\n            border-color: #dc3545 !important;\r\n        }\r\n\r\n        .jet-form-builder .select2.is-invalid-select2 .select2-selection--single {\r\n            border-color: #dc3545 !important;\r\n        }\r\n    <\/style>\r\n\r\n    <script src=\"https:\/\/code.jquery.com\/jquery-3.7.1.min.js\"><\/script>\r\n    <script>\r\n        jQuery(document).ready(function ($) {\r\n            \/* -------------------------\r\n               CONFIGURACI\u00d3N INICIAL\r\n            ------------------------- *\/\r\n            window.flightApiBackup = {};\r\n            window.activeApiRequests = 0;\r\n            window.flightError = true; \/\/ Asumimos error hasta validar\r\n            window.flightSearchDebounce = {};\r\n            window.isTypingSpecialInstructions = false;\r\n            window.formWasSubmitted = false;\r\n            window.customBookingFieldsValid = true;\r\n            window.apiFormRevealValidationSummary = false;\r\n            window.apiFormSkipGlobalSubmitValidation = false;\r\n\r\n            $('.jet-form-builder form, form.jet-form-builder, .jet-form-builder').attr('novalidate', 'novalidate');\r\n\r\n            function clearEmailHideTimer($input) {\r\n                const timerId = $input.data('email-hide-timer');\r\n                if (timerId) {\r\n                    clearTimeout(timerId);\r\n                    $input.removeData('email-hide-timer');\r\n                }\r\n            }\r\n\r\n            function clearFieldHideTimer($field) {\r\n                const timerId = $field.data('required-hide-timer');\r\n                if (timerId) {\r\n                    clearTimeout(timerId);\r\n                    $field.removeData('required-hide-timer');\r\n                }\r\n            }\r\n\r\n            function getEmailFeedbackElement($input) {\r\n                let $feedback = $input.siblings('.email-bootstrap-feedback').first();\r\n\r\n                if (!$feedback.length) {\r\n                    const $wrap = $input.closest('.jet-form-builder__field-wrap');\r\n                    if ($wrap.length) {\r\n                        $wrap.css('position', 'relative');\r\n                    }\r\n                    $feedback = $('<div class=\"email-bootstrap-feedback\">Please enter a valid email address containing \"@\" and \".\"<\/div>');\r\n                    $input.after($feedback);\r\n                }\r\n\r\n                return $feedback;\r\n            }\r\n\r\n            function getFieldAnchor($field) {\r\n                if ($field.is('select') && $field.next('.select2').length) {\r\n                    return $field.next('.select2');\r\n                }\r\n\r\n                return $field;\r\n            }\r\n\r\n            function scrollToField($field) {\r\n                if (!$field || !$field.length) return;\r\n\r\n                const $anchor = getFieldAnchor($field);\r\n                const offsetTop = ($anchor.offset() || $field.offset() || { top: 0 }).top - 140;\r\n\r\n                if (typeof jQuery !== 'undefined') {\r\n                    jQuery('html, body').animate({ scrollTop: Math.max(0, offsetTop) }, 500);\r\n                } else if ($anchor.get(0)) {\r\n                    $anchor.get(0).scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n                }\r\n            }\r\n\r\n            function getRequiredFeedbackElement($field) {\r\n                const $anchor = getFieldAnchor($field);\r\n                let $feedback = $anchor.siblings('.required-bootstrap-feedback').first();\r\n\r\n                if (!$feedback.length) {\r\n                    const $wrap = $field.closest('.jet-form-builder__field-wrap');\r\n                    if ($wrap.length) {\r\n                        $wrap.css('position', 'relative');\r\n                    }\r\n\r\n                    $feedback = $('<div class=\"required-bootstrap-feedback\">This field is required.<\/div>');\r\n                    $anchor.after($feedback);\r\n                }\r\n\r\n                return $feedback;\r\n            }\r\n\r\n            function hasFieldValue($field) {\r\n                const value = $field.val();\r\n\r\n                if (Array.isArray(value)) {\r\n                    return value.length > 0;\r\n                }\r\n\r\n                return String(value || '').trim() !== '';\r\n            }\r\n\r\n            function isEligibleRequiredField($field) {\r\n                if (!$field.length || $field.prop('disabled') || $field.prop('readonly')) return false;\r\n                if ($field.is('[type=\"hidden\"], [type=\"submit\"], [type=\"button\"], [type=\"radio\"], [type=\"checkbox\"], [type=\"file\"]')) return false;\r\n                if ($field.is('[type=\"email\"], [type=\"date\"]')) return false;\r\n\r\n                const isRequired = $field.prop('required') ||\r\n                    $field.attr('aria-required') === 'true' ||\r\n                    $field.closest('.jet-form-builder-row').find('.jet-form-builder__required').length > 0;\r\n\r\n                return isRequired;\r\n            }\r\n\r\n            function setRequiredFieldInvalidState($field, isInvalid) {\r\n                $field.toggleClass('is-invalid', isInvalid);\r\n\r\n                if ($field.is('select') && $field.next('.select2').length) {\r\n                    $field.next('.select2').toggleClass('is-invalid-select2', isInvalid);\r\n                }\r\n            }\r\n\r\n            function showRequiredFeedback($field) {\r\n                clearFieldHideTimer($field);\r\n                getRequiredFeedbackElement($field).addClass('is-visible');\r\n            }\r\n\r\n            function hideRequiredFeedback($field, delay) {\r\n                const $feedback = getRequiredFeedbackElement($field);\r\n                clearFieldHideTimer($field);\r\n\r\n                if (!delay) {\r\n                    $feedback.removeClass('is-visible');\r\n                    return;\r\n                }\r\n\r\n                const timerId = setTimeout(function () {\r\n                    $feedback.removeClass('is-visible');\r\n                    $field.removeData('required-hide-timer');\r\n                }, delay);\r\n\r\n                $field.data('required-hide-timer', timerId);\r\n            }\r\n\r\n            function validateRequiredField($field, options) {\r\n                if (!isEligibleRequiredField($field)) return true;\r\n\r\n                const settings = $.extend({\r\n                    showFloating: false,\r\n                    hideDelay: 0\r\n                }, options || {});\r\n\r\n                const wasTouched = $field.data('required-touched') === true;\r\n\r\n                if (!wasTouched) {\r\n                    setRequiredFieldInvalidState($field, false);\r\n                    hideRequiredFeedback($field, 0);\r\n                    $field.attr('aria-invalid', 'false');\r\n                    return true;\r\n                }\r\n\r\n                if (hasFieldValue($field)) {\r\n                    setRequiredFieldInvalidState($field, false);\r\n                    hideRequiredFeedback($field, 0);\r\n                    $field.attr('aria-invalid', 'false');\r\n                    return true;\r\n                }\r\n\r\n                setRequiredFieldInvalidState($field, true);\r\n                $field.attr('aria-invalid', 'true');\r\n\r\n                if (settings.showFloating) {\r\n                    showRequiredFeedback($field);\r\n                    if (settings.hideDelay) {\r\n                        hideRequiredFeedback($field, settings.hideDelay);\r\n                    }\r\n                }\r\n\r\n                return false;\r\n            }\r\n\r\n            function showEmailFeedback($input) {\r\n                clearEmailHideTimer($input);\r\n                getEmailFeedbackElement($input).addClass('is-visible');\r\n            }\r\n\r\n            function hideEmailFeedback($input, delay) {\r\n                const $feedback = getEmailFeedbackElement($input);\r\n                clearEmailHideTimer($input);\r\n\r\n                if (!delay) {\r\n                    $feedback.removeClass('is-visible');\r\n                    return;\r\n                }\r\n\r\n                const timerId = setTimeout(function () {\r\n                    $feedback.removeClass('is-visible');\r\n                    $input.removeData('email-hide-timer');\r\n                }, delay);\r\n\r\n                $input.data('email-hide-timer', timerId);\r\n            }\r\n\r\n            function validateEmailField($input, options) {\r\n                if (!$input.length || !$input.is(':visible')) return true;\r\n\r\n                const settings = $.extend({\r\n                    showFloating: false,\r\n                    hideDelay: 0\r\n                }, options || {});\r\n\r\n                const value = ($input.val() || '').trim();\r\n                const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\r\n                const hasValue = value !== '';\r\n                const wasTouched = $input.data('required-touched') === true;\r\n                const isValid = hasValue && emailRegex.test(value);\r\n\r\n                $input.removeClass('is-invalid');\r\n\r\n                if (!hasValue && !wasTouched) {\r\n                    $input.attr('aria-invalid', 'false');\r\n                    hideEmailFeedback($input, 0);\r\n                    return true;\r\n                }\r\n\r\n                if (isValid) {\r\n                    $input.attr('aria-invalid', 'false');\r\n                    hideEmailFeedback($input, 0);\r\n                    return true;\r\n                }\r\n\r\n                $input.addClass('is-invalid');\r\n                $input.attr('aria-invalid', 'true');\r\n                getEmailFeedbackElement($input).text(hasValue ? 'Please enter a valid email address containing \"@\" and \".\"' : 'This field is required.');\r\n\r\n                if (settings.showFloating) {\r\n                    showEmailFeedback($input);\r\n                    if (settings.hideDelay) {\r\n                        hideEmailFeedback($input, settings.hideDelay);\r\n                    }\r\n                }\r\n\r\n                return false;\r\n            }\r\n\r\n            function validateVisibleEmailFields() {\r\n                $('.jet-form-builder input[type=\"email\"]:visible').each(function () {\r\n                    validateEmailField($(this));\r\n                });\r\n            }\r\n\r\n            function sanitizePhoneValue(value) {\r\n                let sanitized = (value || '').replace(\/[^\\d+]\/g, '');\r\n\r\n                if (sanitized.indexOf('+') > 0) {\r\n                    sanitized = sanitized.replace(\/\\+\/g, '');\r\n                }\r\n\r\n                if (sanitized.startsWith('+')) {\r\n                    sanitized = '+' + sanitized.slice(1).replace(\/\\+\/g, '');\r\n                } else {\r\n                    sanitized = sanitized.replace(\/\\+\/g, '');\r\n                }\r\n\r\n                return sanitized;\r\n            }\r\n\r\n            \/* -------------------------\r\n               FUNCI\u00d3N \u00daNICA PARA ESTADO DEL BOT\u00d3N\r\n            ------------------------- *\/\r\n            function updateSubmitButtonState() {\r\n                if (window.formWasSubmitted) return;\r\n\r\n                const $submitButton = $('.jet-form-builder__submit');\r\n                if (!$submitButton.length) return;\r\n\r\n                validateVisibleEmailFields();\r\n                const shouldBlock =\r\n                    window.activeApiRequests > 0 ||\r\n                    window.flightError === true ||\r\n                    window.isTypingSpecialInstructions === true ||\r\n                    window.customBookingFieldsValid === false;\r\n\r\n                if (shouldBlock) {\r\n                    $submitButton.prop('disabled', true).css({ 'opacity': '0.5', 'cursor': 'not-allowed' });\r\n                } else {\r\n                    $submitButton.prop('disabled', false).css({ 'opacity': '1', 'cursor': 'pointer' });\r\n                }\r\n            }\r\n\r\n            window.apiFormFieldHelpers = {\r\n                getFieldAnchor: getFieldAnchor,\r\n                getEmailFeedbackElement: getEmailFeedbackElement,\r\n                getRequiredFeedbackElement: getRequiredFeedbackElement,\r\n                scrollToField: scrollToField,\r\n                updateSubmitButtonState: updateSubmitButtonState,\r\n                isEligibleRequiredField: isEligibleRequiredField,\r\n                validateRequiredField: validateRequiredField,\r\n                validateEmailField: validateEmailField\r\n            };\r\n\r\n            function incrementApiRequests() {\r\n                window.activeApiRequests++;\r\n                updateSubmitButtonState();\r\n            }\r\n\r\n            function decrementApiRequests() {\r\n                window.activeApiRequests = Math.max(0, window.activeApiRequests - 1);\r\n                updateSubmitButtonState();\r\n            }\r\n\r\n            \/* -------------------------\r\n               SISTEMA DE BACKUP\r\n            ------------------------- *\/\r\n            let backupTimeout = null;\r\n            function scheduleBackup() {\r\n                clearTimeout(backupTimeout);\r\n                backupTimeout = setTimeout(backupAllApiContainers, 500);\r\n            }\r\n\r\n            function backupAllApiContainers() {\r\n                window.flightApiBackup = {};\r\n                $('.jet-form-builder-repeater__row').each(function (index) {\r\n                    const $row = $(this);\r\n                    const container = $row.find('.flight-leg-api-info-persistent');\r\n                    if (container.length && container.html().trim() !== '') {\r\n                        const backupKey = `row-${index}`;\r\n                        window.flightApiBackup[backupKey] = {\r\n                            html: container.html(),\r\n                            rowIndex: index\r\n                        };\r\n                    }\r\n                });\r\n            }\r\n\r\n            function restoreApiContainers() {\r\n                $('.jet-form-builder-repeater__row').each(function (index) {\r\n                    const $row = $(this);\r\n                    const backupKey = `row-${index}`;\r\n                    if (window.flightApiBackup[backupKey]) {\r\n                        const container = injectPersistentContainer($row);\r\n                        container.html(window.flightApiBackup[backupKey].html);\r\n                        if (window.flightApiBackup[backupKey].html.trim() !== '') {\r\n                            $row.find('.flight-leg-title').hide();\r\n                        }\r\n                    }\r\n                });\r\n            }\r\n\r\n            \/* -------------------------\r\n               CONTAINER PERSISTENTE\r\n            ------------------------- *\/\r\n            function injectPersistentContainer($row) {\r\n                const existing = $row.find('.flight-leg-api-info-persistent');\r\n                if (existing.length) return existing;\r\n\r\n                const container = $(`\r\n            <div class=\"flight-leg-api-info-persistent jet-fb-persistent-element\"\r\n                 style=\"font-weight:bold; font-size:14px; margin-top:10px; text-align:center;\"\r\n                 data-persistent=\"true\"\r\n                 data-jetfb-ignore=\"true\">\r\n            <\/div>\r\n        `);\r\n\r\n                const $fieldsContainer = $row.find('.jet-form-builder-repeater__row-fields');\r\n                if ($fieldsContainer.length) {\r\n                    $fieldsContainer.append(container);\r\n                }\r\n                return container;\r\n            }\r\n\r\n            function setAirportField($row, airportCode) {\r\n                const $airportInput = $row.find('input[data-field-name=\"airport\"]');\r\n                if ($airportInput.length) $airportInput.val(airportCode || '').trigger('change');\r\n            }\r\n\r\n            function setFromAirportField($row, airportCode) {\r\n                const $fromAirportInput = $row.find('input[data-field-name=\"fromairport\"]');\r\n                if ($fromAirportInput.length) $fromAirportInput.val(airportCode || '').trigger('change');\r\n            }\r\n\r\n            function setToAirportField($row, airportCode) {\r\n                const $toAirportInput = $row.find('input[data-field-name=\"toairport\"]');\r\n                if ($toAirportInput.length) $toAirportInput.val(airportCode || '').trigger('change');\r\n            }\r\n\r\n            function formatFlightTime(isoString) {\r\n                if (!isoString) return '';\r\n                const date = new Date(isoString);\r\n                return `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;\r\n            }\r\n\r\n            function getFlightRows() {\r\n                return $('.jet-form-builder-repeater__row').filter(function () {\r\n                    const $row = $(this);\r\n                    return $row.is(':visible') && $row.find('.typeservicerow, .flightrow, .arrivingflightrow, .departingflightrow, .datelegrow').length > 0;\r\n                });\r\n            }\r\n\r\n            function getFlightValidationState() {\r\n                const messages = [];\r\n                const invalidFields = [];\r\n                const globalErrors = [];\r\n\r\n                function pushMessage(message, $field) {\r\n                    if (message && !messages.includes(message)) {\r\n                        messages.push(message);\r\n                    }\r\n\r\n                    if ($field && $field.length) {\r\n                        invalidFields.push($field);\r\n                    } else if (message && !globalErrors.includes(message)) {\r\n                        globalErrors.push(message);\r\n                    }\r\n                }\r\n\r\n                getFlightRows().each(function (index) {\r\n                    const $row = $(this);\r\n                    const legNumber = index + 1;\r\n                    const $serviceField = $row.find('.typeservicerow').first();\r\n                    const $dateField = $row.find('.datelegrow').first();\r\n                    const $airlineField = $row.find('select[name*=\"aerolineas\"]').first();\r\n                    const $connectAirlineField = $row.find('select[name*=\"aerolineas_connect\"]').first();\r\n                    const $flightField = $row.find('.flightrow').first();\r\n                    const $arrivingField = $row.find('.arrivingflightrow').first();\r\n                    const $departingField = $row.find('.departingflightrow').first();\r\n                    const service = (($row.find('.typeservicerow').val() || '').toString().trim().toLowerCase());\r\n                    const date = (($row.find('.datelegrow').val() || '').toString().trim());\r\n                    const airline = (($airlineField.val() || '').toString().trim());\r\n                    const connectAirline = (($connectAirlineField.val() || '').toString().trim());\r\n                    const flight = (($row.find('.flightrow').val() || '').toString().trim());\r\n                    const arrivingFlight = (($row.find('.arrivingflightrow').val() || '').toString().trim());\r\n                    const departingFlight = (($row.find('.departingflightrow').val() || '').toString().trim());\r\n                    const containerText = (($row.find('.flight-leg-api-info-persistent').text() || '').toString().trim());\r\n\r\n                    if (!service || service === 'type of service' || service === 'typeofservice') {\r\n                        pushMessage('Flight leg ' + legNumber + ': please choose a service type.', $serviceField);\r\n                        return;\r\n                    }\r\n\r\n                    if (!date) {\r\n                        pushMessage('Flight leg ' + legNumber + ': please choose a date.', $dateField);\r\n                    }\r\n\r\n                    if (service === 'arrival' || service === 'departure') {\r\n                        if (!airline) {\r\n                            pushMessage('Flight leg ' + legNumber + ': please choose an airline.', $airlineField);\r\n                        }\r\n\r\n                        if (!flight) {\r\n                            pushMessage('Flight leg ' + legNumber + ': please enter the flight number.', $flightField);\r\n                            return;\r\n                        }\r\n                    }\r\n\r\n                    if (service === 'connection') {\r\n                        if (!airline) {\r\n                            pushMessage('Flight leg ' + legNumber + ': please choose the arriving airline.', $airlineField);\r\n                        }\r\n\r\n                        if (!arrivingFlight) {\r\n                            pushMessage('Flight leg ' + legNumber + ': please enter the arriving flight number.', $arrivingField);\r\n                        }\r\n\r\n                        if (!connectAirline) {\r\n                            pushMessage('Flight leg ' + legNumber + ': please choose the departing airline.', $connectAirlineField);\r\n                        }\r\n\r\n                        if (!departingFlight) {\r\n                            pushMessage('Flight leg ' + legNumber + ': please enter the departing flight number.', $departingField);\r\n                        }\r\n\r\n                        if (!airline || !arrivingFlight || !connectAirline || !departingFlight) {\r\n                            return;\r\n                        }\r\n                    }\r\n\r\n                    if (!containerText) {\r\n                        pushMessage('Flight leg ' + legNumber + ': please wait for the flight details to finish validating.', service === 'connection' ? $arrivingField : $flightField);\r\n                        return;\r\n                    }\r\n\r\n                    if (\r\n                        containerText.includes('wasn\u2019t found') ||\r\n                        containerText.includes('No scheduled flights found') ||\r\n                        containerText.includes('Error') ||\r\n                        containerText.includes('Please complete') ||\r\n                        containerText.includes('Connection flight not found') ||\r\n                        containerText.includes('Both flights required') ||\r\n                        containerText.includes('Re-validating') ||\r\n                        containerText.includes('Fetching')\r\n                    ) {\r\n                        return;\r\n                    }\r\n                });\r\n\r\n                return {\r\n                    messages: messages,\r\n                    invalidFields: invalidFields,\r\n                    globalErrors: globalErrors\r\n                };\r\n            }\r\n\r\n            function getFlightValidationErrors() {\r\n                return getFlightValidationState().messages;\r\n            }\r\n\r\n            window.getFlightValidationErrors = getFlightValidationErrors;\r\n\r\n            function escapeFlightValidationHtml(value) {\r\n                return String(value || '')\r\n                    .replace(\/&\/g, '&amp;')\r\n                    .replace(\/<\/g, '&lt;')\r\n                    .replace(\/>\/g, '&gt;')\r\n                    .replace(\/\"\/g, '&quot;')\r\n                    .replace(\/'\/g, '&#039;');\r\n            }\r\n\r\n            function buildFlightValidationMessageHtml() {\r\n                const errors = getFlightValidationErrors();\r\n\r\n                if (!errors.length) {\r\n                    return 'Please fix flight errors.';\r\n                }\r\n\r\n                return '<ul style=\"margin:0; padding-left:18px;\">' + errors.map(function (message) {\r\n                    return '<li>' + escapeFlightValidationHtml(message) + '<\/li>';\r\n                }).join('') + '<\/ul>';\r\n            }\r\n\r\n            function checkAllFlightsValid() {\r\n                let allValid = true;\r\n\r\n                $('.jet-form-builder-repeater__row').each(function () {\r\n                    const $row = $(this);\r\n                    const container = $row.find('.flight-leg-api-info-persistent');\r\n                    if (container.length) {\r\n                        const html = container.html();\r\n                        const service = ($row.find('.typeservicerow').val() || '').toLowerCase();\r\n                        const hasFlightData = $row.find('.flightrow').val() || $row.find('.arrivingflightrow').val() || $row.find('.departingflightrow').val();\r\n\r\n                        if (hasFlightData && service !== '') {\r\n                            if (html.includes('The flight entered wasn\u2019t found') || html.includes('No scheduled flights found') || html.includes('Error') || html.includes('Please complete') || html.includes('Connection flight not found') || html.includes('Both flights required') || html.includes('Re-validating') || html.includes('Fetching') || html.trim() === '') {\r\n                                allValid = false;\r\n                            }\r\n                        } else if (!hasFlightData) {\r\n                            allValid = false;\r\n                        }\r\n                    } else {\r\n                        allValid = false;\r\n                    }\r\n                });\r\n\r\n                return allValid;\r\n            }\r\n\r\n            \/* -------------------------\r\n               CONSULTA API CON DEBOUNCE\r\n            ------------------------- *\/\r\n            function consultarFlightStats($row, forceRefresh = false) {\r\n                const rowId = $row.index();\r\n                if (window.flightSearchDebounce[rowId]) clearTimeout(window.flightSearchDebounce[rowId]);\r\n\r\n                window.flightSearchDebounce[rowId] = setTimeout(() => {\r\n                    executeFlightStatsQuery($row, forceRefresh);\r\n                }, 800);\r\n            }\r\n\r\n            function executeFlightStatsQuery($row, forceRefresh = false) {\r\n                const container = injectPersistentContainer($row);\r\n                const rawService = $row.find('.typeservicerow').val();\r\n\r\n                if (!rawService || rawService.trim() === '' || rawService.trim().toLowerCase() === 'type of service') {\r\n                    container.html(`<div style=\"font-weight:bold; color: #dc3545; font-style:italic; text-align:center;\">Please select a Type of Service first<\/div>`);\r\n                    window.flightError = true;\r\n                    scheduleBackup(); updateSubmitButtonState();\r\n                    return;\r\n                }\r\n\r\n                const service = rawService.toLowerCase();\r\n\r\n                container.html(`<div style=\"font-weight:bold; display: flex; justify-content:center; align-items: center; color: #007cba; font-style:italic;\">Fetching flight information...<\/div>`);\r\n\r\n                if (service === 'arrival' || service === 'departure') {\r\n                    handleArrivalDeparture($row, service, container);\r\n                } else if (service === 'connection') {\r\n                    handleConnection($row, container);\r\n                }\r\n            }\r\n\r\n            function buildInlineFlightRequirementMessage(parts) {\r\n                const filteredParts = (parts || []).filter(Boolean);\r\n                if (!filteredParts.length) return 'Please complete the flight details.';\r\n                if (filteredParts.length === 1) return 'Please ' + filteredParts[0] + '.';\r\n                if (filteredParts.length === 2) return 'Please ' + filteredParts[0] + ' and ' + filteredParts[1] + '.';\r\n\r\n                return 'Please ' + filteredParts.slice(0, -1).join(', ') + ', and ' + filteredParts[filteredParts.length - 1] + '.';\r\n            }\r\n\r\n            function handleArrivalDeparture($row, service, container) {\r\n                const rawFlightNumber = ($row.find('.flightrow').val() || '').toUpperCase();\r\n                const $airlineSelect = $row.find('select[name*=\"aerolineas\"]');\r\n                const airlineCode = typeof window.getApiCarrierCode === 'function' ? window.getApiCarrierCode($airlineSelect) : '';\r\n                const flightNumber = typeof window.normalizeFlightNumber === 'function'\r\n                    ? window.normalizeFlightNumber(rawFlightNumber, $airlineSelect)\r\n                    : rawFlightNumber;\r\n\r\n                const date = $row.find('.datelegrow').val();\r\n\r\n                const missingRequirements = [];\r\n                if (!date) missingRequirements.push('select a date');\r\n                if (!airlineCode) missingRequirements.push('choose an airline');\r\n                if (!rawFlightNumber) missingRequirements.push('enter the flight number');\r\n\r\n                if (missingRequirements.length) {\r\n                    window.flightError = true;\r\n                    container.html('<div style=\"color: #dc3545;font-weight:bold; font-style: italic;\">' + buildInlineFlightRequirementMessage(missingRequirements) + '<\/div>');\r\n                    setAirportField($row, ''); setFromAirportField($row, ''); setToAirportField($row, '');\r\n                    scheduleBackup(); updateSubmitButtonState();\r\n                    return;\r\n                }\r\n\r\n                const typeOfService = service === 'arrival' ? 'arriving' : 'departing';\r\n                incrementApiRequests();\r\n                window.flightError = true;\r\n\r\n                $.ajax({\r\n                    url: '\/wp-json\/flightstats\/v1\/check-flight',\r\n                    method: 'POST',\r\n                    contentType: 'application\/json',\r\n                    data: JSON.stringify({ carrier: airlineCode, flightNumber, date, typeOfService }),\r\n                    success: function (response) {\r\n                        let finalHtml = '';\r\n                        if (response.scheduledFlights && response.scheduledFlights.length > 0) {\r\n                            const f = response.scheduledFlights[0];\r\n                            if (service === 'arrival') {\r\n                                finalHtml = `<div>Arrival ${f.arrivalAirportFsCode} at ${formatFlightTime(f.arrivalTime)}<\/div>`;\r\n                                setAirportField($row, f.arrivalAirportFsCode);\r\n                            } else {\r\n                                finalHtml = `<div>Departure ${f.departureAirportFsCode} at ${formatFlightTime(f.departureTime)}<\/div>`;\r\n                                setAirportField($row, f.departureAirportFsCode);\r\n                            }\r\n                            setFromAirportField($row, ''); setToAirportField($row, '');\r\n                        } else {\r\n                            finalHtml = '<div style=\"font-weight:bold; color: #dc3545; font-style: italic;\">The flight entered wasn\u2019t found. Check flight number and date.<\/div>';\r\n                            setAirportField($row, ''); setFromAirportField($row, ''); setToAirportField($row, '');\r\n                        }\r\n                        container.html(finalHtml);\r\n                        window.flightError = !checkAllFlightsValid();\r\n                        scheduleBackup(); updateSubmitButtonState();\r\n                    },\r\n                    error: function () {\r\n                        container.html('<div style=\"font-weight:bold; color: #dc3545; font-style: italic;\">Error fetching flight data.<\/div>');\r\n                        setAirportField($row, ''); setFromAirportField($row, ''); setToAirportField($row, '');\r\n                        window.flightError = !checkAllFlightsValid();\r\n                        scheduleBackup(); updateSubmitButtonState();\r\n                    },\r\n                    complete: function () { decrementApiRequests(); }\r\n                });\r\n            }\r\n\r\n            function handleConnection($row, container) {\r\n                const arrivingRaw = ($row.find('.arrivingflightrow').val() || '').toUpperCase();\r\n                const $arrivingAirlineSelect = $row.find('select[name*=\"aerolineas\"]');\r\n                const arrivingAirline = typeof window.getApiCarrierCode === 'function' ? window.getApiCarrierCode($arrivingAirlineSelect) : '';\r\n                const arrivingFlight = typeof window.normalizeFlightNumber === 'function'\r\n                    ? window.normalizeFlightNumber(arrivingRaw, $arrivingAirlineSelect)\r\n                    : arrivingRaw;\r\n\r\n                const departingRaw = ($row.find('.departingflightrow').val() || '').toUpperCase();\r\n                const $departingAirlineSelect = $row.find('select[name*=\"aerolineas_connect\"]');\r\n                const departingAirline = typeof window.getApiCarrierCode === 'function' ? window.getApiCarrierCode($departingAirlineSelect) : '';\r\n                const departingFlight = typeof window.normalizeFlightNumber === 'function'\r\n                    ? window.normalizeFlightNumber(departingRaw, $departingAirlineSelect)\r\n                    : departingRaw;\r\n\r\n                const date = $row.find('.datelegrow').val();\r\n\r\n                const missingRequirements = [];\r\n                if (!date) missingRequirements.push('select a date');\r\n                if (!arrivingAirline) missingRequirements.push('choose the arriving airline');\r\n                if (!arrivingRaw) missingRequirements.push('enter the arriving flight number');\r\n                if (!departingAirline) missingRequirements.push('choose the departing airline');\r\n                if (!departingRaw) missingRequirements.push('enter the departing flight number');\r\n\r\n                if (missingRequirements.length) {\r\n                    window.flightError = true;\r\n                    container.html('<div style=\"font-weight:bold; color: #dc3545; font-style: italic;\">' + buildInlineFlightRequirementMessage(missingRequirements) + '<\/div>');\r\n                    setAirportField($row, ''); setFromAirportField($row, ''); setToAirportField($row, '');\r\n                    scheduleBackup(); updateSubmitButtonState();\r\n                    return;\r\n                }\r\n\r\n                window.flightError = true;\r\n                let connectionData = { arrivingAirport: '', arrivingTime: '', departingAirport: '', departingTime: '', connectionAirport: '', arrivingValid: false, departingValid: false };\r\n                let requestsCompleted = 0; const totalRequests = 2;\r\n\r\n                incrementApiRequests();\r\n\r\n                function checkAllCompleted() {\r\n                    if (++requestsCompleted === totalRequests) {\r\n                        if (!connectionData.arrivingValid || !connectionData.departingValid || !connectionData.connectionAirport) {\r\n                            window.flightError = true;\r\n                            container.html('<div style=\"color:#dc3545;font-weight:bold;\">Connection flight not found<\/div>');\r\n                            setAirportField($row, ''); setFromAirportField($row, ''); setToAirportField($row, '');\r\n                        } else {\r\n                            const line = `Connection: ${connectionData.connectionAirport} at ${connectionData.arrivingTime} \u2192 ${connectionData.connectionAirport} at ${connectionData.departingTime}`;\r\n                            container.html(`<div>${line}<\/div>`);\r\n                            setAirportField($row, connectionData.connectionAirport);\r\n                            setFromAirportField($row, connectionData.arrivingAirport);\r\n                            setToAirportField($row, connectionData.departingAirport);\r\n                        }\r\n                        window.flightError = !checkAllFlightsValid();\r\n                        scheduleBackup(); decrementApiRequests(); updateSubmitButtonState();\r\n                    }\r\n                }\r\n\r\n                function processFlight(flightNumber, typeOfService, isArriving) {\r\n                    $.ajax({\r\n                        url: '\/wp-json\/flightstats\/v1\/check-flight',\r\n                        method: 'POST',\r\n                        contentType: 'application\/json',\r\n                        data: JSON.stringify({\r\n                            carrier: isArriving ? arrivingAirline : departingAirline,\r\n                            flightNumber,\r\n                            date,\r\n                            typeOfService\r\n                        }),\r\n                        success: function (response) {\r\n                            if (response.scheduledFlights && response.scheduledFlights.length > 0) {\r\n                                const f = response.scheduledFlights[0];\r\n                                if (isArriving) {\r\n                                    connectionData.arrivingAirport = f.departureAirportFsCode;\r\n                                    connectionData.arrivingTime = formatFlightTime(f.arrivalTime);\r\n                                    connectionData.arrivingValid = true;\r\n                                } else {\r\n                                    connectionData.departingAirport = f.arrivalAirportFsCode;\r\n                                    connectionData.departingTime = formatFlightTime(f.departureTime);\r\n                                    connectionData.connectionAirport = f.departureAirportFsCode;\r\n                                    connectionData.departingValid = true;\r\n                                }\r\n                            }\r\n                            checkAllCompleted();\r\n                        },\r\n                        error: function () {\r\n                            if (isArriving) connectionData.arrivingValid = false; else connectionData.departingValid = false;\r\n                            checkAllCompleted();\r\n                        }\r\n                    });\r\n                }\r\n                processFlight(arrivingFlight, 'arriving', true);\r\n                processFlight(departingFlight, 'departing', false);\r\n            }\r\n\r\n            \/* =========================================================\r\n               RE-VALIDACI\u00d3N INSTANT\u00c1NEA AL CAMBIAR AEROL\u00cdNEA\/VUELO\r\n               ========================================================= *\/\r\n            let globalTypingTimer = null;\r\n            let lastScheduledFingerprint = {};\r\n\r\n            $(document).on('input change', '.flightrow, .arrivingflightrow, .departingflightrow, .datelegrow, .typeservicerow, select[name*=\"aerolineas\"]', function (e) {\r\n                if (window.formWasSubmitted) return; \/\/ FIX: Prevent redundant validation loops on submit\r\n\r\n                const $row = $(this).closest('.jet-form-builder-repeater__row');\r\n                const rowIndex = $row.index();\r\n\r\n                const currentFingerprint =\r\n                    ($row.find('.typeservicerow').val() || '') + '|' +\r\n                    ($row.find('.flightrow').val() || '') + '|' +\r\n                    ($row.find('select[name*=\"aerolineas\"]').first().val() || '') + '|' +\r\n                    ($row.find('.arrivingflightrow').val() || '') + '|' +\r\n                    ($row.find('select[name*=\"aerolineas_connect\"]').val() || '') + '|' +\r\n                    ($row.find('.departingflightrow').val() || '') + '|' +\r\n                    ($row.find('.datelegrow').val() || '');\r\n\r\n                \/\/ Prevent redundant fetches if the data hasn't actually changed since the last fetch schedule\r\n                if (lastScheduledFingerprint[rowIndex] === currentFingerprint && e.type !== 'click') {\r\n                    return;\r\n                }\r\n                lastScheduledFingerprint[rowIndex] = currentFingerprint;\r\n\r\n                const container = injectPersistentContainer($row);\r\n\r\n                window.flightError = true;\r\n                updateSubmitButtonState();\r\n\r\n                container.html('<div style=\"color: #007cba; font-weight:bold; font-size:13px; font-style:italic;\">Re-validating flight info...<\/div>');\r\n\r\n                clearTimeout(globalTypingTimer);\r\n                globalTypingTimer = setTimeout(() => {\r\n                    consultarFlightStats($row, true);\r\n                }, 800);\r\n            });\r\n\r\n            let specialTypingTimer = null;\r\n            let lastTypedField = null;\r\n\r\n            $(document).on('input', '.specialrow', function () {\r\n                const $field = $(this);\r\n                if (lastTypedField !== this) { clearTimeout(specialTypingTimer); lastTypedField = this; }\r\n                window.isTypingSpecialInstructions = true; updateSubmitButtonState();\r\n                clearTimeout(specialTypingTimer);\r\n                specialTypingTimer = setTimeout(function () {\r\n                    if (lastTypedField !== $field[0]) return;\r\n                    window.isTypingSpecialInstructions = false; updateSubmitButtonState();\r\n                }, 1000);\r\n            });\r\n\r\n            $(document).on('input change click keyup', '.jet-form-builder input, .jet-form-builder select', function () {\r\n                $(this).data('last-val', $(this).val());\r\n                updateSubmitButtonState();\r\n            });\r\n\r\n            $(document).on('focus', '.jet-form-builder input[type=\"email\"]', function () {\r\n                validateEmailField($(this), { showFloating: true });\r\n            });\r\n\r\n            $(document).on('input change', '.jet-form-builder input[type=\"email\"]', function () {\r\n                const $input = $(this);\r\n                validateEmailField($input, { showFloating: $input.is(':focus') });\r\n            });\r\n\r\n            $(document).on('blur', '.jet-form-builder input[type=\"email\"]', function () {\r\n                const $input = $(this);\r\n                if (!(($input.val() || '').trim())) {\r\n                    $input.data('required-touched', true);\r\n                }\r\n                validateEmailField($input, { showFloating: true, hideDelay: 5000 });\r\n            });\r\n\r\n            const requiredFieldSelector = '.jet-form-builder input:not([type=\"email\"]):not([type=\"hidden\"]):not([type=\"submit\"]):not([type=\"button\"]):not([type=\"radio\"]):not([type=\"checkbox\"]):not([type=\"file\"]), .jet-form-builder textarea, .jet-form-builder select';\r\n\r\n            $(document).on('focus', requiredFieldSelector, function () {\r\n                const $field = $(this);\r\n                if (!$field.data('required-touched')) return;\r\n                validateRequiredField($field, { showFloating: true });\r\n            });\r\n\r\n            $(document).on('input change', requiredFieldSelector, function () {\r\n                const $field = $(this);\r\n                if (!isEligibleRequiredField($field)) return;\r\n                validateRequiredField($field, { showFloating: $field.is(':focus') });\r\n            });\r\n\r\n            $(document).on('blur', requiredFieldSelector, function () {\r\n                const $field = $(this);\r\n                if (!isEligibleRequiredField($field)) return;\r\n\r\n                if (!hasFieldValue($field)) {\r\n                    $field.data('required-touched', true);\r\n                }\r\n\r\n                validateRequiredField($field, { showFloating: !hasFieldValue($field), hideDelay: hasFieldValue($field) ? 0 : 2000 });\r\n            });\r\n\r\n            $(document).on('input', '.jet-form-builder input[type=\"tel\"], .jet-form-builder input[name*=\"phone\"], .jet-form-builder input[name*=\"telefono\"], .jet-form-builder .phonenumberrow input', function () {\r\n                const sanitized = sanitizePhoneValue(this.value);\r\n                if (this.value !== sanitized) {\r\n                    this.value = sanitized;\r\n                }\r\n            });\r\n\r\n            $(document).on('keypress', '.jet-form-builder input[type=\"tel\"], .jet-form-builder input[name*=\"phone\"], .jet-form-builder input[name*=\"telefono\"], .jet-form-builder .phonenumberrow input', function (e) {\r\n                const char = String.fromCharCode(e.which || e.keyCode);\r\n                const isDigit = \/\\d\/.test(char);\r\n                const isPlus = char === '+';\r\n                const hasPlus = this.value.indexOf('+') !== -1;\r\n                const cursorAtStart = (this.selectionStart || 0) === 0;\r\n\r\n                if (isDigit) return;\r\n                if (isPlus && !hasPlus && cursorAtStart) return;\r\n                if (e.which === 0 || e.which === 8) return;\r\n\r\n                e.preventDefault();\r\n            });\r\n\r\n            $(document).on('paste', '.jet-form-builder input[type=\"tel\"], .jet-form-builder input[name*=\"phone\"], .jet-form-builder input[name*=\"telefono\"], .jet-form-builder .phonenumberrow input', function () {\r\n                const input = this;\r\n                setTimeout(function () {\r\n                    input.value = sanitizePhoneValue(input.value);\r\n                }, 0);\r\n            });\r\n\r\n            validateVisibleEmailFields();\r\n\r\n            \/\/ Validar cambios abruptos por scripts externos que llenan campos sin disparar eventos (ej. select de aerol\u00ednea)\r\n            setInterval(function () {\r\n                if (window.formWasSubmitted) return; \/\/ FIX: Don't trigger changes if the form is already submitting\r\n\r\n                $('.jet-form-builder-repeater__row').each(function () {\r\n                    let elementsToTrigger = [];\r\n                    $(this).find('.flightrow, .arrivingflightrow, .departingflightrow, .datelegrow, .typeservicerow, select').each(function () {\r\n                        const $el = $(this);\r\n                        const currentVal = $el.val();\r\n                        const lastVal = $el.data('last-val');\r\n                        if (lastVal !== undefined && lastVal !== currentVal) {\r\n                            elementsToTrigger.push($el);\r\n                        }\r\n                        $el.data('last-val', currentVal);\r\n                    });\r\n                    elementsToTrigger.forEach($el => $el.trigger('change'));\r\n                });\r\n                updateSubmitButtonState();\r\n            }, 500);\r\n\r\n            $(document).on('blur', '.specialrow', function () {\r\n                clearTimeout(specialTypingTimer); lastTypedField = null;\r\n                window.isTypingSpecialInstructions = false; updateSubmitButtonState();\r\n            });\r\n\r\n            $(document).on('click', '.jet-form-builder-repeater__remove, .jet-form-builder-repeater__new', function () {\r\n                scheduleBackup();\r\n                setTimeout(function () {\r\n                    restoreApiContainers(); window.flightError = !checkAllFlightsValid(); updateSubmitButtonState();\r\n                }, 100);\r\n            });\r\n\r\n            function initializeRows() {\r\n                $('.jet-form-builder-repeater__row').each(function (index) {\r\n                    const $row = $(this);\r\n                    ensureFlightLegTitle($row, index);\r\n                    const hasData = $row.find('.flightrow').val() || $row.find('.arrivingflightrow').val() || $row.find('.departingflightrow').val();\r\n                    const hasDate = $row.find('.datelegrow').val();\r\n\r\n                    if (hasData && hasDate) {\r\n                        $row.find('.flight-leg-title').hide(); consultarFlightStats($row);\r\n                    } else {\r\n                        setAirportField($row, ''); setFromAirportField($row, ''); setToAirportField($row, '');\r\n                    }\r\n                });\r\n                window.flightError = !checkAllFlightsValid(); scheduleBackup(); updateSubmitButtonState();\r\n            }\r\n\r\n            function ensureFlightLegTitle($row, index) {\r\n                let title = $row.find('.flight-leg-title');\r\n                if (!title.length) {\r\n                    title = $('<h3 class=\"flight-leg-title\" style=\"margin-bottom: 10px; color: #004aad; font-weight: 600; font-size: 16px;\"><\/h3>').prependTo($row.find('.jet-form-builder-repeater__row-fields'));\r\n                }\r\n                title.text('Flight leg ' + (index + 1));\r\n                return title;\r\n            }\r\n\r\n            $(window).on('load', function () { setTimeout(initializeRows, 500); });\r\n\r\n            document.addEventListener('submit', function (e) {\r\n                const form = e.target;\r\n                if (!form || !form.tagName || form.tagName.toUpperCase() !== 'FORM' || !$(form).closest('.jet-form-builder').length) {\r\n                    return;\r\n                }\r\n\r\n                if (window.apiFormSkipGlobalSubmitValidation === true) {\r\n                    window.apiFormSkipGlobalSubmitValidation = false;\r\n                    return;\r\n                }\r\n\r\n                window.formWasSubmitted = true; \/\/ Block setInterval from triggering more validation changes\r\n                let hasConnectionErrors = false;\r\n\r\n                $('.jet-form-builder-repeater__row').each(function () {\r\n                    const $row = $(this);\r\n                    const service = ($row.find('.typeservicerow').val() || '').toLowerCase();\r\n\r\n                    \/\/ Guardar el c\u00f3digo universal del vuelo para los payloads posteriores\r\n                    const $airlineSelect = $row.find('select[name*=\"aerolineas\"]');\r\n\r\n                    if (service === 'arrival' || service === 'departure') {\r\n                        const $flightRow = $row.find('.flightrow');\r\n                        const rawFlightNumber = ($flightRow.val() || '').toUpperCase();\r\n                        const normalizedFlightNumber = typeof window.buildUniversalFlightCode === 'function'\r\n                            ? window.buildUniversalFlightCode(rawFlightNumber, $airlineSelect)\r\n                            : rawFlightNumber;\r\n                        if (normalizedFlightNumber !== rawFlightNumber) {\r\n                            $flightRow.val(normalizedFlightNumber);\r\n                        }\r\n                    } else if (service === 'connection') {\r\n                        const arrivingRaw = ($row.find('.arrivingflightrow').val() || '').toUpperCase();\r\n                        const $arrivingFlightRow = $row.find('.arrivingflightrow');\r\n                        const normalizedArrivingFlight = typeof window.buildUniversalFlightCode === 'function'\r\n                            ? window.buildUniversalFlightCode(arrivingRaw, $airlineSelect)\r\n                            : arrivingRaw;\r\n                        if (normalizedArrivingFlight !== arrivingRaw) {\r\n                            $arrivingFlightRow.val(normalizedArrivingFlight);\r\n                        }\r\n\r\n                        const $departingAirlineSelect = $row.find('select[name*=\"aerolineas_connect\"]');\r\n                        const departingRaw = ($row.find('.departingflightrow').val() || '').toUpperCase();\r\n                        const $departingFlightRow = $row.find('.departingflightrow');\r\n                        const normalizedDepartingFlight = typeof window.buildUniversalFlightCode === 'function'\r\n                            ? window.buildUniversalFlightCode(departingRaw, $departingAirlineSelect)\r\n                            : departingRaw;\r\n                        if (normalizedDepartingFlight !== departingRaw) {\r\n                            $departingFlightRow.val(normalizedDepartingFlight);\r\n                        }\r\n\r\n                        const containerHtml = $row.find('.flight-leg-api-info-persistent').html() || '';\r\n                        if (!arrivingRaw || !departingRaw || containerHtml.includes('not found') || containerHtml.includes('required')) {\r\n                            hasConnectionErrors = true;\r\n                        }\r\n                    }\r\n                });\r\n\r\n                const showError = (msgHtml) => {\r\n                    window.formWasSubmitted = false;\r\n                    e.preventDefault();\r\n                    e.stopPropagation();\r\n                    e.stopImmediatePropagation();\r\n\r\n                    let $wrap = $(form).find('.jet-form-builder-messages-wrap');\r\n                    if (!$wrap.length) {\r\n                        $(form).append('<div class=\"jet-form-builder-messages-wrap\" data-form-id=\"' + (form.dataset.formId || '') + '\"><\/div>');\r\n                        $wrap = $(form).find('.jet-form-builder-messages-wrap');\r\n                    }\r\n\r\n                    $wrap.html('<div class=\"jet-form-builder-message jet-form-builder-message--error\">' + msgHtml + '<\/div>');\r\n                };\r\n\r\n                if (hasConnectionErrors) { showError(buildFlightValidationMessageHtml()); return; }\r\n                if (window.flightError === true) {\r\n                    showError(buildFlightValidationMessageHtml());\r\n                    return;\r\n                }\r\n                if (window.isTypingSpecialInstructions === true) { showError('Please finish typing in special instructions.'); return; }\r\n                if (window.activeApiRequests > 0) { showError('Please wait while flight data is loading.'); return; }\r\n\r\n                \/\/ Timeout to unlock the form in case the backend throws an error that requires user changes\r\n                setTimeout(() => {\r\n                    window.formWasSubmitted = false;\r\n                }, 5000);\r\n\r\n            }, true); \/\/ Use capture phase to ensure this runs BEFORE JetFormBuilder's submit listener\r\n\r\n            \/* =========================================================\r\n               INYECCI\u00d3N NATURAL DEL MENSAJE SIN DUPLICAR CAJAS\r\n               ========================================================= *\/\r\n            const successObserver = new MutationObserver(function (mutations) {\r\n                const existingCustomBox = document.getElementById('fixed-jfb-success-message');\r\n\r\n                if (existingCustomBox && window.getComputedStyle(existingCustomBox).display !== 'none' && !existingCustomBox.dataset.textoAgregado) {\r\n\r\n                    window.formWasSubmitted = true;\r\n                    $('.jet-form-builder-row.field-type-submit-field').addClass('d-none');\r\n                    $('.jet-form-builder__submit').addClass('d-none');\r\n\r\n                    $('.jet-form-builder-message--success').hide();\r\n\r\n                    existingCustomBox.dataset.textoAgregado = 'true';\r\n\r\n                    $(existingCustomBox).find('div').last().append('<span style=\"display:block; font-size: 13px; color: #666; font-style: italic; margin-top: 6px;\">Thank you! There is no need to submit this form again.<\/span>');\r\n                }\r\n            });\r\n\r\n            successObserver.observe(document.body, { childList: true, subtree: true, attributes: true });\r\n\r\n            \/* =========================================================\r\n               JETFORMBUILDER PAYLOAD INTERCEPTION\r\n               ========================================================= *\/\r\n            $(document).on('jet-form-builder\/before-send', function (event, form, requestData) {\r\n                syncBookingPayloadFields();\r\n\r\n                \/\/ requestData is FormData. We need to iterate over it and modify flight numbers\r\n                \/\/ JetFormBuilder repeater fields usually look like: my_repeater[0][flight]\r\n\r\n                let modified = false;\r\n                const newFormData = new FormData();\r\n\r\n                \/\/ Second pass: store flight numbers in universal carrier+number format\r\n                for (let [key, value] of requestData.entries()) {\r\n                    let newValue = value;\r\n\r\n                    const flightMatch = key.match(\/\\[(\\d+)\\]\\[flight\\]\/);\r\n                    if (flightMatch && typeof value === 'string') {\r\n                        const rowIndex = flightMatch[1];\r\n                        const rawValue = value.toUpperCase();\r\n                        const $row = $('.jet-form-builder-repeater__row').eq(Number(rowIndex));\r\n                        const normalizedValue = typeof window.buildUniversalFlightCode === 'function'\r\n                            ? window.buildUniversalFlightCode(rawValue, $row.find('select[name*=\"aerolineas\"]'))\r\n                            : rawValue;\r\n                        if (normalizedValue !== rawValue) {\r\n                            newValue = normalizedValue;\r\n                            modified = true;\r\n                        }\r\n                    }\r\n\r\n                    const arrivingMatch = key.match(\/\\[(\\d+)\\]\\[arriving_flight\\]\/);\r\n                    if (arrivingMatch && typeof value === 'string') {\r\n                        const rowIndex = arrivingMatch[1];\r\n                        const rawValue = value.toUpperCase();\r\n                        const $row = $('.jet-form-builder-repeater__row').eq(Number(rowIndex));\r\n                        const normalizedValue = typeof window.buildUniversalFlightCode === 'function'\r\n                            ? window.buildUniversalFlightCode(rawValue, $row.find('select[name*=\"aerolineas\"]'))\r\n                            : rawValue;\r\n                        if (normalizedValue !== rawValue) {\r\n                            newValue = normalizedValue;\r\n                            modified = true;\r\n                        }\r\n                    }\r\n\r\n                    const departingMatch = key.match(\/\\[(\\d+)\\]\\[departing_flight\\]\/);\r\n                    if (departingMatch && typeof value === 'string') {\r\n                        const rowIndex = departingMatch[1];\r\n                        const rawValue = value.toUpperCase();\r\n                        const $row = $('.jet-form-builder-repeater__row').eq(Number(rowIndex));\r\n                        const normalizedValue = typeof window.buildUniversalFlightCode === 'function'\r\n                            ? window.buildUniversalFlightCode(rawValue, $row.find('select[name*=\"aerolineas_connect\"]'))\r\n                            : rawValue;\r\n                        if (normalizedValue !== rawValue) {\r\n                            newValue = normalizedValue;\r\n                            modified = true;\r\n                        }\r\n                    }\r\n\r\n                    newFormData.append(key, newValue);\r\n                }\r\n\r\n                const customPayloadFields = {\r\n                    additional_passengers: $('#additional_passengers_payload').val() || '[]',\r\n                    booking_for_someone_else: $('#booking_for_someone_else').val() || 'no',\r\n\r\n                    reservation_contact_same_as_passengers: $('#reservation_contact_same_as_passengers').val() || '0',\r\n                    same_as_previously_entered: $('#same_as_previously_entered_payload').val() || 'no',\r\n                    reservation_for_other_name: $('#reservation_for_other_name_payload').val() || '',\r\n                    reservation_for_other_additional_passengers: $('#reservation_for_other_additional_passengers_payload').val() || '[]'\r\n                };\r\n\r\n                Object.keys(customPayloadFields).forEach(function (key) {\r\n                    newFormData.delete(key);\r\n                    newFormData.append(key, customPayloadFields[key]);\r\n                });\r\n                modified = true;\r\n\r\n                if (modified) {\r\n                    \/\/ Overwrite the original FormData completely\r\n                    for (let [key] of requestData.entries()) {\r\n                        requestData.delete(key);\r\n                    }\r\n                    for (let [key, value] of newFormData.entries()) {\r\n                        requestData.append(key, value);\r\n                    }\r\n                }\r\n            });\r\n\r\n        });\r\n    <\/script>\r\n\r\n    <!-- PASSENGERS & LUGGAGE COMBOBOX -->\r\n\r\n    <style>\r\n        \/* Instantly hide original inputs *\/\r\n        #number_of_passengers,\r\n        #number_of_luggage {\r\n            display: none !important;\r\n        }\r\n\r\n        \/* Main selector container *\/\r\n        .additional-passengers-row {\r\n            width: 100%;\r\n            clear: both;\r\n            margin-top: 18px;\r\n            display: block;\r\n        }\r\n\r\n        .booking-extra-label {\r\n            display: block;\r\n            margin-bottom: 10px;\r\n            color: #444;\r\n            font-size: 13px;\r\n            font-weight: 600;\r\n            text-transform: uppercase;\r\n            letter-spacing: 0.5px;\r\n        }\r\n\r\n        #passenger-luggage-selector {\r\n            position: relative;\r\n            display: inline-block;\r\n            font-family: Arial, sans-serif;\r\n            cursor: pointer;\r\n            width: 25%;\r\n            user-select: none;\r\n            border: 1px solid #dce1e6;\r\n            padding: 12px 18px;\r\n            border-radius: 0px 15px 15px 0px;\r\n            background: #fff;\r\n            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\r\n            transition: all 0.3s ease;\r\n            z-index: 100;\r\n        }\r\n\r\n        @media (max-width: 768px) {\r\n            #passenger-luggage-selector {\r\n                width: 100%;\r\n                border-radius: 15px !important;\r\n                display: block;\r\n            }\r\n        }\r\n\r\n        #passenger-luggage-selector:hover {\r\n            border-color: #3498db;\r\n            box-shadow: 0 4px 12px rgba(52, 152, 219, 0.15);\r\n        }\r\n\r\n        #passenger-luggage-selector.active {\r\n            border-color: #3498db;\r\n            box-shadow: 0 4px 12px rgba(52, 152, 219, 0.25);\r\n        }\r\n\r\n        #passenger-luggage-display {\r\n            display: flex;\r\n            justify-content: space-between;\r\n            align-items: center;\r\n            font-size: 16px;\r\n            color: #2c3e50;\r\n            font-weight: 500;\r\n        }\r\n\r\n        #passenger-luggage-display .arrow {\r\n            transition: transform 0.3s ease;\r\n            color: #7f8c8d;\r\n            font-size: 12px;\r\n            margin-left: 10px;\r\n        }\r\n\r\n        #passenger-luggage-selector.active .arrow {\r\n            transform: rotate(180deg);\r\n            color: #3498db;\r\n        }\r\n\r\n        #passenger-luggage-dropdown {\r\n            position: absolute;\r\n            top: 100%;\r\n            left: 0;\r\n            width: 100%;\r\n            background: #fff;\r\n            border: 1px solid #dce1e6;\r\n            border-radius: 10px;\r\n            margin-top: 8px;\r\n            padding: 20px;\r\n            box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);\r\n            display: none;\r\n            z-index: 1000;\r\n            animation: fadeIn 0.2s ease-out;\r\n        }\r\n\r\n        @keyframes fadeIn {\r\n            from {\r\n                opacity: 0;\r\n                transform: translateY(-10px);\r\n            }\r\n\r\n            to {\r\n                opacity: 1;\r\n                transform: translateY(0);\r\n            }\r\n        }\r\n\r\n        .counter-row {\r\n            display: flex;\r\n            justify-content: space-between;\r\n            align-items: center;\r\n            margin-bottom: 20px;\r\n            font-size: 16px;\r\n            color: #2c3e50;\r\n        }\r\n\r\n        .counter-row:last-child {\r\n            margin-bottom: 0;\r\n        }\r\n\r\n        .counter-label {\r\n            font-weight: 500;\r\n        }\r\n\r\n        .counter-controls {\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 12px;\r\n        }\r\n\r\n        .counter-row button {\r\n            width: 36px;\r\n            height: 36px;\r\n            border: 1px solid #dce1e6;\r\n            background: #f8f9fa;\r\n            border-radius: 8px;\r\n            font-weight: bold;\r\n            cursor: pointer;\r\n            font-size: 18px;\r\n            line-height: 1;\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: center;\r\n            transition: all 0.2s ease;\r\n            color: #2c3e50;\r\n        }\r\n\r\n        .counter-row button:hover {\r\n            background: #e9ecef;\r\n            border-color: #adb5bd;\r\n        }\r\n\r\n        .counter-row button:active {\r\n            background: #dee2e6;\r\n        }\r\n\r\n        .counter-row button:disabled {\r\n            background: #f8f9fa;\r\n            border-color: #e9ecef;\r\n            color: #adb5bd;\r\n            cursor: not-allowed;\r\n        }\r\n\r\n        .counter-row span.value {\r\n            display: inline-block;\r\n            width: 40px;\r\n            text-align: center;\r\n            font-weight: 600;\r\n            font-size: 18px;\r\n            color: #2c3e50;\r\n        }\r\n\r\n        .booking-extra-grid {\r\n            display: grid;\r\n            grid-template-columns: repeat(2, minmax(0, 1fr));\r\n            gap: 14px;\r\n        }\r\n\r\n        @media (max-width: 768px) {\r\n            .booking-extra-grid {\r\n                grid-template-columns: 1fr;\r\n            }\r\n        }\r\n\r\n        .booking-extra-field label {\r\n            display: block;\r\n            margin-bottom: 8px;\r\n            color: #444;\r\n            font-size: 13px;\r\n            font-weight: 600;\r\n            text-transform: uppercase;\r\n            letter-spacing: 0.5px;\r\n        }\r\n\r\n        .booking-extra-field input[type=\"text\"] {\r\n            width: 100%;\r\n            min-height: 48px;\r\n            padding: 0 14px;\r\n            border: 1px solid #c7ccd3;\r\n            border-radius: 4px;\r\n            background: #ffffff;\r\n            color: #4f4f4f;\r\n            font-size: 15px;\r\n            box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\r\n        }\r\n\r\n        .booking-extra-field input[type=\"text\"]:focus {\r\n            outline: none;\r\n            border-color: #282a5c;\r\n            box-shadow: 0 0 0 3px rgba(40, 42, 92, 0.08);\r\n        }\r\n\r\n        .booking-extra-help {\r\n            margin-top: 8px;\r\n            color: #6b7280;\r\n            font-size: 13px;\r\n        }\r\n\r\n        .reservation-modal {\r\n            position: fixed;\r\n            inset: 0;\r\n            z-index: 99999;\r\n            display: none;\r\n            align-items: center;\r\n            justify-content: center;\r\n            padding: 20px;\r\n            background: rgba(16, 24, 40, 0.45);\r\n        }\r\n\r\n        .reservation-modal.is-open {\r\n            display: flex;\r\n        }\r\n\r\n        .reservation-modal__dialog {\r\n            width: min(620px, 100%);\r\n            background: #ffffff;\r\n            border-radius: 18px;\r\n            box-shadow: 0 30px 80px rgba(15, 23, 42, 0.22);\r\n            overflow: hidden;\r\n            border: 1px solid rgba(226, 232, 240, 0.9);\r\n        }\r\n\r\n        .reservation-modal__header {\r\n            padding: 22px 24px 10px;\r\n        }\r\n\r\n        .reservation-modal__title {\r\n            margin: 0;\r\n            color: #282a5c;\r\n            font-size: 24px;\r\n            line-height: 1.2;\r\n            font-weight: 600;\r\n        }\r\n\r\n        .reservation-modal__subtitle {\r\n            margin: 8px 0 0;\r\n            color: #5b6472;\r\n            font-size: 15px;\r\n            line-height: 1.5;\r\n        }\r\n\r\n        .reservation-modal__body {\r\n            padding: 10px 24px 24px;\r\n        }\r\n\r\n        .reservation-modal__actions {\r\n            display: flex;\r\n            flex-wrap: wrap;\r\n            gap: 12px;\r\n            margin-top: 20px;\r\n        }\r\n\r\n        .reservation-modal__btn {\r\n            border: none;\r\n            border-radius: 10px;\r\n            min-height: 46px;\r\n            padding: 0 20px;\r\n            font-size: 15px;\r\n            font-weight: 600;\r\n            cursor: pointer;\r\n            transition: background 0.2s ease, transform 0.2s ease;\r\n        }\r\n\r\n        .reservation-modal__btn:hover {\r\n            transform: translateY(-1px);\r\n        }\r\n\r\n        .reservation-modal__btn--primary {\r\n            background: #282a5c;\r\n            color: #ffffff;\r\n        }\r\n\r\n        .reservation-modal__btn--primary:hover {\r\n            background: #1c1e42;\r\n        }\r\n\r\n        .reservation-modal__btn--secondary {\r\n            background: #eef2f7;\r\n            color: #2c3e50;\r\n        }\r\n\r\n        .reservation-modal__btn--secondary:hover {\r\n            background: #e2e8f0;\r\n        }\r\n\r\n        .reservation-modal__step {\r\n            display: none;\r\n        }\r\n\r\n        .reservation-modal__step.is-active {\r\n            display: block;\r\n        }\r\n\r\n        .reservation-modal__checkbox {\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 10px;\r\n            margin: 4px 0 20px;\r\n            color: #334155;\r\n            font-size: 14px;\r\n            font-weight: 500;\r\n        }\r\n\r\n        .reservation-modal__checkbox input {\r\n            width: 18px;\r\n            height: 18px;\r\n        }\r\n\r\n        body.reservation-modal-open,\r\n        html.reservation-modal-open {\r\n            overflow: hidden !important;\r\n            height: 100%;\r\n        }\r\n    <\/style>\r\n\r\n    \r\n    <script src=\"https:\/\/code.jquery.com\/jquery-3.7.1.min.js\"><\/script>\r\n\r\n    <script>\r\n        jQuery(document).ready(function ($) {\r\n            const bookingPrefill = {\"service_type\":\"\",\"travel_date\":\"\",\"service_date\":\"\",\"passengers\":0,\"luggage\":0,\"email\":\"\",\"legs\":[]};\r\n            let submitBypass = false;\r\n            let decisionCaptured = false;\r\n            let bookingExperienceReady = false;\r\n            let isSyncingPassengerLuggage = false;\r\n\r\n            function parseCount(value, fallback) {\r\n                const parsed = parseInt(value, 10);\r\n                return Number.isFinite(parsed) ? parsed : fallback;\r\n            }\r\n\r\n            function getForm() {\r\n                return $('.jet-form-builder').first();\r\n            }\r\n\r\n            function getPassengerInput() {\r\n                return $('#number_of_passengers').first();\r\n            }\r\n\r\n            function getLuggageInput() {\r\n                return $('#number_of_luggage').first();\r\n            }\r\n\r\n            function getPrimaryPassengerField() {\r\n                const $candidates = getForm().find('input[type=\"text\"], input:not([type])').filter(function () {\r\n                    const $field = $(this);\r\n                    if (!$field.is(':visible')) return false;\r\n\r\n                    const haystack = [\r\n                        this.name || '',\r\n                        this.id || '',\r\n                        $field.attr('data-field-name') || '',\r\n                        $field.attr('placeholder') || ''\r\n                    ].join(' ').toLowerCase();\r\n\r\n                    const excluded = ['airport', 'flight', 'airline', 'phone', 'special', 'company', 'city', 'hotel', 'date'];\r\n                    if (excluded.some(fragment => haystack.includes(fragment))) {\r\n                        return false;\r\n                    }\r\n\r\n                    return haystack.includes('name') || haystack.includes('passenger');\r\n                });\r\n\r\n                if ($candidates.length) {\r\n                    return $candidates.first();\r\n                }\r\n\r\n                return getForm().find('input[type=\"text\"], input:not([type])').filter(':visible').first();\r\n            }\r\n\r\n            function ensureBookingFields() {\r\n                const $form = getForm();\r\n                if (!$form.length) return false;\r\n\r\n                function ensureHiddenPayloadField(id, name, defaultValue) {\r\n                    let $field = $('#' + id);\r\n\r\n                    if (!$field.length) {\r\n                        $field = $form.find('input[name=\"' + name + '\"]').first();\r\n                        if ($field.length) {\r\n                            $field.attr('id', id);\r\n                        }\r\n                    }\r\n\r\n                    if (!$field.length) {\r\n                        $form.append('<input type=\"hidden\" id=\"' + id + '\" name=\"' + name + '\" value=\"' + $('<div>').text(defaultValue).html() + '\">');\r\n                        $field = $('#' + id);\r\n                    }\r\n\r\n                    if ($field.length && (!$field.val() || $field.val() === '')) {\r\n                        $field.val(defaultValue);\r\n                    }\r\n\r\n                    return $field;\r\n                }\r\n\r\n                ensureHiddenPayloadField('booking_for_someone_else', 'booking_for_someone_else', 'no');\r\n                ensureHiddenPayloadField('reservation_contact_same_as_passengers', 'reservation_contact_same_as_passengers', '0');\r\n                ensureHiddenPayloadField('same_as_previously_entered_payload', 'same_as_previously_entered', 'no');\r\n                ensureHiddenPayloadField('additional_passengers_payload', 'additional_passengers', '[]');\r\n                ensureHiddenPayloadField('reservation_for_other_name_payload', 'reservation_for_other_name', '');\r\n                ensureHiddenPayloadField('reservation_for_other_additional_passengers_payload', 'reservation_for_other_additional_passengers', '[]');\r\n\r\n\r\n                return true;\r\n            }\r\n\r\n            function ensurePassengerSelector() {\r\n                const $passengerInput = getPassengerInput();\r\n                const $luggageInput = getLuggageInput();\r\n                const selectorHtml = '\\\r\n                                                <div id=\"passenger-luggage-selector\">\\\r\n                                                    <div id=\"passenger-luggage-display\">\\\r\n                                                        <span><span class=\"passengers-display\">1 Passenger<\/span> - <span class=\"luggage-display\">0 Luggage<\/span><\/span>\\\r\n                                                        <span class=\"arrow\">\u25b2<\/span>\\\r\n                                                    <\/div>\\\r\n                                                    <div id=\"passenger-luggage-dropdown\">\\\r\n                                                        <div class=\"counter-row\">\\\r\n                                                            <span class=\"counter-label\">Passengers<\/span>\\\r\n                                                            <div class=\"counter-controls\">\\\r\n                                                                <button type=\"button\" class=\"minus-passenger\" aria-label=\"Decrease passengers\">-<\/button>\\\r\n                                                                <span class=\"value\" id=\"passenger-count\">1<\/span>\\\r\n                                                                <button type=\"button\" class=\"plus-passenger\" aria-label=\"Increase passengers\">+<\/button>\\\r\n                                                            <\/div>\\\r\n                                                        <\/div>\\\r\n                                                        <div class=\"counter-row\">\\\r\n                                                            <span class=\"counter-label\">Luggage<\/span>\\\r\n                                                            <div class=\"counter-controls\">\\\r\n                                                                <button type=\"button\" class=\"minus-luggage\" aria-label=\"Decrease luggage\">-<\/button>\\\r\n                                                                <span class=\"value\" id=\"luggage-count\">0<\/span>\\\r\n                                                                <button type=\"button\" class=\"plus-luggage\" aria-label=\"Increase luggage\">+<\/button>\\\r\n                                                            <\/div>\\\r\n                                                        <\/div>\\\r\n                                                    <\/div>\\\r\n                                                <\/div>';\r\n                if (!$passengerInput.length || !$luggageInput.length) return false;\r\n\r\n                const $anchorRow = $luggageInput.closest('.jet-form-builder-row').length\r\n                    ? $luggageInput.closest('.jet-form-builder-row')\r\n                    : $passengerInput.closest('.jet-form-builder-row');\r\n\r\n                if (!$('#passenger-luggage-selector').length) {\r\n                    if ($anchorRow.length) {\r\n                        $anchorRow.after(selectorHtml);\r\n                    } else {\r\n                        $passengerInput.after(selectorHtml);\r\n                    }\r\n                }\r\n\r\n                return true;\r\n            }\r\n\r\n            function ensureAdditionalPassengerSection() {\r\n                if ($('#additional-passengers-section').length) return true;\r\n\r\n                const $form = getForm();\r\n                if (!$form.length) return false;\r\n\r\n                const additionalPassengersHtml = '\\\r\n                                                <div class=\"jet-form-builder-row additional-passengers-row\" id=\"additional-passengers-section\" style=\"display:none;\">\\\r\n                                                    <label class=\"booking-extra-label\">Additional Passengers<\/label>\\\r\n                                                    <div id=\"additional-passengers-fields\" class=\"booking-extra-grid\"><\/div>\\\r\n                                                    <div class=\"booking-extra-help\">Add the names of the extra passengers travelling with the main passenger.<\/div>\\\r\n                                                <\/div>';\r\n\r\n                const $serviceAdvisory = $form.find('.avinf').first();\r\n                const $repeaterRow = $form.find('.jet-form-builder-row.field-type-repeater-field').first();\r\n                const $passengerHiddenRow = getPassengerInput().closest('.jet-form-builder-row');\r\n\r\n                if ($serviceAdvisory.length) {\r\n                    $serviceAdvisory.before(additionalPassengersHtml);\r\n                } else if ($repeaterRow.length) {\r\n                    $repeaterRow.before(additionalPassengersHtml);\r\n                } else if ($passengerHiddenRow.length) {\r\n                    $passengerHiddenRow.before(additionalPassengersHtml);\r\n                } else {\r\n                    $form.append(additionalPassengersHtml);\r\n                }\r\n\r\n                return $('#additional-passengers-section').length > 0;\r\n            }\r\n\r\n            function ensureReservationModal() {\r\n                const $form = getForm();\r\n                if (!$form.length || $('#reservation-for-others-modal').length) return;\r\n\r\n                const modalHtml = '\\\r\n                                                <div class=\"reservation-modal\" id=\"reservation-for-others-modal\" aria-hidden=\"true\">\\\r\n                                                    <div class=\"reservation-modal__dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"reservation-modal-title\">\\\r\n                                                        <div class=\"reservation-modal__header\">\\\r\n                                                            <h3 class=\"reservation-modal__title\" id=\"reservation-modal-title\">Are you making this reservation for someone else?<\/h3>\\\r\n                                                            <p class=\"reservation-modal__subtitle\">If not, we will submit the booking request normally. If yes, we will include the traveller details below.<\/p>\\\r\n                                                        <\/div>\\\r\n                                                        <div class=\"reservation-modal__body\">\\\r\n                                                            <div class=\"reservation-modal__step is-active\" id=\"reservation-modal-step-question\">\\\r\n                                                                <div class=\"reservation-modal__actions\">\\\r\n                                                                    <button type=\"button\" class=\"reservation-modal__btn reservation-modal__btn--primary\" id=\"reservation-modal-yes\">Yes<\/button>\\\r\n                                                                    <button type=\"button\" class=\"reservation-modal__btn reservation-modal__btn--secondary\" id=\"reservation-modal-no\">No<\/button>\\\r\n                                                                <\/div>\\\r\n                                                            <\/div>\\\r\n                                                            <div class=\"reservation-modal__step\" id=\"reservation-modal-step-details\">\\\r\n                                                                <label class=\"reservation-modal__checkbox\">\\\r\n                                                                    <input type=\"checkbox\" id=\"reservation-same-as-previously-entered\">\\\r\n                                                                    <span>Same as previously entered?<\/span>\\\r\n                                                                <\/label>\\\r\n                                                                <div class=\"booking-extra-grid\">\\\r\n                                                                    <div class=\"booking-extra-field\">\\\r\n                                                                        <label for=\"reservation_for_other_name\">Passenger Name<\/label>\\\r\n                                                                        <input type=\"text\" id=\"reservation_for_other_name\" data-booking-field=\"reservation-name\" disabled>\\\r\n                                                                    <\/div>\\\r\n                                                                <\/div>\\\r\n                                                                <div id=\"reservation-other-passengers-wrapper\" style=\"margin-top:14px; display:none;\">\\\r\n                                                                    <label class=\"booking-extra-label\">Additional Passengers<\/label>\\\r\n                                                                    <div id=\"reservation-other-passengers-fields\" class=\"booking-extra-grid\"><\/div>\\\r\n                                                                <\/div>\\\r\n                                                                <div class=\"reservation-modal__actions\">\\\r\n                                                                    <button type=\"button\" class=\"reservation-modal__btn reservation-modal__btn--primary\" id=\"reservation-modal-confirm\">Continue<\/button>\\\r\n                                                                    <button type=\"button\" class=\"reservation-modal__btn reservation-modal__btn--secondary\" id=\"reservation-modal-back\">Back<\/button>\\\r\n                                                                <\/div>\\\r\n                                                            <\/div>\\\r\n                                                        <\/div>\\\r\n                                                    <\/div>\\\r\n                                                <\/div>';\r\n\r\n                $form.append(modalHtml);\r\n            }\r\n\r\n            function renderAdditionalPassengerFields(passengers) {\r\n                ensurePassengerSelector();\r\n                ensureAdditionalPassengerSection();\r\n\r\n                const extraPassengers = Math.max(0, passengers - 1);\r\n                const $section = $('#additional-passengers-section');\r\n                const $container = $('#additional-passengers-fields');\r\n\r\n                if (!$section.length || !$container.length) return;\r\n\r\n                const previousValues = $container.find('input').map(function () {\r\n                    return $(this).val();\r\n                }).get();\r\n\r\n                if (extraPassengers === 0) {\r\n                    $container.empty();\r\n                    $section.hide();\r\n                    return;\r\n                }\r\n\r\n                let html = '';\r\n                for (let i = 0; i < extraPassengers; i += 1) {\r\n                    const index = i + 2;\r\n                    const value = previousValues[i] || '';\r\n                    html += '\\\r\n                                                    <div class=\"booking-extra-field\">\\\r\n                                                        <label for=\"additional_passenger_' + index + '\">Passenger ' + index + '<\/label>\\\r\n                                                        <input type=\"text\" id=\"additional_passenger_' + index + '\" data-booking-field=\"additional-passenger\" value=\"' + $('<div>').text(value).html() + '\">\\\r\n                                                    <\/div>';\r\n                }\r\n\r\n                $container.html(html);\r\n                $section.show();\r\n            }\r\n\r\n            function renderReservationPassengerFields(passengers) {\r\n                ensurePassengerSelector();\r\n\r\n                const extraPassengers = Math.max(0, passengers - 1);\r\n                const $wrapper = $('#reservation-other-passengers-wrapper');\r\n                const $container = $('#reservation-other-passengers-fields');\r\n\r\n                if (!$wrapper.length || !$container.length) return;\r\n\r\n                const previousValues = $container.find('input').map(function () {\r\n                    return $(this).val();\r\n                }).get();\r\n\r\n                if (extraPassengers === 0) {\r\n                    $container.empty();\r\n                    $wrapper.hide();\r\n                    return;\r\n                }\r\n\r\n                let html = '';\r\n                for (let i = 0; i < extraPassengers; i += 1) {\r\n                    const index = i + 2;\r\n                    const value = previousValues[i] || '';\r\n                    html += '\\\r\n                                                    <div class=\"booking-extra-field\">\\\r\n                                                        <label for=\"reservation_for_other_additional_passenger_' + index + '\">Passenger ' + index + '<\/label>\\\r\n                                                        <input type=\"text\" id=\"reservation_for_other_additional_passenger_' + index + '\" data-booking-field=\"reservation-additional-passenger\" value=\"' + $('<div>').text(value).html() + '\" disabled>\\\r\n                                                    <\/div>';\r\n                }\r\n\r\n                $container.html(html);\r\n                $wrapper.show();\r\n            }\r\n\r\n            function getAdditionalPassengerValues() {\r\n                return $('#additional-passengers-fields input').map(function () {\r\n                    return ($(this).val() || '').trim();\r\n                }).get().filter(function (value) {\r\n                    return value !== '';\r\n                });\r\n            }\r\n\r\n            function getReservationAdditionalPassengerValues() {\r\n                return $('#reservation-other-passengers-fields input').map(function () {\r\n                    return ($(this).val() || '').trim();\r\n                }).get().filter(function (value) {\r\n                    return value !== '';\r\n                });\r\n            }\r\n\r\n            function syncBookingPayloadFields() {\r\n                ensureBookingFields();\r\n\r\n                const additionalPassengers = getAdditionalPassengerValues();\r\n                const reservationOtherName = (($('#reservation_for_other_name').val() || '').trim());\r\n                const reservationAdditionalPassengers = getReservationAdditionalPassengerValues();\r\n                const sameAsPreviouslyEntered = $('#reservation-same-as-previously-entered').is(':checked');\r\n                const bookingForSomeoneElse = ($('#booking_for_someone_else').val() || 'no').toLowerCase() === 'yes';\r\n\r\n                $('#additional_passengers_payload').val(JSON.stringify(additionalPassengers));\r\n                $('#reservation_for_other_name_payload').val(reservationOtherName);\r\n                $('#reservation_for_other_additional_passengers_payload').val(JSON.stringify(reservationAdditionalPassengers));\r\n                $('#reservation_contact_same_as_passengers').val(sameAsPreviouslyEntered ? '1' : '0');\r\n                $('#same_as_previously_entered_payload').val(sameAsPreviouslyEntered ? 'yes' : 'no');\r\n\r\n            }\r\n\r\n            function escapeHtml(value) {\r\n                return String(value || '')\r\n                    .replace(\/&\/g, '&amp;')\r\n                    .replace(\/<\/g, '&lt;')\r\n                    .replace(\/>\/g, '&gt;')\r\n                    .replace(\/\"\/g, '&quot;')\r\n                    .replace(\/'\/g, '&#039;');\r\n            }\r\n\r\n            function getFieldValidationMessage($field) {\r\n                if (!$field || !$field.length) {\r\n                    return 'This field is required.';\r\n                }\r\n\r\n                const type = (($field.attr('type') || '') + '').toLowerCase();\r\n                const value = (($field.val() || '') + '').trim();\r\n                const metadata = [\r\n                    $field.attr('id') || '',\r\n                    $field.attr('name') || '',\r\n                    $field.attr('placeholder') || '',\r\n                    $field.attr('data-field-name') || '',\r\n                    $field.closest('.booking-extra-field, .jet-form-builder-row').find('label').first().text() || ''\r\n                ].join(' ').toLowerCase();\r\n                const labelText = (($field.closest('.booking-extra-field, .jet-form-builder-row').find('label').first().text() || '').toString().trim());\r\n                const passengerMatch = labelText.match(\/Passenger\\s+(\\d+)\/i);\r\n\r\n                if (type === 'email') {\r\n                    return value === ''\r\n                        ? 'Please enter email address.'\r\n                        : 'Please enter a valid email address.';\r\n                }\r\n\r\n                if (metadata.includes('phone') || metadata.includes('telefono')) {\r\n                    return 'Please enter phone number.';\r\n                }\r\n\r\n                if (metadata.includes('type_of_service') || metadata.includes('type of service') || metadata.includes('typeservicerow')) {\r\n                    return 'Please select type of service.';\r\n                }\r\n\r\n                if (type === 'date' || metadata.includes('datelegrow') || metadata.includes('travel date') || metadata.includes('date')) {\r\n                    return 'Please select date.';\r\n                }\r\n\r\n                if (metadata.includes('reservation_for_other_name')) {\r\n                    return 'Please enter the passenger name for this reservation.';\r\n                }\r\n\r\n                if (passengerMatch) {\r\n                    return 'Please enter the name for passenger ' + passengerMatch[1] + '.';\r\n                }\r\n\r\n                if (metadata.includes('additional_passenger') || metadata.includes('reservation-additional-passenger') || metadata.includes('passenger')) {\r\n                    return 'Please enter passenger name.';\r\n                }\r\n\r\n                if (metadata.includes('name')) {\r\n                    return 'Please enter name.';\r\n                }\r\n\r\n                return 'This field is required.';\r\n            }\r\n\r\n            function setFieldInvalidState($field, isInvalid) {\r\n                if (!$field || !$field.length) return;\r\n                $field.removeClass('is-invalid').attr('aria-invalid', isInvalid ? 'true' : 'false');\r\n\r\n                if ($field.is('select') && $field.next('.select2').length) {\r\n                    $field.next('.select2').removeClass('is-invalid-select2');\r\n                }\r\n\r\n                const $container = $field.closest('.booking-extra-field, .jet-form-builder-row');\r\n                $container.find('.jet-form-builder__field-error').remove();\r\n            }\r\n\r\n            function isSelectPlaceholderValue($field) {\r\n                if (!$field.is('select')) return false;\r\n                const value = ($field.val() || '').toString().trim().toLowerCase();\r\n                return value === '' || value === 'type of service' || value === 'typeofservice';\r\n            }\r\n\r\n            function isFlightRelatedField($field) {\r\n                if (!$field || !$field.length) return false;\r\n\r\n                const metadata = [\r\n                    $field.attr('id') || '',\r\n                    $field.attr('name') || '',\r\n                    $field.attr('class') || '',\r\n                    $field.attr('data-field-name') || ''\r\n                ].join(' ').toLowerCase();\r\n\r\n                return metadata.includes('flightrow') ||\r\n                    metadata.includes('arrivingflightrow') ||\r\n                    metadata.includes('departingflightrow') ||\r\n                    metadata.includes('typeservicerow') ||\r\n                    metadata.includes('datelegrow') ||\r\n                    metadata.includes('aerolineas') ||\r\n                    metadata.includes('airport') ||\r\n                    $field.closest('.jet-form-builder-repeater__row').length > 0;\r\n            }\r\n\r\n            function isMainBookingFieldRequired($field) {\r\n                if (!$field || !$field.length) return false;\r\n\r\n                const isRequired = $field.prop('required') ||\r\n                    $field.attr('aria-required') === 'true' ||\r\n                    $field.closest('.jet-form-builder-row').find('.jet-form-builder__required').length > 0;\r\n\r\n                if (isRequired) {\r\n                    return true;\r\n                }\r\n\r\n                const metadata = [\r\n                    $field.attr('id') || '',\r\n                    $field.attr('name') || '',\r\n                    $field.attr('placeholder') || '',\r\n                    $field.attr('data-field-name') || '',\r\n                    $field.closest('.jet-form-builder-row').find('label').first().text() || ''\r\n                ].join(' ').toLowerCase();\r\n\r\n                if (($field.attr('type') || '').toLowerCase() === 'email') {\r\n                    return true;\r\n                }\r\n\r\n                return metadata.includes('name') || metadata.includes('email') || metadata.includes('phone') || metadata.includes('telefono');\r\n            }\r\n\r\n            function getPrimaryEmailField() {\r\n                return getForm().find('input[type=\"email\"]').filter(':visible').first();\r\n            }\r\n\r\n            function getPrimaryPhoneField() {\r\n                return getForm().find('input[type=\"tel\"], input[name*=\"phone\"], input[name*=\"telefono\"], .phonenumberrow input').filter(':visible').first();\r\n            }\r\n\r\n            function getCoreBookingFields() {\r\n                const fields = [];\r\n                const seen = new Set();\r\n\r\n                [getPrimaryPassengerField(), getPrimaryEmailField(), getPrimaryPhoneField()].forEach(function ($field) {\r\n                    if (!$field || !$field.length) return;\r\n                    const key = $field.attr('id') || $field.attr('name') || String(fields.length);\r\n                    if (seen.has(key)) return;\r\n                    seen.add(key);\r\n                    fields.push($field);\r\n                });\r\n\r\n                return fields;\r\n            }\r\n\r\n            function getAdditionalPassengerFields() {\r\n                return $('#additional-passengers-fields input');\r\n            }\r\n\r\n            function isMainFieldValid($field) {\r\n                if (!$field || !$field.length) return true;\r\n\r\n                const value = ($field.val() || '').toString().trim();\r\n                const type = (($field.attr('type') || '') + '').toLowerCase();\r\n\r\n                if (type === 'email') {\r\n                    return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(value);\r\n                }\r\n\r\n                return value !== '' && !isSelectPlaceholderValue($field);\r\n            }\r\n\r\n            function showCoreFieldValidationFeedback($field) {\r\n                if (!$field || !$field.length) return;\r\n\r\n                const type = (($field.attr('type') || '') + '').toLowerCase();\r\n                const sharedHelpers = window.apiFormFieldHelpers || {};\r\n                const validateEmail = typeof validateEmailField === 'function'\r\n                    ? validateEmailField\r\n                    : function ($input, options) {\r\n                        if (typeof sharedHelpers.validateEmailField === 'function') {\r\n                            return sharedHelpers.validateEmailField($input, options);\r\n                        }\r\n                        return true;\r\n                    };\r\n                const validateRequired = typeof validateRequiredField === 'function'\r\n                    ? validateRequiredField\r\n                    : function ($currentField, options) {\r\n                        if (typeof sharedHelpers.validateRequiredField === 'function') {\r\n                            return sharedHelpers.validateRequiredField($currentField, options);\r\n                        }\r\n                        return true;\r\n                    };\r\n                const getEmailFeedback = typeof getEmailFeedbackElement === 'function'\r\n                    ? getEmailFeedbackElement\r\n                    : function ($input) {\r\n                        if (typeof sharedHelpers.getEmailFeedbackElement === 'function') {\r\n                            return sharedHelpers.getEmailFeedbackElement($input);\r\n                        }\r\n\r\n                        let $feedback = $input.siblings('.email-bootstrap-feedback').first();\r\n                        if (!$feedback.length) {\r\n                            $feedback = $('<div class=\"email-bootstrap-feedback\">Please enter a valid email address.<\/div>');\r\n                            $input.after($feedback);\r\n                        }\r\n                        return $feedback;\r\n                    };\r\n                const getRequiredFeedback = typeof getRequiredFeedbackElement === 'function'\r\n                    ? getRequiredFeedbackElement\r\n                    : function ($currentField) {\r\n                        if (typeof sharedHelpers.getRequiredFeedbackElement === 'function') {\r\n                            return sharedHelpers.getRequiredFeedbackElement($currentField);\r\n                        }\r\n\r\n                        let $anchor = $currentField;\r\n                        if ($currentField.is('select') && $currentField.next('.select2').length) {\r\n                            $anchor = $currentField.next('.select2');\r\n                        }\r\n\r\n                        let $feedback = $anchor.siblings('.required-bootstrap-feedback').first();\r\n                        if (!$feedback.length) {\r\n                            $feedback = $('<div class=\"required-bootstrap-feedback\">This field is required.<\/div>');\r\n                            $anchor.after($feedback);\r\n                        }\r\n                        return $feedback;\r\n                    };\r\n\r\n                if (type === 'email') {\r\n                    $field.data('required-touched', true);\r\n                    getEmailFeedback($field).text(getFieldValidationMessage($field));\r\n                    validateEmail($field, { showFloating: true, hideDelay: 5000 });\r\n                    return;\r\n                }\r\n\r\n                $field.data('required-touched', true);\r\n                getRequiredFeedback($field).text(getFieldValidationMessage($field));\r\n                validateRequired($field, { showFloating: true, hideDelay: 5000 });\r\n            }\r\n\r\n            function revealBlockedSubmitValidation() {\r\n                window.apiFormRevealValidationSummary = true;\r\n\r\n                getCoreBookingFields().forEach(function ($field) {\r\n                    if (!isMainFieldValid($field)) {\r\n                        showCoreFieldValidationFeedback($field);\r\n                    }\r\n                });\r\n\r\n                getAdditionalPassengerFields().each(function () {\r\n                    const $field = $(this);\r\n                    if ((($field.val() || '').toString().trim()) === '') {\r\n                        showCoreFieldValidationFeedback($field);\r\n                    }\r\n                });\r\n\r\n                refreshCustomBookingValidationState();\r\n            }\r\n\r\n            function getValidationSummaryWrap() {\r\n                const $form = getForm();\r\n                if (!$form.length) return $();\r\n\r\n                let $wrap = $form.find('#api-form-validation-summary').first();\r\n                if ($wrap.length) return $wrap;\r\n\r\n                const html = '<div id=\"api-form-validation-summary\" class=\"jet-form-builder-messages-wrap\" style=\"display:none;\"><div class=\"jet-form-builder-message jet-form-builder-message--error\"><\/div><\/div>';\r\n                const $submitRow = $form.find('.jet-form-builder-row.field-type-submit-field').first();\r\n\r\n                if ($submitRow.length) {\r\n                    $submitRow.after(html);\r\n                } else {\r\n                    $form.append(html);\r\n                }\r\n\r\n                return $form.find('#api-form-validation-summary').first();\r\n            }\r\n\r\n            function renderValidationSummary(messages) {\r\n                const uniqueMessages = [];\r\n\r\n                (messages || []).forEach(function (message) {\r\n                    const normalized = String(message || '').trim();\r\n                    if (normalized && uniqueMessages.indexOf(normalized) === -1) {\r\n                        uniqueMessages.push(normalized);\r\n                    }\r\n                });\r\n\r\n                const $wrap = getValidationSummaryWrap();\r\n                if (!$wrap.length) return;\r\n\r\n                const shouldReveal = window.apiFormRevealValidationSummary === true || $('.jet-form-builder__field-error').length > 0;\r\n\r\n                if (!uniqueMessages.length || !shouldReveal) {\r\n                    $wrap.hide().find('.jet-form-builder-message').empty();\r\n                    return;\r\n                }\r\n\r\n                const listHtml = '<ul style=\"margin:0; padding-left:18px;\">' + uniqueMessages.map(function (message) {\r\n                    return '<li>' + escapeHtml(message) + '<\/li>';\r\n                }).join('') + '<\/ul>';\r\n\r\n                $wrap.find('.jet-form-builder-message').html(listHtml);\r\n                $wrap.show();\r\n            }\r\n\r\n            function collectMainFormValidationErrors() {\r\n                const $form = getForm();\r\n                const errors = [];\r\n                const seenMessages = new Set();\r\n                if (!$form.length) return errors;\r\n\r\n                const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\r\n\r\n                function pushError(message) {\r\n                    const normalized = String(message || '').trim();\r\n                    if (!normalized || seenMessages.has(normalized)) return;\r\n                    seenMessages.add(normalized);\r\n                    errors.push(normalized);\r\n                }\r\n\r\n                $form.find('input, select, textarea').filter(':visible').not('#reservation-for-others-modal input, #reservation-for-others-modal select, #reservation-for-others-modal textarea').each(function () {\r\n                    const $field = $(this);\r\n\r\n                    if ($field.is('[type=\"hidden\"], [type=\"submit\"], [type=\"button\"], [type=\"radio\"], [type=\"checkbox\"], [type=\"file\"]')) {\r\n                        return;\r\n                    }\r\n\r\n                    if (isFlightRelatedField($field)) {\r\n                        return;\r\n                    }\r\n\r\n                    const isRequired = isMainBookingFieldRequired($field);\r\n                    if (!isRequired) {\r\n                        return;\r\n                    }\r\n\r\n                    const value = ($field.val() || '').toString().trim();\r\n                    let fieldValid = value !== '';\r\n\r\n                    if (($field.attr('type') || '').toLowerCase() === 'email') {\r\n                        fieldValid = fieldValid && emailRegex.test(value);\r\n                    }\r\n\r\n                    if (fieldValid && isSelectPlaceholderValue($field)) {\r\n                        fieldValid = false;\r\n                    }\r\n\r\n                    if (!fieldValid) {\r\n                        pushError(getFieldValidationMessage($field));\r\n                    }\r\n                });\r\n\r\n                $('#additional-passengers-fields input').each(function () {\r\n                    const $field = $(this);\r\n                    if ((($field.val() || '').toString().trim()) === '') {\r\n                        pushError(getFieldValidationMessage($field));\r\n                    }\r\n                });\r\n\r\n                getCoreBookingFields().forEach(function ($field) {\r\n                    if (!isMainFieldValid($field)) {\r\n                        pushError(getFieldValidationMessage($field));\r\n                    }\r\n                });\r\n\r\n                return errors;\r\n            }\r\n\r\n            function collectReservationModalValidationErrors() {\r\n                const errors = [];\r\n\r\n                if (!$('#reservation-for-others-modal').hasClass('is-open')) {\r\n                    return errors;\r\n                }\r\n\r\n                if ($('#reservation-modal-step-details').hasClass('is-active') && !$('#reservation-same-as-previously-entered').is(':checked')) {\r\n                    const $nameField = $('#reservation_for_other_name');\r\n                    if ((($nameField.val() || '').toString().trim()) === '') {\r\n                        errors.push(getFieldValidationMessage($nameField));\r\n                    }\r\n\r\n                    $('#reservation-other-passengers-fields input').each(function () {\r\n                        const $field = $(this);\r\n                        if ((($field.val() || '').toString().trim()) === '') {\r\n                            errors.push(getFieldValidationMessage($field));\r\n                        }\r\n                    });\r\n                }\r\n\r\n                return errors;\r\n            }\r\n\r\n            function refreshValidationSummary() {\r\n                const flightErrors = typeof getFlightValidationErrors === 'function'\r\n                    ? getFlightValidationErrors()\r\n                    : (typeof window.getFlightValidationErrors === 'function' ? window.getFlightValidationErrors() : []);\r\n\r\n                renderValidationSummary(\r\n                    collectMainFormValidationErrors()\r\n                        .concat(collectReservationModalValidationErrors())\r\n                        .concat(flightErrors)\r\n                );\r\n            }\r\n\r\n            function validateMainFormFields(markInvalid) {\r\n                const $form = getForm();\r\n                if (!$form.length) return false;\r\n\r\n                let isValid = true;\r\n                const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\r\n\r\n                $form.find('input, select, textarea').filter(':visible').not('#reservation-for-others-modal input, #reservation-for-others-modal select, #reservation-for-others-modal textarea').each(function () {\r\n                    const $field = $(this);\r\n\r\n                    if ($field.is('[type=\"hidden\"], [type=\"submit\"], [type=\"button\"], [type=\"radio\"], [type=\"checkbox\"], [type=\"file\"]')) {\r\n                        return;\r\n                    }\r\n\r\n                    const isRequired = isMainBookingFieldRequired($field);\r\n                    if (!isRequired) {\r\n                        return;\r\n                    }\r\n\r\n                    const value = ($field.val() || '').toString().trim();\r\n                    let fieldValid = value !== '';\r\n\r\n                    if ($field.attr('type') === 'email') {\r\n                        fieldValid = fieldValid && emailRegex.test(value);\r\n                    }\r\n\r\n                    if (fieldValid && isSelectPlaceholderValue($field)) {\r\n                        fieldValid = false;\r\n                    }\r\n\r\n                    if (!fieldValid) {\r\n                        isValid = false;\r\n                    }\r\n\r\n                    if (markInvalid) {\r\n                        setFieldInvalidState($field, !fieldValid);\r\n                    }\r\n                });\r\n\r\n                $('#additional-passengers-fields input').each(function () {\r\n                    const $field = $(this);\r\n                    const fieldValid = (($field.val() || '').toString().trim() !== '');\r\n                    if (!fieldValid) {\r\n                        isValid = false;\r\n                    }\r\n                    if (markInvalid) {\r\n                        setFieldInvalidState($field, !fieldValid);\r\n                    }\r\n                });\r\n\r\n                getCoreBookingFields().forEach(function ($field) {\r\n                    const fieldValid = isMainFieldValid($field);\r\n                    if (!fieldValid) {\r\n                        isValid = false;\r\n                    }\r\n\r\n                    if (markInvalid && !fieldValid) {\r\n                        showCoreFieldValidationFeedback($field);\r\n                    }\r\n                });\r\n\r\n                return isValid;\r\n            }\r\n\r\n            function validateReservationModalFields(markInvalid) {\r\n                if (!$('#reservation-for-others-modal').hasClass('is-open')) {\r\n                    return true;\r\n                }\r\n\r\n                if ($('#reservation-modal-step-details').hasClass('is-active') && !$('#reservation-same-as-previously-entered').is(':checked')) {\r\n                    let isValid = true;\r\n                    const $nameField = $('#reservation_for_other_name');\r\n                    const nameValid = (($nameField.val() || '').toString().trim() !== '');\r\n\r\n                    if (!nameValid) {\r\n                        isValid = false;\r\n                    }\r\n\r\n                    if (markInvalid) {\r\n                        setFieldInvalidState($nameField, !nameValid);\r\n                    }\r\n\r\n                    $('#reservation-other-passengers-fields input').each(function () {\r\n                        const $field = $(this);\r\n                        const fieldValid = (($field.val() || '').toString().trim() !== '');\r\n                        if (!fieldValid) {\r\n                            isValid = false;\r\n                        }\r\n                        if (markInvalid) {\r\n                            setFieldInvalidState($field, !fieldValid);\r\n                        }\r\n                    });\r\n\r\n                    return isValid;\r\n                }\r\n\r\n                return true;\r\n            }\r\n\r\n            function refreshCustomBookingValidationState() {\r\n                const mainFormValid = validateMainFormFields(false);\r\n                const modalValid = validateReservationModalFields(false);\r\n                window.customBookingFieldsValid = mainFormValid && modalValid;\r\n                refreshValidationSummary();\r\n                if (typeof updateSubmitButtonState === 'function') {\r\n                    updateSubmitButtonState();\r\n                } else if (window.apiFormFieldHelpers && typeof window.apiFormFieldHelpers.updateSubmitButtonState === 'function') {\r\n                    window.apiFormFieldHelpers.updateSubmitButtonState();\r\n                }\r\n            }\r\n\r\n            function updateDisplay() {\r\n                ensurePassengerSelector();\r\n                ensureAdditionalPassengerSection();\r\n\r\n                if (isSyncingPassengerLuggage) return;\r\n\r\n                const passengers = Math.max(1, parseCount($('#passenger-count').text(), 1));\r\n                const luggage = Math.max(0, parseCount($('#luggage-count').text(), 0));\r\n\r\n                $('.passengers-display').text(passengers + (passengers === 1 ? ' Passenger' : ' Passengers'));\r\n                $('.luggage-display').text(luggage + ' Luggage');\r\n\r\n                isSyncingPassengerLuggage = true;\r\n                getPassengerInput().val(passengers);\r\n                getLuggageInput().val(luggage);\r\n                isSyncingPassengerLuggage = false;\r\n\r\n                renderAdditionalPassengerFields(passengers);\r\n                renderReservationPassengerFields(passengers);\r\n                syncBookingPayloadFields();\r\n            }\r\n\r\n            function updateButtonStates() {\r\n                const passengers = Math.max(1, parseCount($('#passenger-count').text(), 1));\r\n                const luggage = Math.max(0, parseCount($('#luggage-count').text(), 0));\r\n\r\n                $('.minus-passenger').prop('disabled', passengers <= 1);\r\n                $('.minus-luggage').prop('disabled', luggage <= 0);\r\n            }\r\n\r\n            function syncCountsFromInputs() {\r\n                ensurePassengerSelector();\r\n                ensureAdditionalPassengerSection();\r\n\r\n                if (isSyncingPassengerLuggage) return;\r\n\r\n                const passengers = Math.max(1, parseCount(getPassengerInput().val(), 1));\r\n                const luggage = Math.max(0, parseCount(getLuggageInput().val(), 0));\r\n\r\n                isSyncingPassengerLuggage = true;\r\n                $('#passenger-count').text(passengers);\r\n                $('#luggage-count').text(luggage);\r\n                isSyncingPassengerLuggage = false;\r\n\r\n                updateDisplay();\r\n                updateButtonStates();\r\n            }\r\n\r\n            function syncAdditionalPassengerUI() {\r\n                const passengers = Math.max(1, parseCount(getPassengerInput().val(), 1));\r\n                renderAdditionalPassengerFields(passengers);\r\n                renderReservationPassengerFields(passengers);\r\n            }\r\n\r\n            function getPrimaryFlightRow() {\r\n                return getForm().find('.jet-form-builder-repeater__row').first();\r\n            }\r\n\r\n            function prefillServiceType(value) {\r\n                if (!value) return;\r\n\r\n                const normalized = value.toString().trim().toLowerCase();\r\n                const $row = getPrimaryFlightRow();\r\n                const $select = $row.length\r\n                    ? $row.find('select[name*=\"type_of_service\"], select.typeservicerow').first()\r\n                    : getForm().find('select[name*=\"type_of_service\"], select.typeservicerow').first();\r\n                if (!$select.length) return;\r\n\r\n                const matchingValue = $select.find('option').filter(function () {\r\n                    return ($(this).val() || '').toLowerCase() === normalized;\r\n                }).first().val();\r\n\r\n                if (matchingValue) {\r\n                    $select.val(matchingValue).trigger('change');\r\n                }\r\n            }\r\n\r\n            function prefillDate(value) {\r\n                if (!value) return;\r\n                const $row = getPrimaryFlightRow();\r\n                const $dateField = $row.length\r\n                    ? $row.find('input.datelegrow, input[type=\"date\"]').first()\r\n                    : getForm().find('input.datelegrow, input[type=\"date\"]').filter(':visible').first();\r\n                if ($dateField.length) {\r\n                    $dateField.val(value).trigger('input').trigger('change');\r\n                }\r\n            }\r\n\r\n            function prefillEmail(value) {\r\n                if (!value) return;\r\n                const $emailField = getForm().find('input[type=\"email\"]').filter(':visible').first();\r\n                if ($emailField.length) {\r\n                    $emailField.val(value).trigger('input').trigger('change');\r\n                }\r\n            }\r\n\r\n            function getPrefillServiceType() {\r\n                if (bookingPrefill.service_type) {\r\n                    return bookingPrefill.service_type;\r\n                }\r\n\r\n                if (Array.isArray(bookingPrefill.legs) && bookingPrefill.legs.length && bookingPrefill.legs[0].type) {\r\n                    return bookingPrefill.legs[0].type;\r\n                }\r\n\r\n                return '';\r\n            }\r\n\r\n            function getPrefillTravelDate() {\r\n                if (bookingPrefill.travel_date) {\r\n                    return bookingPrefill.travel_date;\r\n                }\r\n\r\n                if (bookingPrefill.service_date) {\r\n                    return bookingPrefill.service_date;\r\n                }\r\n\r\n                if (Array.isArray(bookingPrefill.legs) && bookingPrefill.legs.length && bookingPrefill.legs[0].date) {\r\n                    return bookingPrefill.legs[0].date;\r\n                }\r\n\r\n                return '';\r\n            }\r\n\r\n            function applyBookingPrefill() {\r\n                prefillServiceType(getPrefillServiceType());\r\n                prefillDate(getPrefillTravelDate());\r\n                prefillEmail(bookingPrefill.email || '');\r\n\r\n                if (bookingPrefill.passengers) {\r\n                    getPassengerInput().val(Math.max(1, parseCount(bookingPrefill.passengers, 1)));\r\n                }\r\n\r\n                if (typeof bookingPrefill.luggage !== 'undefined' && bookingPrefill.luggage !== null && bookingPrefill.luggage !== '') {\r\n                    getLuggageInput().val(Math.max(0, parseCount(bookingPrefill.luggage, 0)));\r\n                }\r\n\r\n                syncCountsFromInputs();\r\n            }\r\n\r\n            function setReservationFieldState(enabled) {\r\n                $('#reservation_for_other_name, #reservation-other-passengers-fields input').prop('disabled', !enabled);\r\n                $('#reservation_contact_same_as_passengers').val($('#reservation-same-as-previously-entered').is(':checked') ? '1' : '0');\r\n                syncBookingPayloadFields();\r\n            }\r\n\r\n            function fillReservationFromMainPassengerData() {\r\n                const primaryName = getPrimaryPassengerField().val() || '';\r\n                $('#reservation_for_other_name').val(primaryName);\r\n\r\n                const extraValues = $('#additional-passengers-fields input').map(function () {\r\n                    return $(this).val();\r\n                }).get();\r\n\r\n                $('#reservation-other-passengers-fields input').each(function (index) {\r\n                    $(this).val(extraValues[index] || '');\r\n                });\r\n\r\n                syncBookingPayloadFields();\r\n            }\r\n\r\n            function clearReservationModalFields() {\r\n                $('#reservation_for_other_name').val('');\r\n                $('#reservation-other-passengers-fields input').val('');\r\n                $('#reservation_contact_same_as_passengers').val('0');\r\n                syncBookingPayloadFields();\r\n            }\r\n\r\n            function openReservationModal() {\r\n                window.formWasSubmitted = false;\r\n                $('html, body').addClass('reservation-modal-open');\r\n                $('#reservation-modal-step-question').addClass('is-active');\r\n                $('#reservation-modal-step-details').removeClass('is-active');\r\n                $('#reservation-for-others-modal').addClass('is-open').attr('aria-hidden', 'false');\r\n                refreshCustomBookingValidationState();\r\n            }\r\n\r\n            function closeReservationModal() {\r\n                const activeElement = document.activeElement;\r\n                if (activeElement && typeof activeElement.blur === 'function' && $(activeElement).closest('#reservation-for-others-modal').length) {\r\n                    activeElement.blur();\r\n                }\r\n\r\n                $('html, body').removeClass('reservation-modal-open');\r\n                $('#reservation-for-others-modal').removeClass('is-open').attr('aria-hidden', 'true');\r\n                refreshCustomBookingValidationState();\r\n            }\r\n\r\n            function submitFormAfterDecision() {\r\n                const form = getForm().get(0);\r\n                if (!form) return;\r\n\r\n                closeReservationModal();\r\n                window.apiFormAllowMessageScroll = true;\r\n                window.apiFormSkipGlobalSubmitValidation = true;\r\n                submitBypass = true;\r\n\r\n                if (typeof form.requestSubmit === 'function') {\r\n                    form.requestSubmit();\r\n                } else {\r\n                    form.submit();\r\n                }\r\n            }\r\n\r\n            function attachSubmitInterception() {\r\n                const form = getForm().get(0);\r\n                if (!form || form.dataset.bookingDecisionBound === '1') return;\r\n\r\n                form.dataset.bookingDecisionBound = '1';\r\n                form.addEventListener('submit', function (event) {\r\n                    if (submitBypass) {\r\n                        submitBypass = false;\r\n                        return;\r\n                    }\r\n\r\n                    if (decisionCaptured) {\r\n                        return;\r\n                    }\r\n\r\n                    event.preventDefault();\r\n                    event.stopPropagation();\r\n                    if (typeof event.stopImmediatePropagation === 'function') {\r\n                        event.stopImmediatePropagation();\r\n                    }\r\n\r\n                    if (!validateMainFormFields(true)) {\r\n                        window.apiFormRevealValidationSummary = true;\r\n                        refreshCustomBookingValidationState();\r\n                        return;\r\n                    }\r\n\r\n                    if (window.flightError === true || window.activeApiRequests > 0) {\r\n                        const msg = window.flightError === true ? buildFlightValidationMessageHtml() : 'Please wait while flight data is loading.';\r\n                        let $wrap = $(form).find('.jet-form-builder-messages-wrap');\r\n                        if (!$wrap.length) {\r\n                            $(form).append('<div class=\"jet-form-builder-messages-wrap\" data-form-id=\"' + (form.dataset.formId || '') + '\"><\/div>');\r\n                            $wrap = $(form).find('.jet-form-builder-messages-wrap');\r\n                        }\r\n                        $wrap.html('<div class=\"jet-form-builder-message jet-form-builder-message--error\">' + msg + '<\/div>');\r\n                        return;\r\n                    }\r\n\r\n                    openReservationModal();\r\n                }, true);\r\n            }\r\n\r\n            function initializeCustomBookingExperience() {\r\n                if (bookingExperienceReady) return true;\r\n                if (!ensureBookingFields()) return false;\r\n                if (!ensurePassengerSelector()) return false;\r\n                ensureAdditionalPassengerSection();\r\n\r\n                syncAdditionalPassengerUI();\r\n                ensureReservationModal();\r\n                attachSubmitInterception();\r\n                syncCountsFromInputs();\r\n                applyBookingPrefill();\r\n                refreshCustomBookingValidationState();\r\n                bookingExperienceReady = true;\r\n                return true;\r\n            }\r\n\r\n            $(document).on('click', '.plus-passenger', function () {\r\n                $('#passenger-count').text(parseCount($('#passenger-count').text(), 1) + 1);\r\n                updateDisplay();\r\n                updateButtonStates();\r\n            });\r\n\r\n            $(document).on('click', '.minus-passenger', function () {\r\n                const current = parseCount($('#passenger-count').text(), 1);\r\n                if (current > 1) {\r\n                    $('#passenger-count').text(current - 1);\r\n                    updateDisplay();\r\n                    updateButtonStates();\r\n                }\r\n            });\r\n\r\n            $(document).on('click', '.plus-luggage', function () {\r\n                $('#luggage-count').text(parseCount($('#luggage-count').text(), 0) + 1);\r\n                updateDisplay();\r\n                updateButtonStates();\r\n            });\r\n\r\n            $(document).on('click', '.minus-luggage', function () {\r\n                const current = parseCount($('#luggage-count').text(), 0);\r\n                if (current > 0) {\r\n                    $('#luggage-count').text(current - 1);\r\n                    updateDisplay();\r\n                    updateButtonStates();\r\n                }\r\n            });\r\n\r\n            $(document).on('input change', '#number_of_passengers', function () {\r\n                syncCountsFromInputs();\r\n            });\r\n\r\n            $(document).on('input change', '#number_of_luggage', function () {\r\n                syncCountsFromInputs();\r\n            });\r\n\r\n            $(document).on('input change', '#additional-passengers-fields input, #reservation-other-passengers-fields input, #reservation_for_other_name', function (event) {\r\n                const $field = $(this);\r\n                const hasValue = (($field.val() || '').toString().trim() !== '');\r\n                const shouldRevealError = !!event.originalEvent || $field.hasClass('is-invalid') || $field.closest('.booking-extra-field, .jet-form-builder-row').find('.jet-form-builder__field-error').length > 0;\r\n\r\n                if (event.originalEvent) {\r\n                    window.apiFormRevealValidationSummary = true;\r\n                }\r\n\r\n                if (hasValue) {\r\n                    setFieldInvalidState($field, false);\r\n                } else if (shouldRevealError) {\r\n                    window.apiFormRevealValidationSummary = true;\r\n                    setFieldInvalidState($field, true);\r\n                }\r\n\r\n                syncBookingPayloadFields();\r\n                refreshCustomBookingValidationState();\r\n            });\r\n\r\n            $(document).on('input change', '.jet-form-builder input, .jet-form-builder select, .jet-form-builder textarea', function (event) {\r\n                const $field = $(this);\r\n\r\n                if (event.originalEvent) {\r\n                    window.apiFormRevealValidationSummary = true;\r\n                }\r\n\r\n                if ($field.closest('#reservation-for-others-modal').length || $field.closest('#additional-passengers-fields, #reservation-other-passengers-fields').length) {\r\n                    return;\r\n                }\r\n\r\n                if ($field.is('[type=\"hidden\"], [type=\"submit\"], [type=\"button\"], [type=\"radio\"], [type=\"checkbox\"], [type=\"file\"]')) {\r\n                    refreshCustomBookingValidationState();\r\n                    return;\r\n                }\r\n\r\n                const isRequired = isMainBookingFieldRequired($field);\r\n\r\n                if (!isRequired) {\r\n                    refreshCustomBookingValidationState();\r\n                    return;\r\n                }\r\n\r\n                const value = ($field.val() || '').toString().trim();\r\n                let isValid = value !== '' && !isSelectPlaceholderValue($field);\r\n\r\n                if (($field.attr('type') || '').toLowerCase() === 'email') {\r\n                    isValid = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(value);\r\n                }\r\n\r\n                const shouldRevealError = !!event.originalEvent || $field.hasClass('is-invalid') || $field.closest('.booking-extra-field, .jet-form-builder-row').find('.jet-form-builder__field-error').length > 0;\r\n\r\n                if (isValid) {\r\n                    setFieldInvalidState($field, false);\r\n                } else if (shouldRevealError) {\r\n                    window.apiFormRevealValidationSummary = true;\r\n                    setFieldInvalidState($field, true);\r\n                }\r\n\r\n                refreshCustomBookingValidationState();\r\n            });\r\n\r\n            $(document).on('click', '#passenger-luggage-display', function (e) {\r\n                e.stopPropagation();\r\n                $('#passenger-luggage-dropdown').toggle();\r\n                $('#passenger-luggage-selector')\r\n                    .toggleClass('active')\r\n                    .attr('aria-expanded', $('#passenger-luggage-dropdown').is(':visible') ? 'true' : 'false');\r\n            });\r\n\r\n            $(document).on('mouseenter pointerdown click', '.jet-form-builder-row.field-type-submit-field, .jet-form-builder__submit-wrap', function (event) {\r\n                const $submitButton = $(this).find('.jet-form-builder__submit').first();\r\n                if (!$submitButton.length || !$submitButton.prop('disabled')) {\r\n                    return;\r\n                }\r\n\r\n                if (event.type === 'pointerdown' || event.type === 'click') {\r\n                    event.preventDefault();\r\n                }\r\n\r\n                revealBlockedSubmitValidation();\r\n            });\r\n\r\n            $(document).on('click', function (e) {\r\n                if (!$(e.target).closest('#passenger-luggage-selector').length) {\r\n                    $('#passenger-luggage-dropdown').hide();\r\n                    $('#passenger-luggage-selector').removeClass('active').attr('aria-expanded', 'false');\r\n                }\r\n            });\r\n\r\n            $(document).on('click', '#reservation-modal-no', function () {\r\n                $('#booking_for_someone_else').val('no');\r\n                $('#reservation_contact_same_as_passengers').val('0');\r\n                setReservationFieldState(false);\r\n                decisionCaptured = true;\r\n                submitFormAfterDecision();\r\n            });\r\n\r\n            $(document).on('click', '#reservation-modal-yes', function () {\r\n                $('#reservation-modal-step-question').removeClass('is-active');\r\n                $('#reservation-modal-step-details').addClass('is-active');\r\n                setReservationFieldState(true);\r\n            });\r\n\r\n            $(document).on('click', '#reservation-modal-back', function () {\r\n                $('#reservation-modal-step-details').removeClass('is-active');\r\n                $('#reservation-modal-step-question').addClass('is-active');\r\n                $('#reservation-same-as-previously-entered').prop('checked', false);\r\n                clearReservationModalFields();\r\n                closeReservationModal();\r\n            });\r\n\r\n            $(document).on('change', '#reservation-same-as-previously-entered', function () {\r\n                if ($(this).is(':checked')) {\r\n                    fillReservationFromMainPassengerData();\r\n                } else {\r\n                    clearReservationModalFields();\r\n                }\r\n                $('#reservation_contact_same_as_passengers').val($(this).is(':checked') ? '1' : '0');\r\n                syncBookingPayloadFields();\r\n                refreshCustomBookingValidationState();\r\n            });\r\n\r\n            $(document).on('click', '#reservation-modal-confirm', function () {\r\n                if (!validateReservationModalFields(true)) {\r\n                    window.apiFormRevealValidationSummary = true;\r\n                    refreshCustomBookingValidationState();\r\n                    return;\r\n                }\r\n\r\n                if ($('#reservation-same-as-previously-entered').is(':checked')) {\r\n                    fillReservationFromMainPassengerData();\r\n                }\r\n\r\n                $('#booking_for_someone_else').val('yes');\r\n                setReservationFieldState(true);\r\n                decisionCaptured = true;\r\n                submitFormAfterDecision();\r\n            });\r\n\r\n            function bootCustomBookingExperience(maxAttempts) {\r\n                let attempts = 0;\r\n\r\n                function tryInitialize() {\r\n                    attempts += 1;\r\n                    if (initializeCustomBookingExperience()) {\r\n                        return;\r\n                    }\r\n\r\n                    if (attempts < maxAttempts) {\r\n                        window.setTimeout(tryInitialize, 250);\r\n                    }\r\n                }\r\n\r\n                tryInitialize();\r\n            }\r\n\r\n            function ensureBookingPrefill(maxAttempts) {\r\n                let attempts = 0;\r\n\r\n                function tryPrefill() {\r\n                    attempts += 1;\r\n\r\n                    const hasServiceTarget = getForm().find('select[name*=\"type_of_service\"], select.typeservicerow').length > 0;\r\n                    const hasDateTarget = getForm().find('input.datelegrow, input[type=\"date\"]').length > 0;\r\n\r\n                    if (hasServiceTarget || hasDateTarget) {\r\n                        applyBookingPrefill();\r\n                    }\r\n\r\n                    if (attempts < maxAttempts && (!hasServiceTarget || !hasDateTarget)) {\r\n                        window.setTimeout(tryPrefill, 300);\r\n                    }\r\n                }\r\n\r\n                tryPrefill();\r\n            }\r\n\r\n            bootCustomBookingExperience(20);\r\n            ensureBookingPrefill(20);\r\n            syncAdditionalPassengerUI();\r\n            $(window).on('load', function () {\r\n                if (!bookingExperienceReady) {\r\n                    bootCustomBookingExperience(10);\r\n                }\r\n                ensureBookingPrefill(10);\r\n                syncAdditionalPassengerUI();\r\n                refreshCustomBookingValidationState();\r\n            });\r\n\r\n        });\r\n    <\/script>\r\n\r\n\r\n    <script src=\"https:\/\/code.jquery.com\/jquery-3.7.1.min.js\"><\/script>\r\n    <link href=\"https:\/\/cdn.jsdelivr.net\/npm\/select2@4.1.0-rc.0\/dist\/css\/select2.min.css\" rel=\"stylesheet\" \/>\r\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/select2@4.1.0-rc.0\/dist\/js\/select2.min.js\"><\/script>\r\n\r\n    <style>\r\n        .select2-container,\r\n        .jet-form-builder,\r\n        .elementor-widget-container {\r\n            z-index: 1 !important;\r\n            position: relative;\r\n        }\r\n\r\n        .select2-container--open,\r\n        .select2-dropdown {\r\n            z-index: 9999 !important;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-results__options {\r\n            max-height: 230px;\r\n            padding: 0;\r\n            background: #ffffff;\r\n            border-radius: 0 0 4px 4px;\r\n        }\r\n\r\n        .airline-select2-dropdown {\r\n            border: 1px solid #aeb4bc !important;\r\n            border-radius: 4px !important;\r\n            background: #fff !important;\r\n            box-shadow: none !important;\r\n            overflow: hidden;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-results>.select2-results__options {\r\n            max-height: 230px;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-results__option {\r\n            padding: 0 !important;\r\n            background: #fff !important;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-results__option--highlighted.select2-results__option--selectable {\r\n            background: #5897fb !important;\r\n            color: #ffffff !important;\r\n        }\r\n\r\n        .airline-select2-dropdown .airline-option {\r\n            padding: 8px 14px;\r\n            display: flex;\r\n            flex-direction: column;\r\n            gap: 10px;\r\n            border-bottom: 1px solid #f1f1f1;\r\n            transition: background 0.2s;\r\n            background: transparent;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-results__option:last-child .airline-option {\r\n            border-bottom: 0;\r\n        }\r\n\r\n        .airline-select2-dropdown .airline-option:hover {\r\n            background-color: #f5f7f9;\r\n        }\r\n\r\n        .airline-select2-dropdown .airline-option strong {\r\n            color: #434a54;\r\n            font-size: 14px;\r\n            font-weight: 600;\r\n            display: block;\r\n            line-height: 1.2;\r\n        }\r\n\r\n        .airline-select2-dropdown .airline-code {\r\n            color: #7c848e;\r\n            font-size: 12px;\r\n            font-weight: 400;\r\n            line-height: 1.2;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-results__option--highlighted.select2-results__option--selectable .airline-option {\r\n            background: #5897fb !important;\r\n            border-bottom-color: #5897fb !important;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-results__option--highlighted.select2-results__option--selectable .airline-option strong {\r\n            color: #ffffff !important;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-results__option--highlighted.select2-results__option--selectable .airline-code {\r\n            color: #d9e4fb !important;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-results__options::-webkit-scrollbar {\r\n            width: 10px;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-results__options::-webkit-scrollbar-track {\r\n            background: #ffffff;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-results__options::-webkit-scrollbar-thumb {\r\n            background: #9e9e9e;\r\n            border-radius: 10px;\r\n            border: 2px solid #ffffff;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-search--dropdown {\r\n            padding: 10px;\r\n            background: #ffffff;\r\n            border-bottom: 1px solid #ececec;\r\n        }\r\n\r\n        .airline-select2-dropdown .select2-search--dropdown .select2-search__field {\r\n            border: 1px solid #6f6f6f !important;\r\n            border-radius: 2px !important;\r\n            padding: 6px 10px !important;\r\n            color: #434a54;\r\n            background: #ffffff !important;\r\n            box-shadow: none !important;\r\n            min-height: 36px;\r\n            font-size: 14px !important;\r\n        }\r\n\r\n        .airline-select2-container.select2-container--default .select2-selection--single {\r\n            height: 50px;\r\n            border: 1px solid #c7ccd3;\r\n            border-radius: 4px;\r\n            display: flex;\r\n            align-items: center;\r\n            background: #ffffff;\r\n            box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\r\n            overflow: hidden;\r\n        }\r\n\r\n        .airline-select2-container.select2-container--default .select2-selection--single .select2-selection__rendered {\r\n            color: #4f4f4f;\r\n            display: block !important;\r\n            width: 100%;\r\n            min-height: 48px;\r\n            line-height: 48px !important;\r\n            padding-left: 15px !important;\r\n            padding-right: 42px !important;\r\n            font-size: 15px !important;\r\n            font-weight: 400;\r\n            margin-top: 0 !important;\r\n            margin-bottom: 0 !important;\r\n            text-align: left;\r\n        }\r\n\r\n        .airline-select2-container.select2-container--default .select2-selection--single .select2-selection__placeholder {\r\n            color: #7c848e !important;\r\n        }\r\n\r\n        .airline-select2-container.select2-container--default .select2-selection--single .select2-selection__arrow {\r\n            height: 48px;\r\n            right: 10px;\r\n        }\r\n\r\n        .airline-select2-container.select2-container--default .select2-selection--single .select2-selection__arrow b {\r\n            border-color: #8b8b8b transparent transparent transparent;\r\n            border-width: 6px 5px 0 5px;\r\n            margin-left: -5px;\r\n            margin-top: -2px;\r\n        }\r\n\r\n        .airline-select2-container.select2-container--default.select2-container--open .select2-selection--single {\r\n            border-color: #aeb4bc;\r\n        }\r\n    <\/style>\r\n\r\n    <script>\r\n        jQuery(document).ready(function ($) {\r\n            \/\/ Cache local para aerol\u00edneas\r\n            const airlinesCache = new Map();\r\n            let isInitializing = false;\r\n            let initialAirlinesLoaded = false;\r\n\r\n            \/* -------------------------\r\n               FUNCIONES ESENCIALES\r\n            ------------------------- *\/\r\n            function formatFlightTime(isoString) {\r\n                if (!isoString) return '';\r\n                const date = new Date(isoString);\r\n                return date.getHours().toString().padStart(2, '0') + ':' +\r\n                    date.getMinutes().toString().padStart(2, '0');\r\n            }\r\n\r\n            function getAirlineMetadata(value) {\r\n                const normalizedValue = (value || '').toString().trim().toUpperCase();\r\n                if (!normalizedValue) return null;\r\n\r\n                const cached = airlinesCache.get(normalizedValue);\r\n                if (cached) return cached;\r\n\r\n                return {\r\n                    fs: normalizedValue,\r\n                    iata: '',\r\n                    icao: '',\r\n                    name: ''\r\n                };\r\n            }\r\n            window.getAirlineMetadata = getAirlineMetadata;\r\n\r\n            function getApiCarrierCode($select) {\r\n                const airlineValue = ($select.val() || '').toString().trim().toUpperCase();\r\n                const airline = getAirlineMetadata(airlineValue);\r\n\r\n                if (!airline) return '';\r\n\r\n                return (\r\n                    (airline.iata || '').toString().trim().toUpperCase() ||\r\n                    (airline.fs || '').toString().trim().toUpperCase() ||\r\n                    (airline.icao || '').toString().trim().toUpperCase() ||\r\n                    airlineValue\r\n                );\r\n            }\r\n            window.getApiCarrierCode = getApiCarrierCode;\r\n\r\n            function getAirlinePrefixes($select) {\r\n                const airlineValue = ($select.val() || '').toString().trim().toUpperCase();\r\n                const airline = getAirlineMetadata(airlineValue) || {};\r\n\r\n                return [...new Set([\r\n                    airlineValue,\r\n                    airline.fs,\r\n                    airline.iata,\r\n                    airline.icao\r\n                ].map(code => (code || '').toString().trim().toUpperCase()).filter(Boolean))];\r\n            }\r\n            window.getAirlinePrefixes = getAirlinePrefixes;\r\n\r\n            function normalizeFlightNumber(rawValue, $select) {\r\n                let normalized = (rawValue || '').toString().trim().toUpperCase().replace(\/\\s+\/g, '');\r\n                if (!normalized) return '';\r\n\r\n                getAirlinePrefixes($select).forEach(prefix => {\r\n                    if (normalized.startsWith(prefix)) {\r\n                        normalized = normalized.slice(prefix.length);\r\n                    }\r\n                });\r\n\r\n                return normalized.replace(\/^-+\/, '');\r\n            }\r\n            window.normalizeFlightNumber = normalizeFlightNumber;\r\n\r\n            function buildUniversalFlightCode(rawValue, $select) {\r\n                const carrierCode = getApiCarrierCode($select);\r\n                const normalizedFlightNumber = normalizeFlightNumber(rawValue, $select);\r\n\r\n                if (!carrierCode || !normalizedFlightNumber) {\r\n                    return normalizedFlightNumber || '';\r\n                }\r\n\r\n                return carrierCode + normalizedFlightNumber;\r\n            }\r\n            window.buildUniversalFlightCode = buildUniversalFlightCode;\r\n\r\n            function updateFieldVisibility($row) {\r\n                const serviceType = $row.find('select[name*=\"type_of_service\"]').val();\r\n\r\n                const $flightField = $row.find('input[id*=\"flight\"]').closest('.jet-form-builder-row');\r\n                const $arrivingField = $row.find('input[id*=\"arriving_flight\"]').closest('.jet-form-builder-row');\r\n                const $departingField = $row.find('input[id*=\"departing_flight\"]').closest('.jet-form-builder-row');\r\n\r\n                const $airlineMainRow = $row.find('select[name*=\"aerolineas\"]').closest('.jet-form-builder-row');\r\n                const $airlineCopyRow = $row.find('select[name*=\"aerolineas_connect\"]').closest('.jet-form-builder-row');\r\n\r\n                \/\/ Ocultar todo de base\r\n                $flightField.hide();\r\n                $arrivingField.hide();\r\n                $departingField.hide();\r\n\r\n                if ($airlineMainRow.length) $airlineMainRow.hide();\r\n                if ($airlineCopyRow.length) $airlineCopyRow.hide();\r\n\r\n                \/\/ Mostrar campos seg\u00fan tipo de servicio\r\n                if (serviceType === 'Arrival' || serviceType === 'Departure') {\r\n                    $flightField.show();\r\n                    if ($airlineMainRow.length) $airlineMainRow.show();\r\n                    \/\/ aerolineas_connect no se usa aqu\u00ed\r\n                } else if (serviceType === 'Connection') {\r\n                    $arrivingField.show();\r\n                    $departingField.show();\r\n                    if ($airlineMainRow.length) $airlineMainRow.show();   \/\/ para arriving\r\n                    if ($airlineCopyRow.length) $airlineCopyRow.show();   \/\/ para departing\r\n                }\r\n            }\r\n\r\n            \/* -------------------------\r\n               CARGAR AEROL\u00cdNEAS INICIALES\r\n            ------------------------- *\/\r\n            function loadInitialAirlines() {\r\n                if (initialAirlinesLoaded) return;\r\n\r\n                $.ajax({\r\n                    url: '\/wp-json\/flightapi\/v1\/airlines',\r\n                    method: 'GET',\r\n                    data: {\r\n                        limit: 20\r\n                    },\r\n                    success: function (data) {\r\n                        if (data.success && data.airlines.length > 0) {\r\n                            data.airlines.forEach(airline => {\r\n                                airlinesCache.set((airline.fs || '').toUpperCase(), airline);\r\n                            });\r\n                            initialAirlinesLoaded = true;\r\n                        }\r\n                    },\r\n                    error: function () {\r\n                        console.log('Error loading initial airlines');\r\n                    }\r\n                });\r\n            }\r\n\r\n            \/* -------------------------\r\n               SELECT2 PARA aerolineas Y aerolineas_connect\r\n            ------------------------- *\/\r\n            function initializeAirlineSelect($select) {\r\n                if ($select.hasClass('select2-hidden-accessible')) {\r\n                    return;\r\n                }\r\n\r\n                function getAirlineDisplayData(airline) {\r\n                    const code = (airline && (airline.code || airline.id || '') || '').toString();\r\n                    let name = airline && airline.name ? airline.name.toString() : '';\r\n\r\n                    if (!name && airline && airline.text) {\r\n                        name = airline.text.toString().replace(\/\\s*\\([^)]+\\)\\s*$\/, '');\r\n                    }\r\n\r\n                    return {\r\n                        name: name || (airline && airline.text ? airline.text.toString() : ''),\r\n                        code: code\r\n                    };\r\n                }\r\n\r\n                function renderAirlineOption(airline) {\r\n                    if (airline.loading) {\r\n                        return airline.text;\r\n                    }\r\n\r\n                    const display = getAirlineDisplayData(airline);\r\n\r\n                    return $(\r\n                        '<div class=\"airline-option\">' +\r\n                        '<strong>' + display.name + '<\/strong>' +\r\n                        '<span class=\"airline-code\">' + display.code + '<\/span>' +\r\n                        '<\/div>'\r\n                    );\r\n                }\r\n\r\n                function renderAirlineSelection(airline) {\r\n                    const display = getAirlineDisplayData(airline);\r\n\r\n                    if (display.name && display.code) {\r\n                        return display.name + ' (' + display.code + ')';\r\n                    }\r\n\r\n                    return display.name || '';\r\n                }\r\n\r\n                $select.select2({\r\n                    placeholder: 'Select or search airline...',\r\n                    minimumInputLength: 0,\r\n                    width: '100%',\r\n                    allowClear: true,\r\n                    containerCssClass: 'airline-select2-container',\r\n                    dropdownCssClass: 'airline-select2-dropdown',\r\n                    ajax: {\r\n                        url: '\/wp-json\/flightapi\/v1\/airlines',\r\n                        dataType: 'json',\r\n                        delay: 300,\r\n                        data: function (params) {\r\n                            return {\r\n                                search: params.term || '',\r\n                                limit: params.term ? 15 : 20\r\n                            };\r\n                        },\r\n                        processResults: function (data) {\r\n                            if (data.success) {\r\n                                data.airlines.forEach(airline => {\r\n                                    airlinesCache.set((airline.fs || '').toUpperCase(), airline);\r\n                                });\r\n\r\n                                return {\r\n                                    results: data.airlines.map(airline => ({\r\n                                        id: airline.fs,\r\n                                        text: `${airline.name} (${airline.fs})`,\r\n                                        name: airline.name,\r\n                                        code: airline.fs,\r\n                                        fs: airline.fs,\r\n                                        iata: airline.iata,\r\n                                        icao: airline.icao\r\n                                    }))\r\n                                };\r\n                            }\r\n                            return { results: [] };\r\n                        },\r\n                        cache: true\r\n                    },\r\n                    templateResult: renderAirlineOption,\r\n                    templateSelection: renderAirlineSelection\r\n                });\r\n\r\n                let firstFocus = true;\r\n                $select.on('select2:open', function () {\r\n                    if (firstFocus) {\r\n                        firstFocus = false;\r\n                        setTimeout(() => {\r\n                            const $search = $('.select2-container--open .select2-search__field');\r\n                            if ($search.length && $search.val() === '') {\r\n                                $search.trigger('focus');\r\n                            }\r\n                        }, 100);\r\n                    }\r\n                });\r\n\r\n                $select.on('select2:select', function (e) {\r\n                    const data = e.params.data;\r\n                    if (data && data.id) {\r\n                        airlinesCache.set(data.id.toUpperCase(), {\r\n                            fs: data.code || data.id,\r\n                            iata: data.iata || '',\r\n                            icao: data.icao || '',\r\n                            name: data.name || data.text || ''\r\n                        });\r\n                    }\r\n                });\r\n            }\r\n\r\n            \/* -------------------------\r\n               INICIALIZACI\u00d3N\r\n            ------------------------- *\/\r\n            function initializeJetFormRepeaters() {\r\n                if (isInitializing) return;\r\n                isInitializing = true;\r\n\r\n                loadInitialAirlines();\r\n\r\n                $('select[name*=\"aerolineas\"], select[name*=\"aerolineas_connect\"]').each(function () {\r\n                    if (!$(this).hasClass('select2-hidden-accessible')) {\r\n                        initializeAirlineSelect($(this));\r\n                    }\r\n                });\r\n\r\n                $('.jet-form-builder-repeater__row').each(function () {\r\n                    updateFieldVisibility($(this));\r\n                });\r\n\r\n                isInitializing = false;\r\n            }\r\n\r\n            $(document).on('change', 'select[name*=\"type_of_service\"]', function () {\r\n                const $row = $(this).closest('.jet-form-builder-repeater__row');\r\n                updateFieldVisibility($row);\r\n            });\r\n\r\n            function initializeNewRepeater($newRow) {\r\n                setTimeout(() => {\r\n                    $newRow.find('select[name*=\"aerolineas\"], select[name*=\"aerolineas_connect\"]').each(function () {\r\n                        if (!$(this).hasClass('select2-hidden-accessible')) {\r\n                            initializeAirlineSelect($(this));\r\n                        }\r\n                    });\r\n                    updateFieldVisibility($newRow);\r\n                }, 50);\r\n            }\r\n\r\n            const repeaterObserver = new MutationObserver(function (mutations) {\r\n                mutations.forEach(function (mutation) {\r\n                    mutation.addedNodes.forEach(function (node) {\r\n                        if (node.nodeType === 1) {\r\n                            const $node = $(node);\r\n                            if ($node.hasClass('jet-form-builder-repeater__row')) {\r\n                                initializeNewRepeater($node);\r\n                            } else {\r\n                                $node.find('.jet-form-builder-repeater__row').each(function () {\r\n                                    initializeNewRepeater($(this));\r\n                                });\r\n                            }\r\n                        }\r\n                    });\r\n                });\r\n            });\r\n\r\n            $(window).on('load', function () {\r\n                initializeJetFormRepeaters();\r\n\r\n                const repeaterContainer = document.querySelector('.jet-form-builder-repeater');\r\n                if (repeaterContainer) {\r\n                    repeaterObserver.observe(repeaterContainer, {\r\n                        childList: true,\r\n                        subtree: true\r\n                    });\r\n                }\r\n            });\r\n\r\n            $(document).on('click', '.jet-form-builder-repeater__new', function () {\r\n                setTimeout(() => {\r\n                    const $newRows = $('.jet-form-builder-repeater__row').last();\r\n                    initializeNewRepeater($newRows);\r\n                }, 100);\r\n            });\r\n\r\n        });\r\n    <\/script>\r\n\r\n    <\/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<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Someone from our team will respond immediately during extended business hours Passenger Name * Email * Phone * 1 Passenger &#8211; 0 Luggage \u25bc Passengers &#8211; 1 + Luggage &#8211; 0 + Flight Legs Type of Service * Type of serviceArrivalDepartureConnection Date * Airline Flight Arriving Flight Airline Departing Flight &times; Add new Special Instructions [&hellip;]<\/p>\n\r\n        <div class=\"jm-meta-line text-sm text-muted-foreground mt-3\">\r\n            <div class=\"jm-meta-left\">\r\n                <div class=\"item\">\r\n                    \r\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"h-4 w-4\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M8 2v4\"><\/path>\r\n            <path d=\"M16 2v4\"><\/path>\r\n            <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"><\/rect>\r\n            <path d=\"M3 10h18\"><\/path>\r\n        <\/svg>\r\n    \r\n                    <span>Nov 21, 2025<\/span>\r\n                <\/div>\r\n                <div class=\"item\">\r\n                    \r\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"h-4 w-4\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle>\r\n            <polyline points=\"12 6 12 12 16 14\"><\/polyline>\r\n        <\/svg>\r\n    \r\n                    <span>1 min read<\/span>\r\n                <\/div>\r\n                <div class=\"item jm-meta-arrow\">\r\n                    \r\n        <a href=\"https:\/\/royalairportconcierge.com\/fr\/book-service\/\" class=\"jm-arrow-link\" aria-label=\"Leer m\u00e1s\">\r\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"h-4 w-4 text-yellow-500\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                <path d=\"M5 12h14\"><\/path>\r\n                <path d=\"M13 5l7 7-7 7\"><\/path>\r\n            <\/svg>\r\n        <\/a>\r\n    \r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n    ","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","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":"default","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-16574","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/royalairportconcierge.com\/fr\/wp-json\/wp\/v2\/pages\/16574","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/royalairportconcierge.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/royalairportconcierge.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/royalairportconcierge.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/royalairportconcierge.com\/fr\/wp-json\/wp\/v2\/comments?post=16574"}],"version-history":[{"count":847,"href":"https:\/\/royalairportconcierge.com\/fr\/wp-json\/wp\/v2\/pages\/16574\/revisions"}],"predecessor-version":[{"id":21710,"href":"https:\/\/royalairportconcierge.com\/fr\/wp-json\/wp\/v2\/pages\/16574\/revisions\/21710"}],"wp:attachment":[{"href":"https:\/\/royalairportconcierge.com\/fr\/wp-json\/wp\/v2\/media?parent=16574"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}