/* ====== DAL CIN WORLD MAP - SCOPED STYLES ====== */
#dc-worldmap-wrap{
--dc-land:#F9ECE1;
--dc-active:#A91736;
--dc-pin:#408E85;
--dc-sea:transparent;
--dc-stroke:#D9BCA3;
--dc-ink:#3A3330;
position:relative;
width:100%;
margin:0;
font-family:'Poppins',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;
font-size:14px;
line-height:18px;
color:var(--dc-ink);
box-sizing:border-box;
flex:1 1 100%; /* dentro i contenitori flex di Elementor */
align-self:stretch;
min-width:0;
}
/* il widget HTML di Elementor e' un flex item: senza questo collassa a 0px */
.elementor-widget-html:has(#dc-worldmap-wrap),
.elementor-widget-container:has(> #dc-worldmap-wrap){
width:100%;flex:1 1 100%;align-self:stretch;min-width:0;
}
#dc-worldmap-wrap *,#dc-worldmap-wrap *::before,#dc-worldmap-wrap *::after{box-sizing:border-box;}
#dc-worldmap{
width:100%;
/* nessuna altezza fissa: 1.495 e' il rapporto delle terre emerse effettive
(da -168,1 a 180 di longitudine, da -55,6 a 83,6 di latitudine in
proiezione Mercator), cosi' non viene tagliato nulla, Groenlandia inclusa */
aspect-ratio:1.495;
height:auto;
background:transparent;
overflow:hidden;
outline:none;
font-family:inherit;
font-size:14px;
line-height:18px;
z-index:1;
}
#dc-worldmap:focus{outline:none;}
#dc-worldmap.leaflet-container{background:transparent;}
/* ---- Loader ---- */
#dc-worldmap-loader{
position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
gap:10px;background:transparent;z-index:900;
font-size:14px;line-height:18px;color:#9A8C82;transition:opacity .35s ease;
}
#dc-worldmap-loader.dc-hidden{opacity:0;pointer-events:none;}
#dc-worldmap-loader .dc-spin{
width:18px;height:18px;border-radius:50%;
border:2px solid var(--dc-stroke);border-top-color:var(--dc-active);
animation:dcSpin .8s linear infinite;
}
@keyframes dcSpin{to{transform:rotate(360deg);}}
/* ---- Pin battito ---- */
.dc-pin{position:relative;width:26px;height:26px;}
.dc-pin i{
position:absolute;left:50%;top:50%;width:14px;height:14px;margin:-7px 0 0 -7px;
background:var(--dc-pin,#408E85);border-radius:50%;
border:2.5px solid #fff;
box-shadow:0 2px 8px rgba(0,0,0,.28);
z-index:3;transition:transform .25s cubic-bezier(.34,1.56,.64,1);
}
.dc-pin span{
position:absolute;left:50%;top:50%;width:26px;height:26px;margin:-13px 0 0 -13px;
border-radius:50%;background:#408E85;opacity:.55;z-index:1;
animation:dcBeat 2.2s cubic-bezier(.22,.61,.36,1) infinite;
}
.dc-pin span.dc-d2{animation-delay:.75s;}
.dc-pin span.dc-d3{animation-delay:1.5s;}
@keyframes dcBeat{
0%{transform:scale(.32);opacity:.6;}
70%{transform:scale(2.5);opacity:0;}
100%{transform:scale(2.5);opacity:0;}
}
.dc-pin:hover i{transform:scale(1.32);}
.dc-marker-hit{background:transparent;border:0;}
#dc-worldmap-wrap .leaflet-marker-icon:focus{outline:none;}
#dc-worldmap-wrap .leaflet-marker-icon:focus-visible{
outline:2px solid #408E85;outline-offset:4px;border-radius:50%;
}
/* ---- Tooltip ---- */
#dc-worldmap-wrap .leaflet-tooltip.dc-tip{
font-family:'Poppins',sans-serif;font-size:14px;line-height:18px;font-weight:500;
background:#fff;color:var(--dc-ink);
border:0;border-radius:8px;padding:7px 11px;
box-shadow:0 6px 22px rgba(58,51,48,.18);
white-space:nowrap;
}
#dc-worldmap-wrap .leaflet-tooltip.dc-tip::before{border-top-color:#fff;border-bottom-color:#fff;}
#dc-worldmap-wrap .leaflet-tooltip.dc-tip-country{
background:var(--dc-active);color:#fff;font-weight:600;
box-shadow:0 6px 18px rgba(169,23,54,.28);
}
#dc-worldmap-wrap .leaflet-tooltip.dc-tip-country::before{border-top-color:var(--dc-active);border-bottom-color:var(--dc-active);}
/* ---- Card sede (si apre per intero all'hover) ---- */
#dc-worldmap-wrap .leaflet-popup.dc-card{margin-bottom:0;}
#dc-worldmap-wrap .leaflet-popup.dc-card .leaflet-popup-content-wrapper{
background:var(--dc-pin);color:#fff;
border-radius:22px;padding:2px;
box-shadow:0 18px 44px rgba(45,84,79,.28);
}
#dc-worldmap-wrap .leaflet-popup.dc-card .leaflet-popup-content{
margin:18px 26px;width:auto!important;text-align:center;
font-family:'Poppins',sans-serif;font-size:14px;line-height:18px;
}
#dc-worldmap-wrap .leaflet-popup.dc-card .leaflet-popup-tip-container{display:none;}
.dc-card-t{font-size:16px;line-height:22px;font-weight:700;margin:0 0 4px 0;white-space:nowrap;}
.dc-card-a{font-size:14px;line-height:18px;font-weight:400;margin:0 0 2px 0;white-space:nowrap;}
.dc-card-r{font-size:14px;line-height:18px;font-weight:400;margin:2px 0 0 0;white-space:nowrap;}
.dc-card-r a{
color:#fff;font-weight:500;text-decoration:underline;
text-underline-offset:3px;text-decoration-thickness:1px;
transition:text-decoration-thickness .18s ease,opacity .18s ease;
}
.dc-card-r a:hover,.dc-card-r a:focus{color:#fff;text-decoration-thickness:2px;opacity:.92;}
/* ---- Zoom control ---- */
#dc-worldmap-wrap .leaflet-control-zoom{border:0!important;box-shadow:0 4px 16px rgba(58,51,48,.16);border-radius:10px;overflow:hidden;}
#dc-worldmap-wrap .leaflet-control-zoom a{
width:32px;height:32px;line-height:32px;color:var(--dc-ink);
background:#fff;border-bottom:1px solid #F0E7DF;font-weight:600;
}
#dc-worldmap-wrap .leaflet-control-zoom a:hover{background:var(--dc-land);color:var(--dc-active);}
#dc-worldmap-wrap .leaflet-bar a.leaflet-disabled{background:#FBF7F4;color:#CFC3B9;}
/* ---- Errore ---- */
#dc-worldmap-err{
display:none;position:absolute;inset:0;z-index:950;border-radius:8px;
background:var(--dc-land);align-items:center;justify-content:center;text-align:center;
padding:24px;font-size:14px;line-height:18px;color:#8A5A63;
}
@media (max-width:767px){
#dc-worldmap-wrap .leaflet-popup.dc-card .leaflet-popup-content{margin:14px 18px;}
.dc-card-t,.dc-card-a,.dc-card-r{white-space:normal;}
.dc-card-t{font-size:15px;line-height:20px;}
}
Caricamento mappa…
Mappa non disponibile al momento. Riprova più tardi.
(function(){
"use strict";
/* ---------- CONFIG ---------- */
var COL = { land:"#F9ECE1", active:"#A91736", pin:"#408E85", stroke:"#D9BCA3", strokeA:"#7A0E25" };
/* Inquadratura: scarto i lembi oltre questi meridiani (Chukotka a sinistra
dell'Alaska, code srotolate delle Figi a destra) */
var WEST_CUT = -168.5, EAST_CUT = 180;
/* Codici ISO 3166-1 numerici dei paesi evidenziati */
var ACTIVE_ISO = [
380, /* Italia */
724, 620, /* Spagna, Portogallo */
840, /* Stati Uniti */
250, /* Francia */
36, 554, /* Australia, Nuova Zelanda */
642, 8, 300, 40, 276, /* Romania, Albania, Grecia, Austria, Germania */
/* --- Sud America --- */
32, 68, 76, 152, 170, 218, 238, 254, 328, 600, 604, 740, 858, 862
];
/* Fallback su nome (dataset senza id numerico) */
var ACTIVE_NAMES = ["italy","spain","portugal","united states of america","united states","usa",
"france","australia","new zealand","romania","albania","greece","austria","germany",
"argentina","bolivia","brazil","chile","colombia","ecuador","guyana","paraguay","peru",
"suriname","uruguay","venezuela","falkland islands","french guiana"];
var LABELS = {
380:"Italia",724:"Spagna",620:"Portogallo",840:"Stati Uniti",250:"Francia",36:"Australia",
554:"Nuova Zelanda",642:"Romania",8:"Albania",300:"Grecia",40:"Austria",276:"Germania",
32:"Argentina",68:"Bolivia",76:"Brasile",152:"Cile",170:"Colombia",218:"Ecuador",
238:"Isole Falkland",254:"Guyana Francese",328:"Guyana",600:"Paraguay",604:"Per\u00f9",
740:"Suriname",858:"Uruguay",862:"Venezuela"
};
var SEDI = [
{ lat:45.6287, lng:9.3399, nome:"Dal Cin Concorezzo",
indirizzo:"Via I Maggio, 67 - 20863 Concorezzo (MB)",
tel:"039 6049477", telRaw:"+390396049477", mail:"info@dalcin.com" },
{ lat:42.5768, lng:-2.8474, nome:"Dal Cin Ib\u00e9rica",
indirizzo:"C/ Agricultura, 17 - Haro, La Rioja (Espa\u00f1a)",
tel:null, telRaw:null, mail:"info@dalcin.com" }
];
/* ---------- LOADER ASSET ---------- */
function loadScript(url){
return new Promise(function(res,rej){
var s=document.createElement("script");
s.src=url; s.async=true; s.crossOrigin="anonymous";
s.onload=function(){res();}; s.onerror=function(){rej(new Error("fail "+url));};
document.head.appendChild(s);
});
}
function loadCss(url){
if(document.querySelector('link[href="'+url+'"]')) return;
var l=document.createElement("link"); l.rel="stylesheet"; l.href=url;
document.head.appendChild(l);
}
function loadScriptAny(urls){
var i=0;
function next(){
if(i>=urls.length) return Promise.reject(new Error("script ko"));
return loadScript(urls[i++]).catch(next);
}
return next();
}
function getJSON(urls){
var i=0;
function next(){
if(i>=urls.length) return Promise.reject(new Error("geojson ko"));
var u=urls[i++];
return fetch(u,{mode:"cors"}).then(function(r){
if(!r.ok) throw new Error("http "+r.status);
return r.json();
}).catch(function(){ return next(); });
}
return next();
}
var LEAFLET_JS = "https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.min.js";
var LEAFLET_CSS= "https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.min.css";
var TOPO_JS = [
"https://cdn.jsdelivr.net/npm/topojson-client@3.1.0/dist/topojson-client.min.js",
"https://unpkg.com/topojson-client@3.1.0/dist/topojson-client.min.js"
];
var TOPO_DATA = [
"https://cdn.jsdelivr.net/npm/world-atlas@2.0.2/countries-110m.json",
"https://unpkg.com/world-atlas@2.0.2/countries-110m.json"
];
var GEO_DATA = [
"https://cdn.jsdelivr.net/gh/johan/world.geo.json@master/countries.geo.json",
"https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json"
];
/* ---------- HELPERS ---------- */
function isoOf(f){
var raw = (f.id !== undefined && f.id !== null) ? f.id
: (f.properties && (f.properties.iso_n3 || f.properties.ISO_N3 || f.properties.id));
var n = parseInt(raw,10);
return isNaN(n) ? null : n;
}
function nameOf(f){
var p=f.properties||{};
return p.name || p.NAME || p.admin || p.ADMIN || p.name_long || "";
}
function isActive(f){
var iso=isoOf(f);
if(iso!==null && ACTIVE_ISO.indexOf(iso)>-1) return true;
var n=nameOf(f).toLowerCase();
return n && ACTIVE_NAMES.indexOf(n)>-1;
}
function labelOf(f){
var iso=isoOf(f);
if(iso!==null && LABELS[iso]) return LABELS[iso];
return nameOf(f);
}
function cardHTML(s){
var h='
'+s.nome+'
'+
'
'+s.indirizzo+'
';
if(s.telRaw){ h+='
'; }
h+='
';
return h;
}
/* Corregge i poligoni che attraversano l'antimeridiano (Russia, Fiji, NZ)
evitando le fasce orizzontali che sporcano la mappa. */
function unwrapRing(ring){
var out=[],off=0,prev=null,i,lng;
for(i=0;i180) off-=360; else if(d<-180) off+=360;
}
prev=lng+off;
out.push([prev,ring[i][1]]);
}
return out;
}
/* Riporta l'anello srotolato nella fascia -180/180 (in base al suo centro) */
function recenterRing(ring){
var sum=0,i,dx=0;
for(i=0;i180) dx-=360;
while(mean+dx<-180) dx+=360;
return dx ? ring.map(function(pt){ return [pt[0]+dx,pt[1]]; }) : ring;
}
/* Ritaglia un anello su un meridiano (Sutherland-Hodgman): tiene la parte
a ovest di X se keepWest, altrimenti quella a est */
function clipRing(ring,X,keepWest){
var out=[],i,a,b,ain,bin,t;
function inside(p){ return keepWest ? p[0]=X; }
for(i=0;i<ring.length;i++){
a=ring[i]; b=ring[(i+1)%ring.length];
ain=inside(a); bin=inside(b);
if(ain!==bin){
t=(X-a[0])/(b[0]-a[0]);
out.push([X, a[1]+t*(b[1]-a[1])]);
}
if(bin) out.push(b);
}
return out;
}
/* Taglia al 180 (la Russia resta intera fino al bordo, sparisce solo la
Chukotka oltre la linea) e scarta i lembi a sinistra dell'Alaska */
function fixPolygon(poly){
var rings=[],i,r,mx;
for(i=0;i<poly.length;i++){
r=recenterRing(unwrapRing(poly[i]));
r=clipRing(clipRing(r,EAST_CUT,true),-180,false);
if(r.lengthmx)mx=pt[0]; });
if(mx<WEST_CUT) return [];
}
rings.push(r);
}
return [rings];
}
function fixAntimeridian(geo){
(geo.features||[]).forEach(function(f){
var g=f.geometry; if(!g) return;
if(g.type==="Polygon"){
var out=fixPolygon(g.coordinates);
if(out.length){ g.coordinates=out[0]; } else { f.__skip=true; }
} else if(g.type==="MultiPolygon"){
var acc=[];
g.coordinates.forEach(function(poly){ acc=acc.concat(fixPolygon(poly)); });
if(acc.length){ g.coordinates=acc; } else { f.__skip=true; }
}
});
return geo;
}
/* ---------- BOOT ---------- */
function fail(){
var l=document.getElementById("dc-worldmap-loader");
var e=document.getElementById("dc-worldmap-err");
if(l) l.classList.add("dc-hidden");
if(e) e.style.display="flex";
}
/* Elementor annida il widget in contenitori flex: se un antenato e' largo
0px la mappa non puo' disegnarsi. Qui li allargo al 100%. */
function ensureWidth(el){
var n=el.parentElement,i=0;
while(n && i<8 && n.tagName!=="BODY"){
if(n.getBoundingClientRect().width<40){
n.style.width="100%";
n.style.flex="1 1 100%";
n.style.alignSelf="stretch";
n.style.minWidth="0";
}
n=n.parentElement; i++;
}
}
function build(geo){
var el=document.getElementById("dc-worldmap");
if(!el) return;
ensureWidth(el);
var map=L.map(el,{
zoomControl:false,
attributionControl:false,
scrollWheelZoom:false,
worldCopyJump:false,
zoomSnap:0,
zoomDelta:.5,
minZoom:1,
maxZoom:7,
maxBoundsViscosity:.85
});
L.control.zoom({position:"bottomright"}).addTo(map);
/* Scroll-zoom solo dopo click sulla mappa (UX pagina) */
map.on("click",function(){ map.scrollWheelZoom.enable(); });
map.on("mouseout",function(){ map.scrollWheelZoom.disable(); });
function styleFor(f){
var a=isActive(f);
return {
fillColor:a?COL.active:COL.land,
fillOpacity:1,
color:a?COL.strokeA:COL.stroke,
weight:a?1.2:1,
opacity:1
};
}
var layer=L.geoJSON(geo,{
style:styleFor,
filter:function(f){
if(f.__skip) return false;
var n=nameOf(f).toLowerCase();
return isoOf(f)!==10 && n!=="antarctica" && n!=="antartide";
},
onEachFeature:function(f,l){
if(!isActive(f)) return;
var lab=labelOf(f);
if(lab){
l.bindTooltip(lab,{sticky:true,direction:"top",className:"dc-tip dc-tip-country",opacity:1});
}
l.on({
mouseover:function(){ this.setStyle({fillOpacity:.82,weight:2}); this.bringToFront(); },
mouseout:function(){ this.setStyle({fillOpacity:1,weight:1.2}); }
});
}
}).addTo(map);
/* ---- Pin sedi ---- */
var icon=L.divIcon({
className:"dc-marker-hit",
html:'
',
iconSize:[26,26],
iconAnchor:[13,13],
popupAnchor:[0,-12],
tooltipAnchor:[0,-14]
});
SEDI.forEach(function(s){
var mk=L.marker([s.lat,s.lng],{icon:icon,riseOnHover:true,keyboard:true,alt:s.nome})
.addTo(map)
.bindPopup(cardHTML(s),{
className:"dc-card",
maxWidth:380,
closeButton:false,
autoPan:false, /* niente scatti della mappa al passaggio del mouse */
autoClose:true,
offset:[0,-6]
});
/* La card si apre per intero all'hover e resta aperta mentre ci si
sposta sopra, cosi' telefono e mail restano cliccabili. */
var closeT=null;
function hold(){ clearTimeout(closeT); }
function sched(){ clearTimeout(closeT); closeT=setTimeout(function(){ mk.closePopup(); },280); }
mk.on("mouseover",function(){ hold(); mk.openPopup(); });
mk.on("mouseout",sched);
mk.on("popupopen",function(e){
e.popup.options.maxWidth=Math.max(240,Math.min(380,el.clientWidth-32));
e.popup.update();
var pe=e.popup.getElement();
if(pe && !pe.__dcBound){
pe.__dcBound=1;
L.DomEvent.on(pe,"mouseenter",hold);
L.DomEvent.on(pe,"mouseleave",sched);
}
});
/* l'icona esiste solo quando la mappa ha una vista: attendi l'evento add */
mk.on("add",function(){
var elm=mk.getElement();
if(elm) elm.setAttribute("aria-label",s.nome);
});
});
/* ---- Framing: i confini vengono dalle geometrie effettivamente disegnate,
cosi' nessuna terra emersa puo' finire fuori dall'inquadratura.
(l'Antartide e' gia' esclusa, quindi niente latitudini infinite) ---- */
var DB = layer.getBounds();
var WORLD = L.latLngBounds(
[DB.getSouth(), Math.max(DB.getWest(),-180)],
[DB.getNorth(), Math.min(DB.getEast(), 180)] /* fuori la coda delle Figi oltre il 180 */
);
map.setMaxBounds(L.latLngBounds([-85,-200],[85,200]));
/* Alla vista iniziale la mappa e' ferma: niente trascinamento e niente
cursore "grab". Si sblocca solo quando l'utente zooma. */
var HOME=null; /* centro dell'inquadratura iniziale */
function syncDrag(){
if(map.getZoom() <= map.getMinZoom()+0.01){
if(map.dragging.enabled()) map.dragging.disable();
if(HOME) map.setView(HOME,map.getZoom(),{animate:false});
}else if(!map.dragging.enabled()){
map.dragging.enable();
}
}
map.on("zoomend",syncDrag);
function frame(){
if(el.clientWidth<40){ ensureWidth(el); }
if(el.clientWidth map.getMinZoom()+0.01) return;
map.setMinZoom(0);
map.fitBounds(WORLD,{padding:[2,2],animate:false});
map.setMinZoom(map.getZoom());
HOME=map.getCenter();
syncDrag();
}
frame();
window.dalCinMap=map; /* handle pubblico per personalizzazioni */
var t=null;
window.addEventListener("resize",function(){
clearTimeout(t); t=setTimeout(frame,180);
});
if(window.ResizeObserver){
new ResizeObserver(function(){ clearTimeout(t); t=setTimeout(frame,180); }).observe(el);
}
/* Elementor: ricalcolo dopo render tab/slider */
if(window.jQuery){
jQuery(window).on("elementor/frontend/init",function(){ setTimeout(frame,300); });
}
setTimeout(frame,450);
setTimeout(frame,1200);
setTimeout(frame,2500);
var ld=document.getElementById("dc-worldmap-loader");
if(ld) ld.classList.add("dc-hidden");
}
function start(){
var host=document.getElementById("dc-worldmap");
if(!host || host.__dcInit) return; /* gia' inizializzato QUESTO elemento */
host.__dcInit=true;
loadCss(LEAFLET_CSS);
var pLeaflet = (window.L && window.L.version) ? Promise.resolve() : loadScript(LEAFLET_JS);
pLeaflet.then(function(){
/* 1o tentativo: TopoJSON world-atlas (id ISO numerici) */
return Promise.all([
(window.topojson ? Promise.resolve() : loadScriptAny(TOPO_JS)),
getJSON(TOPO_DATA)
]).then(function(r){
var topo=r[1];
return topojson.feature(topo, topo.objects.countries);
}).catch(function(){
/* 2o tentativo: GeoJSON puro (match per nome) */
return getJSON(GEO_DATA);
});
}).then(function(geo){
build(fixAntimeridian(geo));
}).catch(function(err){
if(window.console) console.error("[Dal Cin Map]",err);
fail();
});
}
/* Piu' agganci: l'editor Elementor ricrea il widget dopo ogni modifica */
window.dalCinMapInit = start;
if(document.readyState==="loading"){
document.addEventListener("DOMContentLoaded",start);
}else{
start();
}
if(window.jQuery){
jQuery(window).on("elementor/frontend/init",function(){ setTimeout(start,60); });
}
setTimeout(start,300);
setTimeout(start,1200);
})();