src/Aviatur/TwigBundle/Resources/views/aviatur/Flux/App/base.html.twig line 1037

Open in your IDE?
  1. {% set parameters = json_decode(app.session.get(app.request.server.get('HTTP_HOST') ~ '[parameters]'), true) %}
  2. <!DOCTYPE html>
  3. <html lang="es">
  4.     <head>
  5.         <meta charset="utf-8"/>
  6.         <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7.         {% block head_viewport %}
  8.             <meta name="viewport" content="width=device-width, initial-scale=1">
  9.             {# <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> #}
  10.         {% endblock head_viewport %}
  11.         <title>{% block head_title %}{% endblock head_title %}</title>
  12.         <meta name="description" content="{% block head_description_content %}{% endblock head_description_content %}">
  13.         <meta name="title" content="{% block head_meta_title %}{% endblock head_meta_title %}">
  14.         <meta name="theme-color" content="#009bf8">
  15.         <meta name="google-signin-scope" content="profile email">
  16.         <meta name="google-site-verification" content="8OTmH7p5wAGzTdjC6N5XBLDtK_uVhfOIl4ShJ0ILZzI" />
  17.         {# <meta name="google-signin-client_id" content="{{google_idclient_login}}"> #}
  18.         <meta name="keywords" content="{% block head_keywords %}{% endblock head_keywords %}">
  19.         {# <meta name="apple-itunes-app" content="app-id=550837212">
  20.         <meta name="google-play-app" content="app-id=com.app.aviatur"> #}
  21.         
  22.         {% if seoUrlIndex is defined and seoUrlIndex is not empty %}
  23.             <meta name="{{seoUrlIndex['name']}}" content="{{seoUrlIndex['content']}}">
  24.         {% endif %}
  25.         {% block head_meta_label %}
  26.         {% endblock head_meta_label %}
  27.         <link rel="icon" type="image/x-icon" href="{{ absolute_url(asset('assets/'~ agency_folder.assetStyle() ~'/img/favicon.png')) }}" />
  28.         <link rel="apple-touch-icon" href="{{ absolute_url(asset('assets/'~ agency_folder.assetStyle() ~'/img/header/iconoapp.png')) }}" />
  29.         <link rel="android-touch-icon" href="{{ absolute_url(asset('assets/'~ agency_folder.assetStyle() ~'/img/header/iconoapp.png')) }}" />
  30.         {# Librerías leaflet para los marcadores de agrupación #}
  31.         <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css" />
  32.         <link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css" />
  33.         <link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css" />
  34.         <script src="https://cdn.tailwindcss.com"></script>
  35.         <script>
  36.             // completely responsive
  37.             tailwind.config = {
  38.                 theme: {
  39.                     container: {
  40.                         center: false,
  41.                     },
  42.                     extend: {
  43.                         screens: {
  44.                             xs: { max:"575px" }, // mini-mobile
  45.                             s: { min: "575px", max: "768px" }, // mobile
  46.                             m: { min: "768px", max: "992px" }, // tablet
  47.                             l: { min: "993px" }, // desktop
  48.                         },
  49.                     },
  50.                 },
  51.                 plugins: [],
  52.             }
  53.         </script>
  54.         {% if parameters['firebasescripts'] == 'true' %}
  55.             <link rel="stylesheet" href="{{ asset('assets/default_assets/css/firebase-main.css') }}" />
  56.             <link rel="stylesheet" href="https://aviaturcdndev.z5.web.core.windows.net/source/main.css">
  57.             <script src="https://aviaturcdndev.z5.web.core.windows.net/source/script.js" type="text/javascript"></script>
  58.         {% endif %}
  59.         {# styles #}
  60.         {% block stylesheets %}
  61.            {#<link href="https://fonts.googleapis.com/css?family=Open+Sans:400italic,600italic,600,400" rel="stylesheet" />#}
  62.             {# <link rel="preconnect" href="https://fonts.googleapis.com">
  63.             <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> #}
  64.             {# <link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&family=Ubuntu:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&display=swap" rel="stylesheet"> #}
  65.             {# <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@24,400,0,0" />
  66.             <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" />
  67.             <link href="https://fonts.googleapis.com/icon?family=Material+Icons+Outlined" rel="stylesheet"> #}
  68.             
  69.             <link type="text/css" rel="stylesheet" href="/assets/common_assets/font/ubuntu/font_family.css" />
  70.             <link type="text/css" rel="stylesheet" href="/assets/common_assets/font/roboto/font_family.css" />
  71.             <link type="text/css" rel="stylesheet" href="/assets/common_assets/font/material-icons/material_family.css" />
  72.             {# <link rel="stylesheet" href="https://storage.googleapis.com/non-spec-apps/mio-icons/latest/round.css"> #}
  73.             <link type="text/css" rel="stylesheet" href="{{ style(agency_folder.assetStyle() ~ '/css/main.css') }}" />
  74.         {% endblock stylesheets %}
  75.         {# end styles #}
  76.         {# scripts #}
  77.         <script src="{{ script('common.js') }}"></script>
  78.         <!--<script src="{{ absolute_url(asset('assets/common_assets/js/stats.min.js')) }}"></script>-->
  79.         {# <script src="https://apis.google.com/js/platform.js" async defer></script>#}
  80.         {# <script src="https://apis.google.com/js/api:client.js" integrity="sha384-m2+ASHO0LZuBooZ0Ww1KN5+PKP3WGmQTd0g4am+AqU2FHI0HVcHpqsPtflL1BLsW" crossorigin="anonymous"></script> #}
  81.         {# <script rel="prefetch" async defer crossorigin="anonymous" integrity="sha384-oarVAheF/euClR0yZhtlxJO/hF9R6ykWvzF2VApNgRN+NolqyoE/f2aGygwNgRfQ" src="https://connect.facebook.net/es_LA/sdk.js#xfbml=1&version=v6.0&appId=#xfbml=1&version=v6.0&appId={{facebook_appid_login}}&autoLogAppEvents=1" as="script"></script> #}
  82.         <script src="https://cdn.embluemail.com/pixeltracking/pixeltracking.js?code=02d348af5e80dfce0bd26f1a7566782f"></script>
  83.         <script type="text/javascript">
  84.             (function() {
  85.                 // --- Configuración Global ---
  86.                 var defaultAgencyName = 'AVIATUR';
  87.                 var defaultAgencyUrl = 'https://www.aviatur.com';
  88.                 var defaultCurrency = 'COP';
  89.                 // defaultDepartureAirportCode y Name solo se usarán si no se pueden obtener del AVflight o la URL
  90.                 var defaultDepartureAirportCode = 'BOG';
  91.                 var defaultDepartureAirportName = 'Aeropuerto Internacional El Dorado';
  92.                 var iataMap = {
  93.                     'BOG': { code: 'BOG', name: 'Aeropuerto Internacional El Dorado' },
  94.                     'MDE': { code: 'MDE', name: 'Aeropuerto Internacional José María Córdova' },
  95.                     'CLO': { code: 'CLO', name: 'Aeropuerto Internacional Alfonso Bonilla Aragón' },
  96.                     'BAQ': { code: 'BAQ', name: 'Aeropuerto Internacional Ernesto Cortissoz' },
  97.                     'CTG': { code: 'CTG', name: 'Aeropuerto Internacional Rafael Núñez' },
  98.                     'SMR': { code: 'SMR', name: 'Aeropuerto Internacional Simón Bolívar' },
  99.                     'CUN': { code: 'CUN', name: 'Aeropuerto Internacional de Cancún' },
  100.                     'AXM': { code: 'AXM', name: 'Aeropuerto El Edén' },
  101.                     'LET': { code: 'LET', name: 'Aeropuerto Internacional Alfredo Vásquez Cobo' },
  102.                     'LIM': { code: 'LIM', name: 'Aeropuerto Internacional Jorge Chávez' },
  103.                     // Regiones (para Schema.org, el name debe ser el nombre de la región/país)
  104.                     'colombia': { code: null, name: 'Colombia' },
  105.                     'america': { code: null, name: 'América' },
  106.                     'oceania': { code: null, name: 'Oceanía' },
  107.                     'europa': { code: null, name: 'Europa' },
  108.                     'africa': { code: null, name: 'África' },
  109.                     'asia': { code: null, name: 'Asia' }
  110.                 };
  111.                 // Función para obtener información IATA (ahora puede recibir slug o código IATA)
  112.                 function getIataInfo(identifier) {
  113.                     if (!identifier) return null;
  114.                     var normalizedIdentifier = identifier.toUpperCase(); // Para códigos IATA
  115.                     var normalizedSlug = identifier.toLowerCase().replace(/-/g, ' '); // Para slugs de ciudad
  116.                     if (iataMap[normalizedIdentifier]) {
  117.                         return iataMap[normalizedIdentifier];
  118.                     }
  119.                     if (iataMap[normalizedSlug]) {
  120.                         return iataMap[normalizedSlug];
  121.                     }
  122.                     for (var key in iataMap) {
  123.                         if (iataMap.hasOwnProperty(key) && iataMap[key].name && iataMap[key].name.toLowerCase() === normalizedSlug) {
  124.                             return iataMap[key];
  125.                         }
  126.                     }
  127.                     return null;
  128.                 }
  129.                 var pageUrl = window.location.href;
  130.                 var pathName = window.location.pathname;
  131.                 var dataLayerPushed = false;
  132.                 var schemaPushed = false;
  133.                 function pushSchemaOrg(data) {
  134.                     if (!schemaPushed) {
  135.                         var script = document.createElement('script');
  136.                         script.type = 'application/ld+json';
  137.                         script.textContent = JSON.stringify(data);
  138.                         document.head.appendChild(script);
  139.                         schemaPushed = true;
  140.                         //console.log('Aviatur Schema.org pushed:', data);
  141.                     }
  142.                 }
  143.                 function executeDataLayerAndSchemaLogic(avflightData) {
  144.                     var currentPrice = (avflightData && avflightData.attributes && typeof avflightData.attributes.minPrice === 'number') ? avflightData.attributes.minPrice.toString() : 'variable';
  145.                     var detectedOriginIata = (avflightData && avflightData.attributes && avflightData.attributes.AvailabilityType && avflightData.attributes.AvailabilityType.variable && avflightData.attributes.AvailabilityType.variable.origin1) ? avflightData.attributes.AvailabilityType.variable.origin1 : null;
  146.                     var detectedDestinationIata = (avflightData && avflightData.attributes && avflightData.attributes.AvailabilityType && avflightData.attributes.AvailabilityType.variable && avflightData.attributes.AvailabilityType.variable.destination1) ? avflightData.attributes.AvailabilityType.variable.destination1 : null;
  147.                     var arrivalAirportCodeDetected = (avflightData && avflightData.filterEntities && avflightData.filterEntities.airports) ? avflightData.filterEntities.airports[detectedDestinationIata][detectedDestinationIata] : null;
  148.                     // --- Lógica para URLs de REGIONES/PAÍSES: /tiquetes-baratos-a/[region/pais] ---
  149.                     var matchRegionPage = pageUrl.match(/\/tiquetes-baratos-a\/(colombia|america|oceania|europa|africa|asia)(?:\/.*)?$/);
  150.                     if (matchRegionPage && matchRegionPage[1]) {
  151.                         var regionSlug = matchRegionPage[1];
  152.                         var regionInfo = getIataInfo(regionSlug);
  153.                         var regionDisplayName = regionInfo ? regionInfo.name : regionSlug.charAt(0).toUpperCase() + regionSlug.slice(1);
  154.                         window.dataLayer.push({
  155.                             'event': 'pageview',
  156.                             'pageType': 'flightRegionSearch',
  157.                             'region': regionDisplayName,
  158.                             'agencyName': defaultAgencyName,
  159.                             'agencyUrl': defaultAgencyUrl,
  160.                             'currency': defaultCurrency,
  161.                             //'price': currentPrice 
  162.                         });
  163.                         var schemaWebPage = {
  164.                             "@context": "https://schema.org",
  165.                             "@type": "WebPage",
  166.                             "name": "Vuelos baratos a " + regionDisplayName,
  167.                             "url": pageUrl,
  168.                             "description": "Encuentra los mejores tiquetes y ofertas de vuelos a " + regionDisplayName + " con " + defaultAgencyName + ". Utiliza nuestro buscador para encontrar tu destino ideal.",
  169.                             "isPartOf": {
  170.                                 "@type": "WebSite",
  171.                                 "name": defaultAgencyName,
  172.                                 "url": defaultAgencyUrl
  173.                             },
  174.                             //"mainEntity": {
  175.                             //    "@type": "SearchAction",
  176.                             //    "target": "https://www.aviatur.com/buscador?q={search_term_string}",
  177.                             //    "queryInput": "required name=search_term_string"
  178.                             //}
  179.                         };
  180.                         if (typeof avflightData.minPrice === 'number') {
  181.                             schemaWebPage.offers = {
  182.                                 "@type": "AggregateOffer",
  183.                                 "lowPrice": avflightData.minPrice.toString(),
  184.                                 "priceCurrency": defaultCurrency
  185.                             };
  186.                         }
  187.                         pushSchemaOrg(schemaWebPage);
  188.                     }
  189.                     // --- Lógica para URLs de RUTA ESPECÍFICA: /vuelos/Tiquetes-economicos-ORIGEN-a-DESTINO o vuelos/tiquetes-baratos-de-[ORIGEN]-a-[DESTINO] ---
  190.                     else if (pageUrl.includes('/vuelos/Tiquetes-economicos-') || pageUrl.includes('/vuelos/tiquetes-baratos-de-')) {
  191.                         var originCitySlugOrIata, destinationCitySlugOrIata;
  192.                         var routeMatch;
  193.                         if (pageUrl.includes('/vuelos/Tiquetes-economicos-')) {
  194.                             var lastPart = pathName.split('/').pop();
  195.                             routeMatch = lastPart.match(/Tiquetes-economicos-([a-zA-Z0-9-]+)-a-([a-zA-Z0-9-]+)/);
  196.                         } else if (pageUrl.includes('/vuelos/tiquetes-baratos-de-')) {
  197.                             var lastPart = pathName.split('/').pop();
  198.                             routeMatch = lastPart.match(/tiquetes-baratos-de-([a-zA-Z0-9-]+)-a-([a-zA-Z0-9-]+)/);
  199.                         }
  200.                         var departureAirportCode = detectedOriginIata;
  201.                         var arrivalAirportCode = detectedDestinationIata;
  202.                         if (!departureAirportCode && routeMatch) {
  203.                             departureAirportCode = getIataInfo(routeMatch[1]) ? getIataInfo(routeMatch[1]).code : routeMatch[1].toUpperCase();
  204.                             console.warn('Aviatur: Origen IATA no encontrado en AVflight, extrayendo de URL:', departureAirportCode);
  205.                         }
  206.                         if (!arrivalAirportCode && routeMatch) {
  207.                             arrivalAirportCode = getIataInfo(routeMatch[2]) ? getIataInfo(routeMatch[2]).code : routeMatch[2].toUpperCase();
  208.                             console.warn('Aviatur: Destino IATA no encontrado en AVflight, extrayendo de URL:', arrivalAirportCode);
  209.                         }
  210.                         // Obtener nombres completos usando los IATAs finales
  211.                         var originInfo = getIataInfo(departureAirportCode);
  212.                         var destinationInfo = getIataInfo(arrivalAirportCode);
  213.                         var departureAirportFullName = originInfo ? originInfo.name : (departureAirportCode || defaultDepartureAirportName);
  214.                         var arrivalAirportFullName = destinationInfo ? destinationInfo.name : (arrivalAirportCode || arrivalAirportCodeDetected);
  215.                         var flightName = "Vuelos baratos a " + AvailabilityArray.cityDestination1;
  216.                         var sku = (departureAirportCode && arrivalAirportCode) ? departureAirportCode + '-' + arrivalAirportCode : null;
  217.                         window.dataLayer.push({
  218.                             'event': 'pageview',
  219.                             'pageType': 'flightDestination',
  220.                             'destination': arrivalAirportFullName,
  221.                             'departureAirport': departureAirportCode,
  222.                             'arrivalAirport': arrivalAirportCode,
  223.                             'currency': defaultCurrency,
  224.                             'price': currentPrice,
  225.                             'agencyName': defaultAgencyName,
  226.                             'agencyUrl': defaultAgencyUrl
  227.                         });
  228.                         const rawFlightString = avflightData.flights;
  229.                         if (rawFlightString) {
  230.                             try {
  231.                                 const parsedFlights = JSON.parse(rawFlightString);
  232.                                 const itineraries = parsedFlights?.PricedItineraries?.PricedItinerary;
  233.                                 if (Array.isArray(itineraries)) {
  234.                                     const flightOrigin = avflightData?.AvailabilityArray?.originLabel1 || '';
  235.                                     const flightDestination = avflightData?.AvailabilityArray?.destinationLabel1 || '';
  236.                                     const flightDate = avflightData?.AvailabilityArray?.departureDate || ''; // Ajusta si tienes una mejor fuente
  237.                                     const items = itineraries.map((flight, index) => {
  238.                                         const price = Number(flight?.AirItineraryPricingInfo?.ItinTotalFare?.TotalFare["@attributes"]?.Amount || 0);
  239.                                         return {
  240.                                             item_id:    `${flightOrigin}-${flightDestination}-${flightDate}-${index + 1}`,
  241.                                             item_name:  `${flightOrigin} → ${flightDestination} ${flightDate}`,
  242.                                             price:      price,
  243.                                             currency:   'COP',
  244.                                             index:      index + 1
  245.                                         };
  246.                                     });
  247.                                     window.dataLayer.push({
  248.                                         event: 'view_item_list',
  249.                                         ecommerce: {
  250.                                             item_list_id:   `${flightOrigin}-${flightDestination}-${flightDate.replace(/-/g, '')}`, // Ej: armenia-leticia-20250725
  251.                                             item_list_name: `${flightOrigin} → ${flightDestination}`,
  252.                                             items: items
  253.                                         }
  254.                                     });
  255.                                 } else {
  256.                                     console.warn('Aviatur: El arreglo PricedItinerary no está presente o no es un arreglo');
  257.                                 }
  258.                             } catch (err) {
  259.                                 console.error('Error al parsear flights JSON:', err);
  260.                             }
  261.                         } else {
  262.                             console.warn('Aviatur: No hay datos de vuelos en avflightData.flights');
  263.                         }
  264.                         if (arrivalAirportCode && departureAirportCode) {
  265.                             var schemaData = {
  266.                                 "@context": "https://schema.org",
  267.                                 "@type": ["Flight"],
  268.                                 "name": flightName,
  269.                                 "url": pageUrl,
  270.                                 "provider": {
  271.                                     "@type": "Organization",
  272.                                     "name": defaultAgencyName,
  273.                                     "url": defaultAgencyUrl
  274.                                 },
  275.                                 "departureAirport": {
  276.                                     "@type": "Airport",
  277.                                     "name": departureAirportFullName,
  278.                                     "iataCode": departureAirportCode
  279.                                 },
  280.                                 "arrivalAirport": {
  281.                                     "@type": "Airport",
  282.                                     "name": arrivalAirportFullName,
  283.                                     "iataCode": arrivalAirportCode
  284.                                 },
  285.                                 "offers": {
  286.                                     "@type": "Offer",
  287.                                     "url": pageUrl,
  288.                                     "priceCurrency": defaultCurrency,
  289.                                     "price": currentPrice,
  290.                                     "availability": "https://schema.org/InStock"
  291.                                 },
  292.                                 "sku": sku,
  293.                                 "brand": {
  294.                                     "@type": "Brand",
  295.                                     "name": defaultAgencyName
  296.                                 }
  297.                             };
  298.                             pushSchemaOrg(schemaData);
  299.                         } else {
  300.                             console.warn('Aviatur Schema.org (Flight/Product) no se pudo empujar debido a falta de códigos IATA para la ruta. Origen:', departureAirportCode, 'Destino:', arrivalAirportCode);
  301.                         }
  302.                     }
  303.                     // --- Lógica para URLs de DESTINO ESPECÍFICO: /tiquetes-baratos-a/[destino] ---
  304.                     // Ej: https://www.aviatur.com/tiquetes-baratos-a/cancun (Origen BOG por defecto, Destino variable)
  305.                     else if (pageUrl.match(/\/tiquetes-baratos-a\/([a-zA-Z0-9-]+)(?:\/.*)?$/)) {
  306.                         var matchDestino = pageUrl.match(/\/tiquetes-baratos-a\/([a-zA-Z0-9-]+)(?:\/.*)?$/);
  307.                         var destinationSlug = matchDestino[1];
  308.                         var arrivalAirportCode = detectedDestinationIata;
  309.                         if (!arrivalAirportCode) {
  310.                             var arrivalInfoFromSlug = getIataInfo(destinationSlug);
  311.                             arrivalAirportCode = arrivalInfoFromSlug ? arrivalInfoFromSlug.code : null;
  312.                             console.warn('Aviatur: Destino IATA no encontrado en AVflight, extrayendo de URL para /tiquetes-baratos-a/:', arrivalAirportCode);
  313.                         }
  314.                         var destinationInfo = getIataInfo(arrivalAirportCode);
  315.                         var destinationDisplayName = destinationInfo ? destinationInfo.name : destinationSlug.replace(/-/g, ' ').charAt(0).toUpperCase() + destinationSlug.replace(/-/g, ' ').slice(1);
  316.                         var arrivalAirportFullName = destinationInfo ? destinationInfo.name : destinationDisplayName;
  317.                         var departureAirportCode = defaultDepartureAirportCode; // Origen por defecto
  318.                         var departureAirportFullName = defaultDepartureAirportName;
  319.                         var sku = (arrivalAirportCode && departureAirportCode) ? departureAirportCode + '-' + arrivalAirportCode : null;
  320.                         var flightName = "Vuelos baratos a " + destinationDisplayName;
  321.                         window.dataLayer.push({
  322.                             'event': 'pageview',
  323.                             'pageType': 'flightDestinationPage',
  324.                             'destination': destinationDisplayName,
  325.                             'departureAirport': departureAirportCode,
  326.                             'arrivalAirport': arrivalAirportCode,
  327.                             'currency': defaultCurrency,
  328.                             //'price': currentPrice,
  329.                             'agencyName': defaultAgencyName,
  330.                             'agencyUrl': defaultAgencyUrl
  331.                         });
  332.                         if (arrivalAirportCode && departureAirportCode) {
  333.                             var schemaData = {
  334.                                 "@context": "https://schema.org",
  335.                                 "@type": ["Flight"],
  336.                                 "name": flightName,
  337.                                 "url": pageUrl,
  338.                                 "provider": {
  339.                                     "@type": "Organization",
  340.                                     "name": defaultAgencyName,
  341.                                     "url": defaultAgencyUrl
  342.                                 },
  343.                                 "departureAirport": {
  344.                                     "@type": "Airport",
  345.                                     "name": departureAirportFullName,
  346.                                     "iataCode": departureAirportCode
  347.                                 },
  348.                                 "arrivalAirport": {
  349.                                     "@type": "Airport",
  350.                                     "name": arrivalAirportFullName,
  351.                                     "iataCode": arrivalAirportCode
  352.                                 },
  353.                                 "offers": {
  354.                                     "@type": "Offer",
  355.                                     "url": pageUrl,
  356.                                     "priceCurrency": defaultCurrency,
  357.                                     "price": currentPrice,
  358.                                     "availability": "https://schema.org/InStock"
  359.                                 },
  360.                                 "sku": sku,
  361.                                 "brand": {
  362.                                     "@type": "Brand",
  363.                                     "name": defaultAgencyName
  364.                                 }
  365.                             };
  366.                             pushSchemaOrg(schemaData);
  367.                         } else {
  368.                             console.warn('Aviatur Schema.org (Flight/Product) no se pudo empujar debido a falta de código IATA para el destino:', destinationSlug);
  369.                         }
  370.                     }
  371.                     // --- Lógica para URLs de DESTINO TURÍSTICO: /destinos/[ciudad] ---
  372.                     else if (pageUrl.match(/\/destinos\/([a-zA-Z0-9-]+)(?:\/.*)?$/)) {
  373.                         var matchDestinoTuristico = pageUrl.match(/\/destinos\/([a-zA-Z0-9-]+)(?:\/.*)?$/);
  374.                         var citySlug = matchDestinoTuristico[1];
  375.                         var cityInfo = getIataInfo(citySlug);
  376.                         var cityDisplayName = cityInfo ? cityInfo.name : citySlug.replace(/-/g, ' ').charAt(0).toUpperCase() + citySlug.replace(/-/g, ' ').slice(1);
  377.                         window.dataLayer.push({
  378.                             'event': 'pageview',
  379.                             'pageType': 'destinationGuidePage',
  380.                             'destinationCity': cityDisplayName,
  381.                             'agencyName': defaultAgencyName,
  382.                             'agencyUrl': defaultAgencyUrl
  383.                         });
  384.                         var schemaDestination = {
  385.                             "@context": "https://schema.org",
  386.                             "@type": "TouristDestination",
  387.                             "name": cityDisplayName,
  388.                             "url": pageUrl,
  389.                             "description": "Explora " + cityDisplayName + " con " + defaultAgencyName + ". Encuentra información sobre atracciones, actividades y opciones de viaje.",
  390.                             "address": {
  391.                                 "@type": "PostalAddress",
  392.                                 "addressLocality": cityDisplayName,
  393.                                 "addressCountry": "CO"
  394.                             },
  395.                             //"mainEntityOfPage": {
  396.                             //    "@type": "WebPage",
  397.                             //    "@id": pageUrl
  398.                             //},
  399.                             "provider": {
  400.                                 "@type": "Organization",
  401.                                 "name": defaultAgencyName,
  402.                                 "url": defaultAgencyUrl
  403.                             }
  404.                         };
  405.                         if (typeof avflightData.minPrice === 'number') {
  406.                             schemaDestination.offers = {
  407.                                 "@type": "AggregateOffer",
  408.                                 "lowPrice": avflightData.minPrice.toString(),
  409.                                 "priceCurrency": defaultCurrency
  410.                             };
  411.                         }
  412.                         pushSchemaOrg(schemaDestination);
  413.                     }
  414.                     else {
  415.                         // console.log('Aviatur: URL no coincide con los patrones de DataLayer/Schema definidos.');
  416.                     }
  417.                 }
  418.                 // evento al dar a comprar:
  419.                 document.addEventListener('click', (event) => {
  420.                     const trigger = event.target.closest('.js-flight-showOverlay');
  421.                     if (!trigger) return;
  422.                     const form = trigger.closest('form.js-flight-block');
  423.                     if (!form) return;
  424.                     const index = parseInt(form.getAttribute('data-index')) || 0;
  425.                     localStorage.setItem('selectedFlightIndex', index);
  426.                     const hiddenInput = form.querySelector('.js-flightHiddenInput');
  427.                     const precio = hiddenInput ? parseInt(hiddenInput.getAttribute('data-flightprice')) || 0 : 0;
  428.                     const a = AVflight.data.AvailabilityArray;
  429.                     const ida = new Date(a.date1), vuelta = new Date(a.date2);
  430.                     const fmt = { day: '2-digit', month: 'short' };
  431.                     const item_id = `${a.origin1}-${a.destination1}-${a.date1.split('T')[0]} -> ${a.origin2}-${a.destination2}-${a.date2.split('T')[0]}`;
  432.                     const item_name = `${a.cityOrigin1} → ${a.cityDestination1} ${ida.toLocaleDateString('es-CO', fmt)} - ${a.cityOrigin2} → ${a.cityDestination2} ${vuelta.toLocaleDateString('es-CO', fmt)}`;
  433.                     window.dataLayer = window.dataLayer || [];
  434.                     window.dataLayer.push({
  435.                         event: 'add_to_cart',
  436.                         ecommerce: {
  437.                             currency: 'COP',
  438.                             value: precio,
  439.                             items: [{
  440.                                 item_id: item_id,
  441.                                 item_name: item_name,
  442.                                 price: precio,
  443.                                 quantity: 1,
  444.                                 index: index
  445.                             }]
  446.                         }
  447.                     });
  448.                     //console.log('Evento add_to_cart enviado a dataLayer', dataLayer);
  449.                 });
  450.                 if (window.location.pathname.includes('vuelos/detalle')) {
  451.                     const waitForElement = setInterval(() => {
  452.                         const spanElementTotal = document.querySelector('.js-paymentPriceCOP');
  453.                         const originInput = document.querySelector('.flight_locs .dep');
  454.                         const destinationInput = document.querySelector('.flight_locs .arr');
  455.                         const tripDates = document.getElementById('js-tripDates');
  456.                         const storedIndex = parseInt(localStorage.getItem('selectedFlightIndex')) || 0;
  457.                         if (spanElementTotal && originInput && destinationInput && tripDates) {
  458.                             clearInterval(waitForElement);
  459.                             const totalCart = parseFloat(spanElementTotal.getAttribute('data-amount_total')) || 0;
  460.                             const origin = originInput.value.trim().split(',')[0];
  461.                             const destination = destinationInput.value.trim().split(',')[0];
  462.                             const depDate = tripDates.getAttribute('data-firstsegment_dep_date');
  463.                             const returnDate = tripDates.getAttribute('data-lastsegment_dep_date');
  464.                             const isRoundTrip = depDate && returnDate && depDate !== returnDate;
  465.                             const routeCode = `${origin.toLowerCase()}-${destination.toLowerCase()}`.replace(/\s+/g, '');
  466.                             let routeName = `${origin} - ${destination} (${depDate})`;
  467.                             if (isRoundTrip) {
  468.                                 routeName += ` → ${destination} - ${origin} (${returnDate})`;
  469.                             }
  470.                             const checkoutArray = [
  471.                                 {
  472.                                     item_id: routeName,
  473.                                     item_name: routeName,
  474.                                     price: totalCart,
  475.                                     quantity: 1,
  476.                                     index: storedIndex,
  477.                                 }
  478.                             ];
  479.                             window.dataLayer = window.dataLayer || [];
  480.                             window.dataLayer.push({
  481.                                 event: 'begin_checkout',
  482.                                 ecommerce: {
  483.                                     currency: 'COP',
  484.                                     value: totalCart,
  485.                                     items: checkoutArray,
  486.                                 }
  487.                             });
  488.                         }
  489.                     }, 300);
  490.                 }
  491.                 // --- Determinar si necesitamos esperar por AVflight ---
  492.                 var shouldWaitForAVflight = pageUrl.includes('/vuelos/Tiquetes-economicos-') || pageUrl.includes('/vuelos/tiquetes-baratos-de-');
  493.                 if (shouldWaitForAVflight) {
  494.                     //console.log('Aviatur: URL de vuelo detectada. Esperando por AVflight data (minPrice, IATAs)...');
  495.                     function waitForAVflightAndExecute() {
  496.                         if (window.AVflight && window.AVflight.data && window.AVflight.data.attributes) {
  497.                             executeDataLayerAndSchemaLogic(window.AVflight.data);
  498.                         } else {
  499.                             setTimeout(waitForAVflightAndExecute, 100);
  500.                         }
  501.                     }
  502.                     waitForAVflightAndExecute();
  503.                 } else {
  504.                     executeDataLayerAndSchemaLogic({});
  505.                 }
  506.             })();
  507.         </script>
  508.         {% if app.environment == 'dev' %}
  509.             {# FOR DEV ENV PURPOSES ONLY #}
  510.         {% endif %}
  511.         {# {% if app.environment != 'dev' %} #}
  512.         {# {% if pdfGenerator is not defined  %} #}
  513.             {# THIS PART still using deprecated ga.js (instead of analytics.js) on UA-12845048-1 #}
  514.             {# -> https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApi_gaq #}
  515.             {% if (app.request.server.get("HTTP_HOST")|replace({'www.':'','new.':'','site.':'','ecomm3.':'','ecomm5.':'','ecommprod.':'','productos.':'','go.':'','grupo':''}) == 'aviatur.com')%}
  516.                 {# <script type="text/javascript">
  517.                     var _gaq = _gaq || [];
  518.                     var pluginUrl =
  519.                         '//www.google-analytics.com/plugins/ga/inpage_linkid.js';
  520.                     _gaq.push(['_require', 'inpage_linkid', pluginUrl]);
  521.                     _gaq.push(['_setAccount', 'UA-12845048-1']);
  522.                     _gaq.push(['_setDomainName', '{{app.request.server.get("HTTP_HOST")|replace({'www.':'','new.':'','site.':'','ecomm3.':'','ecomm5.':'','ecommprod.':'','productos.':'','go.':''})}}']);
  523.                     _gaq.push(['_setAllowLinker', true]);
  524.                     _gaq.push(['_setCampNameKey', 'utm_name']);
  525.                     _gaq.push(['_trackPageview']);
  526.                     (function () {
  527.                         var ga = document.createElement('script');
  528.                         ga.type = 'text/javascript';
  529.                         ga.async = true;
  530.                         ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
  531.                         var s = document.getElementsByTagName('script')[0];
  532.                         s.parentNode.insertBefore(ga, s);
  533.                     })();
  534.                 </script> #}
  535.             {% endif %}
  536.             <!-- Google Analytics -->
  537.             {# <script type="text/javascript">
  538.                 var clientId;
  539.                 var domain = '{{ app.session.get('domain') }}';
  540.                 var domainsecure = '{{ app.session.get('domainsecure') }}';
  541.                 (function (i, s, o, g, r, a, m) {
  542.                     i['GoogleAnalyticsObject'] = r;
  543.                     i[r] = i[r] || function () {
  544.                         (i[r].q = i[r].q || []).push(arguments)
  545.                     }, i[r].l = 1 * new Date();
  546.                     a = s.createElement(o),
  547.                             m = s.getElementsByTagName(o)[0];
  548.                     a.async = 1;
  549.                     a.src = g;
  550.                     m.parentNode.insertBefore(a, m)
  551.                 })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
  552.                 ga('create', 'UA-12845048-7', 'auto', {'cookieFlags': 'secure;samesite=none',cookieDomain: '{{app.request.server.get("HTTP_HOST")|replace({'www.':'','new.':'','site.':'','ecomm3.':'','ecomm5.':'','ecommprod.':'','productos.':'','go.':''})}}', allowLinker: true});
  553.                 ga('require', 'GTM-5NX36SQ'); // deploy Google Optimize
  554.                 ga('require', 'displayfeatures');
  555.                 ga('require', 'linkid', 'linkid.js');
  556.                 ga('require', 'linker');
  557.                 ga('require', 'ec');
  558.                 ga('linker:autoLink', [domain, domainsecure, 'aviatur.com', 'grupoaviatur.com']);
  559.                 ga('linker:autoLink', [domain, domainsecure, 'aviatur.com', 'grupoaviatur.com'], false, true);
  560.                 var dimensionValue = '{{ app.request.server.get("REMOTE_ADDR") }}';
  561.                 var itmSource = '';
  562.                 var itmMedium = '';
  563.                 var itmContent = '';
  564.                 var itmCampaign = '';
  565.                 var itmTerm = '';
  566.                 {% if app.session.has('transactionId') %}
  567.                     var dimensionValue2 = '{{ app.session.get('transactionId') }}';
  568.                 {% else %}
  569.                     var dimensionValue2 = '';
  570.                 {% endif %}
  571.                 {% if app.request.query.get('itm_source') != NULL %}
  572.                     itmSource = '{{app.request.query.get('itm_source')}}';
  573.                     var dimensionValue3 = itmSource;
  574.                     var dimensionValue6 = itmSource;
  575.                     var dimensionValue17 = itmSource;
  576.                 {% else %}
  577.                     var dimensionValue3 = '';
  578.                     var dimensionValue6 = '';
  579.                     var dimensionValue17 = '';
  580.                 {% endif %}
  581.                 {% if app.request.query.get('itm_medium')!= NULL%}
  582.                     itmMedium = '{{app.request.query.get('itm_medium')}}';
  583.                     var dimensionValue4 = itmMedium;
  584.                     var dimensionValue14 = itmMedium;
  585.                 {% else %}
  586.                     var dimensionValue4 = '';
  587.                     var dimensionValue14 = '';
  588.                 {% endif %}
  589.                 {% if app.request.query.get('itm_content') != NULL%}
  590.                     itmContent = '{{app.request.query.get('itm_content')}}';
  591.                     var dimensionValue5 = itmContent;
  592.                     var dimensionValue16 = itmContent;
  593.                 {% else %}
  594.                     var dimensionValue5 = '';
  595.                     var dimensionValue16 = '';
  596.                 {% endif %}
  597.                 {% if app.request.query.get('itm_campaign') != NULL%}
  598.                     itmCampaign = '{{app.request.query.get('itm_campaign')}}';
  599.                     var dimensionValue15 = itmCampaign;
  600.                     var dimensionValue18 = itmCampaign;
  601.                 {% else %}
  602.                     var dimensionValue15 = '';
  603.                     var dimensionValue18 = '';
  604.                 {% endif %}
  605.                 {% if app.request.query.get('itm_term') != NULL%}
  606.                     itmTerm = '{{app.request.query.get('itm_term')}}';
  607.                     var dimensionValue19 = itmTerm;
  608.                     var dimensionValue20 = itmTerm;
  609.                 {% else %}
  610.                     var dimensionValue19 = '';
  611.                     var dimensionValue20 = '';
  612.                 {% endif %}
  613.                     var dimensionValue7 = '';
  614.                     var dimensionValue8 = '';
  615.                     var dimensionValue9 = '';
  616.                     var dimensionValue10 = '';
  617.                     var dimensionValue11 = '';
  618.                     var dimensionValue12 = '';
  619.                     var dimensionValue13 = '';
  620.                     ga('send', 'pageview', {
  621.                         'dimension1': dimensionValue,
  622.                         'dimension2': dimensionValue2,
  623.                         'dimension3': dimensionValue3,
  624.                         'dimension4': dimensionValue4,
  625.                         'dimension5': dimensionValue5,
  626.                         'dimension6': dimensionValue6,
  627.                         'dimension7': dimensionValue7,
  628.                         'dimension8': dimensionValue8,
  629.                         'dimension9': dimensionValue9,
  630.                         'dimension10': dimensionValue10,
  631.                         'dimension11': dimensionValue11,
  632.                         'dimension12': dimensionValue12,
  633.                         'dimension13': dimensionValue13,
  634.                         'dimension14': dimensionValue14,
  635.                         'dimension15': dimensionValue15,
  636.                         'dimension16': dimensionValue16,
  637.                         'dimension17': dimensionValue17,
  638.                         'dimension18': dimensionValue18,
  639.                         'dimension19': dimensionValue19,
  640.                         'dimension20': dimensionValue20}
  641.                     );
  642.                     setTimeout(ga('send', 'event', 'Bounce Rate Fix', 'Minimum stay of 30 seconds'), 30000);
  643.             </script> #}
  644.             <!-- end Google Analytics -->
  645.             <!-- Google Tag Manager -->
  646.             <!-- Google tag (gtag.js) -->
  647.             <!-- End Google Tag Manager -->
  648.             {# <!-- Start Alexa Certify Javascript -->
  649.             <script type="text/javascript">
  650.                 _atrk_opts = {atrk_acct: "JVF0h1awA400Gn", domain: "aviatur.com", dynamic: true};
  651.                 (function () {
  652.                     var as = document.createElement('script');
  653.                     as.type = 'text/javascript';
  654.                     as.async = true;
  655.                     as.src = "https://d31qbv1cthcecs.cloudfront.net/atrk.js";
  656.                     var s = document.getElementsByTagName('script')[0];
  657.                     s.parentNode.insertBefore(as, s);
  658.                 })();
  659.             </script>
  660.             <noscript><img src="https://d5nxst8fruw4z.cloudfront.net/atrk.gif?account=JVF0h1awA400Gn" style="display:none" height="1" width="1" alt="" /></noscript>
  661.             <!-- End Alexa Certify Javascript -->#}
  662.             {#{% if app.session.has('operatorId') != 1 %}
  663.                 <!-- Start VE Javascript -->
  664.                 <script type="text/javascript">
  665.                     !function () {
  666.                         var a = document.createElement("script");
  667.                         a.type = "text/javascript", a.async = !0, a.src = "//configusa.veinteractive.com/tags/F1B0EFA4/B7BA/44F1/B74B/C723B9D6557E/tag.js";
  668.                         var b = document.getElementsByTagName("head")[0];
  669.                         if (b)
  670.                             b.appendChild(a, b);
  671.                         else {
  672.                             var b = document.getElementsByTagName("script")[0];
  673.                             b.parentNode.insertBefore(a, b)
  674.                         }
  675.                     }();
  676.                 </script>
  677.                 <!-- End VE Javascript -->
  678.             {% endif %}#}
  679.             {#<!-- CRAZY EGG SCRIPT -->
  680.             <script type="text/javascript">
  681.                 setTimeout(function () {
  682.                     var a = document.createElement("script");
  683.                     var b = document.getElementsByTagName("script")[0];
  684.                     a.src = document.location.protocol + "//script.crazyegg.com/pages/scripts/0053/3352.js?" + Math.floor(new Date().getTime() / 3600000);
  685.                     a.async = true;
  686.                     a.type = "text/javascript";
  687.                     b.parentNode.insertBefore(a, b);
  688.                 }, 1);
  689.             </script>
  690.             <!-- END CRAZY EGG SCRIPT -->#}
  691.             {# end scripts #}
  692.         {# {% else %} #}
  693.             <script type="text/javascript">
  694.                 var domain = '{{ app.session.get('domain') }}';
  695.                 var domainsecure = '{{ app.session.get('domainsecure') }}';
  696.                 function ga(d1, d2, d3, d4, d5) {
  697.                 {# setTimeout(function () {
  698.                     console.groupCollapsed('-- GA disabled in dev environment --');
  699.                     console.log([d1, d2, d3, d4, d5]);
  700.                     console.trace();
  701.                     console.groupEnd();
  702.                 }, 0); #}
  703.                         return false;
  704.                     }
  705.             </script>
  706.         {# {% endif %} #}
  707.         {# Parametrización cerrar modal login #}
  708.         {% if parameters['aviatur_close_modal_login'] is defined %}
  709.             {% set activate_login = json_decode(parameters['aviatur_close_modal_login'], true) %}
  710.             {% if activate_login[app.session.get('agencyId')] is defined %}
  711.                 {% set swLoginClose = activate_login[app.session.get('agencyId')] %}
  712.             {% else %}
  713.                 {% set swLoginClose = activate_login['all'] %}
  714.             {% endif %}
  715.         {% endif %}
  716.         {# Fin parametrización cerrar modal login #}
  717.         {# Parametrización boton continuar sin iniciar sesión #}
  718.         {% if parameters['aviatur_continue_without_logging'] is defined %}
  719.             {% set continue_without_logging = json_decode(parameters['aviatur_continue_without_logging'], true) %}
  720.             {% if continue_without_logging[app.session.get('agencyId')] is defined %}
  721.                 {% set continueWithoutLogging = continue_without_logging[app.session.get('agencyId')] %}
  722.             {% else %}
  723.                 {% set continueWithoutLogging = continue_without_logging['all'] %}
  724.             {% endif %}
  725.         {% endif %}
  726.         {# Fin parametrización boton continuar sin iniciar sesión #}
  727.         {# Parametrización resultados de Booking en vuelos #}
  728.         {% if parameters['aviatur_flight_result_booking'] is defined %}
  729.             {% set flight_result_booking = parameters['aviatur_flight_result_booking'] %}
  730.         {% endif %}
  731.         {# Fin parametrización resultados de Booking en vuelos #}
  732.         <!-- Meta Pixel Code -->
  733.         {# <script>
  734.         !function(f,b,e,v,n,t,s)
  735.         {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
  736.         n.callMethod.apply(n,arguments):n.queue.push(arguments)};
  737.         if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
  738.         n.queue=[];t=b.createElement(e);t.async=!0;
  739.         t.src=v;s=b.getElementsByTagName(e)[0];
  740.         s.parentNode.insertBefore(t,s)}(window, document,'script',
  741.         'https://connect.facebook.net/en_US/fbevents.js');
  742.         fbq('init', '1007670546538389');
  743.         fbq('track', 'PageView');
  744.         </script>
  745.         <noscript><img height="1" width="1" style="display:none"
  746.         src="https://www.facebook.com/tr?id=1007670546538389&ev=PageView&noscript=1"
  747.         /></noscript> #}
  748.         <!-- End Meta Pixel Code -->
  749.         <!-- Meta Pixel Code -->
  750.         {# <script>
  751.         !function(f,b,e,v,n,t,s)
  752.         {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
  753.         n.callMethod.apply(n,arguments):n.queue.push(arguments)};
  754.         if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
  755.         n.queue=[];t=b.createElement(e);t.async=!0;
  756.         t.src=v;s=b.getElementsByTagName(e)[0];
  757.         s.parentNode.insertBefore(t,s)}(window, document,'script',
  758.         'https://connect.facebook.net/en_US/fbevents.js');
  759.         fbq('init', '1007670546538389');
  760.         fbq('track', 'PageView');
  761.         </script>
  762.         <noscript><img height="1" width="1" style="display:none"
  763.         src="https://www.facebook.com/tr?id=1007670546538389&ev=PageView&noscript=1"
  764.         /></noscript> #}
  765.         <!-- End Meta Pixel Code -->
  766.         {# <script>
  767.             var swIsBlackWeek;
  768.             var continueWithoutLogging = '{{continueWithoutLogging}}';
  769.             {% if parameters['isBlackWeek'] is defined and parameters['isBlackWeek'] == 'true' %}
  770.                 swIsBlackWeek = '{{parameters['isBlackWeek']}}';
  771.             {% endif %}
  772.             /* Variable de parametro de resultados de booking en vuelos (SOLO AVIATUR)*/
  773.             var flight_result_booking = '{{flight_result_booking}}';
  774.             /* Fin variable de parametro de resultados de booking en vuelos (SOLO AVIATUR)*/
  775.             var swLoginClose = '{{swLoginClose}}';
  776.             var clicked = false;
  777.             var pathname = window.location.pathname.split('/');
  778.             var googleUser = {};
  779.             var startApp = function () {
  780.                 gapi.load('auth2', function () {
  781.                     // Retrieve the singleton for the GoogleAuth library and set up the client.
  782.                     auth2 = gapi.auth2.init({
  783.                         client_id: '{{google_idclient_login}}',
  784.                         cookiepolicy: 'single_host_origin'
  785.                     });
  786.                     attachSignin(document.getElementById('customBtn'));
  787.                 });
  788.             };
  789.             function attachSignin(element) {
  790.                 auth2.attachClickHandler(element, {},
  791.                         function (googleUser) {
  792.                             var profile = googleUser.getBasicProfile();
  793.                             var $modalLogin = jQuery('#js-modalLogin');
  794.                             var id_token = googleUser.getAuthResponse().id_token;
  795.                             jQuery(".js-globalOverlay").attr("style", "z-index: 1200 !important;");
  796.                             jQuery(".js-globalOverlay-text").text("Iniciando sesión");
  797.                             jQuery(".js-globalOverlay").show();
  798.                             jQuery.ajax({
  799.                                 url: '/customer/social-networks-callback',
  800.                                 type: 'POST',
  801.                                 data: {idtoken: id_token, red: "google"},
  802.                                 crossDomain: true,
  803.                                 beforeSend: function () {
  804.                                     jQuery(".js-globalOverlay-text").text("Iniciando sesión");
  805.                                     jQuery(".js-globalOverlay").show();
  806.                                 },
  807.                                 success: function (data) {
  808.                                     if (data.status == "redirect") {
  809.                                         signOut();
  810.                                         if (pathname[2] == "detalle" || pathname[2] == "pasajeros-reserva" || pathname[2] == "formulario") {
  811.                                             location.reload();
  812.                                         } else {
  813.                                             window.location.replace("/");
  814.                                         }
  815.                                     }
  816.                                 },
  817.                                 error: function () {
  818.                                     $modalLogin.find('.close[data-dismiss="modal"]').trigger('click');
  819.                                     jQuery(".js-globalOverlay").hide();
  820.                                 },
  821.                                 complete: function () {}
  822.                             });
  823.                             /*document.getElementById('name').innerText = "Signed in: " +
  824.                              googleUser.getBasicProfile().getName();*/
  825.                         }, function (error) {
  826.                     //alert(JSON.stringify(error, undefined, 2));
  827.                 });
  828.             }
  829.             function signOut() {
  830.                 var auth2 = gapi.auth2.getAuthInstance();
  831.                 auth2.signOut().then(function () {});
  832.             }
  833.         </script> #}
  834.         {# <script>
  835.             var fbid = '{{facebook_appid_login}}';
  836.             window.fbAsyncInit = function () {
  837.                 FB.init({
  838.                     appId: fbid,
  839.                     cookie: true,
  840.                     xfbml: true,
  841.                     version: 'v6.0',
  842.                     oauth: true,
  843.                     status: true
  844.                 });
  845.                 FB.AppEvents.logPageView();
  846.             };
  847.             (function (d, s, id) {
  848.                 var js, fjs = d.getElementsByTagName(s)[0];
  849.                 if (d.getElementById(id)) {
  850.                     return;
  851.                 }
  852.                 js = d.createElement(s);
  853.                 js.id = id;
  854.                 js.src = "https://connect.facebook.net/en_US/sdk.js";
  855.                 fjs.parentNode.insertBefore(js, fjs);
  856.             }(document, 'script', 'facebook-jssdk'));
  857.             function loginFace() {
  858.                 FB.login(function (response) {
  859.                     if (response.authResponse) {
  860.                         var $modalLogin = jQuery('#js-modalLogin');
  861.                         //console.log('Welcome!  Fetching your information.... ');
  862.                         FB.api('/me', {fields: 'first_name, last_name, email, picture'}, function (response2) {
  863.                             response2.picture2 = "http://graph.facebook.com/" + response2.id + "/picture?type=normal";
  864.                             jQuery(".js-globalOverlay").attr("style", "z-index: 1200 !important;");
  865.                             jQuery(".js-globalOverlay-text").text("Iniciando sesión");
  866.                             jQuery(".js-globalOverlay").show();
  867.                             jQuery.ajax({
  868.                                 url: '/customer/social-networks-callback',
  869.                                 type: 'POST',
  870.                                 crossDomain: true,
  871.                                 data: {data: response2, red: "facebook"},
  872.                                 //async: true,
  873.                                 success: function (data) {
  874.                                     if (data.status == "redirect") {
  875.                                         FB.logout();
  876.                                         if (pathname[2] == "detalle" || pathname[2] == "pasajeros-reserva" || pathname[2] == "formulario") {
  877.                                             location.reload();
  878.                                         } else {
  879.                                             window.location.replace("/");
  880.                                         }
  881.                                     }
  882.                                 },
  883.                                 error: function () {
  884.                                     $modalLogin.find('.close[data-dismiss="modal"]').trigger('click');
  885.                                     jQuery(".js-globalOverlay").hide();
  886.                                 },
  887.                                 complete: function () {}
  888.                             });
  889.                         });
  890.                     } else {
  891.                         console.log('User cancelled login or did not fully authorize.');
  892.                     }
  893.                 }, {scope: 'email,public_profile'});
  894.             }
  895.         </script> #}
  896.         {% if app.user %}
  897.             <script>
  898.                 var customerLogged = true;
  899.                 var documentNum = '{{app.user.documentNumber}}';
  900.                 var documentType = '{{app.user.documentType}}';
  901.                 var customerId = '{{app.user.id}}';
  902.                 {%if parameters['switch_login_agencies'] is defined %}
  903.                     {% set login_agencies = json_decode(parameters['switch_login_agencies'], true) %}
  904.                     {% if login_agencies[app.session.get('agencyId')] is defined %}
  905.                         {% set login_is_on = login_agencies[app.session.get('agencyId')] %}
  906.                     {% else %}
  907.                         {% set login_is_on = login_agencies['all'] %}
  908.                     {% endif %}
  909.                 {% else %}
  910.                     {% set login_is_on = '0' %}
  911.                 {% endif %}
  912.                     var login_is_on = "{{login_is_on}}";
  913.             </script>
  914.         {% else %}
  915.             <script>var customerLogged = false;</script>
  916.         {% endif %}
  917.         {% if 'aviatur_general_homepage' in app.request.get('_route') %}
  918.             {% if app.user.username is defined %}
  919.                 <script>
  920.                     jQuery(document).ready(function () {
  921.                         var dtCustomerFacebook = '{{app.user.facebookId}}';
  922.                         var dtCustomerGoogle = '{{app.user.googleId}}';
  923.                         var address = '{{app.user.address}}';
  924.                         var documentNum = '{{app.user.documentNumber}}';
  925.                         if (dtCustomerFacebook || dtCustomerGoogle) {
  926.                             if (documentNum.length == 0 && address.length == 0) {
  927.                                 window.location.replace("/customer/edit");
  928.                             }
  929.                         }
  930.                     });
  931.                 </script>
  932.             {% else %}
  933.                 <script>
  934.                     sessionStorage.setItem('countDialogLogin', 0);
  935.                     var countDialogLogin = 0;
  936.                     jQuery(document).ready(function () {
  937.                         jQuery("#close-dialog-login").on('click', function () {
  938.                             jQuery("#dialog-login-home").hide();
  939.                         });
  940.                     });
  941.                 </script>
  942.             {% endif %}
  943.         {% endif %}
  944.         {% if 'aviatur_customer_edit_info' in app.request.get('_route') %}
  945.             {% if app.user.username is defined %}
  946.                 <script>
  947.                     jQuery(document).ready(function () {
  948.                         var dtCustomerFacebook = '{{app.user.facebookId}}';
  949.                         var dtCustomerGoogle = '{{app.user.googleId}}';
  950.                         jQuery("#customer_edit_form_email").attr("type", "email");
  951.                         jQuery("#customer_edit_form_CivilStatus").parent().parent().parent().hide();
  952.                         if (dtCustomerFacebook || dtCustomerGoogle) {
  953.                             if (jQuery("#customer_edit_form_DocumentNumber").val() == "") {
  954.                                 jQuery("#customer_edit_form_DocumentNumber").removeAttr("readonly");
  955.                             }
  956.                             jQuery(".js-reserva-submit-password").hide();
  957.                             jQuery("#customer_edit_form_email").hide();
  958.                             jQuery('[for^="customer_edit_form_email"]').hide();
  959.                         }
  960.                         //jQuery("#customer_edit_form_DocumentNumber").removeAttr("readonly");
  961.                     });
  962.                 </script>
  963.             {% endif %}
  964.         {% endif %}
  965.         {% if app.session.get('AnonymousEmail') is not null %}
  966.             {# When user set email on "See Booking", this JS set email in input after redirection #}
  967.             {% set anonymousEmail = app.session.get('AnonymousEmail') %}
  968.             <script type="text/javascript">
  969.                 jQuery(document).ready(function () {
  970.                     var anonymousEmail = "{{ anonymousEmail }}";
  971.                     jQuery("#username").val(anonymousEmail);
  972.                     jQuery("#fos_user_registration_form_email").val(anonymousEmail);
  973.                 });
  974.             </script>
  975.         {% endif %}
  976.         {% block javascripts_header %}
  977.             <!-- Analitics Meeting Google Tag Manager -->
  978.             <script>
  979.                 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
  980.                 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
  981.                 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
  982.                 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
  983.                 })(window,document,'script','dataLayer','G-F7HCPZYNHK');
  984.             </script>
  985.             <!-- Analitics Meeting End Google Tag Manager -->
  986.             {% if app.session.get('WorldChangeCoin') is defined and app.session.get('WorldChangeCoin') == 'true' %}
  987.                 <script type="text/javascript">
  988.                     jQuery(document).ready(function () {
  989.                         var sessionCoinSelection = {% if app.session.get('typeCoin') is defined and app.session.get('typeCoin') != '' %}"{{ app.session.get('typeCoin')}}" {% else %} undefined{% endif %};
  990.                         var coin = "{% if app.session.get('typeCoin') is defined and app.session.get('typeCoin') != '' %}{{ app.session.get('typeCoin')}}{% else %}COP{% endif%}";
  991.                         var country = "{% if app.session.get('typeCountry') is defined and app.session.get('typeCountry') != '' %}{{ app.session.get('typeCountry')}}{% else %}co{% endif%}";
  992.                         if (coin != 'COP') {
  993.                             if (typeof sessionStorage.frontCoinSelection !== 'undefined' && coin == sessionStorage.frontCoinSelection) {
  994.                                 coin = sessionStorage.frontCoinSelection;
  995.                                 country = sessionStorage.frontCoinSelection.substr(0, 2).toLowerCase();
  996.                             }
  997.                         }
  998.                         var imgCoin = jQuery('<div class="inline-flex justify-between items-center w-full"><span class="text-base font-[Ubuntu] font-bold">' + coin + '</span><span class="material-symbols-rounded">arrow_drop_down</span></div>');
  999.                         _buttonChange(imgCoin);
  1000.                         jQuery('.dropbtn').empty().append(imgCoin);
  1001.                         jQuery('.dropbtn').click(function () {
  1002.                             _buttonCoin();
  1003.                         });
  1004.                         jQuery('.coin').click(function () {
  1005.                             jQuery('.js-loadingChangeCoin').show();
  1006.                             _buttonChange(jQuery(this));
  1007.                         });
  1008.                     });
  1009.                 </script>
  1010.             {% endif %}
  1011.             {% if cards is defined and cybersource.org_id is defined %}
  1012.                 {% set src = "https://h.online-metrix.net/fp/tags.js?org_id=" ~ cybersource.org_id ~ "&session_id=aviaturcom"~ app.session.get('transactionId') %}
  1013.                 <script type="text/javascript" src="{{src}}"></script>
  1014.             {% endif %}
  1015.             {# <script>(function(h,o,t,j,a,r){h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};h._hjSettings={hjid:2636574,hjsv:6};a=o.getElementsByTagName('head')[0];r=o.createElement('script');r.async=1;r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;a.appendChild(r);})(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv='); </script> #}
  1016.         {% endblock %}
  1017.     </head>
  1018.     <body class="{% block body_class %}body-page-{{ app.request.get('_route')|replace({'_': '-'}) }}{% endblock %}">
  1019.         <div class="container" style="margin-top:0;">
  1020.             <div id="js-modalErrorUrl" class="!fixed grid grid-cols-12 justify-items-center items-center h-full w-full bg-black bg-opacity-50 left-0 top-0 z-[103] modal-general">
  1021.                 <div class="bg-[#F3F6F8] w-[36rem] xs:w-96 h-96 xs:h-auto rounded-lg col-span-12 grid grid-cols-12 justify-items-center px-8 py-4 gap-y-6">
  1022.                     {# <button type="button" class="text-[#042A44] col-start-12 js-modal-errorUrl__btnClose" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button> #}
  1023.                     <button type="button" class="text-[#042A44] col-start-12 js-modal-errorUrl__btnClose" data-dismiss="modal"><span class="material-symbols-rounded">close</span></button>
  1024.                     <p class="col-span-12 w-2/3 xs:w-full text-[#005CB9] text-center font-[Roboto] text-2xl font-medium js-modalErrorUrlTitle">Lo sentimos, <span class="text-[#042A44]">no es posible reservar en línea</span></p>
  1025.                     <p class="col-span-12 w-4/5 xs:w-full text-[#2F2F2F] text-center font-[Ubuntu] text-base font-light js-modalErrorUrlContent">Las fechas seleccionadas corresponden para el mismo día, por politicas del servicio <strong>uno de nuestros asesores lo asistirá personalmente.</strong></p>
  1026.                     <div class="grid grid-flow-col xs:grid-flow-dense col-span-12 gap-4">
  1027.                         {# <a href="https://web.whatsapp.com/send?phone=5713821616&amp;text=" target="_blank" class="js-phone grid grid-flow-col items-center py-3.5 px-12 rounded-full bg-[#FFF] shadow-[0px_1px_12.2px_1px_rgba(0,0,0,0.10)] gap-2 text-[#042A44] font-[Roboto] text-sm font-normal"><span class="material-symbols-rounded">call</span>Lo llamamos</a> #}
  1028.                         {% if app.session.has('operatorId') != 1 %}
  1029.                         <a href="https://web.whatsapp.com/send?phone=5713821616&amp;text=" target="_blank"
  1030.                             class="grid grid-flow-col items-center py-3.5 px-12 rounded-full bg-[#00C77C] shadow-[0px_1px_12.2px_1px_rgba(0,0,0,0.10)] gap-2 text-[#FFF] font-[Roboto] text-sm font-normal js-modalErrorWppHref"><span
  1031.                                 class="material-symbols-rounded">person</span>Hablar con un asesor</a>
  1032.                         {% else %}
  1033.                         <a target="_blank"
  1034.                             class="grid grid-flow-col items-center py-3.5 px-12 rounded-full bg-[#00C77C] shadow-[0px_1px_12.2px_1px_rgba(0,0,0,0.10)] gap-2 text-[#FFF] font-[Roboto] text-sm font-normal js-modalErrorWppHref"><span
  1035.                                 class="material-symbols-rounded">person</span>Por favor comunicarce con el departamento de hoteles</a>
  1036.                         {% endif %}
  1037.                     </div>
  1038.                     <span class="col-span-12 text-[#005CB9] font-[Roboto] text-base font-normal pointer underline searchNewDate js-searchNewDate">Ver otras fechas </span>
  1039.                 </div>
  1040.             </div>
  1041.         </div>
  1042.         <p class="app-name hide" style="display:none;" >{{ (app.session.get('domain')) }}</p>
  1043.         {% block body_scripts %}
  1044.             <!-- Analitics Meeting Google Tag Manager (noscript) -->
  1045.             <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=G-F7HCPZYNHK"
  1046.             height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  1047.             <!-- Analitics Meeting End Google Tag Manager (noscript) -->
  1048.             <!-- Fin Comentarios Contenidos -->
  1049.             {% if cards is defined and cybersource.org_id is defined %}
  1050.                 {% set src = "https://h.online-metrix.net/fp/tags?org_id="~cybersource.org_id~"&session_id=aviaturcom"~ app.session.get('transactionId') %}
  1051.                 <noscript>
  1052.                 <iframe style="width: 100px; height: 100px; border: 0; position:absolute; top: -5000px;" src="{{src}}"></iframe>
  1053.                 </noscript>
  1054.             {% endif %}
  1055.         {% endblock %}
  1056.         {% for flashMessage in app.session.flashbag.get('notice') %}
  1057.             <div class="flash-notice">
  1058.                 {{ flashMessage }}
  1059.             </div>
  1060.         {% endfor %}
  1061.         {% block overlay %}
  1062.             <div class="overlay js-globalOverlay" style="display: none;">
  1063.                 <div class="overlay-center">
  1064.                     <div id="js-spinOverlay" class="spinOverlay hide"></div>
  1065.                     <div class="progress-bar"><div class="progress"><div class="indeterminate"></div></div></div>
  1066.                     <p class="spin-text js-globalOverlay-text">Cargando...</p>
  1067.                     {# <div class="progress-bar hidden-all js-progressBarTarget">
  1068.                         <div class="progress-bar__container">
  1069.                             <div class="progress-bar__bar js-progress"></div>
  1070.                         </div>
  1071.                     </div> #}
  1072.                 </div>
  1073.             </div>
  1074.             <div class="responsive-js"></div>
  1075.         {% endblock %}
  1076.         {% block base_content %}
  1077.             {% block header %}
  1078.             {% endblock %}
  1079.             {% block body %}
  1080.             {% endblock body %}
  1081.             {% block content %}
  1082.             {% endblock content %}
  1083.             {% block footer %}
  1084.             {% endblock footer %}
  1085.             {% block modal %}
  1086.                 <div id="js-globalModal" class="modal fade">
  1087.                     <div class="modal-dialog">
  1088.                         <div class="modal-content">
  1089.                             <div class="modal-header">
  1090.                                 <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
  1091.                                 <h4 id="js-globalModal-title" class="modal-title">Modal title</h4>
  1092.                             </div>
  1093.                             <div class="modal-body">
  1094.                                 <div id="js-globalModal-illustration" {# class="modal-illustration" #}></div>
  1095.                                 <p id="js-globalModal-text" class="modal-text modal-text--error"></p>
  1096.                             </div>
  1097.                         </div>
  1098.                     </div>
  1099.                 </div>
  1100.             {% endblock modal %}
  1101.         {% endblock base_content %}
  1102.         {% block javascripts %}
  1103.             <script>
  1104.                 document.addEventListener("DOMContentLoaded", function () {
  1105.                     const overlay = document.querySelector(".js-globalOverlay");
  1106.                     if (overlay) {
  1107.                         overlay.style.display = "none";
  1108.                         window.addEventListener("load", function () {
  1109.                             overlay.style.display = "none";
  1110.                         });
  1111.                         window.addEventListener("pageshow", function () {
  1112.                             overlay.style.display = "none";
  1113.                         });
  1114.                     }
  1115.                 });
  1116.             </script>
  1117.         {% endblock %}
  1118.         {% block AVglobal %}
  1119.             <span id="AVglobal-props" class="hidden-all">
  1120.                 <input type="hidden" id="AVglobal-hasOperatorId" value="{% if app.session.has('operatorId') == 1 %}1{% else %}0{% endif %}" >
  1121.             </span>
  1122.         {% endblock %}
  1123. {% block javascripts_bottom %}
  1124.             <!-- Google Optimize "CTA click submit" !! remove upon experiment completion !! -->
  1125.             {# <script src="{{ script('GeneralBundle//go_campaign.js') }}"></script>
  1126.             <script>
  1127.                 //var go__ctaSubmitHandler = function() {
  1128.                 //    ga('send', 'event', 'ga-cta', 'click', 'submit');
  1129.                 //};
  1130.                 //jQuery(document).ready(function () {
  1131.                 //    //jQuery(document).on('click', '.js-viewHomePromos', function () {
  1132.                 //    //    ga('send', 'event', 'ga-cta', 'click', 'submit');
  1133.                 //    //});
  1134.                 //    jQuery.subscribe('/paginator/switch', function(e, type) {
  1135.                 //        if (!!dataLayer) {
  1136.                 //            setTimeout(function () {
  1137.                 //                dataLayer.push({'event': 'optimize.activate'});
  1138.                 //                jQuery('.go__async-hide').removeClass('go__async-hide');
  1139.                 //            }, 0);
  1140.                 //        }
  1141.                 //        jQuery('#results .js-flight-block input[type="submit"]').off('click', go__ctaSubmitHandler).on('click', go__ctaSubmitHandler);
  1142.                 //    });
  1143.                 //});
  1144.                 //jQuery(document).on('renderComplete', function () {
  1145.                 //    if (!!dataLayer) {
  1146.                 //        setTimeout(function () {
  1147.                 //            dataLayer.push({'event': 'optimize.activate'});
  1148.                 //        }, 0);
  1149.                 //    }
  1150.                 //});
  1151.             </script> #}
  1152.             <!-- end Google Optimize "CTA click submit" -->
  1153.             <!-- Google recaptcha -->
  1154.             {# <script type="text/javascript">
  1155.                 var recaptchaCallback = function () {
  1156.                     var gCaptcha = grecaptcha.render('g-captcha', {
  1157.                         sitekey: '6LfsqrgZAAAAAJ8B40YoliLS2JyDOtmDWWcGfX5y',
  1158.                         theme: 'compact'
  1159.                     });
  1160.                 };
  1161.             </script>
  1162.             <script rel="prefetch" src='https://www.google.com/recaptcha/api.js?onload=recaptchaCallback&render=explicit&hl=es-419' as="script" async defer></script> #}
  1163.             <!-- END Google recaptcha -->
  1164.             {#{% if "now"|date('U') < '2016-04-28 00:00:00'|date('U') %}
  1165.                 <script type="application/javascript">
  1166.                     (function(w,d,t,r,u){w[u]=w[u]||[];w[u].push({'projectId':'10000','properties':{'pixelId':'442260'}});var s=d.createElement(t);s.src=r;s.async=true;s.onload=s.onreadystatechange=function(){var y,rs=this.readyState,c=w[u];if(rs&&rs!="complete"&&rs!="loaded"){return}try{y=YAHOO.ywa.I13N.fireBeacon;w[u]=[];w[u].push=function(p){y([p])};y(c)}catch(e){}};var scr=d.getElementsByTagName(t)[0],par=scr.parentNode;par.insertBefore(s,scr)})(window,document,"script","https://s.yimg.com/wi/ytc.js","dotq");
  1167.                 </script>
  1168.             {% endif %}#}
  1169.             {#<script data-cfasync="false" type="text/javascript" async="" src="//configusa.veinteractive.com/tags/F1B0EFA4/B7BA/44F1/B74B/C723B9D6557E/tag.js"></script>#}
  1170.             {# Script emblue emails #}
  1171.             <script>
  1172.                 (function (w, d, k, t, u, s, c, f) {
  1173.                     f = function (t) {
  1174.                     t = new Date();
  1175.                     return t.getFullYear() + '' + (t.getMonth() + 1) + '' + t.getDate() + 'T' + t.getHours() + '' + t.getMinutes() + '' + t.getSeconds()};
  1176.                     u = 'https://widgets-static.embluemail.com/accounts/1975EE39BDC4D77E/scripts/sw_197.js?ts=' + f();w[k] = w[k] || [];
  1177.                     s = d.createElement(t);
  1178.                     s.async = 1;
  1179.                     s.src = u;
  1180.                     c = d.getElementsByTagName(t)[0];
  1181.                     c.parentNode.insertBefore(s, c);
  1182.                 })(window, document, '_swdg', 'script');
  1183.                 jQuery(document).ready(function () {
  1184.                     if (window.location.pathname.indexOf('experiencias') !== -1) {
  1185.                         let titleDisney = document.querySelector('.detail-experience__title') || null;
  1186.                         let isDisney = false;
  1187.                         if (titleDisney) {
  1188.                             isDisney = titleDisney.textContent.indexOf('Disney') !== -1 ? true : false;
  1189.                         }
  1190.                         if (isDisney || window.location.pathname === "/experiencias/disney") {
  1191.                             document.querySelector('.nav-main__icon--experience').parentElement.classList.remove('is-active');
  1192.                             document.querySelector('.nav-main__icon--disney').parentElement.classList.add('is-active');
  1193.                         }
  1194.                     }
  1195.                     if (window.location.pathname.indexOf('sostenible') !== -1) {
  1196.                         let titleSostenible = document.querySelector('.sostenible__title') || null;
  1197.                         let isSostenible = false;
  1198.                         if (titleSostenible) {
  1199.                             isSostenible = titleSostenible.textContent.indexOf('Sostenibilidad') !== -1 ? true : false;
  1200.                         }
  1201.                         if (isSostenible || window.location.pathname === "/experiencias/sostenible") {
  1202.                             document.querySelector('.nav-main__icon--experience').parentElement.classList.remove('is-active');
  1203.                             document.querySelector('.nav-main__icon--sostenibilidad').parentElement.classList.add('is-active');
  1204.                         }
  1205.                     }
  1206.                     if (window.location.pathname ===  "/contenidos/solicitar-tarjeta-visa-aviatur") {
  1207.                         document.querySelector('.nav-main__icon--card').parentElement.classList.add('is-active');
  1208.                     }
  1209.                     if (document.querySelector('.smartbanner')) {
  1210.                         document.querySelector('.smartbanner').classList.add('hide');
  1211.                         document.querySelector('html').classList.remove('smartbanner-show');
  1212.                     }
  1213.                     let $hrefLogin = document.querySelector("#login");
  1214.                     if ($hrefLogin) {
  1215.                         $hrefLogin.removeAttribute('href');
  1216.                         jQuery("#login").on("click", function () {
  1217.                             jQuery('#js-modalLogin').modal({backdrop: 'static', keyboard: false});
  1218.                         });
  1219.                     }
  1220.                     if (window.location.pathname.indexOf('register') !== -1) {
  1221.                         document.querySelector('.close').style.top = "200px";
  1222.                     }
  1223.                 });
  1224.             </script>
  1225.             <script>
  1226.                 document.addEventListener("DOMContentLoaded", function () {
  1227.                     const overlay = document.querySelector(".js-globalOverlay");
  1228.                     if (overlay) {
  1229.                         overlay.style.display = "none";
  1230.                         window.addEventListener("load", function () {
  1231.                             overlay.style.display = "none";
  1232.                         });
  1233.                         window.addEventListener("pageshow", function () {
  1234.                             overlay.style.display = "none";
  1235.                         });
  1236.                     }
  1237.                 });
  1238.             </script>
  1239.             {# end Script emblue emails #}
  1240.             <script src="https://unpkg.com/leaflet@1.3.1/dist/leaflet-src.js" integrity="sha512-IkGU/uDhB9u9F8k+2OsA6XXoowIhOuQL1NTgNZHY1nkURnqEGlDZq3GsfmdJdKFe1k1zOc6YU2K7qY+hF9AodA==" crossorigin="anonymous"></script>
  1241.             <script src="https://unpkg.com/leaflet.markercluster@1.3.0/dist/leaflet.markercluster-src.js" integrity="sha384-NAOEbWFcjnXc7U9GkULPhupHZNAbqru9dS3c+4ANYAwtFoVAWuVuMVDH0DIy4ESp" crossorigin="anonymous"></script>
  1242.             <script src="{{ asset('assets/common_assets/js/vendor/leaflet.bezier.js') }}"></script>
  1243.         {% endblock javascripts_bottom %}
  1244.         {% include '@General/components/modalAcceptCookies.html.twig' %}
  1245.     </body>
  1246. </html>