templates/carteCadeau/tunnel.html.twig line 1

Open in your IDE?
  1. {% extends 'vitrine/base.html.twig' %}
  2. {% import 'vitrine/macros/svg_illustration_macros.twig' as svg %}
  3. {% block title "Carte cadeau" %}
  4. {% block description %}{% trans %}Offrez un moment de détente{% endtrans %}{% endblock %}
  5. {% block stylesheets %}
  6.     {{ parent() }}
  7.     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />
  8.     {{ encore_entry_link_tags('tunnel') }}
  9. {% endblock %}
  10. {% block javascripts %}
  11.     {{ parent() }}
  12.     {{ encore_entry_script_tags('tunnel') }}
  13.     <script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>
  14.     <script type="text/javascript" src="https://api.payplug.com/js/1/form.latest.js"></script>
  15.     <script src="{{ asset('js/form/postage-price.js') }}"></script>
  16.     <script src="{{ asset('js/form/global.js') }}"></script>
  17.     <script async defer src="https://api.mapbox.com/mapbox-assembly/v1.5.1/assembly.js"></script>
  18.     <script id="search-js" defer="" src="https://api.mapbox.com/search-js/v1.0.0-beta.21/web.js"></script>
  19.     {% if app.environment == "prod" and facebook_pixel_id %}
  20.     <!-- Facebook Pixel Code -->
  21.     <script data-cookieconsent="marketing">
  22.     !function(f,b,e,v,n,t,s)
  23.     {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
  24.     n.callMethod.apply(n,arguments):n.queue.push(arguments)};
  25.     if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
  26.     n.queue=[];t=b.createElement(e);t.async=!0;
  27.     t.src=v;s=b.getElementsByTagName(e)[0];
  28.     s.parentNode.insertBefore(t,s)}(window, document,'script',
  29.     'https://connect.facebook.net/en_US/fbevents.js');
  30.     fbq('init', '{{ facebook_pixel_id }}');
  31.     fbq('track', 'PageView');
  32.     // Événement ViewContent - Landing page carte cadeau
  33.     fbq('track', 'ViewContent', {
  34.         content_type: 'product',
  35.         content_name: 'Carte Cadeau Taaka',
  36.         content_category: 'gift_card',
  37.         content_ids: ['gift_card'],
  38.         currency: 'EUR'
  39.     });
  40.     // Fonction de tracking pour les étapes du tunnel
  41.     window.trackFacebookEvent = function(eventName, params) {
  42.         if (typeof fbq !== 'undefined') {
  43.             fbq('track', eventName, params);
  44.         }
  45.     };
  46.     </script>
  47.     <noscript>
  48.         <img height="1" width="1" style="display:none"
  49.              src="https://www.facebook.com/tr?id={{ facebook_pixel_id }}&ev=PageView&noscript=1"/>
  50.     </noscript>
  51.     <!-- End Facebook Pixel Code -->
  52.     {% endif %}
  53.     <script>
  54.         const ACCESS_TOKEN = '{{ mapbox_access_token }}';
  55.         const COUNTRIES = '{{ mapbox_countries  }}'.split(',');
  56.         const script = document.getElementById('search-js');
  57.         script.onload = () => {
  58.             // Function to close autofill popups when necessary
  59.             const closeMapboxPopups = () => {
  60.                 const popups = document.querySelectorAll('.mapboxgl-popup');
  61.                 popups.forEach(popup => popup.remove());
  62.             };
  63.             // Helper function to wrap an input field with Mapbox autofill
  64.             const setupAutofillForInput = (inputId) => {
  65.                 const inputElement = document.getElementById(inputId);
  66.                 if (!inputElement) return;
  67.                 
  68.                 // Store the original input's attributes and parent
  69.                 const originalParent = inputElement.parentNode;
  70.                 const style = window.getComputedStyle(inputElement);
  71.                 const width = style.width;
  72.                 
  73.                 // Create a container with the original styles to avoid layout shifts
  74.                 const container = document.createElement('div');
  75.                 container.style.width = width;
  76.                 container.style.position = 'relative';
  77.                 container.style.display = 'inline-block';
  78.                 
  79.                 // Create Mapbox autofill element
  80.                 const autofill = document.createElement('mapbox-address-autofill');
  81.                 autofill.setAttribute('access-token', ACCESS_TOKEN);
  82.                 
  83.                 // Set options as a JSON string attribute
  84.                 autofill.setAttribute('options', JSON.stringify({
  85.                     country: COUNTRIES,
  86.                     language: 'fr'
  87.                 }));
  88.                 
  89.                 // Replace input with the autofill + input
  90.                 originalParent.replaceChild(container, inputElement);
  91.                 container.appendChild(autofill);
  92.                 autofill.appendChild(inputElement);
  93.                 
  94.                 // Add event listeners to handle popups
  95.                 inputElement.addEventListener('blur', () => {
  96.                     setTimeout(closeMapboxPopups, 200);
  97.                 });
  98.             };
  99.             
  100.             // Setup autofill for specific fields - contact address
  101.             setupAutofillForInput('carte_cadeau_contact_adresse');
  102.             
  103.             // Setup autofill for delivery address if it exists
  104.             setupAutofillForInput('carte_cadeau_deliveryAddress_adresse');
  105.             
  106.             // Initialize postage price display for physical card checkbox
  107.             document.addEventListener('DOMContentLoaded', function() {
  108.                 // Only initialize if the physical card price display element exists
  109.                 if (document.querySelector('.is-physical-card')) {
  110.                     // Update price display on page load
  111.                     updatePhysicalCardPriceDisplay('.is-physical-card');
  112.                 }
  113.             });
  114.         };
  115.     </script>
  116.     {% include 'form/components/js-translations.html.twig' %}
  117. {% endblock %}
  118. {% block main %}
  119.     <div id="background-override">
  120.         <video data-step="start" class="background-video" src="https://i.gyazo.com/d9d0bd5636691cfdf72d4db0a4132c09.mp4" muted playsinline autoplay loop></video>
  121.         <div data-step="second-step" class="tunnel-hidden background-image swiper-full">
  122.             <div class="swiper swiper-bath">
  123.                 <div class="swiper-wrapper">
  124.                     <div class="swiper-slide">
  125.                         <img src="https://i.gyazo.com/b7d32e07063d6a51fc24bfe3b70da6ca.jpg" alt="Baignoire 1">
  126.                     </div>
  127.                     <div class="swiper-slide">
  128.                         <img src="https://i.gyazo.com/b7d32e07063d6a51fc24bfe3b70da6ca.jpg" alt="Baignoire 1">
  129.                     </div>
  130.                     <div class="swiper-slide">
  131.                         <img src="https://i.gyazo.com/b7d32e07063d6a51fc24bfe3b70da6ca.jpg" alt="Baignoire 3">
  132.                     </div>
  133.                 </div>
  134.                 <div class="swiper-pagination"></div>
  135.             </div>
  136.         </div>
  137.         <div data-step="fourth-step" class="tunnel-hidden background-image swiper-full">
  138.             <div class="swiper swiper-extra">
  139.                 <div class="swiper-wrapper">
  140.                     <div class="swiper-slide">
  141.                         <img src="https://i.gyazo.com/84c7b90fc6ff6c31478eae19f38bd03d.jpg" alt="Extra 1">
  142.                     </div>
  143.                     <div class="swiper-slide">
  144.                         <img src="https://i.gyazo.com/84c7b90fc6ff6c31478eae19f38bd03d.jpg" alt="Extra 2">
  145.                     </div>
  146.                     <div class="swiper-slide">
  147.                         <img src="https://i.gyazo.com/84c7b90fc6ff6c31478eae19f38bd03d.jpg" alt="Extra 3">
  148.                     </div>
  149.                 </div>
  150.                 <div class="swiper-pagination"></div>
  151.             </div>
  152.         </div>
  153.     </div>
  154.     {% form_theme form 'form/theme_tunnel.html.twig' %}
  155.     {{ form_start(form, { 'attr': { 'class': 'to-submit w-full' }}) }}
  156.     <div class="not-animate-childs pt-32 justify-items-center">
  157.         <div id="progress-bar" class="progress-bar-container tunnel-hidden">
  158.             <p class="progress-bar-steps">
  159.                 {% trans %}Etape{% endtrans %} <span id="step-count">1</span> {% trans %}sur 6{% endtrans %}
  160.             </p>
  161.             <div class="progress-bar">
  162.                 <div class="progress-bar-fill"></div>
  163.             </div>
  164.         </div>
  165.         <section id="start" class="tunnel-hidden content-column-center-48 tunnel-step">
  166.             <h2 class="title text-center mt-24 text-4xl">
  167.                 {% trans %}Offrez un moment de détente à vos proches{% endtrans %}
  168.             </h2>
  169.             <div class="tunnel-footer m-auto">
  170.                 {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Commencer' } %}
  171.             </div>
  172.         </section>
  173.         <section id="first-step" class="tunnel-hidden tunnel-step">
  174.             <div class="content-column-center-48">
  175.                 <div class="content-column-8-center">
  176.                     <h2 class="title text-center">
  177.                         {% trans %}Pour combien de personnes ?{% endtrans %}
  178.                     </h2>
  179.                     <p class="text-opacity-70 text-center">
  180.                         {% trans %}Les heureux élus profiteront de leur espace en toute intimité, quel que soit leur nombre{% endtrans %}
  181.                     </p>
  182.                 </div>
  183.                 <div>
  184.                     {{ form_widget(form.nbParticipants) }}
  185.                 </div>
  186.                 <div class="tunnel-footer">
  187.                     <div class="infoContainer w-full text-center" style="display: none">
  188.                         <p class="stepInfo">
  189.                         </p>
  190.                     </div>
  191.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  192.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'goToPrivatisation', 'label': 'Privatiser' } %}
  193.                 </div>
  194.             </div>
  195.         </section>
  196.         <section id="second-step" class="tunnel-hidden tunnel-step">
  197.             <div class="swiper-button-prev-bath swiper-button-prev"></div>
  198.             <div class="swiper-button-next-bath swiper-button-next"></div>
  199.             <div class="content-column-center-48 ">
  200.                 <div class="content-column-8-center">
  201.                     <h2 class="title text-center">
  202.                         {% trans %}Combien de baignoires voulez-vous inclure ?{% endtrans %}
  203.                     </h2>
  204.                     <p class="text-opacity-70 text-center">
  205.                         {% trans %}Les heureux élus profiteront de leur espace en toute intimité, quel que soit leur nombre.{% endtrans %}
  206.                     </p>
  207.                 </div>
  208. {#                <div class="swiper mySwiper">#}
  209. {#                    <div class="swiper-wrapper">#}
  210. {#                        <div class="swiper-slide"></div>#}
  211. {#                        <div class="swiper-slide"></div>#}
  212. {#                        <div class="swiper-slide"></div>#}
  213. {#                    </div>#}
  214. {#                    <div class="swiper-pagination"></div>#}
  215. {#                </div>#}
  216.                 <div class="max-w-400">
  217.                     {{ form_widget(form.nbBath) }}
  218.                 </div>
  219.                 <div class="tunnel-footer">
  220.                     <div class="totalContainer w-full flex-between" style="display: none">
  221.                         <p class="small-text-opacity-70">
  222.                             {% trans %}Total pour{% endtrans %} <span class="totalPerson">1</span> {% trans %}personne(s){% endtrans %}
  223.                         </p>
  224.                         <p>
  225.                             <b class="totalPrice"></b>
  226.                         </p>
  227.                     </div>
  228.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  229.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'previousStep', 'label': 'Précédent' } %}
  230.                 </div>
  231.             </div>
  232.         </section>
  233.         <section id="third-step" class="tunnel-hidden tunnel-step">
  234.             <div class="content-column-center-48 ">
  235.                 <h2 class="title text-center">
  236.                     {% trans %}Choisissez une offre{% endtrans %}
  237.                 </h2>
  238.                 <div class="w-full">
  239.                     {{ form_widget(form.offer) }}
  240.                 </div>
  241.                 <div class="tunnel-footer">
  242.                     <div class="totalContainer w-full flex-between" style="display: none">
  243.                         <p class="small-text-opacity-70">
  244.                             {% trans %}Total pour{% endtrans %} <span class="totalPerson">1</span> {% trans %}personne(s){% endtrans %}
  245.                         </p>
  246.                         <p>
  247.                             <b class="totalPrice"></b>
  248.                         </p>
  249.                     </div>
  250.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  251.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'previousStep', 'label': 'Précédent' } %}
  252.                 </div>
  253.             </div>
  254.         </section>
  255.         <section id="fourth-step" class="tunnel-hidden tunnel-step">
  256.             <div class="swiper-button-prev-extra swiper-button-prev"></div>
  257.             <div class="swiper-button-next-extra swiper-button-next"></div>
  258.             <div class="content-column-center-48 ">
  259.                 <div class="content-column-8-center">
  260.                     <h2 class="title text-center">
  261.                         {% trans %}Un petit plaisir à ajouter ?{% endtrans %}
  262.                     </h2>
  263.                 </div>
  264.                 <div class="extra-container max-w-400">
  265.                     {{ form_row(form.extraReservations) }}
  266.                 </div>
  267.                 <div class="tunnel-footer">
  268.                     <div class="totalContainer w-full flex-between" style="display: none">
  269.                         <p class="small-text-opacity-70">
  270.                             {% trans %}Total pour{% endtrans %} <span class="totalPerson">1</span> {% trans %}personne(s){% endtrans %}
  271.                         </p>
  272.                         <p>
  273.                             <b class="totalPrice"></b>
  274.                         </p>
  275.                     </div>
  276.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  277.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'previousStep', 'label': 'Précédent' } %}
  278.                 </div>
  279.             </div>
  280.         </section>
  281.         <section id="fifth-step" class="tunnel-hidden tunnel-step">
  282.             <div class="content-column-center-48 ">
  283.                 <div class="content-column-8-center">
  284.                     <h2 class="title text-center">
  285.                         {% trans %}Personnalisez votre carte cadeau{% endtrans %}
  286.                     </h2>
  287.                 </div>
  288. {#                <div class="swiper mySwiper">#}
  289. {#                    <div class="swiper-wrapper">#}
  290. {#                        <div class="swiper-slide"></div>#}
  291. {#                        <div class="swiper-slide"></div>#}
  292. {#                        <div class="swiper-slide"></div>#}
  293. {#                    </div>#}
  294. {#                    <div class="swiper-pagination"></div>#}
  295. {#                </div>#}
  296.                 <div class="max-w-400 content-column-16">
  297.                     <p class="text-opacity-70 text-center">
  298.                         {% trans %}Choisissez votre modèle{% endtrans %}
  299.                     </p>
  300.                     {{ form_widget(form.templateCarteCadeau) }}
  301.                     <p class="text-opacity-70 text-center" style="margin-top: 32px;">
  302.                         {% trans %}Ajoutez un message{% endtrans %}
  303.                     </p>
  304.                     <div class="relative bg-white h-max">
  305.                         {{ form_widget(form.attention) }}
  306.                         <span id="max-length-text">
  307.                             {% trans %}Caractères restants{% endtrans %} : <span id="textarea-remaining-characters">196</span>/196
  308.                         </span>
  309.                     </div>
  310.                 </div>
  311.                 <div class="tunnel-footer">
  312.                     <div class="totalContainer w-full flex-between" style="display: none">
  313.                         <p class="small-text-opacity-70">
  314.                             {% trans %}Total pour{% endtrans %} <span class="totalPerson">1</span> {% trans %}personne(s){% endtrans %}
  315.                         </p>
  316.                         <p>
  317.                             <b class="totalPrice"></b>
  318.                         </p>
  319.                     </div>
  320.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  321.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'previousStep', 'label': 'Précédent' } %}
  322.                 </div>
  323.             </div>
  324.         </section>
  325.         <section id="sixth-step" class="tunnel-hidden tunnel-step">
  326.             <div class="content-column-center-48">
  327.                 <div class="content-column-8 ">
  328.                     <h2 class="title text-center">
  329.                         {% trans %}Récapitulons{% endtrans %}
  330.                     </h2>
  331.                 </div>
  332.                 <div class="content-row-48-center max-w-1200">
  333.                     <div class="gsap-sticky">
  334.                         {% include "tunnel/components/recapitulatif.html.twig" %}
  335.                     </div>
  336.                     <div class="contact-container wrapper-form-right flex-1">
  337.                         <div class="content-column-16">
  338.                             <h2 class="p-16-0">
  339.                                 {% trans %}Votre carte cadeau{% endtrans %}
  340.                             </h2>
  341.                             <div class="content-row-16 is-physical-card">
  342.                                 <div class="input-wrapper">
  343.                                     <label class="content-row-8">
  344.                                         {{ form_widget(form.physicalCard) }}
  345.                                         <div class="checkbox-label">
  346.                                             <p>{% trans %}Impression + envoi postal{% endtrans %}</p>
  347.                                             <p class="small-text-opacity-70 sublabel">{% trans %}Frais de livraison{% endtrans %}</p>
  348.                                         </div>
  349.                                     </label>
  350.                                 </div>
  351.                                 <div id="postagePriceResponse" data-price="0"></div>
  352.                             </div>
  353.                             <p class="green-light-text">{{ 'email.carte_cadeau.physical_delivery_france'|trans }}</p>
  354.                             <p class="green-light-text">{{ 'email.carte_cadeau.physical_delivery_text'|trans }}</p>
  355.                             <div>
  356.                                 <h3 class="p-16-0">
  357.                                     {% trans %}Offert par{% endtrans %}
  358.                                 </h3>
  359.                                 <p class="green-light-text">{% trans %}La carte cadeau sera envoyée sur votre email{% endtrans %}</p>
  360.                             </div>
  361.                             {{ form_row(form.contact) }}
  362.                             
  363.                             <div class="use-facturation-checkbox hidden">
  364.                                 <div class="input-wrapper">
  365.                                     <label class="content-row-8">
  366.                                         {{ form_widget(form.deliveryAddress.useAdresseFacturation) }}
  367.                                         <p>{% trans %}Utiliser cette adresse pour la livraison{% endtrans %}</p>
  368.                                     </label>
  369.                                 </div>
  370.                             </div>
  371.                             <div class="adresse-livraison container-contact-physical-card hidden">
  372.                                 <h3 class="p-16-0">
  373.                                     {% trans %}Adresse de livraison{% endtrans %}
  374.                                 </h3>
  375.                                 <div class="content-column-16 form-contact-physical-card">
  376.                                     <div class="input-wrapper">
  377.                                         <label class="content-column-8">
  378.                                             {% trans %}Prénom{% endtrans %}
  379.                                             {{ form_widget(form.deliveryAddress.prenom) }}
  380.                                         </label>
  381.                                         <hr >
  382.                                         <label class="content-column-8">
  383.                                             {% trans %}Nom{% endtrans %}
  384.                                             {{ form_widget(form.deliveryAddress.nom) }}
  385.                                         </label>
  386.                                     </div>
  387.                                     <div class="input-wrapper">
  388.                                         <label class="content-column-8">
  389.                                             {% trans %}Rue{% endtrans %}
  390.                                             {{ form_widget(form.deliveryAddress.adresse) }}
  391.                                         </label>
  392.                                         <hr >
  393.                                         <label class="content-column-8">
  394.                                             {% trans %}Ville{% endtrans %}
  395.                                             {{ form_widget(form.deliveryAddress.ville) }}
  396.                                         </label>
  397.                                     </div>
  398.                                     <div class="input-wrapper">
  399.                                         <label class="content-column-8">
  400.                                             {% trans %}Code postal{% endtrans %}
  401.                                             {{ form_widget(form.deliveryAddress.codePostal) }}
  402.                                         </label>
  403.                                         <hr >
  404.                                         <label class="content-column-8">
  405.                                             {% trans %}Pays{% endtrans %}
  406.                                             {{ form_widget(form.deliveryAddress.pays) }}
  407.                                         </label>
  408.                                     </div>
  409.                                 </div>
  410.                             </div>
  411.                             {{ form_row(form.cgv) }}
  412.                             <p style="font-size: 14px;">
  413.                                 (*) {% trans %}Champs obligatoires{% endtrans %}
  414.                             </p>
  415.                         </div>
  416.                     </div>
  417.                 </div>
  418.                 <div class="content-column-8 max-w-400">
  419.                     <div class="infoContainer w-full text-center my-2">
  420.                         <p class="stepInfo">
  421.                         </p>
  422.                     </div>
  423.                     {% include 'form/components/rgpd.html.twig' with {'sujet': 'achat'} %}
  424.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'createPayment', 'label': 'payment.pay'|trans } %}
  425.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'goToFirstStep', 'label': 'Modifier' } %}
  426.                 </div>
  427.             </div>
  428.         </section>
  429.     </div>
  430.     {{ form_end(form) }}
  431.     <script src="{{ asset('js/tunnel.js') }}"></script>
  432.     <script src="{{ asset('js/tunnel/swiper.js') }}"></script>
  433.     <script src="{{ asset('js/textarea_length.js') }}"></script>
  434.     <script>
  435.         document.addEventListener('DOMContentLoaded', function() {
  436.             // Fix the selector to find the actual physicalCard checkbox
  437.             const physicalCardCheckbox = document.querySelector('input[name$="[physicalCard]"]');
  438.             const deliveryAddressSections = document.querySelectorAll('.adresse-livraison');
  439.             const useAdresseFacturationContainer = document.querySelector('.use-facturation-checkbox');
  440.             const useAdresseFacturationCheckbox = document.querySelector('.use-facturation-checkbox input');
  441.             const contactCountrySelect = document.querySelector('select[name$="[contact][pays]"]');
  442.             
  443.             // Get all delivery address form fields
  444.             const deliveryAddressFields = document.querySelectorAll(
  445.                 '.adresse-livraison input[required], .adresse-livraison select[required]'
  446.             );
  447.             
  448.             // Function to toggle required attribute on delivery address fields
  449.             function toggleDeliveryFieldsRequired(required) {
  450.                 deliveryAddressFields.forEach(field => {
  451.                     if (required) {
  452.                         field.setAttribute('required', 'required');
  453.                     } else {
  454.                         field.removeAttribute('required');
  455.                     }
  456.                 });
  457.             }
  458.             
  459.             // Check if contact country is France
  460.             function checkContactCountry() {
  461.                 if (contactCountrySelect && useAdresseFacturationCheckbox) {
  462.                     const isContactInFrance = contactCountrySelect.value === 'FR';
  463.                     
  464.                     if (!isContactInFrance) {
  465.                         // Disable checkbox and add warning
  466.                         useAdresseFacturationCheckbox.disabled = true;
  467.                         useAdresseFacturationCheckbox.checked = false;
  468.                         
  469.                         // Add warning if not already present
  470.                         let warningMsg = useAdresseFacturationContainer.querySelector('.country-warning');
  471.                         if (!warningMsg) {
  472.                             warningMsg = document.createElement('p');
  473.                             warningMsg.className = 'country-warning small-text text-error';
  474.                             warningMsg.textContent = "{% trans %}L'adresse de contact doit être en France pour utiliser la même adresse{% endtrans %}";
  475.                             useAdresseFacturationContainer.appendChild(warningMsg);
  476.                         }
  477.                         
  478.                         // Show delivery address if physical card is checked
  479.                         if (physicalCardCheckbox && physicalCardCheckbox.checked) {
  480.                             deliveryAddressSections.forEach(section => {
  481.                                 section.classList.remove('hidden');
  482.                             });
  483.                             toggleDeliveryFieldsRequired(true);
  484.                         }
  485.                     } else {
  486.                         // Enable checkbox and remove warning
  487.                         useAdresseFacturationCheckbox.disabled = false;
  488.                         
  489.                         const warningMsg = useAdresseFacturationContainer.querySelector('.country-warning');
  490.                         if (warningMsg) {
  491.                             warningMsg.remove();
  492.                         }
  493.                         
  494.                         // Update delivery address visibility based on useAdresseFacturation state
  495.                         updateDeliveryAddressVisibility();
  496.                     }
  497.                 }
  498.             }
  499.             
  500.             // Function to update delivery address visibility based on both checkboxes
  501.             function updateDeliveryAddressVisibility() {
  502.                 if (!physicalCardCheckbox) return;
  503.                 
  504.                 const physicalCardChecked = physicalCardCheckbox.checked;
  505.                 const useFacturationChecked = useAdresseFacturationCheckbox && useAdresseFacturationCheckbox.checked && !useAdresseFacturationCheckbox.disabled;
  506.                 
  507.                 // Show/hide use facturation checkbox based on physical card
  508.                 if (useAdresseFacturationContainer) {
  509.                     useAdresseFacturationContainer.classList.toggle('hidden', !physicalCardChecked);
  510.                 }
  511.                 
  512.                 // Show/hide delivery address and set required fields
  513.                 deliveryAddressSections.forEach(section => {
  514.                     if (physicalCardChecked && !useFacturationChecked) {
  515.                         section.classList.remove('hidden');
  516.                         toggleDeliveryFieldsRequired(true);
  517.                     } else {
  518.                         section.classList.add('hidden');
  519.                         toggleDeliveryFieldsRequired(false);
  520.                     }
  521.                 });
  522.             }
  523.             
  524.             // Initialize form state
  525.             if (physicalCardCheckbox) {
  526.                 // Set initial state - by default everything should be hidden and not required
  527.                 toggleDeliveryFieldsRequired(false);
  528.                 updateDeliveryAddressVisibility();
  529.                 
  530.                 // Add event listener for physical card checkbox
  531.                 physicalCardCheckbox.addEventListener('change', function() {
  532.                     updateDeliveryAddressVisibility();
  533.                 });
  534.             }
  535.             
  536.             // Check country on load and when country changes
  537.             if (contactCountrySelect) {
  538.                 checkContactCountry();
  539.                 contactCountrySelect.addEventListener('change', checkContactCountry);
  540.             }
  541.             
  542.             // Handle useAdresseFacturation checkbox if it exists
  543.             if (useAdresseFacturationCheckbox) {
  544.                 useAdresseFacturationCheckbox.addEventListener('change', function() {
  545.                     updateDeliveryAddressVisibility();
  546.                 });
  547.             }
  548.         });
  549.         let submitButton = document.querySelector(".submit-btn");
  550.         window.addEventListener('message', function (event) {
  551.             // Check if the message is coming from the PayPlug origin
  552.             if (event.origin === "https://secure.payplug.com") {
  553.                 // Check if the message data indicates the lightbox was closed
  554.                 if (event.data === "closePayPlugFrame") {
  555.                     // Re-enable the submit button
  556.                     submitButton.removeAttribute("disabled");
  557.                     submitButton.querySelector(".spinner").style.display = "none";
  558.                 }
  559.             }
  560.         });
  561.         function createPayment() {
  562.             let form = document.querySelector("form.to-submit");
  563.             let formExtras = new FormData(form);
  564.             let formData = {};
  565.             submitButton.removeAttribute("disabled");
  566.             displayStepInfo(submitButton, "");
  567.             for (let entry of formExtras.entries()) {
  568.                 formData[entry[0]] = entry[1];
  569.             }
  570.             // get the template select option value
  571.             formData['template'] = document.querySelector('input[name="carte_cadeau[templateCarteCadeau]"]:checked').value;
  572.             // Check for delivery address confirmation if physical card is selected
  573.             if (!confirmDeliveryAddress()) {
  574.                 // User cancelled, reset button state and don't proceed with payment
  575.                 submitButton.disabled = false;
  576.                 submitButton.removeAttribute('disabled');
  577.                 // Remove loading states
  578.                 submitButton.classList.remove('loading', 'disabled', 'processing');
  579.                 // Reset any inline styles
  580.                 submitButton.style.pointerEvents = '';
  581.                 submitButton.style.opacity = '';
  582.                 // Hide spinner if it exists
  583.                 const spinner = submitButton.querySelector('.spinner');
  584.                 if (spinner) {
  585.                     spinner.style.display = 'none';
  586.                 }
  587.                 // Clear any info messages
  588.                 displayStepInfo(submitButton, "");
  589.                 return;
  590.             }
  591.             // Facebook Pixel - InitiateCheckout avec le montant
  592.             // Server-side event is also sent via Meta Conversions API
  593.             if (typeof window.trackFacebookEvent !== 'undefined' && typeof synthesisRefreshPrice === 'function') {
  594.                 const totalPrice = synthesisRefreshPrice();
  595.                 window.trackFacebookEvent('InitiateCheckout', {
  596.                     content_type: 'product',
  597.                     content_name: 'Carte Cadeau Taaka',
  598.                     content_category: 'gift_card',
  599.                     content_ids: ['gift_card'],
  600.                     num_items: 1,
  601.                     currency: 'EUR',
  602.                     value: totalPrice
  603.                 });
  604.             }
  605.             // Custom validation - check only visible required fields
  606.             const visibleRequiredFields = form.querySelectorAll('input[required]:not([style*="display: none"]), select[required]:not([style*="display: none"])');
  607.             let isValid = true;
  608.             let firstInvalidField = null;
  609.             visibleRequiredFields.forEach(field => {
  610.                 // Skip validation for fields that are in hidden containers
  611.                 const isFieldHidden = field.closest('.hidden') !== null;
  612.                 if (!isFieldHidden && !field.value.trim()) {
  613.                     isValid = false;
  614.                     if (!firstInvalidField) {
  615.                         firstInvalidField = field;
  616.                     }
  617.                 }
  618.             });
  619.             if (!isValid) {
  620.                 displayStepInfo(submitButton, "Veuillez remplir tous les champs obligatoires");
  621.                 if (firstInvalidField) {
  622.                     firstInvalidField.focus();
  623.                 }
  624.                 return;
  625.             }
  626.             submitButton.disabled = true;
  627.             submitButton.querySelector(".spinner").style.display = "block";
  628.             $.ajax({
  629.                 url: "{{ path('carte_cadeau_paiement') }}",
  630.                 dataType: "json",
  631.                 type: "Post",
  632.                 async: true,
  633.                 data: formData,
  634.                 success: function (data) {
  635.                     Payplug.showPayment(data);
  636.                 },
  637.                 error: function (data) {
  638.                     alert('{% trans %}Nous sommes désolés, une erreur est survenue, nous avons besoin que vous recommenciez. Aucun paiement n\'a été émis.{% endtrans %}');
  639.                     submitButton.removeAttribute("disabled");
  640.                     submitButton.querySelector(".spinner").style.display = "none";
  641.                     // window.location.reload();
  642.                 }
  643.             });
  644.         }
  645.     </script>
  646. {% endblock %}