Ada
Apatin
Bačka Palanka
Bački Petrovac
Bačka Topola
Bajina Bašta
Banja Koviljača
Betschej
Belgrad
Parken
Kartenzahlung
Cortex Labs
Primed Bio-Apotheke
Vojvode Stepe 120, Voždovac
Primed Bio-Apotheke
Vojvode Stepe 120, Voždovac
Parken
Kartenzahlung
Cortex Labs
Primed Bio-Apotheke II
Jurija Gagarina 151G Lokal 2, Novi Beograd
Jurija Gagarina 151G Lokal 2, Novi Beograd
Parken
Kartenzahlung
Gesunde Lebensmittel Kilo&gram
Jurija Gagarina 231, Lokal 117
Jurija Gagarina 231, Lokal 117
Parken
Kartenzahlung
Bio hrana Bojana
Živka Karabiberovića 3, Lokal 29.
Markt Đeram
Živka Karabiberovića 3, Lokal 29.
Markt Đeram
Parken
Kartenzahlung
Pr trgovinska radnja Đurđevak BG94
Ščerbinova 6, Banovo Brdo
Ščerbinova 6, Banovo Brdo
Parken
Kartenzahlung
Pr trgovinska radnja Đurđevak BG94
Marka Oreškovića 27, Zvezdara
Marka Oreškovića 27, Zvezdara
Parken
Kartenzahlung
Pr trgovinska radnja Đurđevak BG94
Bulevar Kralja Aleksandra 123, Zvezdara
Bulevar Kralja Aleksandra 123, Zvezdara
Bogatić
Bor
Parken
Kartenzahlung
Ecke für gesunde Ernährung Bliznakinje B&B
Moše Pijade 60/2
Brus
Bujanovac
Tschatschak
Futog
Gornji Milanovac
Ivanjica
Inđija
Jagodina
Kanjiža
Kikinda
Kljajićevo
Kovin
Kostolac
Kragujevac
Parken
Kartenzahlung
Ivana Jovičič Einzelhandelsgeschäft Neka&Ika
Kneza Miloša 1
Kneza Miloša 1
Parken
Kartenzahlung
Ivana Jovičič pr Handelsgeschäft Neka&Ika
Kralja Milana IV 6
Kralja Milana IV 6
Kraljevo
Kruševac
Kula
Lazarevac
Leskovac
Loznica
Mionica
Mladenovac
Niš
Novi Itebej
Novi Pazar
Novi Sad
Parken
Kartenzahlung
Stanko Zelenković pr Handelsgeschäft Zelenković
Rumenačka 25
Rumenačka 25
Obrenovac
Odžaci
Pančevo
Paraćin
Požarevac
Priboj
Prokuplje
Raška
Ruma
Senta
Sivac
Smederevo
Sokobanja
Sombor
Sremska Mitrovica
Stara Pazova

Subotica
Surdulica
Šabac
Šašinci
Šid
Temerin
Tutin
Užice
Valjevo
Vladičin Han
Vranje
Vrbas
Vrnjačka Banja
Vršac
Zaječar
Zrenjanin
Lade...
/i).map(s=>s.replace(/]+>/g,'').trim()).filter(Boolean); if(parts.length===0){ parts=(p.textContent||'').split('\n').map(s=>s.trim()).filter(Boolean); } return { name: clean(parts[0]||''), address: clean(parts[1]||'') }; }function fromStoreDiv(div){ let name='', address=''; const strong=div.querySelector('strong'); if(strong){ name=clean(strong.textContent||''); let txt=''; for(const node of div.childNodes){ if(node===strong) continue; if(node.nodeType===Node.TEXT_NODE) txt += node.textContent; else if(node.nodeType===Node.ELEMENT_NODE && node.tagName!=='STRONG') txt += ' ' + node.textContent; } address=clean(txt.replace(/^[,–—-]\s*/,'')); }else{ const t=clean(div.textContent||''); name=t; } return { name, address }; }function findNameAndAddress(anchor){ const card = anchor.closest(CARD_SEL) || anchor.parentElement; let p = card && card.querySelector(NAME_SEL_1); if(p) return fromP(p); let s = card && card.querySelector(NAME_SEL_2); if(s) return fromStoreDiv(s); let prev = card && card.previousElementSibling, hops=0; while(prev && hops<6){ p = prev.querySelector && prev.querySelector(NAME_SEL_1); if(p) return fromP(p); s = prev.querySelector && prev.querySelector(NAME_SEL_2); if(s) return fromStoreDiv(s); prev = prev.previousElementSibling; hops++; } let next = card && card.nextElementSibling; hops=0; while(next && hops<6){ p = next.querySelector && next.querySelector(NAME_SEL_1); if(p) return fromP(p); s = next.querySelector && next.querySelector(NAME_SEL_2); if(s) return fromStoreDiv(s); next = next.nextElementSibling; hops++; } let up = card && card.parentElement; hops=0; while(up && hops<3){ p = up.querySelector && up.querySelector(NAME_SEL_1); if(p) return fromP(p); s = up.querySelector && up.querySelector(NAME_SEL_2); if(s) return fromStoreDiv(s); up = up.parentElement; hops++; } return { name:'', address:'' }; }async function getAllFast(){ const SEL='a[href*=\"google.com/maps\"], a[href*=\"goo.gl/maps\"], a[href*=\"maps.app.goo.gl\"]'; let tries=0; while(tries=120) break; await new Promise(r=>setTimeout(r,200)); tries++; } const anchors=[...document.querySelectorAll(SEL)]; const out=[]; const seen=new Set(); for(const a of anchors){ const coords=parseCoords(a.href); if(!coords) continue; const {name,address}=findNameAndAddress(a); if(!name && !address) continue; let city=''; if(address && address.includes(',')){ const ap=address.split(',').map(s=>s.trim()).filter(Boolean); city=ap[ap.length-1]; } const key=coords.lat.toFixed(6)+','+coords.lng.toFixed(6)+'|'+name; if(seen.has(key)) continue; seen.add(key); out.push({name,address,city,lat:coords.lat,lng:coords.lng,link:a.href}); } return out; }const fallbackCenter=[44.0165,21.0059]; const map=L.map('map',{scrollWheelZoom:true}).setView(fallbackCenter,7); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{maxZoom:19,attribution:'© OpenStreetMap'}).addTo(map); const greenIcon=L.divIcon({className:'pin-green',iconSize:[18,18]}); const markerLayer=L.layerGroup().addTo(map);let ALL=[]; let markersRef=[];function renderMarkers(){ markerLayer.clearLayers(); markersRef=[]; const markers=[]; ALL.forEach(p=>{ const m=L.marker([p.lat,p.lng],{icon:greenIcon}).addTo(markerLayer); const title=[p.name,p.city].filter(Boolean).join(' – ') || (p.city||'Distributer'); const addr=p.address||''; const link=p.link?`
Otvori u Google Maps`:''; m.bindPopup(`${title}
${addr}${link}`); markers.push(m); markersRef.push({marker:m,data:p}); }); if(markers.length){const group=L.featureGroup(markers); map.fitBounds(group.getBounds().pad(0.15));} else{map.setView(fallbackCenter,7);} const status=document.getElementById('status'); if(status) status.textContent=`Prikazano: ${ALL.length}`; }document.getElementById('locate').addEventListener('click',()=>{ if(!navigator.geolocation) return alert('Pregledač ne podržava geolokaciju.'); navigator.geolocation.getCurrentPosition(pos=>{ const {latitude,longitude}=pos.coords; map.setView([latitude,longitude],12); const me=L.circleMarker([latitude,longitude],{radius:8,weight:2,color:'#0d5e3b'}).addTo(map); me.bindPopup('Vi ste ovde (procena lokacije)').openPopup(); },()=>alert('Nije moguće pribaviti lokaciju.')); });function haversine(a,b,c,d){const r=x=>x*Math.PI/180,R=6371,dLat=r(c-a),dLon=r(d-b);const A=Math.sin(dLat/2)**2+Math.cos(r(a))*Math.cos(r(c))*Math.sin(dLon/2)**2;return R*2*Math.atan2(Math.sqrt(A),Math.sqrt(1-A));} document.getElementById('nearest').addEventListener('click',()=>{ if(!navigator.geolocation) return alert('Pregledač ne podržava geolokaciju.'); navigator.geolocation.getCurrentPosition(pos=>{ const {latitude,longitude}=pos.coords; if(!markersRef.length) return; let best=null, bestDist=Infinity; markersRef.forEach(({marker,data})=>{const d=haversine(latitude,longitude,data.lat,data.lng); if(d<bestDist){bestDist=d; best={marker,data};}}); if(best){ map.setView([best.data.lat,best.data.lng],14); best.marker.openPopup(); const extra=`
Udaljenost: ${bestDist.toFixed(2)} km`; const title=[best.data.name,best.data.city].filter(Boolean).join(' – ')||(best.data.city||'Distributer'); const link=best.data.link?`
Otvori u Google Maps`:''; best.marker.setPopupContent(`${title}
${best.data.address||''}${extra}${link}`); } },()=>alert('Nije moguće pribaviti lokaciju.')); });(async()=>{ ALL = await getAllFast(); renderMarkers(); })();








