';
}).join('');
// Chart
if (chartInst) chartInst.destroy();
var ctx = document.getElementById('tw-chart').getContext('2d');
var labels = [];
for (var i = 0; i <= years; i++) labels.push(i === 0 ? 'Start' : 'Yr ' + i);
chartInst = new Chart(ctx, {
type: 'line',
data: {
labels: labels,
datasets: [
{
label: 'Offshore Bond',
data: osbR,
borderColor: '#26eb44',
backgroundColor: 'rgba(38,235,68,0.06)',
fill: true, tension: 0.3, pointRadius: 0, pointHoverRadius: 4, borderWidth: 2
},
{
label: 'Taxed Account',
data: giaR,
borderColor: '#e8b930',
backgroundColor: 'rgba(232,185,48,0.04)',
fill: true, tension: 0.3, pointRadius: 0, pointHoverRadius: 4, borderWidth: 2
}
]
},
options: {
responsive: true,
maintainAspectRatio: false,
interaction: { mode: 'index', intersect: false },
plugins: {
legend: { display: false },
tooltip: {
backgroundColor: '#132b4a',
borderColor: 'rgba(255,255,255,0.1)',
borderWidth: 1,
titleColor: '#ffffff',
bodyColor: '#ffffff',
titleFont: { family: 'Open Sans', weight: '700', size: 13 },
bodyFont: { family: 'Open Sans', size: 12 },
padding: 10,
cornerRadius: 6,
displayColors: true,
callbacks: { label: function(c) { return ' ' + c.dataset.label + ': ' + fmtC(c.parsed.y); } }
}
},
scales: {
x: {
grid: { color: 'rgba(255,255,255,0.03)', drawBorder: false },
ticks: { color: '#ffffff', font: { family: 'Open Sans', size: 11 }, maxTicksLimit: 9 }
},
y: {
grid: { color: 'rgba(255,255,255,0.03)', drawBorder: false },
ticks: {
color: '#ffffff',
font: { family: 'Open Sans', size: 11 },
callback: function(v) {
if (v >= 1e6) return '£' + (v / 1e6).toFixed(1) + 'm';
if (v >= 1e3) return '£' + (v / 1e3).toFixed(0) + 'k';
return '£' + v;
}
},
beginAtZero: true
}
}
}
});
// Table
var tbody = document.getElementById('tw-tbody');
tbody.innerHTML = '';
for (var y = 1; y <= years; y++) {
var tr = document.createElement('tr');
tr.innerHTML = '' + y + ' ' + fmtC(wArr[y]) + ' ' + fmtC(cumArr[y]) + ' ' + fmtC(allowArr[y]) + ' ' + fmtC(osbR[y]) + ' ' + fmtC(giaR[y]) + ' ';
tbody.appendChild(tr);
}
};
// User guide toggle
window.twToggleGuide = function() {
var wrap = document.getElementById('tw-guideWrap');
var chv = document.getElementById('tw-guideChv');
var isOpen = wrap.style.display !== 'none';
wrap.style.display = isOpen ? 'none' : 'block';
var rot = isOpen ? 'rotate(-45deg)' : 'rotate(45deg)';
chv.innerHTML = ' ' + (isOpen ? 'Show' : 'Hide');
};
// Table toggle
window.twToggleTable = function() {
var wrap = document.getElementById('tw-tableWrap');
var chv = document.getElementById('tw-tableChv');
var isOpen = wrap.style.display !== 'none';
wrap.style.display = isOpen ? 'none' : 'block';
var rot = isOpen ? 'rotate(-45deg)' : 'rotate(45deg)';
chv.innerHTML = ' ' + (isOpen ? 'Show' : 'Hide');
};
// Run on load
twCalc();
})();