{"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-25T12:20:04","modified_gmt":"2026-09-25T12:20:04","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}\r\n\r\n.calc{max-width:100%;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:inherit;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:inherit}\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:inherit;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:inherit;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:inherit;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:inherit}\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-template-columns:repeat(3,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:inherit;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:inherit;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:inherit;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:inherit;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:inherit;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:inherit;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:inherit;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:inherit;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:inherit;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:inherit;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:inherit;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:inherit;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:inherit;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:inherit;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:inherit}\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.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:inherit;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:inherit;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<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 Wasserdichtigkeit. 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 Schotter, Erde &amp; gemischtes Gel\u00e4nde. Nicht in USA, UK, IE, CA &amp; QA verf\u00fcgbar.<\/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 w\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\">L\u00e4nge der Barriere &amp; Zubeh\u00f6r<\/div><\/div>\r\n  <div class=\"ss\" data-t=\"s3sub\">Geben Sie unten Ihre geraden Strecken und das 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\">Wie Sie Ihren Standort messen<\/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\">Nur gerade Abschnitte messen.<\/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\">Leichte Kurven (wenige Grad pro Verbindung) ben\u00f6tigen keine Eckmodule \u2014 verbinden Sie die Module einfach in einem leichten Bogen. Die S-Serie bew\u00e4ltigt konstruktionsbedingt 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 gegen eine Wand verl\u00e4uft, 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 kommen mit unebenem Boden zurecht \u2014 eine abnehmbare Membran kann jedem Modell hinzugef\u00fcgt werden. Bei der D-Serie ist sie 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 bei der installierten L\u00e4nge ein.<\/strong> <span data-t=\"g5b\">Der Rechner verwendet die NoFloods-Rate von Modulen pro Meter f\u00fcr jedes Modell, um Ihnen die richtige Anzahl an Modulen zu nennen. Je nach Bodenbeschaffenheit und Installationswinkel ist eine Abweichung von \u00b12\u20133% in der endg\u00fcltig installierten L\u00e4nge zu erwarten.<\/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\" style=\"background:var(--okb);color:var(--ok);\">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. Verwenden Sie dies, wenn Sie bereits Messungen 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 bewegen<\/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;display:none;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 beenden<\/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 Messungen 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 setzen. Klicken Sie anschlie\u00dfend auf \"Diese Messungen verwenden\".<\/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 Adresse im Feld <strong>Standort der Anlage<\/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 der 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 beenden \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          Messungen von 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; von vorn beginnen<\/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\">Kurven &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\">Leichte 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\u00dfeneckentyp:<\/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-Kurve. Kein anderer Au\u00dfenwinkel ist 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 leichte 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 Kurvenwinkel ein. Der Rechner ermittelt, 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 Kurvenwinkel<\/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\">Kurvenrichtung<\/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=\"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        <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\">Standardpassform<\/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 die exakte Passform verwendet wird\">? 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 die exakte Passform verwendet wird<\/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>Standardpassform<\/strong> ist f\u00fcr die meisten Installationen richtig. Sie gibt Ihnen die korrekte Anzahl von Modulen \u2014 das letzte kann ein paar Zentimeter \u00fcber Ihr Ziel hinausragen, was f\u00fcr offene Strecken v\u00f6llig in Ordnung ist.<\/p>\r\n      <p style=\"margin-bottom:8px\"><strong>Nutzen Sie die exakte Passform, wenn<\/strong> Ihre Barriere b\u00fcndig an einer Wand, einem Pfosten oder einem anderen festen Hindernis abschlie\u00dfen 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, auf was 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. Sie stellen es vor Ort ein.<\/li>\r\n        <li><strong>Verstellbares Endmodul<\/strong> (nur T50) \u2014 verschiebbar zwischen 44\u201352 cm. Wird f\u00fcr mittlere L\u00fccken verwendet.<\/li>\r\n        <li><strong>Endmodul<\/strong> \u2014 feste Breite, muss ggf. vor Ort leicht zugeschnitten werden. Wird f\u00fcr kleine L\u00fccken verwendet.<\/li>\r\n        <li><strong>Wandanschluss<\/strong> \u2014 montiert das Barrierenende direkt an der Wand. Wird f\u00fcr sehr kleine L\u00fccken verwendet.<\/li>\r\n      <\/ul>\r\n      <p style=\"color:#185FA5;opacity:.8\">Wenn Sie keinen b\u00fcndigen Abschluss ben\u00f6tigen, verwenden Sie einfach die Standardpassform 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; Artikelnummern<\/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 bitte kl\u00e4ren Sie die genaue Logistik mit NoFloods.<\/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:10px 16px;border-top:0.5px solid var(--bd);background:var(--bg2);box-shadow:0 -4px 12px rgba(0,0,0,.08)\">\r\n    <!-- Primary actions only -->\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; noch eine 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('Dies l\u00f6scht alle '+cart.length+' gespeicherten Konfigurationen und beginnt von vorn. 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; von vorn beginnen\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   \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\">In einigen Wochen<\/div>\r\n          <div class=\"urg-sb\">Vorausschauende Planung<\/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\">Ich informiere mich nur<\/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 der Anlage <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=\"Ihr Name, Oberfl\u00e4chenbeschaffenheit, Hindernisse, besondere Anforderungen oder Fragen an NoFloods\u2026\" style=\"min-height:90px\" oninput=\"onNotesChange()\"><\/textarea>\r\n    <\/div>\r\n\r\n  \r\n\r\n    <!-- Three CTAs -->\r\n    <div style=\"display:flex;gap:10px;flex-wrap:wrap;margin-bottom:8px\">\r\n      <button onclick=\"openCallbackModal()\" style=\"flex:1;min-width:160px;padding:12px 14px;background:#185FA5;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;justify-content:center;gap:7px\">\r\n        <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" style=\"width:14px;height:14px;flex-shrink:0\"><path d=\"M2 2.5C2 8.85 7.15 14 13.5 14h.5a1 1 0 001-1v-2a1 1 0 00-1-1l-2-.4a1 1 0 00-1 .5l-.6 1A8 8 0 014.9 6.6l1-.6a1 1 0 00.5-1L6 2.5a1 1 0 00-1-1H3a1 1 0 00-1 1z\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\r\n        R\u00fcckruf anfordern\r\n      <\/button>\r\n      <button onclick=\"openEmailMeModal()\" style=\"flex:1;min-width:160px;padding:12px 14px;background:var(--bg1);color:#185FA5;border:1.5px solid #B5D4F4;border-radius:var(--rm);font-size:13px;font-weight:700;font-family:var(--fn);cursor:pointer;display:flex;align-items:center;justify-content:center;gap:7px\">\r\n        <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" style=\"width:14px;height:14px;flex-shrink:0\"><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        Mir das per E-Mail senden\r\n      <\/button>\r\n      <button onclick=\"sendEasyWallEmail()\" style=\"flex:1;min-width:160px;padding:12px 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;justify-content:center;gap:7px\">\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        Angebotsanfrage senden\r\n      <\/button>\r\n    <\/div>\r\n    \r\n\r\n    <!-- Disclaimer -->\r\n    <div style=\"font-size:11px;color:var(--t3);line-height:1.7;padding-top:14px;border-top:0.5px solid var(--bd)\">\r\n      Nur unverbindliche Berechnung. Modulanzahlen basieren auf Standardma\u00dfen und dem Modell mit 7 cm \u00dcberlappung. Der tats\u00e4chliche Bedarf kann je nach Standortbedingungen, Oberfl\u00e4chenunregelm\u00e4\u00dfigkeiten und Installationsmethode variieren. \u00dcberpr\u00fcfen Sie Messungen vor der Bestellung immer vor Ort. NoFloods \u00fcbernimmt keine Haftung f\u00fcr Fehler, die aus der Nutzung des Rechners resultieren.\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<\/div>\r\n<!-- \u2500\u2500 CALLBACK MODAL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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<div id=\"modal-callback\" style=\"display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,.45);align-items:center;justify-content:center;padding:16px\">\r\n  <div style=\"background:var(--bg1);border-radius:16px;padding:24px;max-width:400px;width:100%;box-shadow:0 8px 32px rgba(0,0,0,.18)\">\r\n    <div style=\"font-size:17px;font-weight:700;color:var(--t1);margin-bottom:4px\">Sprechen Sie mit jemandem bei NoFloods<\/div>\r\n    <div style=\"font-size:13px;color:var(--t2);margin-bottom:18px;line-height:1.5\">Ihre Konfiguration wird einbezogen. Wir rufen Sie an, um die Details zu besprechen.<\/div>\r\n\t\t\n<div class=\"wpcf7 no-js\" id=\"wpcf7-f42626-o1\" lang=\"de-DE\" dir=\"ltr\" data-wpcf7-id=\"42626\">\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-f42626-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=\"42626\" \/><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-f42626-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;:42626,&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-42626  \"><div style=\"display:none;\"><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_2\" readonly=\"readonly\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Bitte f\u00fcllen Sie zuerst das Feld mit dem Rechner aus\" name=\"calc_summary\"><\/textarea><\/span><\/div>\n\n  <label> 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> \n Telefonnummer*\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>\n\n<label>  Beste Zeit f\u00fcr den Anruf (optional)\n    <span class=\"wpcf7-form-control-wrap\" data-name=\"your-time\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"your-time\" \/><\/span> <\/label>\n<br><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\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- \u2500\u2500 EMAIL ME MODAL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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<div id=\"modal-email-me\" style=\"display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,.45);align-items:center;justify-content:center;padding:16px\">\r\n  <div style=\"background:var(--bg1);border-radius:16px;padding:24px;max-width:400px;width:100%;box-shadow:0 8px 32px rgba(0,0,0,.18)\">\r\n    <div style=\"font-size:17px;font-weight:700;color:var(--t1);margin-bottom:4px\">Speichern Sie Ihre Konfiguration<\/div>\r\n    <div style=\"font-size:13px;color:var(--t2);margin-bottom:18px;line-height:1.5\">Wir senden Ihnen die vollst\u00e4ndige Aufschl\u00fcsselung per E-Mail, damit Sie diese sp\u00e4ter \u00fcberpr\u00fcfen oder mit jemandem teilen k\u00f6nnen.<\/div>\r\n\t\r\n\t\n<div class=\"wpcf7 no-js\" id=\"wpcf7-f42627-o2\" lang=\"de-DE\" dir=\"ltr\" data-wpcf7-id=\"42627\">\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-f42627-o2\" 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=\"42627\" \/><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-f42627-o2\" \/><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;:42627,&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-42627  \"><div style=\"display:none;\"><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_3\" readonly=\"readonly\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Bitte f\u00fcllen Sie das Feld zuerst mithilfe des Kalkulators aus.\" name=\"calc_summary\"><\/textarea><\/span><\/div>\n\n <label>  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> \n\n  E-Mail*\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\" aria-required=\"true\" aria-invalid=\"false\" value=\"\" type=\"email\" name=\"your-email\" \/><\/span> <\/label>\n\n<br><input class=\"wpcf7-form-control wpcf7-submit has-spinner\" type=\"submit\" value=\"AN MICH 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\r\n\t\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- \u2500\u2500 SUCCESS MODAL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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<div id=\"modal-success\" style=\"display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,.45);align-items:center;justify-content:center;padding:16px\">\r\n  <div style=\"background:var(--bg1);border-radius:16px;padding:28px;max-width:360px;width:100%;box-shadow:0 8px 32px rgba(0,0,0,.18);text-align:center\">\r\n    <div style=\"font-size:32px;margin-bottom:12px\">\u2713<\/div>\r\n    <div id=\"success-title\" style=\"font-size:17px;font-weight:700;color:var(--t1);margin-bottom:6px\"><\/div>\r\n    <div id=\"success-body\" style=\"font-size:13px;color:var(--t2);line-height:1.6;margin-bottom:20px\"><\/div>\r\n    <button onclick=\"closeModal('modal-success')\" style=\"padding:10px 24px;background:var(--ok);color:#fff;border:none;border-radius:var(--rm);font-size:13px;font-weight:700;font-family:var(--fn);cursor:pointer\">Fertig<\/button>\r\n  <\/div>\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)\">Suchen...<\/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)\">Versuche alternative Methode...<\/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\">Suche wird vom Browser blockiert.<br>Geben Sie Ihre Adresse stattdessen in das Feld <strong>Standort der Anlage<\/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 klicken Sie hier erneut, um zu 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 gesamt<\/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 Ihr Hochwasserschutzsystem','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 Wasserdichtigkeit. 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 Schotter, Erde & gemischtes Gel\u00e4nde. Nicht in USA, UK, IE, CA & QA verf\u00fcgbar.','s2title':'H\u00f6he w\u00e4hlen','s2sub':'Schutzh\u00f6he in cm','s3title':'L\u00e4nge der Barriere & Zubeh\u00f6r','s3sub':'Geben Sie unten Ihre geraden Strecken und das Zubeh\u00f6r ein','guide-toggle':'Wie Sie Ihren Standort messen','g1h':'Nur gerade Abschnitte messen.','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':'Leichte Kurven (wenige Grad pro Verbindung) ben\u00f6tigen keine Eckmodule \u2014 verbinden Sie die Module einfach in einem leichten Bogen. Die S-Serie bew\u00e4ltigt konstruktionsbedingt 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 gegen eine Wand verl\u00e4uft, 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 kommen mit unebenem Boden zurecht \u2014 eine abnehmbare Membran kann jedem Modell hinzugef\u00fcgt werden. Bei der D-Serie ist sie standardm\u00e4\u00dfig integriert.','g5h':'Planen Sie eine kleine Toleranz bei der installierten L\u00e4nge ein.','g5b':'Der Rechner verwendet die NoFloods-Rate von Modulen pro Meter f\u00fcr jedes Modell, um Ihnen die richtige Anzahl an Modulen zu nennen. Je nach Bodenbeschaffenheit und Installationswinkel ist eine Abweichung von \u00b12\u20133% in der endg\u00fcltig installierten L\u00e4nge zu erwarten.','sections-title':'Gerade Abschnitte','add-section':'Weiteren Abschnitt hinzuf\u00fcgen','acc-title':'Ecken & Zubeh\u00f6r','corners-lbl':'Kurven & 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 leichte Kurven.','my-angle':'Mein Kurvenwinkel','turn-dir':'Kurvenrichtung','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 einstellen','wall-conn-lbl':'Wandanschl\u00fcsse','save-config':'Konfiguration speichern','load-config':'Gespeicherte Konfigurationen','print-summary':'Zusammenfassung drucken \/ PDF','results-title':'Ergebnisse','standard-fit':'Standardpassform','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 & Artikelnummern','weight-note':'Alle Gewichte sind pro Modultyp verifiziert. Palettensch\u00e4tzungen sind Richtwerte \u2014 bitte kl\u00e4ren Sie die genaue Logistik mit NoFloods.','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\">Schutz: '+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 gesamt<\/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 Ecken nicht einbeziehen<\/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;\r\n  \/\/ end-type-adj button removed \u2014 adj ends suggested automatically in exact fit tab\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  \/\/ end-type-std \/ end-type-adj buttons removed \u2014 type tracked via hidden fields only\r\n  updateEndLabels();if(!silent)calc();\r\n}\r\nfunction updateEndLabels(){\r\n  \/\/ end-width-row removed from HTML \u2014 nothing to update\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>Keine Eckmodule f\u00fcr sehr allm\u00e4hliche Kurven erforderlich.<\/strong><br><br>'+\r\n    'Jede Verbindung zwischen den Modulen erlaubt eine kleine Winkelabweichung. F\u00fcr die <strong>'+seriesName+'<\/strong> betr\u00e4gt dies ungef\u00e4hr <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>Wie gemessen wird:<\/strong> Gehen Sie die Kurve ab und messen Sie die Gesamtdistanz am Boden. Geben Sie dies als Ihre Abschnittsl\u00e4nge ein und belassen Sie alle Eckeneingaben bei 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 f\u00e4llt zwischen die Modulstufen 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?', mit nat\u00fcrlicher Flexibilit\u00e4t schlie\u00dfbar':'');\r\n    msg+='<br><strong>'+ce+' Modul'+(ce>1?'e':'')+' = '+r4(ce*dp)+'\u00b0<\/strong> \u2014 '+g2.toFixed(1)+'\u00b0 dar\u00fcber'+(g2<=fa?', mit nat\u00fcrlicher Flexibilit\u00e4t schlie\u00dfbar':'');\r\n    msg+='<br><span style=\"font-size:11px;opacity:.8\">Kontaktieren Sie NoFloods, um die Passform f\u00fcr Sonderwinkel zu \u00fcberpr\u00fcfen.<\/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('Endmodul \u2013 links',el,c.el);if(er>0)addR('Endmodul \u2013 rechts',er,c.er);\r\n  if(ael>0&&v.adjEnd)addR('Endmodul \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('Endmodul \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 f\u00fcgt ~'+r4(accLen*100)+' cm hinzu \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, UK, Irland oder Katar erh\u00e4ltlich.';}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    \/\/ List accessories \u2014 skip fixed end modules if adj end exact fit replaces them\r\n    const isAdjEndSolution=o.isAdjEnd;\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(!isAdjEndSolution&&el>0)rows+=row(el,'Endmodul \u2013 links',v.c.el,'');\r\n    if(!isAdjEndSolution&&er>0)rows+=row(er,'Endmodul \u2013 rechts',v.c.er,'');\r\n    if(!isAdjEndSolution&&ael>0&&v.adjEnd)rows+=row(ael,'Verstellbares Endmodul \u2013 links',v.adjEnd.cL,'');\r\n    if(!isAdjEndSolution&&aer>0&&v.adjEnd)rows+=row(aer,'Verstellbares Endmodul \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    \/\/ For adj end solution, don't add accPcs (end modules are already in o.modules)\r\n    const grandTotal=isAdjEndSolution?termPcs: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='Artikelnummern: '+exactCodes.join(' \u00b7 ');\r\n\r\n  } else {\r\n    \/\/ Standard fit \u2014 explicit breakdown\r\n    rows+=row(nStd,'Standardmodule',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 Endmodul \u2013 links',v.adjEnd.cL,'');\r\n    if(aer>0&&v.adjEnd)rows+=row(aer,'Verstellbares Endmodul \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 hinaus \u2014 in Ordnung f\u00fcr offene Strecken)':'')+'<\/div>';\r\n    qsCodes=codes.length?'Artikelnummern: '+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('Gerade verstellbar',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('Verst. Ende links',ael,w.ael||0);\r\n  if(aer>0) addW('Verst. 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 der gew\u00e4hlten exakten Passform':'Alle Modultypen einbezogen'}<\/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 des geraden Moduls<\/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,hasAdjEnds){\r\n  const ae=v.adjEnd;\r\n  const adj=v.adj;\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  let recAdjEnd=null; \/\/ secondary option: adjustable end modules\r\n  const inR=(val,lo,hi)=>val>=lo-0.005&&val<=hi+0.005;\r\n\r\n  \/\/ \u2500\u2500 Check adjustable end modules (T50 only) \u2500\u2500\r\n  \/\/ When adj-end-L is present, ALL std modules lose 7cm (none is first in run)\r\n  \/\/ So std contribution = nS * (wS-OL), not stdCov(nS)\r\n  \/\/ Total = lp(receiver, full) + nS*(wS-OL) + rn(slides over, net)\r\n  const hasStdEnds=accNetLen>0&&!hasAdjEnds;\r\n  if(!hasCorners&&!hasAdjEnds&&ae){\r\n    const aeNetMin=r4(ae.min-OL2), aeNetMax=r4(ae.max-OL2);\r\n    const stdNet=r4(v.wS-OL2); \/\/ every std loses 7cm when adj-end-L is first\r\n    for(let nS=0;nS<=nStdBase+2;nS++){\r\n      const stdContrib=r4(nS*stdNet);\r\n      const remaining=r4(target-stdContrib);\r\n      const minR=r4(ae.min+aeNetMin), maxR=r4(ae.max+aeNetMax);\r\n      if(remaining>=minR-0.005&&remaining<=maxR+0.005){\r\n        let lp=r4((ae.min+ae.max)\/2);\r\n        let rn=r4(remaining-lp);\r\n        if(rn<aeNetMin){lp=r4(remaining-aeNetMin);rn=aeNetMin;}\r\n        if(rn>aeNetMax){lp=r4(remaining-aeNetMax);rn=aeNetMax;}\r\n        if(lp>=ae.min-0.005&&lp<=ae.max+0.005&&rn>=aeNetMin-0.005&&rn<=aeNetMax+0.005){\r\n          const lpCm=Math.round(lp*100), rpCm=Math.round((rn+OL2)*100);\r\n          const check=r4(stdContrib+lp+rn);\r\n          if(Math.abs(check-target)<=0.005){\r\n            \/\/ N-1 overlaps cross-check\r\n            const physWidths=Array(nS).fill(v.wS*100).concat([lpCm,rpCm]);\r\n            const physTotal=physWidths.reduce((a,b)=>a+b,0);\r\n            const netCheck=r4((physTotal-(nS+1)*OL2*100)\/100);\r\n            if(Math.abs(netCheck-target)>0.01) break; \/\/ physics check failed\r\n            const label=(nS>0?nS+' Standard + ':'')+'verstellbares Endmodul links @ '+lpCm+' cm + verstellbares Endmodul rechts @ '+rpCm+' cm';\r\n            const modules=[];\r\n            if(nS>0) modules.push({qty:nS,name:'Standardmodule',code:v.c.st,note:Math.round(v.wS*1000)\/10+' cm je'});\r\n            modules.push({qty:1,name:'Verstellbares Endmodul \u2013 links',code:ae.cL,note:'einstellen auf <strong>'+lpCm+' cm<\/strong> (Bereich: '+Math.round(ae.min*100)+'\u2013'+Math.round(ae.max*100)+' cm)'});\r\n            modules.push({qty:1,name:'Verstellbares Endmodul \u2013 rechts',code:ae.cR,note:'einstellen auf <strong>'+rpCm+' cm<\/strong> (Bereich: '+Math.round(ae.min*100)+'\u2013'+Math.round(ae.max*100)+' cm)'});\r\n            recAdjEnd={label,modules,exact:true,nS,totalModules:nS+2};\r\n          }\r\n        }\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  \/\/ \u2500\u2500 Adjustable straight \u2014 try 1, 2, or 3 modules (max 3 absolute) \u2500\u2500\r\n  \/\/ When accNetLen>0 (end\/wall modules present), the left accessory is first in run\r\n  \/\/ so ALL standard modules lose 7cm \u2014 use nStd*net not stdCov()\r\n  if(!rec){\r\n    const stdNet=r4(v.wS-OL2);\r\n    for(let nAdj=1;nAdj<=3;nAdj++){\r\n      if(nStd<=nAdj)break;\r\n      \/\/ If end\/wall modules present: all stds contribute stdNet each\r\n      \/\/ If no end\/wall modules: first std is full, use stdCov\r\n      const baseCov=accNetLen>0 ? r4((nStd-nAdj)*stdNet) : stdCov(nStd-nAdj,v);\r\n      const gapN=r4(straightTarget-baseCov);\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        \/\/ N-1 physics cross-check\r\n        const totalMods=(nStd-nAdj)+nAdj+(accNetLen>0?2:0); \/\/ approx\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, jeweils eingestellt auf '+setCm+' cm';\r\n        const modules=[\r\n          {qty:nStd-nAdj,name:'Standardmodule',code:v.c.st,note:Math.round(v.wS*1000)\/10+' cm je'},\r\n          {qty:nAdj,name:'Verstellbare(s) Modul(e)',code:adj.code,note:(nAdj>1?'jeweils ':'')+'einstellen auf <strong>'+setCm+' cm<\/strong> (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  \/\/ Adjustable end modules are suggested separately when they give a cleaner\/fewer-module solution.\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 \u2500\u2500\r\n    const adjCount=rec.modules.filter(m=>m.name.toLowerCase().includes('verstellbar')).reduce((s,m)=>s+m.qty,0);\r\n    const stdCount=rec.modules[0]?.qty||0;\r\n    let intro='';\r\n    if(accNetLen>0){\r\n      intro='Der Austausch von '+(adjCount===1?'einem':''+adjCount)+' Standardmodul'+(adjCount>1?'en':'')+' durch '+(adjCount===1?'ein verstellbares':''+adjCount+' verstellbare')+' Modul'+(adjCount>1?'e':'')+' ergibt eine exakte Passform. Ihre '+Math.round(accNetLen*100)+' cm End-\/Wandmodule sind bereits ber\u00fccksichtigt.';\r\n    } else {\r\n      intro='Ersetzen Sie '+(adjCount===1?'ein':''+adjCount)+' Standardmodul'+(adjCount>1?'e':'')+' durch '+(adjCount===1?'ein verstellbares':''+adjCount+' verstellbare')+' Modul'+(adjCount>1?'e':'')+', um exakt '+target+' m zu erreichen.';\r\n    }\r\n    if(hasCorners) intro='Diese Strecke hat Kurven \u2014 platzieren Sie das verstellbare Modul'+(adjCount>1?' (oder die Module)':'')+' irgendwo 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:10px;font-size:13px;font-weight:700;font-family:var(--fn);border:none;border-radius:var(--rm);cursor:pointer;background:var(--ok);color:#fff;letter-spacing:0.01em\">Dies in meinem Angebot verwenden<\/button>'+\r\n        '<\/div>'+\r\n      '<\/div>';\r\n\r\n    \/\/ Also show adj end option if found\r\n    if(recAdjEnd){\r\n      const adjStraightMods=rec.modules.reduce((s,m)=>s+m.qty,0);\r\n      const fewer=recAdjEnd.totalModules<adjStraightMods;\r\n      const replaceMsg=hasStdEnds\r\n        ?'<strong>Einfachere Alternative \u2014 auf verstellbare Endmodule wechseln:<\/strong> Ersetzen Sie Ihre Standard-Endmodule durch verstellbare Endmodule, die auf die exakten Breiten unten eingestellt sind. Kein verstellbares gerades Modul erforderlich.'\r\n        :'<strong>Alternative'+(fewer?' (weniger Module)':'')+':<\/strong> Verwenden Sie verstellbare Endmodule \u2014 jedes schlie\u00dft die Strecke ab und stellt die genaue L\u00e4nge in einem St\u00fcck ein.';\r\n      html+='<div style=\"margin-top:16px;padding-top:14px;border-top:0.5px solid var(--bd)\">'+\r\n        '<div style=\"font-size:12px;color:var(--t2);margin-bottom:10px;line-height:1.6\">'+replaceMsg+'<\/div>'+\r\n        '<div class=\"eo\" style=\"border:1px solid var(--bd)\">'+\r\n          '<div class=\"eo-hd\">'+\r\n            '<div>'+\r\n              '<div class=\"eo-t\">'+recAdjEnd.label+'<\/div>'+\r\n              '<div style=\"font-size:11px;color:var(--t2);margin-top:3px\">'+recAdjEnd.totalModules+' Module insgesamt \u2014 erreicht exakt '+target+' m<\/div>'+\r\n            '<\/div>'+\r\n            '<span class=\"eo-b\" style=\"background:'+(fewer?'var(--okb)':'var(--bg2)')+';color:'+(fewer?'var(--ok)':'var(--t2)')+'\">'+( fewer?'Weniger Module':'Exakte Passform')+'<\/span>'+\r\n          '<\/div>'+\r\n          '<div class=\"eo-ms\">'+\r\n            recAdjEnd.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          '<\/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-ae\" onclick=\"selectAdjEndOpt()\" style=\"width:100%;padding:10px;font-size:13px;font-weight:700;font-family:var(--fn);border:none;border-radius:var(--rm);cursor:pointer;background:var(--ok);color:#fff;letter-spacing:0.01em\">Dies in meinem Angebot verwenden<\/button>'+\r\n          '<\/div>'+\r\n        '<\/div>'+\r\n      '<\/div>';\r\n    }\r\n\r\n  } else if(recAdjEnd&&!hasCorners&&!hasAdjEnds){\r\n    \/\/ \u2500\u2500 No adj straight solution but adj end modules work \u2500\u2500\r\n    const introMsg=hasStdEnds\r\n      ?'Das verstellbare gerade Modul kann die L\u00fccke hier nicht f\u00fcllen \u2014 aber der Wechsel zu verstellbaren Endmodulen l\u00f6st es exakt, mit weniger Gesamtmodulen.'\r\n      :'Das verstellbare gerade Modul kann die L\u00fccke f\u00fcr dieses Ziel nicht f\u00fcllen \u2014 aber verstellbare Endmodule l\u00f6sen es exakt.';\r\n    html+='<div style=\"font-size:12px;color:var(--t2);margin-bottom:12px;line-height:1.6\">'+introMsg+'<\/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\">'+recAdjEnd.label+'<\/div>'+\r\n          '<div style=\"font-size:11px;color:var(--t2);margin-top:3px\">'+recAdjEnd.totalModules+' Module \u2014 erreicht exakt '+target+' m<\/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        recAdjEnd.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      '<\/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-ae\" onclick=\"selectAdjEndOpt()\" style=\"width:100%;padding:10px;font-size:13px;font-weight:700;font-family:var(--fn);border:none;border-radius:var(--rm);cursor:pointer;background:var(--ok);color:#fff;letter-spacing:0.01em\">Dies in meinem Angebot verwenden<\/button>'+\r\n      '<\/div>'+\r\n    '<\/div>';\r\n    \/\/ Set as primary rec for badge, and store for selectAdjEndOpt\r\n    rec=recAdjEnd;\r\n    window._adjEndRec=recAdjEnd;\r\n    _exactOpts=[{nS:recAdjEnd.nS,nA:0,wA:null,len:target,diff:0,feasible:true,exact:true,modules:recAdjEnd.modules,label:recAdjEnd.label,isAdjEnd:true}];\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 verstellbaren Modulbereichs ('+Math.round(adjNetMin*100)+'\u2013'+Math.round(adjNetMax*100)+' cm). Standardpassform mit '+nStd+' geraden Modulen ist die richtige Antwort.'\r\n        : 'Die L\u00fccke ('+gapCm+' cm) liegt au\u00dferhalb des verstellbaren Modulbereichs ('+Math.round(adjNetMin*100)+'\u2013'+Math.round(adjNetMax*100)+' cm). Standardpassform mit '+nStd+' Modulen ist die richtige Antwort.';\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>Standardpassform ist hier die richtige Antwort.<\/strong> '+msg+' Der \u00dcberschuss betr\u00e4gt nur <strong>'+overCm+' cm ('+overPct2+'%)<\/strong> \u2014 gut 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>Standardpassform ist hier die richtige Antwort.<\/strong> '+\r\n        'Die L\u00fccke von '+gapCm+' cm liegt au\u00dferhalb des Bereichs f\u00fcr verstellbare Module ('+Math.round(adjNetMin*100)+'\u2013'+Math.round(adjNetMax*100)+' cm netto) \u2014 das verstellbare Modul w\u00fcrde sie nicht sauber schlie\u00dfen. '+\r\n        'Verwenden Sie '+nStd+' Standardmodule im Tab Standardpassform. 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\u00f6rbereich 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 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> schlie\u00dfen das offene Ende einer Strecke ab \u2014 zum Beispiel, wo die Barriere in einem offenen Bereich 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 die Feinjustierung der L\u00e4nge 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 an eine Garagen\u00f6ffnung, bei der beide Enden an die Garagenw\u00e4nde grenzen. '+\r\n    'Verwenden Sie 1 pro Seite, die an eine Wand anschlie\u00dft. Sie verwenden auf einer bestimmten Seite 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='Dies in meinem Angebot verwenden';btn.style.background='var(--ok)';btn.style.color='#fff';btn.style.border='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    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='#27500A';btn.style.color='#fff';btn.style.border='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  \/\/ 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)\">Module insgesamt<\/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>Module insgesamt<\/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('Standort konnte nicht ermittelt werden. Bitte geben Sie ihn manuell ein.'));\r\n}\r\n\r\nfunction getConfigSummaryText(){\r\n  const body=getEasyWallEmailBody();\r\n  \/\/ Strip the notes\/address section \u2014 we just want config summary\r\n  const lines=body.split('\\n');\r\n  const confStart=lines.findIndex(l=>l.includes('KONFIGURATIONEN')||l.includes('MODULE'));\r\n  if(confStart>-1) return lines.slice(confStart).join('\\n').trim();\r\n  return body.trim();\r\n}\r\n\r\nfunction openCallbackModal(){\r\n\r\n   if(!_lastCalc&&!cart.length){\r\n\t\talert(\"Noch keine Konfiguration berechnet\");\r\n\t\treturn;\r\n   }\r\n\t\r\n\t\r\n\t       \r\n\t  const summary = getEasyWallEmailBody();\r\n\t  if (!summary){\r\n\t\talert(\"Noch keine Konfiguration berechnet\");\r\n\t  }\r\n\t  else{\r\n\t\t const formField = document.getElementById('calc_summary_2');     \/\/ hidden field inside Elementor form\r\n\t\t if (formField) formField.value = summary;\r\n\t\t document.getElementById('modal-callback').style.display='flex';\r\n\t\r\n\t  }\r\n\t\r\n\t \r\n\t\r\n\t  \r\n\r\n}\r\nfunction openEmailMeModal(){\r\n\r\n   if(!_lastCalc&&!cart.length){\r\n\t\talert(\"Noch keine Konfiguration berechnet\");\r\n\t\treturn;\r\n   }\r\n\t\r\n\t  const summary = getEasyWallEmailBody();\r\n\t  if (!summary){\r\n\t\talert(\"Noch keine Konfiguration berechnet\");\r\n\t  }\r\n\t  else{\r\n\t\t const formField = document.getElementById('calc_summary_3');     \/\/ hidden field inside Elementor form\r\n\t\t if (formField) formField.value = summary;\r\n\t\t document.getElementById('modal-email-me').style.display='flex';\r\n\t\t\r\n\t  }\r\n}\r\nfunction closeModal(id){\r\n  document.getElementById(id).style.display='none';\r\n}\r\nfunction showSuccess(title,body){\r\n  document.getElementById('success-title').textContent=title;\r\n  document.getElementById('success-body').textContent=body;\r\n  document.getElementById('modal-success').style.display='flex';\r\n}\r\n\r\nfunction submitToNoFloods(data){\r\n  \/\/ Submit to the NoFloods webform endpoint\r\n  \/\/ data = { tag, name?, phone?, bestTime?, email?, configSummary, urgency }\r\n  const form=new FormData();\r\n  Object.entries(data).forEach(([k,v])=>{if(v)form.append(k,v);});\r\n  \/\/ POST to the webform \u2014 update URL to match NoFloods endpoint\r\n  return fetch('https:\/\/nofloods.com\/wp-json\/contact-form-7\/v1\/contact-forms\/FORM_ID\/feedback',{\r\n    method:'POST',body:form\r\n  }).then(r=>r.ok).catch(()=>false);\r\n}\r\n\r\nfunction getUrgencyText(){\r\n  if(document.getElementById('urg-asap')?.classList.contains('active'))return'So schnell wie m\u00f6glich (dringend)';\r\n  if(document.getElementById('urg-weeks')?.classList.contains('active'))return'In einigen Wochen';\r\n  if(document.getElementById('urg-exploring')?.classList.contains('active'))return'Ich informiere mich nur \u2014 kein festes Datum';\r\n  return'Nicht angegeben';\r\n}\r\n\r\nasync function submitCallback(){\r\n  const name=(document.getElementById('cb-name').value||'').trim();\r\n  const phone=(document.getElementById('cb-phone').value||'').trim();\r\n  const time=(document.getElementById('cb-time').value||'').trim();\r\n  const errEl=document.getElementById('cb-error');\r\n  if(!name||!phone){errEl.textContent='Bitte geben Sie Ihren Namen und Ihre Telefonnummer ein.';errEl.style.display='block';return;}\r\n  errEl.style.display='none';\r\n  const btn=document.querySelector('#modal-callback button');\r\n  const orig=btn.textContent;btn.textContent='Wird gesendet...';btn.disabled=true;\r\n  const ok=await submitToNoFloods({\r\n    tag:'CALLBACK',\r\n    name,phone,'best-time':time,\r\n    'config-summary':getConfigSummaryText(),\r\n    urgency:getUrgencyText(),\r\n    source:'EasyWall Calculator \u2014 R\u00fcckrufanfrage'\r\n  });\r\n  btn.textContent=orig;btn.disabled=false;\r\n  closeModal('modal-callback');\r\n  showSuccess('R\u00fcckruf angefordert','Das NoFloods-Team wird Sie in K\u00fcrze anrufen. Achten Sie auf Ihr Telefon \u2014 der Anruf kann von einer unbekannten Nummer erfolgen.');\r\n}\r\n\r\nasync function submitEmailMe(){\r\n  const email=(document.getElementById('em-email').value||'').trim();\r\n  const errEl=document.getElementById('em-error');\r\n  if(!email||!email.includes('@')){errEl.textContent='Bitte geben Sie eine g\u00fcltige E-Mail-Adresse ein.';errEl.style.display='block';return;}\r\n  errEl.style.display='none';\r\n  const btn=document.querySelector('#modal-email-me button');\r\n  const orig=btn.textContent;btn.textContent='Wird gesendet...';btn.disabled=true;\r\n  const ok=await submitToNoFloods({\r\n    tag:'SAVE-CALC',\r\n    email,\r\n    'config-summary':getConfigSummaryText(),\r\n    urgency:getUrgencyText(),\r\n    source:'EasyWall Calculator \u2014 Konfiguration speichern'\r\n  });\r\n  btn.textContent=orig;btn.disabled=false;\r\n  closeModal('modal-email-me');\r\n  showSuccess('Konfiguration gespeichert','\u00dcberpr\u00fcfen Sie Ihren Posteingang \u2014 wir haben Ihnen die Zusammenfassung Ihrer Barriere gesendet. Das NoFloods-Team hat ebenfalls eine Kopie und wird sich gegebenenfalls melden.');\r\n}\r\n\r\n\/\/ Close modals on backdrop click\r\n['modal-callback','modal-email-me','modal-success'].forEach(id=>{\r\n  document.getElementById(id)?.addEventListener('click',e=>{\r\n    if(e.target.id===id)closeModal(id);\r\n  });\r\n});\r\n\r\nfunction onNotesChange(){\/* live \u2014 body assembled on send *\/}\r\n\r\nfunction selectAdjEndOpt(){\r\n  if(!window._adjEndRec)return;\r\n  const rec=window._adjEndRec;\r\n  bestExactOpt={nS:rec.nS,nA:0,wA:null,len:rec.totalModules,diff:0,feasible:true,exact:true,modules:rec.modules,label:rec.label,isAdjEnd:true};\r\n  exactOptUserSelected=true;\r\n  const btn=document.querySelector('.eo-sel-btn-ae');\r\n  if(btn){btn.textContent='\u2713 F\u00fcr Angebot ausgew\u00e4hlt \u2014 zum Abw\u00e4hlen klicken';btn.style.background='#27500A';btn.style.color='#fff';btn.style.border='none';}\r\n  updateQuoteSummary();\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\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:'In einigen Wochen',exploring:'Ich informiere mich nur \u2014 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 DER ANLAGE: '+addrVal,'');\r\n\r\n  if(cart.length>0){\r\n    lines.push('KONFIGURATIONEN ('+cart.length+' insgesamt)');\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('  Module insgesamt: '+c.total+' Stk. \u00b7 '+c.totalKg+' kg');\r\n        lines.push('  Artikelnummern: '+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 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('  Endmodul \u2013 links: '+lc.el+' Stk. ('+v.c.el+')');\r\n      if(lc.er>0)lines.push('  Endmodul \u2013 rechts: '+lc.er+' Stk. ('+v.c.er+')');\r\n      if(lc.ael>0&&v.adjEnd)lines.push('  Endmodul \u2013 verst. links: '+lc.ael+' Stk. ('+v.adjEnd.cL+')');\r\n      if(lc.aer>0&&v.adjEnd)lines.push('  Endmodul \u2013 verst. 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('Artikelnummern: '+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\t\r\n\t\r\n\t  const formField = document.getElementById('calc_summary_1');     \/\/ 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  if (formField) formField.value = summary;\r\n\r\n\t \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 \r\n\t  if (formSection) {\r\n\t\tformSection.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n\t  }\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 (Fallback)';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<\/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-o3\" 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-o3\" 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-o3\" \/><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_1\" 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.6 - 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-25T12:20:04+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\\\/de\\\/#website\"},\"datePublished\":\"2026-03-30T16:00:09+00:00\",\"dateModified\":\"2026-09-25T12:20:04+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\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/nofloods.com\\\/de\\\/\",\"name\":\"NoFloods\",\"description\":\"By Environment Solutions\",\"publisher\":{\"@id\":\"https:\\\/\\\/nofloods.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nofloods.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/nofloods.com\\\/de\\\/#organization\",\"name\":\"NoFloods\",\"url\":\"https:\\\/\\\/nofloods.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/nofloods.com\\\/de\\\/#\\\/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\\\/de\\\/#\\\/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-25T12:20:04+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\/de\/#website"},"datePublished":"2026-03-30T16:00:09+00:00","dateModified":"2026-09-25T12:20:04+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\/de\/#website","url":"https:\/\/nofloods.com\/de\/","name":"NoFloods","description":"By Environment Solutions","publisher":{"@id":"https:\/\/nofloods.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nofloods.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/nofloods.com\/de\/#organization","name":"NoFloods","url":"https:\/\/nofloods.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/nofloods.com\/de\/#\/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\/de\/#\/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":7,"href":"https:\/\/nofloods.com\/de\/wp-json\/wp\/v2\/pages\/42006\/revisions"}],"predecessor-version":[{"id":42630,"href":"https:\/\/nofloods.com\/de\/wp-json\/wp\/v2\/pages\/42006\/revisions\/42630"}],"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}]}}