Skip to content
×
No WhatsApp Number Found!
document.addEventListener('DOMContentLoaded', function () {
const root = document.getElementById('income-tax-calculator');
if (!root) return; // safe on other pages
// Inputs
const salaryEl = document.getElementById('salary');
const taxCodeEl = document.getElementById('taxCode');
const pensionValueEl = document.getElementById('pensionValue');
const pensionTypeEl = document.getElementById('pensionType');
const niEl = document.getElementById('ni');
const loanEl = document.getElementById('loan');
const scotEl = document.getElementById('scotland');
// Result cards
const basicDiv = document.getElementById('basicRateDiv');
const higherDiv = document.getElementById('higherRateDiv');
const addDiv = document.getElementById('additionalRateDiv');
const netDiv = document.getElementById('netIncomeDiv');
// Details
const taxDetails = document.getElementById('taxDetails');
const detailsContent = document.getElementById('detailsContent');
const fmt = (n) => '£' + Math.round(n).toLocaleString();
// Personal allowance from tax code + taper after £100k
function getPersonalAllowance(income, taxCode) {
let pa = 12570;
const m = (taxCode || '').match(/\d+/);
if (m) pa = parseInt(m[0], 10) * 10;
if (income > 100000) {
pa = Math.max(0, pa - Math.floor((income - 100000) / 2));
}
return pa;
}
function parsePension(val, salary) {
if (!val) return 0;
const v = parseFloat(val) || 0;
return pensionTypeEl.value === 'percent' ? (salary * v) / 100 : v;
}
function calculateTax() {
const salary = +salaryEl.value || 0;
const taxCode = taxCodeEl.value.trim();
const pension = parsePension(pensionValueEl.value, salary);
const ni = +niEl.value || 0;
const loan = +loanEl.value || 0;
const scotland = scotEl.checked;
const personalAllowance = getPersonalAllowance(salary, taxCode);
const taxable = Math.max(0, salary - personalAllowance - pension);
let basic = 0, higher = 0, additional = 0;
const details = [];
if (!scotland) {
// England/Wales/Northern Ireland (simplified)
const basicBand = 37700;
const higherCutoffTaxable = Math.max(basicBand, (125140 - personalAllowance)); // where 45% kicks in
if (taxable <= basicBand) {
basic = taxable * 0.20;
details.push(`£${taxable.toFixed(0)} at 20%`);
} else if (taxable <= higherCutoffTaxable) {
basic = basicBand * 0.20;
higher = (taxable - basicBand) * 0.40;
details.push(`£37700 at 20%`, `£${(taxable - basicBand).toFixed(0)} at 40%`);
} else {
basic = basicBand * 0.20;
higher = Math.max(0, (higherCutoffTaxable - basicBand)) * 0.40;
additional = (taxable - Math.max(basicBand, higherCutoffTaxable)) * 0.45;
details.push(
`£37700 at 20%`,
`£${Math.max(0, higherCutoffTaxable - basicBand).toFixed(0)} at 40%`,
`£${(taxable - Math.max(basicBand, higherCutoffTaxable)).toFixed(0)} at 45%`
);
}
} else {
// Scotland (kept close to your original simple bands)
if (taxable <= 20000) {
basic = taxable * 0.20; details.push(`£${taxable.toFixed(0)} at 20%`);
} else if (taxable <= 50000) {
basic = 20000 * 0.20;
higher = (taxable - 20000) * 0.21;
details.push(`£20000 at 20%`, `£${(taxable - 20000).toFixed(0)} at 21%`);
} else if (taxable <= 150000) {
basic = 20000 * 0.20;
higher = (50000 - 20000) * 0.21 + (taxable - 50000) * 0.41;
details.push(`£20000 at 20%`, `£30000 at 21%`, `£${(taxable - 50000).toFixed(0)} at 41%`);
} else {
basic = 20000 * 0.20;
higher = (50000 - 20000) * 0.21 + (150000 - 50000) * 0.41;
additional = (taxable - 150000) * 0.46;
details.push(`£20000 at 20%`, `£30000 at 21%`, `£100000 at 41%`, `£${(taxable - 150000).toFixed(0)} at 46%`);
}
}
const totalTax = basic + higher + additional + ni + loan;
const netIncome = salary - totalTax - pension;
const monthlyNet = netIncome / 12;
basicDiv.innerHTML = `
Basic Rate Tax
${fmt(basic)}
`;
basicDiv.style.backgroundColor = '#b7f0a6';
higherDiv.innerHTML = `
Higher Rate Tax
${fmt(higher)}
`;
higherDiv.style.backgroundColor = '#ffe7a3';
addDiv.innerHTML = `
Additional Rate Tax
${fmt(additional)}
`;
addDiv.style.backgroundColor = '#ffb3b3';
netDiv.innerHTML = `
Net Income (after tax, NI, loan & pension)
${fmt(netIncome)}
Monthly take-home: ${fmt(monthlyNet)}
`;
detailsContent.innerHTML = details.map(d => `${d}
`).join('');
}
// Events
document.getElementById('calcBtn').addEventListener('click', calculateTax);
document.getElementById('resetBtn').addEventListener('click', () => {
salaryEl.value = 0;
pensionValueEl.value = 0;
pensionTypeEl.value = 'amount';
niEl.value = 0;
loanEl.value = 0;
scotEl.checked = false;
calculateTax();
});
// Toggle details by clicking any tax card
[basicDiv, higherDiv, addDiv].forEach(div => {
div.addEventListener('click', () => {
taxDetails.style.display = (taxDetails.style.display === 'none' || !taxDetails.style.display) ? 'block' : 'none';
});
});
// Initial render
calculateTax();
});