templates/front/acheter/index.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block title %} - Annonces immobilières{% endblock %}
  3. {% block meta_description %}Trouvez votre futur nid douillet en Bretagne. Maison, appartement, bien de prestige et terrain sont mis en valeur pour vous aider dans votre choix{% endblock %}
  4. {% block metas %}
  5.     {% if  app.request.attributes.get('_route')  in ['acheter_estate', 'commerces_estate'] %}
  6.         <meta property="og:locale" content="fr_FR" />
  7.         <meta property="og:type" content="article" />
  8.         <meta property="og:title" content="Annonce Sublimons - {{ estate.libelle|capitalize }}" />
  9.         <meta property="og:description" content="{{ estate.descriptifCourt|striptags }}" />
  10.         <meta property="og:url" content="{{ absolute_url(path( 'acheter_estate' , {refannonce:estate.refannonce})) }}/" />
  11.         <meta property="og:site_name" content="Sublimons" />
  12.         <meta property="article:publisher" content="https://www.facebook.com/sublimons" />
  13.         <meta property="og:image" content="{{ estate.cover|imagine_filter('stream_estate_share') }}" />
  14.         <meta property="og:image:secure_url" content="{{ estate.cover|imagine_filter('stream_estate_large') }}" />
  15.         <meta property="og:image:width" content="1200" />
  16.         <meta property="og:image:height" content="630" />
  17.         <meta name="twitter:card" content="summary" />
  18.         <meta name="twitter:description" content="{{ estate.descriptifCourt }}" />
  19.         <meta name="twitter:title" content="Annonce Sublimons - {{ estate.libelle|capitalize }}" />
  20.         <meta name="twitter:site" content="@Sublimonsimmo" />
  21.         <meta name="twitter:image" content="{{ estate.cover|imagine_filter('stream_estate_share') }}" />
  22.         <meta name="twitter:creator" content="@Sublimonsimmo" />
  23.     {% endif %}
  24. {% endblock %}
  25. {% block  header_bottom %}
  26.     <div id="header_bottom" class="container-fluid d-none d-lg-block">
  27.         {{ include('front/acheter/_filter.html.twig') }}
  28.     </div>
  29.     <div id="header_bottom_mobile" class="bg-dark border-top border-white container-fluid d-lg-none  text-center p-2">
  30.         <button id="btn_open_search" class="btn btn-primary btn-sm flex-grow-1"><i class="icon-search"></i> Rechercher</button>
  31.         <button class="btn_save_search btn btn-primary btn-sm mx-0 flex-grow-1"><i class="icon-floppy"></i> Sauvegarder</button>
  32.         {% include 'front/acheter/_sort.html.twig' with{'context': 'select', 'class': 'btn btn-primary btn-sm flex-grow-1', sort_by: datas.sort_by} %}
  33.     </div>
  34.     <!-- Témoin de chargement-->
  35.     <div id="loader">    
  36.         <div class="overlay">
  37.             <div class="loader"></div>
  38.         </div>
  39.     </div>
  40. {% endblock %}
  41. {% block content %}
  42.     <section id="estates" class="container-fluid">
  43.         <div class="row">
  44.             {% if with_map %}
  45.             <div class="col-lg-6 p-0 d-none d-lg-block ">
  46.                 <div class="map_full bg-light">    
  47.                     <div id="estates_map" class="map_container"></div>
  48.                 </div>
  49.             </div>
  50.             <div id="list_sidebar" class="with_map col-lg-6 px-0">
  51.             {% else %}
  52.             <div id="list_sidebar" class="col-lg-12 px-0">
  53.             {% endif %}
  54.                 <div class="p-3 p-lg-4 px-xxl-5 ">
  55.                     <div class="d-none d-lg-block">
  56.                         <div class="d-flex justify-content-between pl-3 pr-0 mb-2">
  57.                             <div  style="visibility: hidden;"><span id="visible_estates"></span>/<span id="total_estates"></span> résultats</div>
  58.                             <div id="estastes_sort">Trier : {% include 'front/acheter/_sort.html.twig' with {'context': 'select', 'class': 'select-unstyle', sort_by: datas.sort_by} %}</div>
  59.                         </div>
  60.                     </div>
  61.                     <div id="estates_container" class="row align-items-stretch"></div>
  62.                     <div id="no_estate" class="banner_no_content banner_container text-white col-md-6 col-lg-12 col-xl-9 mx-auto" style="display:none;">
  63.                         <div class="bloc_txt_image">
  64.                             <div class="bg_image" style="background-image: url(/assets/media/acheter/no_content_L.jpg);"></div>
  65.                             <div class="overlay"></div>
  66.                             <div class="content py-5 ">
  67.                                 <div class="mt-5 px-4 py-5 mt-xl-0  d-flex align-items-center  text-center">
  68.                                     <div class="pt-5">
  69.                                         <h4 class="mb-2">Aucun bien ne correspond à votre recherche</h4>
  70.                                         <p>Contactez le conseiller proche de chez vous</p>
  71.                                     </div>
  72.                                 </div>
  73.                             </div>
  74.                             <div class="btn_container">
  75.                                 <a class="btn-horn" href="{{ path( 'agents' ) }}" target="_blank"><span>Je contacte !</span></a>
  76.                             </div>
  77.                         </div>
  78.                     </div>
  79.                 </div>
  80.             </div>
  81.         </div>
  82.     </section>
  83.     <div id="contactForm_source" style="display: none;">{{ render(controller('App\\Controller\\Front\\MessageController::contactForm', { 'context': 'agent' , 'display' : 'agent_modal'}))  }}</div>
  84.     {{ source('front/acheter/estates-template.html') }}
  85.     {{ source('front/acheter/estate-infobox-template.html') }}
  86.     {{ source('front/acheter/modal-template.html') }}
  87.     {{ include('front/acheter/modal-save_search.html.twig') }}  
  88. {% endblock %}
  89. {% block footer %}
  90. {% endblock %}
  91. {% block stylesheets %}
  92.     {{ parent() }}
  93.     <link rel="stylesheet" href="{{ asset('assets/vendor/OwlCarousel2-2.3.4/dist/assets/owl.carousel.min.css') }}"/>
  94.     <link rel="stylesheet" href="{{ asset('assets/vendor/OwlCarousel2-2.3.4/dist/assets/owl.theme.default.min.css') }}"/>
  95.     <link rel="stylesheet" href="{{ asset('assets/vendor/bootstrap-4-master/build/css/tempusdominus-bootstrap-4.min.css') }}"/>
  96.     <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
  97.     {# <link rel="stylesheet" href="{{ asset('assets/vendor/leaflet-control-geocoder/Control.Geocoder.css') }}"/> #}
  98.     <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/tomik23/autocomplete@1.6.8/dist/css/autocomplete.min.css"/>
  99.     <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css" />
  100.     <link rel="stylesheet" href="{{ asset('assets/css/dpe_ges.css') }}"/>
  101. {% endblock %}
  102. {% block javascripts %}
  103.     {{ parent() }}
  104. {# <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script> #}
  105.     <script src="{{ asset('bundles/fosjsrouting/js/router.min.js') }}"></script>
  106.     <script src="{{ path('fos_js_routing_js', { callback: 'fos.Router.setData' }) }}"></script>
  107.     <script src="{{ asset('assets/vendor/OwlCarousel2-2.3.4/dist/owl.carousel.min.js') }}"></script>
  108.     <script src="https://cdn.jsdelivr.net/npm/lazyload@2.0.0-rc.2/lazyload.js"></script>
  109.     <script src="{{ asset('assets/vendor/swag.min.js') }}"></script>
  110.     <script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>
  111.     <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
  112.     <script src="https://leaflet.github.io/Leaflet.markercluster/dist/leaflet.markercluster-src.js"></script>
  113.     <script src="{{ asset('assets/vendor/Leaflet.SmoothMarkerBouncing.js') }}"></script>
  114.     <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous"></script>
  115.     <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/locale/fr.min.js" integrity="sha512-RAt2+PIRwJiyjWpzvvhKAG2LEdPpQhTgWfbEkFDCo8wC4rFYh5GQzJBVIFDswwaEDEYX16GEE/4fpeDNr7OIZw==" crossorigin="anonymous"></script>
  116.     <script src="{{ asset('assets/vendor/bootstrap-4-master/build/js/tempusdominus-bootstrap-4.js') }}"></script>
  117.     <script src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>
  118.     <script src="{{ asset('assets/vendor/jquery.serialize-object.min.js') }}"></script>
  119.     <script src="{{ asset('assets/js/autocomplete.js') }}"></script>
  120.     <script src="{{ asset('assets/js/base_map.js?v1.0') }}"></script>
  121.     <script src="{{ asset('assets/js/estates_map.js?v1.3') }}"></script>
  122.     <script src="{{ asset('assets/js/rrose.js') }}"></script>
  123.     <script src="{{ asset('assets/js/auto_complete_geosearch.js') }}"></script>
  124.     <script>
  125.         var current_page = '{{ current_route }}'; 
  126.         var current_route = Routing.generate('{{ current_route }}'); 
  127.         var datas  = {{ datas|json_encode()|raw }};
  128.         var banners  = {{ banners|json_encode()|raw }};
  129.         var col_class  = datas.col_class;
  130.         var with_map  = {{ with_map }};
  131.         var with_carrousel  = {{ with_carrousel }};
  132.         var current_banner = 0;
  133.         var next_estates = {{ datas.next }};
  134.         // console.log(datas.estates);
  135.         var source_estate;
  136.         var template_estate;
  137.         var source_btn_next;
  138.         var template_btn_next;
  139.         var source_infobox;
  140.         var template_infobox;
  141.         var source_modal;
  142.         var template_modal;
  143.         var source_banner;
  144.         var template_banner;
  145.         jQuery(document).ready(function(){ 
  146.             initHandlebars();
  147.             source_estates   = $("#estates-template").html();
  148.             template_estates  = Handlebars.compile(source_estates);
  149.             source_btn_next   = $("#btn_next-template").html();
  150.             template_btn_next  = Handlebars.compile(source_btn_next);
  151.             source_infobox   = $("#infobox-template").html();
  152.             template_infobox  = Handlebars.compile(source_infobox);
  153.             source_modal   = $("#modal-template").html();
  154.             template_modal  = Handlebars.compile(source_modal);
  155.             source_banner   = $("#banner-template").html();
  156.             template_banner  = Handlebars.compile(source_banner);
  157.             //Initialisation de la sauvegarde des recherche
  158.             if($('#search_form').length > 0){
  159.                 initSaveSearchForm();
  160.             }
  161.             
  162.             //Ouverture par url
  163.             var parts = window.location.pathname.split('/');
  164.             if( parts.length == 3 ) {
  165.                 var refannonce = parts[2];
  166.                 var estate = datas.estates.find(estate => String(estate.refannonce) === String(refannonce));
  167.                 if( estate === undefined){ //ajax
  168.                     getEstate(refannonce);
  169.                 }
  170.                 else{
  171.                     displayEstate(estate); 
  172.                 }
  173.             }
  174.             
  175.             if(with_map){
  176.                 setMap( 'estates_map', 9, 7, 16 );
  177.                 geoSearch('geosearch', map);
  178.             }
  179.             else{
  180.                 geoSearch('geosearch', false);
  181.             }
  182.             //gestion du filtre
  183.             $('#filter form').submit(function(e){
  184.                 e.preventDefault();
  185.             });
  186.             //Filtre à zero
  187.             $('#filter form').trigger("reset");
  188.             //Tri
  189.             $(".sort_estate").change("change", function(){
  190.                 $('#filter form #sort_by').val($(this).val());
  191.                 searchEstates( 0 , 'filter');
  192.             });
  193.          $('.dropdown-item').click(function(e) {
  194.                 e.preventDefault(); // empêcher le lien de naviguer
  195.                 var value = $(this).data('value'); // nouvelle valeur
  196.                 var label = $(this).text();        // texte à afficher
  197.                 // Mettre à jour le champ caché
  198.                 $('#sort_by').val(value);
  199.                 $('#filter form #sort_by').val(value);
  200.                 // Mettre à jour le texte du bouton
  201.                 $('#dropdownSort').text(label);
  202.                 // Mettre à jour l'option active
  203.                 $('.dropdown-item').removeClass('active text-white bg-primary');
  204.                 $(this).addClass('active text-white bg-primary');
  205.             });
  206.             //Ajout des parametres d'url dans le filtre ---------------------------------------------------------
  207.             //Ajout des parametres d'url dans le filtre
  208.             // const queryString = window.location.search;
  209.             // const urlParams = new URLSearchParams(window.location);
  210.             const url = new URL(window.location);
  211.             const urlParams = url.searchParams;
  212.             $('#estate_filter_nue_propriete').val(0);
  213.             $('#estate_filter_neuf').val(0);
  214.             if(urlParams.size > 0){
  215.                 if(urlParams.has('type')){
  216.                     var typebien = urlParams.get('type'); 
  217.                     var checkbox = $('#estate_filter_typebien').find(':checkbox[value="'+typebien+'"]');
  218.                     checkbox.prop("checked","true");
  219.                 }
  220.                 else if(urlParams.has('nue_propriete')){
  221.                     $('#estate_filter_nue_propriete').val(urlParams.get('nue_propriete'));
  222.                 }
  223.                 else if(urlParams.has('neuf')){
  224.                     $('#estate_filter_neuf').val(urlParams.get('neuf'));
  225.                 }
  226.                 else if(urlParams.has('autres')){
  227.                     var not_types = ['maison/villa', 'appartement', 'terrain'];
  228.     
  229.                     $('#estate_filter_typebien input:checkbox').each(function(){
  230.                         if($.inArray($(this).val(), not_types) == -1){
  231.                             $(this).prop("checked","true");
  232.                         }
  233.                     });
  234.                     
  235.                 }
  236.             }
  237.             
  238.             $("#filter [data-toggle=popover]").popover({
  239.                 // trigger: 'focus',
  240.                 customClass: $("#filter [data-toggle=popover]").data('popover_class'),
  241.                 html: true, 
  242.                 sanitize: false,
  243.                 content: function() {
  244.                     return $(this).next().html();
  245.                 }
  246.             });
  247.             //fermeture de tous les popover avant l'ouverture 
  248.             $('#filter [data-toggle=popover]').on('show.bs.popover', function (event) {
  249.                 $('#filter [data-toggle=popover]').popover('hide');
  250.             });
  251.             //synchro avec les input du filtre 
  252.             $('#filter [data-toggle=popover]').on('inserted.bs.popover', function (event) {
  253.                 var button =  $(event.target)
  254.                 var popover_source = button.next();
  255.                 // Affichage des valeurs de la source cachée
  256.                 //input text
  257.                 popover_source.find('input[type=text]').each(function(){
  258.                     $('.popover').find('#'+$(this).attr("id")).val( $(this).val() );
  259.                 });
  260.                 //check radio
  261.                 popover_source.find('input[type=radio]').each(function(){
  262.                     $('.popover').find('#'+$(this).attr("id")).prop('checked', $(this).is(':checked'));
  263.                 });
  264.                 //check checkbox
  265.                 popover_source.find('input[type=checkbox]').each(function(){
  266.                     $('.popover').find('#'+$(this).attr("id")).prop('checked', $(this).is(':checked'));
  267.                 });
  268.                 //survol des checkbox_icone
  269.                 $('.popover').find('[data-toggle="tooltip"]').tooltip();
  270.                 // A la saisie on synchronise les champs -----------------------------------------
  271.                 // input text
  272.                 $('.popover input[type=text]').change(function() {
  273.                     popover_source.find('#'+$(this).attr("id")).val( $(this).val() ).trigger('change');
  274.                 });
  275.                 //input radio in popover
  276.                 $('.popover input[type=radio]').change(function() {
  277.                     popover_source.find('#'+$(this).attr("id")).prop('checked', $(this).is(':checked'));
  278.                     popover_source.find('#'+$(this).attr("id")).trigger('change');
  279.                 });
  280.                 //input radio in popover
  281.                 $('.popover input[type=checkbox]').change(function() {
  282.                     popover_source.find('#'+$(this).attr("id")).prop('checked', $(this).is(':checked'));
  283.                     popover_source.find('#'+$(this).attr("id")).trigger('change');
  284.                 });
  285.                 //input radio in source : marche à l'envers à cause de l'id
  286.                 popover_source.find('input[type=radio]').change(function() {
  287.                     $('.popover').find('#'+$(this).attr("id")).prop('checked', $(this).is(':checked'));
  288.                    //pour le statut on change le texte du bouton
  289.                     // if($(this).attr('name') == "estate_filter[statut]"){
  290.                     //     changeButtonStatut($(this).next().text());
  291.                     // }
  292.                 });
  293.                 //input checkbox : : marche à l'envers à cause de l'id
  294.                 popover_source.find('input[type=checkbox]').change(function() {
  295.                     $('.popover').find('#'+$(this).attr("id")).prop('checked', $(this).is(':checked'));
  296.                 });
  297.                 //range_prices click
  298.                 $('.popover #range_prices a.price_min').click( function(e) {
  299.                     e.preventDefault();
  300.                     $('.popover #estate_filter_prix_left_number').val($(this).data('price')).trigger('change');
  301.                 });
  302.                 $('.popover #range_prices a.price_max').click( function(e) {
  303.                     e.preventDefault();
  304.                     $('.popover #estate_filter_prix_right_number').val($(this).data('price')).trigger('change');
  305.                 });
  306.                 //
  307.                 $('.popover .btn_apply').click( function(e) {
  308.                     e.preventDefault();
  309.                     changeButton(true); 
  310.                     button.popover('hide');
  311.                     searchEstates( 0 , 'filter');
  312.                 });
  313.                 $('.popover .btn_cancel').click( function(e) {
  314.                     e.preventDefault();
  315.                        
  316.                     $('.popover').find('input[type=text]').each(function(){
  317.                         $(this).val('').trigger('change');
  318.                     });
  319.                     $('.popover').find('input[type=checkbox]').each(function(){
  320.                         $(this).prop('checked', false).trigger('change');
  321.                     });                    
  322.                     changeButton(true);
  323.                     searchEstates( 0 , 'filter');
  324.                 });
  325.             });
  326.             $('.btn_reset').click( function(e) {
  327.                 e.preventDefault();
  328.                 $('#filter form').trigger("reset");
  329.                 $('#estate_filter_geo_name').val('');
  330.                 $('#estate_filter_geo_bbox').val('');
  331.                 $('#estate_filter_geo_position').val('');
  332.                 changeButton(true);
  333.                 searchEstates( 0 , 'filter');
  334.                 // map.flyTo([47.803644, -2.416665], 16,{animate: true,duration: 1.5 });//Saint Marcel
  335.                  map.setView([47.803644, -2.416665], 9);/*/Saint Marcel*/
  336.             });
  337.             //Modale  save search
  338.             $('.btn_save_search').click( function(e) {
  339.                 e.preventDefault();
  340.                 //Initialisation de la saugarde des recherche
  341.                 displaySaveSearchModal();
  342.             });
  343.             $('#btn_open_search').click( function(e) {
  344.                 $('#header_bottom').removeClass('d-none');
  345.                 $('#header_bottom').addClass('full_height');
  346.                 // var H = $(document).height() - $('#header_top').height();
  347.                 // $('#header_bottom').height(H);
  348.                 $('#content').addClass('d-none');
  349.                 $('#header_bottom_mobile').hide();
  350.                 // window.scroll(0, 0);
  351.             });
  352.             $('#btn_close_search').click( function(e) {
  353.                 closeMobileSearch();
  354.             });
  355.             
  356.             $('#btn_load_search').click( function(e) {
  357.                 searchEstates( 0 , 'filter');
  358.             });
  359.             //Encien code
  360.             // $('#filter input').change(function() {
  361.             //     var has_btn_apply = $(this).parents('.popover_content').find('.btn_apply').length;
  362.             //     if(has_btn_apply == 0 && $(this).attr('id') != 'geosearch'){
  363.             //         changeButton(false);  
  364.             //         if(!isMobile() ){
  365.             //             searchEstates( 0 , 'filter');
  366.             //         }
  367.             //     }
  368.             // });
  369.             //  nouveau code ------------------------------------------------------------------------------------------
  370.                 // Fix Safari : empêche les faux "blur" et déclenchements change
  371.                 $('#filter input[type="text"]').on('focus', function (e) {
  372.                     e.stopPropagation();
  373.                     $(this).data('old-value', $(this).val());
  374.                 });
  375.                 // Pour les champs texte : Safari iOS bug avec change.  Émulation  de "change"   → blur + changement de valeur
  376.                 $('#filter input[type="text"]').on('blur', function () {
  377.                     var oldValue = $(this).data('old-value');
  378.                     var newValue = $(this).val();
  379.                     if (oldValue !== newValue) {
  380.                         handleFilterInput($(this));  // Comme un vrai "change"
  381.                     }
  382.                 });
  383.                 // Pour tous les autres inputs
  384.                 $('#filter input:not([type="text"])').on('change', function () {
  385.                     handleFilterInput($(this));
  386.                 });
  387.             // fin du nouveau code ------------------------------------------------------------------------------------------
  388.             $('#contact_form').trigger("reset");
  389.             //création du cookie
  390.             var params = $('#filter form').serialize();
  391.             createCookie('sublimons_search_save' , params, 1, current_route );
  392.             //assignation du filtre si il existe ---------------------------------------------------------
  393.             var sublimons_search_save = readCookie('sublimons_search_save');
  394.             if(sublimons_search_save != null && false){
  395.                 // console.log('FILTRE');
  396.                 $('#filter form').deserialize(sublimons_search_save);
  397.                 // console.log($('#filter form').serializeArray());
  398.                 //lance la recherche
  399.                 changeButton(true);
  400.                 searchEstates( 0 , 'filter');
  401.                 //si il existe une localisation 
  402.                 var geo_name = $('#estate_filter_geo_name').val();
  403.                 var geo_bbox = $('#estate_filter_geo_bbox').val();
  404.                 if( geo_name.length > 0 && geo_bbox.length > 0){
  405.                     $('#geosearch').val(geo_name);                        
  406.                     geo_bbox =  JSON.parse(geo_bbox);
  407.                     bbox = [[geo_bbox[3], geo_bbox[2]],[geo_bbox[1], geo_bbox[0]]];
  408.                     if(with_map){ 
  409.                         map.fitBounds( bbox, {padding: [20, 20], maxzoom: 16});
  410.                     }
  411.                 }
  412.             }
  413.             else{
  414.                 // console.log('DIRECT');
  415.                 displayEstates( datas , 'init');
  416.             }
  417.             //deplacement de la map
  418.             if(with_map){    
  419.                 map.on('moveend', function(e) {
  420.                     setTimeout( getVisibleClusters, 500);
  421.                 });
  422.             }
  423.         });
  424. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  425.         function handleFilterInput($input) {
  426.             var has_btn_apply = $input.parents('.popover_content').find('.btn_apply').length;
  427.             if (has_btn_apply == 0 && $input.attr('id') !== 'geosearch') {
  428.                 changeButton(false);
  429.                 if (!isMobile()) {
  430.                     searchEstates(0, 'filter');
  431.                 }
  432.             }
  433.         }
  434.         function closeMobileSearch() {
  435.             if(isMobile() &&  $('#header_bottom').is(":visible")){
  436.                 $('#header_bottom').removeClass('full_height');
  437.                 $('#header_bottom').addClass('d-none');
  438.                 $('#content').removeClass('d-none');
  439.                 $('#header_bottom_mobile').show();
  440.             }
  441.         }
  442.         function changeButton(with_apply) {
  443.             console.log("CHANGE " + with_apply);
  444.             //Statut 
  445.             var statut_is_checked = $('#estate_filter_statut').find('input:checked');
  446.             var label = statut_is_checked.next("label").text();   
  447.             $('#btn_estate_filter_statut').text(label);
  448.               if(label == "Vendu"){
  449.                 $('#btn_estate_filter_statut').removeClass('btn-{{theme_class }}').addClass('btn-danger');
  450.                     //on vide les champs prix
  451.                     $('#estate_filter_prix input').val('');
  452.                     //on desactive le bouton prox
  453.                     $('#btn_estate_filter_prix').prop('disabled', true);
  454.             }
  455.             else{
  456.                 $('#btn_estate_filter_statut').removeClass('btn-danger').addClass('btn-{{theme_class }}');
  457.                 //on active le bouton prix
  458.                 $('#btn_estate_filter_prix').prop('disabled', false );
  459.             }  
  460.             //Type de bien 
  461.             var typebien_is_checked = $('#estate_filter_typebien').find('input:checked').length;
  462.             var sous_type_is_checked = $('#estate_filter_sous_type').find('input:checked').length;
  463.             if(typebien_is_checked > 0 || sous_type_is_checked){
  464.                 $("#btn_estate_filter_typebien") .removeClass('btn-outline-{{theme_class }}').addClass('btn-{{theme_class }}');  
  465.             }
  466.             else{
  467.                 $("#btn_estate_filter_typebien") .removeClass('btn-{{theme_class }}').addClass('btn-outline-{{theme_class }}');  
  468.             }
  469.             //Nombre de chambre 
  470.             var nbchambres_is_checked = $('#estate_filter_nbchambres').find('input:checked:not(#estate_filter_nbchambres_0)').length ;
  471.             if(nbchambres_is_checked> 0 ){
  472.                 $("#btn_estate_filter_nbchambres") .removeClass('btn-outline-{{theme_class }}').addClass('btn-{{theme_class }}');  
  473.             }
  474.             else{
  475.                 $("#btn_estate_filter_nbchambres") .removeClass('btn-{{theme_class }}').addClass('btn-outline-{{theme_class }}');  
  476.             }
  477.             if(with_apply == true){
  478.                 //Prix
  479.                 var prix_is_not_empty =  0;   
  480.                 $("#filter #estate_filter_prix input").each(function(){
  481.                     if($(this).val() != ''){
  482.                         prix_is_not_empty++;
  483.                     }
  484.                 });
  485.                 if( prix_is_not_empty > 0 ){
  486.                     $("#btn_estate_filter_prix") .removeClass('btn-outline-{{theme_class }}').addClass('btn-{{theme_class }}');  
  487.                 }
  488.                 else{
  489.                     $("#btn_estate_filter_prix") .removeClass('btn-{{theme_class }}').addClass('btn-outline-{{theme_class }}');  
  490.                 }
  491.                 // + de critères
  492.                 var more_text_is_not_empty =  0;   
  493.                 $("#filter #more_text input").each(function(){
  494.                    if($(this).val() != ''){
  495.                     more_text_is_not_empty++;
  496.                    }
  497.                 });
  498.                 var more_picto_is_checked = $('#more_picto').find('input:checked').length;
  499.                 if( more_text_is_not_empty > 0 ||  more_picto_is_checked > 0){
  500.                    $("#btn_more") .removeClass('btn-outline-{{theme_class }}').addClass('btn-{{theme_class }}');  
  501.                 }
  502.                 else{
  503.                     $("#btn_more") .removeClass('btn-{{theme_class }}').addClass('btn-outline-{{theme_class }}');  
  504.                 }
  505.             }
  506.         }
  507.         function centerMe_(e) {
  508.             e.target.openOn(map);
  509.             return;
  510.             //https://github.com/erictheise/rrose
  511.             //http://jsfiddle.net/asleepwalker/6m81vtad/
  512.             //http://erictheise.com/rrose/
  513.             var marker = e.target;
  514.             var pixelPosition = map.latLngToLayerPoint(marker.getLatLng());
  515.             var marker_rose = new L.Rrose({ offset: new L.Point(0, 0), closeButton: true, autoPan: false})
  516.             .setContent(template_infobox(marker.location))
  517.             .setLatLng(e.target.getLatLng())
  518.             .openOn(map);
  519.             return;
  520.             var element = document.getElementById(marker.slug);
  521.             element.scrollIntoView({behavior: "smooth", block: "center"});
  522.             map.setView(e.target.getLatLng());
  523.             marker.setBouncingOptions(bouncing_options);
  524.             marker.bounce();
  525.         }
  526.         function centerMe(e) {
  527.             var marker = e.target;
  528.             //Positionne la liste des biens sur le marker cliqué
  529.             var element = document.getElementById(marker.slug);
  530.             element.scrollIntoView({behavior: "smooth", block: "center"});
  531.             //centre le marker au milieu de la carte
  532.             // map.setView(e.target.getLatLng());
  533.             //marker.setBouncingOptions(bouncing_options);
  534.             marker.bounce();
  535.             marker.getPopup().on('remove', function() {
  536.                 marker.stopBouncing(); 
  537.             });
  538.         }
  539.         function geoSearchOnSearch(map) {
  540.             map.closePopup();
  541.         }
  542.         
  543.         function geoSearchOnSubmit(map, object ) {
  544.             // closeMobileSearch();
  545.             if(map != false){
  546.                 map.closePopup();
  547.             }
  548.             var geo_name = $('#geosearch').val();
  549.             var geo_bbox = JSON.stringify(object.bbox);
  550.             var geo_position = JSON.stringify(object.geometry.coordinates);
  551.             $('#estate_filter_geo_name').val(geo_name);
  552.             $('#estate_filter_geo_bbox').val(geo_bbox);
  553.             $('#estate_filter_geo_position').val(geo_position);
  554.             console.log(geo_position);
  555.             searchEstates( 0 , 'filter');
  556.         }
  557.         function geoSearchOnReset(map, element) {
  558.             $('#estate_filter_geo_name').val('');
  559.             $('#estate_filter_geo_bbox').val('');
  560.             $('#estate_filter_geo_position').val('');
  561.             searchEstates( 0 , 'filter');
  562.             if(map != false){
  563.                 map.setView([47.803644, -2.416665], 8); //Saint Marcel
  564.             }
  565.         }    
  566.         </script>
  567. {% endblock %}