PageSourceSearch

https://www.commune-nointel.fr/wp-content/plugins/hob-formchat-pro/assets/js/hob-map-picker.js?ver=1.29

js commune-nointel.fr collected 2026-10-03 02:46:38 UTC 5,779 bytes, 140 lines download raw bytes

1/* HOB FormChat Pro | (c) 2026 HOB France Services — Groupe HOB */
2(function () {
3  'use strict';
4
5  document.addEventListener('DOMContentLoaded', function () {
6    var wraps = document.querySelectorAll('.hob-fc-map-wrap');
7    if (!wraps.length) return;
8
9    wraps.forEach(function (wrap) {
10      var container = wrap.querySelector('.hob-fc-map-container');
11      if (!container || container.dataset.init) return;
12      container.dataset.init = '1';
13
14      var lat  = parseFloat(wrap.dataset.lat) || 46.603354;
15      var lng  = parseFloat(wrap.dataset.lng) || 1.888334;
16      var zoom = parseInt(wrap.dataset.zoom, 10) || 6;
17      var showSearch = wrap.dataset.search === '1';
18
19      var latInput     = wrap.querySelector('.hob-fc-map-lat');
20      var lngInput     = wrap.querySelector('.hob-fc-map-lng');
21      var addressInput = wrap.querySelector('.hob-fc-map-address');
22      var coordsDisplay = wrap.querySelector('.hob-fc-map-coords-display');
23      var addressDisplay = wrap.querySelector('.hob-fc-map-address-display');
24
25      // Initialize Leaflet map.
26      var map = L.map(container).setView([lat, lng], zoom);
27
28      L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
29        attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',
30        maxZoom: 19
31      }).addTo(map);
32
33      var marker = L.marker([lat, lng], { draggable: true }).addTo(map);
34
35      function updatePosition(latlng, address) {
36        if (latInput) latInput.value = latlng.lat.toFixed(6);
37        if (lngInput) lngInput.value = latlng.lng.toFixed(6);
38        if (coordsDisplay) {
39          coordsDisplay.textContent = latlng.lat.toFixed(5) + ', ' + latlng.lng.toFixed(5);
40        }
41        if (address) {
42          if (addressInput) addressInput.value = address;
43          if (addressDisplay) {
44            addressDisplay.textContent = address;
45            addressDisplay.style.display = 'block';
46          }
47        }
48        // Afficher la zone de résultat.
49        var infoWrap = wrap.querySelector('.hob-fc-map-info');
50        if (infoWrap) infoWrap.style.display = 'flex';
51      }
52
53      function reverseGeocode(latlng) {
54        var url = 'https://nominatim.openstreetmap.org/reverse?format=json&lat='
55                + latlng.lat + '&lon=' + latlng.lng + '&zoom=18&addressdetails=1';
56        fetch(url, { headers: { 'Accept-Language': document.documentElement.lang || 'fr' } })
57          .then(function (r) { return r.json(); })
58          .then(function (data) {
59            if (data && data.display_name) {
60              updatePosition(latlng, data.display_name);
61            }
62          })
63          .catch(function () { /* silent */ });
64      }
65
66      // Click on map.
67      map.on('click', function (e) {
68        marker.setLatLng(e.latlng);
69        updatePosition(e.latlng, '');
70        reverseGeocode(e.latlng);
71      });
72
73      // Drag marker.
74      marker.on('dragend', function () {
75        var pos = marker.getLatLng();
76        updatePosition(pos, '');
77        reverseGeocode(pos);
78      });
79
80      // Search functionality.
81      if (showSearch) {
82        var searchInput   = wrap.querySelector('.hob-fc-map-search-input');
83        var searchResults = wrap.querySelector('.hob-fc-map-search-results');
84        var searchTimeout = null;
85
86        if (searchInput && searchResults) {
87          searchInput.addEventListener('input', function () {
88            clearTimeout(searchTimeout);
89            var q = searchInput.value.trim();
90            if (q.length < 3) {
91              searchResults.innerHTML = '';
92              searchResults.style.display = 'none';
93              return;
94            }
95            searchTimeout = setTimeout(function () {
96              var url = 'https://nominatim.openstreetmap.org/search?format=json&q='
97                      + encodeURIComponent(q) + '&limit=5&addressdetails=1';
98              fetch(url, { headers: { 'Accept-Language': document.documentElement.lang || 'fr' } })
99                .then(function (r) { return r.json(); })
100                .then(function (results) {
101                  searchResults.innerHTML = '';
102                  if (!results.length) {
103                    searchResults.style.display = 'none';
104                    return;
105                  }
106                  results.forEach(function (item) {
107                    var li = document.createElement('li');
108                    li.className = 'hob-fc-map-search-item';
109                    li.textContent = item.display_name;
110                    li.addEventListener('click', function () {
111                      var pos = L.latLng(parseFloat(item.lat), parseFloat(item.lon));
112                      map.setView(pos, 15);
113                      marker.setLatLng(pos);
114                      updatePosition(pos, item.display_name);
115                      searchInput.value = item.display_name;
116                      searchResults.innerHTML = '';
117                      searchResults.style.display = 'none';
118                    });
119                    searchResults.appendChild(li);
120                  });
121                  searchResults.style.display = 'block';
122                })
123                .catch(function () { searchResults.style.display = 'none'; });
124            }, 350);
125          });
126
127          // Close on click outside.
128          document.addEventListener('click', function (e) {
129            if (!wrap.contains(e.target)) {
130              searchResults.style.display = 'none';
131            }
132          });
133        }
134      }
135
136      // Fix Leaflet tile rendering when map is in a hidden container.
137      setTimeout(function () { map.invalidateSize(); }, 200);
138    });
139  });
140})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.