templates/hotel/details.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block stylesheets %}
  3.     <link rel="stylesheet" type="text/css" href="{{ asset('front/style/single_listing_style.css') }}">
  4.     <link rel="stylesheet" type="text/css" href="{{ asset('front/style/single_listing_responsive.css') }}">
  5.     <link rel="stylesheet" type="text/css" href="{{ asset('front/style/blog_style.css') }}">
  6.     <link rel="stylesheet" type="text/css" href="{{ asset('front/style/blog_responsive.css') }}">
  7.     <link href="{{ asset('front/searchbar/vendor/mdi-font/css/material-design-iconic-font.min.css') }}" rel="stylesheet" media="all">
  8.     <link href="{{ asset('front/searchbar/vendor/font-awesome-4.7/css/font-awesome.min.css') }}" rel="stylesheet" media="all">
  9.     <!-- Font special for pages-->
  10.     <link href="https://fonts.googleapis.com/css?family=Roboto:100,100i,300,300i,400,400i,500,500i,700,700i,900,900i" rel="stylesheet">
  11.     <!-- Vendor CSS-->
  12.     <link href="{{ asset('front/searchbar/vendor/select2/select2.min.css') }}" rel="stylesheet" media="all">
  13.     <link href="{{ asset('front/searchbar/vendor/datepicker/daterangepicker.css') }}" rel="stylesheet" media="all">
  14.     <!-- Main CSS-->
  15.     <link href="{{ asset('front/searchbar/css/main.css') }}" rel="stylesheet" media="all">
  16.     <!-- Modal Css -->
  17.     <link rel="stylesheet" href="{{ asset('front/modals/fonts/icomoon/stylecommons.css') }}">
  18.     <!-- Bootstrap CSS -->
  19.     <link rel="stylesheet" href="{{ asset('front/modals/css/bootstrapcss.min.css') }}">
  20.     <!-- Style -->
  21. {#    <link rel="stylesheet" href="{{ asset('front/modals/css/stylemodals.css') }}">#}
  22. <style>
  23.     .carousel {
  24.         position: relative;
  25.     }
  26.     .carousel-item img {
  27.         object-fit: cover;
  28.     }
  29.     #carousel-thumbs {
  30.         background: rgba(255,255,255,.3);
  31.         bottom: 0;
  32.         left: 0;
  33.         padding: 0 50px;
  34.         right: 0;
  35.     }
  36.     #carousel-thumbs img {
  37.         border: 5px solid transparent;
  38.         cursor: pointer;
  39.     }
  40.     #carousel-thumbs img:hover {
  41.         border-color: rgba(255,255,255,.3);
  42.     }
  43.     #carousel-thumbs .selected img {
  44.         border-color: #fff;
  45.     }
  46.     .carousel-control-prev,
  47.     .carousel-control-next {
  48.         width: 50px;
  49.     }
  50.     @media all and (max-width: 767px) {
  51.         .carousel-container #carousel-thumbs img {
  52.             border-width: 3px;
  53.         }
  54.         .blog {
  55.     padding-top: 30px;
  56.     padding-bottom: 0px;
  57. }
  58.        .modal-title
  59.        {
  60.         font-size:15px!important;
  61.        } 
  62.     }
  63.     
  64.     @media all and (min-width: 576px) {
  65.         .carousel-container #carousel-thumbs {
  66.             position: absolute;
  67.         }
  68.     }
  69.     @media all and (max-width: 576px) {
  70.         .carousel-container #carousel-thumbs {
  71.             background: #ccccce;
  72.         }
  73.         
  74.     }
  75.     .btn-submit {
  76.             font-size: 16px;
  77.             font-weight: 500;
  78.             border: 1px solid black;
  79.             background: #FFFFFF;
  80.             color: black;
  81.             margin-bottom: 10px;
  82.             max-width:335px;
  83.         }
  84.         /* Media Queries */
  85.         @media screen and (max-width: 768px) {
  86.             .input-group {
  87.                 min-width:300px;
  88.                 max-width: none;
  89.             }
  90.             .btn-submit{
  91.                 min-width:300px;
  92.                 margin-left:16px;
  93.             }
  94.             .modal-content{
  95.                 width: 85%;
  96.                 margin-top: 131px;
  97.                 margin-left: 13px!important;
  98.             }
  99.             .hotel_info_text{
  100.                 min-width:340px;
  101.             }
  102.             .input--medium1{
  103.                 display:none
  104.             }
  105.             .table-responsive {
  106.                 min-width:300px;
  107.             }
  108.             table.table {
  109.                 width: 100%;
  110.                 margin-bottom: 1rem;
  111.                 background-color: transparent;
  112.                 display: grid;
  113.                 grid-template-columns: 1fr 1fr; /* Deux colonnes égales */
  114.                 align-items: stretch; /* Les colonnes ont la même hauteur */
  115.             }
  116.             /* Place l'en-tête dans la première colonne */
  117.             table.table thead {
  118.                 grid-column: 1 / 2; /* Colonne 1 */
  119.             }
  120.             /* Place les données dans la deuxième colonne */
  121.             table.table tbody {
  122.                 grid-column: 2 / 3; /* Colonne 2 */
  123.             }
  124.             /* Réinitialise la mise en page des éléments dans les colonnes */
  125.             table.table thead th,
  126.             table.table tbody td {
  127.                 display: block;
  128.                 text-align: left;
  129.                 height:60px;
  130.             }
  131.             .select1{
  132.                 height: 40px;
  133.                 width: 100%;
  134.             }
  135.             .select2{
  136.                 height: 40px;
  137.                 width: 100%;
  138.             }
  139.         }
  140.     .main_nav_item a {
  141.         font-family: 'Open Sans', sans-serif;
  142.         font-size: 15px;
  143.         font-weight: 700;
  144.         color: #FFFFFF;
  145.         text-transform: uppercase;
  146.         padding-bottom: 10px;
  147.         padding-top: 10px;
  148.     }
  149.     .main_nav_item::after {
  150.         display: block;
  151.         position: absolute;
  152.         left: -1px;
  153.         bottom: -11px;
  154.         width: calc(100% + 2px);
  155.         height: 2px;
  156.         background: linear-gradient(to right, #b29b63, #0093a9)!important;
  157.         content: '';
  158.         opacity: 0;
  159.         -webkit-transition: all 200ms ease;
  160.         -moz-transition: all 200ms ease;
  161.         -ms-transition: all 200ms ease;
  162.         -o-transition: all 200ms ease;
  163.         transition: all 200ms ease;
  164.     }
  165.     .container {
  166.         max-width: 1440px;
  167.     }
  168.     .p-t-395 {
  169.         padding-top: 40px;
  170.         margin-right: 350px;
  171.     }
  172.     .modal-content {
  173.         position: relative;
  174.         display: -webkit-box;
  175.         display: -ms-flexbox;
  176.         display: flex;
  177.         -webkit-box-orient: vertical;
  178.         -webkit-box-direction: normal;
  179.         -ms-flex-direction: column;
  180.         flex-direction: column;
  181.         width: 100%;
  182.         pointer-events: auto;
  183.         background-color: transparent!important;
  184.         background-clip: padding-box;
  185.         border: none;
  186.         border-radius: 0.3rem;
  187.         outline: 0;
  188.     }
  189.     .rooms {
  190.         margin-top: 35px;
  191.     }
  192.     .hidden {
  193.     display: none;
  194. }
  195. </style>
  196. {% endblock %}
  197. {% block body %}
  198.     <div class="home" style="height: 130px"></div>
  199.     {# <div class="super_container">
  200.         <!-- Header -->
  201.         <header class="header" style="background-color: #ffffff">
  202.             <nav class="main_nav"style="height: 96px">
  203.                 <div class="container" style="top: -20px">
  204.                     <div class="row">
  205.                         <div class="col main_nav_col d-flex flex-row align-items-center justify-content-start">
  206.                             <div class="main_nav_container ml-auto" style="margin-right: 1110px;top: 29px;">
  207.                                 <ul class="main_nav_list">
  208.                                     <li class="main_nav_item"><a href="#photos">Photos</a></li>
  209.                                     <li class="main_nav_item"><a href="#dernier-titre">Description</a></li>
  210.                                     <li class="main_nav_item"><a href="#tarifs">Tarifs</a></li>
  211.                                 </ul>
  212.                             </div>
  213.                         </div>
  214.                     </div>
  215.                 </div>
  216.             </nav>
  217.         </header>
  218.     </div> #}
  219.     <!-- Blog -->
  220.     <div class="blog">
  221.         <div class="container">
  222.             <div class="hotel_title_container d-flex flex-lg-row flex-column">
  223.                 <div class="hotel_title_content">
  224.                     <h1 class="hotel_title" style="color: #0093a9;font-size: 34px;font-weight: 700">{{ hotels.name }}</h1>
  225.                     <div class="rating_r rating_r_4 hotel_rating">
  226.                         {% for i in 1..hotels.star %}
  227.                             <img src="{{asset('front/images/etoil.png')}}" class="" alt="...">
  228.                         {% endfor %}
  229.                     </div>
  230.                 </div>
  231.             </div>
  232.             <div class="row">
  233.                 <div class="col-lg-8">
  234.                     <div class="blog_post_container">
  235.                         <div class="hotel_title_container d-flex flex-lg-row flex-column">
  236.                             <div class="hotel_title_content">
  237.                                 <h1 class="hotel_title"></h1>
  238.                                 <div class="hotel_location" style="color: #0093a9"></div>
  239.                             </div>
  240.                         </div>
  241.                         <div class="blog_post" id="photos">
  242.                             <div class="blog_post_image" >
  243.                                 <div class="container mt-5">
  244.                                     <div class="carousel-container position-relative row">
  245.                                         <div id="myCarousel" class="carousel slide" data-ride="carousel">
  246.                                             <div class="carousel-inner">
  247.                                                 {% for img in hotels.imageshotels %}
  248.                                                     <div class="carousel-item {{ loop.first ? 'active' }}">
  249.                                                         <img src="{{ asset('./rusticav/public/uploads/hotels/'~img.name) }}" class="d-block w-100 img-fluid" alt="..." style="height:448px;width: 750px!important;" data-type="image" data-toggle="lightbox" data-gallery="example-gallery">
  250.                                                     </div>
  251.                                                 {% endfor %}
  252.                                             </div>
  253.                                         </div>
  254.                                         <!-- Carousel Navigation -->
  255.                                         <div id="carousel-thumbs" class="carousel slide" data-ride="carousel">
  256.                                             <div class="carousel-inner">
  257.                                                 <div class="carousel-item active">
  258.                                                     <div class="row mx-0" style="display:flex;justify-content: center;align-items: center;">
  259.                                                         {% for img in hotels.imageshotels %}
  260.                                                             <div id="carousel-selector-{{ loop.index0 }}" class="thumb col-4 col-sm-2 px-1 py-2 selected" data-target="#myCarousel" data-slide-to="{{ loop.index0 }}">
  261.                                                                 <img src="{{ asset('./rusticav/public/uploads/hotels/'~img.name) }}" style="width: 100px; height: 65px" class="img-fluid" alt="...">
  262.                                                             </div>
  263.                                                         {% endfor %}
  264.                                                     </div>
  265.                                                 </div>
  266.                                             </div>
  267.                                             <a class="carousel-control-prev" href="#carousel-thumbs" role="button" data-slide="prev">
  268.                                                 <span class="carousel-control-prev-icon" aria-hidden="true"></span>
  269.                                                 <span class="sr-only">Previous</span>
  270.                                             </a>
  271.                                             <a class="carousel-control-next" href="#carousel-thumbs" role="button" data-slide="next">
  272.                                                 <span class="carousel-control-next-icon" aria-hidden="true"></span>
  273.                                                 <span class="sr-only">Next</span>
  274.                                             </a>
  275.                                         </div>
  276.                                     </div> <!-- /row -->
  277.                                 </div> <!-- /container -->
  278.                             </div>
  279.                         </div>
  280.                     </div>
  281.                 </div>
  282.             </div>
  283.             <div class="hotel_info_tags"id="tarifs">
  284.                 <ul class="hotel_icons_list">
  285.                     <li class="hotel_icons_item"><img src="{{ asset('front/images/post.png') }}" alt=""></li>
  286.                     <li class="hotel_icons_item"><img src="{{ asset('front/images/compass.png') }}" alt=""></li>
  287.                     <li class="hotel_icons_item"><img src="{{ asset('front/images/bicycle.png') }}" alt=""></li>
  288.                     <li class="hotel_icons_item"><img src="{{ asset('front/images/sailboat.png') }}" alt=""></li>
  289.                 </ul>
  290.             </div>
  291.         
  292.                         <!-- Dates & Tarifs -->
  293.             <div class="reviews">
  294.                 <div class="reviews_title">Dates & Tarifs</div>
  295.             </div>
  296.             <div class="page-wrapper bg-color-1 p-t-395 p-b-120" style="background: white">
  297.                 <div class="wrapper wrapper--w1070">
  298.                     <div class="filter">
  299.                     <div class="card card-7" style="border: none">
  300.                         <div class="card-body">
  301.                             {{ form_start(form) }}
  302.                                 <div class="input-group input--medium" style="width: 230px;line-height: 17px;border: 1px solid black">
  303.                                     <label class="label" style="color: black;font-weight: 500">Départ</label>
  304.                                     {{ form_widget(form.dateDepart,{'attr':{'class':'input--style-1'}}) }}
  305.                                 </div>
  306.                                 <div class="input-group input--medium" style="width: 230px;line-height: 17px;border: 1px solid black">
  307.                                     <label class="label" style="color: black;font-weight: 500">Arrivé</label>
  308.                                     {{ form_widget(form.dateArrive,{'attr':{'class':'input--style-1'}}) }}
  309.                                 </div>
  310.                                 <div class="input-group input--medium1" style="width: 98px;line-height: 17px;border: 1px solid black">
  311.                                     <label class="label" style="color: black;font-weight: 500">Nuitée</label>
  312.                                     {{ form_widget(form.nombreNuits,{'attr':{'class':'input--style-1'}}) }}
  313.                                 </div>
  314.                                 <div class="row row-space">
  315.                                     <button type="button" class="btn-submit" data-toggle="modal" data-target="#roomModal" style="font-size: 16px;font-weight: 500;border: 1px solid black;background: #FFFFFF;color: black">
  316.                                         Ajouter une chambre
  317.                                     </button>
  318.                                     <!-- Modal -->
  319.                                     <div class="modal fade" id="roomModal" tabindex="-1" role="dialog" aria-labelledby="roomModalLabel" aria-hidden="true">
  320.                                         <span class="modal-dialog modal-dialog-centered" role="document">
  321.                                             <span class="modal-content rounded-0">
  322.                                                 <span class="modal-content" style="width: 85%;margin-top: 131px;margin-left: 233px;">
  323.                                                     <span class="modal-body bg-3">
  324.                                                         <div class="modal-header" style="border-bottom: none">
  325.                                                             <h5 class="modal-title" id="roomModalLabel" style="color: #0093a9;font-size: 22px;margin-left: -30px;font-weight: 700">Chambre et Occupation</h5>
  326.                                                             <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  327.                                                                 <span aria-hidden="true">&times;</span>
  328.                                                             </button>
  329.                                                         </div>
  330.                                                         <ul class="rooms" data-prototype="{{ form_widget(form.rooms.vars.prototype, {'attr': {'style': 'display:contents;color:black;font-size:18px'}})|e }}">
  331.                                                             <div style="display: contents">
  332.                                                                 {% for roomForm in form.rooms %}
  333.                                                                     <li class="row room-item">
  334.                                                                         <span>
  335.                                                                             <label class="input--style-1" style="color: black">Adultes</label>
  336.                                                                             {{ form_widget(roomForm.nbadultes, {'attr': {'class': 'input--style-1', 'style': 'border:1px solid black'}}) }}
  337.                                                                         </span>
  338.                                                                         <span style="margin-right: 10px;"></span>
  339.                                                                         <span>
  340.                                                                             <label class="input--style-1" style="color: black">Enfants</label>
  341.                                                                             {{ form_widget(roomForm.nbfnfants, {'attr': {'class': 'input--style-1', 'style': 'border:1px solid black'}}) }}
  342.                                                                         </span>
  343.                                                                         <span style="margin-right: 10px;"></span>
  344.                                                                         <span>
  345.                                                                             <label class="input--style-1" style="color: black">Age</label>
  346.                                                                             {{ form_row(roomForm.age, {'attr': {'class': 'input--style-1', 'style': 'border:1px solid black'}}) }}
  347.                                                                         </span>
  348.                                                                     </li>
  349.                                                                 {% endfor %}
  350.                                                             </div>
  351.                                                         </ul>
  352.                                                         <div class="modal-footer">
  353.                                                             <button type="button" class="btn btn-primary" id="saveButtonModal" style="color: #FFFFFF;background:#ff9100 ">Valider</button>
  354.                                                         </div>
  355.                                                     </span>
  356.                                                 </span>
  357.                                             </span>
  358.                                         </span>
  359.                                     </div>
  360.                                     <button class="btn-submit"type="submit" style="width: 209px;line-height: 91px;font-weight: 500;border: 1px solid black;background: #0093a9;color: #FFFFFF">Voir disponibilité</button>
  361.                                 </div>
  362.                             {{ form_end(form) }}
  363.                         </div>
  364.                     </div>
  365.                     </div>
  366.                 </div>
  367.                 <div class="container" id="dernier-titre">
  368.                     <div class="table-responsive custom-table-responsive">
  369.                         {% if results %}
  370.                             {% for result in results %}
  371.                                 <table class="table table-bordered">
  372.                                     {% if result.chambre is not null %}
  373.                                         <thead>
  374.                                             <tr>
  375.                                                 <th>Type de chambre</th>
  376.                                                 <th>Occupation</th>
  377.                                                 <th>Type de pension</th>
  378.                                                 <th>Total</th>
  379.                                             </tr>
  380.                                         </thead>
  381.                                     {% endif %}
  382.                                     <tbody>
  383.                                         {% if result is not null %}
  384.                                             {% if result.chambre is not null %}
  385.                                                 {% set somme = result.nbadultes + result.nbfnfants %}
  386.                                                 <tr scope="row">
  387.                                                     <td>
  388.                                                         <form id="chambre-form-{{ loop.index }}" >
  389.                                                             <select name="roomName[]" id="chambre-select-{{ loop.index }}" class="select1">
  390.                                                                 <option value="">Sélectionner</option>
  391.                                                                 {% for cp in result.chambre.pricerooms %}
  392.                                                                     {% if cp.hotelroom.chambre.capacity == somme %}
  393.                                                                         <option data-value="{{ cp.hotelroom.chambre.name }}" data-prix="{{ cp.price }}">{{ cp.hotelroom.chambre.name }}</option>
  394.                                                                     {% endif %}
  395.                                                                 {% endfor %}
  396.                                                             </select>
  397.                                                         </form>
  398.                                                     </td>
  399.                                                     <td>
  400.                                                         {% for i in 1..result.nbadultes %}
  401.                                                             <i class="fa fa-male" aria-hidden="true"></i>
  402.                                                         {% endfor %}
  403.                                                         {% if result.nbfnfants > 0 %}
  404.                                                             {% for i in 1..result.nbfnfants %}
  405.                                                                 <i class="fa fa-child" aria-hidden="true"></i>
  406.                                                             {% endfor %}
  407.                                                         {% endif %}
  408.                                                     </td>
  409.                                                     <td>
  410.                                                         <form id="arrangement-form-{{ loop.index }}">
  411.                                                             <select name="arrangement[]" id="arrangement-select-{{ loop.index }}" class="select2">
  412.                                                                 <option value="">Sélectionner</option>
  413.                                                                 {% for ar in result.chambre.pricearrangements %}
  414.                                                                     <option value="{{ ar.hotelarrangement.arrangement.name }}" data-prix="{{ ar.price }}">{{ ar.hotelarrangement.arrangement.name }}</option>
  415.                                                                 {% endfor %}
  416.                                                             </select>
  417.                                                         </form>
  418.                                                     </td>
  419.                                                     <td>
  420.                                                         <span class="prix-total" data-index="{{ loop.index }}">0</span> TND
  421.                                                     </td>
  422.                                                 </tr>
  423.                                                 <script>
  424.                                                     const chambreSelect{{ loop.index }} = document.getElementById('chambre-select-{{ loop.index }}');
  425.                                                     const arrangementSelect{{ loop.index }} = document.getElementById('arrangement-select-{{ loop.index }}');
  426.                                                     const prixTotalElement{{ loop.index }} = document.querySelector('.prix-total[data-index="{{ loop.index }}"]');
  427.                                                     const nombreNuits{{ loop.index }} = {{ result.nombreNuits }}; // Ajout de la variable pour le nombre de nuits
  428.                                                     
  429.                                                     function updateTotalPrice{{ loop.index }}() {
  430.                                                         const chambrePrix = parseFloat(chambreSelect{{ loop.index }}.options[chambreSelect{{ loop.index }}.selectedIndex].getAttribute('data-prix')) || 0;
  431.                                                         const arrangementPrix = parseFloat(arrangementSelect{{ loop.index }}.options[arrangementSelect{{ loop.index }}.selectedIndex].getAttribute('data-prix')) || 0;
  432.                                                         const totalPrix = (chambrePrix + arrangementPrix) * nombreNuits{{ loop.index }}; // Multiplication par le nombre de nuits
  433.                                                         prixTotalElement{{ loop.index }}.textContent = Math.floor(totalPrix);
  434.                                                         document.getElementById('total-price-{{ loop.index }}').value = Math.floor(totalPrix);
  435.                                                     }
  436.                                                     chambreSelect{{ loop.index }}.addEventListener('change', updateTotalPrice{{ loop.index }});
  437.                                                     arrangementSelect{{ loop.index }}.addEventListener('change', updateTotalPrice{{ loop.index }});
  438.                     
  439.                                                 </script>
  440.                                             {% else %}
  441.                                                 <br>
  442.                                                 <p style="text-align:center;color:black;font-size:16px;font-weight:500;">Désolé, aucune chambre n'est disponible pour les dates sélectionnées.</p>
  443.                                                 <p style="text-align:center;color:black;font-size:16px;font-weight:500;">Veuillez modifier vos dates de séjour ou consulter nos offres spéciales.</p>
  444.                                             {% endif %}
  445.                                         {% endif %}
  446.                                     </tbody>
  447.                                 </table> 
  448.                                 <script>
  449.                                     // Fonction pour mettre à jour le prix total dans le formulaire
  450.                                     function updateTotalPriceInForm{{ loop.index }}(totalPrice) {
  451.                                         document.getElementById('total-price-{{ loop.index }}').value = totalPrice;
  452.                                     }
  453.                                 </script>
  454.                                 
  455.                             {% endfor %}
  456.                             {% if results %}
  457.                             <form id="hidden-form" action="{{ path('reservation',{'id':hotel.id}) }}" method="post">
  458.                                     {% for result in results %}
  459.                                     {% if result.chambre is not null %}
  460.                                         <input type="hidden" name="nbadultes[]" value="{{ result.nbadultes }}">
  461.                                         <input type="hidden" name="nbfnfants[]" value="{{ result.nbfnfants }}">
  462.                                         <!-- Ajoutez des champs cachés pour stocker les sélections -->
  463.                                         <input type="hidden" name="selectedRoom[]" id="selected-room-{{ loop.index }}">
  464.                                         <input type="hidden" name="selectedArrangement[]" id="selected-arrangement-{{ loop.index }}">
  465.                                         <input type="hidden" name="totalPrice[]" value="{{ result.chambre.pricerooms[0].price + result.chambre.pricearrangements[0].price }}" id="total-price-{{ loop.index }}">
  466.                                     {% endif %}{% endfor %}
  467.                                         <button type="submit" style="background: #ff9600;color: white" id="afficher-resultats" class="btn btn-lg">
  468.                                             <i class="fa fa-check"></i> Réserver
  469.                                         </button>
  470.                                     
  471.                                     <div id="formInfoContainer" style="display: none;">
  472.                                         <input type="hidden" name="dateDepart" value="{{ form.dateDepart.vars.data|date('d/m/Y') }}">
  473.                                         <input type="hidden" name="dateArrive" value="{{ form.dateArrive.vars.data|date('d/m/Y') }}">
  474.                                         <input type="hidden" name="nombreNuits" value="{{ form.nombreNuits.vars.data|date('d/m/Y') }}">
  475.                                     </div>
  476.                                 </form>
  477.                                 {% endif %}
  478.                                 
  479.                                 <script>
  480.                                     // Fonction pour copier les sélections dans les champs cachés lors du clic sur le bouton Réserver
  481.                                     function copySelections(index) {
  482.                                         const selectedRoom = document.getElementById('chambre-select-' + index).value;
  483.                                         const selectedArrangement = document.getElementById('arrangement-select-' + index).value;
  484.                                         document.getElementById('selected-room-' + index).value = selectedRoom;
  485.                                         document.getElementById('selected-arrangement-' + index).value = selectedArrangement;
  486.                                     }
  487.                                     // Ajoutez un écouteur d'événements au bouton Réserver pour appeler la fonction de copie des sélections
  488.                                     document.getElementById('afficher-resultats').addEventListener('click', function() {
  489.                                         {% for result in results %}
  490.                                             {% if result.chambre is not null %}
  491.                                                 copySelections({{ loop.index }});
  492.                                             {% endif %}
  493.                                         {% endfor %}
  494.                                     });
  495.                                 </script>
  496.                         
  497.                         {% endif %}
  498.                     </div>
  499.                 </div>
  500.                 {#                                    </div>#}
  501.                 <div class="reviews">
  502.                     <div class="reviews_title" id="dernier-titre">Hébergement</div>
  503.                 </div>
  504.                 <div class="hotel_info_text">
  505.                     {{ hotels.longdesc|raw }}
  506.                 </div>
  507.             </div>
  508.         </div>
  509.     </div>
  510.     </div>
  511.     
  512.     
  513.     <script>
  514.         {% for result in results %}
  515.         const prixTotalElement{{ loop.index }} = document.getElementById('prix-total-{{ loop.index }}');
  516.         document.getElementById('total-price-{{ loop.index }}').value = document.querySelector('.prix-total[data-index="{{ loop.index }}"]').textContent;
  517.         function updateTotalPrice{{ loop.index }}() {
  518.             const chambrePrix = parseFloat(chambreSelect{{ loop.index }}.options[chambreSelect{{ loop.index }}.selectedIndex].getAttribute('data-prix')) || 0;
  519.             const arrangementPrix = parseFloat(arrangementSelect{{ loop.index }}.options[arrangementSelect{{ loop.index }}.selectedIndex].getAttribute('data-prix')) || 0;
  520.             const totalPrix = chambrePrix + arrangementPrix;
  521.             document.getElementById('prix-total-{{ loop.index }}').value = totalPrix;
  522.         }
  523.         chambreSelect{{ loop.index }}.addEventListener('change', updateTotalPrice{{ loop.index }});
  524.         arrangementSelect{{ loop.index }}.addEventListener('change', updateTotalPrice{{ loop.index }});
  525.         {% endfor %}
  526.     </script>
  527.     <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
  528.     <script>
  529.         $(document).ready(function() {
  530.             // Mettre à jour le champ "nombre de nuit" lorsqu'une date d'arrivée est saisie
  531.             $('#{{ form.dateArrive.vars.id }}').change(function() {
  532.                 var dateArrive = new Date($(this).val());
  533.                 var dateDepart = new Date($('#{{ form.dateDepart.vars.id }}').val());
  534.                 if (!isNaN(dateArrive.getTime()) && !isNaN(dateDepart.getTime())) {
  535.                     var diff = Math.ceil((dateArrive - dateDepart) / (1000 * 60 * 60 * 24));
  536.                     $('#{{ form.nombreNuits.vars.id }}').val(diff);
  537.                 }
  538.             });
  539.         });
  540.     </script>
  541.     <script>
  542.         $(document).ready(function () {
  543.             var $collectionHolder = $('ul.rooms');
  544.             $collectionHolder.data('index', $collectionHolder.find(':input').length);
  545.             $collectionHolder.find('li').each(function () {
  546.                 addRemoveButton($(this));
  547.             });
  548.             var $addRoomButton = $('<button type="button" class="add-room" style="color: #0093a9;margin-top: 19px;border: none">Ajouter une chambre</button>');
  549.             var $newLinkLi = $('<li class="row room-item"></li>').append($addRoomButton);
  550.             $collectionHolder.append($newLinkLi);
  551.             $addRoomButton.on('click', function (e) {
  552.                 addRoomForm($collectionHolder, $newLinkLi);
  553.             });
  554. function addRoomForm($collectionHolder, $newLinkLi) {
  555.     var prototype = $collectionHolder.data('prototype');
  556.     var index = $collectionHolder.data('index');
  557.     var newForm = prototype;
  558.     newForm = newForm.replace(/__name__/g, index);
  559.     $collectionHolder.data('index', index + 1);
  560.     var $newFormLi = $('<li class="row room-item"></li>').append(newForm);
  561.     $newFormLi.find('input').each(function () {
  562.         var $input = $(this);
  563.         var name = $input.attr('name');
  564.         var $select = createDropdown(name);
  565.         $input.replaceWith($select);
  566.     });
  567.     var $nbfnfantsSelect = $newFormLi.find('select[name*="[nbfnfants]"]');
  568.     var $ageSelect = $newFormLi.find('select[name*="[age]"]');
  569.     var $ageLabel = $newFormLi.find('label:contains("Age")');
  570.     $ageSelect.hide(); // Masquer le champ d'âge par défaut
  571.     $ageLabel.hide(); // Masquer le label d'âge par défaut
  572.     $nbfnfantsSelect.on('change', function () {
  573.         var nbfnfants = $(this).val() || 0;
  574.         if (nbfnfants > 0) {
  575.             $ageSelect.show(); // Afficher le champ d'âge si le nombre d'enfants est supérieur à zéro
  576.             $ageLabel.show(); // Afficher le label d'âge si le nombre d'enfants est supérieur à zéro
  577.         } else {
  578.             $ageSelect.hide(); // Masquer le champ d'âge si le nombre d'enfants est remis à zéro
  579.             $ageLabel.hide(); // Masquer le label d'âge si le nombre d'enfants est remis à zéro
  580.         }
  581.     });
  582.     $newLinkLi.before($newFormLi);
  583.     addRemoveButton($newFormLi);
  584.     // Ajouter un gestionnaire d'événements pour les nouveaux éléments ajoutés
  585.     $newFormLi.find('.remove-room').on('click', function () {
  586.         $newFormLi.remove();
  587.     });
  588. }
  589. function createDropdown(name) {
  590.     var $select = $('<select class="input--style-1" style="border: 1px solid black" name="' + name + '"></select>');
  591.     for (var i = 0; i <= 18; i++) { // Permettre des âges de 0 à 18 ans
  592.         $select.append('<option value="' + i + '">' + i + '</option>');
  593.     }
  594.     return $select;
  595. }
  596.             function addRemoveButton($formLi) {
  597.                 var $removeRoomButton = $('<button type="button" class="remove-room" style="margin-left: 20px"><i class="fa fa-trash"></i></button>');
  598.                 $formLi.append($removeRoomButton);
  599.                 $removeRoomButton.on('click', function (e) {
  600.                     $formLi.remove();
  601.                 });
  602.             }
  603.             function displayChoices() {
  604.                 var roomValues = [];
  605.                 // Récupérer les valeurs de chaque chambre
  606.                 $('ul.rooms li.row.room-item').each(function () {
  607.                     var nbadultes = $(this).find('select[name*="[nbadultes]"]').val() || 0;
  608.                     var nbfnfants = $(this).find('select[name*="[nbfnfants]"]').val() || 0;
  609.                 
  610.                     roomValues.push({
  611.                         'nbadultes': nbadultes,
  612.                         'nbfnfants': nbfnfants,
  613.                     });
  614.                     // Ajouter d'autres lignes pour d'autres champs de la chambre si nécessaire
  615.                 });
  616.                 // Mettre à jour le contenu de l'élément avec les résultats
  617.                 var resultsContainer = $('#results-container');
  618.                 resultsContainer.empty();
  619.                 if (roomValues.length >=1 ) {
  620.                     // Construire le HTML pour afficher les résultats
  621.                     for (var i = 1; i < roomValues.length; i++) {
  622.                         resultsContainer.append('<p>Room ' + (i) + ': Adults - ' + roomValues[i].nbadultes + ', Children - ' + roomValues[i].nbfnfants  + '</p>');
  623.                         // Ajouter d'autres lignes pour d'autres champs de la chambre si nécessaire
  624.                     }
  625.                 } else {
  626.                     // Afficher un message si aucun résultat n'est trouvé
  627.                     resultsContainer.html('<p>Aucun résultat trouvé.</p>');
  628.                 }
  629.                 //      Masquer la fenêtre modale après avoir affiché les résultats
  630.                 $('#roomModal').modal('hide');
  631.             }
  632.             // Associer la fonction displayChoices au clic sur le bouton "Enregistrer"
  633.             $('#roomModal').on('click', '.btn-primary', function () {
  634.                 displayChoices();
  635.             });
  636.         });
  637.     </script>
  638.     <script>
  639.         $(document).ready(function () {
  640.             // Lorsqu'on clique sur le lien
  641.             $('a[href^="#"]').on('click', function (event) {
  642.                 // Empêcher le comportement par défaut du lien
  643.                 event.preventDefault();
  644.                 // Récupérer l'ID de la cible du lien
  645.                 var target = $(this.hash);
  646.                 // Animer le défilement jusqu'à la cible
  647.                 $('html, body').animate({
  648.                     scrollTop: target.offset().top
  649.                 }, 800); // Le nombre 800 représente la durée de l'animation en millisecondes
  650.             });
  651.         });
  652.     </script>
  653. {#    </div></div></div>#}
  654.         </div>
  655.     </div>
  656. {% endblock %}
  657. {% block javascripts %}
  658.     <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
  659.     <script>
  660.         $('#myCarousel').carousel({
  661.             interval: false
  662.         });
  663.         $('#carousel-thumbs').carousel({
  664.             interval: false
  665.         });
  666.         $('[id^=carousel-selector-]').click(function() {
  667.             var id_selector = $(this).attr('id');
  668.             var id = parseInt( id_selector.substr(id_selector.lastIndexOf('-') + 1) );
  669.             $('#myCarousel').carousel(id);
  670.         });
  671.         // Only display 3 items in nav on mobile.
  672.         if ($(window).width() < 575) {
  673.             $('#carousel-thumbs .row div:nth-child(4)').each(function() {
  674.                 var rowBoundary = $(this);
  675.                 $('<div class="row mx-0">').insertAfter(rowBoundary.parent()).append(rowBoundary.nextAll().addBack());
  676.             });
  677.             $('#carousel-thumbs .carousel-item .row:nth-child(even)').each(function() {
  678.                 var boundary = $(this);
  679.                 $('<div class="carousel-item">').insertAfter(boundary.parent()).append(boundary.nextAll().addBack());
  680.             });
  681.         }
  682.         // Hide slide arrows if too few items.
  683.         if ($('#carousel-thumbs .carousel-item').length < 2) {
  684.             $('#carousel-thumbs [class^=carousel-control-]').remove();
  685.             $('.machine-carousel-container #carousel-thumbs').css('padding','0 5px');
  686.         }
  687.         // when the carousel slides, auto update
  688.         $('#myCarousel').on('slide.bs.carousel', function(e) {
  689.             var id = parseInt( $(e.relatedTarget).attr('data-slide-number') );
  690.             $('[id^=carousel-selector-]').removeClass('selected');
  691.             $('[id=carousel-selector-'+id+']').addClass('selected');
  692.         });
  693.         // when user swipes, go next or previous
  694.         $('#myCarousel').swipe({
  695.             fallbackToMouseEvents: true,
  696.             swipeLeft: function(e) {
  697.                 $('#myCarousel').carousel('next');
  698.             },
  699.             swipeRight: function(e) {
  700.                 $('#myCarousel').carousel('prev');
  701.             },
  702.             allowPageScroll: 'vertical',
  703.             preventDefaultEvents: false,
  704.             threshold: 75
  705.         });
  706.         $('#myCarousel .carousel-item img').on('click', function(e) {
  707.             var src = $(e.target).attr('data-remote');
  708.             if (src) $(this).ekkoLightbox();
  709.         });
  710.     </script>
  711. {% endblock %}