'+
'
Share (%)
'+fmt1(r.value)+'
'+
'
';
}).join('');
}
// Chart.js loader (local first, then CDN)
function ensureChart(cb){
if(window.Chart){ cb(true); return; }
if(window.__SR_CHART_PROMISE__){
window.__SR_CHART_PROMISE__.then(function(ok){ cb(ok); });
return;
}
window.__SR_CHART_PROMISE__ = new Promise(function(resolve){
var urls = [
"/wp-content/uploads/chartjs/chart.umd.min.js",
"/wp-content/uploads/2025/12/chart.umd.min.js",
"https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js",
"https://unpkg.com/chart.js@4.4.1/dist/chart.umd.min.js"
];
var i = 0;
function next(){
if(i >= urls.length){ resolve(false); return; }
var s = document.createElement("script");
s.src = urls[i++];
s.async = true;
s.onload = function(){ resolve(!!window.Chart); };
s.onerror = function(){ next(); };
document.head.appendChild(s);
}
next();
});
window.__SR_CHART_PROMISE__.then(function(ok){ cb(ok); });
}
function showFallback(){
var fb = document.getElementById("sr_dd_bar_fb");
var c = document.getElementById("sr_dd_bar");
if(c) c.style.display = "none";
if(fb) fb.style.display = "block";
}
function renderBar(){
var canvas = document.getElementById("sr_dd_bar");
if(!canvas || !window.Chart){ showFallback(); return; }
// Prevent double-instantiation
if(canvas.__srChart && typeof canvas.__srChart.destroy === "function"){
try{ canvas.__srChart.destroy(); }catch(e){}
}
try{
canvas.__srChart = new Chart(canvas, {
type: "bar",
data: {
labels: top20.map(function(d){ return d.country; }),
datasets: [{ label: "Share (%)", data: top20.map(function(d){ return d.value; }) }]
},
options: {
responsive: true,
maintainAspectRatio: false,
animation: false,
plugins: {
legend: { display: false },
tooltip: { callbacks: { label: function(c){ return " " + fmt1(c.parsed.y) + "%"; } } }
},
scales: {
x: { ticks: { color:"#0f172a", font:{size:15} }, grid:{display:false} },
y: { ticks: { color:"#0f172a", font:{size:15}, callback:function(v){ return v + "%"; } }, grid:{ color:"rgba(15,23,42,.10)" } }
}
}
});
var fb = document.getElementById("sr_dd_bar_fb");
if(fb) fb.style.display = "none";
}catch(e){
showFallback();
}
}
ensureChart(function(ok){
if(!ok){ showFallback(); return; }
renderBar();
});
})();
'+
'
'+
'
Share (%)
'+fmt1(r.value)+'
'+
'
Road fatalities / 100k
'+fmt1(r.fatalities_per_100k)+'
'+
'
'+
'
';
}).join('');
}
// Bottom 20 lowest share
var low20 = data.slice().sort(function(a,b){ return (a.value||0)-(b.value||0); }).slice(0,20);
var lowBody = document.getElementById("sr_dd_low_body");
if(lowBody){
lowBody.innerHTML = low20.map(function(r){
return '
| '+r.rank+' | '+r.country+' | '+fmt1(r.value)+' |
';
}).join('');
}
var lowCards = document.getElementById("sr_dd_low_cards");
if(lowCards){
lowCards.innerHTML = low20.map(function(r){
return ''+
'
'+
'
'+r.country+'
Rank '+r.rank+'
'+
'
Share (%)
'+fmt1(r.value)+'
'+
'
';
}).join('');
}
// Context table (Top 30 by share for readability)
var ctx30 = data.slice().sort(function(a,b){ return (b.value||0)-(a.value||0); }).slice(0,30);
var ctxBody = document.getElementById("sr_dd_ctx_body");
if(ctxBody){
ctxBody.innerHTML = ctx30.map(function(r){
return '
| '+r.country+' | '+fmt1(r.value)+' | '+fmt1(r.fatalities_per_100k)+' |
';
}).join('');
}
var ctxCards = document.getElementById("sr_dd_ctx_cards");
if(ctxCards){
ctxCards.innerHTML = ctx30.map(function(r){
return ''+
'
'+
'
'+
'
'+
'
Share (%)
'+fmt1(r.value)+'
'+
'
Road fatalities / 100k
'+fmt1(r.fatalities_per_100k)+'
'+
'
'+
'
';
}).join('');
}
// Reuse the same Chart.js promise from Part 1 (or create if missing)
function ensureChart(cb){
if(window.Chart){ cb(true); return; }
if(window.__SR_CHART_PROMISE__){
window.__SR_CHART_PROMISE__.then(function(ok){ cb(ok); });
return;
}
window.__SR_CHART_PROMISE__ = new Promise(function(resolve){
var urls = [
"/wp-content/uploads/chartjs/chart.umd.min.js",
"/wp-content/uploads/2025/12/chart.umd.min.js",
"https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js",
"https://unpkg.com/chart.js@4.4.1/dist/chart.umd.min.js"
];
var i = 0;
function next(){
if(i >= urls.length){ resolve(false); return; }
var s = document.createElement("script");
s.src = urls[i++];
s.async = true;
s.onload = function(){ resolve(!!window.Chart); };
s.onerror = function(){ next(); };
document.head.appendChild(s);
}
next();
});
window.__SR_CHART_PROMISE__.then(function(ok){ cb(ok); });
}
function showFallback(){
var fb = document.getElementById("sr_dd_scatter_fb");
var c = document.getElementById("sr_dd_scatter");
if(c) c.style.display = "none";
if(fb) fb.style.display = "block";
}
function renderScatter(){
var canvas = document.getElementById("sr_dd_scatter");
if(!canvas || !window.Chart){ showFallback(); return; }
if(canvas.__srChart && typeof canvas.__srChart.destroy === "function"){
try{ canvas.__srChart.destroy(); }catch(e){}
}
var pts = data
.filter(function(d){ return isFinite(Number(d.value)) && isFinite(Number(d.fatalities_per_100k)); })
.map(function(d){ return {x:Number(d.value), y:Number(d.fatalities_per_100k), label:d.country}; });
try{
canvas.__srChart = new Chart(canvas, {
type: "scatter",
data: { datasets: [{ data: pts }] },
options: {
responsive: true,
maintainAspectRatio: false,
parsing: false,
animation: false,
plugins: {
legend: { display: false },
tooltip: { callbacks: { label: function(c){
var p = c.raw || {};
return " " + (p.label||"") + ": " + fmt1(p.x) + "%; " + fmt1(p.y) + " / 100k";
} } }
},
scales: {
x: {
title: { display: true, text: "Drink-driving share (%)", color:"#0f172a", font:{size:15, weight:"700"} },
ticks: { color:"#0f172a", font:{size:15} },
grid: { color:"rgba(15,23,42,.10)" }
},
y: {
title: { display: true, text: "Road fatalities per 100,000", color:"#0f172a", font:{size:15, weight:"700"} },
ticks: { color:"#0f172a", font:{size:15} },
grid: { color:"rgba(15,23,42,.10)" }
}
}
}
});
var fb = document.getElementById("sr_dd_scatter_fb");
if(fb) fb.style.display = "none";
}catch(e){
showFallback();
}
}
ensureChart(function(ok){
if(!ok){ showFallback(); return; }
renderScatter();
});
})();