${t.lang}
`;
document.querySelectorAll(‘.gtw-tab’).forEach(el => el.onclick = () => { tab = parseInt(el.dataset.i); build(); });
$(‘#langBtn’).onclick = () => { lang = langs[(langs.indexOf(lang)+1)%langs.length]; render(); };
build();
}
function build() {
const t = TR[lang];
const body = $(‘gtw-body’);
const res = $(‘gtw-res’);
res.textContent = ”;
if (tab === 0) {
body.innerHTML = `
`;
$(‘#bjc’).onclick = () => {
const decks = +$(‘#d’).value || 6;
const hand = +$(‘#hand’).value;
const dealer = +$(‘#dealer’).value;
const s17 = $(‘#s17’).checked;
if (decks < 1) { res.textContent = t.error; res.className = 'gtw-error'; return; }
const edge = houseEdge({decks, s17});
const strategy = blackjackStrategy(hand, dealer, hand >= 12 && hand <= 21 && $('#s17').checked);
res.textContent = `${t.houseEdge}: ${edge.toFixed(2)}% | ${t.rtp}: ${(100-edge).toFixed(2)}%`;
if (strategy !== 'Invalid input') res.textContent += ` | ${t.strategy}: ${t[strategy]}`;
res.className = strategy === 'Invalid input' ? 'gtw-error' : 'gtw-result';
};
} else if (tab === 1) {
body.innerHTML = `
`;
$(‘#oc’).onclick = () => {
const am = $(‘#am’).value, dec = $(‘#dec’).value, st = parseFloat($(‘#st’).value) || 0;
const d = dec || am2dec(am);
const a = am || dec2am(dec);
if (!d && !a) { res.textContent = t.error; res.className = ‘gtw-error’; return; }
$(‘#dec’).value = d; $(‘#am’).value = a;
res.textContent = st > 0 ? `${t.payout}: ${(st*d).toFixed(2)}` : ”;
res.className = ‘gtw-result’;
};
} else if (tab === 2) {
body.innerHTML = `
`;
$(‘#kc’).onclick = async () => {
const event = $(‘#event’).value;
const d = parseFloat($(‘#kd’).value);
const b = parseFloat($(‘#kb’).value);
if (!event || d <= 1 || b <= 0) { res.textContent = t.error; res.className = 'gtw-error'; return; }
const p = await predictWinProbability(event);
const k = ((d-1)*p - (1-p))/(d-1);
res.textContent = k > 0 ? `${t.kelly}: ${(k*b).toFixed(2)} (${t.aiPredict}: ${(p*100).toFixed(1)}%)` : ‘No positive Kelly stake’;
res.className = k > 0 ? ‘gtw-result’ : ‘gtw-error’;
if (k*b > 0.1*b) res.textContent += ` | ${t.disc}`;
};
} else if (tab === 3) {
body.innerHTML = `
`;
$(‘#ac’).onclick = () => {
const a = parseFloat($(‘#a’).value), b = parseFloat($(‘#b’).value);
if (a <= 1 || b <= 1) { res.textContent = t.error; res.className = 'gtw-error'; return; }
const p = (1 - (1/a + 1/b)) * 100;
res.textContent = `${t.arb}: ${p.toFixed(2)}%`;
res.className = 'gtw-result';
};
} else if (tab === 4) {
body.innerHTML = `
`;
$(‘#pc’).onclick = () => {
const arr = $(‘#legs’).value.split(‘,’).map(s => parseFloat(s.trim())).filter(x => x > 1);
if (!arr.length) { res.textContent = t.error; res.className = ‘gtw-error’; return; }
const combined = arr.reduce((acc,v) => acc*v, 1);
const st = parseFloat($(‘#pst’).value) || 0;
const payoutPart = st ? ` | ${t.payout}: ${(combined*st).toFixed(2)}` : ”;
res.textContent = `${t.combine}: ${combined.toFixed(3)}${payoutPart}`;
res.className = ‘gtw-result’;
};
$(‘#cl’).onclick = () => { $(‘#legs’).value = ”; $(‘#pst’).value = ”; res.textContent = ”; };
} else if (tab === 5) {
body.innerHTML = `
`;
$(‘#bc’).onclick = () => {
const bankroll = parseFloat($(‘#br’).value);
const risk = parseFloat($(‘#rp’).value) / 100;
if (bankroll <= 0 || risk < 0) { res.textContent = t.error; res.className = 'gtw-error'; return; }
const unit = bankroll * risk;
res.textContent = `${t.unit}: ${unit.toFixed(2)}`;
res.className = 'gtw-result';
};
} else {
body.innerHTML = `
`;
$(‘#aic’).onclick = async () => {
const event = $(‘#event’).value;
const odds = parseFloat($(‘#ai-odds’).value);
if (!event || odds <= 1) { res.textContent = t.error; res.className = 'gtw-error'; return; }
const p = await predictWinProbability(event);
const impliedP = 1 / odds;
const ev = p * (odds - 1) - (1 - p);
res.textContent = `${t.aiBets}: EV ${ev.toFixed(3)} (${t.aiPredict}: ${(p*100).toFixed(1)}%, Implied: ${(impliedP*100).toFixed(1)}%)`;
res.className = 'gtw-result';
if (ev > 0) res.textContent += ` | ${t.disc}`;
};
}
}
if (mount) {
try {
render();
const errorEl = document.getElementById(‘gtw-error’);
if (errorEl) errorEl.style.display = ‘none’;
} catch (e) {
console.error(‘GT Widget Render Error:’, e);
const errorEl = document.getElementById(‘gtw-error’);
if (errorEl) errorEl.style.display = ‘block’;
}
} else {
console.error(‘GT Widget: Mount point not found.’);
const errorEl = document.getElementById(‘gtw-error’);
if (errorEl) errorEl.style.display = ‘block’;
}
} catch (e) {
console.error(‘GT Widget Load Error:’, e);
const errorEl = document.getElementById(‘gtw-error’);
if (errorEl) errorEl.style.display = ‘block’;
}
})();
${t.tabs.map((n,i)=>`
${n}
`).join(”)}${t.disc}