Boston Taxi Rate Calculator
.seo-calculator-widget {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
max-width: 800px;
margin: 2rem auto;
background: #fff;
border: 1px solid #e2e8f0;
border-radius: 8px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
padding: 2rem;
}
.seo-calc-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.5rem;
}
@media (max-width: 600px) {
.seo-calc-grid { grid-template-columns: 1fr; }
}
.seo-input-group {
margin-bottom: 1rem;
}
.seo-input-group label {
display: block;
font-weight: 600;
margin-bottom: 0.5rem;
color: #2d3748;
font-size: 0.9rem;
}
.seo-input-group input {
width: 100%;
padding: 0.75rem;
border: 1px solid #cbd5e0;
border-radius: 4px;
font-size: 1rem;
box-sizing: border-box;
}
.seo-input-group input:focus {
outline: none;
border-color: #4299e1;
box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.2);
}
.seo-calc-btn {
grid-column: 1 / -1;
background-color: #2b6cb0;
color: white;
border: none;
padding: 1rem;
font-size: 1.1rem;
font-weight: bold;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.2s;
width: 100%;
margin-top: 1rem;
}
.seo-calc-btn:hover {
background-color: #2c5282;
}
.seo-results-area {
margin-top: 2rem;
padding: 1.5rem;
background-color: #f7fafc;
border-radius: 6px;
border-left: 5px solid #2b6cb0;
display: none;
}
.seo-result-row {
display: flex;
justify-content: space-between;
margin-bottom: 0.5rem;
font-size: 1.1rem;
color: #4a5568;
}
.seo-result-row.total {
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid #e2e8f0;
font-weight: bold;
font-size: 1.4rem;
color: #2d3748;
}
.seo-article-content {
margin-top: 3rem;
line-height: 1.7;
color: #2d3748;
}
.seo-article-content h2 { color: #1a365d; margin-top: 2rem; }
.seo-article-content h3 { color: #2c5282; margin-top: 1.5rem; }
.seo-article-content ul { padding-left: 1.5rem; }
.seo-article-content li { margin-bottom: 0.5rem; }
function calculateMortgage() {
// 1. Get Input Values
var price = document.getElementById('mortgageHomePrice').value;
var down = document.getElementById('mortgageDownPayment').value;
var rate = document.getElementById('mortgageRate').value;
var term = document.getElementById('mortgageTerm').value;
var tax = document.getElementById('mortgagePropertyTax').value;
var insurance = document.getElementById('mortgageInsurance').value;
// 2. Validate Inputs
if (price === "" || down === "" || rate === "" || term === "") {
alert("Please fill in all required fields (Price, Down Payment, Rate, Term).");
return;
}
// Parse floats
var P = parseFloat(price) – parseFloat(down); // Principal
var annualRate = parseFloat(rate);
var years = parseFloat(term);
var annualTax = (tax === "") ? 0 : parseFloat(tax);
var annualIns = (insurance === "") ? 0 : parseFloat(insurance);
// Edge case: Negative numbers
if (P < 0 || annualRate < 0 || years <= 0) {
alert("Please enter valid positive numbers.");
return;
}
// 3. Calculation Logic
var monthlyRate = (annualRate / 100) / 12;
var numberOfPayments = years * 12;
var monthlyPI = 0;
// Handle zero interest case
if (annualRate === 0) {
monthlyPI = P / numberOfPayments;
} else {
// Standard Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
var numerator = monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments);
var denominator = Math.pow(1 + monthlyRate, numberOfPayments) – 1;
monthlyPI = P * (numerator / denominator);
}
var monthlyTaxVal = annualTax / 12;
var monthlyInsVal = annualIns / 12;
var totalMonthly = monthlyPI + monthlyTaxVal + monthlyInsVal;
// 4. Format and Display Results
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2
});
document.getElementById('displayPI').innerText = formatter.format(monthlyPI);
document.getElementById('displayTax').innerText = formatter.format(monthlyTaxVal);
document.getElementById('displayIns').innerText = formatter.format(monthlyInsVal);
document.getElementById('displayTotal').innerText = formatter.format(totalMonthly);
// Show result div
document.getElementById('mortgageResult').style.display = 'block';
}