{"id":192021,"date":"2026-08-19T13:04:25","date_gmt":"2026-08-19T11:04:25","guid":{"rendered":"https:\/\/newmobility.news\/?page_id=192021"},"modified":"2026-08-23T08:42:44","modified_gmt":"2026-08-23T06:42:44","slug":"tco-calculator","status":"publish","type":"page","link":"https:\/\/newmobility.news\/en\/tco-calculator\/","title":{"rendered":"NMN TCO Calculator"},"content":{"rendered":"\n<style>\n\/* Hide the normal WordPress page title on this calculator page *\/\n#primary .entry-title,\nmain .entry-title,\nmain .wp-block-post-title {\n  display: none !important;\n}\n\n#nmn-tco .hero-links{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin-top:10px}\n#nmn-tco .hero-guide{color:#fff;text-decoration:none;font-size:12px;font-weight:900;border-bottom:1px solid rgba(255,255,255,.45);padding-bottom:1px}\n#nmn-tco .hero-guide:hover{border-bottom-color:#fff}\n#nmn-tco .guide-box{margin-top:16px;padding:13px 14px;border:1px solid #cfe0ff;background:#f5f9ff;border-radius:12px}\n#nmn-tco .guide-box strong{display:block;margin-bottom:4px;color:#183b7a}\n#nmn-tco .guide-box p{margin:0 0 7px;font-size:12px;line-height:1.5;color:#475569}\n#nmn-tco .guide-box a{font-weight:900;color:#0b57d0;text-decoration:none}\n#nmn-tco .guide-box a:hover{text-decoration:underline}\n\n<\/style>\n\n<style>\n#nmn-tco{\n  --red:#d61f26;--red2:#b9151b;--ink:#15171a;--muted:#667085;--line:#e5e7eb;\n  --ok:#147a52;--warn:#b45309;--warnbg:#fff7ed;--auto:#075985;--autobg:#f0f9ff;\n  --ice:#6b7280;--hev:#ca8a04;--phev:#0f766e;--bev:#1d4ed8;\n  font-family:Arial,Helvetica,sans-serif;color:var(--ink);max-width:1220px;margin:24px auto 48px\n}\n#nmn-tco *{box-sizing:border-box}\n#nmn-tco .hero{color:#fff;border-radius:22px;padding:28px 26px;background:linear-gradient(135deg,#111318 0%,#20242b 48%,var(--red) 100%);box-shadow:0 8px 24px rgba(17,24,39,.10)}\n#nmn-tco .eyebrow{font-size:12px;text-transform:uppercase;letter-spacing:.12em;font-weight:800;color:#ffd9da}\n#nmn-tco h2{margin:7px 0 9px;font-size:34px;line-height:1.08;color:#fff}\n#nmn-tco .sub{margin:0;max-width:860px;color:#f3f4f6;line-height:1.5}\n#nmn-tco .pills{display:flex;flex-wrap:wrap;gap:8px;margin-top:15px}\n#nmn-tco .hero-pill{padding:7px 11px;border-radius:999px;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.14);font-size:12px;font-weight:700}\n#nmn-tco .panel{margin-top:18px;background:#fff;border:1px solid var(--line);border-radius:16px;padding:18px;box-shadow:0 7px 20px rgba(17,24,39,.06)}\n#nmn-tco .panel-title{margin:0 0 14px;font-size:21px;font-weight:800}\n#nmn-tco .tco-explain{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(280px,.75fr);gap:16px;align-items:start}\n#nmn-tco .tco-copy p{margin:0 0 10px;font-size:13px;line-height:1.55;color:#475467}\n#nmn-tco .tco-flow{display:flex;flex-wrap:wrap;gap:7px;align-items:center;margin-top:12px}\n#nmn-tco .tco-chip{padding:7px 9px;border-radius:999px;background:#f3f4f6;border:1px solid var(--line);font-size:11px;font-weight:800;color:#374151}\n#nmn-tco .tco-plus{font-size:13px;font-weight:900;color:#98a2b3}\n#nmn-tco .tco-formula{border:1px solid #bfdbfe;background:#eff6ff;border-radius:13px;padding:14px}\n#nmn-tco .tco-formula strong{display:block;margin-bottom:7px;font-size:13px;color:#1e3a8a}\n#nmn-tco .tco-eq{font-size:13px;line-height:1.55;color:#1e3a8a;font-weight:800}\n#nmn-tco .tco-note{margin-top:9px;font-size:11px;line-height:1.45;color:#475569}\n#nmn-tco .tco-link{display:inline-block;margin-top:7px;font-size:11px;font-weight:800;color:#075985;text-decoration:none}\n#nmn-tco .tco-link:hover{text-decoration:underline}\n#nmn-tco .legend{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}\n#nmn-tco .legend-item{border:1px solid var(--line);border-radius:12px;padding:12px;background:#fafafa}\n#nmn-tco .legend-top{display:flex;align-items:center;gap:8px;margin-bottom:5px}\n#nmn-tco .legend-icon,#nmn-tco .car-icon{display:flex;align-items:center;justify-content:center;color:#fff}\n#nmn-tco .legend-icon{width:27px;height:27px;border-radius:8px;font-size:14px}\n#nmn-tco .legend-item strong{font-size:12px}\n#nmn-tco .legend-item p{font-size:11px;line-height:1.4;color:#59606b;margin:0}\n#nmn-tco .toggle{display:flex;gap:9px;flex-wrap:wrap;margin-bottom:14px}\n#nmn-tco button{font:inherit}\n#nmn-tco .country{border:1px solid #d1d5db;background:#fff;padding:10px 14px;border-radius:999px;font-weight:800;cursor:pointer;color:#222}\n#nmn-tco .country.active{background:var(--red);border-color:var(--red);color:#fff}\n#nmn-tco .grid{display:grid;gap:14px}\n#nmn-tco .global{grid-template-columns:repeat(4,minmax(0,1fr))}\n#nmn-tco .cars{grid-template-columns:repeat(3,minmax(0,1fr));margin-top:18px}\n#nmn-tco .cars.two-cars{grid-template-columns:repeat(2,minmax(0,1fr))}\n#nmn-tco .results.two-cars{grid-template-columns:repeat(2,minmax(0,1fr))}\n#nmn-tco .card-head-actions{display:flex;align-items:center;gap:7px}\n#nmn-tco .add-car{border:1px dashed #94a3b8;background:#fff;color:#334155;border-radius:11px;padding:11px 15px;font-size:13px;font-weight:900;cursor:pointer}\n#nmn-tco .add-car:hover{border-color:var(--red);color:var(--red)}\n#nmn-tco .remove-car{border:1px solid #fecaca;background:#fff;color:#b91c1c;border-radius:8px;padding:6px 8px;font-size:10px;font-weight:900;cursor:pointer}\n#nmn-tco .remove-car:hover{background:#fef2f2}\n#nmn-tco .card{background:#fff;border:1px solid var(--line);border-radius:17px;overflow:hidden;box-shadow:0 7px 20px rgba(17,24,39,.06)}\n#nmn-tco .card-head{display:flex;align-items:center;justify-content:space-between;padding:15px 17px;border-bottom:1px solid var(--line)}\n#nmn-tco .car-title{display:flex;align-items:center;gap:9px}\n#nmn-tco .car-icon{width:36px;height:36px;border-radius:10px;font-size:18px}\n#nmn-tco .type-ice{background:var(--ice)}\n#nmn-tco .type-hev{background:var(--hev)}\n#nmn-tco .type-phev{background:var(--phev)}\n#nmn-tco .type-bev{background:var(--bev)}\n#nmn-tco .badge{padding:6px 9px;border-radius:999px;color:#fff;font-size:11px;font-weight:800}\n#nmn-tco .card-body{padding:16px 17px}\n#nmn-tco .field{margin-bottom:11px}\n#nmn-tco label{display:block;margin-bottom:5px;font-size:12px;font-weight:800;color:#4b5563}\n#nmn-tco input,#nmn-tco select{width:100%;padding:10px 11px;border:1px solid #d1d5db;border-radius:9px;background:#fff;font-size:14px;color:#111}\n#nmn-tco input:focus,#nmn-tco select:focus{outline:2px solid rgba(214,31,38,.14);border-color:var(--red)}\n#nmn-tco .row2{display:grid;grid-template-columns:1fr 1fr;gap:10px}\n#nmn-tco .section{margin:15px 0 8px;font-size:11px;font-weight:900;text-transform:uppercase;letter-spacing:.08em;color:#6b7280}\n#nmn-tco .hint{font-size:11px;color:var(--muted);line-height:1.4;margin-top:4px}\n#nmn-tco .power-help{margin-top:6px;padding:8px 10px;border-radius:9px;background:#f8fafc;border:1px solid var(--line);font-size:11px;line-height:1.4;color:#475569}\n#nmn-tco .usedbox{margin:4px 0 13px;padding:11px 12px;border:1px solid #e9d5ff;background:#faf5ff;border-radius:11px}\n#nmn-tco .usedbox .section{color:#6d28d9;margin-top:0}\n#nmn-tco .note{margin-top:9px;padding:11px 12px;border-radius:10px;background:#fff7ed;border-left:4px solid #fb923c;font-size:12px;line-height:1.45;color:#7c2d12}\n#nmn-tco .taxbox{margin-top:6px;padding:11px;border:1px solid var(--line);border-radius:11px;background:#fafafa}\n#nmn-tco .taxbox.auto{border-color:#7dd3fc;background:var(--autobg)}\n#nmn-tco .taxbox.manual{border-color:#fdba74;background:var(--warnbg)}\n#nmn-tco .taxbadge{display:inline-flex;align-items:center;gap:5px;padding:4px 8px;border-radius:999px;font-size:10px;font-weight:900;text-transform:uppercase;letter-spacing:.06em}\n#nmn-tco .taxbadge.auto{background:#e0f2fe;color:#075985}\n#nmn-tco .taxbadge.manual{background:#ffedd5;color:#9a3412}\n#nmn-tco .tax-summary{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:9px 0}\n#nmn-tco .tax-summary div{background:#fff;border:1px solid var(--line);border-radius:9px;padding:9px}\n#nmn-tco .tax-summary span{display:block;font-size:10px;color:var(--muted);font-weight:800;text-transform:uppercase;letter-spacing:.04em}\n#nmn-tco .tax-summary b{display:block;font-size:16px;margin-top:3px}\n#nmn-tco details.tax-details{margin-top:8px}\n#nmn-tco details.tax-details summary{cursor:pointer;font-size:12px;font-weight:800;color:#374151}\n#nmn-tco .tax-inner{margin-top:9px;padding-top:9px;border-top:1px solid var(--line)}\n#nmn-tco .official-link{display:inline-block;margin-top:5px;font-size:11px;font-weight:800;color:#075985;text-decoration:none}\n#nmn-tco .official-link:hover{text-decoration:underline}\n#nmn-tco .actions{display:flex;gap:11px;align-items:center;flex-wrap:wrap;margin-top:16px}\n#nmn-tco .action{border:0;border-radius:11px;padding:12px 17px;background:linear-gradient(180deg,var(--red),var(--red2));color:#fff;font-size:15px;font-weight:800;cursor:pointer;box-shadow:0 7px 16px rgba(214,31,38,.22)}\n#nmn-tco .pdf-action{border:1px solid #1f2937;border-radius:11px;padding:11px 15px;background:#1f2937;color:#fff;font-size:13px;font-weight:900;cursor:pointer}\n#nmn-tco .pdf-action:hover{background:#111827}\n#nmn-tco .pdf-status{font-size:11px;color:var(--muted)}\n\n#nmn-tco .small{font-size:12px;color:var(--muted)}\n#nmn-tco .results{grid-template-columns:repeat(3,minmax(0,1fr))}\n#nmn-tco .result{position:relative;border:1px solid var(--line);border-radius:14px;padding:15px;background:#fff;min-height:145px}\n#nmn-tco .result.best{border:2px solid var(--ok)}\n#nmn-tco .result.best:after{content:'Best choice';position:absolute;right:0;top:0;background:var(--ok);color:#fff;padding:6px 9px;border-bottom-left-radius:9px;font-size:10px;font-weight:900;text-transform:uppercase;letter-spacing:.06em}\n#nmn-tco .type-label{font-size:11px;font-weight:900;text-transform:uppercase;letter-spacing:.08em;color:#6b7280}\n#nmn-tco .status{display:inline-block;margin-top:5px;padding:4px 7px;border-radius:999px;background:#f3f4f6;font-size:10px;font-weight:900;text-transform:uppercase;letter-spacing:.05em;color:#4b5563}\n#nmn-tco .status.used,#nmn-tco .status.demo{background:#f3e8ff;color:#6d28d9}\n#nmn-tco .valuation-box{margin:10px 0;padding:10px 11px;border:1px solid #dbe3ee;border-radius:10px;background:#f8fafc}\n#nmn-tco .valuation-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}\n#nmn-tco .valuation-item{padding:8px;border-radius:8px;background:#fff;border:1px solid #e5e7eb}\n#nmn-tco .valuation-item span{display:block;font-size:10px;color:#6b7280;line-height:1.25}\n#nmn-tco .valuation-item b{display:block;margin-top:3px;font-size:13px;color:#111827}\n#nmn-tco .auto-resale{display:flex!important;align-items:flex-start;gap:7px;margin-top:9px;font-size:11px!important;font-weight:800!important;color:#374151!important;text-transform:none!important;letter-spacing:0!important}\n#nmn-tco .auto-resale input{width:auto!important;margin-top:2px}\n\n\/* v6.0: Private \/ Business with indicative business calculation *\/\n#nmn-tco .buyer-mode-wrap{margin:12px 0 2px;padding-top:12px;border-top:1px solid var(--line)}\n#nmn-tco .buyer-label{font-size:12px;font-weight:900;color:#374151;margin-bottom:7px}\n#nmn-tco .buyer-switch{display:flex;gap:8px;flex-wrap:wrap}\n#nmn-tco .buyer-btn{border:1px solid #d1d5db;background:#fff;color:#1f2937;border-radius:10px;padding:9px 14px;font-weight:900;cursor:pointer;min-width:124px}\n#nmn-tco .buyer-btn.active{background:var(--red);border-color:var(--red);color:#fff;box-shadow:0 5px 12px rgba(214,31,38,.14)}\n#nmn-tco .buyer-help{display:none}\n#nmn-tco .business-panel{margin-top:10px;border:1px solid #fecaca;background:#fffafa;border-radius:12px;padding:12px 13px}\n#nmn-tco .business-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:9px}\n#nmn-tco .business-title{font-size:14px;font-weight:900;color:#991b1b}\n#nmn-tco .business-subtitle{font-size:10.5px;color:var(--muted);font-weight:600}\n#nmn-tco .business-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;align-items:end}\n#nmn-tco .business-note{margin-top:8px;font-size:10.5px;line-height:1.4;color:#6b7280}\n#nmn-tco .business-result-preview{margin-top:11px;padding:9px 10px;border:1px dashed #fca5a5;background:#fff7f7;border-radius:10px;font-size:11px;line-height:1.45;color:#7f1d1d}\n#nmn-tco .business-result-preview strong{display:block;margin-bottom:3px;color:#991b1b}\n#nmn-tco .business-car-field{margin-top:10px;padding-top:10px;border-top:1px dashed #fecaca}\n#nmn-tco .business-car-field .section{color:#991b1b}\n#nmn-tco .pdf-action:disabled{opacity:.48;cursor:not-allowed;background:#6b7280;border-color:#6b7280}\n@media(max-width:760px){#nmn-tco .business-grid{grid-template-columns:1fr}}\n@media(max-width:600px){#nmn-tco .business-grid{grid-template-columns:1fr}#nmn-tco .buyer-btn{flex:1 1 0;min-width:0}}\n\n@media(max-width:700px){#nmn-tco .valuation-grid{grid-template-columns:1fr}}\n\n#nmn-tco .monthly{font-size:31px;font-weight:900;margin:8px 0 2px}\n#nmn-tco .metric{display:flex;justify-content:space-between;gap:12px;padding:7px 0;border-bottom:1px solid #f1f2f4;font-size:13px}\n#nmn-tco .metric:last-child{border-bottom:0}\n#nmn-tco .winner{margin-top:15px;padding:12px 13px;border-radius:11px;background:#f5faf7;border-left:4px solid var(--ok);line-height:1.5}\n#nmn-tco .comparison{margin-top:11px;padding:12px 13px;border:1px solid var(--line);border-radius:11px;background:#fafafa;font-size:13px;line-height:1.5}\n#nmn-tco .bars{margin-top:15px}\n#nmn-tco .bar-row{display:grid;grid-template-columns:120px 1fr 95px;gap:10px;align-items:center;margin:8px 0;font-size:12px}\n#nmn-tco .track{height:12px;background:#eceff1;border-radius:99px;overflow:hidden}\n#nmn-tco .fill{height:100%;border-radius:99px}\n#nmn-tco .disclaimer{font-size:11px;color:#6b7280;line-height:1.5;margin-top:15px}\n#nmn-tco .copyright{margin-top:10px;padding-top:10px;border-top:1px solid #e5e7eb;font-size:10px;line-height:1.45;color:#8a94a3;text-align:center}\n#nmn-tco .hero .sub{color:#ffffff}\n#nmn-tco .hero .eyebrow{color:#f3c7cb}\n#nmn-tco .hero .hero-compact{margin:7px 0 0;max-width:980px;font-size:14px;line-height:1.55;color:#e5e7eb}\n#nmn-tco .hero .hero-compact strong{color:#ffffff}\n#nmn-tco .hero .hero-powertrain{margin-top:10px;font-size:12px;line-height:1.5;color:#d1d5db}\n#nmn-tco .hero .hero-powertrain strong{color:#ffffff}\n#nmn-tco .compact-pills{margin-top:12px}\n#nmn-tco .hero .hero-jump{display:inline-block;margin-top:11px;font-size:12px;font-weight:800;color:#22c7b8;text-decoration:none}\n#nmn-tco .hero .hero-jump:hover{color:#5eead4;text-decoration:underline}\n#nmn-tco .legal-panel{padding-top:14px;padding-bottom:14px}\n#nmn-tco #how-tco-works{scroll-margin-top:90px}\n#nmn-tco .advanced-collapsed{display:none!important}\n#nmn-tco .fine-tune-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:12px 0 4px}\n#nmn-tco .fine-tune-btn{appearance:none;border:1px solid #b9c5d3;background:#f8fafc;color:#1f2937;border-radius:9px;padding:8px 11px;font-size:11px;font-weight:800;cursor:pointer}\n#nmn-tco .fine-tune-btn:hover{background:#eef2f7}\n#nmn-tco .fine-tune-btn[aria-expanded=\"true\"]{background:#111827;color:#fff;border-color:#111827}\n#nmn-tco .fine-tune-help{font-size:10.5px;line-height:1.4;color:#6b7280}\n#nmn-tco .global-advanced{margin-top:12px;padding-top:12px;border-top:1px dashed #d6dee8}\n#nmn-tco .car-default-note{margin:7px 0 3px;padding:8px 10px;border-radius:8px;background:#f8fafc;border:1px solid #e5e7eb;font-size:10.5px;line-height:1.4;color:#64748b}\n#nmn-tco .assumption-note{margin:10px 0 0;padding:9px 11px;border-radius:9px;background:#f8fafc;border:1px solid #e5e7eb;font-size:11px;line-height:1.45;color:#64748b}\n#nmn-tco .simple-start{margin-top:10px;font-size:11px;line-height:1.45;color:#d1d5db}\n#nmn-tco .simple-start strong{color:#fff}\n\n\n\n#nmn-tco .hidden{display:none!important}\n@media(max-width:960px){\n  #nmn-tco .global{grid-template-columns:1fr 1fr}\n  #nmn-tco .cars,#nmn-tco .results{grid-template-columns:1fr}\n  #nmn-tco .legend{grid-template-columns:1fr 1fr}\n  #nmn-tco .bar-row{grid-template-columns:90px 1fr 90px}\n}\n@media(max-width:560px){\n  #nmn-tco .global,#nmn-tco .row2,#nmn-tco .legend,#nmn-tco .tax-summary,#nmn-tco .tco-explain{grid-template-columns:1fr}\n  #nmn-tco h2{font-size:28px}\n  #nmn-tco .hero{padding:22px 18px}\n}\n<\/style>\n\n<div id=\"nmn-tco\">\n  <div class=\"hero\">\n    <div class=\"eyebrow\">Newmobility.news<\/div>\n    <h2>NMN TCO Calculator<\/h2>\n    <p class=\"sub\"><strong>Find out what your next car will actually cost \u2014 not just what it costs to buy.<\/strong><\/p>\n    <p class=\"hero-compact\">Compare two or three new, demo or used cars over the same ownership period. NMN adds <strong>depreciation, fuel or electricity, maintenance, insurance, taxes and extra repair\/wear costs<\/strong> to estimate total cost, monthly cost and cost per kilometre.<\/p>\n    <div class=\"hero-powertrain\"><strong>Powertrains:<\/strong> ICE = petrol\/diesel \u00b7 HEV = self-charging hybrid \u00b7 PHEV = plug-in hybrid \u00b7 BEV = fully electric<\/div>\n    <div class=\"pills compact-pills\">\n      <span class=\"hero-pill\">\ud83d\ude98 2 or 3 cars<\/span>\n      <span class=\"hero-pill\">\u2728 New \u00b7 Demo \u00b7 Used<\/span>\n      <span class=\"hero-pill\">\ud83c\udde7\ud83c\uddea Belgium \u00b7 \ud83c\uddf3\ud83c\uddf1 Netherlands \u00b7 \ud83c\uddf1\ud83c\uddfa Luxembourg<\/span>\n      <span class=\"hero-pill\">Build v6.0.2<\/span>\n    <\/div>\n    <div class=\"simple-start\"><strong>Start with the basics.<\/strong> NMN fills in sensible default assumptions; you can fine-tune every important cost later.<\/div>\n    <div class=\"hero-links\">\n      <a class=\"hero-jump\" href=\"#how-tco-works\">How does TCO work? \u2193<\/a>\n      <a class=\"hero-guide\" href=\"https:\/\/newmobility.news\/2026\/08\/22\/nmn-launches-tco-calculator-what-will-your-next-car-really-cost\/\">How the NMN TCO Calculator works \u2192<\/a>\n    <\/div>\n  <\/div>\n\n  <div class=\"panel\">\n    <div class=\"panel-title\">\u2699\ufe0f Your setup<\/div>\n    <div class=\"toggle\">\n      <button type=\"button\" class=\"country active\" data-country=\"BE\">\ud83c\udde7\ud83c\uddea Belgium<\/button>\n      <button type=\"button\" class=\"country\" data-country=\"NL\">\ud83c\uddf3\ud83c\uddf1 Netherlands<\/button>\n      <button type=\"button\" class=\"country\" data-country=\"LU\">\ud83c\uddf1\ud83c\uddfa Luxembourg<\/button>\n    <\/div>\n    <div class=\"grid global\">\n      <div class=\"field\" data-be-only><label>Belgian region<\/label><select data-id=\"beRegion\"><option>Flanders<\/option><option>Brussels<\/option><option>Wallonia<\/option><\/select><\/div>\n      <div class=\"field hidden\" data-nl-only><label>Dutch province<\/label><select data-id=\"nlProvince\"><option>Drenthe<\/option><option>Flevoland<\/option><option>Friesland<\/option><option>Gelderland<\/option><option>Groningen<\/option><option selected>Limburg<\/option><option>Noord-Brabant<\/option><option>Noord-Holland<\/option><option>Overijssel<\/option><option>Utrecht<\/option><option>Zeeland<\/option><option>Zuid-Holland<\/option><\/select><\/div>\n      <div class=\"field\"><label>Ownership period<\/label><select data-id=\"years\"><option>3<\/option><option selected>5<\/option><option>6<\/option><option>8<\/option><\/select><\/div>\n      <div class=\"field\"><label>Kilometres per year<\/label><input data-id=\"km\" type=\"text\" inputmode=\"decimal\" value=\"20000\" step=\"1000\"><\/div>\n    <\/div>\n\n    <div class=\"fine-tune-row\">\n      <button type=\"button\" class=\"fine-tune-btn\" data-action=\"toggle-global-advanced\" aria-expanded=\"false\">\uff0b Fine-tune energy prices<\/button>\n      <span class=\"fine-tune-help\">Optional: use your own fuel and charging prices instead of NMN\u2019s country defaults.<\/span>\n    <\/div>\n\n    <div class=\"global-advanced advanced-collapsed\" data-global-advanced>\n      <div class=\"grid global\">\n        <div class=\"field\"><label>Petrol price \u20ac\/l<\/label><input data-id=\"petrolPrice\" type=\"text\" inputmode=\"decimal\" value=\"1.81\" step=\"0.01\"><\/div>\n        <div class=\"field\"><label>Diesel price \u20ac\/l<\/label><input data-id=\"dieselPrice\" type=\"text\" inputmode=\"decimal\" value=\"2.16\" step=\"0.01\"><\/div>\n        <div class=\"field\"><label>Home electricity \u20ac\/kWh<\/label><input data-id=\"homePrice\" type=\"text\" inputmode=\"decimal\" value=\"0.35\" step=\"0.01\"><\/div>\n        <div class=\"field\"><label>Public AC \u20ac\/kWh<\/label><input data-id=\"publicPrice\" type=\"text\" inputmode=\"decimal\" value=\"0.52\" step=\"0.01\"><\/div>\n        <div class=\"field\"><label>Fast charging \u20ac\/kWh<\/label><input data-id=\"fastPrice\" type=\"text\" inputmode=\"decimal\" value=\"0.72\" step=\"0.01\"><\/div>\n      <\/div>\n      <div class=\"hint\" data-id=\"energyPriceNote\" style=\"margin-top:8px\"><strong>Energy-price defaults:<\/strong> latest available national averages\/benchmarks are loaded when you switch country. Fuel: EU weekly averages (13 Aug 2026). Home electricity: latest Eurostat household benchmark (H2 2025). Public AC\/fast charging: latest available market averages. All values remain editable.<\/div>\n      <div class=\"hint\" style=\"margin-top:8px\">Number formats: both Benelux and international notation are accepted, for example <strong>14.950<\/strong> or <strong>14950<\/strong> for \u20ac14,950 and <strong>5,2<\/strong> or <strong>5.2<\/strong> for consumption.<\/div>\n    <\/div>\n    <div class=\"note\" data-id=\"countryNote\"><\/div>\n\n    <div class=\"buyer-mode-wrap\">\n      <div class=\"buyer-label\">Who is buying the car?<\/div>\n      <div class=\"buyer-switch\" role=\"group\" aria-label=\"Buyer type\">\n        <button type=\"button\" class=\"buyer-btn active\" data-buyer=\"private\" aria-pressed=\"true\">\ud83d\udc64 Private<\/button>\n        <button type=\"button\" class=\"buyer-btn\" data-buyer=\"business\" aria-pressed=\"false\">\ud83d\udcbc Business<\/button>\n      <\/div>\n      <div class=\"buyer-help\" data-id=\"buyerHelp\"><\/div>\n    <\/div>\n\n    <div class=\"business-panel hidden\" data-id=\"businessPanel\">\n      <div class=\"business-head\">\n        <div class=\"business-title\">\ud83d\udcbc Business assumptions<\/div>\n        \n      <\/div>\n      <div class=\"business-grid\">\n        <div class=\"field\"><label>VAT recoverable %<\/label><input data-id=\"bizVatRecoverable\" type=\"text\" inputmode=\"decimal\" value=\"50\"><\/div>\n        <div class=\"field\"><label>Corporate tax rate %<\/label><input data-id=\"bizCorpTax\" type=\"text\" inputmode=\"decimal\" value=\"25\"><\/div>\n        <div class=\"field\"><label>Private use \/ Benefit in kind<\/label><select data-id=\"bizBikMode\"><option selected value=\"off\">Off<\/option><option value=\"manual\">Manual annual amount<\/option><\/select><\/div>\n      <\/div>\n      <div class=\"field hidden\" data-id=\"bizBikAmountWrap\" style=\"max-width:330px;margin-top:8px\"><label>Benefit in kind \u20ac\/year<\/label><input data-id=\"bizBikAmount\" type=\"text\" inputmode=\"decimal\" value=\"0\"><\/div>\n      <div class=\"business-note\">Business estimates depend on applicable tax rules. Purchase VAT status and deductibility are set per car. Benefit in kind is shown separately and is not included in company cost.<\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"grid cars two-cars\" data-id=\"carsGrid\">\n\n    <!-- CAR 1 -->\n    <div class=\"card\" data-card=\"1\">\n      <div class=\"card-head\"><div class=\"car-title\"><div class=\"car-icon type-ice\" data-role=\"icon\">\u26fd<\/div><div><strong>Car 1<\/strong><div class=\"small\" data-role=\"subtitle\">Combustion engine<\/div><\/div><\/div><span class=\"badge type-ice\" data-role=\"badge\">ICE<\/span><\/div>\n      <div class=\"card-body\">\n        <div class=\"row2\"><div class=\"field\"><label>Name<\/label><input data-id=\"c1Name\" value=\"Car 1\"><\/div><div class=\"field\"><label>Powertrain<\/label><select data-id=\"c1Type\"><option selected>ICE<\/option><option>HEV<\/option><option>PHEV<\/option><option>BEV<\/option><\/select><div class=\"power-help\" data-role=\"powerHelp\"><\/div><\/div><\/div>\n        <div class=\"row2\"><div class=\"field\"><label>Vehicle status<\/label><select data-id=\"c1Status\"><option value=\"new\">New<\/option><option value=\"demo\">Demo \/ nearly new<\/option><option value=\"used\">Used<\/option><\/select><\/div><div class=\"field\"><label>Purchase price today \u20ac<\/label><input data-id=\"c1Price\" type=\"text\" inputmode=\"decimal\" value=\"32000\"><\/div><\/div>\n        <div class=\"fine-tune-row\">\n          <button type=\"button\" class=\"fine-tune-btn\" data-action=\"toggle-car-advanced\" data-car=\"1\" aria-expanded=\"false\">\uff0b Fine-tune this car<\/button>\n          <span class=\"fine-tune-help\">Resale, charging mix, maintenance, insurance and tax details.<\/span>\n        <\/div>\n        <div class=\"car-default-note\">NMN uses default assumptions for fields you don\u2019t fine-tune. Consumption and essential vehicle details stay visible.<\/div>\n        <div data-new-only=\"c1\" class=\"car-advanced advanced-collapsed\" data-car-advanced=\"1\"><div class=\"field\"><label>Expected residual value %<\/label><input data-id=\"c1Residual\" type=\"text\" inputmode=\"decimal\" value=\"42\"><\/div><\/div>\n        <div class=\"usedbox hidden\" data-used-only=\"c1\">\n          <div class=\"section\">\ud83d\ude98 Used \/ demo details<\/div>\n          <div class=\"row2\">\n            <div class=\"field\">\n              <label>First registration date<\/label>\n              <input data-id=\"c1UsedFirstReg\" type=\"date\" value=\"\">\n              <div class=\"hint\">Used to estimate vehicle age and regional taxes.<\/div>\n            <\/div>\n            <div class=\"field\">\n              <label>Current mileage km<\/label>\n              <input data-id=\"c1CurrentKm\" type=\"text\" inputmode=\"decimal\" value=\"\" placeholder=\"e.g. 38000\">\n              <div class=\"hint\">Enter the odometer reading today.<\/div>\n            <\/div>\n          <\/div>\n          <div class=\"valuation-box\">\n            <div class=\"valuation-grid\">\n              <div class=\"valuation-item\"><span>Expected mileage at resale<\/span><b data-used-mileage=\"1\">\u2014<\/b><\/div>\n              <div class=\"valuation-item\"><span>Vehicle age at resale<\/span><b data-used-age=\"1\">\u2014<\/b><\/div>\n              <div class=\"valuation-item\"><span>NMN suggested resale value<\/span><b data-used-suggested=\"1\">\u2014<\/b><\/div>\n            <\/div>\n            <div class=\"car-advanced advanced-collapsed\" data-car-advanced=\"1\">\n              <label class=\"auto-resale\">\n                <input data-id=\"c1AutoResale\" type=\"checkbox\" checked>\n                <span>Use the NMN suggested resale value automatically<\/span>\n              <\/label>\n              <div class=\"hint\">Indicative NMN heuristic, not a market valuation. Untick to enter your own resale estimate.<\/div>\n              <div class=\"row2\" style=\"margin-top:9px\">\n                <div class=\"field\"><label>Expected resale value \u20ac<\/label><input data-id=\"c1ResaleEuro\" type=\"text\" inputmode=\"decimal\" value=\"14500\"><\/div>\n                <div class=\"field\"><label>Extra repairs \/ wear \u20ac\/yr<\/label><input data-id=\"c1Repairs\" type=\"text\" inputmode=\"decimal\" value=\"400\"><\/div>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n        <div data-type-block=\"ICE\" data-prefix=\"c1\"><div class=\"row2\"><div class=\"field\"><label>Fuel<\/label><select data-id=\"c1Fuel\"><option value=\"petrol\">Petrol<\/option><option value=\"diesel\">Diesel<\/option><\/select><\/div><div class=\"field\"><label>Consumption l\/100 km<\/label><input data-id=\"c1FuelCons\" type=\"text\" inputmode=\"decimal\" value=\"6.5\" step=\"0.1\"><\/div><\/div><\/div>\n        <div data-type-block=\"HEV\" data-prefix=\"c1\" class=\"hidden\"><div class=\"row2\"><div class=\"field\"><label>Fuel<\/label><select data-id=\"c1HevFuel\"><option value=\"petrol\">Petrol<\/option><option value=\"diesel\">Diesel<\/option><\/select><\/div><div class=\"field\"><label>Consumption l\/100 km<\/label><input data-id=\"c1HevFuelCons\" type=\"text\" inputmode=\"decimal\" value=\"4.8\" step=\"0.1\"><\/div><\/div><\/div>\n        <div data-type-block=\"PHEV\" data-prefix=\"c1\" class=\"hidden\"><div class=\"row2\"><div class=\"field\"><label>Fuel use l\/100 km*<\/label><input data-id=\"c1PhevFuelCons\" type=\"text\" inputmode=\"decimal\" value=\"6.0\" step=\"0.1\"><\/div><div class=\"field\"><label>Electric use kWh\/100 km<\/label><input data-id=\"c1PhevElecCons\" type=\"text\" inputmode=\"decimal\" value=\"19.0\" step=\"0.1\"><\/div><\/div><div class=\"field\"><label>Kilometres driven electrically %<\/label><input data-id=\"c1PhevElecShare\" type=\"text\" inputmode=\"decimal\" value=\"65\"><\/div><div class=\"car-advanced advanced-collapsed\" data-car-advanced=\"1\"><div class=\"section\">\u26a1 Charging mix<\/div><div class=\"row2\"><div class=\"field\"><label>Home %<\/label><input data-id=\"c1PhevHome\" type=\"text\" inputmode=\"decimal\" value=\"80\"><\/div><div class=\"field\"><label>Public AC %<\/label><input data-id=\"c1PhevPublic\" type=\"text\" inputmode=\"decimal\" value=\"20\"><\/div><\/div><\/div><div class=\"hint\">*Fuel use applies to combustion-engine kilometres.<\/div><\/div>\n        <div data-type-block=\"BEV\" data-prefix=\"c1\" class=\"hidden\"><div class=\"field\"><label>Consumption kWh\/100 km<\/label><input data-id=\"c1BevCons\" type=\"text\" inputmode=\"decimal\" value=\"17.5\" step=\"0.1\"><\/div><div class=\"car-advanced advanced-collapsed\" data-car-advanced=\"1\"><div class=\"section\">\u26a1 Charging mix<\/div><div class=\"row2\"><div class=\"field\"><label>Home %<\/label><input data-id=\"c1BevHome\" type=\"text\" inputmode=\"decimal\" value=\"70\"><\/div><div class=\"field\"><label>Public AC %<\/label><input data-id=\"c1BevPublic\" type=\"text\" inputmode=\"decimal\" value=\"20\"><\/div><\/div><div class=\"field\"><label>Fast charging %<\/label><input data-id=\"c1BevFast\" type=\"text\" inputmode=\"decimal\" value=\"10\"><\/div><\/div><\/div>\n        <div class=\"car-advanced advanced-collapsed\" data-car-advanced=\"1\"><div class=\"section\">\ud83d\udee0\ufe0f Annual fixed costs<\/div><div class=\"business-car-field hidden\" data-business-only><div class=\"section\">\ud83d\udcbc Business<\/div><div class=\"row2\"><div class=\"field\"><label>Purchase VAT status<\/label><select data-id=\"c1BizVatStatus\"><option value=\"deductible\" selected>VAT deductible<\/option><option value=\"margin\">Margin \/ no recoverable purchase VAT<\/option><\/select><div class=\"hint\">Choose \u201cMargin\u201d for a margin-scheme or other purchase without recoverable VAT.<\/div><\/div><div class=\"field\"><label>Tax-deductible vehicle cost %<\/label><input data-id=\"c1BizDeductible\" type=\"text\" inputmode=\"decimal\" value=\"100\"><div class=\"hint\">Set separately for this car. Used to estimate the corporate tax saving.<\/div><\/div><\/div><\/div><div class=\"row2\"><div class=\"field\"><label>Maintenance \u20ac\/yr<\/label><input data-id=\"c1Maint\" type=\"text\" inputmode=\"decimal\" value=\"650\"><\/div><div class=\"field\"><label>Insurance \u20ac\/yr<\/label><input data-id=\"c1Ins\" type=\"text\" inputmode=\"decimal\" value=\"850\"><\/div><\/div>\n        <div data-tax-placeholder=\"1\"><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- CAR 2 -->\n    <div class=\"card\" data-card=\"2\">\n      <div class=\"card-head\"><div class=\"car-title\"><div class=\"car-icon type-hev\" data-role=\"icon\">\u267b\ufe0f<\/div><div><strong>Car 2<\/strong><div class=\"small\" data-role=\"subtitle\">Full hybrid<\/div><\/div><\/div><span class=\"badge type-hev\" data-role=\"badge\">HEV<\/span><\/div>\n      <div class=\"card-body\">\n        <div class=\"row2\"><div class=\"field\"><label>Name<\/label><input data-id=\"c2Name\" value=\"Car 2\"><\/div><div class=\"field\"><label>Powertrain<\/label><select data-id=\"c2Type\"><option>ICE<\/option><option selected>HEV<\/option><option>PHEV<\/option><option>BEV<\/option><\/select><div class=\"power-help\" data-role=\"powerHelp\"><\/div><\/div><\/div>\n        <div class=\"row2\"><div class=\"field\"><label>Vehicle status<\/label><select data-id=\"c2Status\"><option value=\"new\">New<\/option><option value=\"demo\">Demo \/ nearly new<\/option><option value=\"used\">Used<\/option><\/select><\/div><div class=\"field\"><label>Purchase price today \u20ac<\/label><input data-id=\"c2Price\" type=\"text\" inputmode=\"decimal\" value=\"35000\"><\/div><\/div>\n        <div class=\"fine-tune-row\">\n          <button type=\"button\" class=\"fine-tune-btn\" data-action=\"toggle-car-advanced\" data-car=\"2\" aria-expanded=\"false\">\uff0b Fine-tune this car<\/button>\n          <span class=\"fine-tune-help\">Resale, charging mix, maintenance, insurance and tax details.<\/span>\n        <\/div>\n        <div class=\"car-default-note\">NMN uses default assumptions for fields you don\u2019t fine-tune. Consumption and essential vehicle details stay visible.<\/div>\n        <div data-new-only=\"c2\" class=\"car-advanced advanced-collapsed\" data-car-advanced=\"2\"><div class=\"field\"><label>Expected residual value %<\/label><input data-id=\"c2Residual\" type=\"text\" inputmode=\"decimal\" value=\"44\"><\/div><\/div>\n        <div class=\"usedbox hidden\" data-used-only=\"c2\">\n          <div class=\"section\">\ud83d\ude98 Used \/ demo details<\/div>\n          <div class=\"row2\">\n            <div class=\"field\">\n              <label>First registration date<\/label>\n              <input data-id=\"c2UsedFirstReg\" type=\"date\" value=\"\">\n              <div class=\"hint\">Used to estimate vehicle age and regional taxes.<\/div>\n            <\/div>\n            <div class=\"field\">\n              <label>Current mileage km<\/label>\n              <input data-id=\"c2CurrentKm\" type=\"text\" inputmode=\"decimal\" value=\"\" placeholder=\"e.g. 38000\">\n              <div class=\"hint\">Enter the odometer reading today.<\/div>\n            <\/div>\n          <\/div>\n          <div class=\"valuation-box\">\n            <div class=\"valuation-grid\">\n              <div class=\"valuation-item\"><span>Expected mileage at resale<\/span><b data-used-mileage=\"2\">\u2014<\/b><\/div>\n              <div class=\"valuation-item\"><span>Vehicle age at resale<\/span><b data-used-age=\"2\">\u2014<\/b><\/div>\n              <div class=\"valuation-item\"><span>NMN suggested resale value<\/span><b data-used-suggested=\"2\">\u2014<\/b><\/div>\n            <\/div>\n            <div class=\"car-advanced advanced-collapsed\" data-car-advanced=\"2\">\n              <label class=\"auto-resale\">\n                <input data-id=\"c2AutoResale\" type=\"checkbox\" checked>\n                <span>Use the NMN suggested resale value automatically<\/span>\n              <\/label>\n              <div class=\"hint\">Indicative NMN heuristic, not a market valuation. Untick to enter your own resale estimate.<\/div>\n              <div class=\"row2\" style=\"margin-top:9px\">\n                <div class=\"field\"><label>Expected resale value \u20ac<\/label><input data-id=\"c2ResaleEuro\" type=\"text\" inputmode=\"decimal\" value=\"16000\"><\/div>\n                <div class=\"field\"><label>Extra repairs \/ wear \u20ac\/yr<\/label><input data-id=\"c2Repairs\" type=\"text\" inputmode=\"decimal\" value=\"350\"><\/div>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n        <div data-type-block=\"ICE\" data-prefix=\"c2\" class=\"hidden\"><div class=\"row2\"><div class=\"field\"><label>Fuel<\/label><select data-id=\"c2Fuel\"><option value=\"petrol\">Petrol<\/option><option value=\"diesel\">Diesel<\/option><\/select><\/div><div class=\"field\"><label>Consumption l\/100 km<\/label><input data-id=\"c2FuelCons\" type=\"text\" inputmode=\"decimal\" value=\"6.5\" step=\"0.1\"><\/div><\/div><\/div>\n        <div data-type-block=\"HEV\" data-prefix=\"c2\"><div class=\"row2\"><div class=\"field\"><label>Fuel<\/label><select data-id=\"c2HevFuel\"><option value=\"petrol\">Petrol<\/option><option value=\"diesel\">Diesel<\/option><\/select><\/div><div class=\"field\"><label>Consumption l\/100 km<\/label><input data-id=\"c2HevFuelCons\" type=\"text\" inputmode=\"decimal\" value=\"4.8\" step=\"0.1\"><\/div><\/div><div class=\"hint\">No charging cost is entered separately for an HEV.<\/div><\/div>\n        <div data-type-block=\"PHEV\" data-prefix=\"c2\" class=\"hidden\"><div class=\"row2\"><div class=\"field\"><label>Fuel use l\/100 km*<\/label><input data-id=\"c2PhevFuelCons\" type=\"text\" inputmode=\"decimal\" value=\"6.0\" step=\"0.1\"><\/div><div class=\"field\"><label>Electric use kWh\/100 km<\/label><input data-id=\"c2PhevElecCons\" type=\"text\" inputmode=\"decimal\" value=\"19.0\" step=\"0.1\"><\/div><\/div><div class=\"field\"><label>Kilometres driven electrically %<\/label><input data-id=\"c2PhevElecShare\" type=\"text\" inputmode=\"decimal\" value=\"65\"><\/div><div class=\"car-advanced advanced-collapsed\" data-car-advanced=\"2\"><div class=\"section\">\u26a1 Charging mix<\/div><div class=\"row2\"><div class=\"field\"><label>Home %<\/label><input data-id=\"c2PhevHome\" type=\"text\" inputmode=\"decimal\" value=\"80\"><\/div><div class=\"field\"><label>Public AC %<\/label><input data-id=\"c2PhevPublic\" type=\"text\" inputmode=\"decimal\" value=\"20\"><\/div><\/div><\/div><div class=\"hint\">*Fuel use applies to combustion-engine kilometres.<\/div><\/div>\n        <div data-type-block=\"BEV\" data-prefix=\"c2\" class=\"hidden\"><div class=\"field\"><label>Consumption kWh\/100 km<\/label><input data-id=\"c2BevCons\" type=\"text\" inputmode=\"decimal\" value=\"17.5\" step=\"0.1\"><\/div><div class=\"car-advanced advanced-collapsed\" data-car-advanced=\"2\"><div class=\"section\">\u26a1 Charging mix<\/div><div class=\"row2\"><div class=\"field\"><label>Home %<\/label><input data-id=\"c2BevHome\" type=\"text\" inputmode=\"decimal\" value=\"70\"><\/div><div class=\"field\"><label>Public AC %<\/label><input data-id=\"c2BevPublic\" type=\"text\" inputmode=\"decimal\" value=\"20\"><\/div><\/div><div class=\"field\"><label>Fast charging %<\/label><input data-id=\"c2BevFast\" type=\"text\" inputmode=\"decimal\" value=\"10\"><\/div><\/div><\/div>\n        <div class=\"car-advanced advanced-collapsed\" data-car-advanced=\"2\"><div class=\"section\">\ud83d\udee0\ufe0f Annual fixed costs<\/div><div class=\"business-car-field hidden\" data-business-only><div class=\"section\">\ud83d\udcbc Business<\/div><div class=\"row2\"><div class=\"field\"><label>Purchase VAT status<\/label><select data-id=\"c2BizVatStatus\"><option value=\"deductible\" selected>VAT deductible<\/option><option value=\"margin\">Margin \/ no recoverable purchase VAT<\/option><\/select><div class=\"hint\">Choose \u201cMargin\u201d for a margin-scheme or other purchase without recoverable VAT.<\/div><\/div><div class=\"field\"><label>Tax-deductible vehicle cost %<\/label><input data-id=\"c2BizDeductible\" type=\"text\" inputmode=\"decimal\" value=\"100\"><div class=\"hint\">Set separately for this car. Used to estimate the corporate tax saving.<\/div><\/div><\/div><\/div><div class=\"row2\"><div class=\"field\"><label>Maintenance \u20ac\/yr<\/label><input data-id=\"c2Maint\" type=\"text\" inputmode=\"decimal\" value=\"550\"><\/div><div class=\"field\"><label>Insurance \u20ac\/yr<\/label><input data-id=\"c2Ins\" type=\"text\" inputmode=\"decimal\" value=\"875\"><\/div><\/div>\n        <div data-tax-placeholder=\"2\"><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- CAR 3 -->\n    <div class=\"card hidden\" data-card=\"3\">\n      <div class=\"card-head\"><div class=\"car-title\"><div class=\"car-icon type-bev\" data-role=\"icon\">\ud83d\udd0b<\/div><div><strong>Car 3<\/strong><div class=\"small\" data-role=\"subtitle\">Battery electric<\/div><\/div><\/div><div class=\"card-head-actions\"><span class=\"badge type-bev\" data-role=\"badge\">BEV<\/span><button type=\"button\" class=\"remove-car\" data-id=\"removeCar3\">Remove<\/button><\/div><\/div>\n      <div class=\"card-body\">\n        <div class=\"row2\"><div class=\"field\"><label>Name<\/label><input data-id=\"c3Name\" value=\"Car 3\"><\/div><div class=\"field\"><label>Powertrain<\/label><select data-id=\"c3Type\"><option>ICE<\/option><option>HEV<\/option><option>PHEV<\/option><option selected>BEV<\/option><\/select><div class=\"power-help\" data-role=\"powerHelp\"><\/div><\/div><\/div>\n        <div class=\"row2\"><div class=\"field\"><label>Vehicle status<\/label><select data-id=\"c3Status\"><option value=\"new\">New<\/option><option value=\"demo\">Demo \/ nearly new<\/option><option value=\"used\">Used<\/option><\/select><\/div><div class=\"field\"><label>Purchase price today \u20ac<\/label><input data-id=\"c3Price\" type=\"text\" inputmode=\"decimal\" value=\"39000\"><\/div><\/div>\n        <div class=\"fine-tune-row\">\n          <button type=\"button\" class=\"fine-tune-btn\" data-action=\"toggle-car-advanced\" data-car=\"3\" aria-expanded=\"false\">\uff0b Fine-tune this car<\/button>\n          <span class=\"fine-tune-help\">Resale, charging mix, maintenance, insurance and tax details.<\/span>\n        <\/div>\n        <div class=\"car-default-note\">NMN uses default assumptions for fields you don\u2019t fine-tune. Consumption and essential vehicle details stay visible.<\/div>\n        <div data-new-only=\"c3\" class=\"car-advanced advanced-collapsed\" data-car-advanced=\"3\"><div class=\"field\"><label>Expected residual value %<\/label><input data-id=\"c3Residual\" type=\"text\" inputmode=\"decimal\" value=\"40\"><\/div><\/div>\n        <div class=\"usedbox hidden\" data-used-only=\"c3\">\n          <div class=\"section\">\ud83d\ude98 Used \/ demo details<\/div>\n          <div class=\"row2\">\n            <div class=\"field\">\n              <label>First registration date<\/label>\n              <input data-id=\"c3UsedFirstReg\" type=\"date\" value=\"\">\n              <div class=\"hint\">Used to estimate vehicle age and regional taxes.<\/div>\n            <\/div>\n            <div class=\"field\">\n              <label>Current mileage km<\/label>\n              <input data-id=\"c3CurrentKm\" type=\"text\" inputmode=\"decimal\" value=\"\" placeholder=\"e.g. 38000\">\n              <div class=\"hint\">Enter the odometer reading today.<\/div>\n            <\/div>\n          <\/div>\n          <div class=\"valuation-box\">\n            <div class=\"valuation-grid\">\n              <div class=\"valuation-item\"><span>Expected mileage at resale<\/span><b data-used-mileage=\"3\">\u2014<\/b><\/div>\n              <div class=\"valuation-item\"><span>Vehicle age at resale<\/span><b data-used-age=\"3\">\u2014<\/b><\/div>\n              <div class=\"valuation-item\"><span>NMN suggested resale value<\/span><b data-used-suggested=\"3\">\u2014<\/b><\/div>\n            <\/div>\n            <div class=\"car-advanced advanced-collapsed\" data-car-advanced=\"3\">\n              <label class=\"auto-resale\">\n                <input data-id=\"c3AutoResale\" type=\"checkbox\" checked>\n                <span>Use the NMN suggested resale value automatically<\/span>\n              <\/label>\n              <div class=\"hint\">Indicative NMN heuristic, not a market valuation. Untick to enter your own resale estimate.<\/div>\n              <div class=\"row2\" style=\"margin-top:9px\">\n                <div class=\"field\"><label>Expected resale value \u20ac<\/label><input data-id=\"c3ResaleEuro\" type=\"text\" inputmode=\"decimal\" value=\"17500\"><\/div>\n                <div class=\"field\"><label>Extra repairs \/ wear \u20ac\/yr<\/label><input data-id=\"c3Repairs\" type=\"text\" inputmode=\"decimal\" value=\"300\"><\/div>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n        <div data-type-block=\"ICE\" data-prefix=\"c3\" class=\"hidden\"><div class=\"row2\"><div class=\"field\"><label>Fuel<\/label><select data-id=\"c3Fuel\"><option value=\"petrol\">Petrol<\/option><option value=\"diesel\">Diesel<\/option><\/select><\/div><div class=\"field\"><label>Consumption l\/100 km<\/label><input data-id=\"c3FuelCons\" type=\"text\" inputmode=\"decimal\" value=\"6.5\" step=\"0.1\"><\/div><\/div><\/div>\n        <div data-type-block=\"HEV\" data-prefix=\"c3\" class=\"hidden\"><div class=\"row2\"><div class=\"field\"><label>Fuel<\/label><select data-id=\"c3HevFuel\"><option value=\"petrol\">Petrol<\/option><option value=\"diesel\">Diesel<\/option><\/select><\/div><div class=\"field\"><label>Consumption l\/100 km<\/label><input data-id=\"c3HevFuelCons\" type=\"text\" inputmode=\"decimal\" value=\"4.8\" step=\"0.1\"><\/div><\/div><div class=\"hint\">No charging cost is entered separately for an HEV.<\/div><\/div>\n        <div data-type-block=\"PHEV\" data-prefix=\"c3\" class=\"hidden\"><div class=\"row2\"><div class=\"field\"><label>Fuel use l\/100 km*<\/label><input data-id=\"c3PhevFuelCons\" type=\"text\" inputmode=\"decimal\" value=\"6.0\" step=\"0.1\"><\/div><div class=\"field\"><label>Electric use kWh\/100 km<\/label><input data-id=\"c3PhevElecCons\" type=\"text\" inputmode=\"decimal\" value=\"19.0\" step=\"0.1\"><\/div><\/div><div class=\"field\"><label>Kilometres driven electrically %<\/label><input data-id=\"c3PhevElecShare\" type=\"text\" inputmode=\"decimal\" value=\"65\"><\/div><div class=\"car-advanced advanced-collapsed\" data-car-advanced=\"3\"><div class=\"section\">\u26a1 Charging mix<\/div><div class=\"row2\"><div class=\"field\"><label>Home %<\/label><input data-id=\"c3PhevHome\" type=\"text\" inputmode=\"decimal\" value=\"80\"><\/div><div class=\"field\"><label>Public AC %<\/label><input data-id=\"c3PhevPublic\" type=\"text\" inputmode=\"decimal\" value=\"20\"><\/div><\/div><\/div><div class=\"hint\">*Fuel use applies to combustion-engine kilometres.<\/div><\/div>\n        <div data-type-block=\"BEV\" data-prefix=\"c3\"><div class=\"field\"><label>Consumption kWh\/100 km<\/label><input data-id=\"c3BevCons\" type=\"text\" inputmode=\"decimal\" value=\"17.5\" step=\"0.1\"><\/div><div class=\"car-advanced advanced-collapsed\" data-car-advanced=\"3\"><div class=\"section\">\u26a1 Charging mix<\/div><div class=\"row2\"><div class=\"field\"><label>Home %<\/label><input data-id=\"c3BevHome\" type=\"text\" inputmode=\"decimal\" value=\"70\"><\/div><div class=\"field\"><label>Public AC %<\/label><input data-id=\"c3BevPublic\" type=\"text\" inputmode=\"decimal\" value=\"20\"><\/div><\/div><div class=\"field\"><label>Fast charging %<\/label><input data-id=\"c3BevFast\" type=\"text\" inputmode=\"decimal\" value=\"10\"><\/div><\/div><\/div>\n        <div class=\"car-advanced advanced-collapsed\" data-car-advanced=\"3\"><div class=\"section\">\ud83d\udee0\ufe0f Annual fixed costs<\/div><div class=\"business-car-field hidden\" data-business-only><div class=\"section\">\ud83d\udcbc Business<\/div><div class=\"row2\"><div class=\"field\"><label>Purchase VAT status<\/label><select data-id=\"c3BizVatStatus\"><option value=\"deductible\" selected>VAT deductible<\/option><option value=\"margin\">Margin \/ no recoverable purchase VAT<\/option><\/select><div class=\"hint\">Choose \u201cMargin\u201d for a margin-scheme or other purchase without recoverable VAT.<\/div><\/div><div class=\"field\"><label>Tax-deductible vehicle cost %<\/label><input data-id=\"c3BizDeductible\" type=\"text\" inputmode=\"decimal\" value=\"100\"><div class=\"hint\">Set separately for this car. Used to estimate the corporate tax saving.<\/div><\/div><\/div><\/div><div class=\"row2\"><div class=\"field\"><label>Maintenance \u20ac\/yr<\/label><input data-id=\"c3Maint\" type=\"text\" inputmode=\"decimal\" value=\"400\"><\/div><div class=\"field\"><label>Insurance \u20ac\/yr<\/label><input data-id=\"c3Ins\" type=\"text\" inputmode=\"decimal\" value=\"950\"><\/div><\/div>\n        <div data-tax-placeholder=\"3\"><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n\n  <div class=\"actions\">\n    <button type=\"button\" class=\"add-car\" data-id=\"addCar3\">\uff0b Add third car<\/button>\n    <button type=\"button\" class=\"action\" data-id=\"calculate\">Calculate TCO<\/button>\n    <button type=\"button\" class=\"pdf-action\" data-id=\"downloadPdf\">\u2b07 Download PDF<\/button>\n    <span class=\"pdf-status\" data-id=\"pdfStatus\">Calculate TCO refreshes all current inputs. Download PDF recalculates once more before export.<\/span>\n  <\/div>\n\n  <div class=\"panel\">\n    <div class=\"panel-title\">\ud83d\udcca Comparison<\/div>\n    <div class=\"assumption-note\" data-id=\"comparisonAssumptionNote\">NMN default assumptions are used wherever you have not fine-tuned a value. Expand any <strong>Fine-tune<\/strong> section above if you know your own charging, resale, maintenance, insurance or tax figures.<\/div>\n    <a class=\"tco-link\" href=\"#how-tco-works\">\u24d8 How is this calculated?<\/a>\n    <div class=\"grid results two-cars\" data-id=\"resultsGrid\">\n      <div class=\"result\" data-result=\"1\"><strong>Car 1<\/strong><div class=\"small\">Enter your assumptions and calculate.<\/div><\/div>\n      <div class=\"result\" data-result=\"2\"><strong>Car 2<\/strong><div class=\"small\">Enter your assumptions and calculate.<\/div><\/div>\n      <div class=\"result hidden\" data-result=\"3\"><strong>Car 3<\/strong><div class=\"small\">Enter your assumptions and calculate.<\/div><\/div>\n    <\/div>\n    <div class=\"winner\" data-id=\"winner\">The lowest-TCO car will appear here.<\/div>\n    <div class=\"comparison\" data-id=\"comparisonNote\">Compare two cars, or add a third car when you want a broader Benelux comparison.<\/div>\n    <div class=\"bars\" data-id=\"bars\"><\/div>\n  <\/div>\n\n  <div class=\"panel\" id=\"how-tco-works\">\n    <div class=\"panel-title\">What is TCO?<\/div>\n    <div class=\"tco-explain\">\n      <div class=\"tco-copy\">\n        <p><strong>Total Cost of Ownership (TCO)<\/strong> is the estimated total cost of owning and using a car over the period you select. It looks beyond the purchase price and combines the main costs that change between cars and powertrains.<\/p>\n        <div class=\"tco-flow\">\n          <span class=\"tco-chip\">Depreciation<\/span><span class=\"tco-plus\">+<\/span>\n          <span class=\"tco-chip\">Energy \/ fuel<\/span><span class=\"tco-plus\">+<\/span>\n          <span class=\"tco-chip\">Maintenance<\/span><span class=\"tco-plus\">+<\/span>\n          <span class=\"tco-chip\">Insurance<\/span><span class=\"tco-plus\">+<\/span>\n          <span class=\"tco-chip\">Taxes<\/span><span class=\"tco-plus\">+<\/span>\n          <span class=\"tco-chip\">Extra repairs*<\/span>\n        <\/div>\n        <p class=\"tco-note\">*Extra repairs \/ wear are only added when you enter them for a used or demo car. Financing, parking, tyres, subsidies and exceptional one-off costs are excluded unless explicitly stated.<\/p>\n      <\/div>\n      <div class=\"tco-formula\">\n        <strong>How NMN calculates it<\/strong>\n        <div class=\"tco-eq\">Depreciation = purchase price today \u2212 expected resale value<\/div>\n        <div class=\"tco-eq\">TCO = depreciation + running costs + taxes + insurance + maintenance<\/div>\n        <div class=\"tco-eq\">Monthly TCO = total TCO \u00f7 number of months owned<\/div>\n        <div class=\"tco-note\"><strong>Important:<\/strong> expected resale value is already included through depreciation. It is not deducted a second time.<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"guide-box\">\n      <strong>Want the full explanation?<\/strong>\n      <p>Read how NMN\u2019s TCO Calculator works for private and business users, including depreciation, charging, taxes, VAT and company-cost estimates.<\/p>\n      <a href=\"https:\/\/newmobility.news\/2026\/08\/22\/nmn-launches-tco-calculator-what-will-your-next-car-really-cost\/\">Read the full article \u2192<\/a>\n    <\/div>\n  <\/div>\n\n  <div class=\"panel\">\n    <div class=\"panel-title\">ICE, HEV, PHEV or BEV: what\u2019s the difference?<\/div>\n    <div class=\"legend\">\n      <div class=\"legend-item\"><div class=\"legend-top\"><span class=\"legend-icon type-ice\">\u26fd<\/span><strong>ICE<\/strong><\/div><p>Petrol or diesel. Mild hybrids (MHEV) can be entered here using their actual fuel consumption.<\/p><\/div>\n      <div class=\"legend-item\"><div class=\"legend-top\"><span class=\"legend-icon type-hev\">\u267b\ufe0f<\/span><strong>HEV<\/strong><\/div><p>Full hybrid without a plug. Its battery assists the engine and recharges while driving and braking.<\/p><\/div>\n      <div class=\"legend-item\"><div class=\"legend-top\"><span class=\"legend-icon type-phev\">\ud83d\udd0c<\/span><strong>PHEV<\/strong><\/div><p>Plug-in hybrid. Enter fuel and electric use. How often you charge has a major effect on TCO.<\/p><\/div>\n      <div class=\"legend-item\"><div class=\"legend-top\"><span class=\"legend-icon type-bev\">\ud83d\udd0b<\/span><strong>BEV<\/strong><\/div><p>Fully electric. Running cost depends strongly on electricity use and where you normally charge.<\/p><\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"panel legal-panel\">\n    <div class=\"disclaimer\">\n      <strong>Business mode:<\/strong> Headline monthly cost and cost\/km are based on estimated net company cost; gross TCO remains shown separately. VAT and corporate-tax treatment is indicative only. Indicative editorial calculator, not a tax assessment or vehicle valuation. For used\/demo cars, the NMN suggested resale value is an editable heuristic based on today&#8217;s purchase price, vehicle age, current mileage, expected age\/mileage at resale and powertrain. Belgian automation assumes a standard privately owned\/non-leased passenger car and the rules\/rates applicable on 19 August 2026. Flemish BIV for non-BEV cars first registered before 2021 remains manual in this beta. Brussels automation uses the 2026 non-leasing passenger-car tables. Wallonia uses the TMC formula in force for registrations from 1 July 2025 and the 2026-2027 annual road-tax tariff; special reductions, exemptions and LPG supplements are not included. Dutch MRB uses the current quarterly amount supplied by the user from the official Belastingdienst calculator; future base-rate indexation is unknown and therefore not modelled. Luxembourg uses the standard \u20ac50 SNCA registration charge and the CO2-based annual road-tax formula for M1 passenger cars first registered from 2001; pre-2001 annual tax remains manual and special exemptions\/refunds are excluded.\n    <\/div>\n    <div class=\"copyright\">\n      \u00a9 2026 B2BNews Agency. All rights reserved. The NMN TCO Calculator, its presentation and calculation methodology may not be reproduced or redistributed without permission.\n    <\/div>\n  <\/div>\n<\/div>\n\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/4.2.1\/jspdf.umd.min.js\"><\/script>\n<script>\n\/* NMN TCO Calculator v6.0.2 \u00b7 GA4 events: tco_calculator_used, tco_calculation, tco_pdf_download *\/\n(function(){\n  const root=document.getElementById('nmn-tco'); if(!root) return;\n  const q=(s,c=root)=>c.querySelector(s), qa=(s,c=root)=>Array.from(c.querySelectorAll(s));\n  const el=id=>q('[data-id=\"'+id+'\"]');\n\n  function numberMode(id){\n    const s=String(id||'');\n\n    \/\/ Unit prices must always be parsed as decimals.\n    \/\/ Examples: 0.350 \u20ac\/kWh, 0,35 \u20ac\/kWh, 1.81 \u20ac\/l.\n    if(['petrolPrice','dieselPrice','homePrice','publicPrice','fastPrice'].includes(s)) return 'decimal';\n\n    \/\/ Vehicle purchase price and other euro totals may use Benelux\n    \/\/ thousands separators such as 14.950 or 17.399.\n    if(\/(?:Price|ResaleEuro|Repairs|Maint|Ins|BivManual|NlQuarter|LuPre2001Annual|RegManual|RoadManual)$\/.test(s)) return 'money';\n\n    if(s==='km' || \/(?:CurrentKm|CC|CO2|BrKW|WaKW|WaMMA)$\/.test(s)) return 'integer';\n    return 'decimal';\n  }\n\n  function parseLocalizedNumber(raw,mode='decimal'){\n    let s=String(raw??'')\n      .trim()\n      .replace(\/\\s|\\u00a0|\\u202f\/g,'')\n      .replace(\/[\u20ac$\u00a3]\/g,'')\n      .replace(\/[\u2019']\/g,'');\n\n    if(!s) return 0;\n\n    const comma=s.lastIndexOf(',');\n    const dot=s.lastIndexOf('.');\n\n    if(comma>=0 && dot>=0){\n      if(comma>dot){\n        s=s.replace(\/\\.\/g,'').replace(',','.');\n      }else{\n        s=s.replace(\/,\/g,'');\n      }\n    }else if(comma>=0){\n      if((mode==='money' || mode==='integer') && \/^-?\\d{1,3}(,\\d{3})+$\/.test(s)){\n        s=s.replace(\/,\/g,'');\n      }else{\n        s=s.replace(',','.');\n      }\n    }else if(dot>=0){\n      if((mode==='money' || mode==='integer') && \/^-?\\d{1,3}(\\.\\d{3})+$\/.test(s)){\n        s=s.replace(\/\\.\/g,'');\n      }\n    }\n\n    const n=Number(s);\n    return Number.isFinite(n)?n:0;\n  }\n\n  const num=id=>{\n    const node=el(id);\n    return parseLocalizedNumber(node?node.value:'',numberMode(id));\n  };\n\n  const money=n=>new Intl.NumberFormat('en-BE',{style:'currency',currency:'EUR',maximumFractionDigits:0}).format(n);\n  const money2=n=>new Intl.NumberFormat('en-BE',{style:'currency',currency:'EUR',minimumFractionDigits:2,maximumFractionDigits:2}).format(n);\n  let country='BE';\n  let buyerMode='private';\n  let car3Active=false;\n\n  const countryPriceDefaults={\n    BE:{\n      petrol:'1.81',\n      diesel:'2.16',\n      home:'0.35',\n      publicAc:'0.52',\n      fast:'0.72',\n      label:'Belgium'\n    },\n    NL:{\n      petrol:'2.29',\n      diesel:'2.32',\n      home:'0.256',\n      publicAc:'0.48',\n      fast:'0.69',\n      label:'Netherlands'\n    },\n    LU:{\n      petrol:'1.62',\n      diesel:'1.80',\n      home:'0.267',\n      publicAc:'0.45',\n      fast:'0.59',\n      label:'Luxembourg'\n    }\n  };\n\n  function applyCountryPriceDefaults(c){\n    const p=countryPriceDefaults[c];\n    if(!p) return;\n    el('petrolPrice').value=p.petrol;\n    el('dieselPrice').value=p.diesel;\n    el('homePrice').value=p.home;\n    el('publicPrice').value=p.publicAc;\n    el('fastPrice').value=p.fast;\n\n    const note=el('energyPriceNote');\n    if(note){\n      note.innerHTML='<strong>'+p.label+' defaults loaded:<\/strong> petrol \u20ac'+p.petrol+'\/l \u00b7 diesel \u20ac'+p.diesel+'\/l \u00b7 home \u20ac'+p.home+'\/kWh \u00b7 public AC \u20ac'+p.publicAc+'\/kWh \u00b7 fast \u20ac'+p.fast+'\/kWh. These are indicative latest-available averages\/benchmarks and remain editable.';\n    }\n  }\n\n  const help={\n    ICE:'ICE: conventional petrol or diesel. Treat a mild hybrid (MHEV) as ICE and enter its actual fuel consumption.',\n    HEV:'HEV: full hybrid without a plug. Enter the car\u2019s actual combined fuel consumption.',\n    PHEV:'PHEV: plug-in hybrid. Enter fuel use, electric use and the share of kilometres you expect to drive electrically.',\n    BEV:'BEV: fully electric. Enter consumption plus your expected home, public AC and fast-charging mix.'\n  };\n  const defs={\n    ICE:{maint:650,ins:850,icon:'\u26fd',subtitle:'Combustion engine'},\n    HEV:{maint:550,ins:875,icon:'\u267b\ufe0f',subtitle:'Full hybrid'},\n    PHEV:{maint:600,ins:900,icon:'\ud83d\udd0c',subtitle:'Plug-in hybrid'},\n    BEV:{maint:400,ins:950,icon:'\ud83d\udd0b',subtitle:'Battery electric'}\n  };\n\n  function cls(t){return 'type-'+t.toLowerCase()}\n  function carEl(i,k){return q('[data-id=\"c'+i+k+'\"]')}\n  function carNum(i,k){\n    const node=carEl(i,k);\n    return parseLocalizedNumber(node?node.value:'',numberMode('c'+i+k));\n  }\n  function carType(i){return carEl(i,'Type').value}\n  function carStatus(i){return carEl(i,'Status').value}\n  function esc(s){return String(s).replace(\/[&<>\"']\/g,m=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#039;'}[m]))}\n  function statusText(s){return s==='new'?'New':s==='demo'?'Demo':'Used'}\n\n  function taxPanelHTML(i){\n    return `\n    <div class=\"section\">\ud83e\uddfe Taxes <span class=\"taxbadge auto\" data-taxbadge=\"${i}\">automatic<\/span><\/div>\n    <div class=\"taxbox auto\" data-taxbox=\"${i}\">\n      <div data-flanders-tax=\"${i}\">\n        <div class=\"tax-summary\">\n          <div><span>BIV \/ registration<\/span><b data-fl-biv=\"${i}\">\u2014<\/b><\/div>\n          <div><span>Annual road tax<\/span><b data-fl-road=\"${i}\">\u2014<\/b><\/div>\n        <\/div>\n        <div class=\"hint\" data-fl-msg=\"${i}\">Enter the tax details below.<\/div>\n        <details class=\"tax-details\" data-fl-details=\"${i}\">\n          <summary>Tax details used for Flanders<\/summary>\n          <div class=\"tax-inner\">\n            <div class=\"row2\">\n              <div class=\"field\"><label>First registration date<\/label><input data-id=\"c${i}FirstReg\" type=\"date\" value=\"2026-08-01\"><\/div>\n              <div class=\"field\"><label>Engine capacity cc<\/label><input data-id=\"c${i}CC\" type=\"text\" inputmode=\"decimal\" value=\"1498\" step=\"1\"><\/div>\n            <\/div>\n            <div class=\"row2\">\n              <div class=\"field\"><label>CO2 g\/km<\/label><input data-id=\"c${i}CO2\" type=\"text\" inputmode=\"decimal\" value=\"120\" step=\"1\"><\/div>\n              <div class=\"field\"><label>Euro norm<\/label><select data-id=\"c${i}Euro\"><option value=\"0\">Euro 0<\/option><option value=\"1\">Euro 1<\/option><option value=\"2\">Euro 2<\/option><option value=\"3\">Euro 3<\/option><option value=\"4\">Euro 4<\/option><option value=\"5\">Euro 5<\/option><option value=\"6\" selected>Euro 6<\/option><\/select><\/div>\n            <\/div>\n            <div class=\"field\"><label>Tax fuel<\/label><select data-id=\"c${i}TaxFuel\"><option value=\"petrol\" selected>Petrol \/ other<\/option><option value=\"diesel\">Diesel<\/option><\/select><\/div>\n            <div class=\"field hidden\" data-biv-manual-wrap=\"${i}\"><label>BIV for pre-2021 car \u20ac<\/label><input data-id=\"c${i}BivManual\" type=\"text\" inputmode=\"decimal\" value=\"0\"><div class=\"hint\">Automatic Flemish BIV in this beta is enabled for BEVs and non-BEV cars first registered in 2021 or later.<\/div><\/div>\n          <\/div>\n        <\/details>\n      <\/div>\n\n      <div class=\"hidden\" data-brussels-tax=\"${i}\">\n        <div class=\"tax-summary\">\n          <div><span>BIV \/ registration<\/span><b data-br-biv=\"${i}\">\u2014<\/b><\/div>\n          <div><span>Annual road tax<\/span><b data-br-road=\"${i}\">\u2014<\/b><\/div>\n        <\/div>\n        <div class=\"hint\" data-br-msg=\"${i}\">Brussels 2026 non-leasing passenger-car tariffs.<\/div>\n        <details class=\"tax-details\">\n          <summary>Tax details used for Brussels<\/summary>\n          <div class=\"tax-inner\">\n            <div class=\"row2\">\n              <div class=\"field\"><label>First registration date<\/label><input data-id=\"c${i}BrFirstReg\" type=\"date\" value=\"2026-08-01\"><\/div>\n              <div class=\"field\"><label>Engine capacity cc<\/label><input data-id=\"c${i}BrCC\" type=\"text\" inputmode=\"decimal\" value=\"1498\" step=\"1\"><\/div>\n            <\/div>\n            <div class=\"field\"><label>Engine power kW<\/label><input data-id=\"c${i}BrKW\" type=\"text\" inputmode=\"decimal\" value=\"100\" step=\"1\"><div class=\"hint\">For HEV\/PHEV, use the combustion-engine power used for Brussels taxation.<\/div><\/div>\n          <\/div>\n        <\/details>\n      <\/div>\n\n      <div class=\"hidden\" data-wallonia-tax=\"${i}\">\n        <div class=\"tax-summary\">\n          <div><span>TMC \/ registration<\/span><b data-wa-tmc=\"${i}\">\u2014<\/b><\/div>\n          <div><span>Annual road tax<\/span><b data-wa-road=\"${i}\">\u2014<\/b><\/div>\n        <\/div>\n        <div class=\"hint\" data-wa-msg=\"${i}\">Walloon TMC formula + 2026-2027 annual road-tax tariff.<\/div>\n        <details class=\"tax-details\">\n          <summary>Tax details used for Wallonia<\/summary>\n          <div class=\"tax-inner\">\n            <div class=\"row2\">\n              <div class=\"field\"><label>First registration date<\/label><input data-id=\"c${i}WaFirstReg\" type=\"date\" value=\"2026-08-01\"><\/div>\n              <div class=\"field\"><label>Power kW (P.2)<\/label><input data-id=\"c${i}WaKW\" type=\"text\" inputmode=\"decimal\" value=\"100\" step=\"1\"><\/div>\n            <\/div>\n            <div class=\"row2\">\n              <div class=\"field\"><label>Maximum authorised mass (MMA) kg<\/label><input data-id=\"c${i}WaMMA\" type=\"text\" inputmode=\"decimal\" value=\"1900\" step=\"1\"><\/div>\n              <div class=\"field\"><label>Engine capacity cc<\/label><input data-id=\"c${i}WaCC\" type=\"text\" inputmode=\"decimal\" value=\"1498\" step=\"1\"><div class=\"hint\">Used for annual road tax. BEVs use the fixed minimum rate.<\/div><\/div>\n            <\/div>\n            <div class=\"row2\">\n              <div class=\"field\"><label>CO2 g\/km<\/label><input data-id=\"c${i}WaCO2\" type=\"text\" inputmode=\"decimal\" value=\"120\" step=\"1\"><div class=\"hint\">For hybrids, use the simple\/mixed combined value, not the weighted combined value.<\/div><\/div>\n              <div class=\"field\"><label>CO2 test cycle<\/label><select data-id=\"c${i}WaCycle\"><option value=\"WLTP\" selected>WLTP<\/option><option value=\"NEDC\">NEDC<\/option><\/select><\/div>\n            <\/div>\n          <\/div>\n        <\/details>\n      <\/div>\n\n      <div class=\"hidden\" data-luxembourg-tax=\"${i}\">\n        <div class=\"tax-summary\">\n          <div><span>Registration fee<\/span><b data-lu-reg=\"${i}\">\u20ac50.00<\/b><\/div>\n          <div><span>Annual road tax<\/span><b data-lu-road=\"${i}\">\u2014<\/b><\/div>\n        <\/div>\n        <div class=\"hint\" data-lu-msg=\"${i}\">Luxembourg M1 passenger-car taxation.<\/div>\n        <details class=\"tax-details\" data-lu-details=\"${i}\">\n          <summary>Tax details used for Luxembourg<\/summary>\n          <div class=\"tax-inner\">\n            <div class=\"row2\">\n              <div class=\"field\"><label>First registration date<\/label><input data-id=\"c${i}LuFirstReg\" type=\"date\" value=\"2026-08-01\"><\/div>\n              <div class=\"field\"><label>Official CO2 g\/km<\/label><input data-id=\"c${i}LuCO2\" type=\"text\" inputmode=\"decimal\" value=\"120\" step=\"1\"><div class=\"hint\">Use NEDC for first registration 2001-2020 and WLTP from 2021.<\/div><\/div>\n            <\/div>\n            <div class=\"field\"><label>Fuel for road tax<\/label><select data-id=\"c${i}LuFuel\"><option value=\"other\" selected>Petrol \/ hybrid \/ other<\/option><option value=\"diesel\">Diesel<\/option><\/select><\/div>\n            <div class=\"field hidden\" data-lu-pre2001-wrap=\"${i}\"><label>Annual road tax for pre-2001 car \u20ac<\/label><input data-id=\"c${i}LuPre2001Annual\" type=\"text\" inputmode=\"decimal\" value=\"0\" step=\"1\"><div class=\"hint\">Cars first registered before 2001 are taxed by engine capacity. Enter the official annual amount here.<\/div><\/div>\n          <\/div>\n        <\/details>\n      <\/div>\n\n      <div class=\"hidden\" data-nl-tax=\"${i}\">\n        <div class=\"field\"><label>Current MRB shown by Belastingdienst \u20ac\/quarter<\/label><input data-id=\"c${i}NlQuarter\" type=\"text\" inputmode=\"decimal\" value=\"200\" step=\"1\"><\/div>\n        <div class=\"tax-summary\">\n          <div><span>Current annual MRB<\/span><b data-nl-year=\"${i}\">\u2014<\/b><\/div>\n          <div><span>MRB over ownership<\/span><b data-nl-total=\"${i}\">\u2014<\/b><\/div>\n        <\/div>\n        <div class=\"hint\">Enter the current quarterly amount from the official calculator. For a BEV, NMN derives the underlying full rate from the 2026 discounted amount and applies the statutory discount schedule: 30% through 2028, 25% in 2029, 0% from 2030. Future inflation\/indexation is not known and is not modelled.<\/div>\n        <a class=\"official-link\" href=\"https:\/\/www.belastingdienst.nl\/wps\/wcm\/connect\/nl\/auto-en-vervoer\/content\/hulpmiddel-motorrijtuigenbelasting-berekenen\" target=\"_blank\" rel=\"noopener\">Open official Belastingdienst MRB calculator \u2197<\/a>\n      <\/div>\n    <\/div>`;\n  }\n\n  [1,2,3].forEach(i=>q('[data-tax-placeholder=\"'+i+'\"]').innerHTML=taxPanelHTML(i));\n\n\n  function isoDateYearsAgo(yearsAgo){\n    const d=new Date();\n    d.setHours(12,0,0,0);\n    const months=Math.round(yearsAgo*12);\n    d.setMonth(d.getMonth()-months);\n    return d.toISOString().slice(0,10);\n  }\n\n  function seedUsedInputs(i){\n    const status=carStatus(i);\n    if(status==='new') return;\n\n    const reg=carEl(i,'UsedFirstReg');\n    const kmEl=carEl(i,'CurrentKm');\n\n    if(reg && !reg.value){\n      reg.value=isoDateYearsAgo(status==='demo' ? 0.5 : 3);\n    }\n    if(kmEl && String(kmEl.value||'').trim()===''){\n      kmEl.value=status==='demo' ? '5000' : '45000';\n    }\n  }\n\n  function vehicleAgeYears(dateString){\n    if(!dateString) return null;\n    const d=new Date(dateString+'T12:00:00');\n    if(Number.isNaN(d.getTime())) return null;\n    const now=new Date();\n    now.setHours(12,0,0,0);\n    if(d>now) return 0;\n    return Math.max(0,(now-d)\/(365.2425*24*60*60*1000));\n  }\n\n  function annualRetentionFor(type,age){\n    \/*\n     * Editorial resale heuristic, deliberately conservative.\n     * Depreciation generally slows as a vehicle ages.\n     * Powertrain curves only influence the suggestion; users can override it.\n     *\/\n    if(type==='BEV'){\n      if(age<1) return .86;\n      if(age<4) return .84;\n      if(age<6) return .85;\n      if(age<9) return .87;\n      if(age<12) return .89;\n      return .91;\n    }\n    if(type==='PHEV'){\n      if(age<1) return .82;\n      if(age<4) return .84;\n      if(age<7) return .86;\n      if(age<10) return .88;\n      return .90;\n    }\n    if(type==='HEV'){\n      if(age<1) return .84;\n      if(age<4) return .87;\n      if(age<7) return .89;\n      if(age<10) return .91;\n      return .92;\n    }\n    \/\/ ICE\n    if(age<1) return .83;\n    if(age<4) return .86;\n    if(age<7) return .88;\n    if(age<10) return .90;\n    return .92;\n  }\n\n  function suggestedUsedResale(i,years,kmYear){\n    const purchase=Math.max(0,carNum(i,'Price'));\n    const regEl=carEl(i,'UsedFirstReg');\n    const kmEl=carEl(i,'CurrentKm');\n    const reg=regEl ? regEl.value : '';\n    const kmRaw=kmEl ? String(kmEl.value||'').trim() : '';\n    const ageNow=vehicleAgeYears(reg);\n\n    if(!purchase || ageNow===null || kmRaw==='') return null;\n\n    const currentKm=Math.max(0,carNum(i,'CurrentKm'));\n    const futureKm=currentKm+Math.max(0,kmYear)*Math.max(0,years);\n    const futureAge=ageNow+Math.max(0,years);\n\n    let retention=1;\n    let elapsed=0;\n    while(elapsed<years-1e-9){\n      const step=Math.min(1,years-elapsed);\n      const ageAtMidpoint=ageNow+elapsed+step\/2;\n      retention*=Math.pow(annualRetentionFor(carType(i),ageAtMidpoint),step);\n      elapsed+=step;\n    }\n\n    \/\/ Reference mileage: 15,000 km per vehicle-year.\n    \/\/ Every 1,000 km above\/below that reference changes the estimate by 0.3%,\n    \/\/ capped to avoid unrealistic results.\n    const referenceKm=Math.max(5000,futureAge*15000);\n    const deviationThousands=(futureKm-referenceKm)\/1000;\n    const mileageFactor=Math.max(.75,Math.min(1.15,1-deviationThousands*.003));\n\n    let suggested=purchase*retention*mileageFactor;\n    suggested=Math.max(purchase*.05,Math.min(purchase*.90,suggested));\n\n    \/\/ Round to a useful market-style number rather than false precision.\n    suggested=Math.round(suggested\/250)*250;\n\n    return {\n      ageNow,\n      futureAge,\n      currentKm,\n      futureKm,\n      referenceKm,\n      mileageFactor,\n      suggested,\n      retention\n    };\n  }\n\n  function syncUsedFirstRegistrationToTaxes(i){\n    const source=carEl(i,'UsedFirstReg');\n    if(!source || !source.value || carStatus(i)==='new') return;\n    ['FirstReg','BrFirstReg','WaFirstReg','LuFirstReg'].forEach(key=>{\n      const target=carEl(i,key);\n      if(target) target.value=source.value;\n    });\n  }\n\n  function updateUsedValuation(i,forceApply=false){\n    if(carStatus(i)==='new') return null;\n\n    syncUsedFirstRegistrationToTaxes(i);\n\n    const years=Math.max(0,num('years'));\n    const kmYear=Math.max(0,num('km'));\n    const v=suggestedUsedResale(i,years,kmYear);\n\n    const mileageLabel=q('[data-used-mileage=\"'+i+'\"]');\n    const ageLabel=q('[data-used-age=\"'+i+'\"]');\n    const suggestionLabel=q('[data-used-suggested=\"'+i+'\"]');\n\n    if(!v){\n      if(mileageLabel) mileageLabel.textContent='Enter vehicle data';\n      if(ageLabel) ageLabel.textContent='Enter vehicle data';\n      if(suggestionLabel) suggestionLabel.textContent='Enter vehicle data';\n      return null;\n    }\n\n    if(mileageLabel) mileageLabel.textContent=Math.round(v.futureKm).toLocaleString('en-BE')+' km';\n    if(ageLabel) ageLabel.textContent=v.futureAge.toFixed(1)+' years';\n    if(suggestionLabel) suggestionLabel.textContent=money(v.suggested);\n\n    const auto=carEl(i,'AutoResale');\n    if((forceApply || (auto && auto.checked)) && carEl(i,'ResaleEuro')){\n      carEl(i,'ResaleEuro').value=String(Math.round(v.suggested));\n    }\n\n    return v;\n  }\n\n  function weighted(home,pub,fast){\n    const t=home+pub+fast;\n    return t>0?(home*num('homePrice')+pub*num('publicPrice')+fast*num('fastPrice'))\/t:num('homePrice');\n  }\n\n  function updateCard(i,changeDefaults){\n    const p='c'+i,type=carType(i),status=carStatus(i),card=q('[data-card=\"'+i+'\"]');\n    const icon=q('[data-role=\"icon\"]',card), badge=q('[data-role=\"badge\"]',card);\n    icon.className='car-icon '+cls(type); icon.textContent=defs[type].icon;\n    badge.className='badge '+cls(type); badge.textContent=type;\n    q('[data-role=\"subtitle\"]',card).textContent=defs[type].subtitle;\n    q('[data-role=\"powerHelp\"]',card).textContent=help[type];\n    qa('[data-type-block][data-prefix=\"'+p+'\"]').forEach(b=>b.classList.toggle('hidden',b.dataset.typeBlock!==type));\n    qa('[data-new-only=\"'+p+'\"]').forEach(b=>b.classList.toggle('hidden',status!=='new'));\n    qa('[data-used-only=\"'+p+'\"]').forEach(b=>b.classList.toggle('hidden',status==='new'));\n\n    if(changeDefaults){\n      carEl(i,'Maint').value=defs[type].maint;\n      carEl(i,'Ins').value=defs[type].ins;\n      if(type==='BEV'){\n        carEl(i,'CO2').value=0;\n        if(carEl(i,'WaCO2')) carEl(i,'WaCO2').value=0;\n        if(carEl(i,'WaCC')) carEl(i,'WaCC').value=0;\n        if(carEl(i,'BrCC')) carEl(i,'BrCC').value=0;\n        q('[data-fl-details=\"'+i+'\"]').open=false;\n      } else if(type==='PHEV'){\n        carEl(i,'CO2').value=35;\n        if(carEl(i,'WaCO2')) carEl(i,'WaCO2').value=140;\n        if(carEl(i,'WaCC') && carNum(i,'WaCC')===0) carEl(i,'WaCC').value=1498;\n        if(carEl(i,'BrCC') && carNum(i,'BrCC')===0) carEl(i,'BrCC').value=1498;\n      } else if(type==='HEV'){\n        carEl(i,'CO2').value=105;\n        if(carEl(i,'WaCO2')) carEl(i,'WaCO2').value=105;\n        if(carEl(i,'WaCC') && carNum(i,'WaCC')===0) carEl(i,'WaCC').value=1498;\n        if(carEl(i,'BrCC') && carNum(i,'BrCC')===0) carEl(i,'BrCC').value=1498;\n      } else {\n        carEl(i,'CO2').value=120;\n        if(carEl(i,'WaCO2')) carEl(i,'WaCO2').value=120;\n        if(carEl(i,'WaCC') && carNum(i,'WaCC')===0) carEl(i,'WaCC').value=1498;\n        if(carEl(i,'BrCC') && carNum(i,'BrCC')===0) carEl(i,'BrCC').value=1498;\n      }\n    }\n\n    if(carEl(i,'LuCO2')){\n      if(type==='BEV') carEl(i,'LuCO2').value=0;\n      else if(type==='PHEV') carEl(i,'LuCO2').value=35;\n      else if(type==='HEV') carEl(i,'LuCO2').value=105;\n      else carEl(i,'LuCO2').value=120;\n    }\n    updateTaxUI(i);\n  }\n\n  function flandersBaseTax(cc){\n    const table=[\n      [750,97.44],[950,121.92],[1150,176.28],[1350,230.28],[1550,284.76],[1750,339.12],\n      [1950,393.00],[2150,510.12],[2350,627.00],[2550,743.76],[2750,860.88],[3050,977.76],\n      [3250,1280.76],[3450,1584.00],[3650,1887.12],[3950,2189.52],[4150,2492.64]\n    ];\n    for(const [max,val] of table) if(cc<=max) return val;\n    return null;\n  }\n\n  function flandersEuroAdj(fuel,euro){\n    const p={0:.30,1:.10,2:.05,3:0,4:-.125,5:-.15,6:-.15};\n    const d={0:.50,1:.40,2:.35,3:.30,4:.25,5:.175,6:.15};\n    return (fuel==='diesel'?d:p)[euro] ?? 0;\n  }\n\n  function flandersAirComponent(fuel,euro){\n    const petrol={0:1577.21,1:705.35,2:210.92,3:132.21,4:31.76,5:28.54,6:28.54};\n    const diesel={0:3965.46,1:1163.40,2:862.26,3:683.30,4:646.88,5:636.20,6:628.29};\n    return (fuel==='diesel'?diesel:petrol)[euro] ?? 28.54;\n  }\n\n  function fullMonthsSince(dateString){\n    const d=new Date(dateString+'T00:00:00');\n    const ref=new Date('2026-08-19T00:00:00');\n    if(isNaN(d.getTime())) return 0;\n    let m=(ref.getFullYear()-d.getFullYear())*12+(ref.getMonth()-d.getMonth());\n    if(ref.getDate()<d.getDate()) m--;\n    return Math.max(0,m);\n  }\n\n  function ageCorrection(months){\n    if(months<12)return 1;if(months<24)return .9;if(months<36)return .8;if(months<48)return .7;\n    if(months<60)return .6;if(months<72)return .5;if(months<84)return .4;if(months<96)return .3;\n    if(months<108)return .2;return .1;\n  }\n\n  function flandersTaxes(i,years){\n    const type=carType(i);\n    if(type==='BEV'){\n      q('[data-biv-manual-wrap=\"'+i+'\"]').classList.add('hidden');\n      return {oneOff:61.50,annual:107.16,total:61.50+107.16*years,mode:'auto',msg:'2026 Flemish zero-emission flat rates.'};\n    }\n\n    const reg=carEl(i,'FirstReg').value;\n    const d=new Date(reg+'T00:00:00');\n    const regYear=isNaN(d.getTime())?2026:d.getFullYear();\n    const cc=carNum(i,'CC'), co2=carNum(i,'CO2'), euro=Number(carEl(i,'Euro').value), fuel=carEl(i,'TaxFuel').value;\n    const base=flandersBaseTax(cc);\n    let annual=0, roadMsg='';\n\n    if(base===null){\n      annual=0;\n      roadMsg='Engine capacity above 4,150 cc is not supported for Flemish annual tax in this beta.';\n    }else if(regYear<2016){\n      annual=Math.max(107.16,base*1.10);\n      roadMsg='Pre-2016 registration: fiscal-HP base tariff used without green adjustment.';\n    }else{\n      const threshold=regYear>=2021?149:122;\n      const c=Math.max(24,Math.min(500,co2));\n      const co2Adj=(c-threshold)*0.003;\n      const euroAdj=flandersEuroAdj(fuel,euro);\n      annual=Math.max(107.16,base*(1+co2Adj+euroAdj)*1.10);\n      roadMsg='Green road-tax formula: fiscal-HP base adjusted for CO2, Euro norm and fuel, plus 10% municipal surcharge.';\n    }\n\n    let oneOff=0, bivMsg='';\n    if(regYear>=2021){\n      q('[data-biv-manual-wrap=\"'+i+'\"]').classList.add('hidden');\n      const months=fullMonthsSince(reg);\n      const lc=ageCorrection(months);\n      const qFactor=1.245; \/\/ 2026: 1.07 + 5*0.035\n      const air=flandersAirComponent(fuel,euro);\n      const raw=(Math.pow((co2*qFactor)\/246,6)*4500+air)*lc;\n      oneOff=Math.max(58.16,Math.min(14539.31,raw));\n      bivMsg='2021+ WLTP BIV formula with 2026 q-factor, air component and age correction.';\n    }else{\n      q('[data-biv-manual-wrap=\"'+i+'\"]').classList.remove('hidden');\n      oneOff=carNum(i,'BivManual');\n      bivMsg='Pre-2021 BIV remains manual in this beta.';\n    }\n\n    return {oneOff,annual,total:oneOff+annual*years,mode:'auto',msg:bivMsg+' '+roadMsg};\n  }\n\n\n  function fullYearsSince(dateString){\n    return Math.floor(fullMonthsSince(dateString)\/12);\n  }\n\n  function annualRoadTaxByCC(cc){\n    const table=[\n      [750,107.18],[950,134.11],[1150,193.91],[1350,253.31],[1550,313.24],[1750,373.16],\n      [1950,432.30],[2150,561.00],[2350,689.70],[2550,818.14],[2750,946.84],[3050,1075.54],\n      [3250,1408.70],[3450,1742.14],[3650,2075.57],[3950,2408.34],[4150,2741.77],\n      [4350,2891.33],[4650,3040.88],[4850,3190.44],[5050,3340.00],[5250,3489.55],\n      [5550,3639.11],[5750,3788.66],[5950,3938.22],[6150,4087.78],[6350,4237.33],\n      [6650,4386.89],[6850,4536.44],[7150,4686.00],[7350,4835.56],[7650,4985.11],\n      [7850,5134.67],[8150,5284.22],[8350,5433.78],[8650,5583.34],[8850,5732.89],\n      [9050,5882.45],[9150,6032.00],[9250,6181.56],[9350,6331.12],[9450,6480.67],\n      [9550,6630.23],[9650,6779.78],[9750,6929.34],[9850,7078.90],[10000,7228.45]\n    ];\n    for(const [max,val] of table) if(cc<=max) return val;\n    return null;\n  }\n\n  function brusselsPowerBand(cc,kw){\n    const ccBands=[1500,1900,2100,2700,3000,3400];\n    const kwBands=[70,85,100,110,120,155];\n    let ci=ccBands.findIndex(x=>cc<=x); if(ci<0) ci=6;\n    let ki=kwBands.findIndex(x=>kw<=x); if(ki<0) ki=6;\n    return Math.max(ci,ki);\n  }\n\n  function brusselsTaxes(i,years){\n    const type=carType(i);\n    if(type==='BEV'){\n      return {oneOff:78.88,annual:107.18,total:78.88+107.18*years,mode:'auto',msg:'Brussels 2026 non-leasing electric-car minimum rates.'};\n    }\n\n    const cc=Math.max(0,carNum(i,'BrCC'));\n    const kw=Math.max(0,carNum(i,'BrKW'));\n    const age=fullYearsSince(carEl(i,'BrFirstReg').value);\n    const bases=[78.88,157.76,634.89,1112.01,1589.14,3178.28,6357.85];\n    const factors=[1,.9,.8,.7,.6,.55,.5,.45,.4,.35,.3,.25,.2,.15,.1];\n    const band=brusselsPowerBand(cc,kw);\n    const factor=age>=15?0:factors[Math.max(0,age)];\n    const oneOff=age>=15?78.88:Math.max(78.88,bases[band]*factor);\n    const annual=annualRoadTaxByCC(cc);\n\n    if(annual===null){\n      return {oneOff,annual:0,total:oneOff,mode:'auto',msg:'BIV automatic. Annual tax for engine capacity above 10,000 cc is not supported in this beta.'};\n    }\n    return {oneOff,annual,total:oneOff+annual*years,mode:'auto',msg:'Brussels BIV uses the higher tax band from fiscal capacity\/engine size or kW, reduced for vehicle age; annual tax uses engine capacity.'};\n  }\n\n  function walloniaBaseByKW(kw){\n    if(kw<=70)return 64.01;\n    if(kw<=85)return 128.02;\n    if(kw<=100)return 515.20;\n    if(kw<=110)return 902.37;\n    if(kw<=120)return 1289.55;\n    if(kw<=155)return 2579.10;\n    return 5159.25;\n  }\n\n  function walloniaAgeFactor(age){\n    const f=[1,.9,.8,.7,.6,.55,.5,.45,.4,.35,.3,.25,.2,.15,.1];\n    return age>=15?0:f[Math.max(0,age)];\n  }\n\n  function walloniaEnergyCoefficient(type,kw){\n    if(type==='HEV'||type==='PHEV') return .8;\n    if(type==='BEV'){\n      if(kw<=120)return .01;\n      if(kw<=155)return .10;\n      if(kw<250)return .18;\n      return .26;\n    }\n    return 1;\n  }\n\n  function walloniaTaxes(i,years){\n    const type=carType(i);\n    const kw=Math.max(0,carNum(i,'WaKW'));\n    const mma=Math.max(1,carNum(i,'WaMMA'));\n    const cc=Math.max(0,carNum(i,'WaCC'));\n    const age=fullYearsSince(carEl(i,'WaFirstReg').value);\n    const co2=Math.max(0,carNum(i,'WaCO2'));\n    const cycle=carEl(i,'WaCycle').value;\n    const base=walloniaBaseByKW(kw);\n    const mb=age>=15?61.50:Math.max(61.50,base*walloniaAgeFactor(age));\n    const co2Factor=type==='BEV'?1:(co2\/(cycle==='NEDC'?115:136));\n    const massFactor=mma\/1838;\n    const energyFactor=walloniaEnergyCoefficient(type,kw);\n    const raw=mb*co2Factor*massFactor*energyFactor;\n    const oneOff=Math.max(50,Math.min(9000,raw));\n    const annual=type==='BEV'?107.18:annualRoadTaxByCC(cc);\n\n    if(annual===null){\n      return {oneOff,annual:0,total:oneOff,mode:'auto',msg:'Walloon TMC automatic. Annual tax for engine capacity above 10,000 cc is not supported in this beta.'};\n    }\n    return {\n      oneOff,annual,total:oneOff+annual*years,mode:'auto',\n      msg:'Walloon TMC = age-adjusted power base \u00d7 CO2 factor \u00d7 MMA\/1838 \u00d7 powertrain coefficient, capped at \u20ac50\u2013\u20ac9,000. Family reductions\/exemptions are not included.'\n    };\n  }\n\n\n  function luxembourgCO2Factor(co2){\n    if(co2 < 90) return 0.5;\n    return 0.6 + 0.1*Math.floor((co2-90)\/10);\n  }\n\n  function luxembourgTaxes(i,years){\n    const registrationFee=50;\n    const type=carType(i);\n\n    if(type==='BEV'){\n      const pre=q('[data-lu-pre2001-wrap=\"'+i+'\"]');\n      if(pre) pre.classList.add('hidden');\n      return {\n        oneOff:registrationFee,\n        annual:30,\n        total:registrationFee+30*years,\n        mode:'auto',\n        msg:'Luxembourg: \u20ac50 standard registration charge and \u20ac30\/year minimum road tax for a battery-electric passenger car.'\n      };\n    }\n\n    const reg=carEl(i,'LuFirstReg').value;\n    const d=new Date(reg+'T00:00:00');\n    const regYear=isNaN(d.getTime()) ? 2026 : d.getFullYear();\n    const pre=q('[data-lu-pre2001-wrap=\"'+i+'\"]');\n\n    if(regYear < 2001){\n      if(pre) pre.classList.remove('hidden');\n      const annual=Math.max(0,carNum(i,'LuPre2001Annual'));\n      return {\n        oneOff:registrationFee,\n        annual,\n        total:registrationFee+annual*years,\n        mode:'manual',\n        msg:'Pre-2001 Luxembourg passenger cars are taxed by engine capacity, so the annual amount is entered manually.'\n      };\n    }\n\n    if(pre) pre.classList.add('hidden');\n    const co2=Math.max(0,carNum(i,'LuCO2'));\n    const fuel=carEl(i,'LuFuel').value;\n    const b=fuel==='diesel' ? 0.9 : 0.6;\n    const c=luxembourgCO2Factor(co2);\n    const annual=Math.max(30,co2*b*c);\n    const cycle=regYear>=2021 ? 'WLTP' : 'NEDC';\n\n    return {\n      oneOff:registrationFee,\n      annual,\n      total:registrationFee+annual*years,\n      mode:'auto',\n      msg:'Luxembourg '+cycle+' road tax: CO2 \u00d7 '+(fuel==='diesel'?'0.9':'0.6')+' \u00d7 CO2 factor '+c.toFixed(1)+', subject to the \u20ac30 annual minimum.'\n    };\n  }\n\n  function netherlandsTaxes(i,years){\n    const qtr=Math.max(0,carNum(i,'NlQuarter'));\n    const type=carType(i);\n    const currentAnnual=qtr*4;\n    let total=0;\n\n    if(type==='BEV'){\n      const fullQuarter=qtr\/0.70; \/\/ 2026 displayed amount reflects 30% discount\n      for(let n=0;n<years;n++){\n        const year=2026+n;\n        const discount=year<=2028?.30:(year===2029?.25:0);\n        total+=fullQuarter*4*(1-discount);\n      }\n    }else{\n      total=currentAnnual*years;\n    }\n    return {oneOff:0,annual:currentAnnual,total,mode:'assisted',msg:type==='BEV'?'Current official MRB + statutory BEV discount schedule; future indexation excluded.':'Current official MRB held constant over the ownership period; future indexation excluded.'};\n  }\n\n  function manualTaxes(i,years){\n    const oneOff=Math.max(0,carNum(i,'RegManual'));\n    const annual=Math.max(0,carNum(i,'RoadManual'));\n    return {oneOff,annual,total:oneOff+annual*years,mode:'manual',msg:'Manual regional tax values.'};\n  }\n\n  function getTaxes(i,years){\n    if(country==='NL') return netherlandsTaxes(i,years);\n    if(country==='LU') return luxembourgTaxes(i,years);\n    const region=el('beRegion').value;\n    if(region==='Flanders') return flandersTaxes(i,years);\n    if(region==='Brussels') return brusselsTaxes(i,years);\n    if(region==='Wallonia') return walloniaTaxes(i,years);\n    return {oneOff:0,annual:0,total:0,mode:'manual',msg:'No tax module selected.'};\n  }\n\n  function updateTaxUI(i){\n    const fl=q('[data-flanders-tax=\"'+i+'\"]');\n    const br=q('[data-brussels-tax=\"'+i+'\"]');\n    const wa=q('[data-wallonia-tax=\"'+i+'\"]');\n    const lu=q('[data-luxembourg-tax=\"'+i+'\"]');\n    const nl=q('[data-nl-tax=\"'+i+'\"]');\n    const badge=q('[data-taxbadge=\"'+i+'\"]'),box=q('[data-taxbox=\"'+i+'\"]');\n    const years=Math.max(1,num('years'));\n    [fl,br,wa,lu,nl].filter(Boolean).forEach(x=>x.classList.add('hidden'));\n\n    if(country==='NL'){\n      nl.classList.remove('hidden');\n      badge.className='taxbadge auto'; badge.textContent='assisted';\n      box.className='taxbox auto';\n      const t=netherlandsTaxes(i,years);\n      q('[data-nl-year=\"'+i+'\"]').textContent=money(t.annual);\n      q('[data-nl-total=\"'+i+'\"]').textContent=money(t.total);\n      return;\n    }\n\n    if(country==='LU'){\n      lu.classList.remove('hidden');\n      badge.className='taxbadge auto'; badge.textContent='automatic 2026';\n      box.className='taxbox auto';\n      const t=luxembourgTaxes(i,years);\n      q('[data-lu-reg=\"'+i+'\"]').textContent=money2(t.oneOff);\n      q('[data-lu-road=\"'+i+'\"]').textContent=money2(t.annual);\n      q('[data-lu-msg=\"'+i+'\"]').textContent=t.msg;\n      return;\n    }\n\n    const region=el('beRegion').value;\n    badge.className='taxbadge auto'; badge.textContent='automatic 2026';\n    box.className='taxbox auto';\n\n    if(region==='Flanders'){\n      fl.classList.remove('hidden');\n      const t=flandersTaxes(i,years);\n      q('[data-fl-biv=\"'+i+'\"]').textContent=money2(t.oneOff);\n      q('[data-fl-road=\"'+i+'\"]').textContent=money2(t.annual);\n      q('[data-fl-msg=\"'+i+'\"]').textContent=t.msg;\n    }else if(region==='Brussels'){\n      br.classList.remove('hidden');\n      const t=brusselsTaxes(i,years);\n      q('[data-br-biv=\"'+i+'\"]').textContent=money2(t.oneOff);\n      q('[data-br-road=\"'+i+'\"]').textContent=money2(t.annual);\n      q('[data-br-msg=\"'+i+'\"]').textContent=t.msg;\n    }else{\n      wa.classList.remove('hidden');\n      const t=walloniaTaxes(i,years);\n      q('[data-wa-tmc=\"'+i+'\"]').textContent=money2(t.oneOff);\n      q('[data-wa-road=\"'+i+'\"]').textContent=money2(t.annual);\n      q('[data-wa-msg=\"'+i+'\"]').textContent=t.msg;\n    }\n  }\n\n  function fixed(i,years){\n    const purchase=carNum(i,'Price'), used=carStatus(i)!=='new';\n    const residual=used?Math.min(purchase,Math.max(0,carNum(i,'ResaleEuro'))):purchase*carNum(i,'Residual')\/100;\n    return{\n      purchase,residual,depreciation:Math.max(0,purchase-residual),\n      repairs:used?carNum(i,'Repairs')*years:0,\n      maintenance:carNum(i,'Maint')*years,\n      insurance:carNum(i,'Ins')*years\n    };\n  }\n\n\n  function businessVatRate(){\n    if(country==='LU') return 17;\n    return 21; \/\/ Belgium and Netherlands standard VAT rate\n  }\n\n  function businessCalc(r,years){\n    const vatRecoveryPct=Math.min(100,Math.max(0,num('bizVatRecoverable')))\/100;\n    const corpTaxPct=Math.min(100,Math.max(0,num('bizCorpTax')))\/100;\n    const deductiblePct=Math.min(100,Math.max(0,carNum(r.i,'BizDeductible')))\/100;\n    const vatStatus=(carEl(r.i,'BizVatStatus')?.value||'deductible');\n    const vatRate=businessVatRate()\/100;\n    const vatFraction=vatRate\/(1+vatRate);\n\n    \/*\n     * Indicative Business v2 model:\n     *\n     * 1) Gross company TCO remains the existing Private TCO.\n     *\n     * 2) Purchase VAT:\n     *    - \"VAT deductible\": estimate VAT contained in today's purchase price\n     *      and apply the company-wide recoverable VAT percentage.\n     *    - \"Margin \/ no recoverable purchase VAT\": purchase VAT recovery = 0.\n     *\n     * 3) Running-cost VAT:\n     *    estimate VAT contained in energy\/fuel, maintenance and extra repairs\/wear,\n     *    then apply the same recoverable VAT percentage.\n     *    Insurance and vehicle taxes are excluded.\n     *\n     * 4) Resale VAT consequences are NOT modelled in beta2 because treatment can\n     *    depend on purchase route, VAT history and the eventual sale transaction.\n     *\n     * 5) Corporate tax saving:\n     *    apply the per-car deductibility percentage and the entered corporate tax\n     *    rate to gross TCO after estimated recoverable VAT.\n     *\n     * 6) Benefit in kind:\n     *    shown separately as employee-side information and not included in company TCO.\n     *\/\n    const purchaseVatContained=vatStatus==='deductible' ? Math.max(0,r.purchase)*vatFraction : 0;\n    const purchaseVatRecovery=purchaseVatContained*vatRecoveryPct;\n\n    const runningVatBearing=Math.max(0,r.energy+r.maintenance+r.repairs);\n    const runningVatContained=runningVatBearing*vatFraction;\n    const runningVatRecovery=runningVatContained*vatRecoveryPct;\n\n    const recoverableVat=purchaseVatRecovery+runningVatRecovery;\n    const afterVat=Math.max(0,r.total-recoverableVat);\n    const deductibleBase=afterVat*deductiblePct;\n    const corporateTaxSaving=deductibleBase*corpTaxPct;\n    const netCompanyCost=Math.max(0,afterVat-corporateTaxSaving);\n\n    const bikMode=el('bizBikMode')?el('bizBikMode').value:'off';\n    const bikAnnual=bikMode==='manual'?Math.max(0,num('bizBikAmount')):0;\n    const bikPeriod=bikAnnual*years;\n\n    return {\n      vatRate:businessVatRate(),\n      vatStatus,\n      vatRecoveryPct:vatRecoveryPct*100,\n      deductiblePct:deductiblePct*100,\n      corpTaxPct:corpTaxPct*100,\n      purchaseVatContained,\n      purchaseVatRecovery,\n      runningVatBearing,\n      runningVatContained,\n      runningVatRecovery,\n      recoverableVat,\n      afterVat,\n      deductibleBase,\n      corporateTaxSaving,\n      netCompanyCost,\n      bikAnnual,\n      bikPeriod\n    };\n  }\n\n  function calcCar(i,years,kmYear){\n    const type=carType(i),f=fixed(i,years),tax=getTaxes(i,years);\n    let variablePerKm=0;\n\n    if(type==='ICE'){\n      const fuel=carEl(i,'Fuel').value,fp=fuel==='diesel'?num('dieselPrice'):num('petrolPrice');\n      variablePerKm=carNum(i,'FuelCons')\/100*fp;\n    }else if(type==='HEV'){\n      const fuel=carEl(i,'HevFuel').value,fp=fuel==='diesel'?num('dieselPrice'):num('petrolPrice');\n      variablePerKm=carNum(i,'HevFuelCons')\/100*fp;\n    }else if(type==='PHEV'){\n      const share=Math.min(100,Math.max(0,carNum(i,'PhevElecShare')))\/100;\n      const ep=weighted(carNum(i,'PhevHome'),carNum(i,'PhevPublic'),0);\n      variablePerKm=share*(carNum(i,'PhevElecCons')\/100*ep)+(1-share)*(carNum(i,'PhevFuelCons')\/100*num('petrolPrice'));\n    }else{\n      const ep=weighted(carNum(i,'BevHome'),carNum(i,'BevPublic'),carNum(i,'BevFast'));\n      variablePerKm=carNum(i,'BevCons')\/100*ep;\n    }\n\n    const energy=variablePerKm*kmYear*years;\n    const total=f.depreciation+f.repairs+f.maintenance+f.insurance+tax.total+energy;\n    const usedValuation=carStatus(i)==='new'?null:suggestedUsedResale(i,years,kmYear);\n    const base={i,type,status:carStatus(i),name:carEl(i,'Name').value,...f,tax,energy,usedValuation,total,years,kmYear,monthly:total\/(years*12),costKm:total\/(years*kmYear)};\n    base.business=businessCalc(base,years);\n    return base;\n  }\n\n  function renderResult(r){\n    return '<div class=\"type-label\">'+r.type+'<\/div><strong>'+esc(r.name)+'<\/strong>'+\n      '<div><span class=\"status '+r.status+'\">'+statusText(r.status)+'<\/span><\/div>'+\n      '<div class=\"monthly\">'+money(buyerMode==='business' ? (r.business.netCompanyCost\/(r.years*12)) : r.monthly)+'<span style=\"font-size:14px\">\/month<\/span><\/div>'+\n      '<div class=\"small\">'+money2(buyerMode==='business' ? (r.business.netCompanyCost\/(r.years*r.kmYear)) : r.costKm)+' per km \u00b7 '+money(buyerMode==='business' ? r.business.netCompanyCost : r.total)+(buyerMode==='business'?' net company cost':' total')+'<\/div>'+\n      '<div style=\"margin-top:11px\">'+\n      '<div class=\"metric\"><span>Depreciation<\/span><b>'+money(r.depreciation)+'<\/b><\/div>'+\n      '<div class=\"metric\"><span>Energy \/ fuel<\/span><b>'+money(r.energy)+'<\/b><\/div>'+\n      '<div class=\"metric\"><span>Maintenance<\/span><b>'+money(r.maintenance)+'<\/b><\/div>'+\n      (r.status!=='new'?'<div class=\"metric\"><span>Extra repairs \/ wear<\/span><b>'+money(r.repairs)+'<\/b><\/div>':'')+\n      '<div class=\"metric\"><span>Insurance<\/span><b>'+money(r.insurance)+'<\/b><\/div>'+\n      '<div class=\"metric\"><span>Taxes over period<\/span><b>'+money(r.tax.total)+'<\/b><\/div>'+\n      (r.status!=='new' && r.usedValuation?'<div class=\"metric\"><span>Expected mileage at resale<\/span><b>'+Math.round(r.usedValuation.futureKm).toLocaleString('en-BE')+' km<\/b><\/div>':'')+\n      '<div class=\"metric\"><span>Expected resale value<\/span><b>'+money(r.residual)+'<\/b><\/div><\/div>'+\n      (buyerMode==='business'?'<div class=\"business-result-preview\">'+\n        '<strong>Business estimate<\/strong>'+\n        '<div class=\"metric\"><span>Gross company TCO<\/span><b>'+money(r.total)+'<\/b><\/div>'+\n        '<div class=\"metric\"><span>Gross company cost \/ month<\/span><b>'+money(r.total\/(r.years*12))+'<\/b><\/div>'+\n        '<div class=\"metric\"><span>Purchase VAT recovery (est.)<\/span><b>'+(Math.round(r.business.purchaseVatRecovery)===0?money(0):'\u2212 '+money(r.business.purchaseVatRecovery))+'<\/b><\/div>'+\n        '<div class=\"metric\"><span>Running-cost VAT recovery (est.)<\/span><b>'+(Math.round(r.business.runningVatRecovery)===0?money(0):'\u2212 '+money(r.business.runningVatRecovery))+'<\/b><\/div>'+\n        '<div class=\"metric\"><span>Total recoverable VAT (est.)<\/span><b>'+(Math.round(r.business.recoverableVat)===0?money(0):'\u2212 '+money(r.business.recoverableVat))+'<\/b><\/div>'+\n        '<div class=\"metric\"><span>Corporate tax saving (est.)<\/span><b>'+(Math.round(r.business.corporateTaxSaving)===0?money(0):'\u2212 '+money(r.business.corporateTaxSaving))+'<\/b><\/div>'+\n        '<div class=\"metric\"><span>Estimated net company cost<\/span><b>'+money(r.business.netCompanyCost)+'<\/b><\/div>'+\n        (r.business.bikAnnual>0?'<div class=\"metric\"><span>Benefit in kind (manual; not included)<\/span><b>'+money(r.business.bikAnnual)+'\/yr<\/b><\/div>':'')+\n        '<div class=\"hint\" style=\"margin-top:6px\">Purchase VAT status: '+(r.business.vatStatus==='deductible'?'VAT deductible':'Margin \/ no recoverable purchase VAT')+'. Running-cost VAT estimate uses the selected country\u2019s standard VAT rate ('+r.business.vatRate+'%). Insurance, vehicle taxes and resale VAT consequences are excluded.<\/div>'+\n      '<\/div>':'');\n  }\n\n  function activeCarIndexes(){\n    return car3Active ? [1,2,3] : [1,2];\n  }\n\n  function setCar3Active(active){\n    car3Active=active;\n    const card3=q('[data-card=\"3\"]');\n    const result3=q('[data-result=\"3\"]');\n    const carsGrid=el('carsGrid');\n    const resultsGrid=el('resultsGrid');\n    card3.classList.toggle('hidden',!active);\n    result3.classList.toggle('hidden',!active);\n    carsGrid.classList.toggle('two-cars',!active);\n    resultsGrid.classList.toggle('two-cars',!active);\n    el('addCar3').classList.toggle('hidden',active);\n    calculate();\n  }\n\n  function calculate(){\n    const years=Math.max(1,num('years')),km=Math.max(1,num('km'));\n    const active=activeCarIndexes();\n    active.forEach(i=>{updateUsedValuation(i);updateTaxUI(i)});\n    const cars=active.map(i=>calcCar(i,years,km));\n    const comparisonValue=c=>buyerMode==='business'?c.business.netCompanyCost:c.total;\n    const min=Math.min(...cars.map(comparisonValue));\n    cars.forEach(c=>{\n      const box=q('[data-result=\"'+c.i+'\"]');\n      box.classList.remove('best');\n      box.innerHTML=renderResult(c);\n      if(Math.abs(comparisonValue(c)-min)<0.005) box.classList.add('best');\n    });\n    const sorted=[...cars].sort((a,b)=>comparisonValue(a)-comparisonValue(b));\n    const scope=country==='BE'?'Belgium \u00b7 '+el('beRegion').value:(country==='NL'?'Netherlands \u00b7 '+el('nlProvince').value:'Luxembourg');\n    const savings=sorted.slice(1).map(c=>({name:c.name,amount:comparisonValue(c)-comparisonValue(sorted[0])}));\n    const savingsHtml=savings.map(s=>'<strong>'+money(s.amount)+'<\/strong> vs '+esc(s.name)).join(' and ');\n    el('winner').innerHTML=buyerMode==='business'\n      ?'<strong>'+esc(sorted[0].name)+' has the lowest estimated net company cost.<\/strong> In <strong>'+esc(scope)+'<\/strong>, it saves '+savingsHtml+' over '+years+' years under the Business assumptions entered above.'\n      :'<strong>'+esc(sorted[0].name)+' has the lowest estimated TCO.<\/strong> In <strong>'+esc(scope)+'<\/strong>, it saves '+savingsHtml+' over '+years+' years.';\n    const unique=[...new Set(cars.map(c=>c.type))];\n    const countLabel=cars.length===2?'both cars':'all three cars';\n    el('comparisonNote').innerHTML=unique.length===1\n      ?'<strong>Like-for-like:<\/strong> '+countLabel+' are '+unique[0]+'s.'\n      :'<strong>Mixed powertrains:<\/strong> '+cars.map(c=>c.type).join(' vs ')+'.';\n    const max=Math.max(...cars.map(comparisonValue));\n    el('bars').innerHTML=cars.map(c=>{\n      const v=comparisonValue(c);\n      return '<div class=\"bar-row\"><strong>'+esc(c.name)+'<\/strong><div class=\"track\"><div class=\"fill '+cls(c.type)+'\" style=\"width:'+(v\/max*100).toFixed(1)+'%\"><\/div><\/div><b>'+money(v)+'<\/b><\/div>';\n    }).join('');\n    updateCountryNote();\n  }\n\n  function setBuyerMode(mode){\n    buyerMode=mode==='business'?'business':'private';\n    qa('.buyer-btn').forEach(btn=>{\n      const active=btn.dataset.buyer===buyerMode;\n      btn.classList.toggle('active',active);\n      btn.setAttribute('aria-pressed',active?'true':'false');\n    });\n    el('businessPanel').classList.toggle('hidden',buyerMode!=='business');\n    if(el('buyerHelp')) el('buyerHelp').textContent='';\n    qa('[data-business-only]').forEach(node=>node.classList.toggle('hidden',buyerMode!=='business'));\n    if(el('comparisonAssumptionNote')){\n      el('comparisonAssumptionNote').innerHTML=buyerMode==='business'\n        ?'<strong>Business mode:<\/strong> headline monthly cost and cost\/km use the estimated net company cost. Gross TCO remains visible in the Business breakdown. Benefit in kind is shown separately.'\n        :'NMN default assumptions are used wherever you have not fine-tuned a value. Expand any <strong>Fine-tune<\/strong> section above if you know your own charging, resale, maintenance, insurance or tax figures.';\n    }\n    if(el('downloadPdf')) el('downloadPdf').disabled=false;\n    if(el('pdfStatus')){\n      el('pdfStatus').textContent=buyerMode==='business'\n        ?'Calculate TCO refreshes all current inputs. Business PDF includes the entered VAT and deductibility assumptions.'\n        :'Calculate TCO refreshes all current inputs. Download PDF recalculates once more before export.';\n    }\n    calculate();\n  }\n\n  function updateBikField(){\n    const mode=el('bizBikMode')?el('bizBikMode').value:'off';\n    if(el('bizBikAmountWrap')) el('bizBikAmountWrap').classList.toggle('hidden',mode!=='manual');\n  }\n\n  function recalculateEverything(showStatus=true){\n    \/*\n     * Master refresh:\n     * - commit the field currently being edited\n     * - re-read every current input value\n     * - recalculate taxes for every active car\n     * - recalculate TCO, comparison, bars and winner\n     *\/\n    const activeElement=document.activeElement;\n    if(activeElement && root.contains(activeElement) && typeof activeElement.blur==='function'){\n      activeElement.blur();\n    }\n\n    activeCarIndexes().forEach(i=>{\n      updateUsedValuation(i);\n      updateTaxUI(i);\n    });\n    calculate();\n\n    if(showStatus && el('pdfStatus')){\n      el('pdfStatus').textContent='TCO recalculated from all current inputs.';\n    }\n  }\n\n\n  function pdfLocationLabel(){\n    if(country==='BE') return 'Belgium - '+el('beRegion').value;\n    if(country==='NL') return 'Netherlands - '+el('nlProvince').value;\n    return 'Luxembourg';\n  }\n\n  function pdfFuelEnergyAssumption(i){\n    const type=carType(i);\n    if(type==='ICE'){\n      const fuel=carEl(i,'Fuel').value;\n      return (fuel==='diesel'?'Diesel':'Petrol')+' '+carNum(i,'FuelCons').toFixed(1)+' l\/100 km';\n    }\n    if(type==='HEV'){\n      const fuel=carEl(i,'HevFuel').value;\n      return 'HEV '+(fuel==='diesel'?'diesel':'petrol')+' '+carNum(i,'HevFuelCons').toFixed(1)+' l\/100 km';\n    }\n    if(type==='PHEV'){\n      return 'PHEV '+carNum(i,'PhevElecShare').toFixed(0)+'% electric; '+carNum(i,'PhevElecCons').toFixed(1)+' kWh\/100 km';\n    }\n    return 'BEV '+carNum(i,'BevCons').toFixed(1)+' kWh\/100 km';\n  }\n\n  function pdfColorForType(type){\n    if(type==='ICE') return [107,114,128];\n    if(type==='HEV') return [202,138,4];\n    if(type==='PHEV') return [15,118,110];\n    return [29,78,216];\n  }\n\n  function pdfSafeName(name){\n    return String(name||'car').replace(\/[^\\w\\-]+\/g,'-').replace(\/-+\/g,'-').replace(\/^-|-$\/g,'').slice(0,45) || 'car';\n  }\n\n\n  function inputMoney(i,key){\n    return carNum(i,key);\n  }\n\n  function inputResidualLabel(i){\n    if(carStatus(i)==='new'){\n      return carNum(i,'Residual').toFixed(0)+'%';\n    }\n    return money(inputMoney(i,'ResaleEuro'));\n  }\n\n  function inputConsumptionLabel(i){\n    const type=carType(i);\n    if(type==='ICE'){\n      const fuel=carEl(i,'Fuel').value==='diesel'?'Diesel':'Petrol';\n      return fuel+' '+carNum(i,'FuelCons').toFixed(1)+' l\/100 km';\n    }\n    if(type==='HEV'){\n      const fuel=carEl(i,'HevFuel').value==='diesel'?'Diesel':'Petrol';\n      return fuel+' '+carNum(i,'HevFuelCons').toFixed(1)+' l\/100 km';\n    }\n    if(type==='PHEV'){\n      return carNum(i,'PhevFuelCons').toFixed(1)+' l\/100 km + '+carNum(i,'PhevElecCons').toFixed(1)+' kWh\/100 km; '+carNum(i,'PhevElecShare').toFixed(0)+'% electric';\n    }\n    return carNum(i,'BevCons').toFixed(1)+' kWh\/100 km';\n  }\n\n  function inputChargingLabel(i){\n    const type=carType(i);\n    if(type==='BEV'){\n      return 'Home '+carNum(i,'BevHome').toFixed(0)+'% \/ AC '+carNum(i,'BevPublic').toFixed(0)+'% \/ Fast '+carNum(i,'BevFast').toFixed(0)+'%';\n    }\n    if(type==='PHEV'){\n      return 'Home '+carNum(i,'PhevHome').toFixed(0)+'% \/ AC '+carNum(i,'PhevPublic').toFixed(0)+'%';\n    }\n    return '\u2014';\n  }\n\n  function inputTaxDetailsLabel(i){\n    if(country==='LU'){\n      if(carType(i)==='BEV') return 'BEV minimum road tax';\n      return 'CO2 '+carNum(i,'LuCO2').toFixed(0)+' g\/km \u00b7 '+(carEl(i,'LuFuel').value==='diesel'?'Diesel':'Other');\n    }\n    if(country==='NL'){\n      return 'MRB '+money(carNum(i,'NlQuarter'))+'\/quarter';\n    }\n    const region=el('beRegion').value;\n    if(region==='Flanders'){\n      if(carType(i)==='BEV') return 'Flemish BEV flat rates';\n      return 'CO2 '+carNum(i,'CO2').toFixed(0)+' g\/km \u00b7 '+carNum(i,'CC').toFixed(0)+' cc \u00b7 Euro '+carEl(i,'Euro').value;\n    }\n    if(region==='Brussels'){\n      if(carType(i)==='BEV') return 'Brussels BEV flat rates';\n      return carNum(i,'BrCC').toFixed(0)+' cc \u00b7 '+carNum(i,'BrKW').toFixed(0)+' kW';\n    }\n    if(carType(i)==='BEV') return 'Walloon BEV tax formula';\n    return 'CO2 '+carNum(i,'WaCO2').toFixed(0)+' g\/km \u00b7 '+carNum(i,'WaKW').toFixed(0)+' kW \u00b7 MMA '+carNum(i,'WaMMA').toFixed(0)+' kg';\n  }\n\n  function carInputSummary(i){\n    const status=carStatus(i);\n    const valuation=status==='new'?null:suggestedUsedResale(i,Math.max(1,num('years')),Math.max(1,num('km')));\n    return {\n      name:carEl(i,'Name').value,\n      type:carType(i),\n      status:statusText(status),\n      purchase:carNum(i,'Price'),\n      residual:inputResidualLabel(i),\n      consumption:inputConsumptionLabel(i),\n      charging:inputChargingLabel(i),\n      maintenance:carNum(i,'Maint'),\n      insurance:carNum(i,'Ins'),\n      extraRepairs:status==='new'?0:carNum(i,'Repairs'),\n      taxDetails:inputTaxDetailsLabel(i),\n      business:{\n        vatStatus:carEl(i,'BizVatStatus')?.value||'deductible',\n        deductible:Math.min(100,Math.max(0,carNum(i,'BizDeductible')))\n      },\n      used:status==='new'?null:{\n        firstReg:carEl(i,'UsedFirstReg')?.value||'\u2014',\n        currentKm:carNum(i,'CurrentKm'),\n        futureKm:valuation?valuation.futureKm:null,\n        futureAge:valuation?valuation.futureAge:null,\n        suggested:valuation?valuation.suggested:null,\n        auto:!!carEl(i,'AutoResale')?.checked\n      }\n    };\n  }\n\n  function currentComparisonData(){\n    const years=Math.max(1,num('years'));\n    const km=Math.max(1,num('km'));\n    const active=activeCarIndexes();\n    active.forEach(i=>{updateUsedValuation(i);updateTaxUI(i)});\n    const cars=active.map(i=>calcCar(i,years,km));\n    const comparisonValue=c=>buyerMode==='business'?c.business.netCompanyCost:c.total;\n    const sorted=[...cars].sort((a,b)=>comparisonValue(a)-comparisonValue(b));\n    return {\n      years, km, cars,\n      buyerMode,\n      winner:sorted[0],\n      saving:sorted.length>1 ? comparisonValue(sorted[1])-comparisonValue(sorted[0]) : 0,\n      savings:sorted.slice(1).map(c=>({name:c.name,amount:comparisonValue(c)-comparisonValue(sorted[0])})),\n      location:pdfLocationLabel(),\n      assumptions:{\n        petrol:num('petrolPrice'),\n        diesel:num('dieselPrice'),\n        home:num('homePrice'),\n        publicAC:num('publicPrice'),\n        fast:num('fastPrice')\n      },\n      businessAssumptions: buyerMode==='business' ? {\n        vatRecoverable:Math.min(100,Math.max(0,num('bizVatRecoverable'))),\n        corporateTax:Math.min(100,Math.max(0,num('bizCorpTax'))),\n        bikMode:el('bizBikMode')?el('bizBikMode').value:'off',\n        bikAnnual:el('bizBikMode')?.value==='manual'?Math.max(0,num('bizBikAmount')):0\n      } : null,\n      inputCars:active.map(i=>carInputSummary(i))\n    };\n  }\n\n  function addPdfText(doc,text,x,y,maxWidth,lineHeight){\n    const lines=doc.splitTextToSize(String(text),maxWidth);\n    doc.text(lines,x,y);\n    return y+(lines.length*(lineHeight||4.2));\n  }\n\n\n\n  function countTcoServerMetric(metric){\n    \/*\n     * Aggregate hit to the NMN TCO Counter WordPress plugin.\n     * Tracking must never interrupt the calculator.\n     *\/\n    try{\n      fetch('\/wp-json\/nmn-tco\/v1\/hit',{\n        method:'POST',\n        credentials:'same-origin',\n        headers:{'Content-Type':'application\/json'},\n        body:JSON.stringify({metric:metric}),\n        keepalive:true\n      }).catch(()=>{});\n    }catch(err){}\n  }\n\n  function trackTcoEvent(eventName, params={}){\n    try{\n      if(typeof window.gtag === 'function'){\n        window.gtag('event',eventName,{\n          event_category:'NMN TCO Calculator',\n          ...params\n        });\n        return;\n      }\n      if(Array.isArray(window.dataLayer)){\n        window.dataLayer.push({\n          event:eventName,\n          event_category:'NMN TCO Calculator',\n          ...params\n        });\n      }\n    }catch(err){}\n  }\n\n  let comparisonCountTimer=null;\n\n  function trackCalculatorSessionUse(){\n    \/*\n     * Count one real calculator use per browser session.\n     * A \"use\" begins on the first meaningful user interaction with the\n     * calculator \u2014 not merely when the page loads.\n     *\/\n    try{\n      if(!sessionStorage.getItem('nmn_tco_used')){\n        sessionStorage.setItem('nmn_tco_used','1');\n        countTcoServerMetric('uses');\n\n        trackTcoEvent('tco_calculator_used',{\n          country:country,\n          region:country==='BE' ? el('beRegion').value : '',\n          active_cars:activeCarIndexes().length\n        });\n      }\n    }catch(err){}\n  }\n\n  function countMeaningfulComparison(source='auto', immediate=false){\n    \/*\n     * The calculator recalculates live. Count meaningful comparisons rather\n     * than every internal JavaScript refresh:\n     * - user changes are debounced, so several quick edits count as one;\n     * - an explicit Calculate TCO click counts immediately;\n     * - initial page setup\/recalculation is never counted.\n     *\/\n    trackCalculatorSessionUse();\n\n    const fire=()=>{\n      comparisonCountTimer=null;\n      countTcoServerMetric('calculations');\n      trackTcoEvent('tco_calculation',{\n        source:source,\n        country:country,\n        region:country==='BE' ? el('beRegion').value : '',\n        active_cars:activeCarIndexes().length\n      });\n    };\n\n    if(comparisonCountTimer){\n      clearTimeout(comparisonCountTimer);\n      comparisonCountTimer=null;\n    }\n\n    if(immediate){\n      fire();\n    }else{\n      comparisonCountTimer=setTimeout(fire,900);\n    }\n  }\n\n  function generatePdf(){\n    recalculateEverything(false);\n    const status=el('pdfStatus');\n\n    if(!window.jspdf || !window.jspdf.jsPDF){\n      status.textContent='PDF library unavailable. Please try Download PDF again or use your browser\u2019s normal print command.';\n      return;\n    }\n\n    try{\n      status.textContent='Generating PDF...';\n\n      const data=currentComparisonData();\n      const jsPDF=window.jspdf.jsPDF;\n      const doc=new jsPDF({orientation:'landscape',unit:'mm',format:'a4'});\n\n      const pageW=297, pageH=210, margin=12;\n      const black=[19,20,23], red=[214,31,38], grey=[102,112,133], pale=[247,248,250], green=[20,122,82];\n\n      function header(title,subtitle){\n        doc.setFillColor(...black); doc.rect(0,0,pageW,24,'F');\n        doc.setFillColor(...red); doc.rect(0,24,pageW,2.2,'F');\n        doc.setTextColor(255,255,255);\n        doc.setFont('helvetica','bold'); doc.setFontSize(18);\n        doc.text(title,margin,10.5);\n        doc.setFont('helvetica','normal'); doc.setFontSize(8.5);\n        doc.text(subtitle,margin,17);\n\n        const generated=new Date().toLocaleDateString('en-BE',{year:'numeric',month:'long',day:'numeric'});\n        doc.text('Generated '+generated,pageW-margin,10.5,{align:'right'});\n        doc.text(data.location+'  |  Build v6.0.2',pageW-margin,17,{align:'right'});\n      }\n\n      function footer(pageLabel){\n        doc.setFontSize(6.7); doc.setTextColor(120,128,140);\n        doc.text('\u00a9 2026 B2BNews Agency \u00b7 Newmobility.news \u00b7 All rights reserved',margin,pageH-6);\n        doc.text(pageLabel,pageW-margin,pageH-6,{align:'right'});\n      }\n\n      \/\/ PAGE 1 \u2014 STARTING ASSUMPTIONS\n      header('NMN TCO Comparison','Starting assumptions');\n\n      doc.setTextColor(...black);\n      doc.setFont('helvetica','bold'); doc.setFontSize(10);\n      doc.text('Global assumptions',margin,35);\n\n      doc.setFont('helvetica','normal'); doc.setFontSize(8.5);\n      doc.text(\n        data.years+' years ownership  |  '+data.km.toLocaleString('en-BE')+' km\/year  |  '+(data.years*data.km).toLocaleString('en-BE')+' km total  |  '+data.location,\n        margin,41\n      );\n      doc.text(\n        'Petrol EUR '+data.assumptions.petrol.toFixed(2)+'\/l  |  Diesel EUR '+data.assumptions.diesel.toFixed(2)+'\/l  |  Home EUR '+data.assumptions.home.toFixed(2)+'\/kWh  |  Public AC EUR '+data.assumptions.publicAC.toFixed(2)+'\/kWh  |  Fast EUR '+data.assumptions.fast.toFixed(2)+'\/kWh',\n        margin,46\n      );\n\n      if(data.buyerMode==='business'){\n        doc.setFont('helvetica','bold'); doc.setTextColor(...red); doc.setFontSize(8.2);\n        doc.text('BUSINESS',margin,51);\n        doc.setFont('helvetica','normal'); doc.setTextColor(...grey); doc.setFontSize(7.5);\n        const bikTxt=data.businessAssumptions.bikMode==='manual'\n          ?'Benefit in kind '+money(data.businessAssumptions.bikAnnual)+'\/year (not included)'\n          :'Benefit in kind off';\n        doc.text(\n          'VAT recoverable '+data.businessAssumptions.vatRecoverable.toFixed(0)+'%  |  Corporate tax '+data.businessAssumptions.corporateTax.toFixed(0)+'%  |  '+bikTxt,\n          margin+19,51\n        );\n      }\n\n      const gap=5;\n      const contentW=pageW-margin*2;\n      const cardW=(contentW-gap*(data.inputCars.length-1))\/data.inputCars.length;\n      const cardY=data.buyerMode==='business'?58:54;\n      const cardH=data.buyerMode==='business'?106:110;\n\n      data.inputCars.forEach((c,idx)=>{\n        const x=margin+idx*(cardW+gap);\n        const color=pdfColorForType(c.type);\n\n        doc.setDrawColor(220,224,230);\n        doc.setLineWidth(.3);\n        doc.setFillColor(255,255,255);\n        doc.roundedRect(x,cardY,cardW,cardH,2,2,'FD');\n        doc.setFillColor(...color); doc.rect(x,cardY,cardW,4,'F');\n\n        doc.setTextColor(...grey); doc.setFont('helvetica','bold'); doc.setFontSize(7.5);\n        doc.text(c.type+'  |  '+c.status.toUpperCase(),x+4,cardY+10);\n\n        doc.setTextColor(...black); doc.setFontSize(11);\n        doc.text(doc.splitTextToSize(c.name,cardW-8).slice(0,2),x+4,cardY+17);\n\n        let y=cardY+30;\n        const labelX=x+4;\n        const valueX=x+cardW-4;\n\n        const rows=c.used ? [\n          ['Purchase price',money(c.purchase)],\n          ['Expected resale',c.residual],\n          ['First reg \/ current km',c.used.firstReg+' \u00b7 '+Math.round(c.used.currentKm).toLocaleString('en-BE')+' km'],\n          ['At resale',c.used.futureKm!==null?Math.round(c.used.futureKm).toLocaleString('en-BE')+' km \u00b7 '+c.used.futureAge.toFixed(1)+' yr':'\u2014'],\n          ['NMN suggestion',c.used.suggested!==null?money(c.used.suggested)+(c.used.auto?' \u00b7 auto':' \u00b7 manual'):'\u2014'],\n          ['Consumption',c.consumption],\n          ['Fixed costs \/ year',money(c.maintenance)+' maint \u00b7 '+money(c.insurance)+' ins'+(c.extraRepairs?' \u00b7 '+money(c.extraRepairs)+' repairs':'')],\n          ['Tax input',c.taxDetails]\n        ] : [\n          ['Purchase price',money(c.purchase)],\n          ['Residual \/ resale',c.residual],\n          ['Consumption',c.consumption],\n          ['Charging mix',c.charging],\n          ['Maintenance \/ year',money(c.maintenance)],\n          ['Insurance \/ year',money(c.insurance)],\n          ['Extra repairs \/ year','\u2014'],\n          ['Tax input',c.taxDetails]\n        ];\n\n        if(data.buyerMode==='business'){\n          rows.push(\n            ['Purchase VAT',c.business.vatStatus==='deductible'?'VAT deductible':'Margin \/ no purchase VAT'],\n            ['Tax deductibility',c.business.deductible.toFixed(0)+'%']\n          );\n        }\n\n        rows.forEach(([label,value],ridx)=>{\n          if(ridx%2===1){\n            doc.setFillColor(...pale);\n            doc.rect(x+2,y-4.3,cardW-4,8,'F');\n          }\n          doc.setFont('helvetica','normal'); doc.setFontSize(7.2); doc.setTextColor(...grey);\n          doc.text(label,labelX,y);\n\n          doc.setFont('helvetica','bold'); doc.setTextColor(...black);\n          const valLines=doc.splitTextToSize(String(value),cardW-34);\n          doc.text(valLines.slice(0,2),valueX,y,{align:'right'});\n          y+=data.buyerMode==='business'?8.2:10;\n        });\n      });\n\n      doc.setFillColor(248,250,252);\n      doc.setDrawColor(226,232,240);\n      const methodY=data.buyerMode==='business'?168:169;\n      doc.roundedRect(margin,methodY,contentW,27,2,2,'FD');\n\n      doc.setTextColor(...black);\n      doc.setFont('helvetica','bold');\n      doc.setFontSize(8.2);\n      doc.text(data.buyerMode==='business'?'How Business TCO is estimated':'How TCO is calculated',margin+4,methodY+6);\n\n      doc.setFont('helvetica','normal');\n      doc.setFontSize(7.1);\n      doc.setTextColor(...grey);\n      addPdfText(\n        doc,\n        data.buyerMode==='business'\n          ?'Gross company TCO is the standard TCO. Estimated recoverable VAT is deducted, followed by an estimated corporate tax saving based on the per-car deductibility percentage. Purchase VAT status is set per car. Resale VAT consequences are not modelled.'\n          :'Depreciation = purchase price today - expected resale value. TCO = depreciation + energy\/fuel + maintenance + insurance + taxes + entered extra repairs. Monthly TCO = total TCO \/ months owned.',\n        margin+4,\n        methodY+11,\n        128,\n        3.2\n      );\n\n      doc.setTextColor(...black);\n      doc.setFont('helvetica','bold');\n      doc.setFontSize(8.2);\n      doc.text('Important',158,methodY+6);\n\n      doc.setFont('helvetica','normal');\n      doc.setFontSize(7.1);\n      doc.setTextColor(...grey);\n      addPdfText(\n        doc,\n        data.buyerMode==='business'\n          ?'Indicative editorial calculation, not fiscal, accounting or tax advice. VAT recovery, deductibility, resale treatment and benefit-in-kind rules can differ by transaction and taxpayer. Verify with a professional adviser.'\n          :'Indicative editorial calculation, not a quotation or tax assessment. Financing, parking, tyres, subsidies and exceptional one-off costs are excluded unless explicitly entered. Results depend on the assumptions recorded on this page. \u00a9 2026 B2BNews Agency.',\n        158,\n        methodY+11,\n        127,\n        3.2\n      );\n\n      footer('Page 1\/2 \u00b7 Starting assumptions & method');\n\n      \/\/ PAGE 2 \u2014 RESULTS\n      doc.addPage();\n      header('NMN TCO Comparison','Results only \u00b7 Method and assumptions are on page 1');\n\n      const cardGap=5;\n      const resultCardW=(contentW-cardGap*(data.cars.length-1))\/data.cars.length;\n      const resultCardY=34, resultCardH=43;\n\n      data.cars.forEach((c,idx)=>{\n        const x=margin+idx*(resultCardW+cardGap);\n        const color=pdfColorForType(c.type);\n        const isBest=c.i===data.winner.i;\n\n        doc.setDrawColor(...(isBest?green:[220,224,230]));\n        doc.setLineWidth(isBest?.8:.3);\n        doc.setFillColor(255,255,255);\n        doc.roundedRect(x,resultCardY,resultCardW,resultCardH,2,2,'FD');\n        doc.setFillColor(...color); doc.rect(x,resultCardY,resultCardW,4,'F');\n\n        doc.setTextColor(...grey); doc.setFont('helvetica','bold'); doc.setFontSize(7.5);\n        doc.text(c.type+'  |  '+statusText(c.status).toUpperCase(),x+4,resultCardY+10);\n        if(isBest){\n          doc.setTextColor(...green);\n          doc.text('BEST CHOICE',x+resultCardW-4,resultCardY+10,{align:'right'});\n        }\n\n        doc.setTextColor(...black); doc.setFontSize(11);\n        doc.text(doc.splitTextToSize(c.name,resultCardW-8).slice(0,2),x+4,resultCardY+17);\n\n        doc.setFontSize(18);\n        if(data.buyerMode==='business'){\n          const businessMonthly=c.business.netCompanyCost\/(data.years*12);\n          doc.text('EUR '+Math.round(businessMonthly).toLocaleString('en-BE')+'\/month',x+4,resultCardY+29);\n          doc.setFont('helvetica','normal'); doc.setFontSize(8.2); doc.setTextColor(...grey);\n          doc.text('Net company cost EUR '+Math.round(c.business.netCompanyCost).toLocaleString('en-BE')+'  |  Gross TCO EUR '+Math.round(c.total).toLocaleString('en-BE'),x+4,resultCardY+36);\n        }else{\n          doc.text('EUR '+Math.round(c.monthly).toLocaleString('en-BE')+'\/month',x+4,resultCardY+29);\n          doc.setFont('helvetica','normal'); doc.setFontSize(8.2); doc.setTextColor(...grey);\n          doc.text('Total EUR '+Math.round(c.total).toLocaleString('en-BE')+'  |  EUR '+c.costKm.toFixed(2)+'\/km',x+4,resultCardY+36);\n        }\n        doc.text('Purchase '+money(data.inputCars[idx].purchase)+'  |  '+data.years+' years  |  '+data.km.toLocaleString('en-BE')+' km\/year',x+4,resultCardY+41);\n      });\n\n      const winY=83;\n      const savingsPdf=data.savings.map(s=>'EUR '+Math.round(s.amount).toLocaleString('en-BE')+' vs '+s.name).join('  |  ');\n      doc.setFillColor(240,253,244); doc.setDrawColor(134,239,172);\n      doc.roundedRect(margin,winY,contentW,18,2,2,'FD');\n      doc.setTextColor(...green); doc.setFont('helvetica','bold'); doc.setFontSize(9.5);\n      doc.text(data.winner.name+(data.buyerMode==='business'?' has the lowest estimated net company cost':' has the lowest estimated TCO'),margin+4,winY+5.5);\n      doc.setFont('helvetica','normal'); doc.setFontSize(8.3);\n      const savingLines=doc.splitTextToSize('Estimated savings over '+data.years+' years: '+savingsPdf,contentW-8);\n      doc.text(savingLines.slice(0,2),margin+4,winY+10.5);\n\n      const tableY=108;\n      doc.setTextColor(...black); doc.setFont('helvetica','bold'); doc.setFontSize(10);\n      doc.text('Cost breakdown over the selected ownership period',margin,tableY);\n\n      const rows=[\n        ['Depreciation',c=>c.depreciation],\n        ['Energy \/ fuel',c=>c.energy],\n        ['Maintenance',c=>c.maintenance],\n        ['Insurance',c=>c.insurance],\n        ['Taxes',c=>c.tax.total],\n        ['Extra repairs \/ wear',c=>c.repairs],\n        ['Reference: expected resale value',c=>c.residual]\n      ];\n      if(data.buyerMode==='business'){\n        rows.push(\n          ['Gross company TCO',c=>c.total],\n          ['Purchase VAT recovery',c=>-c.business.purchaseVatRecovery],\n          ['Running-cost VAT recovery',c=>-c.business.runningVatRecovery],\n          ['Corporate tax saving',c=>-c.business.corporateTaxSaving],\n          ['Estimated net company cost',c=>c.business.netCompanyCost]\n        );\n      }\n\n      const labelW=38;\n      const valAreaW=contentW-labelW;\n      const colW=valAreaW\/data.cars.length;\n      let y=tableY+7;\n\n      doc.setFillColor(...pale); doc.rect(margin,y-4,contentW,7,'F');\n      doc.setFontSize(7.5); doc.setFont('helvetica','bold'); doc.setTextColor(...grey);\n      doc.text('COST ITEM',margin+2,y);\n\n      data.cars.forEach((c,idx)=>{\n        doc.text(doc.splitTextToSize(c.name,colW-4)[0],margin+labelW+idx*colW+2,y);\n      });\n\n      y+=6.5;\n\n      rows.forEach((row,ridx)=>{\n        if(ridx%2===1){\n          doc.setFillColor(250,250,251);\n          doc.rect(margin,y-4.5,contentW,6.3,'F');\n        }\n\n        doc.setFont('helvetica','normal'); doc.setFontSize(7.6); doc.setTextColor(...black);\n        doc.text(row[0],margin+2,y);\n\n        data.cars.forEach((c,idx)=>{\n          const val=row[1](c);\n          let txt;\n          const rounded=Math.round(val);\n          if(row[0]==='Extra repairs \/ wear' && !rounded){\n            txt='-';\n          }else if(rounded===0){\n            txt='EUR 0';\n          }else if(rounded<0){\n            txt='- EUR '+Math.abs(rounded).toLocaleString('en-BE');\n          }else{\n            txt='EUR '+rounded.toLocaleString('en-BE');\n          }\n          doc.text(txt,margin+labelW+(idx+1)*colW-3,y,{align:'right'});\n        });\n\n        y+=data.buyerMode==='business'?4.6:5.8;\n      });\n\n      \/\/ Page 2 deliberately contains only results and the cost table.\n      \/\/ Methodology and disclaimer are on page 1 to prevent any overlap.\n      footer('Page 2\/2 \u00b7 TCO results');\n\n      const names=data.cars.map(c=>pdfSafeName(c.name)).join('-vs-');\n      const stamp=new Date().toISOString().replace(\/[:.]\/g,'-').slice(0,19);\n      doc.save('NMN-TCO-v6_0-'+(data.buyerMode==='business'?'Business-':'Private-')+names+'-'+stamp+'.pdf');\n      trackTcoEvent('tco_pdf_download',{\n        country:country,\n        region:country==='BE' ? el('beRegion').value : '',\n        active_cars:activeCarIndexes().length,\n        buyer_mode:buyerMode\n      });\n      countTcoServerMetric('pdf_downloads');\n\n      status.textContent='PDF downloaded.';\n\n    }catch(err){\n      console.error('NMN PDF generation failed',err);\n      status.textContent='PDF generation failed. Please try again.';\n    }\n  }\n\n\n\n  function setAdvancedVisibility(nodes,button,open){\n    nodes.forEach(node=>node.classList.toggle('advanced-collapsed',!open));\n    if(!button) return;\n    button.setAttribute('aria-expanded',open?'true':'false');\n    if(button.dataset.action==='toggle-global-advanced'){\n      button.textContent=open?'\u2212 Hide energy-price fine-tuning':'\uff0b Fine-tune energy prices';\n    }else{\n      button.textContent=open?'\u2212 Hide fine-tuning':'\uff0b Fine-tune this car';\n    }\n  }\n\n  function setupProgressiveDisclosure(){\n    const globalButton=q('[data-action=\"toggle-global-advanced\"]');\n    if(globalButton){\n      globalButton.addEventListener('click',()=>{\n        const open=globalButton.getAttribute('aria-expanded')!=='true';\n        setAdvancedVisibility(qa('[data-global-advanced]'),globalButton,open);\n      });\n    }\n\n    qa('[data-action=\"toggle-car-advanced\"]').forEach(button=>{\n      button.addEventListener('click',()=>{\n        const i=button.dataset.car;\n        const open=button.getAttribute('aria-expanded')!=='true';\n        setAdvancedVisibility(qa('[data-car-advanced=\"'+i+'\"]'),button,open);\n      });\n    });\n  }\n\n  function updateCountryNote(){\n    if(country==='NL'){\n      el('countryNote').textContent='Netherlands: use the official Belastingdienst calculator for the current quarterly MRB, then enter that amount per car. NMN models the EV discount schedule across the selected ownership period.';\n    }else if(country==='LU'){\n      el('countryNote').textContent='Luxembourg: the calculator adds the standard \u20ac50 registration charge and calculates annual road tax automatically for M1 passenger cars first registered from 2001 using official CO2 and fuel type. Use NEDC CO2 for 2001-2020 and WLTP from 2021. BEVs use the \u20ac30 annual minimum; pre-2001 annual tax is entered manually.';\n    }else if(el('beRegion').value==='Flanders'){\n      el('countryNote').textContent='Flanders: BIV and annual road tax are calculated automatically for BEVs and most modern non-leased passenger cars. Open the tax details inside each car to enter CO2, engine capacity, Euro norm and first registration date.';\n    }else if(el('beRegion').value==='Brussels'){\n      el('countryNote').textContent='Brussels: 2026 BIV and annual road tax are calculated automatically for standard non-leasing passenger cars. For HEV\/PHEV, enter the combustion-engine power and capacity used for taxation.';\n    }else{\n      el('countryNote').textContent='Wallonia: TMC and annual road tax are calculated automatically using the 2026-2027 rates. Enter power, CO2, maximum authorised mass, engine capacity and first registration date. Special family reductions and exemptions are not included.';\n    }\n  }\n\n  function setCountry(c){\n    country=c;\n    qa('.country').forEach(b=>b.classList.toggle('active',b.dataset.country===c));\n    qa('[data-be-only]').forEach(x=>x.classList.toggle('hidden',c!=='BE'));\n    qa('[data-nl-only]').forEach(x=>x.classList.toggle('hidden',c!=='NL'));\n    applyCountryPriceDefaults(c);\n    calculate();\n  }\n\n  [1,2,3].forEach(i=>{\n    updateCard(i,false);\n\n    carEl(i,'Type').addEventListener('change',()=>{\n      updateCard(i,true);\n      updateUsedValuation(i);\n      calculate();\n    });\n\n    carEl(i,'Status').addEventListener('change',()=>{\n      seedUsedInputs(i);\n      updateCard(i,false);\n      updateUsedValuation(i,true);\n      calculate();\n    });\n\n    const usedReg=carEl(i,'UsedFirstReg');\n    const currentKm=carEl(i,'CurrentKm');\n    const autoResale=carEl(i,'AutoResale');\n    const resale=carEl(i,'ResaleEuro');\n\n    if(usedReg) usedReg.addEventListener('change',()=>{\n      syncUsedFirstRegistrationToTaxes(i);\n      updateUsedValuation(i);\n      calculate();\n    });\n\n    if(currentKm) currentKm.addEventListener('change',()=>{\n      updateUsedValuation(i);\n      calculate();\n    });\n\n    if(autoResale) autoResale.addEventListener('change',()=>{\n      if(autoResale.checked) updateUsedValuation(i,true);\n      calculate();\n    });\n\n    if(resale) resale.addEventListener('input',()=>{\n      if(autoResale && document.activeElement===resale) autoResale.checked=false;\n    });\n  });\n\n  qa('.buyer-btn').forEach(b=>b.addEventListener('click',()=>setBuyerMode(b.dataset.buyer)));\n  if(el('bizBikMode')) el('bizBikMode').addEventListener('change',()=>{updateBikField();calculate();});\n  ['bizVatRecoverable','bizCorpTax','bizBikAmount','c1BizVatStatus','c2BizVatStatus','c3BizVatStatus','c1BizDeductible','c2BizDeductible','c3BizDeductible'].forEach(id=>{\n    if(el(id)) ['change','blur'].forEach(ev=>el(id).addEventListener(ev,calculate));\n  });\n  qa('.country').forEach(b=>b.addEventListener('click',()=>setCountry(b.dataset.country)));\n  el('beRegion').addEventListener('change',calculate);\n  el('nlProvince').addEventListener('change',calculate);\n  qa('input,select').forEach(x=>{\n    if(!x.matches('[data-id$=\"Type\"],[data-id$=\"Status\"],[data-id$=\"UsedFirstReg\"],[data-id$=\"CurrentKm\"],[data-id$=\"AutoResale\"],[data-id=\"beRegion\"],[data-id=\"nlProvince\"]')) x.addEventListener('change',calculate);\n  });\n  \/*\n   * Live-use tracking. Direct field handlers above perform the actual\n   * recalculation first; this bubbling listener only records the meaningful\n   * user interaction, with a short debounce.\n   *\/\n  root.addEventListener('change',event=>{\n    const target=event.target;\n    if(target && target.matches('input,select')){\n      countMeaningfulComparison('auto',false);\n    }\n  });\n\n  root.addEventListener('click',event=>{\n    const btn=event.target.closest('button');\n    if(!btn || !root.contains(btn)) return;\n\n    \/\/ These controls change the comparison without emitting a native\n    \/\/ input\/select change event.\n    if(\n      btn.matches('.country') ||\n      btn.matches('.buyer-btn') ||\n      btn.matches('[data-id=\"addCar3\"]') ||\n      btn.matches('[data-id=\"removeCar3\"]')\n    ){\n      countMeaningfulComparison('auto',false);\n    }\n  });\n  el('addCar3').addEventListener('click',()=>setCar3Active(true));\n  el('removeCar3').addEventListener('click',()=>setCar3Active(false));\n  el('downloadPdf').addEventListener('click',generatePdf);\n  el('calculate').addEventListener('click',()=>{\n    recalculateEverything(true);\n    countMeaningfulComparison('button',true);\n  });\n  setupProgressiveDisclosure();\n  applyCountryPriceDefaults('BE');\n  updateBikField();\n  setBuyerMode('private');\n  setCar3Active(false);\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Newmobility.news NMN TCO Calculator Find out what your next car will actually cost \u2014 not just what it costs to buy. Compare two or three new, demo or used cars over the same ownership period. NMN adds depreciation, fuel or electricity, maintenance, insurance, taxes and extra repair\/wear costs to estimate total cost, monthly cost and [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-192021","page","type-page","status-publish","hentry"],"acf":[],"featured_image_urls_v2":{"full":"","thumbnail":"","medium":"","medium_large":"","large":"","1536x1536":"","2048x2048":"","trp-custom-language-flag":"","related-thumb":"","gform-image-choice-sm":"","gform-image-choice-md":"","gform-image-choice-lg":"","mailchimp":"","unipress-phone":"","unipress-tablet":"","unipress-tablet-portrait":"","unipress-tablet-landscape":"","unipress-smartphone":"","unipress-wide-screen":""},"post_excerpt_stackable_v2":"<p>Newmobility.news NMN TCO Calculator Find out what your next car will actually cost \u2014 not just what it costs to buy. Compare two or three new, demo or used cars over the same ownership period. NMN adds depreciation, fuel or electricity, maintenance, insurance, taxes and extra repair\/wear costs to estimate total cost, monthly cost and cost per kilometre. Powertrains: ICE = petrol\/diesel \u00b7 HEV = self-charging hybrid \u00b7 PHEV = plug-in hybrid \u00b7 BEV = fully electric \ud83d\ude98 2 or 3 cars \u2728 New \u00b7 Demo \u00b7 Used \ud83c\udde7\ud83c\uddea Belgium \u00b7 \ud83c\uddf3\ud83c\uddf1 Netherlands \u00b7 \ud83c\uddf1\ud83c\uddfa Luxembourg Build v6.0.2 Start with&hellip;<\/p>\n","category_list_v2":"","author_info_v2":{"name":"Joris Van Roy","url":"https:\/\/newmobility.news\/en\/author\/jorisximcom-be\/"},"comments_num_v2":"0 comments","yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>NMN TCO Calculator - newmobility.news<\/title>\n<meta name=\"robots\" content=\"noindex, follow\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NMN TCO Calculator - newmobility.news\" \/>\n<meta property=\"og:description\" content=\"Newmobility.news NMN TCO Calculator Find out what your next car will actually cost \u2014 not just what it costs to buy. Compare two or three new, demo or used cars over the same ownership period. NMN adds depreciation, fuel or electricity, maintenance, insurance, taxes and extra repair\/wear costs to estimate total cost, monthly cost and [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/newmobility.news\/en\/tco-calculator\/\" \/>\n<meta property=\"og:site_name\" content=\"newmobility.news\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/search\/top\/?q=newmobility.news\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-23T06:42:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/newmobility.news\/wp-content\/uploads\/2017\/12\/Newmobility-app4.png?fit=426%2C426&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"426\" \/>\n\t<meta property=\"og:image:height\" content=\"426\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@jorisvry\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/newmobility.news\\\/tco-calculator\\\/\",\"url\":\"https:\\\/\\\/newmobility.news\\\/tco-calculator\\\/\",\"name\":\"NMN TCO Calculator - newmobility.news\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/newmobility.news\\\/#website\"},\"datePublished\":\"2026-08-19T11:04:25+00:00\",\"dateModified\":\"2026-08-23T06:42:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/newmobility.news\\\/tco-calculator\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/newmobility.news\\\/tco-calculator\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/newmobility.news\\\/tco-calculator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/newmobility.news\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"NMN TCO Calculator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/newmobility.news\\\/#website\",\"url\":\"https:\\\/\\\/newmobility.news\\\/\",\"name\":\"newmobility.news\",\"description\":\"A B2BNews Agency\u00ae news service for mobility business proessional\",\"publisher\":{\"@id\":\"https:\\\/\\\/newmobility.news\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/newmobility.news\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/newmobility.news\\\/#organization\",\"name\":\"B2BNews Agency\",\"url\":\"https:\\\/\\\/newmobility.news\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/newmobility.news\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/newmobility.news\\\/wp-content\\\/uploads\\\/2018\\\/01\\\/b2bnews-agency-logo.png\",\"contentUrl\":\"https:\\\/\\\/newmobility.news\\\/wp-content\\\/uploads\\\/2018\\\/01\\\/b2bnews-agency-logo.png\",\"width\":\"581\",\"height\":\"117\",\"caption\":\"B2BNews Agency\"},\"image\":{\"@id\":\"https:\\\/\\\/newmobility.news\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/search\\\/top\\\/?q=newmobility.news\",\"https:\\\/\\\/x.com\\\/jorisvry\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/jorisvanroy\\\/\",\"https:\\\/\\\/nl.pinterest.com\\\/jorisvanroy\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"NMN TCO Calculator - newmobility.news","robots":{"index":"noindex","follow":"follow"},"og_locale":"en_US","og_type":"article","og_title":"NMN TCO Calculator - newmobility.news","og_description":"Newmobility.news NMN TCO Calculator Find out what your next car will actually cost \u2014 not just what it costs to buy. Compare two or three new, demo or used cars over the same ownership period. NMN adds depreciation, fuel or electricity, maintenance, insurance, taxes and extra repair\/wear costs to estimate total cost, monthly cost and [&hellip;]","og_url":"https:\/\/newmobility.news\/en\/tco-calculator\/","og_site_name":"newmobility.news","article_publisher":"https:\/\/www.facebook.com\/search\/top\/?q=newmobility.news","article_modified_time":"2026-08-23T06:42:44+00:00","og_image":[{"width":426,"height":426,"url":"https:\/\/i0.wp.com\/newmobility.news\/wp-content\/uploads\/2017\/12\/Newmobility-app4.png?fit=426%2C426&ssl=1","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@jorisvry","twitter_misc":{"Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/newmobility.news\/tco-calculator\/","url":"https:\/\/newmobility.news\/tco-calculator\/","name":"NMN TCO Calculator - newmobility.news","isPartOf":{"@id":"https:\/\/newmobility.news\/#website"},"datePublished":"2026-08-19T11:04:25+00:00","dateModified":"2026-08-23T06:42:44+00:00","breadcrumb":{"@id":"https:\/\/newmobility.news\/tco-calculator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/newmobility.news\/tco-calculator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/newmobility.news\/tco-calculator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/newmobility.news\/"},{"@type":"ListItem","position":2,"name":"NMN TCO Calculator"}]},{"@type":"WebSite","@id":"https:\/\/newmobility.news\/#website","url":"https:\/\/newmobility.news\/","name":"newmobility.news","description":"A B2BNews Agency\u00ae news service for mobility business proessional","publisher":{"@id":"https:\/\/newmobility.news\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/newmobility.news\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/newmobility.news\/#organization","name":"B2BNews Agency","url":"https:\/\/newmobility.news\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/newmobility.news\/#\/schema\/logo\/image\/","url":"https:\/\/newmobility.news\/wp-content\/uploads\/2018\/01\/b2bnews-agency-logo.png","contentUrl":"https:\/\/newmobility.news\/wp-content\/uploads\/2018\/01\/b2bnews-agency-logo.png","width":"581","height":"117","caption":"B2BNews Agency"},"image":{"@id":"https:\/\/newmobility.news\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/search\/top\/?q=newmobility.news","https:\/\/x.com\/jorisvry","https:\/\/www.linkedin.com\/in\/jorisvanroy\/","https:\/\/nl.pinterest.com\/jorisvanroy\/"]}]}},"jetpack_shortlink":"https:\/\/wp.me\/P9wJdU-NX7","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/newmobility.news\/en\/wp-json\/wp\/v2\/pages\/192021","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/newmobility.news\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/newmobility.news\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/newmobility.news\/en\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/newmobility.news\/en\/wp-json\/wp\/v2\/comments?post=192021"}],"version-history":[{"count":9,"href":"https:\/\/newmobility.news\/en\/wp-json\/wp\/v2\/pages\/192021\/revisions"}],"predecessor-version":[{"id":192332,"href":"https:\/\/newmobility.news\/en\/wp-json\/wp\/v2\/pages\/192021\/revisions\/192332"}],"wp:attachment":[{"href":"https:\/\/newmobility.news\/en\/wp-json\/wp\/v2\/media?parent=192021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}