Ada
Apatin
Bačka Palanka
Bački Petrovac
Bačka Topola
Bajina Bašta
Banja Koviljača
Bečej
Belgrade
Parking
Card payments
Organic Cornus - bio shop
Shopping Center Zmaj - Zemun
Shopping Center Zmaj - Zemun
Parking
Card payments
Cortex Labs
Primed bio-pharmacy
Vojvode Stepe 120, Voždovac
Primed bio-pharmacy
Vojvode Stepe 120, Voždovac
Parking
Card payments
Cortex Labs
Primed bio-pharmacy II
Jurija Gagarina 151G local 2, Novi Beograd
Jurija Gagarina 151G local 2, Novi Beograd
Parking
Card payments
Cortex Labs
Primed bio-pharmacy III
Cara Dušana 24, Dorćol
Cara Dušana 24, Dorćol
Parking
Card payments
Bio Food Bojana
Živka Karabiberovića 3, local 29.
Đeram Market
Živka Karabiberovića 3, local 29.
Đeram Market
Parking
Card payments
Pr Trading Store Đurđevak BG94
Ščerbinova 6, Banovo Brdo
Ščerbinova 6, Banovo Brdo
Parking
Card payments
Pr Trading Store Đurđevak BG94
Marka Oreškovića 27, Zvezdara
Marka Oreškovića 27, Zvezdara
Parking
Card payments
Pr Trading Store Đurđevak BG94
Bulevar Kralja Aleksandra 123, Zvezdara
Bulevar Kralja Aleksandra 123, Zvezdara
Parking
Card payments
Melilot Private Practice Pharmacy
Bulevar Zorana Đinđića 77
Bogatić
Bor
Brus
Bujanovac
Čačak
Futog
Gornji Milanovac
Ivanjica
Inđija
Jagodina
Kanjiža
Kikinda
Kljajićevo
Kovin
Kostolac
Kragujevac
Parking
Card payments
Ivana Jovičič, sole proprietor, retail shop Neka&Ika
Kneza Miloša 1
Kneza Miloša 1
Parking
Card payments
Ivana Jovičič pr trgovinska radnja Neka&Ika
Kralja Milana IV 6
Kralja Milana IV 6
Kraljevo
Kruševac
Kula
Lazarevac
Leskovac
Loznica
Car Wash
Mladenovac
Niš
Novi Itebej
Novi Pazar
Novi Sad
Parking
Card payments
Valentina Đapić sole trader, retail shop
Olge Petrov 36
Olge Petrov 36
Parking
Card payments
Stanko Zelenković, sole trader, Zelenković retail shop
Rumenačka 25
Rumenačka 25
Obrenovac
Chimneys
Pančevo
Paraćin
Požarevac
Priboj
Prokuplje
Parking
Card payments
Foka Nova Bio Balans
18 Topličkih Heroja Street, Žitorađa
Raska
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
Parking
Card payments
Healthy Food Microbiotics
Kralja Stefana Prvovenčanog 163
Vrbas
Parking
Card payments
AU Pharmacy Bojana Lek
Pharmacy I - Save Kovačevića 102
Pharmacy I - Save Kovačevića 102
Parking
Card payments
AU Pharmacy Bojana Lek
Pharmacy II - Palih boraca 18/b
Pharmacy II - Palih boraca 18/b
Parking
Card payments
AU Pharmacy Bojana Lek
Pharmacy IV - Save Kovačevića 81
Pharmacy IV - Save Kovačevića 81
Vrnjačka Banja
Vršac
Zaječar
Zrenjanin
Loading…
/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(); })();








