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: '© <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.