{"id":42006,"date":"2026-03-30T16:00:09","date_gmt":"2026-03-30T16:00:09","guid":{"rendered":"https:\/\/nofloods.com\/easywall-rechner\/"},"modified":"2026-09-04T08:35:32","modified_gmt":"2026-09-04T08:35:32","slug":"easywall-rechner","status":"publish","type":"page","link":"https:\/\/nofloods.com\/de\/easywall-rechner\/","title":{"rendered":"EasyWall-Rechner"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"42006\" class=\"elementor elementor-42006 elementor-38811\">\n\t\t\t\t<div class=\"elementor-element elementor-element-dfe8f10 e-con-full e-flex e-con e-parent\" data-id=\"dfe8f10\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-91f104f elementor-widget elementor-widget-html\" data-id=\"91f104f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"custom-video-wrapper\">\r\n  <video autoplay=\"\" muted=\"\" loop=\"\" playsinline=\"\">\r\n    <source src=\"https:\/\/nofloods.com\/wp-content\/uploads\/2025\/10\/Banner_anim-1.mp4\" type=\"video\/mp4\">\r\n  <\/source><\/video>\r\n  <div class=\"video-overlay\"><\/div>\r\n<\/div>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-11c45c1d e-flex e-con-boxed e-con e-parent\" data-id=\"11c45c1d\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-5432775c e-con-full e-flex e-con e-child\" data-id=\"5432775c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4c7ed852 elementor-widget elementor-widget-heading\" data-id=\"4c7ed852\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">EasyWall-Hochwasserschutzbarrieren \u2013 Modulrechner<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-200a060 elementor-widget elementor-widget-eael-breadcrumbs\" data-id=\"200a060\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"eael-breadcrumbs.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"eael-breadcrumbs\">\n\t\t\t<div class=\"eael-breadcrumbs__content\"><a href=\"https:\/\/nofloods.com\/de\/\">Startseite<\/a> <span class=\"eael-breadcrumb-separator\">&gt;<\/span> <span class = \"eael-current\">Seite<\/span><\/div>\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1c2d7cb e-flex e-con-boxed e-con e-parent\" data-id=\"1c2d7cb\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-a88364f e-con-full e-flex e-con e-child\" data-id=\"a88364f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c254ce6 elementor-widget__width-inherit elementor-widget elementor-widget-heading\" data-id=\"c254ce6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Planen Sie Ihre EasyWall-Absperrung ganz einfach<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6897595 elementor-widget elementor-widget-text-editor\" data-id=\"6897595\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Mit unserem Rechner k\u00f6nnen Sie ganz einfach die richtige Absperrkonfiguration f\u00fcr Ihr Projekt entwerfen. Geben Sie einfach die gew\u00fcnschte Absperrl\u00e4nge ein, w\u00e4hlen Sie ein Modell aus und f\u00fcgen Sie gegebenenfalls optionale Extras hinzu. Die Modellnummern geben die H\u00f6he in Zentimetern an (nicht die Breite). \u00dcberlappungen zwischen den Modulen werden automatisch in die Berechnung einbezogen.<br\/>Bitte beachten Sie: Eckmodule sind f\u00fcr Kurven oder Hindernisse vorgesehen \u2013 sie verl\u00e4ngern Ihre Absperrung zwar physisch, werden jedoch nicht in die berechnete Gesamtl\u00e4nge der Absperrung einbezogen.<br\/>Sobald Ihre Konfiguration fertig ist, k\u00f6nnen Sie diese direkt in unserem Webshop erwerben oder an unser Team senden, um Unterst\u00fctzung zu erhalten.   <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-76c99b8 elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"76c99b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"de\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.9.4\/leaflet.min.css\"\/>\r\n<title>NoFloods EasyWall Rechner<\/title>\r\n<style>\r\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\r\n:root{\r\n  --bg1:#fff;--bg2:#f5f5f3;--bg3:#eeede9;\r\n  --t1:#1a1a18;--t2:#6b6b67;--t3:#9e9d99;\r\n  --bd:rgba(0,0,0,0.12);--bd2:rgba(0,0,0,0.22);\r\n  --rm:8px;--rl:12px;\r\n  --br:#D85A30;--brd:#993C1D;--brb:#FAECE7;--brl:#F5C4B3;\r\n  --ok:#3B6D11;--okb:#EAF3DE;--okl:#C0DD97;\r\n  --wn:#BA7517;--wnb:#FAEEDA;\r\n  --bl:#185FA5;--blb:#E6F1FB;--bll:#B5D4F4;\r\n  --fn:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;\r\n  --fm:'SF Mono','Fira Code',monospace;\r\n}\r\nbody{font-family:var(--fn);background:var(--bg3);color:var(--t1);min-height:100vh}\r\n.calc{margin:0 auto}\r\n.lang-bar{display:flex;justify-content:flex-end;gap:6px;margin-bottom:1rem}\r\n.lang-btn{padding:4px 12px;font-size:12px;font-weight:600;font-family:var(--fn);border:0.5px solid var(--bd);border-radius:var(--rm);background:var(--bg1);color:var(--t2);cursor:pointer}\r\n.lang-btn.active{border:2px solid var(--br);background:var(--brb);color:var(--brd)}\r\n.hdr{display:flex;align-items:center;gap:12px;margin-bottom:1.75rem}\r\n.hdr-logo{width:40px;height:40px;background:var(--br);border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:13px;flex-shrink:0}\r\n.hdr h1{font-size:18px;font-weight:700;color:var(--t1);line-height:1.2}\r\n.hdr p{font-size:13px;color:var(--t2);margin-top:2px}\r\n.card{background:var(--bg1);border:0.5px solid var(--bd);border-radius:var(--rl);padding:1.25rem;margin-bottom:14px}\r\n\/* Map tool *\/\r\n.map-mode-row{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px}\r\n.map-mode-btn{border:0.5px solid var(--bd);border-radius:var(--rm);padding:12px;cursor:pointer;background:var(--bg1);text-align:left;font-family:var(--fn)}\r\n.map-mode-btn.active{border:2px solid var(--br);background:var(--brb)}\r\n.map-mode-btn .mm-label{font-size:13px;font-weight:700;color:var(--t1);margin-bottom:3px}\r\n.map-mode-btn .mm-sub{font-size:11px;color:var(--t2);line-height:1.4}\r\n.map-mode-btn .mm-badge{display:inline-block;font-size:10px;background:var(--okb);color:var(--ok);border-radius:4px;padding:1px 6px;margin-bottom:5px;font-weight:700}\r\n.map-panel{display:none;margin-bottom:12px}\r\n.map-panel.open{display:block}\r\n#ew-map{height:320px;border-radius:var(--rm);overflow:hidden}\r\n.map-tb{display:flex;gap:6px;margin-bottom:8px;flex-wrap:wrap}\r\n.map-tb-btn{padding:5px 10px;font-size:11px;font-weight:600;font-family:var(--fn);border:0.5px solid var(--bd);border-radius:var(--rm);background:var(--bg1);color:var(--t2);cursor:pointer}\r\n.map-tb-btn:hover{background:var(--bg2)}\r\n.map-tb-btn.active{border:1.5px solid var(--br);background:var(--brb);color:var(--brd)}\r\n.map-tb-btn.danger{color:#A32D2D;border-color:#F09595}\r\n.map-import-bar{background:var(--okb);border:0.5px solid var(--okl);border-radius:var(--rm);padding:10px 12px;display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-top:8px}\r\n.map-import-bar.hidden{display:none}\r\n.map-import-text{font-size:12px;font-weight:700;color:var(--ok);line-height:1.6}\r\n.map-import-text span{font-weight:400;color:#3B6D11;font-size:11px}\r\n.map-import-btn{padding:7px 14px;background:var(--br);color:#fff;border:none;border-radius:var(--rm);font-size:12px;font-weight:700;font-family:var(--fn);cursor:pointer;white-space:nowrap}\r\n.map-imported-badge{display:inline-flex;align-items:center;gap:4px;font-size:10px;background:var(--okb);color:var(--ok);border-radius:4px;padding:2px 7px;font-weight:700;margin-left:8px}\r\n.map-close-popup{display:none;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:9999;background:var(--bg1);border:0.5px solid var(--bd);border-radius:12px;padding:20px 24px;min-width:280px;max-width:340px;box-shadow:0 4px 24px rgba(0,0,0,.18)}\r\n.map-close-popup h3{font-size:14px;font-weight:700;color:var(--t1);margin-bottom:6px}\r\n.map-close-popup p{font-size:13px;color:var(--t2);margin-bottom:14px;line-height:1.5}\r\n.map-popup-btns{display:flex;flex-direction:column;gap:8px}\r\n.mcp-btn{padding:10px 14px;border:none;border-radius:8px;font-size:13px;font-weight:700;font-family:var(--fn);cursor:pointer;text-align:left}\r\n.mcp-btn.green{background:var(--ok);color:#fff}\r\n.mcp-btn.orange{background:var(--brb);color:var(--brd);border:1.5px solid var(--brl)}\r\n.mcp-btn.neutral{background:none;color:var(--t2);border:0.5px solid var(--bd);font-weight:400;font-size:12px}\r\n.sh{display:flex;align-items:center;gap:10px;margin-bottom:6px}\r\n.sn{width:26px;height:26px;border-radius:50%;background:var(--br);color:#fff;font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}\r\n.st{font-size:15px;font-weight:700;color:var(--t1)}\r\n.ss{font-size:13px;color:var(--t2);margin-left:36px;margin-bottom:14px}\r\n.ser-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}\r\n@media(max-width:560px){.ser-grid{grid-template-columns:1fr}}\r\n.ser-btn{border:0.5px solid var(--bd);border-radius:var(--rl);padding:12px 10px;cursor:pointer;background:var(--bg1);text-align:left;width:100%}\r\n.ser-btn:hover{border-color:var(--bd2)}\r\n.ser-btn.active{border:2px solid var(--br);background:var(--brb)}\r\n.pill{display:inline-block;font-size:10px;font-weight:700;padding:2px 8px;border-radius:10px;margin-bottom:6px}\r\n.pt{background:var(--brl);color:var(--brd)}.ps{background:var(--bll);color:#0C447C}.pd{background:var(--okl);color:#27500A}\r\n.sn2{font-size:14px;font-weight:700;color:var(--t1)}\r\n.sd{font-size:11px;color:var(--t2);margin-top:3px;line-height:1.45}\r\n.ht-grid{display:grid;gap:8px}\r\n.ht-btn{border:0.5px solid var(--bd);border-radius:var(--rm);padding:12px 8px;cursor:pointer;background:var(--bg1);text-align:center;width:100%}\r\n.ht-btn:hover{border-color:var(--bd2)}\r\n.ht-btn.active{border:2px solid var(--br);background:var(--brb)}\r\n.ht-h{font-size:20px;font-weight:700;color:var(--t1)}\r\n.ht-btn.active .ht-h{color:var(--brd)}\r\n.ht-p{font-size:11px;color:var(--t2);margin-top:3px}\r\n.ht-c{font-size:10px;color:var(--t3);margin-top:3px;font-family:var(--fm)}\r\n.guide-tog{display:flex;align-items:center;gap:8px;cursor:pointer;padding:9px 12px;background:var(--blb);border-radius:var(--rm);margin-bottom:14px;border:0.5px solid var(--bll);user-select:none}\r\n.guide-tog-lbl{font-size:13px;color:var(--bl);font-weight:600;flex:1}\r\n.guide-arr{width:16px;height:16px;flex-shrink:0;transition:transform .2s;color:var(--bl)}\r\n.guide-arr.open{transform:rotate(180deg)}\r\n.guide-body{overflow:hidden;max-height:0;transition:max-height .3s ease}\r\n.guide-body.open{max-height:700px}\r\n.guide-inner{padding:4px 0 14px;display:flex;flex-direction:column;gap:10px}\r\n.guide-step{display:flex;gap:12px;align-items:flex-start}\r\n.guide-sn{width:22px;height:22px;border-radius:50%;background:var(--br);color:#fff;font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px}\r\n.guide-st{font-size:13px;color:var(--t2);line-height:1.55}\r\n.guide-st strong{color:var(--t1);font-weight:600}\r\n.gdiv{height:0.5px;background:var(--bd)}\r\n.dims{border-top:0.5px solid var(--bd);padding-top:14px;margin-top:12px}\r\n.dtit{font-size:11px;font-weight:700;color:var(--t2);text-transform:uppercase;letter-spacing:.05em;margin-bottom:10px}\r\n.dgrid{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:10px;}\r\n.dg{background:var(--bg2);border-radius:var(--rm);padding:10px 12px}\r\n.dgl{font-size:11px;color:var(--t2);margin-bottom:8px;font-weight:700}\r\n.dfr{display:flex;align-items:center;justify-content:space-between;font-size:13px;margin-bottom:6px;color:var(--t2)}\r\n.dfr:last-child{margin-bottom:0}\r\n.ds{font-size:11px;color:var(--t2)}\r\n.muted{opacity:.38;pointer-events:none}\r\n.ni{width:80px;height:36px;border:0.5px solid var(--bd);border-radius:var(--rm);background:var(--bg1);color:var(--t1);font-size:14px;font-family:var(--fn);padding:0 10px;text-align:center;transition:box-shadow .15s}\r\n.ni:focus{outline:none;box-shadow:0 0 0 2px rgba(216,90,48,.25);border-color:var(--br)}\r\n.ni:disabled{opacity:.4;background:var(--bg2)}\r\n.frow{display:flex;align-items:center;gap:12px;margin-bottom:12px;flex-wrap:wrap}\r\n.flbl{font-size:13px;color:var(--t2);min-width:160px;flex-shrink:0}\r\n.fhint{font-size:11px;color:var(--t3)}\r\n.sec-tabs-row{display:flex;align-items:center;border-bottom:0.5px solid var(--bd);margin:0 0 0 0;flex-wrap:wrap;gap:0}\r\n.sec-tab{padding:8px 14px;font-size:12px;font-family:var(--fn);color:var(--t2);cursor:pointer;border:none;border-bottom:2px solid transparent;background:transparent}\r\n.sec-tab.active{color:var(--br);border-bottom-color:var(--br);font-weight:700}\r\n.sec-add{padding:8px 10px;font-size:12px;color:var(--br);cursor:pointer;border:none;background:transparent;font-family:var(--fn);font-weight:600}\r\n.sec-panel{padding-top:12px;display:none}\r\n.sec-panel.active{display:block}\r\n.mbg{display:flex;gap:6px;margin-bottom:10px}\r\n.mb{flex:1;padding:7px 6px;font-size:12px;font-weight:600;font-family:var(--fn);border:0.5px solid var(--bd);border-radius:var(--rm);background:var(--bg1);color:var(--t2);cursor:pointer;text-align:center}\r\n.mb.active{border:2px solid var(--br);background:var(--brb);color:var(--brd)}\r\n.mb.muted{opacity:.38;pointer-events:none}\r\n.cfb{margin-top:6px;padding:7px 10px;border-radius:var(--rm);font-size:12px;line-height:1.5;display:none}\r\n.cfb.ok{background:var(--okb);color:#27500A}\r\n.cfb.info{background:var(--blb);color:#0C447C}\r\n.cfb.warn{background:var(--wnb);color:#633806}\r\n.situation-btn{background:var(--bg2);border:0.5px solid var(--bd);border-radius:var(--rm);padding:10px 8px;cursor:pointer;font-family:var(--fn);text-align:center;transition:border-color .15s,background .15s;width:100%}\r\n.situation-btn:hover{border-color:var(--bd2);background:#ebebea}\r\n.situation-btn.active{border:2px solid var(--br);background:var(--brb)}\r\n.sit-icon{font-size:20px;margin-bottom:4px;line-height:1}\r\n.sit-label{font-size:12px;font-weight:700;color:var(--t1);margin-bottom:2px}\r\n.sit-sub{font-size:10px;color:var(--t3);line-height:1.3}\r\n.ewr{display:none;margin-top:8px;padding:5px 8px;background:var(--blb);border-radius:var(--rm);font-size:12px;color:#0C447C}\r\n.action-bar{display:flex;gap:8px;justify-content:flex-end;margin-bottom:14px;flex-wrap:wrap}\r\n.act-btn{padding:8px 16px;font-size:12px;font-weight:600;font-family:var(--fn);border:0.5px solid var(--bd);border-radius:var(--rm);background:var(--bg1);color:var(--t2);cursor:pointer;display:flex;align-items:center;gap:6px;overflow:visible}\r\n.act-btn svg{overflow:visible;flex-shrink:0}\r\n.act-btn:hover{background:var(--bg2)}\r\n.act-btn.pri{background:var(--br);color:#fff;border-color:var(--br)}\r\n.act-btn.pri:hover{background:var(--brd)}\r\n.res{background:var(--bg2);border:0.5px solid var(--bd);border-radius:var(--rl);overflow:hidden;margin-bottom:14px}\r\n.res-hdr{padding:1rem 1.25rem;border-bottom:0.5px solid var(--bd);display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;background:var(--bg1)}\r\n.res-t{font-size:15px;font-weight:700;color:var(--t1)}\r\n.res-tag{font-size:12px;background:var(--brl);color:var(--brd);border-radius:10px;padding:3px 10px;font-weight:700}\r\n.fit-tabs{display:flex;border-bottom:0.5px solid var(--bd);background:var(--bg1)}\r\n.fit-tab{flex:1;padding:10px 8px;font-size:12px;font-family:var(--fn);color:var(--t2);cursor:pointer;border:none;border-bottom:2px solid transparent;background:transparent;text-align:center}\r\n.fit-tab:hover:not(.active):not(.disabled){color:var(--t1)}\r\n.fit-tab.active{color:var(--br);border-bottom-color:var(--br);font-weight:700}\r\n.fit-tab.disabled{opacity:.38;cursor:not-allowed}\r\n.exact-info-trigger{display:inline-flex;align-items:center;font-size:10px;font-weight:700;font-family:var(--fn);background:#FAEEDA;color:#854F0B;border:1px solid #FAC775;border-radius:10px;padding:2px 7px;margin-left:6px;cursor:pointer;vertical-align:middle;white-space:nowrap;transition:background .15s}\r\n.exact-info-trigger:hover{background:#FAC775}\r\n.fit-body{padding:1.25rem}\r\n.barlbl{font-size:12px;color:var(--t2);margin-bottom:6px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}\r\n.barwrap{position:relative;height:36px;background:var(--bg1);border:0.5px solid var(--bd);border-radius:var(--rm);overflow:hidden;margin-bottom:6px}\r\n.bar-req{position:absolute;left:0;top:0;height:100%;background:var(--blb);border-right:2px dashed #378ADD}\r\n.bar-act{position:absolute;left:0;top:0;height:100%;background:var(--brb)}\r\n.bar-ov{position:absolute;top:0;height:100%;background:var(--brl)}\r\n.bleg{display:flex;flex-wrap:wrap;gap:10px;font-size:11px;color:var(--t2);margin-bottom:1rem}\r\n.bleg span{display:flex;align-items:center;gap:4px}\r\n.bdot{width:10px;height:10px;border-radius:2px;flex-shrink:0;display:inline-block}\r\n.scards{display:grid;gap:10px;margin-bottom:1.25rem}\r\n@media(max-width:540px){.scards{grid-template-columns:1fr 1fr}}\r\n.sc{background:var(--bg1);border:0.5px solid var(--bd);border-radius:var(--rm);padding:10px 12px}\r\n.sv{font-size:20px;font-weight:700;color:var(--t1)}\r\n.sv.ok{color:var(--ok)}.sv.over{color:var(--br)}\r\n.sl{font-size:11px;color:var(--t2);margin-top:3px;line-height:1.4}\r\n.bkwrap{border-top:0.5px solid var(--bd);padding-top:12px}\r\n.bkr{display:flex;justify-content:space-between;align-items:baseline;font-size:13px;color:var(--t1);padding:5px 0;border-bottom:0.5px solid var(--bd)}\r\n.bkr:last-child{border-bottom:none;font-weight:700;padding-top:8px}\r\n.bkc{font-family:var(--fm);font-size:11px;color:var(--t2);margin-left:7px}\r\n.bkr2{display:flex;align-items:center;gap:8px}\r\n.bkq{color:var(--t2);white-space:nowrap}\r\n.notice{font-size:12px;color:var(--t2);border-left:2px solid var(--bd2);padding:6px 10px;margin-top:10px;line-height:1.6}\r\n.notice.warn{border-left-color:var(--wn);background:var(--wnb);color:#633806;border-radius:var(--rm);margin-top:8px}\r\n.notice.info{border-left-color:var(--bl);background:var(--blb);color:#0C447C;border-radius:var(--rm)}\r\n.avail-badge{display:none;margin-left:5px;font-size:10px;padding:1px 6px;border-radius:8px;background:var(--okl);color:#27500A;font-weight:700;vertical-align:middle}\r\n.wt-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px;margin-top:4px}\r\n.wt-card{background:var(--bg1);border:0.5px solid var(--bd);border-radius:var(--rm);padding:10px 12px}\r\n.wt-v{font-size:20px;font-weight:700;color:var(--t1)}\r\n.wt-l{font-size:11px;color:var(--t2);margin-top:2px}\r\n.wt-sub{font-size:10px;color:var(--t3);margin-top:2px}\r\n.ei{font-size:13px;color:var(--t2);line-height:1.6;padding:10px 12px;background:var(--bg1);border-radius:var(--rm);border-left:2px solid var(--br);margin-bottom:14px}\r\n.eo{background:var(--bg1);border:0.5px solid var(--bd);border-radius:var(--rm);padding:12px 14px;margin-bottom:10px}\r\n.eo.best{border:2px solid var(--ok)}\r\n.eo-hd{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin-bottom:10px;flex-wrap:wrap}\r\n.eo-t{font-size:13px;font-weight:700;color:var(--t1)}\r\n.eo-b{font-size:10px;padding:2px 8px;border-radius:10px;font-weight:700;white-space:nowrap}\r\n.b-ex{background:var(--okl);color:#27500A}.b-cl{background:#FAC775;color:#633806}.b-al{background:#D3D1C7;color:#444441}\r\n.eo-st{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:8px;margin-bottom:10px}\r\n.eo-sc{background:var(--bg2);border-radius:var(--rm);padding:7px 10px}\r\n.eo-sl{font-size:11px;color:var(--t2)}.eo-sv{font-size:14px;font-weight:700;color:var(--t1);margin-top:1px}\r\n.eo-sv.ex{color:var(--ok)}.eo-sv.nr{color:var(--wn)}\r\n.eo-ms{border-top:0.5px solid var(--bd);padding-top:8px;display:flex;flex-direction:column;gap:4px}\r\n.eo-m{display:flex;justify-content:space-between;font-size:12px;color:var(--t2)}\r\n.eo-m strong{color:var(--t1);font-weight:700}\r\n.set-note{font-size:11px;color:var(--ok);background:var(--okb);border-radius:var(--rm);padding:5px 9px;margin-top:6px;font-weight:700}\r\n.saved-list{display:flex;flex-direction:column;gap:8px;margin-top:10px}\r\n.saved-item{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--bg2);border-radius:var(--rm);font-size:13px;flex-wrap:wrap;gap:8px}\r\n.saved-name{color:var(--t1);font-weight:600}\r\n.saved-meta{font-size:11px;color:var(--t2);margin-top:2px}\r\n.saved-acts{display:flex;gap:6px}\r\n.saved-act{padding:4px 10px;font-size:11px;font-weight:600;border:0.5px solid var(--bd);border-radius:var(--rm);background:var(--bg1);cursor:pointer;font-family:var(--fn);color:var(--t2)}\r\n.saved-act.del{color:#A32D2D;border-color:#F09595}\r\n.no-saved{font-size:13px;color:var(--t3);text-align:center;padding:16px}\r\n.qwrap{background:var(--bg1);border:0.5px solid var(--bd);border-radius:var(--rl);overflow:hidden;margin-bottom:14px}\r\n.qhdr{padding:1.25rem 1.25rem 0}\r\n.qhdr h2{font-size:16px;font-weight:700;color:var(--t1);margin-bottom:4px}\r\n.qhdr p{font-size:13px;color:var(--t2);margin-bottom:1.25rem}\r\n.qsum{background:var(--bg2);border-radius:var(--rm);padding:14px 16px;margin:0 1.25rem 1.25rem;border-left:3px solid var(--br)}\r\n.qs-t{font-size:11px;font-weight:700;color:var(--t2);text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px}\r\n.qs-m{font-size:15px;font-weight:700;color:var(--t1);margin-bottom:12px}\r\n.qs-g{display:grid;grid-template-columns:1fr;gap:4px}\r\n@media(max-width:480px){.qs-g{grid-template-columns:repeat(2,1fr)}}\r\n.qs-i{font-size:13px;color:var(--t2);padding:6px 0;border-bottom:0.5px solid var(--bd);display:flex;align-items:baseline;gap:8px}\r\n.qs-i:last-child{border-bottom:none}\r\n.qs-i strong{color:var(--t1);font-weight:700}\r\n.qs-c{font-size:11px;color:var(--t3);font-family:var(--fm);margin-top:10px;padding-top:10px;border-top:0.5px solid var(--bd);line-height:1.8}\r\n.qform{padding:0 1.25rem 1.25rem;display:flex;flex-direction:column;gap:14px}\r\n.fr{display:grid;grid-template-columns:1fr 1fr;gap:12px}\r\n@media(max-width:520px){.fr{grid-template-columns:1fr}}\r\n.ff{display:flex;flex-direction:column;gap:5px}\r\n.ff label{font-size:12px;font-weight:600;color:var(--t2)}\r\n.ff label .req{color:var(--br);margin-left:2px}\r\n.fi,.fta,.fse{width:100%;border:0.5px solid var(--bd);border-radius:var(--rm);background:var(--bg1);color:var(--t1);font-size:13px;font-family:var(--fn);padding:9px 12px;transition:box-shadow .15s}\r\n.fi:focus,.fta:focus,.fse:focus{outline:none;box-shadow:0 0 0 2px rgba(216,90,48,.2);border-color:var(--br)}\r\n.fta{resize:vertical;min-height:90px;line-height:1.5}\r\n.fse{appearance:none;background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%236b6b67' d='M6 8L1 3h10z'\/%3E%3C\/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;padding-right:28px}\r\n.loc-row{display:flex;gap:8px}\r\n.loc-row .fi{flex:1}\r\n.loc-btn{height:38px;padding:0 12px;background:var(--bg2);border:0.5px solid var(--bd);border-radius:var(--rm);font-size:11px;font-weight:600;color:var(--t2);cursor:pointer;white-space:nowrap;display:flex;align-items:center;gap:5px;font-family:var(--fn);flex-shrink:0}\r\n.loc-btn:hover{background:var(--bg3)}\r\n.loc-btn.blu{background:var(--blb);border-color:var(--bll);color:var(--bl)}\r\n.mapwrap{width:100%;height:200px;border-radius:var(--rm);border:0.5px solid var(--bd);overflow:hidden;display:none;margin-top:8px}\r\n.mapwrap iframe{width:100%;height:100%;border:none}\r\n.coords{font-size:11px;color:var(--ok);background:var(--okb);padding:4px 10px;border-radius:var(--rm);display:none;font-family:var(--fm);margin-top:4px}\r\n.urg-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}\r\n@media(max-width:420px){.urg-grid{grid-template-columns:1fr}}\r\n.urg-btn{border:0.5px solid var(--bd);border-radius:var(--rm);padding:10px 8px;cursor:pointer;background:var(--bg1);text-align:center;width:100%;font-family:var(--fn)}\r\n.urg-btn:hover{border-color:var(--bd2)}\r\n.urg-btn.active{border:2px solid var(--br);background:var(--brb)}\r\n.urg-ic{font-size:18px;margin-bottom:4px}\r\n.urg-lb{font-size:12px;font-weight:600;color:var(--t1)}\r\n.urg-sb{font-size:10px;color:var(--t2);margin-top:2px}\r\n.photo-note{background:var(--blb);border-left:3px solid var(--bl);border-radius:0 var(--rm) var(--rm) 0;padding:10px 14px;font-size:12px;color:#0C447C;line-height:1.6}\r\n.qfooter{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding-top:4px}\r\n.footer-btn{display:flex;gap:20px;}\r\n.qfooter small{font-size:11px;color:var(--t3);line-height:1.5}\r\n.sub-btn{background:var(--ok);color:#fff;border:none;border-radius:var(--rm);padding:12px 28px;font-size:14px;font-weight:700;font-family:var(--fn);cursor:pointer;transition:background .15s;white-space:nowrap;display:inline-flex;align-items:center;gap:8px}\r\n.sub-btn:hover{background:#2d540d}\r\n.copy-quote-btn{background:var(--bg1);color:var(--t2);border:0.5px solid var(--bd);border-radius:var(--rm);padding:9px 16px;font-size:12px;font-weight:700;font-family:var(--fn);cursor:pointer;display:inline-flex;align-items:center;gap:5px}\r\n.copy-quote-btn:hover{background:var(--brb);color:var(--brd);border-color:var(--brl)}\r\n.copy-quote-btn.copied{background:var(--okb);color:var(--ok);border-color:var(--okl)}\r\n@media print{\r\n  body{background:#fff;padding:0}\r\n  .action-bar,.lang-bar,.qwrap,.guide-tog,.fit-tabs{display:none!important}\r\n  .card,.res{border:1px solid #ccc;break-inside:avoid}\r\n}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n<div class=\"calc\">\r\n\r\n<div class=\"lang-bar\" style=\"display:none\"><\/div>\r\n\r\n\r\n<div class=\"card\">\r\n  <div class=\"sh\"><div class=\"sn\">1<\/div><div class=\"st\" data-t=\"s1title\">W\u00e4hlen Sie Ihre Serie<\/div><\/div>\r\n  <div class=\"ss\" data-t=\"s1sub\">Jede Serie ist f\u00fcr unterschiedliche Standortbedingungen optimiert<\/div>\r\n  <div class=\"ser-grid\">\r\n    <button class=\"ser-btn\" id=\"sb-T\" onclick=\"setSeries('T')\">\r\n      <span class=\"pill pt\" data-t=\"pill-t\">Premium \u00b7 T-Serie<\/span>\r\n      <div class=\"sn2\">T-Serie<\/div>\r\n      <div class=\"sd\" data-t=\"ser-t-desc\">HydroFoam\u2122-Basis &amp; HydroSeal\u2122-Kante. Beste wasserdichte Leistung. Verstellbare Einheiten verf\u00fcgbar.<\/div>\r\n    <\/button>\r\n    <button class=\"ser-btn\" id=\"sb-S\" onclick=\"setSeries('S')\">\r\n      <span class=\"pill ps\" data-t=\"pill-s\">Flexibel \u00b7 S-Serie<\/span>\r\n      <div class=\"sn2\">S-Serie<\/div>\r\n      <div class=\"sd\" data-t=\"ser-s-desc\">Schiebeverbindung erlaubt 3\u20135\u00b0 Anpassung. Ideal f\u00fcr st\u00e4dtische &amp; unregelm\u00e4\u00dfige Layouts.<\/div>\r\n    <\/button>\r\n    <button class=\"ser-btn\" id=\"sb-D\" onclick=\"setSeries('D')\">\r\n      <span class=\"pill pd\" data-t=\"pill-d\">Unebener Boden \u00b7 D-Serie<\/span>\r\n      <div class=\"sn2\">D-Serie<\/div>\r\n      <div class=\"sd\" data-t=\"ser-d-desc\">Abnehmbare Membran f\u00fcr Kies, Erde &amp; gemischtes Gel\u00e4nde. Nicht verf\u00fcgbar in USA, UK, IE, CA &amp; QA.<\/div>\r\n    <\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"card\">\r\n  <div class=\"sh\"><div class=\"sn\">2<\/div><div class=\"st\" data-t=\"s2title\">H\u00f6he ausw\u00e4hlen<\/div><\/div>\r\n  <div class=\"ss\" data-t=\"s2sub\">Schutzh\u00f6he in cm<\/div>\r\n  <div class=\"ht-grid\" id=\"ht-grid\"><\/div>\r\n<\/div>\r\n\r\n<div class=\"card\">\r\n  <div class=\"sh\"><div class=\"sn\">3<\/div><div class=\"st\" data-t=\"s3title\">Barrierenl\u00e4nge &amp; Zubeh\u00f6r<\/div><\/div>\r\n  <div class=\"ss\" data-t=\"s3sub\">Geben Sie unten Ihre geraden Streckenl\u00e4ngen und Zubeh\u00f6r ein<\/div>\r\n\r\n  <div class=\"guide-tog\" onclick=\"toggleGuide()\">\r\n    <svg class=\"guide-arr\" id=\"guide-arr\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"3,6 8,11 13,6\"\/><\/svg>\r\n    <span class=\"guide-tog-lbl\" data-t=\"guide-toggle\">So messen Sie Ihren Standort<\/span>\r\n    <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" style=\"width:14px;height:14px;flex-shrink:0;color:var(--bl)\"><circle cx=\"8\" cy=\"8\" r=\"6.5\"\/><line x1=\"8\" y1=\"7\" x2=\"8\" y2=\"11\"\/><circle cx=\"8\" cy=\"5\" r=\".8\" fill=\"currentColor\" stroke=\"none\"\/><\/svg>\r\n  <\/div>\r\n  <div class=\"guide-body\" id=\"guide-body\">\r\n    <div class=\"guide-inner\">\r\n      <div class=\"guide-step\"><div class=\"guide-sn\">1<\/div><div class=\"guide-st\"><strong data-t=\"g1h\">Messen Sie nur gerade Abschnitte.<\/strong> <span data-t=\"g1b\">Gehen Sie jeden geraden Abschnitt ab und messen Sie ihn einzeln. Schlie\u00dfen Sie keine Ecken oder Kurven in die L\u00e4nge ein. Sie k\u00f6nnen unten mehrere separate Abschnitte hinzuf\u00fcgen.<\/span><\/div><\/div>\r\n      <div class=\"gdiv\"><\/div>\r\n      <div class=\"guide-step\"><div class=\"guide-sn\">2<\/div><div class=\"guide-st\"><strong data-t=\"g2h\">Identifizieren Sie Ihre Kurven.<\/strong> <span data-t=\"g2b\">Sanfte Kurven (wenige Grad pro Verbindung) ben\u00f6tigen keine Eckmodule \u2014 verbinden Sie die Module einfach in einem leichten Bogen. Die S-Serie bew\u00e4ltigt standardm\u00e4\u00dfig bis zu 3\u20135\u00b0 pro Verbindung. Verwenden Sie f\u00fcr deutliche Biegungen Eckmodule.<\/span><\/div><\/div>\r\n      <div class=\"gdiv\"><\/div>\r\n      <div class=\"guide-step\"><div class=\"guide-sn\">3<\/div><div class=\"guide-st\"><strong data-t=\"g3h\">Pr\u00fcfen Sie auf W\u00e4nde und offene Enden.<\/strong> <span data-t=\"g3b\">Wenn die Barriere an eine Wand st\u00f6\u00dft, ben\u00f6tigen Sie einen Wandanschluss. Jedes offene Ende ben\u00f6tigt ein Endmodul (links oder rechts).<\/span><\/div><\/div>\r\n      <div class=\"gdiv\"><\/div>\r\n      <div class=\"guide-step\"><div class=\"guide-sn\">4<\/div><div class=\"guide-st\"><strong data-t=\"g4h\">Ber\u00fccksichtigen Sie Ihre Bodenbeschaffenheit.<\/strong> <span data-t=\"g4b\">Alle EasyWall-Serien k\u00f6nnen mit unebenem Boden umgehen \u2014 eine abnehmbare Membran kann jedem Modell hinzugef\u00fcgt werden. Bei der D-Serie ist diese standardm\u00e4\u00dfig integriert.<\/span><\/div><\/div>\r\n      <div class=\"gdiv\"><\/div>\r\n      <div class=\"guide-step\"><div class=\"guide-sn\">5<\/div><div class=\"guide-st\"><strong data-t=\"g5h\">Planen Sie eine kleine Toleranz in der installierten L\u00e4nge ein.<\/strong> <span data-t=\"g5b\">Der Rechner verwendet die NoFloods-Rate (Module pro Meter) f\u00fcr jedes Modell, um Ihnen die richtige Anzahl an Modulen zu nennen. Je nach Bodenbedingungen und Installationswinkel sollten Sie mit einer Abweichung von \u00b12\u20133% in der endg\u00fcltigen installierten L\u00e4nge rechnen.<\/span><\/div><\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"dims\">\r\n    <div class=\"dtit\" data-t=\"sections-title\">Gerade Abschnitte<\/div>\r\n\r\n    <!-- Map tool -->\r\n    <div class=\"map-mode-row\">\r\n      <button class=\"map-mode-btn active\" id=\"map-mode-map\" onclick=\"setInputMode('map')\">\r\n        <div class=\"mm-badge\">Empfohlen<\/div>\r\n        <div class=\"mm-label\">Auf Karte zeichnen<\/div>\r\n        <div class=\"mm-sub\">Zeichnen Sie Ihre Barriere auf der Karte. L\u00e4ngen und Ecken werden automatisch berechnet.<\/div>\r\n      <\/button>\r\n      <button class=\"map-mode-btn\" id=\"map-mode-manual\" onclick=\"setInputMode('manual')\">\r\n        <div style=\"height:18px\"><\/div>\r\n        <div class=\"mm-label\">Manuell eingeben<\/div>\r\n        <div class=\"mm-sub\">Geben Sie die Abschnittsl\u00e4ngen in Metern ein. Nutzen Sie dies, wenn Sie bereits Ma\u00dfe haben.<\/div>\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <!-- Map panel -->\r\n    <div class=\"map-panel\" id=\"map-panel\">\r\n      <!-- Address search row -->\r\n      <div style=\"position:relative;margin-bottom:6px\" onclick=\"event.stopPropagation()\">\r\n        <div style=\"display:flex;gap:6px\">\r\n          <input type=\"text\" id=\"map-search-input\" placeholder=\"Adresse oder Ort suchen\u2026\" \r\n            style=\"flex:1;padding:7px 10px;font-size:12px;font-family:var(--fn);border:0.5px solid var(--bd);border-radius:var(--rm);background:var(--bg1);color:var(--t1);outline:none\"\r\n            onkeydown=\"if(event.key==='Enter'){event.stopPropagation();mapSearchAddress();}if(event.key==='Escape'){const sr=document.getElementById('map-search-results');if(sr)sr.style.display='none';}\"\r\n            onfocus=\"this.style.borderColor='var(--br)'\" onblur=\"this.style.borderColor='var(--bd)'\">\r\n          <button onclick=\"event.stopPropagation();mapSearchAddress()\" style=\"padding:7px 12px;background:var(--br);color:#fff;border:none;border-radius:var(--rm);font-size:12px;font-weight:700;font-family:var(--fn);cursor:pointer;white-space:nowrap\">Los<\/button>\r\n        <\/div>\r\n        <div id=\"map-search-results\" style=\"display:none;position:absolute;top:calc(100% + 2px);left:0;right:0;background:var(--bg1);border:0.5px solid var(--bd);border-radius:var(--rm);max-height:200px;overflow-y:auto;font-size:12px;z-index:10000;box-shadow:0 4px 12px rgba(0,0,0,.12)\" onclick=\"event.stopPropagation()\"><\/div>\r\n      <\/div>\r\n      <div class=\"map-tb\">\r\n        <button class=\"map-tb-btn active\" id=\"map-btn-draw\" onclick=\"mapSetMode('draw')\">Punkte zeichnen<\/button>\r\n        <button class=\"map-tb-btn\" id=\"map-btn-pan\" onclick=\"mapSetMode('pan')\">Karte verschieben<\/button>\r\n        <button class=\"map-tb-btn\" id=\"map-btn-sat\" onclick=\"mapToggleSat()\">Satellit<\/button>\r\n        <button class=\"map-tb-btn\" onclick=\"mapGoToLocation()\">Mein Standort<\/button>\r\n        <button class=\"map-tb-btn\" onclick=\"mapUndo()\">R\u00fcckg\u00e4ngig<\/button>\r\n        <button class=\"map-tb-btn danger\" onclick=\"mapClearAll()\">Alles l\u00f6schen<\/button>\r\n      <\/div>\r\n      <div id=\"ew-map\"><\/div>\r\n      <div id=\"map-drawing-btns\" style=\"display:none;margin-top:8px;gap:8px;flex-wrap:wrap\">\r\n        <button onclick=\"mapFinishShape(false)\" style=\"padding:7px 14px;background:var(--br);color:#fff;border:none;border-radius:20px;font-size:12px;font-weight:700;font-family:var(--fn);cursor:pointer\">Offene Linie abschlie\u00dfen<\/button>\r\n        <button onclick=\"mapFinishShape(true)\" style=\"padding:7px 14px;background:var(--ok);color:#fff;border:none;border-radius:20px;font-size:12px;font-weight:700;font-family:var(--fn);cursor:pointer\">Als Polygon schlie\u00dfen<\/button>\r\n        <span style=\"font-size:11px;color:var(--t3);align-self:center\" id=\"map-points-count\"><\/span>\r\n      <\/div>\r\n      <div class=\"map-import-bar hidden\" id=\"map-import-bar\">\r\n        <div class=\"map-import-text\" id=\"map-import-text\">\u2013<span id=\"map-import-sub\"><\/span><\/div>\r\n        <button class=\"map-import-btn\" onclick=\"mapUseMeasurements()\">Diese Ma\u00dfe verwenden<\/button>\r\n      <\/div>\r\n      <div style=\"font-size:11px;color:var(--t3);margin-top:6px;line-height:1.5\" id=\"map-hint-text\">Klicken Sie auf die Karte, um Punkte entlang Ihrer Barriere zu platzieren. Klicken Sie auf \"Diese Ma\u00dfe verwenden\", wenn Sie fertig sind.<\/div>\r\n      <div style=\"font-size:11px;color:var(--t3);margin-top:4px;line-height:1.5\">\ud83d\udccd Der Kartenstandort wird nicht in Ihr Angebot \u00fcbernommen \u2014 f\u00fcgen Sie die Standortadresse im Feld <strong>Standort<\/strong> im Angebotsbereich unten hinzu.<\/div>\r\n    <\/div>\r\n\r\n    <!-- Close shape popup -->\r\n    <div class=\"map-close-popup\" id=\"map-close-popup\">\r\n      <h3>Wollten Sie die Form schlie\u00dfen?<\/h3>\r\n      <p>Es sieht so aus, als h\u00e4tten Sie in die N\u00e4he Ihres Startpunkts geklickt. Was m\u00f6chten Sie tun?<\/p>\r\n      <div class=\"map-popup-btns\">\r\n        <button class=\"mcp-btn green\" onclick=\"mapPopupClose(true)\">Als Polygon schlie\u00dfen \u2014 vollst\u00e4ndiger Umfang, keine offenen Enden<\/button>\r\n        <button class=\"mcp-btn orange\" onclick=\"mapPopupClose(false)\">Als offene Linie abschlie\u00dfen \u2014 Barriere mit offenen Enden<\/button>\r\n        <button class=\"mcp-btn neutral\" onclick=\"mapPopupCancel()\">Abbrechen \u2014 weiterzeichnen<\/button>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Imported badge shown when map data is active -->\r\n    <div id=\"map-imported-note\" style=\"display:none;margin-bottom:8px;padding:8px 10px;background:var(--okb);border:0.5px solid var(--okl);border-radius:var(--rm);flex-direction:column;gap:6px\">\r\n      <div style=\"display:flex;align-items:center;justify-content:space-between;gap:8px\">\r\n        <span style=\"font-size:12px;color:#27500A;font-weight:600;display:flex;align-items:center;gap:6px\">\r\n          <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\r\n          Ma\u00dfe aus der Karte importiert\r\n        <\/span>\r\n        <button onclick=\"clearMapImport()\" style=\"font-size:11px;color:#A32D2D;background:none;border:0.5px solid #F09595;border-radius:4px;cursor:pointer;padding:3px 8px;font-family:var(--fn);flex-shrink:0\">Alles l\u00f6schen &amp; neu starten<\/button>\r\n      <\/div>\r\n      <div style=\"font-size:11px;color:#3B6D11\">Scrollen Sie nach unten, um Ihre Ergebnisse zu sehen und die Konfiguration zu speichern \u2193<\/div>\r\n    <\/div>\r\n\r\n    <div id=\"sec-summary\" style=\"display:none;margin-bottom:10px;padding:10px 12px;background:var(--okb);border:0.5px solid var(--okl);border-radius:var(--rm);font-size:12px;color:var(--ok)\"><\/div>\r\n    <div class=\"sec-tabs-row\" id=\"sec-tabs-row\"><\/div>\r\n    <div id=\"sec-panels\"><\/div>\r\n    <button class=\"act-btn\" style=\"margin-top:10px;font-size:11px;padding:6px 12px\" id=\"add-sec-btn\" onclick=\"addSection()\">+ <span data-t=\"add-section\">Weiteren Abschnitt hinzuf\u00fcgen<\/span><\/button>\r\n  <\/div>\r\n\r\n  <div class=\"dims\">\r\n    <div class=\"dtit\" data-t=\"acc-title\">Ecken &amp; Zubeh\u00f6r<\/div>\r\n    <div class=\"dgrid\">\r\n\r\n      <div class=\"dg\" id=\"grp-corners\">\r\n        <div class=\"dgl\" data-t=\"corners-lbl\">Biegungen &amp; Ecken<\/div>\r\n\r\n        <!-- Situation picker -->\r\n        <div style=\"display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-bottom:12px\">\r\n          <button class=\"situation-btn active\" id=\"sit-90\" onclick=\"setSituation('90')\">\r\n            <div class=\"sit-icon\">\u2310<\/div>\r\n            <div class=\"sit-label\">Scharfe 90\u00b0-Kurve<\/div>\r\n            <div class=\"sit-sub\">Wie eine Geb\u00e4udeecke<\/div>\r\n          <\/button>\r\n          <button class=\"situation-btn\" id=\"sit-angle\" onclick=\"setSituation('angle')\">\r\n            <div class=\"sit-icon\">\u2220<\/div>\r\n            <div class=\"sit-label\">Anderer Winkel<\/div>\r\n            <div class=\"sit-sub\">Nicht exakt 90\u00b0<\/div>\r\n          <\/button>\r\n          <button class=\"situation-btn\" id=\"sit-curve\" onclick=\"setSituation('curve')\">\r\n            <div class=\"sit-icon\">\u2312<\/div>\r\n            <div class=\"sit-label\">Sanfte Kurve<\/div>\r\n            <div class=\"sit-sub\">Allm\u00e4hliche Biegung, keine scharfe Kurve<\/div>\r\n          <\/button>\r\n        <\/div>\r\n\r\n        <!-- 90\u00b0 mode -->\r\n        <div id=\"corner-mode-count\">\r\n          <div class=\"dfr\"><span data-t=\"inward-corners\">Innenecken<\/span><div style=\"display:flex;align-items:center;gap:6px\"><input class=\"ni\" type=\"number\" id=\"f-cin\" min=\"0\" value=\"0\" oninput=\"calc()\" style=\"width:60px\"><span class=\"ds\" data-t=\"corners-unit\">Ecken<\/span><\/div><\/div>\r\n          <div class=\"dfr\" id=\"row-cout\"><span data-t=\"outward-corners\">Au\u00dfenecken<\/span><div style=\"display:flex;align-items:center;gap:6px\"><input class=\"ni\" type=\"number\" id=\"f-cout\" min=\"0\" value=\"0\" oninput=\"calc()\" style=\"width:60px\"><span class=\"ds\" data-t=\"corners-unit\">Ecken<\/span><\/div><\/div>\r\n          <div class=\"cfb\" id=\"corner-fb-count\"><\/div>\r\n          <div id=\"t100-out-type\" style=\"display:none;margin-top:8px;padding:8px 10px;background:var(--wnb);border:0.5px solid #FAC775;border-radius:var(--rm)\">\r\n            <div style=\"font-size:11px;font-weight:700;color:#633806;margin-bottom:8px\">W\u00e4hlen Sie den Au\u00dfeneck-Typ:<\/div>\r\n            <div style=\"display:flex;gap:8px\">\r\n              <button id=\"cout-type-modules\" onclick=\"setCoutType('modules')\" style=\"flex:1;padding:8px;font-size:11px;font-weight:600;font-family:var(--fn);border:1.5px solid #FAC775;border-radius:6px;background:#fff8ee;color:#633806;cursor:pointer;text-align:left\">\r\n                <strong style=\"display:block;margin-bottom:2px\">4 \u00d7 22,5\u00b0-Module<\/strong>\r\n                <span style=\"font-weight:400;color:#8B6914\">20-3221 \u00b7 Flexibler<\/span>\r\n              <\/button>\r\n              <button id=\"cout-type-fixed\" onclick=\"setCoutType('fixed')\" style=\"flex:1;padding:8px;font-size:11px;font-weight:600;font-family:var(--fn);border:0.5px solid var(--bd);border-radius:6px;background:var(--bg2);color:var(--t2);cursor:pointer;text-align:left\">\r\n                <strong style=\"display:block;margin-bottom:2px\">1 \u00d7 festes 90\u00b0-Doppelmodul<\/strong>\r\n                <span style=\"font-weight:400\">20-3230 \u00b7 Einfachere Installation<\/span>\r\n              <\/button>\r\n            <\/div>\r\n          <\/div>\r\n          <div id=\"t120-out-note\" style=\"display:none;margin-top:8px;padding:6px 9px;background:var(--wnb);border-radius:var(--rm);font-size:11px;color:#633806;line-height:1.5\">Die T120-Au\u00dfenecke verwendet nur ein festes 90\u00b0-Doppelmodul (20-3243) \u2014 1 Modul pro 90\u00b0-Drehung. Es ist kein anderer Au\u00dfenwinkel verf\u00fcgbar.<\/div>\r\n          <div id=\"corner-fixed-note\" style=\"display:none;margin-top:8px;padding:6px 9px;background:var(--wnb);border-radius:var(--rm);font-size:11px;color:#633806;line-height:1.5\" data-t=\"corner-fixed-note\">Die T100 Au\u00dfenecke verwendet 22,5\u00b0-Module (20-3221) \u2014 4 Module pro 90\u00b0-Kurve. Ein festes 90\u00b0-Doppelmodul (20-3230) ist ebenfalls verf\u00fcgbar.<\/div>\r\n          <div id=\"no-corner-note\" style=\"display:none;margin-top:8px;padding:6px 9px;background:var(--bg3);border-radius:var(--rm);font-size:11px;color:var(--t3);line-height:1.5\" data-t=\"no-corner-note\">Keine Eckmodule f\u00fcr S110 verf\u00fcgbar. Nutzen Sie die nat\u00fcrliche Flexibilit\u00e4t f\u00fcr sanfte Kurven.<\/div>\r\n        <\/div>\r\n\r\n        <!-- Other angle mode -->\r\n        <div id=\"corner-mode-angle\" style=\"display:none\">\r\n          <div style=\"background:var(--blb);border-radius:var(--rm);padding:10px 12px;font-size:12px;color:#0C447C;line-height:1.6;margin-bottom:10px\">\r\n            Geben Sie Ihren tats\u00e4chlichen Drehwinkel ein. Der Rechner teilt Ihnen mit, wie viele Eckmodule Sie ben\u00f6tigen und wie genau die Passform ist.\r\n          <\/div>\r\n          <div class=\"dfr\"><span data-t=\"my-angle\">Mein Drehwinkel<\/span><div style=\"display:flex;align-items:center;gap:6px\"><input class=\"ni\" type=\"number\" id=\"f-angle\" min=\"1\" max=\"180\" value=\"90\" oninput=\"calcAngle()\" style=\"width:70px\"><span class=\"ds\">\u00b0<\/span><\/div><\/div>\r\n          <div class=\"dfr\"><span data-t=\"turn-dir\">Drehrichtung<\/span><div style=\"display:flex;gap:6px\"><button class=\"mb\" id=\"adir-in\" onclick=\"setAdir('in')\" style=\"padding:4px 10px;font-size:11px\" data-t=\"inward\">Nach innen<\/button><button class=\"mb active\" id=\"adir-out\" onclick=\"setAdir('out')\" style=\"padding:4px 10px;font-size:11px\" data-t=\"outward\">Nach au\u00dfen<\/button><\/div><\/div>\r\n          <div class=\"cfb\" id=\"corner-fb-angle\"><\/div>\r\n        <\/div>\r\n\r\n        <!-- Gentle curve mode -->\r\n        <div id=\"corner-mode-curve\" style=\"display:none\">\r\n          <div id=\"curve-note\" style=\"background:var(--okb);border-left:3px solid var(--ok);border-radius:0 var(--rm) var(--rm) 0;padding:12px 14px;font-size:12px;color:#27500A;line-height:1.7\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"dg\" id=\"grp-ends\">\r\n        <div class=\"dgl\" style=\"display:flex;align-items:center;gap:6px\">\r\n          <span data-t=\"end-modules-lbl\">Endmodule<\/span>\r\n          <span class=\"exact-info-trigger\" onclick=\"toggleEndInfo(event)\" style=\"font-size:10px\">? Was ist das<\/span>\r\n        <\/div>\r\n        <div class=\"mbg\" id=\"end-type-toggle\" style=\"margin-bottom:12px\">\r\n          <button class=\"mb active\" id=\"end-type-std\" onclick=\"setEndTypeAll('std')\" data-t=\"standard\">Standard<\/button>\r\n          <button class=\"mb\" id=\"end-type-adj\" onclick=\"setEndTypeAll('adj')\" data-t=\"adjustable\">Verstellbar<\/button>\r\n        <\/div>\r\n        <div class=\"dfr\"><span data-t=\"left\">Links<\/span><div style=\"display:flex;align-items:center;gap:6px\"><input class=\"ni\" type=\"number\" id=\"f-el\" min=\"0\" value=\"0\" oninput=\"calc()\" style=\"width:60px\"><span class=\"ds\" data-t=\"pcs\">Stk.<\/span><\/div><\/div>\r\n        <div class=\"dfr\" style=\"margin-top:6px\"><span data-t=\"right\">Rechts<\/span><div style=\"display:flex;align-items:center;gap:6px\"><input class=\"ni\" type=\"number\" id=\"f-er\" min=\"0\" value=\"0\" oninput=\"calc()\" style=\"width:60px\"><span class=\"ds\" data-t=\"pcs\">Stk.<\/span><\/div><\/div>\r\n        <div class=\"ewr\" id=\"end-width-row\"><span data-t=\"settable-width\">Einstellbare Breite:<\/span> <strong id=\"end-width-label\">\u2013<\/strong> \u2014 <span data-t=\"set-on-site\">vor Ort einzustellen<\/span><\/div>\r\n        <input type=\"hidden\" id=\"el-type\" value=\"std\">\r\n        <input type=\"hidden\" id=\"er-type\" value=\"std\">\r\n        <input type=\"hidden\" id=\"f-ael\" value=\"0\">\r\n        <input type=\"hidden\" id=\"f-aer\" value=\"0\">\r\n      <\/div>\r\n\r\n      <div class=\"dg\" id=\"grp-wall\">\r\n        <div class=\"dgl\" style=\"display:flex;align-items:center;gap:6px\">\r\n          <span data-t=\"wall-conn-lbl\">Wandanschl\u00fcsse<\/span>\r\n          <span class=\"exact-info-trigger\" onclick=\"toggleWallInfo(event)\" style=\"font-size:10px\">? Was ist das<\/span>\r\n        <\/div>\r\n        <div class=\"dfr\"><span data-t=\"left\">Links<\/span><div style=\"display:flex;align-items:center;gap:6px\"><input class=\"ni\" type=\"number\" id=\"f-wl\" min=\"0\" value=\"0\" oninput=\"calc()\" style=\"width:60px\"><span class=\"ds\" data-t=\"pcs\">Stk.<\/span><\/div><\/div>\r\n        <div class=\"dfr\"><span data-t=\"right\">Rechts<\/span><div style=\"display:flex;align-items:center;gap:6px\"><input class=\"ni\" type=\"number\" id=\"f-wr\" min=\"0\" value=\"0\" oninput=\"calc()\" style=\"width:60px\"><span class=\"ds\" data-t=\"pcs\">Stk.<\/span><\/div><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<!-- Cart moved to after results -->\r\n<div class=\"res\">\r\n  <div class=\"res-hdr\">\r\n    <span class=\"res-t\" data-t=\"results-title\">Ergebnisse<\/span>\r\n    <span class=\"res-tag\" id=\"r-tag\">\u2013<\/span>\r\n  <\/div>\r\n  <div class=\"fit-tabs\">\r\n    <button class=\"fit-tab active\" id=\"tab-std\" onclick=\"switchTab('std')\" data-t=\"standard-fit\">Standard-Passform<\/button>\r\n    <button class=\"fit-tab\" id=\"tab-exact\" onclick=\"switchTab('exact')\">\r\n      <span data-t=\"exact-fit\">Exakte Passform<\/span>\r\n      <span class=\"avail-badge\" id=\"badge-exact\" data-t=\"available\">verf\u00fcgbar<\/span>\r\n      <span class=\"exact-info-trigger\" onclick=\"toggleExactInfo(event)\" title=\"Wann Sie die exakte Passform verwenden sollten\">? Was ist das<\/span>\r\n    <\/button>\r\n    <button class=\"fit-tab\" id=\"tab-weight\" onclick=\"switchTab('weight')\" data-t=\"weight-tab\">Gewicht &amp; Lagerung <span id=\"badge-weight\" style=\"margin-left:5px;font-size:10px;padding:1px 7px;border-radius:8px;background:#E8E8E4;color:var(--t2);font-weight:700;vertical-align:middle\"><\/span><\/button>\r\n  <\/div>\r\n\r\n  <!-- Exact fit info popover -->\r\n  <div id=\"exact-info-popover\" style=\"display:none;position:relative;z-index:10\">\r\n    <div style=\"margin:0;background:var(--blb);border:0.5px solid var(--bll);border-top:none;padding:14px 16px;font-size:12px;color:#0C447C;line-height:1.7\">\r\n      <div style=\"display:flex;justify-content:space-between;align-items:flex-start;gap:10px;margin-bottom:10px\">\r\n        <strong style=\"font-size:13px;color:#0C447C\">Wann Sie die exakte Passform verwenden sollten<\/strong>\r\n        <button onclick=\"toggleExactInfo()\" style=\"background:none;border:none;cursor:pointer;color:#0C447C;font-size:16px;line-height:1;padding:0;flex-shrink:0\">\u00d7<\/button>\r\n      <\/div>\r\n      <p style=\"margin-bottom:8px\"><strong>Standard-Passform<\/strong> ist f\u00fcr die meisten Installationen richtig. Sie liefert Ihnen die korrekte Anzahl an Modulen \u2014 das letzte kann einige Zentimeter \u00fcber Ihr Ziel hinausragen, was f\u00fcr offene Strecken in Ordnung ist.<\/p>\r\n      <p style=\"margin-bottom:8px\"><strong>Verwenden Sie die exakte Passform, wenn<\/strong> Ihre Barriere b\u00fcndig an einer Wand, einem Pfosten oder einem anderen festen Hindernis enden muss. Der Rechner ermittelt genau, welches Modul am Ende der Strecke platziert werden muss, um die L\u00fccke zu schlie\u00dfen \u2014 und sagt Ihnen, worauf Sie es einstellen m\u00fcssen (nicht alle Optionen sind f\u00fcr jede Serie und jedes Modell verf\u00fcgbar):<\/p>\r\n      <ul style=\"padding-left:16px;margin-bottom:8px;display:flex;flex-direction:column;gap:4px\">\r\n        <li><strong>Verstellbares gerades Modul<\/strong> \u2014 verschiebbar zwischen 57\u201370,5 cm. Wird verwendet, wenn die verbleibende L\u00fccke in diesem Bereich liegt. Wird vor Ort eingestellt.<\/li>\r\n        <li><strong>Verstellbares Endmodul<\/strong> (nur T50) \u2014 verschiebbar zwischen 44\u201352 cm. F\u00fcr mittlere L\u00fccken.<\/li>\r\n        <li><strong>Endmodul<\/strong> \u2014 feste Breite, muss ggf. vor Ort leicht angepasst werden. F\u00fcr kleine L\u00fccken.<\/li>\r\n        <li><strong>Wandanschluss<\/strong> \u2014 befestigt das Barrierenende direkt an der Wand. F\u00fcr sehr kleine L\u00fccken.<\/li>\r\n      <\/ul>\r\n      <p style=\"color:#185FA5;opacity:.8\">Wenn Sie keinen b\u00fcndigen Abschluss ben\u00f6tigen, verwenden Sie einfach die Standard-Passform und ignorieren Sie diesen Tab.<\/p>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"fit-body\" id=\"body-std\">\r\n    <div class=\"barlbl\" data-t=\"length-comparison\">L\u00e4ngenvergleich<\/div>\r\n    <div class=\"barwrap\"><div class=\"bar-req\" id=\"bar-req\"><\/div><div class=\"bar-act\" id=\"bar-act\"><\/div><div class=\"bar-ov\" id=\"bar-ov\"><\/div><\/div>\r\n    <div class=\"bleg\">\r\n      <span><span class=\"bdot\" style=\"background:var(--blb);border:1px dashed #378ADD\"><\/span><span data-t=\"required\">Erforderlich:<\/span> <strong id=\"lbl-req\">\u2013<\/strong><\/span>\r\n      <span><span class=\"bdot\" style=\"background:var(--brb)\"><\/span><span data-t=\"actual\">Tats\u00e4chlich:<\/span> <strong id=\"lbl-act\">\u2013<\/strong><\/span>\r\n      <span id=\"lbl-ov-wrap\"><span class=\"bdot\" style=\"background:var(--brl)\"><\/span><span data-t=\"over-by\">\u00dcberschuss:<\/span> <strong id=\"lbl-ov\">\u2013<\/strong><\/span>\r\n    <\/div>\r\n    <div class=\"scards\" id=\"r-sum\"><\/div>\r\n    <div class=\"bkwrap\"><div class=\"dtit\" data-t=\"breakdown\">Aufschl\u00fcsselung &amp; Produktcodes<\/div><div id=\"r-bk\"><\/div><\/div>\r\n    <div class=\"notice\" id=\"r-note\"><\/div>\r\n    <div class=\"notice warn\" id=\"r-warn\" style=\"display:none\"><\/div>\r\n  <\/div>\r\n\r\n  <div class=\"fit-body\" id=\"body-weight\" style=\"display:none\">\r\n    <div class=\"notice info\" style=\"margin-top:0;margin-bottom:12px\" data-t=\"weight-note\">Alle Gewichte sind pro Modultyp verifiziert. Palettensch\u00e4tzungen sind Richtwerte \u2014 f\u00fcr genaue Logistik bitte bei NoFloods anfragen.<\/div>\r\n    <div class=\"wt-grid\" id=\"wt-grid\"><\/div>\r\n  <\/div>\r\n\r\n  <div class=\"fit-body\" id=\"body-exact\" style=\"display:none\">\r\n    <div class=\"ei\" id=\"ei\"><\/div>\r\n    <div id=\"eo-list\"><\/div>\r\n    <div class=\"notice\" id=\"en\"><\/div>\r\n  <\/div>\r\n\r\n<\/div><!-- end .res -->\r\n\r\n  <!-- Results action bar \u2014 sticky at bottom once results are shown -->\r\n  <div id=\"results-action-bar\" style=\"display:none;position:sticky;bottom:0;z-index:100;padding:12px 16px;border-top:0.5px solid var(--bd);background:var(--bg2);box-shadow:0 -4px 12px rgba(0,0,0,.08)\">\r\n    <div style=\"display:flex;gap:8px;flex-wrap:wrap;align-items:center\">\r\n      <button id=\"btn-save-another\" onclick=\"addToQuoteAndAnother()\" style=\"flex:1;min-width:140px;padding:10px 14px;background:var(--br);color:#fff;border:none;border-radius:var(--rm);font-size:13px;font-weight:700;font-family:var(--fn);cursor:pointer;display:flex;align-items:center;gap:7px;justify-content:center\">\r\n        <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" style=\"width:14px;height:14px;flex-shrink:0\"><path d=\"M8 3v10M3 8h10\" stroke-linecap=\"round\"\/><\/svg>\r\n        Speichern &amp; weiteres hinzuf\u00fcgen\r\n      <\/button>\r\n      <button id=\"btn-save-quote\" onclick=\"addToQuoteAndFinish()\" style=\"flex:1;min-width:140px;padding:10px 14px;background:var(--ok);color:#fff;border:none;border-radius:var(--rm);font-size:13px;font-weight:700;font-family:var(--fn);cursor:pointer;display:flex;align-items:center;gap:7px;justify-content:center\">\r\n        <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" style=\"width:14px;height:14px;flex-shrink:0\"><path d=\"M2.5 8.5l3.5 3.5 7-7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\r\n        Speichern &amp; zum Angebot gehen\r\n      <\/button>\r\n      <button onclick=\"if(cart.length>0){if(!confirm('Dadurch werden alle '+cart.length+' gespeicherten Konfigurationen gel\u00f6scht und der Vorgang neu gestartet. Sind Sie sicher?'))return;}resetConfig()\" style=\"padding:10px 14px;background:#fff;color:#A32D2D;border:1.5px solid #F09595;border-radius:var(--rm);font-size:12px;font-weight:700;font-family:var(--fn);cursor:pointer;white-space:nowrap\">\r\n        Alles l\u00f6schen &amp; neu starten\r\n      <\/button>\r\n    <\/div>\r\n<\/div><!-- end results-action-bar -->\r\n\r\n<!-- Cart \u2014 always visible once something added -->\r\n<div id=\"cart-section\" style=\"display:none;margin-bottom:14px\">\r\n  <div class=\"card\" style=\"padding:0;overflow:hidden\">\r\n    <div style=\"padding:16px;border-bottom:0.5px solid var(--bd);display:flex;align-items:center;justify-content:space-between;gap:12px\">\r\n      <div>\r\n        <div style=\"font-size:15px;font-weight:700;color:var(--t1)\">Ihr Angebot <span id=\"cart-count\" style=\"font-size:12px;font-weight:600;background:var(--br);color:#fff;border-radius:10px;padding:2px 9px;margin-left:6px\">0<\/span><\/div>\r\n        <div style=\"font-size:12px;color:var(--t2);margin-top:2px\">Jede Konfiguration ist unten aufgef\u00fchrt \u2014 entfernen oder weitere hinzuf\u00fcgen<\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <div id=\"cart-items\" style=\"padding:14px 16px;display:flex;flex-direction:column;gap:10px\"><\/div>\r\n    <div style=\"padding:14px 16px;border-top:0.5px solid var(--bd);background:var(--bg2);display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap\">\r\n      <div style=\"font-size:13px;color:var(--t2)\">\r\n        <strong id=\"cart-total-pcs\" style=\"color:var(--t1);font-size:15px\">0<\/strong> Module insgesamt\r\n        <span style=\"margin:0 8px;color:var(--bd)\">\u00b7<\/span>\r\n        <strong id=\"cart-total-kg\" style=\"color:var(--t1)\">0 kg<\/strong> Gesamtgewicht\r\n      <\/div>\r\n      <button onclick=\"scrollToQuote()\" style=\"padding:9px 20px;background:var(--br);color:#fff;border:none;border-radius:var(--rm);font-size:13px;font-weight:700;font-family:var(--fn);cursor:pointer;display:flex;align-items:center;gap:6px\">\r\n        <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" style=\"width:13px;height:13px\"><rect x=\"1\" y=\"3\" width=\"14\" height=\"10\" rx=\"1.5\"\/><path d=\"M1 4l7 5 7-5\" stroke-linecap=\"round\"\/><\/svg>\r\n        Angebot anfordern\r\n      <\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"qwrap\" id=\"quote-section\">\r\n  <div class=\"qhdr\">\r\n    <h2>Angebotsanfrage senden<\/h2>\r\n    <p>Ihre Konfiguration ist vorausgef\u00fcllt. F\u00fcgen Sie unten einige Details hinzu und klicken Sie auf die Schaltfl\u00e4che \u2014 Ihre E-Mail-App \u00f6ffnet sich, alles bereit zum Senden an NoFloods.<\/p>\r\n  <\/div>\r\n  <!-- Cart summary in quote -->\r\n  <div id=\"quote-cart-summary\" style=\"margin-bottom:0\">\r\n    <div id=\"quote-cart-items\" style=\"display:flex;flex-direction:column;gap:8px;margin:0 1.25rem 1rem\"><\/div>\r\n    <div id=\"quote-single-config\">\r\n      <div class=\"qsum\">\r\n        <div class=\"qs-t\">Ihre Konfiguration<\/div>\r\n        <div class=\"qs-m\" id=\"qs-model\">\u2013<\/div>\r\n        <div class=\"qs-g\" id=\"qs-grid\"><\/div>\r\n        <div class=\"qs-c\" id=\"qs-codes\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n  <div class=\"qform\" id=\"qform\">\r\n\r\n    <!-- Urgency -->\r\n    <div class=\"ff\">\r\n      <label>Wann ben\u00f6tigen Sie es?<\/label>\r\n      <div class=\"urg-grid\">\r\n        <button class=\"urg-btn\" id=\"urg-asap\" onclick=\"setUrg('asap')\">\r\n          <div class=\"urg-ic\">\u26a1<\/div>\r\n          <div class=\"urg-lb\">So schnell wie m\u00f6glich<\/div>\r\n          <div class=\"urg-sb\">Dringend \u2014 Hochwasserrisiko<\/div>\r\n        <\/button>\r\n        <button class=\"urg-btn\" id=\"urg-weeks\" onclick=\"setUrg('weeks')\">\r\n          <div class=\"urg-ic\">\ud83d\udcc5<\/div>\r\n          <div class=\"urg-lb\">Innerhalb weniger Wochen<\/div>\r\n          <div class=\"urg-sb\">Vorausplanung<\/div>\r\n        <\/button>\r\n        <button class=\"urg-btn\" id=\"urg-exploring\" onclick=\"setUrg('exploring')\">\r\n          <div class=\"urg-ic\">\ud83d\udd0d<\/div>\r\n          <div class=\"urg-lb\">Nur zur Information<\/div>\r\n          <div class=\"urg-sb\">Noch kein festes Datum<\/div>\r\n        <\/button>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Location -->\r\n    <div class=\"ff\">\r\n      <label>Standort <span style=\"font-weight:400;color:var(--t3);font-size:11px\">\u2014 in der E-Mail enthalten<\/span><\/label>\r\n      <div class=\"loc-row\">\r\n        <input class=\"fi\" type=\"text\" id=\"q-address\" placeholder=\"Adresse oder Beschreibung des Standorts\" oninput=\"onLocationInput()\">\r\n        <button class=\"loc-btn blu\" onclick=\"useGPS()\">\r\n          <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" style=\"width:13px;height:13px\"><circle cx=\"8\" cy=\"7\" r=\"3\"\/><path d=\"M8 1v2M8 12v2M1 7h2M12 7h2\"\/><\/svg>\r\n          Meinen Standort verwenden\r\n        <\/button>\r\n      <\/div>\r\n      <div id=\"coords\" style=\"display:none;font-size:11px;color:var(--ok);background:var(--okb);padding:4px 10px;border-radius:var(--rm);font-family:var(--fm);margin-top:4px\"><\/div>\r\n    <\/div>\r\n\r\n    <!-- Notes -->\r\n    <div class=\"ff\">\r\n      <label>Zus\u00e4tzliche Notizen oder Fragen<\/label>\r\n      <textarea class=\"fta\" id=\"q-notes\" placeholder=\"Bodenbeschaffenheit, Hindernisse, spezielle Anforderungen oder Fragen an NoFloods\u2026\" style=\"min-height:90px\" oninput=\"onNotesChange()\"><\/textarea>\r\n    <\/div>\r\n\r\n\r\n    <!-- Actions -->\r\n    <div class=\"qfooter\">\r\n      <button class=\"copy-quote-btn\" id=\"copy-quote-btn\" onclick=\"copyEasyWallQuote()\" title=\"Kopieren Sie den gesamten Angebotstext in die Zwischenablage \u2014 n\u00fctzlich, falls sich Ihre E-Mail-App nicht automatisch \u00f6ffnet\">\r\n        <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\"><rect x=\"5\" y=\"5\" width=\"10\" height=\"10\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><path d=\"M3 11H2a1 1 0 01-1-1V2a1 1 0 011-1h8a1 1 0 011 1v1\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><\/svg>\r\n        Text kopieren (Alternative)\r\n      <\/button>\r\n       <div class=\"footer-btn\">\r\n      <button class=\"sub-btn\" onclick=\"sendEasyWallEmail()\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\"><rect x=\"1\" y=\"3\" width=\"14\" height=\"10\" rx=\"1.5\" stroke=\"white\" stroke-width=\"1.3\"\/><path d=\"M1 4l7 5 7-5\" stroke=\"white\" stroke-width=\"1.3\" stroke-linecap=\"round\"\/><\/svg>\r\n        Angebot anfordern\r\n      <\/button>\r\n\t  <button onclick=\"resetEverything()\" style=\"padding:12px 14px;background:#fff;color:#A32D2D;border:1.5px solid #F09595;border-radius:var(--rm);font-size:12px;font-weight:700;font-family:var(--fn);cursor:pointer;white-space:nowrap\">\r\n    \u21ba Alles zur\u00fccksetzen\r\n<\/button>\r\n\t\t<\/div>\r\n    <\/div>\r\n   \r\n  <\/div>\r\n<\/div>\r\n\r\n<\/div>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.9.4\/leaflet.min.js\"><\/script>\r\n<script>\r\n\/\/ \u2500\u2500 MAP TOOL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nlet ewMap=null, mapMode='draw', mapSatOn=false;\r\nlet mapCurrentPoints=[], mapCurrentMarkers=[], mapCurrentPolyline=null, mapCurrentPreview=null;\r\nlet mapShapes=[];\r\nconst mapStreetLayer=()=>L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png',{attribution:'\u00a9 OpenStreetMap',maxZoom:20});\r\nconst mapSatLayer=()=>L.tileLayer('https:\/\/server.arcgisonline.com\/ArcGIS\/rest\/services\/World_Imagery\/MapServer\/tile\/{z}\/{y}\/{x}',{attribution:'\u00a9 Esri',maxZoom:20});\r\nlet _streetL=null,_satL=null;\r\nconst mapColors=['#D85A30','#185FA5','#3B6D11','#BA7517','#993556'];\r\nconst SNAP_ANGLES_EW=[45,90,135];\r\nconst SNAP_TOL=15;\r\n\r\nfunction mapSearchAddress(){\r\n  const q=(document.getElementById('map-search-input').value||'').trim();\r\n  if(!q)return;\r\n  const resultsEl=document.getElementById('map-search-results');\r\n  resultsEl.style.display='block';\r\n  resultsEl.innerHTML='<div style=\"padding:8px 12px;color:var(--t3)\">Suche\u2026<\/div>';\r\n  const url='https:\/\/nominatim.openstreetmap.org\/search?format=json&limit=5&accept-language=de&q='+encodeURIComponent(q);\r\n  fetch(url,{mode:'cors'})\r\n    .then(r=>{if(!r.ok)throw new Error('HTTP '+r.status);return r.json();})\r\n    .then(data=>{\r\n      if(!data||!data.length){resultsEl.innerHTML='<div style=\"padding:8px 12px;color:var(--t3)\">Keine Ergebnisse gefunden<\/div>';return;}\r\n      resultsEl.innerHTML=data.map(r=>{\r\n        const parts=(r.display_name||'').split(',');\r\n        \/\/ Build a meaningful short name: first 2-3 parts (street+number, city)\r\n        const name=parts.slice(0,3).map(p=>p.trim()).filter(Boolean).join(', ');\r\n        const sub=parts.slice(3,5).map(p=>p.trim()).filter(Boolean).join(', ');\r\n        const lat=parseFloat(r.lat),lng=parseFloat(r.lon);\r\n        return`<div onclick=\"mapGoToResult(${lat},${lng},'${name.replace(\/'\/g,\"\\\\'\")}')\"\r\n          style=\"padding:8px 12px;cursor:pointer;border-bottom:0.5px solid var(--bd);line-height:1.4\"\r\n          onmouseover=\"this.style.background='var(--bg2)'\" onmouseout=\"this.style.background=''\">\r\n          <div style=\"font-weight:600;color:var(--t1);font-size:12px\">${name}<\/div>\r\n          ${sub?`<div style=\"font-size:10px;color:var(--t3)\">${sub}<\/div>`:''}\r\n        <\/div>`;\r\n      }).join('');\r\n    })\r\n    .catch(err=>{\r\n      \/\/ Fallback: try loading via a script tag (JSONP-style workaround)\r\n      resultsEl.innerHTML='<div style=\"padding:8px 12px;color:var(--t3)\">Alternative Methode wird versucht\u2026<\/div>';\r\n      const s=document.createElement('script');\r\n      window._nominatimCB=function(data){\r\n        document.head.removeChild(s);\r\n        if(!data||!data.length){resultsEl.innerHTML='<div style=\"padding:8px 12px;color:var(--t3)\">Keine Ergebnisse gefunden<\/div>';return;}\r\n        resultsEl.innerHTML=data.map(r=>{\r\n          const parts=(r.display_name||'').split(',');\r\n          const name=parts.slice(0,3).map(p=>p.trim()).filter(Boolean).join(', ');\r\n          const sub=parts.slice(3,5).map(p=>p.trim()).filter(Boolean).join(', ');\r\n          const lat=parseFloat(r.lat),lng=parseFloat(r.lon);\r\n          return`<div onclick=\"mapGoToResult(${lat},${lng},'${name.replace(\/'\/g,\"\\\\'\")}')\"\r\n            style=\"padding:8px 12px;cursor:pointer;border-bottom:0.5px solid var(--bd);line-height:1.4\"\r\n            onmouseover=\"this.style.background='var(--bg2)'\" onmouseout=\"this.style.background=''\">\r\n            <div style=\"font-weight:600;color:var(--t1);font-size:12px\">${name}<\/div>\r\n            ${sub?`<div style=\"font-size:10px;color:var(--t3)\">${sub}<\/div>`:''}\r\n          <\/div>`;\r\n        }).join('');\r\n      };\r\n      s.onerror=()=>{resultsEl.innerHTML='<div style=\"padding:8px 12px;color:var(--t3);line-height:1.6\">Die Suche wird vom Browser blockiert.<br>Geben Sie stattdessen Ihre Adresse im Feld <strong>Standort<\/strong> im Angebotsbereich unten ein \u2014 sie wird in die E-Mail aufgenommen.<\/div>';};\r\n      s.src='https:\/\/nominatim.openstreetmap.org\/search?format=json&limit=5&accept-language=de&json_callback=_nominatimCB&q='+encodeURIComponent(q);\r\n      document.head.appendChild(s);\r\n    });\r\n}\r\n\r\nfunction mapGoToResult(lat,lng,name){\r\n  if(!ewMap)return;\r\n  ewMap.setView([parseFloat(lat),parseFloat(lng)],17);\r\n  document.getElementById('map-search-results').style.display='none';\r\n  document.getElementById('map-search-input').value=name;\r\n}\r\n\r\nfunction mapCloseSearch(){\r\n  const sr=document.getElementById('map-search-results');\r\n  if(sr)sr.style.display='none';\r\n}\r\n\r\nfunction initMap(){\r\n  if(ewMap)return;\r\n  ewMap=L.map('ew-map',{center:[55.676,12.568],zoom:15,zoomControl:true,doubleClickZoom:false});\r\n  _streetL=mapStreetLayer().addTo(ewMap);\r\n  ewMap.on('click',mapOnClick);\r\n  ewMap.on('mousemove',mapOnMove);\r\n  mapSetMode('draw');\r\n}\r\n\r\nfunction setInputMode(m){\r\n  document.getElementById('map-mode-map').classList.toggle('active',m==='map');\r\n  document.getElementById('map-mode-manual').classList.toggle('active',m==='manual');\r\n  const panel=document.getElementById('map-panel');\r\n  if(m==='map'){\r\n    panel.classList.add('open');\r\n    setTimeout(()=>{initMap();ewMap.invalidateSize();},50);\r\n  } else {\r\n    panel.classList.remove('open');\r\n  }\r\n}\r\n\r\nfunction mapSetMode(m){\r\n  mapMode=m;\r\n  document.getElementById('map-btn-draw').classList.toggle('active',m==='draw');\r\n  document.getElementById('map-btn-pan').classList.toggle('active',m==='pan');\r\n  document.getElementById('ew-map').style.cursor=m==='draw'?'crosshair':'grab';\r\n  if(m==='pan')ewMap.dragging.enable();\r\n  else ewMap.dragging.disable();\r\n  if(m==='pan'&&mapCurrentPreview){ewMap.removeLayer(mapCurrentPreview);mapCurrentPreview=null;}\r\n}\r\n\r\nfunction mapToggleSat(){\r\n  mapSatOn=!mapSatOn;\r\n  if(mapSatOn){ewMap.removeLayer(_streetL);_satL=mapSatLayer().addTo(ewMap);}\r\n  else{ewMap.removeLayer(_satL);_streetL=mapStreetLayer().addTo(ewMap);}\r\n  document.getElementById('map-btn-sat').classList.toggle('active',mapSatOn);\r\n}\r\n\r\nfunction mapGoToLocation(){\r\n  if(!navigator.geolocation){return;}\r\n  navigator.geolocation.getCurrentPosition(p=>{\r\n    ewMap.setView([p.coords.latitude,p.coords.longitude],18);\r\n  });\r\n}\r\n\r\nfunction mapSnapAngle(raw){\r\n  for(const t of SNAP_ANGLES_EW){if(Math.abs(raw-t)<=SNAP_TOL)return{angle:t,snapped:true,raw};}\r\n  return{angle:raw,snapped:false,raw};\r\n}\r\n\r\nfunction mapHaversine(a,b){\r\n  const R=6371000,\u03c61=a.lat*Math.PI\/180,\u03c62=b.lat*Math.PI\/180;\r\n  const \u0394\u03c6=(b.lat-a.lat)*Math.PI\/180,\u0394\u03bb=(b.lng-a.lng)*Math.PI\/180;\r\n  const x=Math.sin(\u0394\u03c6\/2)**2+Math.cos(\u03c61)*Math.cos(\u03c62)*Math.sin(\u0394\u03bb\/2)**2;\r\n  return R*2*Math.atan2(Math.sqrt(x),Math.sqrt(1-x));\r\n}\r\n\r\nfunction mapAngleBetween(p1,v,p2){\r\n  const a={x:p1.lat-v.lat,y:p1.lng-v.lng},b={x:p2.lat-v.lat,y:p2.lng-v.lng};\r\n  const dot=a.x*b.x+a.y*b.y,mA=Math.sqrt(a.x**2+a.y**2),mB=Math.sqrt(b.x**2+b.y**2);\r\n  if(!mA||!mB)return 180;\r\n  return Math.round(180-Math.acos(Math.max(-1,Math.min(1,dot\/(mA*mB))))*180\/Math.PI);\r\n}\r\n\r\nfunction mapGetCorners(pts,closed){\r\n  const corners=[],n=pts.length;\r\n  if(closed){\r\n    for(let i=0;i<n;i++){\r\n      const raw=mapAngleBetween(pts[(i-1+n)%n],pts[i],pts[(i+1)%n]);\r\n      corners.push({index:i,...mapSnapAngle(raw)});\r\n    }\r\n  } else {\r\n    for(let i=1;i<n-1;i++){\r\n      const raw=mapAngleBetween(pts[i-1],pts[i],pts[i+1]);\r\n      corners.push({index:i,...mapSnapAngle(raw)});\r\n    }\r\n  }\r\n  return corners;\r\n}\r\n\r\nfunction mapOnClick(e){\r\n  if(mapMode!=='draw')return;\r\n  if(mapCurrentPoints.length>=3){\r\n    const fp=mapCurrentPoints[0];\r\n    const cp=ewMap.latLngToContainerPoint(e.latlng);\r\n    const fp2=ewMap.latLngToContainerPoint(fp);\r\n    if(Math.sqrt((cp.x-fp2.x)**2+(cp.y-fp2.y)**2)<20){\r\n      document.getElementById('map-close-popup').style.display='block';\r\n      return;\r\n    }\r\n  }\r\n  mapAddPoint(e.latlng);\r\n}\r\n\r\nfunction mapOnMove(e){\r\n  if(mapMode!=='draw'||!mapCurrentPoints.length)return;\r\n  if(mapCurrentPreview)ewMap.removeLayer(mapCurrentPreview);\r\n  mapCurrentPreview=L.polyline([...mapCurrentPoints,e.latlng],{color:'#D85A30',weight:2,dashArray:'5 5',opacity:.5}).addTo(ewMap);\r\n}\r\n\r\nfunction mapUpdateDrawingBtns(){\r\n  const btns=document.getElementById('map-drawing-btns');\r\n  const count=document.getElementById('map-points-count');\r\n  if(mapCurrentPoints.length>=2){\r\n    btns.style.display='flex';\r\n    count.textContent=mapCurrentPoints.length+' Punkt'+(mapCurrentPoints.length!==1?'e':'')+' platziert';\r\n  } else {\r\n    btns.style.display='none';\r\n  }\r\n}\r\n\r\nfunction mapAddPoint(ll){\r\n  mapCurrentPoints.push(ll);\r\n  const m=L.circleMarker(ll,{radius:mapCurrentPoints.length===1?8:6,color:'#fff',weight:2,fillColor:'#D85A30',fillOpacity:1}).addTo(ewMap);\r\n  if(mapCurrentPoints.length===1)m.bindTooltip('Startpunkt \u2014 hier erneut klicken zum Schlie\u00dfen',{permanent:false,direction:'top'});\r\n  mapCurrentMarkers.push(m);\r\n  if(mapCurrentPolyline)ewMap.removeLayer(mapCurrentPolyline);\r\n  if(mapCurrentPoints.length>1)mapCurrentPolyline=L.polyline(mapCurrentPoints,{color:'#D85A30',weight:3}).addTo(ewMap);\r\n  mapUpdateDrawingBtns();\r\n  mapUpdateImportBar();\r\n}\r\n\r\nfunction mapPopupClose(closed){\r\n  document.getElementById('map-close-popup').style.display='none';\r\n  mapFinishShape(closed);\r\n}\r\nfunction mapPopupCancel(){document.getElementById('map-close-popup').style.display='none';}\r\n\r\nfunction mapFinishShape(closed){\r\n  if(mapCurrentPoints.length<2)return;\r\n  const color=mapColors[mapShapes.length%mapColors.length];\r\n  const layers=[];\r\n  if(mapCurrentPolyline){ewMap.removeLayer(mapCurrentPolyline);mapCurrentPolyline=null;}\r\n  if(mapCurrentPreview){ewMap.removeLayer(mapCurrentPreview);mapCurrentPreview=null;}\r\n  const coords=closed?[...mapCurrentPoints,mapCurrentPoints[0]]:mapCurrentPoints;\r\n  layers.push(L.polyline(coords,{color,weight:3,opacity:.9}).addTo(ewMap));\r\n  mapCurrentMarkers.forEach(m=>{m.setStyle({fillColor:color});layers.push(m);});\r\n  \/\/ Segment length labels\r\n  const allPts=closed?[...mapCurrentPoints,mapCurrentPoints[0]]:mapCurrentPoints;\r\n  for(let i=0;i<allPts.length-1;i++){\r\n    const mid={lat:(allPts[i].lat+allPts[i+1].lat)\/2,lng:(allPts[i].lng+allPts[i+1].lng)\/2};\r\n    const d=mapHaversine(allPts[i],allPts[i+1]);\r\n    const lbl=L.divIcon({html:`<div style=\"background:rgba(255,255,255,.9);border:0.5px solid #ddd;border-radius:3px;padding:1px 5px;font-size:10px;color:#1a1a18;white-space:nowrap\">${Math.round(d*10)\/10}m<\/div>`,className:'',iconAnchor:[20,8]});\r\n    layers.push(L.marker(mid,{icon:lbl}).addTo(ewMap));\r\n  }\r\n  \/\/ Corner angle labels\r\n  const corners=mapGetCorners(mapCurrentPoints,closed);\r\n  corners.forEach(c=>{\r\n    const pt=mapCurrentPoints[c.index];\r\n    const lbl=L.divIcon({html:`<div style=\"background:${c.snapped?'#EAF3DE':'#FAEEDA'};border:1px solid ${c.snapped?'#C0DD97':'#FAC775'};border-radius:4px;padding:2px 6px;font-size:10px;font-weight:700;color:${c.snapped?'#27500A':'#633806'};white-space:nowrap\">${c.angle}\u00b0${c.snapped?'\u2713':''}<\/div>`,className:'',iconAnchor:[-4,8]});\r\n    layers.push(L.marker(pt,{icon:lbl}).addTo(ewMap));\r\n  });\r\n  mapShapes.push({points:[...mapCurrentPoints],closed,layers,corners});\r\n  mapCurrentPoints=[];mapCurrentMarkers=[];\r\n  document.getElementById('map-close-popup').style.display='none';\r\n  document.getElementById('map-drawing-btns').style.display='none';\r\n  mapUpdateImportBar();\r\n}\r\n\r\nfunction mapUndo(){\r\n  if(!mapCurrentPoints.length)return;\r\n  ewMap.removeLayer(mapCurrentMarkers.pop());\r\n  mapCurrentPoints.pop();\r\n  if(mapCurrentPolyline){ewMap.removeLayer(mapCurrentPolyline);mapCurrentPolyline=null;}\r\n  if(mapCurrentPoints.length>1)mapCurrentPolyline=L.polyline(mapCurrentPoints,{color:'#D85A30',weight:3}).addTo(ewMap);\r\n  if(mapCurrentPreview){ewMap.removeLayer(mapCurrentPreview);mapCurrentPreview=null;}\r\n  mapUpdateDrawingBtns();\r\n  mapUpdateImportBar();\r\n}\r\n\r\nfunction mapClearAll(){\r\n  mapCurrentPoints=[];\r\n  mapCurrentMarkers.forEach(m=>ewMap.removeLayer(m));\r\n  mapCurrentMarkers=[];\r\n  if(mapCurrentPolyline){ewMap.removeLayer(mapCurrentPolyline);mapCurrentPolyline=null;}\r\n  if(mapCurrentPreview){ewMap.removeLayer(mapCurrentPreview);mapCurrentPreview=null;}\r\n  mapShapes.forEach(s=>s.layers.forEach(l=>ewMap.removeLayer(l)));\r\n  mapShapes=[];\r\n  document.getElementById('map-close-popup').style.display='none';\r\n  document.getElementById('map-drawing-btns').style.display='none';\r\n  document.getElementById('map-import-bar').classList.add('hidden');\r\n  resetCalculatorInputs();\r\n}\r\n\r\nfunction mapUpdateImportBar(){\r\n  const bar=document.getElementById('map-import-bar');\r\n  const txt=document.getElementById('map-import-text');\r\n  const sub=document.getElementById('map-import-sub');\r\n  if(!mapShapes.length&&!mapCurrentPoints.length){bar.classList.add('hidden');return;}\r\n  if(!mapShapes.length){bar.classList.add('hidden');return;}\r\n  let totalLen=0,totalSec=0,totalCor=0,totalEnd=0,segsAll=[];\r\n  mapShapes.forEach(s=>{\r\n    const allPts=s.closed?[...s.points,s.points[0]]:s.points;\r\n    for(let i=0;i<allPts.length-1;i++){const d=mapHaversine(allPts[i],allPts[i+1]);totalLen+=d;totalSec++;segsAll.push(Math.round(d*10)\/10);}\r\n    totalCor+=s.corners.length;\r\n    if(!s.closed)totalEnd+=2;\r\n  });\r\n  bar.classList.remove('hidden');\r\n  txt.innerHTML=\r\n    '<span style=\"font-weight:700;color:var(--ok)\">'+totalSec+' Abschnitt'+(totalSec!==1?'e':'')+' \u00b7 '+totalCor+' Ecke'+(totalCor!==1?'n':'')+' \u00b7 '+totalEnd+(totalEnd===1?' offenes Ende':' offene Enden')+'<\/span>'+\r\n    '<span style=\"display:block;font-size:11px;color:#3B6D11;margin-top:3px\">'+segsAll.map(s=>s+'m').join(' + ')+' = '+Math.round(totalLen*10)\/10+'m insgesamt<\/span>';\r\n}\r\n\r\nfunction mapUseMeasurements(){\r\n  if(!mapShapes.length)return;\r\n  const newSections=[];\r\n  let totalCorners=0;\r\n  let newEnds=0;\r\n  mapShapes.forEach(s=>{\r\n    const allPts=s.closed?[...s.points,s.points[0]]:s.points;\r\n    for(let i=0;i<allPts.length-1;i++){\r\n      newSections.push(Math.round(mapHaversine(allPts[i],allPts[i+1])*10)\/10);\r\n    }\r\n    totalCorners+=s.corners.length;\r\n    if(!s.closed)newEnds+=2;\r\n  });\r\n  \/\/ Import sections\r\n  sections=newSections.map((len)=>({id:secNextId++,len}));\r\n  activeSec=0;\r\n  renderSections();\r\n  \/\/ Import corners \u2014 set to inward 90\u00b0 count (most common)\r\n  \/\/ User can adjust in the corners section if needed\r\n  document.getElementById('f-cin').value=totalCorners;\r\n  document.getElementById('f-cout').value=0;\r\n  \/\/ Switch to 90\u00b0 corner mode so the input is visible\r\n  setCornerMode('count');\r\n  \/\/ End modules: leave at 0 \u2014 user can add them manually if needed\r\n  \/\/ Show imported badge, collapse map\r\n  document.getElementById('map-imported-note').style.display='flex';\r\n  document.getElementById('map-panel').classList.remove('open');\r\n  document.getElementById('map-mode-map').classList.remove('active');\r\n  document.getElementById('map-mode-manual').classList.add('active');\r\n  calc();\r\n  \/\/ Scroll to results so user can see the Save buttons\r\n  setTimeout(()=>{\r\n    const res=document.querySelector('.res');\r\n    if(res)res.scrollIntoView({behavior:'smooth',block:'start'});\r\n  },200);\r\n}\r\n\r\nfunction resetCalculatorInputs(){\r\n  sections=[{id:secNextId++,len:0}];activeSec=0;renderSections();\r\n  document.getElementById('f-cin').value=0;\r\n  document.getElementById('f-cout').value=0;\r\n  document.getElementById('f-el').value=0;\r\n  document.getElementById('f-er').value=0;\r\n  document.getElementById('f-wl').value=0;\r\n  document.getElementById('f-wr').value=0;\r\n  document.getElementById('map-imported-note').style.display='none';\r\n  calc();\r\n}\r\n\r\nfunction clearMapImport(){\r\n  \/\/ Reset all calculator inputs\r\n  resetCalculatorInputs();\r\n  \/\/ Clear the map drawing too\r\n  mapClearAll();\r\n  \/\/ Reopen map\r\n  setInputMode('map');\r\n}\r\n<\/script>\r\n<script>\r\n\/\/ \u2500\u2500 TRANSLATIONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nconst LANG={\r\n  de:{title:'EasyWall Rechner',subtitle:'Berechnen Sie die Module f\u00fcr Ihren Hochwasserschutz','s1title':'W\u00e4hlen Sie Ihre Serie','s1sub':'Jede Serie ist f\u00fcr unterschiedliche Standortbedingungen optimiert','pill-t':'Premium \u00b7 T-Serie','pill-s':'Flexibel \u00b7 S-Serie','pill-d':'Unebener Boden \u00b7 D-Serie','ser-t-desc':'HydroFoam\u2122-Basis & HydroSeal\u2122-Kante. Beste wasserdichte Leistung. Verstellbare Einheiten verf\u00fcgbar.','ser-s-desc':'Schiebeverbindung erlaubt 3\u20135\u00b0 Anpassung. Ideal f\u00fcr st\u00e4dtische & unregelm\u00e4\u00dfige Layouts.','ser-d-desc':'Abnehmbare Membran f\u00fcr Kies, Erde & gemischtes Gel\u00e4nde. Nicht verf\u00fcgbar in USA, UK, IE, CA & QA.','s2title':'H\u00f6he ausw\u00e4hlen','s2sub':'Schutzh\u00f6he in cm','s3title':'Barrierenl\u00e4nge & Zubeh\u00f6r','s3sub':'Geben Sie unten Ihre geraden Streckenl\u00e4ngen und Zubeh\u00f6r ein','guide-toggle':'So messen Sie Ihren Standort','g1h':'Messen Sie nur gerade Abschnitte.','g1b':'Gehen Sie jeden geraden Abschnitt ab und messen Sie ihn einzeln. Schlie\u00dfen Sie keine Ecken oder Kurven in die L\u00e4nge ein. Sie k\u00f6nnen unten mehrere separate Abschnitte hinzuf\u00fcgen.','g2h':'Identifizieren Sie Ihre Kurven.','g2b':'Sanfte Kurven (wenige Grad pro Verbindung) ben\u00f6tigen keine Eckmodule \u2014 verbinden Sie die Module einfach in einem leichten Bogen. Die S-Serie bew\u00e4ltigt standardm\u00e4\u00dfig bis zu 3\u20135\u00b0 pro Verbindung. Verwenden Sie f\u00fcr deutliche Biegungen Eckmodule.','g3h':'Pr\u00fcfen Sie auf W\u00e4nde und offene Enden.','g3b':'Wenn die Barriere an eine Wand st\u00f6\u00dft, ben\u00f6tigen Sie einen Wandanschluss. Jedes offene Ende ben\u00f6tigt ein Endmodul (links oder rechts).','g4h':'Ber\u00fccksichtigen Sie Ihre Bodenbeschaffenheit.','g4b':'Alle EasyWall-Serien k\u00f6nnen mit unebenem Boden umgehen \u2014 eine abnehmbare Membran kann jedem Modell hinzugef\u00fcgt werden. Bei der D-Serie ist diese standardm\u00e4\u00dfig integriert.','g5h':'Planen Sie eine kleine Toleranz in der installierten L\u00e4nge ein.','g5b':'Der Rechner verwendet die NoFloods-Rate (Module pro Meter) f\u00fcr jedes Modell, um Ihnen die richtige Anzahl an Modulen zu nennen. Je nach Bodenbedingungen und Installationswinkel sollten Sie mit einer Abweichung von \u00b12\u20133% in der endg\u00fcltigen installierten L\u00e4nge rechnen.','sections-title':'Gerade Abschnitte','add-section':'Weiteren Abschnitt hinzuf\u00fcgen','acc-title':'Ecken & Zubeh\u00f6r','corners-lbl':'Biegungen & Ecken','corner-mode-90':'Ich habe eine 90\u00b0-Ecke','corner-mode-angle':'Ich habe einen anderen Winkel','inward-corners':'Innenecken','outward-corners':'Au\u00dfenecken','corners-unit':'Ecken','corner-fixed-note':'Die T100 Au\u00dfenecke verwendet 22,5\u00b0-Module (20-3221) \u2014 4 Module pro 90\u00b0-Kurve. Ein festes 90\u00b0-Doppelmodul (20-3230) ist ebenfalls verf\u00fcgbar.','no-corner-note':'Keine Eckmodule f\u00fcr S110 verf\u00fcgbar. Nutzen Sie die nat\u00fcrliche Flexibilit\u00e4t f\u00fcr sanfte Kurven.','my-angle':'Mein Drehwinkel','turn-dir':'Drehrichtung','inward':'Nach innen','outward':'Nach au\u00dfen','end-modules-lbl':'Endmodule','standard':'Standard','adjustable':'Verstellbar','left':'Links','right':'Rechts','pcs':'Stk.','settable-width':'Einstellbare Breite:','set-on-site':'vor Ort einzustellen','wall-conn-lbl':'Wandanschl\u00fcsse','save-config':'Konfiguration speichern','load-config':'Gespeicherte Konfigurationen','print-summary':'Zusammenfassung drucken \/ PDF','results-title':'Ergebnisse','standard-fit':'Standard-Passform','exact-fit':'Exakte Passform','available':'verf\u00fcgbar','weight-tab':'Gewicht & Lagerung','length-comparison':'L\u00e4ngenvergleich','required':'Erforderlich:','actual':'Tats\u00e4chlich:','over-by':'\u00dcberschuss:','breakdown':'Aufschl\u00fcsselung & Produktcodes','weight-note':'Alle Gewichte sind pro Modultyp verifiziert. Palettensch\u00e4tzungen sind Richtwerte \u2014 f\u00fcr genaue Logistik bitte bei NoFloods anfragen.','saved-title':'Gespeicherte Konfigurationen','your-config':'Ihre Konfiguration'}\r\n};\r\nlet lang='de';\r\nfunction setLang(l){\r\n  lang=l;\r\n  document.querySelectorAll('[data-t]').forEach(el=>{\r\n    const k=el.getAttribute('data-t');\r\n    if(LANG[l][k]===undefined)return;\r\n    \/\/ Don't overwrite tab-weight \u2014 it contains a child badge span we need to keep\r\n    if(el.id==='tab-weight'||el.closest&&el.closest('#tab-weight'))return;\r\n    el.textContent=LANG[l][k];\r\n  });\r\n  \/\/ Translate tab-weight label text only, preserving the badge span\r\n  const tw=document.getElementById('tab-weight');\r\n  if(tw){\r\n    const badge=document.getElementById('badge-weight');\r\n    const badgeHTML=badge?badge.outerHTML:'';\r\n    tw.innerHTML=(LANG[l]['weight-tab']||'Gewicht & Lagerung')+' '+badgeHTML;\r\n  }\r\n}\r\nfunction t(k){return LANG[lang][k]||k;}\r\n\r\n\/\/ \u2500\u2500 CATALOGUE DATA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\/\/ per10 = modules per 10m from NoFloods catalogue matrix (exact source of truth)\r\n\/\/ wS = module width (m) from catalogue specs\r\n\/\/ wKg = module weight (kg) from catalogue specs\r\n\/\/ ppallet = approx modules per pallet for logistics estimates\r\n\/\/ OL = 0.07m physical overlap (documented), used only for adjustable unit calculations\r\nconst OL=0.07;\r\nconst MODELS={\r\n  T:{label:'T-Serie',variants:[\r\n    {name:'T50',h:50,prot:50,per10:16,wS:0.705,wKg:4.2,ppallet:20,endW:0.28,adjEndW:{min:0.44,max:0.52},wallW:0.15,cornerIn:true,cornerOut:true,cornerFixed:false,adj:{min:0.57,max:0.705,code:'20-3020'},adjEnd:{min:0.44,max:0.52,cL:'20-3070',cR:'20-3080'},wall:true,ends:true,cpx:3,cpxIn:3,cpxOut:3,w:{st:4.2,ci:3.2,co:2.8,el:4.9,er:4.9,ael:6.5,aer:6.5,adj:6.8,wl:1.5,wr:1.5},c:{st:'20-3010',ci:'20-3030',co:'20-3040',el:'20-3050',er:'20-3060',wl:'20-3090',wr:'20-3100'}},\r\n    {name:'T80',h:80,prot:80,per10:16,wS:0.705,wKg:8.0,ppallet:10,endW:0.41,adjEndW:null,wallW:0.15,cornerIn:true,cornerOut:true,cornerFixed:false,adj:{min:0.57,max:0.705,code:'20-3130'},adjEnd:null,wall:true,ends:true,cpx:4,cpxIn:4,cpxOut:4,w:{st:8.0,ci:8.0,co:7.0,el:10.5,er:10.5,ael:0,aer:0,adj:11.5,wl:5.0,wr:5.0},c:{st:'20-3120',ci:'20-3140',co:'20-3150',el:'20-3160',er:'20-3170',wl:'20-3180',wr:'20-3190'}},\r\n    {name:'T100',h:100,prot:100,per10:14,wS:0.83,wKg:12.5,ppallet:8,endW:0.44,adjEndW:null,wallW:null,cornerIn:true,cornerOut:true,cornerOutFixed90:false,cornerFixed:false,adj:null,adjEnd:null,wall:false,ends:true,cpx:2,cpxIn:2,cpxOut:4,w:{st:12.5,ci:13.6,co:10.5,el:15,er:15,ael:0,aer:0,adj:0,wl:0,wr:0},c:{st:'20-3210',ci:'20-3220',co:'20-3221',co90:'20-3230',el:'20-3215',er:'20-3216',wl:'',wr:''}},\r\n    {name:'T120',h:120,prot:120,per10:14,wS:0.83,wKg:16.0,ppallet:6,endW:null,adjEndW:null,wallW:null,cornerIn:true,cornerOut:true,cornerOutFixed90:true,cornerFixed:false,adj:null,adjEnd:null,wall:false,ends:false,cpx:2,cpxIn:2,cpxOut:1,w:{st:16.0,ci:14.0,co:28.0,el:0,er:0,ael:0,aer:0,adj:0,wl:0,wr:0},c:{st:'20-3240',ci:'20-3241',co:'20-3243',el:'',er:'',wl:'',wr:''}},\r\n  ]},\r\n  S:{label:'S-Serie',variants:[\r\n    {name:'S50', h:50, prot:50, per10:16,wS:0.705,wKg:4.1, ppallet:20,endW:0.39,adjEndW:null,wallW:null,cornerIn:true, cornerOut:true, cornerFixed:false,adj:null,adjEnd:null,wall:false,ends:true, cpx:3,w:{st:4.1,ci:2.8,co:2.7,el:3.5,er:3.5,ael:0,aer:0,adj:0,wl:0,wr:0},c:{st:'20-3250',ci:'20-3260',co:'20-3270',el:'20-3280',er:'20-3290',wl:'',wr:''}},\r\n    {name:'S60', h:60, prot:60, per10:11,wS:0.95, wKg:7.2, ppallet:15,endW:0.30,adjEndW:null,wallW:null,cornerIn:true, cornerOut:true, cornerFixed:false,adj:null,adjEnd:null,wall:false,ends:true, cpx:3,w:{st:7.2,ci:3.0,co:3.1,el:3.6,er:3.6,ael:0,aer:0,adj:0,wl:0,wr:0},c:{st:'20-3310',ci:'20-3320',co:'20-3330',el:'20-3340',er:'20-3350',wl:'',wr:''}},\r\n    {name:'S75', h:75, prot:75, per10:11,wS:1.00, wKg:9.6, ppallet:12,endW:0.30,adjEndW:null,wallW:null,cornerIn:true, cornerOut:true, cornerFixed:false,adj:null,adjEnd:null,wall:false,ends:true, cpx:3,w:{st:9.6,ci:3.8,co:3.8,el:3.5,er:3.5,ael:0,aer:0,adj:0,wl:0,wr:0},c:{st:'20-3370',ci:'20-3380',co:'20-3390',el:'20-3400',er:'20-4310',wl:'',wr:''}},\r\n    {name:'S110',h:110,prot:110,per10:16,wS:0.70, wKg:13.0,ppallet:8, endW:null,adjEndW:null,wallW:null,cornerIn:false,cornerOut:false,cornerFixed:false,adj:null,adjEnd:null,wall:false,ends:false,cpx:3,w:{st:13.0,ci:0,co:0,el:0,er:0,ael:0,aer:0,adj:0,wl:0,wr:0},c:{st:'20-3440',ci:'',co:'',el:'',er:'',wl:'',wr:''}},\r\n  ]},\r\n  D:{label:'D-Serie',variants:[\r\n    {name:'D55', h:55, prot:55, per10:12,wS:0.90, wKg:5.5, ppallet:15,endW:null,adjEndW:null,wallW:null,cornerIn:true,cornerOut:true,cornerFixed:false,adj:null,adjEnd:null,wall:false,ends:false,cpx:3,w:{st:5.5,ci:7.4,co:7.4,el:0,er:0,ael:0,aer:0,adj:0,wl:0,wr:0},c:{st:'20-3450',ci:'20-3460',co:'20-3470',el:'',er:'',wl:'',wr:''}},\r\n    {name:'D100',h:100,prot:100,per10:11,wS:1.05, wKg:14.5,ppallet:8, endW:null,adjEndW:null,wallW:null,cornerIn:true,cornerOut:true,cornerFixed:false,adj:null,adjEnd:null,wall:false,ends:false,cpx:3,w:{st:14.5,ci:18.0,co:18.0,el:0,er:0,ael:0,aer:0,adj:0,wl:0,wr:0},c:{st:'20-3490',ci:'20-3500',co:'20-3510',el:'',er:'',wl:'',wr:''}},\r\n  ]}\r\n};\r\n\r\n\/\/ \u2500\u2500 HELPERS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction r4(x){return Math.round(x*10000)\/10000;}\r\nfunction perM(v){return 1\/(v.wS-OL);}\r\n\/\/ Physical coverage: first module = full wS, each subsequent = wS-OL net\r\nfunction stdCov(n,v){\r\n  if(n===0)return 0;\r\n  return r4(v.wS+(n-1)*(v.wS-OL));\r\n}\r\n\/\/ Physical sequence length for adjustable solver (uses documented 7cm overlap)\r\nfunction seqP(nS,wS,nA,wA){const t=nS+nA;if(!t)return 0;return r4(nS*wS+nA*wA-(t-1)*OL);}\r\nfunction gn(id){return Math.max(0,parseInt(document.getElementById(id).value)||0);}\r\nfunction gf(id){return Math.max(0,parseFloat(document.getElementById(id).value)||0);}\r\n\r\n\/\/ \u2500\u2500 STATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nlet sel='T',selV=0,activeTab='std',cornerMode='count',angleDir='out',coutType='modules';\r\nfunction setCoutType(t){\r\n  coutType=t;\r\n  const mBtn=document.getElementById('cout-type-modules');\r\n  const fBtn=document.getElementById('cout-type-fixed');\r\n  if(mBtn) mBtn.style.cssText='flex:1;padding:8px;font-size:11px;font-weight:600;font-family:var(--fn);border-radius:6px;cursor:pointer;text-align:left;border:'+(t==='modules'?'1.5px solid #FAC775;background:#fff8ee;color:#633806':'0.5px solid var(--bd);background:var(--bg2);color:var(--t2)');\r\n  if(fBtn) fBtn.style.cssText='flex:1;padding:8px;font-size:11px;font-weight:600;font-family:var(--fn);border-radius:6px;cursor:pointer;text-align:left;border:'+(t==='fixed'?'1.5px solid #FAC775;background:#fff8ee;color:#633806':'0.5px solid var(--bd);background:var(--bg2);color:var(--t2)');\r\n  calc();\r\n}\r\nlet sections=[{id:1,len:0}],activeSec=0,secNextId=2;\r\n\r\n\/\/ \u2500\u2500 GUIDE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction toggleGuide(){const b=document.getElementById('guide-body'),a=document.getElementById('guide-arr');b.classList.toggle('open');a.classList.toggle('open',b.classList.contains('open'));}\r\n\r\n\/\/ \u2500\u2500 SERIES \/ HEIGHT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction setSeries(s){sel=s;selV=0;['T','S','D'].forEach(x=>document.getElementById('sb-'+x).classList.toggle('active',x===s));renderH();updateAvail();calc();}\r\nfunction renderH(){\r\n  const vs=MODELS[sel].variants,g=document.getElementById('ht-grid');\r\n  g.style.gridTemplateColumns='repeat('+vs.length+',1fr)';g.innerHTML='';\r\n  vs.forEach((v,i)=>{\r\n    const b=document.createElement('button');b.className='ht-btn'+(i===selV?' active':'');\r\n    b.innerHTML='<div class=\"ht-h\">'+v.h+' cm<\/div><div class=\"ht-p\">Schutzh\u00f6he: '+v.prot+' cm<\/div><div class=\"ht-c\">'+v.name+'<\/div>';\r\n    b.onclick=()=>{selV=i;renderH();updateAvail();calc();};g.appendChild(b);\r\n  });\r\n}\r\n\r\n\/\/ \u2500\u2500 SECTIONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction updateSecSummary(){\r\n  const bar=document.getElementById('sec-summary');\r\n  if(sections.length<=1){bar.style.display='none';return;}\r\n  const total=Math.round(sections.reduce((s,sec)=>s+sec.len,0)*10)\/10;\r\n  const parts=sections.map((sec,i)=>'<span style=\"font-weight:600;color:var(--ok)\">'+sec.len+'m<\/span>');\r\n  bar.style.display='block';\r\n  bar.innerHTML=parts.join(' <span style=\"color:var(--t3);margin:0 2px\">+<\/span> ')+\r\n    ' <span style=\"color:var(--t3);margin:0 4px\">=<\/span> '+\r\n    '<span style=\"font-size:14px;font-weight:700;color:var(--ok)\">'+total+' m insgesamt<\/span>'+\r\n    '<span style=\"color:var(--ok);opacity:.7;font-size:11px;margin-left:8px\">(nur gerade Abschnitte)<\/span>';\r\n}\r\n\r\nfunction renderSections(){\r\n  const tr=document.getElementById('sec-tabs-row'),panels=document.getElementById('sec-panels');\r\n  tr.innerHTML='';panels.innerHTML='';\r\n  sections.forEach((sec,i)=>{\r\n    const tab=document.createElement('button');tab.className='sec-tab'+(i===activeSec?' active':'');\r\n    const label=sections.length>1?'Abschnitt '+(i+1)+' \u00b7 '+sec.len+'m':'L\u00e4nge';\r\n    tab.textContent=label;\r\n    if(sections.length>1){const x=document.createElement('span');x.textContent=' \u00d7';x.style.cssText='margin-left:3px;color:var(--br);font-weight:700;cursor:pointer';x.onclick=(e)=>{e.stopPropagation();removeSection(i);};tab.appendChild(x);}\r\n    tab.onclick=()=>{activeSec=i;renderSections();};tr.appendChild(tab);\r\n    const p=document.createElement('div');p.className='sec-panel'+(i===activeSec?' active':'');\r\n    p.innerHTML='<div class=\"frow\"><span class=\"flbl\">L\u00e4nge Abschnitt '+(i+1)+' (m)<\/span><input class=\"ni\" type=\"number\" id=\"sl-'+sec.id+'\" min=\"0.5\" step=\"0.1\" value=\"'+sec.len+'\" oninput=\"secUpd('+i+')\" style=\"width:90px\"><span class=\"fhint\">nur gerade Strecke \u2014 ohne Ecken<\/span><\/div>';\r\n    panels.appendChild(p);\r\n  });\r\n  updateSecSummary();\r\n  const ab=document.getElementById('add-sec-btn');if(ab)ab.style.display='';\r\n}\r\nfunction addSection(){sections.push({id:secNextId++,len:0});activeSec=sections.length-1;renderSections();calc();}\r\nfunction removeSection(i){sections.splice(i,1);activeSec=Math.min(activeSec,sections.length-1);renderSections();calc();}\r\nfunction secUpd(i){\r\n  const val=Math.max(0,parseFloat(document.getElementById('sl-'+sections[i].id).value)||0);\r\n  sections[i].len=val;\r\n  \/\/ Update this tab's label live\r\n  if(sections.length>1){\r\n    const tabs=document.querySelectorAll('.sec-tab');\r\n    if(tabs[i]){\r\n      const xBtn=tabs[i].querySelector('span');\r\n      tabs[i].firstChild.textContent='Abschnitt '+(i+1)+' \u00b7 '+val+'m';\r\n    }\r\n  }\r\n  updateSecSummary();\r\n  calc();\r\n}\r\n\r\n\/\/ \u2500\u2500 AVAILABILITY \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction updateAvail(){\r\n  const v=MODELS[sel].variants[selV];\r\n  document.getElementById('grp-wall').className=v.wall?'dg':'dg muted';\r\n  if(!v.wall){document.getElementById('f-wl').value=0;document.getElementById('f-wr').value=0;}\r\n  document.getElementById('grp-ends').className=v.ends?'dg':'dg muted';\r\n  if(!v.ends){['f-el','f-er','f-ael','f-aer'].forEach(id=>document.getElementById(id).value=0);}\r\n  const hae=v.adjEnd!=null,adjBtn=document.getElementById('end-type-adj');\r\n  if(adjBtn)adjBtn.style.display=hae?'':'none';\r\n  if(!hae)setEndTypeAll('std',true);\r\n  updateEndLabels();\r\n  updateCurveNote();\r\n  const hasC=v.cornerIn||v.cornerOut;\r\n  document.getElementById('grp-corners').className=hasC?'dg':'dg muted';\r\n  const rc=document.getElementById('row-cout');\r\n  if(rc){rc.className='dfr'+(v.cornerOut?'':' muted');if(!v.cornerOut)document.getElementById('f-cout').value=0;}\r\n  document.getElementById('corner-fixed-note').style.display='none';\r\n  const showT100Toggle=v.name==='T100'&&v.cornerOut;\r\n  const showT120Note=v.name==='T120'&&v.cornerOut;\r\n  document.getElementById('t100-out-type').style.display=showT100Toggle?'block':'none';\r\n  document.getElementById('t120-out-note').style.display=showT120Note?'block':'none';\r\n  if(showT120Note){coutType='fixed';}\r\n  else if(!showT100Toggle){coutType='modules';}\r\n  document.getElementById('no-corner-note').style.display=(!hasC)?'block':'none';\r\n  \/\/ Mute the \"Other angle\" and \"Sharp 90\u00b0\" options for models without corner modules\r\n  const sitAngle=document.getElementById('sit-angle');\r\n  const sit90=document.getElementById('sit-90');\r\n  if(sitAngle)sitAngle.classList.toggle('muted',!hasC);\r\n  if(sit90)sit90.classList.toggle('muted',!hasC);\r\n  if(!hasC&&cornerMode==='angle')setSituation('curve');\r\n  const ha=v.adj!=null;\r\n  document.getElementById('tab-exact').className='fit-tab'+(ha?'':' disabled');\r\n  const badge=document.getElementById('badge-exact');\r\n  badge.style.display=ha?'inline':'none';\r\n  \/\/ Reset badge to default 'available' style \u2014 buildExact will update it after calc\r\n  badge.textContent='verf\u00fcgbar';\r\n  badge.style.background='';badge.style.color='';badge.style.borderColor='';\r\n  if(!ha&&activeTab==='exact')switchTab('std');\r\n}\r\n\r\n\/\/ \u2500\u2500 END MODULE TYPE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction setEndTypeAll(type,silent){\r\n  const v=MODELS[sel].variants[selV];\r\n  if(type==='adj'&&!v.adjEnd)return;\r\n  document.getElementById('el-type').value=type;document.getElementById('er-type').value=type;\r\n  document.getElementById('end-type-std').classList.toggle('active',type==='std');\r\n  document.getElementById('end-type-adj').classList.toggle('active',type==='adj');\r\n  updateEndLabels();if(!silent)calc();\r\n}\r\nfunction updateEndLabels(){\r\n  const v=MODELS[sel].variants[selV],ae=v.adjEnd,type=document.getElementById('el-type').value,isAdj=type==='adj'&&ae;\r\n  const wr=document.getElementById('end-width-row'),wl=document.getElementById('end-width-label');\r\n  if(isAdj){wl.textContent=ae.min*100+'\u2013'+ae.max*100+' cm';wr.style.display='block';}else wr.style.display='none';\r\n}\r\n\r\n\/\/ \u2500\u2500 CORNER MODE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction updateCurveNote(){\r\n  const el=document.getElementById('curve-note');\r\n  if(!el)return;\r\n  const flexDeg=sel==='S'?'3\u20135':'3';\r\n  const seriesName=sel==='T'?'T-Serie (T50, T80, T100, T120)':sel==='S'?'S-Serie (S50, S60, S75, S110)':'D-Serie';\r\n  el.innerHTML=\r\n    '<strong>F\u00fcr sehr sanfte Kurven werden keine Eckmodule ben\u00f6tigt.<\/strong><br><br>'+\r\n    'Jede Verbindung zwischen Modulen l\u00e4sst eine kleine Winkelabweichung zu. Bei der <strong>'+seriesName+'<\/strong> sind das etwa <strong>~'+flexDeg+'\u00b0 pro Verbindung<\/strong>.<br><br>'+\r\n    'Wenn Ihre Kurve mehr als ~'+flexDeg+'\u00b0 pro Verbindung erfordert, verwenden Sie oben <strong>Anderer Winkel<\/strong>, um die Eckmodule zu berechnen.<br><br>'+\r\n    '<strong>So messen Sie:<\/strong> Gehen Sie die Kurve ab und messen Sie die Gesamtdistanz am Boden. Geben Sie dies als Ihre Abschnittsl\u00e4nge ein und lassen Sie alle Eingaben f\u00fcr Ecken auf 0.';\r\n}\r\n\r\nfunction setSituation(sit){\r\n  ['90','angle','curve'].forEach(s=>{const b=document.getElementById('sit-'+s);if(b)b.classList.toggle('active',s===sit);});\r\n  const mc=document.getElementById('corner-mode-count');if(mc)mc.style.display=sit==='90'?'block':'none';\r\n  const ma=document.getElementById('corner-mode-angle');if(ma)ma.style.display=sit==='angle'?'block':'none';\r\n  const mcu=document.getElementById('corner-mode-curve');if(mcu)mcu.style.display=sit==='curve'?'block':'none';\r\n  if(sit==='90'){cornerMode='count';updateCornerFeedback();}\r\n  else if(sit==='angle'){cornerMode='angle';calcAngle();}\r\n  else if(sit==='curve'){\r\n    cornerMode='count';\r\n    const cin=document.getElementById('f-cin');if(cin)cin.value=0;\r\n    const cout=document.getElementById('f-cout');if(cout)cout.value=0;\r\n    const fb=document.getElementById('corner-fb-count');if(fb)fb.style.display='none';\r\n    updateCurveNote();\r\n    calc();\r\n  }\r\n}\r\nfunction setCornerMode(m){\r\n  cornerMode=m;\r\n  if(m==='count')setSituation('90');\r\n  else if(m==='angle')setSituation('angle');\r\n}\r\nfunction setAdir(d){\r\n  angleDir=d;\r\n  document.getElementById('adir-in').classList.toggle('active',d==='in');\r\n  document.getElementById('adir-out').classList.toggle('active',d==='out');\r\n  const v=MODELS[sel].variants[selV];\r\n  if(!(d==='out'&&v.cornerOutFixed90))document.getElementById('f-angle').disabled=false;\r\n  calcAngle();\r\n}\r\nfunction updateCornerFeedback(){\r\n  const v=MODELS[sel].variants[selV],cin=gn('f-cin'),cout=gn('f-cout');\r\n  const fb=document.getElementById('corner-fb-count');\r\n  if(cin+cout===0){fb.style.display='none';return;}\r\n  const cpxIn=v.cpxIn||v.cpx,cpxOut=v.cpxOut||v.cpx;\r\n  const useFixed=(v.name==='T100'||v.name==='T120')&&coutType==='fixed';\r\n  const totalPcs=cin*cpxIn+(useFixed?cout:cout*cpxOut);\r\n  let lines=[];\r\n  if(cin>0){lines.push(cin+' \u00d7 90\u00b0 Innenecke'+(cin>1?'n':'')+' = <strong>'+cin*cpxIn+' Eckmodul'+(cin*cpxIn>1?'e':'')+'<\/strong> ('+cpxIn+' pro Ecke)');}\r\n  if(cout>0){\r\n    const useFixed=(v.name==='T100'||v.name==='T120')&&coutType==='fixed';\r\n    const outPcs=useFixed?cout:cout*cpxOut;\r\n    const outCode=useFixed?(v.name==='T120'?'20-3243':'20-3230'):(v.c&&v.c.co||'');\r\n    if(useFixed) lines.push(cout+' \u00d7 90\u00b0 Au\u00dfenecke'+(cout>1?'n':'')+' = <strong>'+cout+' festes 90\u00b0-Doppelmodul'+(cout>1?'e':'')+'<\/strong> ('+outCode+')');\r\n    else if(v.cornerOutFixed90) lines.push(cout+' \u00d7 90\u00b0 Au\u00dfenecke'+(cout>1?'n':'')+' = <strong>'+cout+' festes 90\u00b0-Doppelmodul'+(cout>1?'e':'')+'<\/strong> (20-3243)');\r\n    else lines.push(cout+' \u00d7 90\u00b0 Au\u00dfenecke'+(cout>1?'n':'')+' = <strong>'+outPcs+' Eckmodul'+(outPcs>1?'e':'')+'<\/strong> ('+cpxOut+' pro Ecke)');\r\n  }\r\n  lines.push('<strong>'+totalPcs+' Eckmodule insgesamt<\/strong>');\r\n  fb.className='cfb ok';fb.innerHTML=lines.join('<br>');fb.style.display='block';\r\n}\r\nfunction calcAngle(){\r\n  const v=MODELS[sel].variants[selV],fb=document.getElementById('corner-fb-angle'),ai=document.getElementById('f-angle');\r\n  if(angleDir==='out'&&v.cornerOutFixed90){\r\n    ai.value=90;ai.disabled=true;document.getElementById('f-cout').value=1;document.getElementById('f-cin').value=0;calc();\r\n    const coCode=v.name==='T120'?'20-3243':'20-3230';\r\n    fb.className='cfb info';fb.innerHTML=v.name+'-Au\u00dfenecke ('+coCode+') ist ein festes 90\u00b0-Modul \u2014 keine anderen Au\u00dfenwinkel verf\u00fcgbar. <strong>1 Modul = 90\u00b0.<\/strong>';fb.style.display='block';return;\r\n  }\r\n  ai.disabled=false;\r\n  const target=Math.max(1,Math.min(180,parseFloat(ai.value)||90));\r\n  const cpxIn=v.cpxIn||v.cpx,cpxOut=v.cpxOut||v.cpx,cpx=angleDir==='in'?cpxIn:cpxOut,dp=90\/cpx;\r\n  const exact=target\/dp,fl=Math.floor(exact),ce=Math.ceil(exact);\r\n  const isEx=Math.abs(exact-Math.round(exact))<0.001;\r\n  if(angleDir==='in'){document.getElementById('f-cin').value=isEx?Math.round(exact):ce;document.getElementById('f-cout').value=0;}\r\n  else{document.getElementById('f-cout').value=isEx?Math.round(exact):ce;document.getElementById('f-cin').value=0;}\r\n  calc();\r\n  if(isEx){fb.className='cfb ok';fb.innerHTML='<strong>'+Math.round(exact)+' Eckmodul'+(Math.round(exact)>1?'e':'')+'<\/strong> ergibt exakt <strong>'+target+'\u00b0<\/strong> \u2014 perfekte Passform.';}\r\n  else{\r\n    const fa=dp*0.5,g1=target-r4(fl*dp),g2=r4(ce*dp)-target;\r\n    let msg=target+'\u00b0 liegt zwischen den Modulschritten f\u00fcr '+v.name+' ('+dp+'\u00b0 pro Modul).<br>';\r\n    if(fl>0)msg+='<strong>'+fl+' Modul'+(fl>1?'e':'')+' = '+r4(fl*dp)+'\u00b0<\/strong> \u2014 '+g1.toFixed(1)+'\u00b0 zu kurz'+(g1<=fa?', schlie\u00dfbar durch nat\u00fcrliche Flexibilit\u00e4t':'');\r\n    msg+='<br><strong>'+ce+' Modul'+(ce>1?'e':'')+' = '+r4(ce*dp)+'\u00b0<\/strong> \u2014 '+g2.toFixed(1)+'\u00b0 zu lang'+(g2<=fa?', schlie\u00dfbar durch nat\u00fcrliche Flexibilit\u00e4t':'');\r\n    msg+='<br><span style=\"font-size:11px;opacity:.8\">Kontaktieren Sie NoFloods, um die Passform f\u00fcr Sonderwinkel zu verifizieren.<\/span>';\r\n    fb.className='cfb info';fb.innerHTML=msg;\r\n  }\r\n  fb.style.display='block';\r\n}\r\n\r\n\/\/ \u2500\u2500 MAIN CALC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction calc(){\r\n  const v=MODELS[sel].variants[selV];\r\n  const target=r4(sections.reduce((s,sec)=>s+sec.len,0));\r\n  \/\/ Hide results entirely until user has entered something\r\n  const resEl=document.querySelector('.res');\r\n  if(resEl)resEl.style.display=target>0?'block':'none';\r\n  const actionBar=document.getElementById('results-action-bar');\r\n  const saveAnother=document.getElementById('btn-save-another');\r\n  const saveQuote=document.getElementById('btn-save-quote');\r\n  if(target<=0&&!cart.length){if(actionBar)actionBar.style.display='none';return;}\r\n  if(actionBar)actionBar.style.display='block';\r\n  if(saveAnother)saveAnother.style.opacity=target>0?'1':'0.4';\r\n  if(saveAnother)saveAnother.style.pointerEvents=target>0?'':'none';\r\n  if(saveQuote)saveQuote.style.opacity=target>0?'1':'0.4';\r\n  if(saveQuote)saveQuote.style.pointerEvents=target>0?'':'none';\r\n  const cin=gn('f-cin'),cout=gn('f-cout');\r\n  const elType=document.getElementById('el-type').value,erType=document.getElementById('er-type').value;\r\n  const elQty=v.ends?gn('f-el'):0,erQty=v.ends?gn('f-er'):0;\r\n  const elIsAdj=elType==='adj'&&v.adjEnd!=null,erIsAdj=erType==='adj'&&v.adjEnd!=null;\r\n  document.getElementById('f-ael').value=elIsAdj?elQty:0;document.getElementById('f-aer').value=erIsAdj?erQty:0;\r\n  const el=elIsAdj?0:elQty,er=erIsAdj?0:erQty,ael=elIsAdj?elQty:0,aer=erIsAdj?erQty:0;\r\n  const wl=v.wall?gn('f-wl'):0,wr=v.wall?gn('f-wr'):0;\r\n  \/\/ Module count from catalogue rate\r\n  const nStd=Math.ceil(target*perM(v));\r\n  const actualLen=stdCov(nStd,v);\r\n  const diff=r4(actualLen-target);\r\n  const lo=r4(actualLen*0.97),hi=r4(actualLen*1.03);\r\n  const cpxIn=v.cpxIn||v.cpx,cpxOut=v.cpxOut||v.cpx;\r\n  \/\/ For T100\/T120 outward corners, check if user chose fixed 90\u00b0 double module\r\n  const useFixed90Out=(v.name==='T100'||v.name==='T120')&&coutType==='fixed';\r\n  const inPcs=cin*cpxIn;\r\n  const outPcs=useFixed90Out?cout*1:cout*cpxOut; \/\/ fixed=1 double module per corner, modules=cpxOut per corner\r\n  const outCode=useFixed90Out?(v.c.co90||v.c.co):v.c.co;\r\n  const outWeight=useFixed90Out?(v.name==='T100'?27.5:28.0):v.w.co;\r\n  const accPcs=inPcs+outPcs+el+er+ael+aer+wl+wr;\r\n  const total=nStd+accPcs;\r\n  \/\/ Accessory lengths\r\n  const endWL=elIsAdj?(v.adjEndW?v.adjEndW.min:0):(v.endW||0);\r\n  const endWR=erIsAdj?(v.adjEndW?v.adjEndW.min:0):(v.endW||0);\r\n  const endLL=elQty>0?r4(endWL):0,endLR=erQty>0?r4(endWR-OL):0;\r\n  const wallLL=wl>0&&v.wallW?r4(wl*v.wallW):0,wallLR=wr>0&&v.wallW?r4(wr*(v.wallW-OL)):0;\r\n  const accLen=r4(endLL+endLR+wallLL+wallLR);\r\n  const totalLen=r4(actualLen+accLen),totalLo=r4(lo+accLen),totalHi=r4(hi+accLen);\r\n  const overUnder=r4(totalLen-target);\r\n  \/\/ Bar\r\n  document.getElementById('r-tag').textContent=v.name+' \u00b7 '+v.prot+' cm Schutz';\r\n  const mx=Math.max(actualLen,target)*1.06;\r\n  const pR=Math.round(target\/mx*100),pA=Math.min(100,Math.round(actualLen\/mx*100));\r\n  document.getElementById('bar-req').style.width=pR+'%';document.getElementById('bar-act').style.width=pA+'%';\r\n  if(diff>0.001){document.getElementById('bar-ov').style.left=pR+'%';document.getElementById('bar-ov').style.width=(pA-pR)+'%';document.getElementById('lbl-ov-wrap').style.display='flex';}\r\n  else{document.getElementById('bar-ov').style.width='0';document.getElementById('lbl-ov-wrap').style.display='none';}\r\n  document.getElementById('lbl-req').textContent=target+' m';document.getElementById('lbl-act').textContent=actualLen+' m';document.getElementById('lbl-ov').textContent='+'+diff+' m';\r\n  \/\/ Cards\r\n  const dcls=diff<0.001?'ok':diff<0.5?'':'over',ocls=overUnder>0.5?'over':'ok';\r\n  const hasAccCard=accLen>0;\r\n  document.getElementById('r-sum').style.gridTemplateColumns=hasAccCard?'repeat(3,1fr)':'repeat(2,1fr)';\r\n  document.getElementById('r-sum').innerHTML=\r\n    '<div class=\"sc\"><div class=\"sv\">'+target+' m<\/div><div class=\"sl\">Erforderliche L\u00e4nge'+(sections.length>1?'<br><span style=\"font-size:10px;color:var(--t3)\">'+sections.length+' Abschnitte<\/span>':'')+'<\/div><\/div>'+\r\n    '<div class=\"sc\"><div class=\"sv '+dcls+'\">'+actualLen+' m<\/div><div class=\"sl\">Gerade Abdeckung<br><span style=\"font-size:10px;color:var(--t3)\">'+nStd+' Module \u00b7 \u00b12\u20133% Toleranz<\/span><\/div><\/div>'+\r\n    (hasAccCard?'<div class=\"sc\"><div class=\"sv '+ocls+'\">'+totalLen+' m<\/div><div class=\"sl\">Gesamt inkl. Zubeh\u00f6r<br><span style=\"font-size:10px;color:var(--t3)\">installiert: '+totalLo+'\u2013'+totalHi+' m<\/span><\/div><\/div>':'');\r\n  \/\/ Breakdown\r\n  const c=v.c;let rows='',codes=[];\r\n  const addR=(lbl,qty,code,note)=>{\r\n    if(!qty)return;if(code)codes.push(qty+'\u00d7 '+code);\r\n    rows+='<div class=\"bkr\"><span>'+lbl+(code?'<span class=\"bkc\">'+code+'<\/span>':'')+'<\/span><div class=\"bkr2\">'+(note?'<span style=\"font-size:11px;color:var(--t3)\">'+note+'<\/span>':'')+'<span class=\"bkq\">'+qty+' Stk.<\/span><\/div><\/div>';\r\n  };\r\n  addR('Gerade Module',nStd,c.st);\r\n  if(cin>0)addR('Innenecke ('+cin+' \u00d7 '+cpxIn+' Stk.)',inPcs,c.ci);\r\n  if(cout>0)addR('Au\u00dfenecke'+(useFixed90Out?' \u2014 festes 90\u00b0-Doppelmodul':''),outPcs,outCode);\r\n  if(el>0)addR('Ende \u2013 links',el,c.el);if(er>0)addR('Ende \u2013 rechts',er,c.er);\r\n  if(ael>0&&v.adjEnd)addR('Ende \u2013 verstellbar links',ael,v.adjEnd.cL,v.adjEnd.min*100+'\u2013'+v.adjEnd.max*100+' cm');\r\n  if(aer>0&&v.adjEnd)addR('Ende \u2013 verstellbar rechts',aer,v.adjEnd.cR,v.adjEnd.min*100+'\u2013'+v.adjEnd.max*100+' cm');\r\n  if(wl>0)addR('Wandanschluss \u2013 links',wl,c.wl);if(wr>0)addR('Wandanschluss \u2013 rechts',wr,c.wr);\r\n  rows+='<div class=\"bkr\"><span>Gesamtsumme<\/span><span class=\"bkq\" style=\"color:var(--br)\">'+total+' Stk.<\/span><\/div>';\r\n  document.getElementById('r-bk').innerHTML=rows;\r\n  \/\/ Note\r\n  let note=nStd+' gerade Module decken '+actualLen+' m ab.';\r\n  if(accLen>0)note+=' Zubeh\u00f6r addiert ~'+r4(accLen*100)+' cm \u2192 gesamt ~'+totalLen+' m.';\r\n  note+=' Installiert: '+totalLo+'\u2013'+totalHi+' m (\u00b12\u20133%).';\r\n  if(v.name==='T80')note+=' T80: 4 Eckmodule pro 90\u00b0-Kurve.';\r\n  if(v.name==='T100')note+=' T100 innen: 2 Module pro 90\u00b0. Au\u00dfen: 1 festes 90\u00b0-Modul.';\r\n  document.getElementById('r-note').textContent=note;\r\n  const wEl=document.getElementById('r-warn');\r\n  if(sel==='D'){wEl.style.display='block';wEl.textContent='D-Serie nicht in den USA, Kanada, Puerto Rico, Gro\u00dfbritannien, Irland oder Katar verf\u00fcgbar.';}else wEl.style.display='none';\r\n  \/\/ Reset user selection when inputs change \u2014 new calc means fresh state\r\n  exactOptUserSelected=false;\r\n  \/\/ Exact fit (sets bestExactOpt to top option automatically)\r\n  if(v.adj)buildExact(v,target,nStd,inPcs+outPcs+el+er+ael+aer+wl+wr,cin>0||cout>0,accLen);\r\n  else{bestExactOpt=null;_exactOpts=[];}\r\n  \/\/ Weight (uses bestExactOpt if user has explicitly selected one)\r\n  buildWeight(nStd,v,total,accPcs,cin,cout,el,er,ael,aer,wl,wr,inPcs,outPcs);\r\n  updateAvail();updateEndLabels();\r\n  if(cornerMode==='count')updateCornerFeedback();\r\n  _lastCalc={v,target,actualLen,totalLen,nStd,accPcs,total,codes:[...codes],cin,cout,el,er,ael,aer,wl,wr,inPcs,outPcs,accLen};\r\n  updateQuoteSummary();\r\n}\r\n\r\nlet _lastCalc=null;\r\nfunction updateQuoteSummary(){\r\n  if(!_lastCalc&&!cart.length){\r\n    \/\/ Nothing to show \u2014 clear everything\r\n    const qsg=document.getElementById('qs-grid');if(qsg)qsg.innerHTML='';\r\n    const qsc=document.getElementById('qs-codes');if(qsc)qsc.textContent='';\r\n    const qsm=document.getElementById('qs-model');if(qsm)qsm.textContent='\u2013';\r\n    return;\r\n  }\r\n  if(!_lastCalc)return;\r\n  const {v,target,actualLen,totalLen,nStd,accPcs,total,codes,cin,cout,el,er,ael,aer,wl,wr,inPcs,outPcs}=_lastCalc;\r\n  document.getElementById('qs-model').textContent=MODELS[sel].label+' \u00b7 '+v.name+' \u00b7 '+v.prot+' cm Schutz';\r\n\r\n  \/\/ Helper: one summary row\r\n  const row=(qty,label,code,note)=>{\r\n    const codeTag=code?'<span style=\"font-family:var(--fm);font-size:10px;color:var(--t3);margin-left:5px\">'+code+'<\/span>':'';\r\n    const noteTxt=note?'<span style=\"font-size:11px;color:var(--t3);margin-left:5px\">\u2014 '+note+'<\/span>':'';\r\n    return '<div class=\"qs-i\" style=\"grid-column:1\/-1;display:flex;align-items:baseline;justify-content:space-between;gap:8px\">'+\r\n      '<span><strong style=\"font-size:15px;margin-right:6px\">'+qty+'\u00d7<\/strong>'+label+codeTag+noteTxt+'<\/span>'+\r\n    '<\/div>';\r\n  };\r\n  const divider='<div style=\"grid-column:1\/-1;height:0.5px;background:var(--bd);margin:4px 0\"><\/div>';\r\n  const totalRow=(qty,label)=>'<div class=\"qs-i\" style=\"grid-column:1\/-1;display:flex;justify-content:space-between;font-weight:700\">'+\r\n    '<span>'+label+'<\/span><span>'+qty+'<\/span><\/div>';\r\n\r\n  let rows='';\r\n  let qsCodes='';\r\n\r\n  if(exactOptUserSelected&&bestExactOpt&&bestExactOpt.modules){\r\n    const o=bestExactOpt;\r\n    \/\/ List every module from the exact fit recommendation\r\n    o.modules.forEach(m=>{\r\n      const codeClean=m.code?m.code.replace(\/<[^>]+>\/g,''):'';\r\n      const noteClean=m.note?m.note.replace(\/<strong[^>]*>|<\\\/strong>\/g,'').replace(\/<[^>]+>\/g,''):'';\r\n      rows+=row(m.qty,m.name,codeClean,noteClean);\r\n    });\r\n    \/\/ Then list accessories from the standard calc (corners etc.)\r\n    const listedCodes=o.modules.map(m=>m.code?m.code.replace(\/<[^>]+>\/g,'').trim():'').filter(Boolean);\r\n    if(cin>0)rows+=row(inPcs,'Innenecke',v.c.ci,v.cpxIn||v.cpx+' Stk. pro 90\u00b0-Kurve');\r\n    if(cout>0)rows+=row(outPcs,'Au\u00dfenecke',v.c.co,'');\r\n    if(el>0)rows+=row(el,'Endmodul \u2013 links',v.c.el,'');\r\n    if(er>0)rows+=row(er,'Endmodul \u2013 rechts',v.c.er,'');\r\n    if(ael>0&&v.adjEnd)rows+=row(ael,'Verstellbares Ende \u2013 links',v.adjEnd.cL,'');\r\n    if(aer>0&&v.adjEnd)rows+=row(aer,'Verstellbares Ende \u2013 rechts',v.adjEnd.cR,'');\r\n    if(wl>0&&v.c.wl)rows+=row(wl,'Wandanschluss \u2013 links',v.c.wl,'');\r\n    if(wr>0&&v.c.wr)rows+=row(wr,'Wandanschluss \u2013 rechts',v.c.wr,'');\r\n    const termPcs=o.modules.reduce((s,m)=>s+(m.qty||0),0);\r\n    const grandTotal=termPcs+accPcs;\r\n    rows+=divider+totalRow(grandTotal+' Stk.','Gesamtsumme');\r\n    \/\/ product codes\r\n    const exactCodes=o.modules.filter(m=>m.qty>0&&m.code).map(m=>m.qty+'\u00d7 '+m.code.replace(\/<[^>]+>\/g,''));\r\n    codes.filter(c=>{\r\n      const baseCode=c.split('\u00d7 ')[1];\r\n      return !exactCodes.some(ec=>ec.includes(baseCode));\r\n    }).forEach(c=>exactCodes.push(c));\r\n    qsCodes='Produktcodes: '+exactCodes.join(' \u00b7 ');\r\n\r\n  } else {\r\n    \/\/ Standard fit \u2014 explicit breakdown\r\n    rows+=row(nStd,'Standard-Module',v.c.st,'');\r\n    if(cin>0)rows+=row(inPcs,'Innenecke',v.c.ci,(v.cpxIn||v.cpx)+' Stk. pro 90\u00b0-Kurve');\r\n    if(cout>0)rows+=row(outPcs,'Au\u00dfenecke',v.c.co,'');\r\n    if(el>0)rows+=row(el,'Endmodul \u2013 links',v.c.el,'');\r\n    if(er>0)rows+=row(er,'Endmodul \u2013 rechts',v.c.er,'');\r\n    if(ael>0&&v.adjEnd)rows+=row(ael,'Verstellbares Ende \u2013 links',v.adjEnd.cL,'');\r\n    if(aer>0&&v.adjEnd)rows+=row(aer,'Verstellbares Ende \u2013 rechts',v.adjEnd.cR,'');\r\n    if(wl>0&&v.c.wl)rows+=row(wl,'Wandanschluss \u2013 links',v.c.wl,'');\r\n    if(wr>0&&v.c.wr)rows+=row(wr,'Wandanschluss \u2013 rechts',v.c.wr,'');\r\n    rows+=divider+totalRow(total+' Stk.','Gesamtsumme');\r\n    rows+='<div class=\"qs-i\" style=\"grid-column:1\/-1;font-size:11px;color:var(--t2)\">'+\r\n      'Gerade Abdeckung: <strong>'+actualLen+' m<\/strong>'+(actualLen>target?' ('+Math.round((actualLen-target)*100)+' cm \u00fcber Ziel \u2014 in Ordnung f\u00fcr offene Strecken)':'')+'<\/div>';\r\n    qsCodes=codes.length?'Produktcodes: '+codes.join(' \u00b7 '):'';\r\n  }\r\n\r\n  document.getElementById('qs-grid').innerHTML=rows;\r\n  document.getElementById('qs-codes').textContent=qsCodes;\r\n}\r\n\r\n\/\/ \u2500\u2500 WEIGHT \/ STORAGE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction buildWeight(nStd,v,total,accPcs,cin,cout,el,er,ael,aer,wl,wr,inPcs,outPcs){\r\n  const w=v.w||{};\r\n  const cpxIn=v.cpxIn||v.cpx, cpxOut=v.cpxOut||v.cpx;\r\n\r\n  \/\/ Use exact fit breakdown if that tab is active and an option is selected\r\n  const useExact=exactOptUserSelected&&bestExactOpt&&(bestExactOpt.nA>0);\r\n  const nSt=useExact?bestExactOpt.nS:nStd;\r\n  const nAdj=useExact?bestExactOpt.nA:0;\r\n\r\n  \/\/ Calculate weight for each module type\r\n  const stKg   = r4(nSt    * (w.st||v.wKg));\r\n  const adjKg  = r4(nAdj   * (w.adj||v.wKg));\r\n  const ciKg   = r4(inPcs  * (w.ci||0));\r\n  const useFixed90Out=(v.name==='T100'||v.name==='T120')&&coutType==='fixed';\r\n  const coKg   = r4(outPcs * (useFixed90Out?(v.name==='T100'?27.5:28.0):(w.co||0)));\r\n  const elKg   = r4(el     * (w.el||0));\r\n  const erKg   = r4(er     * (w.er||0));\r\n  const aelKg  = r4(ael    * (w.ael||0));\r\n  const aerKg  = r4(aer    * (w.aer||0));\r\n  const wlKg   = r4(wl     * (w.wl||0));\r\n  const wrKg   = r4(wr     * (w.wr||0));\r\n  const totalKg= r4(stKg+adjKg+ciKg+coKg+elKg+erKg+aelKg+aerKg+wlKg+wrKg);\r\n\r\n  const pallets=Math.ceil((nSt+nAdj)\/v.ppallet);\r\n  document.getElementById('badge-weight').textContent=totalKg+' kg';\r\n\r\n  \/\/ Build breakdown rows\r\n  let rows='';\r\n  const addW=(lbl,n,kg)=>{if(!n||!kg)return;rows+=`<div style=\"display:flex;justify-content:space-between;font-size:12px;padding:4px 0;border-bottom:0.5px solid var(--bd);color:var(--t2)\"><span>${lbl} \u00d7 ${n}<\/span><span style=\"font-weight:600;color:var(--t1)\">${r4(n*kg)} kg <span style=\"font-weight:400;color:var(--t3)\">(${kg} kg je)<\/span><\/span><\/div>`;};\r\n  addW('Gerade',nSt,w.st||v.wKg);\r\n  if(nAdj>0) addW('Verstellbar gerade',nAdj,w.adj||v.wKg);\r\n  if(inPcs>0) addW('Innenecke',inPcs,w.ci||0);\r\n  if(outPcs>0) addW('Au\u00dfenecke',outPcs,w.co||0);\r\n  if(el>0) addW('Ende links',el,w.el||0);\r\n  if(er>0) addW('Ende rechts',er,w.er||0);\r\n  if(ael>0) addW('Verstellb. Ende links',ael,w.ael||0);\r\n  if(aer>0) addW('Verstellb. Ende rechts',aer,w.aer||0);\r\n  if(wl>0) addW('Wandanschluss links',wl,w.wl||0);\r\n  if(wr>0) addW('Wandanschluss rechts',wr,w.wr||0);\r\n\r\n  document.getElementById('wt-grid').innerHTML=\r\n    `<div class=\"wt-card\"><div class=\"wt-v\">${totalKg} kg<\/div><div class=\"wt-l\">Gesamtgewicht (alle Module)<\/div><div class=\"wt-sub\">${useExact?'Basierend auf gew\u00e4hlter exakter Passform':'Alle Modultypen inkludiert'}<\/div><\/div>`+\r\n    `<div class=\"wt-card\"><div class=\"wt-v\">~${pallets}<\/div><div class=\"wt-l\">Gesch\u00e4tzte Paletten<\/div><div class=\"wt-sub\">~${v.ppallet} gerade Module pro Palette<\/div><\/div>`+\r\n    `<div class=\"wt-card\"><div class=\"wt-v\">${v.wKg} kg<\/div><div class=\"wt-l\">Gewicht gerades Modul<\/div><div class=\"wt-sub\">${v.name} (Katalog)<\/div><\/div>`+\r\n    `<div class=\"wt-card\" style=\"grid-column:1\/-1\"><div style=\"font-size:11px;font-weight:700;color:var(--t2);margin-bottom:8px;text-transform:uppercase;letter-spacing:.04em\">Gewichtsaufschl\u00fcsselung<\/div>${rows}<div style=\"display:flex;justify-content:space-between;font-size:13px;font-weight:700;padding-top:8px;color:var(--t1)\"><span>Gesamt<\/span><span>${totalKg} kg<\/span><\/div><\/div>`;\r\n}\r\n\r\n\/\/ \u2500\u2500 EXACT FIT SOLVER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nlet bestExactOpt=null, _exactOpts=[], exactOptUserSelected=false;\r\n\r\nfunction buildExact(v,target,nStdBase,fixedAccPcs,hasCorners,accLen){\r\n  const adj=v.adj, ae=v.adjEnd;\r\n  const OL2=0.07;\r\n  const r2=x=>Math.round(x*100);\r\n  const r1=x=>Math.round(x*10)\/10;\r\n\r\n  \/\/ Straight modules only need to cover (target minus end\/wall net contributions)\r\n  const accNetLen=r4(accLen||0);\r\n  const straightTarget=r4(target-accNetLen);\r\n\r\n  \/\/ Recalculate nStd from straightTarget (not full target passed from calc)\r\n  const nStd=Math.ceil(straightTarget*perM(v));\r\n\r\n  const covMinus1=stdCov(nStd-1,v);\r\n  const gap=r4(straightTarget-covMinus1);\r\n  const gapCm=r2(gap);\r\n  const stdCovVal=stdCov(nStd,v);\r\n  const overCm=r2(r4(stdCovVal-straightTarget));\r\n\r\n  const endNet =v.endW ?(v.endW -OL2):null;\r\n  const wallNet=v.wallW?(v.wallW-OL2):null;\r\n  const adjEndNetMin=ae?(ae.min-OL2):null;\r\n  const adjEndNetMax=ae?(ae.max-OL2):null;\r\n  const adjNetMin=adj.min-OL2;\r\n  const adjNetMax=adj.max-OL2;\r\n\r\n  \/\/ If end\/wall modules already configured, don't suggest them again in exact fit\r\n  const alreadyHasEndOrWall=accNetLen>0;\r\n\r\n  let rec=null;\r\n  const inR=(val,lo,hi)=>val>=lo-0.005&&val<=hi+0.005;\r\n\r\n\r\n  \/\/ Adjustable straight \u2014 try 1, 2, or 3 modules (max 3 absolute)\r\n  if(!rec){\r\n    for(let nAdj=1;nAdj<=3;nAdj++){\r\n      if(nStd<=nAdj)break; \/\/ can't remove more std modules than we have\r\n      const gapN=r4(straightTarget-stdCov(nStd-nAdj,v));\r\n      const perAdjNet=r4(gapN\/nAdj);\r\n      const inRange=perAdjNet>=adjNetMin-0.005&&perAdjNet<=adjNetMax+0.005;\r\n      if(inRange){\r\n        const setCm=Math.round((perAdjNet+OL2)*100);\r\n        const label=nAdj===1?'1 verstellbares gerades Modul eingestellt auf '+setCm+' cm':nAdj+' verstellbare gerade Module, je eingestellt auf '+setCm+' cm';\r\n        const modules=[\r\n          {qty:nStd-nAdj,name:'Standard-Module',code:v.c.st,note:Math.round(v.wS*1000)\/10+' cm jeweils'},\r\n          {qty:nAdj,name:'Verstellbares Modul',code:adj.code,note:(nAdj>1?'jeweils auf ':'auf ')+'<strong>'+setCm+' cm<\/strong> einstellen (Bereich: '+Math.round(adj.min*100)+'\u2013'+Math.round(adj.max*100)+' cm)'}\r\n        ];\r\n        rec={label,modules,exact:true};\r\n        _exactOpts=[{nS:nStd-nAdj,nA:nAdj,wA:adj.min+(perAdjNet-adjNetMin)\/(adjNetMax-adjNetMin)*(adj.max-adj.min),len:target,diff:0,feasible:true,exact:true,modules,label}];\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \/\/ Exact fit only suggests the adjustable straight module.\r\n  \/\/ End modules, adjustable end modules, and wall connectors are configured\r\n  \/\/ separately in the accessories section \u2014 never suggested here.\r\n\r\n  let html='';\r\n\r\n  if(rec){\r\n    \/\/ \u2500\u2500 There IS an exact fit solution \u2014 show it cleanly, nothing else \u2500\u2500\r\n    const adjCount=rec.modules.filter(m=>m.name.toLowerCase().includes('verstellbares')).reduce((s,m)=>s+m.qty,0);\r\n    const stdCount=rec.modules[0].qty;\r\n    let intro='';\r\n    if(accNetLen>0){\r\n      \/\/ Has accessories already configured\r\n      intro='Der Austausch von '+(adjCount===1?'einem':''+adjCount)+' Standard-Modul'+(adjCount>1?'en':'')+' durch '+(adjCount===1?'ein verstellbares':''+adjCount+' verstellbare')+' Modul'+(adjCount>1?'e':'')+' ergibt eine exakte Passform. Ihre '+Math.round(accNetLen*100)+' cm an End-\/Wandmodulen sind bereits enthalten.';\r\n    } else {\r\n      intro='Ersetzen Sie '+(adjCount===1?'ein':''+adjCount)+' Standard-Modul'+(adjCount>1?'e':'')+' durch '+(adjCount===1?'ein verstellbares':''+adjCount+' verstellbare')+' Modul'+(adjCount>1?'e':'')+', um genau '+target+' m zu erreichen.';\r\n    }\r\n    if(hasCorners) intro='Diese Strecke hat Ecken \u2014 platzieren Sie '+(adjCount>1?'die verstellbaren Module':'das verstellbare Modul')+' an einer beliebigen Stelle in den geraden Abschnitten. '+intro;\r\n    html+=\r\n      '<div style=\"font-size:12px;color:var(--t2);margin-bottom:12px;line-height:1.6\">'+intro+'<\/div>'+\r\n      '<div class=\"eo best\" style=\"border:2px solid var(--ok)\">'+\r\n        '<div class=\"eo-hd\">'+\r\n          '<div>'+\r\n            '<div class=\"eo-t\">'+rec.label+'<\/div>'+\r\n            '<div style=\"font-size:11px;color:var(--t2);margin-top:3px\">Erreicht exakt '+target+' m'+(accNetLen>0?' inklusive Ihrer End-\/Wandmodule':'')+'<\/div>'+\r\n          '<\/div>'+\r\n          '<span class=\"eo-b b-ex\">Exakte Passform<\/span>'+\r\n        '<\/div>'+\r\n        '<div class=\"eo-ms\">'+\r\n          rec.modules.map(m=>'<div class=\"eo-m\"><span><strong>'+m.qty+'\u00d7<\/strong> '+m.name+(m.code?' <span class=\"bkc\">'+m.code+'<\/span>':'')+'<\/span><span>'+m.note+'<\/span><\/div>').join('')+\r\n          (accNetLen>0?'<div class=\"eo-m\" style=\"color:var(--t3)\"><span>+ Ihre End-\/Wandmodule<\/span><span>bereits oben konfiguriert<\/span><\/div>':'')+\r\n        '<\/div>'+\r\n        '<div style=\"margin-top:10px;padding-top:10px;border-top:0.5px solid var(--bd)\">'+\r\n          '<button class=\"eo-sel-btn\" onclick=\"selectExactOpt(0)\" style=\"width:100%;padding:7px;font-size:12px;font-weight:600;font-family:var(--fn);border:0.5px solid var(--bd);border-radius:var(--rm);cursor:pointer;background:var(--bg2);color:var(--t2)\">Dieses f\u00fcr mein Angebot verwenden<\/button>'+\r\n        '<\/div>'+\r\n      '<\/div>';\r\n  } else {\r\n    \/\/ \u2500\u2500 No exact fit solution \u2014 show clear explanation \u2500\u2500\r\n    const overPct2=r4((overCm\/100)\/straightTarget*100);\r\n    if(hasCorners||alreadyHasEndOrWall){\r\n      const msg=alreadyHasEndOrWall\r\n        ? 'Ihre End-\/Wandmodule sind bereits enthalten \u2014 die L\u00fccke in der geraden Strecke ('+gapCm+' cm) liegt au\u00dferhalb des Bereichs des verstellbaren Moduls ('+Math.round(adjNetMin*100)+'\u2013'+Math.round(adjNetMax*100)+' cm). Standard-Passform mit '+nStd+' geraden Modulen ist die richtige Wahl.'\r\n        : 'Die L\u00fccke ('+gapCm+' cm) liegt au\u00dferhalb des Bereichs des verstellbaren Moduls ('+Math.round(adjNetMin*100)+'\u2013'+Math.round(adjNetMax*100)+' cm). Standard-Passform mit '+nStd+' Modulen ist die richtige Wahl.';\r\n      html+='<div style=\"background:var(--okb);border-left:3px solid var(--ok);padding:10px 14px;border-radius:0 var(--rm) var(--rm) 0;font-size:12px;color:#27500A;line-height:1.6\">'+\r\n        '<strong>Die Standard-Passform ist hier die richtige Wahl.<\/strong> '+msg+' Der \u00dcberschuss betr\u00e4gt nur <strong>'+overCm+' cm ('+overPct2+'%)<\/strong> \u2014 deutlich innerhalb der Installationstoleranz.'+\r\n      '<\/div>';\r\n    } else {\r\n      html+='<div style=\"background:var(--okb);border-left:3px solid var(--ok);padding:10px 14px;border-radius:0 var(--rm) var(--rm) 0;font-size:12px;color:#27500A;line-height:1.6\">'+\r\n        '<strong>Die Standard-Passform ist hier die richtige Wahl.<\/strong> '+\r\n        'Die '+gapCm+' cm L\u00fccke liegt au\u00dferhalb des Bereichs des verstellbaren Moduls ('+Math.round(adjNetMin*100)+'\u2013'+Math.round(adjNetMax*100)+' cm netto) \u2014 das verstellbare Modul w\u00fcrde sie nicht sauber f\u00fcllen. '+\r\n        'Verwenden Sie '+nStd+' Standard-Module im Tab Standard-Passform. Der \u00dcberschuss betr\u00e4gt nur <strong>'+overCm+' cm ('+overPct2+'%)<\/strong>. '+\r\n        'Wenn Sie einen b\u00fcndigen Abschluss ben\u00f6tigen, f\u00fcgen Sie im Zubeh\u00f6r-Bereich Endmodule oder Wandanschl\u00fcsse hinzu.'+\r\n      '<\/div>';\r\n    }\r\n    _exactOpts=[];bestExactOpt=null;exactOptUserSelected=false;\r\n  }\r\n\r\n  document.getElementById('eo-list').innerHTML=html;\r\n  document.getElementById('ei').textContent='';\r\n  document.getElementById('en').textContent='';\r\n  \/\/ Update badge\r\n  const badge=document.getElementById('badge-exact');\r\n  if(badge) badge.textContent=rec?'verf\u00fcgbar':'Standard-Passform ok';\r\n  if(badge) badge.style.background=rec?'':'var(--okb)';\r\n  if(badge) badge.style.color=rec?'':'var(--ok)';\r\n  if(badge) badge.style.borderColor=rec?'':'var(--okl)';\r\n}\r\n\r\n\r\n\/\/ \u2500\u2500 TABS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction toggleExactInfo(e){\r\n  if(e)e.stopPropagation();\r\n  const pop=document.getElementById('exact-info-popover');\r\n  pop.style.display=pop.style.display==='none'?'block':'none';\r\n}\r\nfunction toggleEndInfo(e){\r\n  if(e)e.stopPropagation();\r\n  const existing=document.getElementById('end-info-popover');\r\n  if(existing){existing.remove();return;}\r\n  const pop=document.createElement('div');\r\n  pop.id='end-info-popover';\r\n  pop.style.cssText='position:relative;z-index:10;grid-column:1\/-1';\r\n  pop.innerHTML='<div style=\"background:var(--blb);border:0.5px solid var(--bll);border-radius:var(--rm);padding:12px 14px;font-size:12px;color:#0C447C;line-height:1.7;margin-top:6px\">'+\r\n    '<strong>Endmodule<\/strong> verschlie\u00dfen das offene Ende einer Strecke \u2014 zum Beispiel, wenn die Barriere auf einer Freifl\u00e4che endet und nirgendwo befestigt ist. Verwenden Sie 1 pro offenem Ende (links, rechts oder beide). '+\r\n    '<br><strong>Standard<\/strong>-Endmodule haben eine feste Breite; <strong>verstellbare<\/strong> (nur T50) lassen sich zwischen 44\u201352 cm verschieben und erm\u00f6glichen eine Feinabstimmung vor Ort.'+\r\n  '<\/div>';\r\n  const grp=document.getElementById('grp-ends');\r\n  grp.appendChild(pop);\r\n}\r\nfunction toggleWallInfo(e){\r\n  if(e)e.stopPropagation();\r\n  const existing=document.getElementById('wall-info-popover');\r\n  if(existing){existing.remove();return;}\r\n  const pop=document.createElement('div');\r\n  pop.id='wall-info-popover';\r\n  pop.style.cssText='position:relative;z-index:10;grid-column:1\/-1';\r\n  pop.innerHTML='<div style=\"background:var(--blb);border:0.5px solid var(--bll);border-radius:var(--rm);padding:12px 14px;font-size:12px;color:#0C447C;line-height:1.7;margin-top:6px\">'+\r\n    '<strong>Wandanschl\u00fcsse<\/strong> werden verwendet, wenn die Barriere auf einer oder beiden Seiten an eine Wand st\u00f6\u00dft \u2014 zum Beispiel bei einer Garagen\u00f6ffnung, bei der beide Enden an den Garagenw\u00e4nden anliegen. '+\r\n    'Verwenden Sie 1 pro Seite, die an eine Wand anschlie\u00dft. Auf einer Seite verwenden Sie entweder Endmodule <em>oder<\/em> Wandanschl\u00fcsse, nicht beides.'+\r\n  '<\/div>';\r\n  const grp=document.getElementById('grp-wall');\r\n  grp.appendChild(pop);\r\n}\r\n\/\/ Close inline popovers on outside click\r\ndocument.addEventListener('click',()=>{\r\n  const pop=document.getElementById('exact-info-popover');\r\n  if(pop)pop.style.display='none';\r\n  ['end-info-popover','wall-info-popover'].forEach(id=>{const el=document.getElementById(id);if(el)el.remove();});\r\n});\r\n\r\nfunction switchTab(t){\r\n  const v=MODELS[sel].variants[selV];if(t==='exact'&&!v.adj)return;\r\n  activeTab=t;\r\n  ['std','exact','weight'].forEach(id=>{document.getElementById('tab-'+id).classList.toggle('active',id===t);document.getElementById('body-'+id).style.display=id===t?'block':'none';});\r\n  updateQuoteSummary();\r\n  if(_lastCalc){const lc=_lastCalc;buildWeight(lc.nStd,lc.v,lc.total,lc.accPcs,lc.cin,lc.cout,lc.el,lc.er,lc.ael,lc.aer,lc.wl,lc.wr,lc.inPcs,lc.outPcs);}\r\n}\r\n\r\nfunction selectExactOpt(i){\r\n  if(!_exactOpts||!_exactOpts[i])return; \/\/ guard: no option available\r\n  if(exactOptUserSelected&&bestExactOpt===_exactOpts[i]){\r\n    \/\/ Deselect\r\n    bestExactOpt=null;exactOptUserSelected=false;\r\n    const btn=document.querySelector('.eo-sel-btn');\r\n    if(btn){btn.textContent='Dieses f\u00fcr mein Angebot verwenden';btn.style.background='var(--bg2)';btn.style.color='var(--t2)';btn.style.border='0.5px solid var(--bd)';}\r\n    updateQuoteSummary();\r\n    if(_lastCalc){const lc=_lastCalc;buildWeight(lc.nStd,lc.v,lc.total,lc.accPcs,lc.cin,lc.cout,lc.el,lc.er,lc.ael,lc.aer,lc.wl,lc.wr,lc.inPcs,lc.outPcs);}\r\n    return;\r\n  }\r\n  \/\/ Select\r\n  bestExactOpt=_exactOpts[i];exactOptUserSelected=true;\r\n  const btn=document.querySelector('.eo-sel-btn');\r\n  if(btn){btn.textContent='\u2713 F\u00fcr Angebot ausgew\u00e4hlt \u2014 zum Abw\u00e4hlen klicken';btn.style.background='var(--ok)';btn.style.color='#fff';btn.style.border='0.5px solid var(--ok)';}\r\n  updateQuoteSummary();\r\n  if(_lastCalc){const lc=_lastCalc;buildWeight(lc.nStd,lc.v,lc.total,lc.accPcs,lc.cin,lc.cout,lc.el,lc.er,lc.ael,lc.aer,lc.wl,lc.wr,lc.inPcs,lc.outPcs);}\r\n  \/\/ Scroll to quote section so user can see the update\r\n  const qs=document.getElementById('quote-section');\r\n  if(qs)setTimeout(()=>qs.scrollIntoView({behavior:'smooth',block:'start'}),100);\r\n}\r\n\r\n\/\/ \u2500\u2500 SAVE \/ LOAD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\/\/ \u2500\u2500 CART \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nlet cart=[];\r\n\r\nfunction renameCartItem(id, newName){\r\n  const item=cart.find(c=>c.id===id);\r\n  if(item){item.label=newName||item.label;renderQuoteCartSummary();}\r\n}\r\n\r\nfunction addToQuote(){\r\n  if(!_lastCalc)return;\r\n  const lc=_lastCalc;\r\n  const v=lc.v;\r\n  const defaultName='Konfiguration '+(cart.length+1);\r\n  const w=v.w||{};\r\n  const inPcs=lc.inPcs,outPcs=lc.outPcs;\r\n  const useFixed=(v.name==='T100'||v.name==='T120')&&coutType==='fixed';\r\n  const nSt=exactOptUserSelected&&bestExactOpt?bestExactOpt.nS:lc.nStd;\r\n  const nAdj=exactOptUserSelected&&bestExactOpt?bestExactOpt.nA:0;\r\n  const totalKg=Math.round((nSt*(w.st||v.wKg)+nAdj*(w.adj||v.wKg)+inPcs*(w.ci||0)+outPcs*(useFixed?(v.name==='T100'?27.5:28):w.co||0)+(lc.el||0)*(w.el||0)+(lc.er||0)*(w.er||0)+(lc.ael||0)*(w.ael||0)+(lc.aer||0)*(w.aer||0)+(lc.wl||0)*(w.wl||0)+(lc.wr||0)*(w.wr||0))*10)\/10;\r\n  cart.push({\r\n    id:Date.now(),\r\n    label:defaultName,\r\n    model:MODELS[sel].label+' \u00b7 '+v.name+' \u00b7 '+v.prot+' cm',\r\n    sections:[...sections],\r\n    target:lc.target,\r\n    total:lc.total,\r\n    nStd:lc.nStd,\r\n    accPcs:lc.accPcs,\r\n    codes:[...lc.codes],\r\n    totalKg,\r\n    exactOpt:exactOptUserSelected?{...bestExactOpt}:null,\r\n    coutType\r\n  });\r\n  renderCart();\r\n}\r\n\r\nfunction removeFromCart(id){\r\n  cart=cart.filter(c=>c.id!==id);\r\n  renderCart();\r\n  updateQuoteSummary();\r\n}\r\n\r\nfunction renderCart(){\r\n  const sec=document.getElementById('cart-section');\r\n  if(!cart.length){sec.style.display='none';renderQuoteCartSummary();return;}\r\n  sec.style.display='block';\r\n  document.getElementById('cart-count').textContent=cart.length;\r\n  const totalPcs=cart.reduce((s,c)=>s+c.total,0);\r\n  const totalKg=Math.round(cart.reduce((s,c)=>s+c.totalKg,0)*10)\/10;\r\n  document.getElementById('cart-total-pcs').textContent=totalPcs;\r\n  document.getElementById('cart-total-kg').textContent=totalKg+' kg';\r\n  document.getElementById('cart-items').innerHTML=cart.map((c,idx)=>`\r\n    <div style=\"background:var(--bg2);border-radius:var(--rm);padding:14px 16px;border-left:4px solid var(--br)\">\r\n      <div style=\"display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-bottom:10px\">\r\n        <div style=\"flex:1\">\r\n          <div style=\"display:flex;align-items:center;gap:8px;margin-bottom:4px\">\r\n            <span style=\"font-size:11px;font-weight:700;background:var(--br);color:#fff;border-radius:4px;padding:1px 7px\">${idx+1}<\/span>\r\n            <input id=\"cart-name-${c.id}\" value=\"${c.label}\" onchange=\"renameCartItem(${c.id},this.value)\" style=\"font-size:14px;font-weight:700;color:var(--t1);border:none;background:transparent;font-family:var(--fn);flex:1;min-width:0;border-bottom:1px dashed var(--bd);padding-bottom:2px\" title=\"Klicken zum Umbenennen\">\r\n          <\/div>\r\n          <div style=\"font-size:12px;color:var(--t2)\">${c.model}<\/div>\r\n        <\/div>\r\n        <button onclick=\"removeFromCart(${c.id})\" style=\"font-size:11px;color:#A32D2D;background:none;border:0.5px solid #F09595;border-radius:4px;cursor:pointer;font-family:var(--fn);padding:3px 8px;white-space:nowrap;flex-shrink:0\">Entfernen<\/button>\r\n      <\/div>\r\n      <div style=\"display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:8px\">\r\n        <div style=\"background:var(--bg1);border-radius:6px;padding:8px 10px\"><div style=\"font-size:16px;font-weight:700;color:var(--t1)\">${c.target} m<\/div><div style=\"font-size:11px;color:var(--t2)\">Erforderliche L\u00e4nge<\/div><\/div>\r\n        <div style=\"background:var(--bg1);border-radius:6px;padding:8px 10px\"><div style=\"font-size:16px;font-weight:700;color:var(--t1)\">${c.total}<\/div><div style=\"font-size:11px;color:var(--t2)\">Gesamtanzahl Module<\/div><\/div>\r\n        <div style=\"background:var(--bg1);border-radius:6px;padding:8px 10px\"><div style=\"font-size:16px;font-weight:700;color:var(--t1)\">${c.totalKg} kg<\/div><div style=\"font-size:11px;color:var(--t2)\">Gesamtgewicht<\/div><\/div>\r\n      <\/div>\r\n      <div style=\"font-size:11px;color:var(--t3);font-family:var(--fm);line-height:1.7\">${c.codes.join(' \u00b7 ')}<\/div>\r\n    <\/div>\r\n  `).join('');\r\n  renderQuoteCartSummary();\r\n}\r\n\r\nfunction renderQuoteCartSummary(){\r\n  const hasCart=cart.length>0;\r\n  document.getElementById('quote-single-config').style.display=hasCart?'none':'block';\r\n  const qci=document.getElementById('quote-cart-items');\r\n  if(!hasCart){qci.innerHTML='';return;}\r\n  qci.innerHTML='<div class=\"qs-t\" style=\"margin-bottom:10px;padding-top:4px\">Ihre Konfigurationen ('+cart.length+')<\/div>'+cart.map(c=>`\r\n    <div class=\"qsum\" style=\"border-left:3px solid var(--br)\">\r\n      <div class=\"qs-t\">${c.label}<\/div>\r\n      <div class=\"qs-m\">${c.model}<\/div>\r\n      <div class=\"qs-g\">\r\n        <div class=\"qs-i\"><span style=\"font-size:15px;font-weight:700;color:var(--t1);min-width:70px;flex-shrink:0\">${c.target} m<\/span><span>Erforderliche L\u00e4nge<\/span><\/div>\r\n        ${c.exactOpt&&c.exactOpt.modules?\r\n          c.exactOpt.modules.map(m=>`<div class=\"qs-i\"><span style=\"font-size:15px;font-weight:700;color:var(--t1);min-width:70px;flex-shrink:0\">${m.qty}\u00d7<\/span><span>${m.name}<\/span><\/div>`).join('')+\r\n          `<div class=\"qs-i\"><span style=\"font-size:15px;font-weight:700;color:var(--t1);min-width:70px;flex-shrink:0\">${c.total}<\/span><span>Gesamtsumme (exakte Passform)<\/span><\/div>`\r\n          :`<div class=\"qs-i\"><span style=\"font-size:15px;font-weight:700;color:var(--t1);min-width:70px;flex-shrink:0\">${c.total}<\/span><span>Gesamtanzahl Module<\/span><\/div>`}\r\n        <div class=\"qs-i\"><span style=\"font-size:15px;font-weight:700;color:var(--t1);min-width:70px;flex-shrink:0\">${c.totalKg} kg<\/span><span>Gesamtgewicht<\/span><\/div>\r\n        ${c.sections.length>1?`<div class=\"qs-i\"><span style=\"font-size:15px;font-weight:700;color:var(--t1);min-width:70px;flex-shrink:0\">${c.sections.length}<\/span><span>Abschnitte<\/span><\/div>`:''}\r\n      <\/div>\r\n      <div class=\"qs-c\">${c.codes.join(' \u00b7 ')}<\/div>\r\n    <\/div>\r\n  `).join('');\r\n}\r\n\r\nfunction resetConfig(){\r\n  _lastCalc=null;\r\n  exactOptUserSelected=false;bestExactOpt=null;_exactOpts=[];\r\n  cart=[];\r\n  sel='T';selV=0;\r\n  ['T','S','D'].forEach(x=>document.getElementById('sb-'+x).classList.toggle('active',x==='T'));\r\n  sections=[{id:secNextId++,len:0}];activeSec=0;\r\n  document.getElementById('f-cin').value=0;\r\n  document.getElementById('f-cout').value=0;\r\n  document.getElementById('f-el').value=0;\r\n  document.getElementById('f-er').value=0;\r\n  document.getElementById('f-wl').value=0;\r\n  document.getElementById('f-wr').value=0;\r\n  coutType='modules';\r\n  setSituation('90');\r\n  \/\/ Clear map drawings if map has been initialised\r\n  if(ewMap){\r\n    mapCurrentPoints=[];\r\n    mapCurrentMarkers.forEach(m=>ewMap.removeLayer(m));mapCurrentMarkers=[];\r\n    if(mapCurrentPolyline){ewMap.removeLayer(mapCurrentPolyline);mapCurrentPolyline=null;}\r\n    if(mapCurrentPreview){ewMap.removeLayer(mapCurrentPreview);mapCurrentPreview=null;}\r\n    mapShapes.forEach(s=>s.layers.forEach(l=>ewMap.removeLayer(l)));mapShapes=[];\r\n    const cp=document.getElementById('map-close-popup');if(cp)cp.style.display='none';\r\n    const db=document.getElementById('map-drawing-btns');if(db)db.style.display='none';\r\n    const ib=document.getElementById('map-import-bar');if(ib)ib.classList.add('hidden');\r\n  }\r\n  document.getElementById('map-imported-note').style.display='none';\r\n  \/\/ Reset map search\r\n  const msi=document.getElementById('map-search-input');if(msi)msi.value='';\r\n  const msr=document.getElementById('map-search-results');if(msr)msr.style.display='none';\r\n  renderH();renderSections();updateAvail();renderCart();\r\n  \/\/ Clear quote summary\r\n  const qsg=document.getElementById('qs-grid');if(qsg)qsg.innerHTML='';\r\n  const qsc=document.getElementById('qs-codes');if(qsc)qsc.textContent='';\r\n  const qsm=document.getElementById('qs-model');if(qsm)qsm.textContent='\u2013';\r\n  const qci=document.getElementById('quote-cart-items');if(qci)qci.innerHTML='';\r\n  document.getElementById('quote-single-config').style.display='block';\r\n  calc();\r\n  window.scrollTo({top:0,behavior:'smooth'});\r\n}\r\n\r\nfunction scrollToQuote(){\r\n  document.getElementById('quote-section').scrollIntoView({behavior:'smooth',block:'start'});\r\n}\r\n\r\n\r\n\/\/ \u2500\u2500 QUOTE \/ EMAIL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nlet urgency='', siteAddress='', geoLat=null, geoLng=null;\r\n\r\nfunction setUrg(u){\r\n  urgency=u;\r\n  ['asap','weeks','exploring'].forEach(x=>document.getElementById('urg-'+x).classList.toggle('active',x===u));\r\n}\r\n\r\nfunction onLocationInput(){\r\n  siteAddress=document.getElementById('q-address').value.trim();\r\n}\r\n\r\nfunction useGPS(){\r\n  if(!navigator.geolocation){alert('Standortzugriff wird von diesem Browser nicht unterst\u00fctzt.');return;}\r\n  navigator.geolocation.getCurrentPosition(pos=>{\r\n    geoLat=pos.coords.latitude;geoLng=pos.coords.longitude;\r\n    const s=geoLat.toFixed(5)+', '+geoLng.toFixed(5);\r\n    const coordEl=document.getElementById('coords');\r\n    coordEl.textContent='\ud83d\udccd '+s+' (GPS)';coordEl.style.display='block';\r\n    siteAddress=s;\r\n    const addrInput=document.getElementById('q-address');\r\n    if(addrInput&&!addrInput.value)addrInput.value=s;\r\n  },()=>alert('Ihr Standort konnte nicht ermittelt werden. Bitte geben Sie ihn manuell ein.'));\r\n}\r\n\r\nfunction onNotesChange(){\/* live \u2014 body assembled on send *\/}\r\n\r\nfunction addToQuoteAndAnother(){\r\n  addToQuote();\r\n  \/\/ Only reset the calculator inputs \u2014 keep the cart intact\r\n  _lastCalc=null;\r\n  exactOptUserSelected=false;bestExactOpt=null;_exactOpts=[];\r\n  sel='T';selV=0;\r\n  ['T','S','D'].forEach(x=>document.getElementById('sb-'+x).classList.toggle('active',x==='T'));\r\n  sections=[{id:secNextId++,len:0}];activeSec=0;\r\n  document.getElementById('f-cin').value=0;\r\n  document.getElementById('f-cout').value=0;\r\n  document.getElementById('f-el').value=0;\r\n  document.getElementById('f-er').value=0;\r\n  document.getElementById('f-wl').value=0;\r\n  document.getElementById('f-wr').value=0;\r\n  coutType='modules';\r\n  \/\/ Clear map drawings so they don't carry over to the next configuration\r\n  if(ewMap){\r\n    mapCurrentPoints=[];\r\n    mapCurrentMarkers.forEach(m=>ewMap.removeLayer(m));mapCurrentMarkers=[];\r\n    if(mapCurrentPolyline){ewMap.removeLayer(mapCurrentPolyline);mapCurrentPolyline=null;}\r\n    if(mapCurrentPreview){ewMap.removeLayer(mapCurrentPreview);mapCurrentPreview=null;}\r\n    mapShapes.forEach(s=>s.layers.forEach(l=>ewMap.removeLayer(l)));mapShapes=[];\r\n    const cp=document.getElementById('map-close-popup');if(cp)cp.style.display='none';\r\n    const db=document.getElementById('map-drawing-btns');if(db)db.style.display='none';\r\n    const ib=document.getElementById('map-import-bar');if(ib)ib.classList.add('hidden');\r\n    mapSetMode('draw'); \/\/ reset to draw mode ready for next run\r\n  }\r\n  document.getElementById('map-imported-note').style.display='none';\r\n  const msi=document.getElementById('map-search-input');if(msi)msi.value='';\r\n  \/\/ Collapse map panel so user starts fresh from the top\r\n  const mp=document.getElementById('map-panel');if(mp)mp.classList.remove('open');\r\n  const mb=document.getElementById('map-mode-map');if(mb)mb.classList.remove('active');\r\n  const mm=document.getElementById('map-mode-manual');if(mm)mm.classList.add('active');\r\n  renderH();renderSections();updateAvail();\r\n  calc();\r\n  window.scrollTo({top:0,behavior:'smooth'});\r\n}\r\n\r\nfunction addToQuoteAndFinish(){\r\n  addToQuote();\r\n  scrollToQuote();\r\n}\r\n\r\nfunction getEasyWallEmailBody(){\r\n  if(!_lastCalc&&!cart.length)return'[Noch keine Konfiguration berechnet]';\r\n  const today=new Date().toLocaleDateString('de-DE',{day:'2-digit',month:'2-digit',year:'numeric'});\r\n  const userNotes=(document.getElementById('q-notes')||{}).value||'';\r\n  const addrVal=((document.getElementById('q-address')||{}).value||'').trim()||siteAddress;\r\n  const urgLabels={asap:'DRINGEND \u2014 So schnell wie m\u00f6glich',weeks:'Innerhalb weniger Wochen',exploring:'Nur zur Information \u2014 noch kein festes Datum'};\r\n  const lines=[];\r\n  lines.push('EasyWall Rechner \u00b7 '+today,'');\r\n  if(urgency)lines.push('ZEITPLAN: '+(urgLabels[urgency]||urgency),'');\r\n  if(addrVal)lines.push('STANDORT: '+addrVal,'');\r\n\r\n  if(cart.length>0){\r\n    lines.push('KONFIGURATIONEN ('+cart.length+' gesamt)');\r\n    cart.forEach((c,i)=>{\r\n      lines.push('');\r\n      lines.push((i+1)+'. '+c.label);\r\n      lines.push('  Modell: '+c.model);\r\n      lines.push('  Erforderliche L\u00e4nge: '+c.target+' m');\r\n      if(c.sections&&c.sections.length>1)lines.push('  Abschnitte ('+c.sections.length+'): '+c.sections.map((s,j)=>'S'+(j+1)+': '+s.len+'m').join(', '));\r\n      if(c.exactOpt&&c.exactOpt.modules){\r\n        \/\/ Saved with exact fit \u2014 list exact modules\r\n        lines.push('  Konfiguration: exakte Passform \u2014 '+c.exactOpt.label);\r\n        lines.push('  MODULE (EXAKTE PASSFORM)');\r\n        c.exactOpt.modules.forEach(m=>{\r\n          const codeClean=m.code?m.code.replace(\/<[^>]+>\/g,''):'';\r\n          const noteClean=m.note?m.note.replace(\/<[^>]+>\/g,''):'';\r\n          lines.push('    '+m.qty+'\u00d7 '+m.name+(codeClean?' ('+codeClean+')':'')+(noteClean?' \u2014 '+noteClean:''));\r\n        });\r\n        const termPcs=c.exactOpt.modules.reduce((s,m)=>s+(m.qty||0),0);\r\n        lines.push('  Gesamtsumme: '+(termPcs+c.accPcs)+' Stk. \u00b7 '+c.totalKg+' kg');\r\n      } else {\r\n        \/\/ Standard fit\r\n        lines.push('  Gesamtanzahl Module: '+c.total+' Stk. \u00b7 '+c.totalKg+' kg');\r\n        lines.push('  Produktcodes: '+c.codes.join(' \u00b7 '));\r\n      }\r\n    });\r\n    const totalPcs=cart.reduce((s,c)=>s+c.total,0);\r\n    const totalKg=Math.round(cart.reduce((s,c)=>s+c.totalKg,0)*10)\/10;\r\n    lines.push('','GESAMTSUMME: '+totalPcs+' Stk. \u00b7 '+totalKg+' kg');\r\n  } else if(_lastCalc){\r\n    const lc=_lastCalc;\r\n    const v=lc.v;\r\n    lines.push('MODELL');\r\n    lines.push('  '+MODELS[sel].label+' \u00b7 '+v.name+' \u00b7 '+v.prot+' cm Schutz','');\r\n    lines.push('L\u00c4NGEN');\r\n    lines.push('  Erforderlich: '+lc.target+' m');\r\n    if(lc.sections&&lc.sections.length>1)lines.push('  Abschnitte ('+lc.sections.length+'): '+lc.sections.map((s,i)=>'S'+(i+1)+': '+s.len+'m').join(', '));\r\n\r\n    if(exactOptUserSelected&&bestExactOpt&&bestExactOpt.modules){\r\n      \/\/ Exact fit selected \u2014 list modules from the recommendation\r\n      lines.push('  Konfiguration f\u00fcr exakte Passform: '+bestExactOpt.label,'');\r\n      lines.push('MODULE (EXAKTE PASSFORM)');\r\n      bestExactOpt.modules.forEach(m=>{\r\n        const codeClean=m.code?m.code.replace(\/<[^>]+>\/g,''):'';\r\n        const noteClean=m.note?m.note.replace(\/<[^>]+>\/g,''):'';\r\n        lines.push('  '+m.qty+'\u00d7 '+m.name+(codeClean?' ('+codeClean+')':'')+(noteClean?' \u2014 '+noteClean:''));\r\n      });\r\n      if(lc.cin>0)lines.push('  Innenecke: '+lc.inPcs+' Stk. ('+v.c.ci+')');\r\n      if(lc.cout>0)lines.push('  Au\u00dfenecke: '+lc.outPcs+' Stk. ('+v.c.co+')');\r\n      const termPcs=bestExactOpt.modules.reduce((s,m)=>s+(m.qty||0),0);\r\n      lines.push('  Gesamtsumme: '+(termPcs+lc.accPcs)+' Stk.');\r\n    } else {\r\n      lines.push('  Gerade Abdeckung: '+lc.actualLen+' m');\r\n      if(lc.accLen&&lc.accLen>0)lines.push('  Gesamt inkl. Zubeh\u00f6r: '+lc.totalLen+' m');\r\n      lines.push('');\r\n      lines.push('MODULE');\r\n      lines.push('  Gerade: '+lc.nStd+' Stk. ('+v.c.st+')');\r\n      if(lc.cin>0)lines.push('  Innenecke: '+lc.inPcs+' Stk. ('+v.c.ci+')');\r\n      if(lc.cout>0)lines.push('  Au\u00dfenecke: '+lc.outPcs+' Stk. ('+v.c.co+')');\r\n      if(lc.el>0)lines.push('  Ende \u2013 links: '+lc.el+' Stk. ('+v.c.el+')');\r\n      if(lc.er>0)lines.push('  Ende \u2013 rechts: '+lc.er+' Stk. ('+v.c.er+')');\r\n      if(lc.ael>0&&v.adjEnd)lines.push('  Ende \u2013 verstellb. links: '+lc.ael+' Stk. ('+v.adjEnd.cL+')');\r\n      if(lc.aer>0&&v.adjEnd)lines.push('  Ende \u2013 verstellb. rechts: '+lc.aer+' Stk. ('+v.adjEnd.cR+')');\r\n      if(lc.wl>0&&v.c.wl)lines.push('  Wandanschluss \u2013 links: '+lc.wl+' Stk. ('+v.c.wl+')');\r\n      if(lc.wr>0&&v.c.wr)lines.push('  Wandanschluss \u2013 rechts: '+lc.wr+' Stk. ('+v.c.wr+')');\r\n      lines.push('  Gesamtsumme: '+lc.total+' Stk.');\r\n      lines.push('');\r\n      lines.push('Produktcodes: '+lc.codes.join(' \u00b7 '));\r\n    }\r\n  }\r\n  lines.push('');\r\n  return lines.join('\\n');\r\n}\r\n\r\nfunction sendEasyWallEmail(){\r\n  if(!_lastCalc&&!cart.length)\r\n\treturn'[Noch keine Konfiguration berechnet]';\r\n\t\r\n\t\r\n\t       \r\n\t  const summary = getEasyWallEmailBody();\r\n\t  if (!summary) return;\r\n\r\n\t  const formField = document.getElementById('calc_summary');     \/\/ hidden field inside Elementor form\r\n\t  const formSection = document.getElementById('send-to-nofloods'); \/\/ Elementor form wrapper section\r\n\r\n\r\n\r\n\t  \/\/ Fill hidden form field\r\n\t  if (formField) formField.value = summary;\r\n\r\n\t  \/\/ Reveal the hidden Elementor section (if it\u2019s hidden)\r\n\t  if (formSection) {\r\n\t\tformSection.style.display = 'block';\r\n\t\trequestAnimationFrame(() => {\r\n\t\t  formSection.style.opacity = '1';\r\n\t\t  formSection.style.transition = 'opacity 0.4s ease';\r\n\t\t});\r\n\t  }\r\n\r\n\t  \/\/ Smooth scroll to form\r\n\t  if (formSection) {\r\n\t\tformSection.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n\t  }\r\n}\r\n\r\nfunction copyEasyWallQuote(){\r\n  const text=getEasyWallEmailBody();\r\n  const btn=document.getElementById('copy-quote-btn');\r\n  const reset=()=>{if(btn){btn.innerHTML='<svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\"><rect x=\"5\" y=\"5\" width=\"10\" height=\"10\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><path d=\"M3 11H2a1 1 0 01-1-1V2a1 1 0 011-1h8a1 1 0 011 1v1\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><\/svg> Text kopieren (Alternative)';btn.classList.remove('copied');}};\r\n  const done=()=>{if(btn){btn.textContent='\u2713 In die Zwischenablage kopiert';btn.classList.add('copied');setTimeout(reset,2500);}};\r\n  navigator.clipboard?navigator.clipboard.writeText(text).then(done).catch(()=>{const ta=document.createElement('textarea');ta.value=text;document.body.appendChild(ta);ta.select();document.execCommand('copy');document.body.removeChild(ta);done();}):(() =>{const ta=document.createElement('textarea');ta.value=text;document.body.appendChild(ta);ta.select();document.execCommand('copy');document.body.removeChild(ta);done();})();\r\n}\r\n\r\n\/\/ \u2500\u2500 INIT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nsetSeries('T');document.getElementById('sb-T').classList.add('active');renderSections();setLang('de');\r\n\r\n\r\nfunction resetEverything() {\r\n  const hasData = cart.length > 0 \r\n    || sections.some(s => s.len > 0) \r\n    || (document.getElementById('q-notes') && document.getElementById('q-notes').value.trim());\r\n\r\n  if (hasData && !confirm('Dies wird Ihre gesamte Konfiguration, den Warenkorb und die Angebotsdetails l\u00f6schen. Sind Sie sicher, dass Sie von vorne beginnen m\u00f6chten?')) {\r\n    return;\r\n  }\r\n\r\n  \/\/ Full calculator + cart + map reset (series, height, sections, corners, ends, walls)\r\n  resetConfig(); \/\/ already calls setSituation('90') internally, so sit-90 etc. are already correct here\r\n\r\n  \/\/ Angle-mode fields aren't touched by resetConfig() \u2014 clear them manually.\r\n  \/\/ (Deliberately not calling setAdir() here, same as before, to avoid an unwanted calcAngle() trigger.)\r\n  angleDir = 'out';\r\n  document.getElementById('adir-in').classList.remove('active');\r\n  document.getElementById('adir-out').classList.add('active');\r\n  const fAngle = document.getElementById('f-angle');\r\n  if (fAngle) { fAngle.value = 90; fAngle.disabled = false; }\r\n  document.getElementById('corner-fb-angle').style.display = 'none';\r\n  \/\/ corner-fb-count is already hidden by resetConfig() \u2192 updateCornerFeedback()\r\n\r\n  \/\/ End module type \u2192 Standard\r\n  setEndTypeAll('std', true);\r\n\r\n  \/\/ Outward-corner type (T100\/T120) \u2192 default (22.5\u00b0 modules)\r\n  setCoutType('modules');\r\n\r\n  \/\/ Always land back on the Standard fit tab\r\n  switchTab('std');\r\n\r\n  \/\/ Quote form: urgency, location, notes\r\n  urgency = '';\r\n  ['asap', 'weeks', 'exploring'].forEach(x => {\r\n    const b = document.getElementById('urg-' + x);\r\n    if (b) b.classList.remove('active');\r\n  });\r\n  siteAddress = ''; geoLat = null; geoLng = null;\r\n  const addrInput = document.getElementById('q-address');\r\n  if (addrInput) addrInput.value = '';\r\n  const coordsEl = document.getElementById('coords');\r\n  if (coordsEl) { coordsEl.style.display = 'none'; coordsEl.textContent = ''; }\r\n  const notesEl = document.getElementById('q-notes');\r\n  if (notesEl) notesEl.value = '';\r\n\r\n  \/\/ Copy-to-clipboard button back to its default state\r\n  const copyBtn = document.getElementById('copy-quote-btn');\r\n  if (copyBtn) {\r\n    copyBtn.innerHTML = '<svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\"><rect x=\"5\" y=\"5\" width=\"10\" height=\"10\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><path d=\"M3 11H2a1 1 0 01-1-1V2a1 1 0 011-1h8a1 1 0 011 1v1\" stroke=\"currentColor\" stroke-width=\"1.3\"\/><\/svg> Text kopieren (Alternative)';\r\n    copyBtn.classList.remove('copied');\r\n  }\r\n\r\n  \/\/ Close any open info popovers\r\n  const exactPop = document.getElementById('exact-info-popover');\r\n  if (exactPop) exactPop.style.display = 'none';\r\n  ['end-info-popover', 'wall-info-popover'].forEach(id => {\r\n    const el = document.getElementById(id);\r\n    if (el) el.remove();\r\n  });\r\n}\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d7fb48f elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile e-flex e-con-boxed e-con e-parent\" data-id=\"d7fb48f\" data-element_type=\"container\" data-e-type=\"container\" id=\"send-to-nofloods\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-62cf258 elementor-widget__width-inherit elementor-widget elementor-widget-heading\" data-id=\"62cf258\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Haben Sie Ihre Berechnung abgeschlossen? Fordern Sie jetzt Ihr sofortiges Angebot f\u00fcr HOCHWASSERSCHUTZ an <\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e3f9a2d elementor-widget elementor-widget-text-editor\" data-id=\"e3f9a2d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tGeben Sie unten die Ergebnisse Ihres Rechners ein, und unser Team wird Ihnen ein individuelles Angebot zukommen lassen.\nSollten Sie standortspezifische Anliegen haben, f\u00fcgen Sie bitte Fotos, Karten oder anderes relevantes Material bei \u2013 unser Team wird alles pr\u00fcfen und sich so schnell wie m\u00f6glich mit Ihrem individuellen Angebot und unseren Empfehlungen bei Ihnen melden.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c0a1ce3 elementor-widget elementor-widget-shortcode\" data-id=\"c0a1ce3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n<div class=\"wpcf7 no-js\" id=\"wpcf7-f42013-o1\" lang=\"de-DE\" dir=\"ltr\" data-wpcf7-id=\"42013\">\n<div class=\"screen-reader-response\"><p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/p> <ul><\/ul><\/div>\n<form action=\"\/de\/wp-json\/wp\/v2\/pages\/42006#wpcf7-f42013-o1\" method=\"post\" class=\"wpcf7-form init\" aria-label=\"Kontaktformular\" novalidate=\"novalidate\" data-status=\"init\">\n<fieldset class=\"hidden-fields-container\"><input type=\"hidden\" name=\"_wpcf7\" value=\"42013\" \/><input type=\"hidden\" name=\"_wpcf7_version\" value=\"6.1.7\" \/><input type=\"hidden\" name=\"_wpcf7_locale\" value=\"de_DE\" \/><input type=\"hidden\" name=\"_wpcf7_unit_tag\" value=\"wpcf7-f42013-o1\" \/><input type=\"hidden\" name=\"_wpcf7_container_post\" value=\"0\" \/><input type=\"hidden\" name=\"_wpcf7_posted_data_hash\" value=\"\" \/><input type=\"hidden\" name=\"_wpcf7cf_hidden_group_fields\" value=\"[]\" \/><input type=\"hidden\" name=\"_wpcf7cf_hidden_groups\" value=\"[]\" \/><input type=\"hidden\" name=\"_wpcf7cf_visible_groups\" value=\"[]\" \/><input type=\"hidden\" name=\"_wpcf7cf_repeaters\" value=\"[]\" \/><input type=\"hidden\" name=\"_wpcf7cf_steps\" value=\"{}\" \/><input type=\"hidden\" name=\"_wpcf7cf_options\" value=\"{&quot;form_id&quot;:42013,&quot;conditions&quot;:[],&quot;settings&quot;:{&quot;animation&quot;:&quot;yes&quot;,&quot;animation_intime&quot;:&quot;200&quot;,&quot;animation_outtime&quot;:&quot;200&quot;,&quot;conditions_ui&quot;:&quot;normal&quot;,&quot;notice_dismissed&quot;:&quot;&quot;,&quot;repeater_remove_button&quot;:&quot;bottom&quot;}}\" \/><input type=\"hidden\" name=\"_wpcf7_recaptcha_response\" value=\"\" \/>\n<\/fieldset>\n<div class=\"uacf7-form-wrapper-container uacf7-form-42013  \"><label>Berechnete Konfiguration\n    <span class=\"wpcf7-form-control-wrap\" data-name=\"calc_summary\"><textarea cols=\"40\" rows=\"10\" maxlength=\"2000\" class=\"wpcf7-form-control wpcf7-textarea wpcf7-validates-as-required\" id=\"calc_summary\" readonly=\"readonly\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Bitte f\u00fcllen Sie das Feld zun\u00e4chst mithilfe des Rechners aus\" name=\"calc_summary\"><\/textarea><\/span> <\/label>\n\n\n<div class=\"uacf7-row\"><div class=\"uacf7-col-6\"> <label>  Ihr Name*\n    <span class=\"wpcf7-form-control-wrap\" data-name=\"your-name\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" autocomplete=\"name\" aria-required=\"true\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"your-name\" \/><\/span> <\/label> <\/div><div class=\"uacf7-col-6\"> <label> Ihre E-Mail-Adresse\n    <span class=\"wpcf7-form-control-wrap\" data-name=\"your-email\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-email wpcf7-validates-as-required wpcf7-text wpcf7-validates-as-email\" autocomplete=\"email\" aria-required=\"true\" aria-invalid=\"false\" value=\"\" type=\"email\" name=\"your-email\" \/><\/span> <\/label> <\/div><\/div>\n\n<div class=\"uacf7-row\"><div class=\"uacf7-col-6\"> <label>  Telefon*\n    <span class=\"wpcf7-form-control-wrap\" data-name=\"your-phone\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-tel wpcf7-validates-as-required wpcf7-text wpcf7-validates-as-tel\" autocomplete=\"tel\" aria-required=\"true\" aria-invalid=\"false\" value=\"\" type=\"tel\" name=\"your-phone\" \/><\/span> <\/label> <\/div><div class=\"uacf7-col-6\"> <label>  Bevorzugte Sprache  <span class=\"wpcf7-form-control-wrap\" data-name=\"select-383\"><select class=\"wpcf7-form-control wpcf7-select\" aria-invalid=\"false\" name=\"select-383\"><option value=\"Englisch\">Englisch<\/option><option value=\"Franz\u00f6sisch\">Franz\u00f6sisch<\/option><option value=\"Deutsch\">Deutsch<\/option><option value=\"Spanisch\">Spanisch<\/option><option value=\"D\u00e4nisch\">D\u00e4nisch<\/option><option value=\"Italienisch\">Italienisch<\/option><\/select><\/span>\n<\/div><\/div>\n\n <label> Fotos der Baustelle hochladen [ <\/label><span class=\"wpcf7-form-control-wrap\" data-name=\"mfile-274\"><input size=\"40\" class=\"wpcf7-form-control wpcf7-drag-n-drop-file d-none\" aria-invalid=\"false\" type=\"file\" multiple=\"multiple\" data-name=\"mfile-274\" data-type=\"jpeg|png|jpg|pdf|docx|xlxs\" data-limit=\"10485760\" data-id=\"42013\" data-version=\"free version 1.4.0\" accept=\".jpeg, .png, .jpg, .pdf, .docx, .xlxs\" data-black-list=\"js|php|phtml|php3|php4|php5|php7|phps|phar|mjs|cjs|exe|bat|cmd|sh|bash|pl|py|rb|msi|vbs|vbe|jse|wsf|wsh|ps1|psm1|psd1|hta|scr|cpl|com|gadget|jar|html|htm|xhtml|svg|xml|swf|htaccess|htpasswd|user.ini|web.config|lng|reg|inf|chm|hlp|ws|bat|inc|asp|aspx|axd|asx|asmx|ashx|cgi|jsp|jspx|do|cfm|cfc|dll|sys|drv|ocx|so|elf|bin\" \/><\/span>\n\n<label> Erl\u00e4uterung\/Kommentar\n    <span class=\"wpcf7-form-control-wrap\" data-name=\"your-message\"><textarea cols=\"40\" rows=\"3\" maxlength=\"2000\" class=\"wpcf7-form-control wpcf7-textarea\" aria-invalid=\"false\" name=\"your-message\"><\/textarea><\/span> <\/label>\n\n<input class=\"wpcf7-form-control wpcf7-submit has-spinner\" type=\"submit\" value=\"Senden\" \/><\/div><input type=\"text\" class=\"wpcf7_hp_field\" name=\"wpcf7_hp_field\" value=\"\" tabindex=\"-1\" autocomplete=\"off\" \/><div class=\"wpcf7-response-output\" aria-hidden=\"true\"><\/div>\n<\/form>\n<\/div>\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>EasyWall-Hochwasserschutzbarrieren \u2013 Modulrechner Startseite &gt; Page Planen Sie Ihre EasyWall-Absperrung ganz einfach Mit unserem Rechner k\u00f6nnen Sie ganz einfach die [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-42006","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>EasyWall-Rechner - NoFloods<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nofloods.com\/de\/easywall-rechner\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"EasyWall-Rechner - NoFloods\" \/>\n<meta property=\"og:description\" content=\"EasyWall-Hochwasserschutzbarrieren \u2013 Modulrechner Startseite &gt; Page Planen Sie Ihre EasyWall-Absperrung ganz einfach Mit unserem Rechner k\u00f6nnen Sie ganz einfach die [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nofloods.com\/de\/easywall-rechner\/\" \/>\n<meta property=\"og:site_name\" content=\"NoFloods\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/environmentsolutions\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-04T08:35:32+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@NoFloodsBarrier\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data1\" content=\"8\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nofloods.com\\\/de\\\/easywall-rechner\\\/\",\"url\":\"https:\\\/\\\/nofloods.com\\\/de\\\/easywall-rechner\\\/\",\"name\":\"EasyWall-Rechner - NoFloods\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nofloods.com\\\/#website\"},\"datePublished\":\"2026-03-30T16:00:09+00:00\",\"dateModified\":\"2026-09-04T08:35:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nofloods.com\\\/de\\\/easywall-rechner\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nofloods.com\\\/de\\\/easywall-rechner\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nofloods.com\\\/de\\\/easywall-rechner\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nofloods.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"EasyWall-Rechner\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nofloods.com\\\/#website\",\"url\":\"https:\\\/\\\/nofloods.com\\\/\",\"name\":\"NoFloods\",\"description\":\"By Environment Solutions\",\"publisher\":{\"@id\":\"https:\\\/\\\/nofloods.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nofloods.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/nofloods.com\\\/#organization\",\"name\":\"NoFloods\",\"url\":\"https:\\\/\\\/nofloods.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/nofloods.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/nofloods.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/NoFloods-EasyWall-Logo.webp?wsr\",\"contentUrl\":\"https:\\\/\\\/nofloods.com\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/NoFloods-EasyWall-Logo.webp?wsr\",\"width\":340,\"height\":70,\"caption\":\"NoFloods\"},\"image\":{\"@id\":\"https:\\\/\\\/nofloods.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/environmentsolutions\\\/\",\"https:\\\/\\\/x.com\\\/NoFloodsBarrier\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/environment-solutions-aps\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"EasyWall-Rechner - NoFloods","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nofloods.com\/de\/easywall-rechner\/","og_locale":"de_DE","og_type":"article","og_title":"EasyWall-Rechner - NoFloods","og_description":"EasyWall-Hochwasserschutzbarrieren \u2013 Modulrechner Startseite &gt; Page Planen Sie Ihre EasyWall-Absperrung ganz einfach Mit unserem Rechner k\u00f6nnen Sie ganz einfach die [&hellip;]","og_url":"https:\/\/nofloods.com\/de\/easywall-rechner\/","og_site_name":"NoFloods","article_publisher":"https:\/\/www.facebook.com\/environmentsolutions\/","article_modified_time":"2026-09-04T08:35:32+00:00","twitter_card":"summary_large_image","twitter_site":"@NoFloodsBarrier","twitter_misc":{"Gesch\u00e4tzte Lesezeit":"8\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/nofloods.com\/de\/easywall-rechner\/","url":"https:\/\/nofloods.com\/de\/easywall-rechner\/","name":"EasyWall-Rechner - NoFloods","isPartOf":{"@id":"https:\/\/nofloods.com\/#website"},"datePublished":"2026-03-30T16:00:09+00:00","dateModified":"2026-09-04T08:35:32+00:00","breadcrumb":{"@id":"https:\/\/nofloods.com\/de\/easywall-rechner\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nofloods.com\/de\/easywall-rechner\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nofloods.com\/de\/easywall-rechner\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nofloods.com\/de\/"},{"@type":"ListItem","position":2,"name":"EasyWall-Rechner"}]},{"@type":"WebSite","@id":"https:\/\/nofloods.com\/#website","url":"https:\/\/nofloods.com\/","name":"NoFloods","description":"By Environment Solutions","publisher":{"@id":"https:\/\/nofloods.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nofloods.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/nofloods.com\/#organization","name":"NoFloods","url":"https:\/\/nofloods.com\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/nofloods.com\/#\/schema\/logo\/image\/","url":"https:\/\/nofloods.com\/wp-content\/uploads\/2025\/05\/NoFloods-EasyWall-Logo.webp?wsr","contentUrl":"https:\/\/nofloods.com\/wp-content\/uploads\/2025\/05\/NoFloods-EasyWall-Logo.webp?wsr","width":340,"height":70,"caption":"NoFloods"},"image":{"@id":"https:\/\/nofloods.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/environmentsolutions\/","https:\/\/x.com\/NoFloodsBarrier","https:\/\/www.linkedin.com\/company\/environment-solutions-aps"]}]}},"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"nofloods_admin","author_link":"https:\/\/nofloods.com\/de\/author\/nofloods_admin\/"},"rttpg_comment":0,"rttpg_category":" <a href=\"https:\/\/nofloods.com\/de\/?taxonomy=translation_priority&#038;term=optional-de\" rel=\"tag\">Optional<\/a>","rttpg_excerpt":"EasyWall-Hochwasserschutzbarrieren \u2013 Modulrechner Startseite &gt; Page Planen Sie Ihre EasyWall-Absperrung ganz einfach Mit unserem Rechner k\u00f6nnen Sie ganz einfach die [&hellip;]","_links":{"self":[{"href":"https:\/\/nofloods.com\/de\/wp-json\/wp\/v2\/pages\/42006","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nofloods.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/nofloods.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/nofloods.com\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nofloods.com\/de\/wp-json\/wp\/v2\/comments?post=42006"}],"version-history":[{"count":4,"href":"https:\/\/nofloods.com\/de\/wp-json\/wp\/v2\/pages\/42006\/revisions"}],"predecessor-version":[{"id":42012,"href":"https:\/\/nofloods.com\/de\/wp-json\/wp\/v2\/pages\/42006\/revisions\/42012"}],"wp:attachment":[{"href":"https:\/\/nofloods.com\/de\/wp-json\/wp\/v2\/media?parent=42006"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}