{"id":4500,"date":"2026-01-28T09:21:23","date_gmt":"2026-01-28T07:21:23","guid":{"rendered":"https:\/\/wolfinger.at\/daemmen\/?page_id=4500"},"modified":"2026-08-10T12:26:58","modified_gmt":"2026-08-10T10:26:58","slug":"sanierungsrechner","status":"publish","type":"page","link":"https:\/\/wolfinger.at\/daemmen\/sanierungsrechner\/","title":{"rendered":"Sanierungsrechner"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4500\" class=\"elementor elementor-4500\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6ad9502 e-con-full e-flex e-con e-parent\" data-id=\"6ad9502\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-42dcb8b elementor-widget elementor-widget-html\" data-id=\"42dcb8b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\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\" \/>\r\n<title>Sanierungsrechner Zellulosed\u00e4mmung \u2013 Wolfinger<\/title>\r\n\r\n\r\n\r\n<style>\r\n#wfr, #wfr *, #wfr-modal, #wfr-modal * { box-sizing: border-box; }\r\n\r\n#wfr {\r\n  --wfr-green:      #2e8b2e;\r\n  --wfr-green-dk:   #236e23;\r\n  --wfr-green-lt:   #edfaed;\r\n  --wfr-blue-lt:    #f0f7ff;\r\n  --wfr-border:     #d9d9d9;\r\n  --wfr-text:       #222;\r\n  --wfr-muted:      #6b6b6b;\r\n\r\n  font-family: system-ui, -apple-system, \"Segoe UI\", Arial, sans-serif;\r\n  color: var(--wfr-text);\r\n  max-width: 860px;\r\n  margin: 0 auto;\r\n  padding: 0 16px 32px;\r\n  line-height: 1.45;\r\n}\r\n\r\n#wfr h2 { font-size: 22px; margin: 0 0 4px; }\r\n#wfr h3 { font-size: 16px; margin: 0 0 14px; }\r\n#wfr .wfr-sub { margin: 0 0 18px; color: var(--wfr-muted); font-size: 13px; }\r\n\r\n#wfr .wfr-stack { display: flex; flex-direction: column; gap: 14px; }\r\n\r\n#wfr .wfr-card {\r\n  border: 1px solid var(--wfr-border);\r\n  border-radius: 14px;\r\n  padding: 18px;\r\n  background: #fff;\r\n}\r\n#wfr .wfr-step {\r\n  display: inline-flex; align-items: center; justify-content: center;\r\n  width: 22px; height: 22px; border-radius: 50%;\r\n  background: var(--wfr-green); color: #fff;\r\n  font-size: 12px; font-weight: 700; margin-right: 8px;\r\n  vertical-align: middle; flex-shrink: 0;\r\n}\r\n\r\n#wfr label { display: block; font-size: 13px; margin-bottom: 5px; font-weight: 500; }\r\n#wfr input, #wfr select, #wfr textarea {\r\n  width: 100%; padding: 10px 12px;\r\n  border: 1px solid #cfcfcf; border-radius: 10px;\r\n  background: #fbfdff; font-size: 14px; font-family: inherit;\r\n  outline: none; color: inherit;\r\n}\r\n#wfr input:focus, #wfr select:focus, #wfr textarea:focus {\r\n  border-color: #7cbf7c; box-shadow: 0 0 0 3px rgba(124,191,124,.18); background: #fff;\r\n}\r\n#wfr input[type=checkbox] { width: auto; }\r\n\r\n#wfr .wfr-g2 { display: grid; grid-template-columns: 1fr 1fr; column-gap: 14px; row-gap: 12px; }\r\n#wfr .wfr-g2 > div { min-width: 0; }\r\n#wfr .wfr-mt { margin-top: 12px; }\r\n#wfr .wfr-small { font-size: 12px; color: var(--wfr-muted); line-height: 1.4; }\r\n#wfr .wfr-hint { font-size: 11.5px; color: var(--wfr-muted); margin-top: 4px; }\r\n#wfr .wfr-hr { height: 1px; background: #eee; margin: 14px 0; }\r\n\r\n\/* Info-Tooltip *\/\r\n#wfr .wfr-i { position: relative; display: inline-flex; margin-left: 5px; vertical-align: middle; }\r\n#wfr .wfr-i > span[role=button] {\r\n  width: 15px; height: 15px; border-radius: 50%;\r\n  background: #e0eee0; border: 1px solid #a8cfa8; color: #2e7d2e;\r\n  font-size: 10px; font-weight: 700; display: inline-flex;\r\n  align-items: center; justify-content: center; cursor: help; user-select: none;\r\n}\r\n#wfr .wfr-i > span[role=button]:focus { outline: 2px solid #7cbf7c; outline-offset: 2px; }\r\n#wfr .wfr-tip {\r\n  display: none; position: absolute; left: 50%; bottom: calc(100% + 8px);\r\n  transform: translateX(-50%); width: 250px;\r\n  background: #1e1e1e; color: #f2f2f2; font-size: 11.5px; font-weight: 400;\r\n  line-height: 1.5; padding: 9px 11px; border-radius: 9px;\r\n  box-shadow: 0 4px 16px rgba(0,0,0,.22); z-index: 50; pointer-events: none;\r\n}\r\n#wfr .wfr-tip::after {\r\n  content: \"\"; position: absolute; top: 100%; left: 50%;\r\n  transform: translateX(-50%); border: 6px solid transparent; border-top-color: #1e1e1e;\r\n}\r\n#wfr .wfr-i:hover .wfr-tip, #wfr .wfr-i:focus-within .wfr-tip { display: block; }\r\n\r\n#wfr .wfr-btn {\r\n  padding: 9px 14px; border: 1px solid #b9d8b9; border-radius: 999px;\r\n  cursor: pointer; background: #fff; font-size: 13px; font-family: inherit; color: inherit;\r\n}\r\n#wfr .wfr-btn:hover { background: #f6fff6; }\r\n\r\n#wfr .wfr-status { margin-top: 8px; font-size: 12px; color: var(--wfr-muted); }\r\n#wfr .wfr-status.ok   { color: #1b6b1b; }\r\n#wfr .wfr-status.warn { color: #8a5a00; }\r\n#wfr .wfr-status.err  { color: #b00; }\r\n\r\n#wfr .wfr-layers {\r\n  background: #fafafa; border: 1px solid #eee; border-radius: 10px;\r\n  padding: 14px 18px; margin-top: 10px; font-size: 12.5px;\r\n}\r\n#wfr .wfr-layers table {\r\n  width: 100%; border-collapse: collapse; background: none !important; margin: 0 !important;\r\n}\r\n#wfr .wfr-layers tr { background: none !important; border: none !important; }\r\n#wfr .wfr-layers td {\r\n  padding: 4px 0 !important; vertical-align: top;\r\n  border: none !important; background: none !important;\r\n}\r\n#wfr .wfr-layers td.wfr-num {\r\n  text-align: right; white-space: nowrap; color: var(--wfr-muted);\r\n  padding-left: 16px !important;\r\n}\r\n#wfr .wfr-layers .wfr-tot td { border-top: 1px solid #ddd !important; padding-top: 7px !important; font-weight: 600; }\r\n\r\n@media (max-width: 720px) {\r\n  #wfr .wfr-layers { padding: 12px 14px; }\r\n}\r\n\r\n#wfr .wfr-warn {\r\n  background: #fff7e6; border: 1px solid #ffd88a; border-radius: 10px;\r\n  padding: 9px 12px; margin-top: 10px; font-size: 12.5px; color: #7a5200;\r\n}\r\n#wfr .wfr-warn ul { margin: 4px 0 0; padding-left: 18px; }\r\n\r\n\/* Ergebnisse *\/\r\n#wfr .wfr-res-head, #wfr .wfr-row {\r\n  display: grid; grid-template-columns: 1fr 96px 96px; gap: 8px; align-items: center;\r\n}\r\n#wfr .wfr-res-head { padding-bottom: 6px; border-bottom: 1px solid #eee; }\r\n#wfr .wfr-row { padding: 7px 0; border-bottom: 1px solid #f4f4f4; }\r\n#wfr .wfr-row--single { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; padding: 7px 0; border-bottom: 1px solid #f4f4f4; }\r\n#wfr .wfr-lbl { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .4px; text-align: right; }\r\n#wfr .wfr-lbl.old { color: #999; }\r\n#wfr .wfr-lbl.new { color: #3a9e3a; }\r\n#wfr .wfr-name { font-size: 13px; display: flex; flex-direction: column; gap: 1px; }\r\n#wfr .wfr-name small { font-size: 11px; color: #999; }\r\n#wfr .wfr-v { text-align: right; font-size: 13px; }\r\n#wfr .wfr-v.new .wfr-val { color: #2a8a2a; }\r\n#wfr .wfr-val { font-weight: 600; font-size: 14px; }\r\n#wfr .wfr-unit { font-size: 11px; color: #888; margin-left: 3px; }\r\n#wfr .wfr-div { height: 1px; background: #e8e8e8; margin: 12px 0; }\r\n\r\n#wfr .wfr-hl { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 10px; }\r\n#wfr .wfr-hl > div { border-radius: 12px; padding: 14px 16px; }\r\n#wfr .wfr-hl .save    { background: var(--wfr-green-lt); border: 1px solid #b6e5b6; }\r\n#wfr .wfr-hl .payback { background: var(--wfr-blue-lt);  border: 1px solid #bbd6f5; }\r\n#wfr .wfr-hl .co2     { background: #f4f8f1;             border: 1px solid #cfe3c2; }\r\n#wfr .wfr-hl-lbl { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .4px; }\r\n#wfr .save .wfr-hl-lbl    { color: #2a7a2a; }\r\n#wfr .payback .wfr-hl-lbl { color: #2060a0; }\r\n#wfr .co2 .wfr-hl-lbl     { color: #4a7030; }\r\n#wfr .co2 .wfr-hl-v .wfr-val { color: #3f6428; }\r\n#wfr .wfr-hl-v { margin-top: 3px; }\r\n#wfr .wfr-hl-v .wfr-val  { font-size: 23px; font-weight: 700; }\r\n#wfr .wfr-hl-v .wfr-unit { font-size: 13px; }\r\n#wfr .save    .wfr-hl-v .wfr-val { color: #1e6e1e; }\r\n#wfr .payback .wfr-hl-v .wfr-val { color: #1a4a80; }\r\n#wfr .wfr-hl small { display: block; margin-top: 4px; font-size: 11px; color: var(--wfr-muted); }\r\n\r\n#wfr details.wfr-meth { border: 1px dashed var(--wfr-border); border-radius: 12px; padding: 12px 14px; background: #fcfcfc; }\r\n#wfr details.wfr-meth summary { cursor: pointer; font-size: 13px; font-weight: 600; }\r\n#wfr details.wfr-meth .wfr-small { margin-top: 10px; }\r\n#wfr details.wfr-meth ul { padding-left: 18px; margin: 6px 0; }\r\n\r\n#wfr .wfr-cta {\r\n  display: flex; flex-wrap: wrap; gap: 10px;\r\n  align-items: center; justify-content: center; padding: 4px 0;\r\n}\r\n#wfr .wfr-cta button.wfr-secondary {\r\n  background: #fff !important;\r\n  color: var(--wfr-green-dk) !important;\r\n  border: 1.5px solid var(--wfr-green) !important;\r\n  box-shadow: none !important;\r\n}\r\n#wfr .wfr-cta button.wfr-secondary:hover { background: #f2fbf2 !important; }\r\n#wfr .wfr-cta button:disabled { opacity: .6; cursor: default; }\r\n@media (max-width: 520px) {\r\n  #wfr .wfr-cta { flex-direction: column; }\r\n  #wfr .wfr-cta button { width: 100% !important; justify-content: center; }\r\n}\r\n#wfr .wfr-cta button {\r\n  display: inline-flex !important; align-items: center; gap: 9px;\r\n  width: auto !important; min-width: 0 !important;\r\n  padding: 14px 28px !important;\r\n  margin: 0 !important;\r\n  background: var(--wfr-green) !important; background-image: none !important;\r\n  color: #fff !important;\r\n  border: none !important; border-radius: 999px !important;\r\n  font-size: 15px !important; font-weight: 600 !important;\r\n  line-height: 1.2 !important; text-transform: none !important; letter-spacing: normal !important;\r\n  cursor: pointer; font-family: inherit;\r\n  box-shadow: 0 3px 12px rgba(46,139,46,.25) !important;\r\n  -webkit-appearance: none; appearance: none;\r\n}\r\n#wfr .wfr-cta button:hover { background: var(--wfr-green-dk) !important; }\r\n\r\n\/* Modal *\/\r\n#wfr-modal {\r\n  display: none; position: fixed; inset: 0; background: rgba(0,0,0,.45);\r\n  z-index: 99999; align-items: center; justify-content: center; padding: 16px;\r\n}\r\n#wfr-modal.open { display: flex; }\r\n#wfr-modal .wfr-m {\r\n  background: #fff; border-radius: 16px; padding: 24px; width: 100%;\r\n  max-width: 480px; max-height: 90vh; overflow-y: auto; position: relative;\r\n  font-family: system-ui, -apple-system, \"Segoe UI\", Arial, sans-serif;\r\n  color: #222; font-size: 14px; line-height: 1.45;\r\n}\r\n#wfr-modal .wfr-m h3 { margin: 0 0 4px; font-size: 17px; }\r\n#wfr-modal .wfr-m p.msub { font-size: 12px; color: #888; margin: 0 0 16px; }\r\n#wfr-modal .wfr-m label { display: block; font-size: 13px; margin: 12px 0 5px; }\r\n#wfr-modal .wfr-m input, #wfr-modal .wfr-m textarea {\r\n  width: 100%; padding: 10px 12px; border: 1px solid #cfcfcf;\r\n  border-radius: 10px; background: #fbfdff; font-size: 13px; font-family: inherit;\r\n}\r\n#wfr-modal .wfr-m textarea { resize: vertical; min-height: 76px; }\r\n\/* Schlie\u00dfen-Button: gegen Theme-Styles abgesichert.\r\n   WordPress-Themes setzen bei <button> gern padding, min-width, line-height\r\n   und background-image \u2013 dadurch wird aus dem Kreis sonst ein Oval. *\/\r\n#wfr-modal .wfr-close {\r\n  position: absolute !important;\r\n  top: 14px !important;\r\n  right: 14px !important;\r\n  width: 32px !important;\r\n  height: 32px !important;\r\n  min-width: 32px !important;\r\n  max-width: 32px !important;\r\n  min-height: 32px !important;\r\n  padding: 0 !important;\r\n  margin: 0 !important;\r\n  border: none !important;\r\n  border-radius: 50% !important;\r\n  background: #f2f2f2 !important;\r\n  background-image: none !important;\r\n  color: #555 !important;\r\n  font-size: 16px !important;\r\n  font-weight: 400 !important;\r\n  line-height: 1 !important;\r\n  letter-spacing: normal !important;\r\n  text-transform: none !important;\r\n  text-indent: 0 !important;\r\n  box-shadow: none !important;\r\n  cursor: pointer;\r\n  -webkit-appearance: none;\r\n  appearance: none;\r\n  display: flex !important;\r\n  align-items: center !important;\r\n  justify-content: center !important;\r\n  flex: none !important;\r\n}\r\n#wfr-modal .wfr-close:hover { background: #e5e5e5 !important; }\r\n#wfr-modal .wfr-close:focus-visible { outline: 2px solid #7cbf7c; outline-offset: 2px; }\r\n#wfr-modal .wfr-msum {\r\n  background: #f7fbf7; border: 1px solid #d0ecd0; border-radius: 10px;\r\n  padding: 10px 12px; margin-top: 14px; font-size: 12px; line-height: 1.65;\r\n}\r\n#wfr-modal .wfr-consent {\r\n  display: flex; gap: 8px; align-items: flex-start; margin-top: 14px; font-size: 11.5px; color: #555;\r\n}\r\n#wfr-modal .wfr-consent input { width: auto; margin-top: 2px; flex-shrink: 0; }\r\n#wfr-modal .wfr-send {\r\n  display: block !important;\r\n  width: 100% !important;\r\n  margin: 16px 0 0 !important;\r\n  padding: 13px !important;\r\n  background: #2e8b2e !important; background-image: none !important;\r\n  color: #fff !important;\r\n  border: none !important; border-radius: 999px !important;\r\n  font-size: 15px !important; font-weight: 600 !important;\r\n  line-height: 1.2 !important; text-transform: none !important; letter-spacing: normal !important;\r\n  box-shadow: none !important;\r\n  cursor: pointer; font-family: inherit;\r\n  -webkit-appearance: none; appearance: none;\r\n}\r\n#wfr-modal .wfr-send:hover { background: #236e23 !important; }\r\n#wfr-modal .wfr-send:disabled { background: #aaa !important; cursor: default; }\r\n\r\n@media (max-width: 860px) {\r\n  #wfr .wfr-hl { grid-template-columns: 1fr 1fr; }\r\n  #wfr .wfr-hl .co2 { grid-column: 1 \/ -1; }\r\n}\r\n@media (max-width: 720px) {\r\n  #wfr .wfr-g2 { grid-template-columns: 1fr; }\r\n  #wfr .wfr-hl { grid-template-columns: 1fr; }\r\n  #wfr .wfr-res-head, #wfr .wfr-row { grid-template-columns: 1fr 80px 80px; }\r\n}\r\n@media print {\r\n  #wfr .wfr-cta, #wfr-modal { display: none !important; }\r\n}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<div id=\"wfr\">\r\n  <h2>Sanierungsrechner Zellulosed\u00e4mmung<\/h2>\r\n  <p class=\"wfr-sub\">\r\n    Berechnet den U-Wert Ihres Bestandsbauteils, die j\u00e4hrliche Heizkosten\u00adersparnis durch\r\n    eine Zellulose-Einblasd\u00e4mmung und die Amortisationszeit.\r\n    Grundlage: Transmissions\u00adw\u00e4rmeverlust nach dem Heizgradtag\u00adverfahren (EN ISO 6946 \/ \u00d6NORM B 8110).\r\n  <\/p>\r\n\r\n  <form class=\"wfr-stack\" id=\"wfr-form\" onsubmit=\"return false;\">\r\n\r\n    <!-- \u2550\u2550 SCHRITT 1 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n    <div class=\"wfr-card\">\r\n      <h3><span class=\"wfr-step\">1<\/span>Welches Bauteil m\u00f6chten Sie d\u00e4mmen?<\/h3>\r\n\r\n      <div class=\"wfr-g2\">\r\n        <div>\r\n          <label for=\"wfr-component\">Bauteil<\/label>\r\n          <select id=\"wfr-component\">\r\n            <option value=\"wall\">Au\u00dfenwand<\/option>\r\n            <option value=\"roof\">Dachschr\u00e4ge<\/option>\r\n            <option value=\"ceiling\">Decke (oberste Gescho\u00dfdecke \/ Kellerdecke)<\/option>\r\n          <\/select>\r\n        <\/div>\r\n        <div>\r\n          <label for=\"wfr-boundary\">\r\n            Das Bauteil grenzt an\r\n            <span class=\"wfr-i\"><span role=\"button\" tabindex=\"0\" aria-label=\"Erkl\u00e4rung\">i<\/span>\r\n              <span class=\"wfr-tip\">Bestimmt den Temperatur-Korrekturfaktor f<sub>x<\/sub> nach\r\n              \u00d6NORM B 8110-6 \/ DIN 4108-6. Unbeheizte Dachb\u00f6den und Keller sind w\u00e4rmer als die\r\n              Au\u00dfenluft, der W\u00e4rmeverlust ist entsprechend geringer.<\/span>\r\n            <\/span>\r\n          <\/label>\r\n          <select id=\"wfr-boundary\"><\/select>\r\n          <div class=\"wfr-hint\" id=\"wfr-boundary-hint\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- \u2550\u2550 SCHRITT 2 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n    <div class=\"wfr-card\">\r\n      <h3><span class=\"wfr-step\">2<\/span>Wie ist der Bestand aufgebaut?<\/h3>\r\n\r\n      <label for=\"wfr-construction\">Bestandskonstruktion<\/label>\r\n      <select id=\"wfr-construction\"><\/select>\r\n      <div id=\"wfr-db-status\" class=\"wfr-status warn\">Konstruktions\u00addatenbank wird geladen \u2026<\/div>\r\n      <div id=\"wfr-note\" class=\"wfr-hint\"><\/div>\r\n\r\n      <div id=\"wfr-layers\" class=\"wfr-layers\"><\/div>\r\n\r\n      <div class=\"wfr-mt\">\r\n        <button type=\"button\" class=\"wfr-btn\" id=\"wfr-add-layer\">+ Eigene Schicht hinzuf\u00fcgen<\/button>\r\n        <div class=\"wfr-hint\">F\u00fcr abweichende Aufbauten: zus\u00e4tzliche Putz-, Holz-, D\u00e4mm- oder Luftschichten.<\/div>\r\n      <\/div>\r\n      <div id=\"wfr-custom\"><\/div>\r\n\r\n      <div class=\"wfr-hr\"><\/div>\r\n\r\n      <div class=\"wfr-g2\">\r\n        <div>\r\n          <label for=\"wfr-area\">Zu d\u00e4mmende Fl\u00e4che (m\u00b2)<\/label>\r\n          <input id=\"wfr-area\" type=\"number\" min=\"1\" max=\"10000\" step=\"1\" value=\"80\" \/>\r\n          <div class=\"wfr-hint\">Brutto-Bauteilfl\u00e4che abz\u00fcglich Fenster und T\u00fcren.<\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- \u2550\u2550 SCHRITT 3 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n    <div class=\"wfr-card\">\r\n      <h3><span class=\"wfr-step\">3<\/span>Geplante Zellulosed\u00e4mmung<\/h3>\r\n\r\n      <div class=\"wfr-g2\">\r\n        <div>\r\n          <label for=\"wfr-thk\">D\u00e4mmst\u00e4rke (cm)<\/label>\r\n          <input id=\"wfr-thk\" type=\"number\" min=\"0\" max=\"60\" step=\"1\" value=\"20\" \/>\r\n          <div class=\"wfr-hint\" id=\"wfr-thk-hint\"><\/div>\r\n        <\/div>\r\n        <div>\r\n          <label for=\"wfr-extra\">\r\n            Zusatzkosten pro m\u00b2 (\u20ac, optional)\r\n            <span class=\"wfr-i\"><span role=\"button\" tabindex=\"0\" aria-label=\"Erkl\u00e4rung\">i<\/span>\r\n              <span class=\"wfr-tip\">Ausf\u00fchrungskosten je m\u00b2: Unterkonstruktion, Beplankung,\r\n              Dampfbremse, Ger\u00fcst, Verkleidung, Maler- und Spachtelarbeiten, Einblasleistung.\r\n              Bleibt das Feld auf 0, enth\u00e4lt die Amortisation nur die Materialkosten.<\/span>\r\n            <\/span>\r\n          <\/label>\r\n          <input id=\"wfr-extra\" type=\"number\" min=\"0\" max=\"1000\" step=\"1\" value=\"0\" \/>\r\n          <div class=\"wfr-hint\" id=\"wfr-extra-hint\">0 = nur Materialkosten Zellulose.<\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- \u2550\u2550 SCHRITT 4 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n    <div class=\"wfr-card\">\r\n      <h3><span class=\"wfr-step\">4<\/span>Standort &amp; Heizung<\/h3>\r\n\r\n      <div class=\"wfr-g2\">\r\n        <div>\r\n          <label for=\"wfr-region\">Klimaregion<\/label>\r\n          <select id=\"wfr-region\"><\/select>\r\n        <\/div>\r\n        <div>\r\n          <label for=\"wfr-hgt\">\r\n            Heizgradtage HGT 20\/12 (Kd)\r\n            <span class=\"wfr-i\"><span role=\"button\" tabindex=\"0\" aria-label=\"Erkl\u00e4rung\">i<\/span>\r\n              <span class=\"wfr-tip\">Summe der t\u00e4glichen Differenz zwischen 20 \u00b0C Raumtemperatur\r\n              und mittlerer Au\u00dfentemperatur \u00fcber alle Heiztage, Heizgrenze 12 \u00b0C.\r\n              Die hinterlegten Werte sind Langzeitmittel. Stationsgenaue Werte: GeoSphere\r\n              Austria bzw. DWD.<\/span>\r\n            <\/span>\r\n          <\/label>\r\n          <input id=\"wfr-hgt\" type=\"number\" min=\"500\" max=\"7000\" step=\"10\" value=\"3200\" \/>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"wfr-g2 wfr-mt\">\r\n        <div>\r\n          <label for=\"wfr-system\">Heizsystem<\/label>\r\n          <select id=\"wfr-system\"><\/select>\r\n        <\/div>\r\n        <div>\r\n          <label for=\"wfr-price\" id=\"wfr-price-label\">\r\n            Brennstoffpreis (\u20ac pro kWh)\r\n            <span class=\"wfr-i\"><span role=\"button\" tabindex=\"0\" aria-label=\"Erkl\u00e4rung\">i<\/span>\r\n              <span class=\"wfr-tip\">Preis je Kilowattstunde eingekaufter Energie laut Rechnung.\r\n              Die Verluste des W\u00e4rmeerzeugers sind nicht enthalten; sie werden \u00fcber den\r\n              Nutzungsgrad im n\u00e4chsten Feld ber\u00fccksichtigt.<\/span>\r\n            <\/span>\r\n          <\/label>\r\n          <input id=\"wfr-price\" type=\"number\" min=\"0\" max=\"2\" step=\"0.001\" value=\"0.120\" \/>\r\n          <div class=\"wfr-hint\" id=\"wfr-price-hint\">Arbeitspreis laut Rechnung, inkl. Steuern und Abgaben.<\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"wfr-g2 wfr-mt\">\r\n        <div>\r\n          <label for=\"wfr-eff\" id=\"wfr-eff-label\">\r\n            Jahresnutzungsgrad\r\n            <span class=\"wfr-i\"><span role=\"button\" tabindex=\"0\" aria-label=\"Erkl\u00e4rung\">i<\/span>\r\n              <span class=\"wfr-tip\">Verh\u00e4ltnis von abgegebener W\u00e4rme zu eingesetzter Energie.\r\n              Der W\u00e4rmebedarf wird durch diesen Wert geteilt, um die einzukaufende Energiemenge\r\n              zu erhalten.<\/span>\r\n            <\/span>\r\n          <\/label>\r\n          <input id=\"wfr-eff\" type=\"number\" min=\"0.2\" max=\"7\" step=\"0.01\" value=\"0.95\" \/>\r\n          <div class=\"wfr-hint\" id=\"wfr-eff-hint\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- \u2550\u2550 ERGEBNIS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n    <div class=\"wfr-card\">\r\n      <h3>Ergebnis<\/h3>\r\n\r\n      <div class=\"wfr-res-head\">\r\n        <div><\/div>\r\n        <div class=\"wfr-lbl old\">Bestand<\/div>\r\n        <div class=\"wfr-lbl new\">Ged\u00e4mmt<\/div>\r\n      <\/div>\r\n\r\n      <div class=\"wfr-row\">\r\n        <div class=\"wfr-name\">U-Wert<small>W\u00e4rmedurchgangskoeffizient<\/small><\/div>\r\n        <div class=\"wfr-v\" id=\"wfr-u-old\">\u2013<\/div>\r\n        <div class=\"wfr-v new\" id=\"wfr-u-new\">\u2013<\/div>\r\n      <\/div>\r\n\r\n      <div class=\"wfr-row\">\r\n        <div class=\"wfr-name\">W\u00e4rmeverlust \u00fcber das Bauteil<small>Nutzenergie pro Jahr<\/small><\/div>\r\n        <div class=\"wfr-v\" id=\"wfr-q-old\">\u2013<\/div>\r\n        <div class=\"wfr-v new\" id=\"wfr-q-new\">\u2013<\/div>\r\n      <\/div>\r\n\r\n      <div class=\"wfr-row\">\r\n        <div class=\"wfr-name\" id=\"wfr-e-label\">Ben\u00f6tigter Brennstoff<small>das, was Sie einkaufen<\/small><\/div>\r\n        <div class=\"wfr-v\" id=\"wfr-e-old\">\u2013<\/div>\r\n        <div class=\"wfr-v new\" id=\"wfr-e-new\">\u2013<\/div>\r\n      <\/div>\r\n\r\n      <div class=\"wfr-row\">\r\n        <div class=\"wfr-name\">Heizkosten f\u00fcr dieses Bauteil<\/div>\r\n        <div class=\"wfr-v\" id=\"wfr-c-old\">\u2013<\/div>\r\n        <div class=\"wfr-v new\" id=\"wfr-c-new\">\u2013<\/div>\r\n      <\/div>\r\n\r\n      <div class=\"wfr-row\">\r\n        <div class=\"wfr-name\">\r\n          CO\u2082-Aussto\u00df\r\n          <span class=\"wfr-i\"><span role=\"button\" tabindex=\"0\" aria-label=\"Erkl\u00e4rung\">i<\/span>\r\n            <span class=\"wfr-tip\">Treibhausgase in CO\u2082-\u00c4quivalent, inklusive Vorkette\r\n            (F\u00f6rderung, Transport, Bereitstellung). Emissionsfaktoren nach\r\n            Umweltbundesamt REP-0989 (2025), \u00d6sterreich. Fernw\u00e4rme ist ein Durchschnittswert.<\/span>\r\n          <\/span>\r\n        <\/div>\r\n        <div class=\"wfr-v\" id=\"wfr-co2-old\">\u2013<\/div>\r\n        <div class=\"wfr-v new\" id=\"wfr-co2-new\">\u2013<\/div>\r\n      <\/div>\r\n\r\n      <div class=\"wfr-div\"><\/div>\r\n\r\n      <div class=\"wfr-row--single\">\r\n        <div class=\"wfr-name\">Zellulose-Bedarf<\/div>\r\n        <div class=\"wfr-v\" id=\"wfr-mat\">\u2013<\/div>\r\n      <\/div>\r\n      <div class=\"wfr-row--single\">\r\n        <div class=\"wfr-name\">Materialkosten Zellulose<\/div>\r\n        <div class=\"wfr-v\" id=\"wfr-cost-mat\">\u2013<\/div>\r\n      <\/div>\r\n      <div class=\"wfr-row--single\" id=\"wfr-row-extra\" style=\"display:none;\">\r\n        <div class=\"wfr-name\">Zusatzkosten<small>Ausf\u00fchrung<\/small><\/div>\r\n        <div class=\"wfr-v\" id=\"wfr-cost-extra\">\u2013<\/div>\r\n      <\/div>\r\n      <div class=\"wfr-row--single\">\r\n        <div class=\"wfr-name\"><b>Gesamtinvestition<\/b><\/div>\r\n        <div class=\"wfr-v\" id=\"wfr-invest\">\u2013<\/div>\r\n      <\/div>\r\n\r\n      <div class=\"wfr-hl\">\r\n        <div class=\"save\">\r\n          <div class=\"wfr-hl-lbl\">Ersparnis pro Jahr<\/div>\r\n          <div class=\"wfr-hl-v\" id=\"wfr-save\">\u2013<\/div>\r\n          <small id=\"wfr-save20\"><\/small>\r\n        <\/div>\r\n        <div class=\"payback\">\r\n          <div class=\"wfr-hl-lbl\">Amortisation<\/div>\r\n          <div class=\"wfr-hl-v\" id=\"wfr-payback\">\u2013<\/div>\r\n          <small id=\"wfr-opt\"><\/small>\r\n        <\/div>\r\n        <div class=\"co2\">\r\n          <div class=\"wfr-hl-lbl\">CO\u2082-Einsparung pro Jahr<\/div>\r\n          <div class=\"wfr-hl-v\" id=\"wfr-co2-save\">\u2013<\/div>\r\n          <small id=\"wfr-co2-20\"><\/small>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div id=\"wfr-warnings\"><\/div>\r\n    <\/div>\r\n\r\n    <!-- \u2550\u2550 METHODIK \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n    <details class=\"wfr-meth\">\r\n      <summary>Rechenweg, Annahmen und Grenzen dieser Berechnung<\/summary>\r\n      <div class=\"wfr-small\">\r\n        <p><b>Rechenweg<\/b><\/p>\r\n        <ul>\r\n          <li>U-Wert: <code>U = 1 \/ (R<sub>si<\/sub> + \u03a3 d\/\u03bb + R<sub>se<\/sub>)<\/code> nach EN ISO 6946.\r\n              W\u00e4rme\u00fcbergangswiderst\u00e4nde abh\u00e4ngig von W\u00e4rmestromrichtung\r\n              (waagrecht 0,13\/0,04 \u2013 aufw\u00e4rts 0,10\/0,04 \u2013 abw\u00e4rts 0,17\/0,17).<\/li>\r\n          <li>W\u00e4rmeverlust: <code>Q = U \u00b7 A \u00b7 HGT \u00b7 24 \/ 1000 \u00b7 f<sub>x<\/sub><\/code> [kWh\/a].\r\n              f<sub>x<\/sub> ist der Temperatur-Korrekturfaktor f\u00fcr Bauteile, die nicht an Au\u00dfenluft grenzen\r\n              (\u00d6NORM B 8110-6 \/ DIN 4108-6, N\u00e4herungswerte). Solare und interne Gewinne sind \u00fcber\r\n              die Heizgrenze von 12 \u00b0C in den Heizgradtagen bereits pauschal ber\u00fccksichtigt.<\/li>\r\n          <li>Einblasd\u00e4mmung in einen vorhandenen Hohlraum \u2013 Sparrenfeld, Gefach, Balkenlage \u2013\r\n              <b>ersetzt<\/b> dessen Luftschicht, statt eine weitere Schicht davorzusetzen.\r\n              Der Holzanteil von Sparren, St\u00e4ndern und Balken geht mit rund 15 % \u00fcber ein\r\n              gemischtes \u03bb ein (oberer Grenzwert nach EN ISO 6946). Eine D\u00e4mmst\u00e4rke \u00fcber der\r\n              Hohlraumtiefe wird als Aufdopplung gerechnet.<\/li>\r\n          <li>Eingekaufte Energie: <code>E = Q \/ \u03b7<\/code> \u2013 bei Kesseln der Jahresnutzungsgrad,\r\n              bei W\u00e4rmepumpen die Jahresarbeitszahl. Der eingegebene Preis gilt pro Kilowattstunde\r\n              <b>eingekaufter<\/b> Energie (so wie auf Ihrer Rechnung). Die Verluste des\r\n              W\u00e4rmeerzeugers werden auf die Menge aufgeschlagen, nicht auf den Preis.<\/li>\r\n          <li>CO\u2082: eingekaufte Energie \u00d7 Emissionsfaktor in CO\u2082-\u00c4quivalent, inklusive Vorkette.\r\n              Faktoren nach Umweltbundesamt REP-0989, ver\u00f6ffentlicht 2025; die zugrunde liegenden\r\n              Stromdaten betreffen 2023. Fernw\u00e4rme ist ein \u00f6sterreichischer Durchschnitt und\r\n              netzabh\u00e4ngig. Der Herstellungsaufwand des D\u00e4mmstoffs ist nicht enthalten \u2013 Zellulose aus\r\n              Altpapier schneidet dort gegen\u00fcber mineralischen und erd\u00f6lbasierten\r\n              D\u00e4mmstoffen deutlich besser ab.<\/li>\r\n          <li>Materialbedarf: Einblasdichte \u00d7 D\u00e4mmst\u00e4rke \u00d7 Fl\u00e4che,\r\n              aufgerundet auf ganze S\u00e4cke \u00e0 13 kg.<\/li>\r\n          <li>Amortisation: Investition \u00f7 j\u00e4hrliche Ersparnis. Statisch gerechnet, ohne Finanzierung,\r\n              Preis\u00e4nderungen, F\u00f6rderungen und Folgekosten. Grund- und Leistungspreise des\r\n              Energieversorgers sind nicht enthalten.<\/li>\r\n        <\/ul>\r\n\r\n        <p><b>Was diese Rechnung <u>nicht<\/u> abbildet<\/b><\/p>\r\n        <ul>\r\n          <li>Lineare W\u00e4rmebr\u00fccken an Anschl\u00fcssen: Traufe, Geb\u00e4udeecke, Balkenkopf, Fensterlaibung.\r\n              Der fl\u00e4chige Holzanteil von Sparren und St\u00e4ndern ist dagegen in der Rechnung enthalten.<\/li>\r\n          <li>L\u00fcftungsw\u00e4rmeverluste und die \u00fcbrigen Bauteile der Geb\u00e4udeh\u00fclle.<\/li>\r\n          <li>Verbesserter Sommerhitzeschutz, Schallschutz, Behaglichkeit, Wertsteigerung\r\n              und m\u00f6gliche F\u00f6rderungen \u2013 alles Punkte, die zus\u00e4tzlich f\u00fcr die Ma\u00dfnahme sprechen.<\/li>\r\n          <li>Feuchtetechnische Pr\u00fcfung des Aufbaus. Vor allem bei Innend\u00e4mmung ist das zwingend\r\n              gesondert zu beurteilen.<\/li>\r\n        <\/ul>\r\n\r\n        <p><b>Datengrundlage<\/b><\/p>\r\n        <ul>\r\n          <li>\u03bb-Werte: Bemessungswerte nach \u00d6NORM B 8110-7 \/ DIN 4108-4, f\u00fcr historische Baustoffe\r\n              Literaturwerte. Bestandsbaustoffe streuen erheblich \u2013 die Vorlagen sind Richtwerte,\r\n              keine Bestandsaufnahme.<\/li>\r\n          <li>Zellulose: Nennwert \u03bb<sub>D<\/sub> = 0,037 W\/(m\u00b7K); gerechnet wird mit dem Bemessungswert\r\n              f\u00fcr \u00d6sterreich \u03bb = <span id=\"wfr-lam-txt\"><\/span> W\/(m\u00b7K) (Deutschland 0,039).<\/li>\r\n          <li>Heizgradtage: Langzeit-Mittelwerte HGT 20\/12 als Regionsrichtwerte. Einzelne Jahre und\r\n              der konkrete Standort weichen davon ab; stationsgenaue Werte gibt es bei GeoSphere Austria\r\n              bzw. beim DWD.<\/li>\r\n        <\/ul>\r\n        <p><b>Diese Berechnung ersetzt keine Energieausweis-Berechnung und keine Fachplanung.\r\n           Alle Angaben ohne Gew\u00e4hr.<\/b><\/p>\r\n      <\/div>\r\n    <\/details>\r\n\r\n    <div class=\"wfr-cta\">\r\n      <button type=\"button\" id=\"wfr-contact\">\r\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"3\"\/><polyline points=\"2,4 12,13 22,4\"\/>\r\n        <\/svg>\r\n        Unverbindliches Angebot anfragen\r\n      <\/button>\r\n      <button type=\"button\" class=\"wfr-secondary\" id=\"wfr-pdf\">\r\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"\/><polyline points=\"7,10 12,15 17,10\"\/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"\/>\r\n        <\/svg>\r\n        Berechnung als PDF speichern\r\n      <\/button>\r\n    <\/div>\r\n    <div class=\"wfr-small\" id=\"wfr-pdf-status\" style=\"text-align:center;margin-top:-4px;\"><\/div>\r\n\r\n  <\/form>\r\n<\/div>\r\n\r\n<!-- \u2550\u2550 KONTAKT-MODAL \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<div id=\"wfr-modal\">\r\n  <div class=\"wfr-m\">\r\n    <button class=\"wfr-close\" id=\"wfr-modal-close\" aria-label=\"Schlie\u00dfen\" type=\"button\">\u2715<\/button>\r\n    <h3>Angebot anfragen<\/h3>\r\n    <p class=\"msub\">Wir melden uns schnellstm\u00f6glich bei Ihnen.<\/p>\r\n\r\n    <label for=\"wfr-ct-name\">Name *<\/label>\r\n    <input type=\"text\" id=\"wfr-ct-name\" autocomplete=\"name\" placeholder=\"Max Mustermann\" \/>\r\n\r\n    <label for=\"wfr-ct-email\">E-Mail *<\/label>\r\n    <input type=\"email\" id=\"wfr-ct-email\" autocomplete=\"email\" placeholder=\"ihre@email.at\" \/>\r\n\r\n    <label for=\"wfr-ct-phone\">Telefon<\/label>\r\n    <input type=\"tel\" id=\"wfr-ct-phone\" autocomplete=\"tel\" placeholder=\"+43 \u2026\" \/>\r\n\r\n    <label for=\"wfr-ct-msg\">Nachricht<\/label>\r\n    <textarea id=\"wfr-ct-msg\" placeholder=\"Baujahr, Ort, Fragen \u2026\"><\/textarea>\r\n\r\n    <div style=\"position:absolute;left:-9999px;\" aria-hidden=\"true\">\r\n      <label for=\"wfr-ct-hp\">Website<\/label>\r\n      <input type=\"text\" id=\"wfr-ct-hp\" tabindex=\"-1\" autocomplete=\"off\" \/>\r\n    <\/div>\r\n\r\n    <div class=\"wfr-msum\" id=\"wfr-ct-summary\"><\/div>\r\n\r\n    <label class=\"wfr-consent\">\r\n      <input type=\"checkbox\" id=\"wfr-ct-consent\" \/>\r\n      <span>Ich stimme zu, dass meine Angaben und Rechnerergebnisse zur Bearbeitung meiner Anfrage\r\n      gespeichert und verarbeitet werden. Weitere Informationen in der\r\n      <a href=\"https:\/\/wolfinger.at\/daemmen\/datenschutz\/\" target=\"_blank\" rel=\"noopener\">Datenschutzerkl\u00e4rung<\/a>. *<\/span>\r\n    <\/label>\r\n\r\n    <div id=\"wfr-ct-status\" style=\"font-size:12px;color:#c00;margin-top:8px;display:none;\"><\/div>\r\n    <button type=\"button\" class=\"wfr-send\" id=\"wfr-ct-send\">Anfrage senden<\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function () {\r\n  \"use strict\";\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     KONFIGURATION \u2013 hier alles zentral anpassbar\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n  var CFG = {\r\n    dbUrl: \"https:\/\/downloads.wolfinger.at\/tools\/constructions.json\",\r\n\r\n    \/* WICHTIG: Die WordPress-Installation liegt unter \/daemmen\/, nicht im Root.\r\n       Die REST-Basis ist deshalb  wolfinger.at\/daemmen\/wp-json\/  \u2013 ohne \"\/daemmen\"\r\n       landet die Anfrage in der falschen Installation und liefert 404.\r\n       wpBase muss auf die Installation zeigen, in der das Plugin aktiv ist. *\/\r\n    wpBase: \"https:\/\/wolfinger.at\/daemmen\",\r\n\r\n    cellulose: {\r\n      lambda:     0.038,   \/\/ Bemessungswert \u00d6sterreich; Nennwert 0,037, Deutschland 0,039\r\n      lambdaHolz: 0.13,    \/\/ f\u00fcr den Holzanteil in gef\u00fcllten Hohlr\u00e4umen\r\n      bagPriceEur: 23.30,\r\n      bagWeightKg: 13.0\r\n    },\r\n    \/\/ Einblasdichten in kg\/m\u00b3 \u2013 je nach Einbausituation\r\n    density: { wall: 60, roof: 55, ceiling: 40 },\r\n\r\n    horizonYears: 20,      \/\/ Betrachtungszeitraum f\u00fcr \"Ersparnis in X Jahren\"\r\n    datenstand: \"08\/2026\", \/\/ erscheint im PDF-Fu\u00df \u2013 bei Preis\u00e4nderungen mitpflegen\r\n\r\n    \/* \u2500\u2500 PDF-Export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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       jsPDF muss geladen werden. SELBST HOSTEN ist die datenschutz-\r\n       freundliche Variante: beim Laden von einem CDN wird die IP-Adresse\r\n       des Besuchers an einen Drittanbieter \u00fcbertragen \u2013 daf\u00fcr br\u00e4uchte es\r\n       eine Einwilligung (vgl. Google-Fonts-Urteile).\r\n\r\n       1. Die mitgelieferte Datei jspdf.umd.min.js (jsPDF 4.2.1, MIT-Lizenz)\r\n          auf den eigenen Server legen, z. B. nach\r\n          \/daemmen\/wp-content\/uploads\/tools\/jspdf.umd.min.js\r\n       2. Den Pfad unten eintragen.\r\n\r\n       Notfalls funktioniert auch ein CDN, dann aber bitte im Cookie-\/\r\n       Consent-Banner ber\u00fccksichtigen:\r\n       https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js   *\/\r\n    jsPdfUrl: \"https:\/\/wolfinger.at\/daemmen\/wp-content\/uploads\/tools\/jspdf.umd.min.js\",\r\n\r\n    \/* Firmenlogo f\u00fcr den PDF-Kopf. Muss auf derselben Domain liegen wie der\r\n       Rechner, sonst blockiert der Browser das Auslesen des Bildes.\r\n       L\u00e4sst sich das Bild nicht laden, wird stattdessen der Firmenname gesetzt. *\/\r\n    logoUrl: \"https:\/\/wolfinger.at\/daemmen\/wp-content\/uploads\/2025\/07\/WOLF_Logo_RGB_Web.png\",\r\n    logoBreiteMm: 58,\r\n\r\n    \/* Angaben f\u00fcr den PDF-Fu\u00df *\/\r\n    firma: {\r\n      name:     \"Wolfinger Zellulosed\u00e4mmung\",\r\n      strasse:  \"Neuhofenstra\u00dfe 19\",\r\n      ort:      \"4521 Schiedlberg\",\r\n      telefon:  \"\",                    \/\/ optional \u2013 bleibt leer einfach weg\r\n      email:    \"daemmen@wolfinger.at\",\r\n      web:      \"wolfinger.at\"\r\n    },\r\n    \/* Markenfarbe aus dem Logo *\/\r\n    brand: [67, 172, 68]\r\n  };\r\n\r\n\r\n  \/* W\u00e4rme\u00fcbergangswiderst\u00e4nde nach EN ISO 6946 *\/\r\n  var RS = {\r\n    horizontal: { si: 0.13, seOut: 0.04, seIn: 0.13 },\r\n    up:         { si: 0.10, seOut: 0.04, seIn: 0.10 },\r\n    down:       { si: 0.17, seOut: 0.04, seIn: 0.17 }\r\n  };\r\n\r\n  \/* Anschlusssituationen mit Temperatur-Korrekturfaktor fx\r\n     (\u00d6NORM B 8110-6 \/ DIN 4108-6) *\/\r\n  var BOUNDARIES = {\r\n    \/* Die Dachschr\u00e4ge grenzt an Au\u00dfenluft, der W\u00e4rmestrom verl\u00e4uft aber aufw\u00e4rts. *\/\r\n    outside:      { label: \"Au\u00dfenluft\",                                fx: 1.00, flow: \"horizontal\", flowByComponent: { roof: \"up\" }, innerSide: false, comps: [\"wall\", \"roof\"] },\r\n    unheated:     { label: \"Unbeheizter Raum (Garage, Nebengeb\u00e4ude)\",  fx: 0.50, flow: \"horizontal\", innerSide: true,  comps: [\"wall\"] },\r\n    attic:        { label: \"Unbeheizter Dachboden (dar\u00fcber)\",          fx: 0.90, flow: \"up\",         innerSide: true,  comps: [\"ceiling\"] },\r\n    outside_up:   { label: \"Au\u00dfenluft dar\u00fcber (Flachdach, Terrasse)\",  fx: 1.00, flow: \"up\",         innerSide: false, comps: [\"ceiling\"] },\r\n    basement:     { label: \"Unbeheizter Keller (darunter)\",            fx: 0.60, flow: \"down\",       innerSide: true,  comps: [\"ceiling\"] },\r\n    outside_down: { label: \"Au\u00dfenluft darunter (Durchfahrt, Erker)\",   fx: 1.00, flow: \"down\",       innerSide: false, comps: [\"ceiling\"] }\r\n  };\r\n  var DEFAULT_BOUNDARY = { wall: \"outside\", roof: \"outside\", ceiling: \"attic\" };\r\n\r\n  \/* Heizsysteme\r\n     price  = \u20ac pro kWh eingekaufter Energie (Brennstoff, Strom, Fernw\u00e4rme)\r\n     eff    = Jahresnutzungsgrad (Kessel) bzw. Jahresarbeitszahl (W\u00e4rmepumpe)\r\n     preis  = Beschriftung des Preisfeldes\r\n     bedarf = Beschriftung der Ergebniszeile\r\n     co2    = g CO2-\u00c4quivalent je kWh Endenergie, inkl. Vorkette.\r\n              Quelle: Umweltbundesamt, \"Harmonisierte \u00f6sterreichische direkte und\r\n              vorgelagerte THG-Emissionsfaktoren\", REP-0989, Datenstand 2025.\r\n              ACHTUNG f\u00fcr Deutschland: Der Strommix liegt dort deutlich h\u00f6her\r\n              (rund 380 statt 152 g\/kWh).                                    *\/\r\n  var SYSTEMS = {\r\n    gas_bw:    { label: \"Gas \u2013 Brennwertkessel\",            price: 0.120, eff: 0.95, kind: \"eta\", preis: \"Gaspreis\",           bedarf: \"Ben\u00f6tigtes Gas\",           co2: 225 },\r\n    gas_old:   { label: \"Gas \u2013 Heizwertkessel (vor ~2000)\", price: 0.120, eff: 0.82, kind: \"eta\", preis: \"Gaspreis\",           bedarf: \"Ben\u00f6tigtes Gas\",           co2: 249 },\r\n    oil:       { label: \"Heiz\u00f6l\",                           price: 0.110, eff: 0.85, kind: \"eta\", preis: \"Heiz\u00f6lpreis\",        bedarf: \"Ben\u00f6tigtes Heiz\u00f6l\",        co2: 342 },\r\n    pellets:   { label: \"Pellets\",                          price: 0.085, eff: 0.85, kind: \"eta\", preis: \"Pelletspreis\",       bedarf: \"Ben\u00f6tigte Pellets\",        co2:  26 },\r\n    woodchips: { label: \"Hackschnitzel\",                    price: 0.050, eff: 0.80, kind: \"eta\", preis: \"Hackschnitzelpreis\", bedarf: \"Ben\u00f6tigte Hackschnitzel\",  co2:  19 },\r\n    logwood:   { label: \"St\u00fcckholz\",                        price: 0.060, eff: 0.72, kind: \"eta\", preis: \"St\u00fcckholzpreis\",     bedarf: \"Ben\u00f6tigtes St\u00fcckholz\",     co2:  25 },\r\n    district:  { label: \"Fernw\u00e4rme\",                        price: 0.110, eff: 0.97, kind: \"eta\", preis: \"Fernw\u00e4rmepreis\",     bedarf: \"Ben\u00f6tigte Fernw\u00e4rme\",      co2: 166 },\r\n    electric:  { label: \"Strom \u2013 Direktheizung\",            price: 0.280, eff: 1.00, kind: \"eta\", preis: \"Strompreis\",         bedarf: \"Ben\u00f6tigter Strom\",         co2: 152 },\r\n    hp_air:    { label: \"W\u00e4rmepumpe Luft\/Wasser\",           price: 0.280, eff: 3.20, kind: \"jaz\", preis: \"Strompreis\",         bedarf: \"Ben\u00f6tigter Strom\",         co2: 152 },\r\n    hp_ground: { label: \"W\u00e4rmepumpe Sole\/Wasser (Erdw\u00e4rme)\", price: 0.280, eff: 4.00, kind: \"jaz\", preis: \"Strompreis\",        bedarf: \"Ben\u00f6tigter Strom\",         co2: 152 }\r\n  };\r\n\r\n  \/* Klimaregionen \u2013 Richtwerte HGT 20\/12 (Langzeitmittel) *\/\r\n  var CLIMATE = [\r\n    [\"\u00d6sterreich\", \"Wien \/ Nordburgenland\",              3200],\r\n    [\"\u00d6sterreich\", \"Nieder\u00f6sterreich (Tiefland)\",        3300],\r\n    [\"\u00d6sterreich\", \"Graz \/ Steirisches Becken\",          3400],\r\n    [\"\u00d6sterreich\", \"Linz \/ O\u00d6 Zentralraum\",              3500],\r\n    [\"\u00d6sterreich\", \"Bregenz \/ Rheintal\",                 3400],\r\n    [\"\u00d6sterreich\", \"Salzburg Stadt\",                     3700],\r\n    [\"\u00d6sterreich\", \"Klagenfurt \/ K\u00e4rntner Becken\",       3700],\r\n    [\"\u00d6sterreich\", \"Innsbruck \/ Inntal\",                 3800],\r\n    [\"\u00d6sterreich\", \"Alpine Lagen ab ca. 800 m\",          4500],\r\n    [\"Deutschland\", \"Norddeutschland (Hamburg, Berlin)\", 3300],\r\n    [\"Deutschland\", \"Mitteldeutschland (Referenz)\",      3500],\r\n    [\"Deutschland\", \"S\u00fcddeutschland (M\u00fcnchen, Allg\u00e4u)\",  3900],\r\n    [\"Schweiz\", \"Mittelland (Z\u00fcrich, Bern)\",             3400],\r\n    [\"Schweiz\", \"Alpen \/ Voralpen\",                      4300]\r\n  ];\r\n\r\n  var FALLBACK = [\r\n    { id: \"fb_wall\", name: \"Hochlochziegel 25 cm + Putz\", component: \"wall\", layers: [\r\n      { name: \"Innenputz\", d: 0.015, lambda: 0.70 },\r\n      { name: \"Hochlochziegel (alt)\", d: 0.25, lambda: 0.50 },\r\n      { name: \"Au\u00dfenputz\", d: 0.02, lambda: 0.90 }] },\r\n    { id: \"fb_roof\", name: \"Gipskarton + Holzschalung, Sparrenfeld leer\", component: \"roof\", layers: [\r\n      { name: \"Gipskarton\", d: 0.0125, lambda: 0.25 },\r\n      { name: \"Holzschalung\", d: 0.024, lambda: 0.13 }] },\r\n    { id: \"fb_ceiling\", name: \"Holzbalkendecke 20 cm, Hohlraum leer\", component: \"ceiling\", layers: [\r\n      { name: \"Dielung\", d: 0.024, lambda: 0.13 },\r\n      { name: \"Balkenlage (Luft + Holz)\", d: 0.20, R: 0.35 },\r\n      { name: \"Kalkputz\", d: 0.025, lambda: 0.70 }] }\r\n  ];\r\n\r\n  var THK_DEFAULT = { wall: 16, roof: 22, ceiling: 30 };\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     HILFSFUNKTIONEN\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n  var $ = function (id) { return document.getElementById(id); };\r\n\r\n  function num(v, fallback) {\r\n    var n = parseFloat(v);\r\n    return isFinite(n) ? n : (fallback || 0);\r\n  }\r\n  function fmt(n, d) {\r\n    if (!isFinite(n)) return \"\u2013\";\r\n    return n.toLocaleString(\"de-AT\", { minimumFractionDigits: d, maximumFractionDigits: d });\r\n  }\r\n  function out(n, d, unit) {\r\n    if (!isFinite(n)) return \"\u2013\";\r\n    return '<span class=\"wfr-val\">' + fmt(n, d) + '<\/span><span class=\"wfr-unit\">&nbsp;' + unit + \"<\/span>\";\r\n  }\r\n  function esc(s) {\r\n    return String(s).replace(\/[&<>\"]\/g, function (c) {\r\n      return { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\" }[c];\r\n    });\r\n  }\r\n\r\n  \/* W\u00e4rmedurchlasswiderstand einer Schicht: R direkt ODER d\/\u03bb *\/\r\n  function layerR(l) {\r\n    if (isFinite(l.R) && l.R > 0) return Number(l.R);\r\n    var d = num(l.d), lam = num(l.lambda);\r\n    if (d > 0 && lam > 0) return d \/ lam;\r\n    return 0;\r\n  }\r\n\r\n  \/* W\u00e4rmestromrichtung h\u00e4ngt auch vom Bauteil ab: Eine Dachschr\u00e4ge grenzt zwar\r\n     an Au\u00dfenluft, der W\u00e4rmestrom verl\u00e4uft aber aufw\u00e4rts, nicht waagrecht. *\/\r\n  function surfaceR(boundaryKey, component) {\r\n    var b = BOUNDARIES[boundaryKey] || BOUNDARIES.outside;\r\n    var flow = (b.flowByComponent && b.flowByComponent[component]) || b.flow;\r\n    var r = RS[flow];\r\n    return { si: r.si, se: b.innerSide ? r.seIn : r.seOut, flow: flow };\r\n  }\r\n\r\n  function calcU(layers, boundaryKey, component) {\r\n    var s = surfaceR(boundaryKey, component);\r\n    var R = s.si + s.se;\r\n    for (var i = 0; i < layers.length; i++) R += layerR(layers[i]);\r\n    return R > 0 ? 1 \/ R : Infinity;\r\n  }\r\n\r\n  \/* \u2500\u2500 D\u00e4mmschichten aufbauen \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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     Enth\u00e4lt der Bestand einen f\u00fcllbaren Hohlraum (cavity), wird dieser\r\n     GEF\u00dcLLT statt eine Schicht davorzusetzen: Der bisherige Luftwiderstand\r\n     entf\u00e4llt. Der Holzanteil von Sparren, St\u00e4ndern oder Balken geht \u00fcber ein\r\n     gemischtes Lambda ein (oberer Grenzwert nach EN ISO 6946).\r\n     Ist die gew\u00fcnschte D\u00e4mmst\u00e4rke gr\u00f6\u00dfer als der Hohlraum, wird der Rest als\r\n     zus\u00e4tzliche Schicht davor gerechnet \u2013 etwa eine Aufdopplung.            *\/\r\n  function insulate(base, thkM) {\r\n    var lamZ = CFG.cellulose.lambda, lamH = CFG.cellulose.lambdaHolz;\r\n    var idx = -1;\r\n    for (var i = 0; i < base.length; i++) {\r\n      if (base[i].cavity && num(base[i].d) > 0) { idx = i; break; }\r\n    }\r\n    if (thkM <= 0) return { layers: base.slice(), imCavity: 0, zusatz: 0, cavityD: idx >= 0 ? num(base[idx].d) : 0 };\r\n\r\n    if (idx < 0) {\r\n      \/* Kein Hohlraum \u2013 neue Schicht davor (Vorsatzschale, Aufblasd\u00e4mmung) *\/\r\n      var l1 = base.slice();\r\n      l1.push({ name: \"Zellulose\", d: thkM, lambda: lamZ });\r\n      return { layers: l1, imCavity: 0, zusatz: thkM, cavityD: 0 };\r\n    }\r\n\r\n    var cav = base[idx], cd = num(cav.d);\r\n    var fuell = Math.min(thkM, cd);\r\n    var rest = thkM - fuell;\r\n    var fr = isFinite(cav.framing) ? Number(cav.framing) : 0;\r\n    var lamMix = fr * lamH + (1 - fr) * lamZ;\r\n\r\n    var out = base.slice();\r\n    var neu = [{ name: \"Zellulose im Hohlraum\", d: fuell, lambda: lamMix }];\r\n    \/* Nicht gef\u00fcllter Rest des Hohlraums bleibt anteilig Luft *\/\r\n    if (fuell < cd) {\r\n      neu.push({ name: \"Rest-Hohlraum\", d: cd - fuell,\r\n                 R: layerR(cav) * (cd - fuell) \/ cd });\r\n    }\r\n    out.splice.apply(out, [idx, 1].concat(neu));\r\n    if (rest > 0) out.push({ name: \"Zellulose (Aufdopplung)\", d: rest, lambda: lamZ });\r\n\r\n    return { layers: out, imCavity: fuell, zusatz: rest, cavityD: cd };\r\n  }\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     ZUSTAND\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n  var DB = FALLBACK.slice();\r\n  var DB_INFO = \"vereinfachte Auswahl\";   \/\/ Datenstand der Vorlagen, f\u00fcr das PDF\r\n  var LAST = null;              \/\/ letzte Berechnung, f\u00fcr den PDF-Export\r\n  var customLayers = [];\r\n  var priceTouched = false;\r\n  var effTouched = false;\r\n  var hgtTouched = false;\r\n  var thkTouched = false;\r\n\r\n  var elComp = $(\"wfr-component\"), elBound = $(\"wfr-boundary\"), elConstr = $(\"wfr-construction\"),\r\n      elArea = $(\"wfr-area\"), elThk = $(\"wfr-thk\"), elExtra = $(\"wfr-extra\"),\r\n      elRegion = $(\"wfr-region\"), elHgt = $(\"wfr-hgt\"), elSys = $(\"wfr-system\"),\r\n      elPrice = $(\"wfr-price\"), elEff = $(\"wfr-eff\");\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     DROPDOWNS AUFBAUEN\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n  function buildSystems() {\r\n    var html = \"\";\r\n    for (var k in SYSTEMS) html += '<option value=\"' + k + '\">' + esc(SYSTEMS[k].label) + \"<\/option>\";\r\n    elSys.innerHTML = html;\r\n    elSys.value = \"gas_bw\";\r\n  }\r\n\r\n  function buildClimate() {\r\n    var html = \"\", grp = null;\r\n    for (var i = 0; i < CLIMATE.length; i++) {\r\n      if (CLIMATE[i][0] !== grp) {\r\n        if (grp !== null) html += \"<\/optgroup>\";\r\n        grp = CLIMATE[i][0];\r\n        html += '<optgroup label=\"' + esc(grp) + '\">';\r\n      }\r\n      html += '<option value=\"' + CLIMATE[i][2] + '\" data-label=\"' + esc(CLIMATE[i][1]) + '\">' +\r\n              esc(CLIMATE[i][1]) + \" \u2013 \" + CLIMATE[i][2].toLocaleString(\"de-AT\") + \" Kd<\/option>\";\r\n    }\r\n    html += \"<\/optgroup><option value=\\\"custom\\\" data-label=\\\"Eigener Wert\\\">Eigener Wert \u2026<\/option>\";\r\n    elRegion.innerHTML = html;\r\n    elRegion.value = \"3200\";\r\n  }\r\n\r\n  \/* Reiner Regionsname ohne den angeh\u00e4ngten Kd-Wert *\/\r\n  function regionLabel() {\r\n    var o = elRegion.options[elRegion.selectedIndex];\r\n    if (!o) return \"-\";\r\n    return o.getAttribute(\"data-label\") || o.text;\r\n  }\r\n\r\n  function buildBoundaries() {\r\n    var comp = elComp.value, prev = elBound.value, html = \"\", first = null;\r\n    for (var k in BOUNDARIES) {\r\n      if (BOUNDARIES[k].comps.indexOf(comp) === -1) continue;\r\n      if (first === null) first = k;\r\n      html += '<option value=\"' + k + '\">' + esc(BOUNDARIES[k].label) + \"<\/option>\";\r\n    }\r\n    elBound.innerHTML = html;\r\n    var wanted = (BOUNDARIES[prev] && BOUNDARIES[prev].comps.indexOf(comp) !== -1)\r\n      ? prev : (DEFAULT_BOUNDARY[comp] || first);\r\n    elBound.value = wanted;\r\n    elBound.disabled = (elBound.options.length <= 1);\r\n    updateBoundaryHint();\r\n  }\r\n\r\n  function updateBoundaryHint() {\r\n    var b = BOUNDARIES[elBound.value];\r\n    if (!b) { $(\"wfr-boundary-hint\").textContent = \"\"; return; }\r\n    $(\"wfr-boundary-hint\").textContent = \"Temperatur-Korrekturfaktor f\u2093 = \" + fmt(b.fx, 2);\r\n  }\r\n\r\n  function constructionsFor(comp) {\r\n    return DB.filter(function (c) { return c.component === comp; });\r\n  }\r\n\r\n  function buildConstructions() {\r\n    var list = constructionsFor(elComp.value), prev = elConstr.value;\r\n    elConstr.innerHTML = \"\";\r\n    if (!list.length) {\r\n      elConstr.innerHTML = '<option value=\"\">Keine Konstruktionen verf\u00fcgbar<\/option>';\r\n      elConstr.disabled = true;\r\n      return;\r\n    }\r\n    elConstr.disabled = false;\r\n    for (var i = 0; i < list.length; i++) {\r\n      var o = document.createElement(\"option\");\r\n      o.value = list[i].id; o.textContent = list[i].name;\r\n      elConstr.appendChild(o);\r\n    }\r\n    var exists = list.some(function (c) { return c.id === prev; });\r\n    if (exists) {\r\n      elConstr.value = prev;\r\n    } else {\r\n      \/* Nie eine leere Vorlage vorausw\u00e4hlen \u2013 sonst startet der Rechner mit Unsinn *\/\r\n      var firstReal = list.filter(function (c) { return c.layers && c.layers.length; })[0];\r\n      elConstr.value = (firstReal || list[0]).id;\r\n    }\r\n    applyConstructionDefaults();\r\n  }\r\n\r\n  function currentConstruction() {\r\n    var list = constructionsFor(elComp.value);\r\n    for (var i = 0; i < list.length; i++) if (list[i].id === elConstr.value) return list[i];\r\n    return list[0] || null;\r\n  }\r\n\r\n  function applyConstructionDefaults() {\r\n    var c = currentConstruction();\r\n    $(\"wfr-note\").textContent = (c && c.note) ? \"Hinweis: \" + c.note : \"\";\r\n    if (c && c.defaultBoundary && BOUNDARIES[c.defaultBoundary] &&\r\n        BOUNDARIES[c.defaultBoundary].comps.indexOf(elComp.value) !== -1) {\r\n      elBound.value = c.defaultBoundary;\r\n      updateBoundaryHint();\r\n    }\r\n  }\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     SCHICHTEN ANZEIGEN\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n  function allLayers() {\r\n    var c = currentConstruction();\r\n    return (c && c.layers ? c.layers : []).concat(customLayers);\r\n  }\r\n\r\n  function renderLayers() {\r\n    var layers = allLayers(), s = surfaceR(elBound.value, elComp.value);\r\n    if (!layers.length) {\r\n      $(\"wfr-layers\").innerHTML =\r\n        '<span style=\"color:#8a5a00;\">Keine Bestandsschichten hinterlegt \u2013 bitte eigene Schichten hinzuf\u00fcgen, ' +\r\n        'sonst wird nur der W\u00e4rme\u00fcbergang gerechnet.<\/span>';\r\n      return;\r\n    }\r\n    var rows = \"\", Rsum = s.si + s.se;\r\n    rows += '<tr><td style=\"color:#999;\">W\u00e4rme\u00fcbergang innen R<sub>si<\/sub><\/td>' +\r\n            '<td class=\"wfr-num\">' + fmt(s.si, 2) + \" m\u00b2K\/W<\/td><\/tr>\";\r\n    for (var i = 0; i < layers.length; i++) {\r\n      var l = layers[i], R = layerR(l);\r\n      Rsum += R;\r\n      var spec = isFinite(l.R) && l.R > 0\r\n        ? \"R = \" + fmt(l.R, 2)\r\n        : \"\u03bb = \" + fmt(num(l.lambda), 3);\r\n      var mark = l.cavity\r\n        ? ' <span style=\"color:#2a8a2a;\">\u00b7 wird gef\u00fcllt<\/span>' : \"\";\r\n      rows += \"<tr><td>\" + esc(l.name) + ' <span style=\"color:#aaa;\">(' +\r\n              fmt(num(l.d) * 1000, 0) + \" mm, \" + spec + \")<\/span>\" + mark + \"<\/td>\" +\r\n              '<td class=\"wfr-num\">' + fmt(R, 3) + \" m\u00b2K\/W<\/td><\/tr>\";\r\n    }\r\n    rows += '<tr><td style=\"color:#999;\">W\u00e4rme\u00fcbergang au\u00dfen R<sub>se<\/sub><\/td>' +\r\n            '<td class=\"wfr-num\">' + fmt(s.se, 2) + \" m\u00b2K\/W<\/td><\/tr>\";\r\n    rows += '<tr class=\"wfr-tot\"><td>Gesamt R<sub>T<\/sub><\/td>' +\r\n            '<td class=\"wfr-num\">' + fmt(Rsum, 3) + \" m\u00b2K\/W<\/td><\/tr>\";\r\n    $(\"wfr-layers\").innerHTML = \"<table>\" + rows + \"<\/table>\";\r\n  }\r\n\r\n  \/* Eigene Schicht *\/\r\n  function addCustomLayer() {\r\n    var box = document.createElement(\"div\");\r\n    box.className = \"wfr-card\";\r\n    box.style.cssText = \"margin-top:10px;padding:14px;background:#fcfcfc;border-color:#e4e4e4;\";\r\n    box.innerHTML =\r\n      '<div class=\"wfr-g2\">' +\r\n        \"<div><label>Schichtname<\/label><input class=\\\"cl-n\\\" type=\\\"text\\\" placeholder=\\\"z. B. Holzfaserplatte\\\" \/><\/div>\" +\r\n        '<div><label>Dicke (mm)<\/label><input class=\"cl-d\" type=\"number\" min=\"0\" max=\"2000\" step=\"1\" value=\"50\" \/><\/div>' +\r\n      \"<\/div>\" +\r\n      '<div class=\"wfr-g2 wfr-mt\">' +\r\n        '<div><label>\u03bb (W\/mK)<\/label><input class=\"cl-l\" type=\"number\" min=\"0.005\" max=\"5\" step=\"0.001\" value=\"0.040\" \/><\/div>' +\r\n        '<div style=\"display:flex;align-items:flex-end;justify-content:flex-end;\">' +\r\n          '<button type=\"button\" class=\"wfr-btn cl-rm\">Entfernen<\/button><\/div>' +\r\n      \"<\/div>\";\r\n    $(\"wfr-custom\").appendChild(box);\r\n\r\n    var obj = { name: \"Eigene Schicht\", d: 0.05, lambda: 0.040 };\r\n    customLayers.push(obj);\r\n\r\n    var n = box.querySelector(\".cl-n\"), d = box.querySelector(\".cl-d\"), l = box.querySelector(\".cl-l\");\r\n    function sync() {\r\n      obj.name = n.value.trim() || \"Eigene Schicht\";\r\n      obj.d = num(d.value) \/ 1000;\r\n      obj.lambda = num(l.value);\r\n      renderLayers(); recalc();\r\n    }\r\n    n.addEventListener(\"input\", sync);\r\n    d.addEventListener(\"input\", sync);\r\n    l.addEventListener(\"input\", sync);\r\n    box.querySelector(\".cl-rm\").addEventListener(\"click\", function () {\r\n      customLayers = customLayers.filter(function (x) { return x !== obj; });\r\n      box.remove(); renderLayers(); recalc();\r\n    });\r\n    sync();\r\n  }\r\n\r\n  function clearCustomLayers() {\r\n    customLayers = [];\r\n    $(\"wfr-custom\").innerHTML = \"\";\r\n  }\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     BERECHNUNG\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n  function investFor(thkM, area) {\r\n    var dens = CFG.density[elComp.value] || 55;\r\n    var kgTotal = dens * thkM * area;\r\n    var bags = thkM > 0 ? Math.ceil(kgTotal \/ CFG.cellulose.bagWeightKg) : 0;\r\n    var material = bags * CFG.cellulose.bagPriceEur;\r\n    var extra = num(elExtra.value) * area;\r\n    return { kgTotal: kgTotal, bags: bags, material: material, extra: extra, total: material + extra };\r\n  }\r\n\r\n  function savingsFor(thkM, base, boundary, area, hgt, price, eff, co2Faktor, component) {\r\n    var b = BOUNDARIES[boundary] || BOUNDARIES.outside;\r\n    var ins = insulate(base, thkM);\r\n    var Uo = calcU(base, boundary, component), Un = calcU(ins.layers, boundary, component);\r\n    var k = area * hgt * 24 \/ 1000 * b.fx;\r\n    var Qo = Uo * k, Qn = Un * k;\r\n    var Eo = Qo \/ eff, En = Qn \/ eff;\r\n    var f = (co2Faktor || 0) \/ 1000;          \/\/ g\/kWh -> kg\/kWh\r\n    return { Uo: Uo, Un: Un, Qo: Qo, Qn: Qn, Eo: Eo, En: En,\r\n             Co: Eo * price, Cn: En * price, save: (Eo - En) * price,\r\n             CO2o: Eo * f, CO2n: En * f, co2Save: (Eo - En) * f, ins: ins };\r\n  }\r\n\r\n  function recalc() {\r\n    var base = allLayers();\r\n    var component = elComp.value;\r\n    var boundary = elBound.value;\r\n    var area = num(elArea.value);\r\n    var hgt = num(elHgt.value);\r\n    var price = num(elPrice.value);\r\n    var eff = num(elEff.value, 1);\r\n    var thkM = num(elThk.value) \/ 100;\r\n    if (eff <= 0) eff = 1;\r\n\r\n    var co2F = (SYSTEMS[elSys.value] || {}).co2 || 0;\r\n    var r = savingsFor(thkM, base, boundary, area, hgt, price, eff, co2F, component);\r\n    var inv = investFor(thkM, area);\r\n\r\n    \/* Ergebnisse f\u00fcr den PDF-Export merken *\/\r\n    LAST = { r: r, inv: inv, layers: base.slice(), boundary: boundary,\r\n             component: component, area: area, hgt: hgt, price: price,\r\n             eff: eff, co2F: co2F,\r\n             thk: num(elThk.value), extra: num(elExtra.value) };\r\n\r\n    $(\"wfr-u-old\").innerHTML = out(r.Uo, 3, \"W\/m\u00b2K\");\r\n    $(\"wfr-u-new\").innerHTML = out(r.Un, 3, \"W\/m\u00b2K\");\r\n    $(\"wfr-q-old\").innerHTML = out(r.Qo, 0, \"kWh\/a\");\r\n    $(\"wfr-q-new\").innerHTML = out(r.Qn, 0, \"kWh\/a\");\r\n    $(\"wfr-e-old\").innerHTML = out(r.Eo, 0, \"kWh\/a\");\r\n    $(\"wfr-e-new\").innerHTML = out(r.En, 0, \"kWh\/a\");\r\n    $(\"wfr-c-old\").innerHTML = out(r.Co, 0, \"\u20ac\/a\");\r\n    $(\"wfr-c-new\").innerHTML = out(r.Cn, 0, \"\u20ac\/a\");\r\n    $(\"wfr-co2-old\").innerHTML = out(r.CO2o, 0, \"kg\/a\");\r\n    $(\"wfr-co2-new\").innerHTML = out(r.CO2n, 0, \"kg\/a\");\r\n\r\n    $(\"wfr-mat\").innerHTML = isFinite(inv.kgTotal)\r\n      ? '<span class=\"wfr-val\">' + fmt(inv.kgTotal, 0) + '<\/span><span class=\"wfr-unit\">kg \u00b7 ' +\r\n        inv.bags + \" Sack<\/span>\" : \"\u2013\";\r\n    $(\"wfr-cost-mat\").innerHTML = out(inv.material, 0, \"\u20ac\");\r\n    $(\"wfr-row-extra\").style.display = inv.extra > 0 ? \"\" : \"none\";\r\n    $(\"wfr-cost-extra\").innerHTML = out(inv.extra, 0, \"\u20ac\");\r\n    $(\"wfr-invest\").innerHTML = out(inv.total, 0, \"\u20ac\");\r\n\r\n    $(\"wfr-save\").innerHTML = out(r.save, 0, \"\u20ac\/Jahr\");\r\n    $(\"wfr-save20\").textContent = (r.save > 0)\r\n      ? \"\u2248 \" + fmt(r.save * CFG.horizonYears, 0) + \" \u20ac in \" + CFG.horizonYears +\r\n        \" Jahren (heutiger Energiepreis)\" : \"\";\r\n\r\n    if (r.co2Save > 0) {\r\n      $(\"wfr-co2-save\").innerHTML = out(r.co2Save, 0, \"kg\/Jahr\");\r\n      $(\"wfr-co2-20\").textContent = \"\u2248 \" + fmt(r.co2Save * CFG.horizonYears, 0) +\r\n        \" kg in \" + CFG.horizonYears + \" Jahren\";\r\n    } else {\r\n      $(\"wfr-co2-save\").innerHTML = \"\u2013\";\r\n      $(\"wfr-co2-20\").textContent = \"\";\r\n    }\r\n\r\n    var payback = (r.save > 0 && inv.total > 0) ? inv.total \/ r.save : Infinity;\r\n    $(\"wfr-payback\").innerHTML = isFinite(payback) ? out(payback, 1, \"Jahre\") : \"\u2013\";\r\n\r\n    \/* D\u00e4mmst\u00e4rke mit der k\u00fcrzesten Amortisation.\r\n       Nur sinnvoll, wenn fixe Ausf\u00fchrungskosten hinterlegt sind \u2013 sonst w\u00e4re\r\n       rechnerisch immer die d\u00fcnnstm\u00f6gliche D\u00e4mmung \"optimal\". *\/\r\n    var optTxt = \"\";\r\n    if (num(elExtra.value) > 0) {\r\n      var bestD = 0, bestP = Infinity;\r\n      for (var cm = 4; cm <= 45; cm++) {\r\n        var rr = savingsFor(cm \/ 100, base, boundary, area, hgt, price, eff, 0, component);\r\n        var ii = investFor(cm \/ 100, area);\r\n        if (rr.save > 0 && ii.total > 0) {\r\n          var p = ii.total \/ rr.save;\r\n          if (p < bestP) { bestP = p; bestD = cm; }\r\n        }\r\n      }\r\n      if (bestD && Math.abs(bestD - num(elThk.value)) >= 2) {\r\n        optTxt = \"K\u00fcrzeste Amortisation bei ca. \" + bestD + \" cm (\" + fmt(bestP, 1) +\r\n                 \" Jahre). Eine dickere D\u00e4mmung spart absolut trotzdem mehr Geld.\";\r\n      }\r\n    }\r\n    $(\"wfr-opt\").textContent = optTxt;\r\n\r\n    renderWarnings(r, inv, payback, base);\r\n  }\r\n\r\n  function renderWarnings(r, inv, payback, base) {\r\n    var w = [];\r\n    if (!base.length)\r\n      w.push(\"Es sind keine Bestandsschichten definiert. Das Ergebnis ist nicht aussagekr\u00e4ftig.\");\r\n    if (num(elThk.value) > 40)\r\n      w.push(\"D\u00e4mmst\u00e4rken \u00fcber 40 cm sind selten wirtschaftlich und bautechnisch oft nicht umsetzbar.\");\r\n    if (num(elThk.value) > 0 && num(elThk.value) < 8)\r\n      w.push(\"Unter 8 cm bringt eine Einblasd\u00e4mmung wenig; die Ausf\u00fchrungskosten bleiben nahezu gleich.\");\r\n    if (r.ins && r.ins.cavityD > 0 && r.ins.zusatz > 0)\r\n      w.push(\"Der Hohlraum ist \" + fmt(r.ins.cavityD * 100, 0) + \" cm tief. Davon werden \" +\r\n             fmt(r.ins.imCavity * 100, 0) + \" cm eingeblasen, die \u00fcbrigen \" +\r\n             fmt(r.ins.zusatz * 100, 0) + \" cm sind eine Aufdopplung und verursachen \" +\r\n             \"zus\u00e4tzlichen Aufwand f\u00fcr Unterkonstruktion und Beplankung.\");\r\n    if (isFinite(payback) && payback > 40)\r\n      w.push(\"Die Amortisation \u00fcber 40 Jahre liegt jenseits der \u00fcblichen Nutzungsdauer. \" +\r\n             \"Nichtmonet\u00e4re Vorteile (Behaglichkeit, Hitzeschutz, Schallschutz) sind hier ausschlaggebend.\");\r\n    if (elSys.value.indexOf(\"hp\") === 0 && num(elEff.value) < 2)\r\n      w.push(\"Eine Jahresarbeitszahl unter 2,0 ist f\u00fcr eine W\u00e4rmepumpe unrealistisch niedrig.\");\r\n\r\n    $(\"wfr-warnings\").innerHTML = w.length\r\n      ? '<div class=\"wfr-warn\"><b>Bitte beachten:<\/b><ul><li>' + w.map(esc).join(\"<\/li><li>\") + \"<\/li><\/ul><\/div>\"\r\n      : \"\";\r\n  }\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     SYSTEM- \/ REGION-DEFAULTS\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n  function applySystem() {\r\n    var s = SYSTEMS[elSys.value];\r\n    if (!s) return;\r\n    if (!priceTouched) elPrice.value = s.price.toFixed(3);\r\n    if (!effTouched) elEff.value = s.eff;\r\n\r\n    $(\"wfr-eff-label\").childNodes[0].nodeValue =\r\n      (s.kind === \"jaz\" ? \"Jahresarbeitszahl (JAZ)\" : \"Jahresnutzungsgrad\") + \" \";\r\n    $(\"wfr-eff-hint\").textContent = s.kind === \"jaz\"\r\n      ? \"Messwerte im Bestand: Luft\/Wasser 2,5\u20133,8 \u00b7 Sole\/Wasser 3,3\u20134,7.\"\r\n      : \"Heizwertkessel 0,75\u20130,85 \u00b7 Brennwertkessel 0,90\u20130,98.\";\r\n\r\n    \/* Preisfeld und Ergebniszeile konkret benennen statt \"Endenergie\" *\/\r\n    $(\"wfr-price-label\").childNodes[0].nodeValue = s.preis + \" (\u20ac pro kWh) \";\r\n    $(\"wfr-price-hint\").textContent =\r\n      \"Arbeitspreis inkl. Steuern und Abgaben, ohne Verluste des W\u00e4rmeerzeugers.\";\r\n\r\n    $(\"wfr-e-label\").innerHTML = esc(s.bedarf) + \"<small>das, was Sie einkaufen<\/small>\";\r\n  }\r\n\r\n  function applyRegion() {\r\n    if (elRegion.value === \"custom\") { hgtTouched = true; return; }\r\n    elHgt.value = elRegion.value;\r\n    hgtTouched = false;\r\n  }\r\n\r\n  function applyThicknessDefault() {\r\n    if (thkTouched) return;\r\n    elThk.value = THK_DEFAULT[elComp.value] || 20;\r\n  }\r\n\r\n  function updateThkHint() {\r\n    var m = { wall: \"Vorsatzschale\/Fassade: \u00fcblich 14\u201324 cm.\",\r\n              roof: \"Sparrenfeld: \u00fcblich 18\u201326 cm.\",\r\n              ceiling: \"Offene Aufblasd\u00e4mmung: \u00fcblich 25\u201340 cm.\" };\r\n    $(\"wfr-thk-hint\").textContent = m[elComp.value] || \"\";\r\n\r\n    \/* Richtwerte f\u00fcr die Ausf\u00fchrung \u2013 bitte an die eigene Kalkulation anpassen *\/\r\n    var x = { wall:    \"Richtwert inkl. Unterkonstruktion, Beplankung, Fassade: 60\u2013140 \u20ac\/m\u00b2.\",\r\n              roof:    \"Richtwert inkl. Dampfbremse, Lattung, Beplankung: 40\u201390 \u20ac\/m\u00b2.\",\r\n              ceiling: \"Richtwert inkl. Randabschottung: 8\u201325 \u20ac\/m\u00b2.\" };\r\n    $(\"wfr-extra-hint\").textContent = (x[elComp.value] || \"\") + \" 0 = nur Materialkosten.\";\r\n  }\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     DATENBANK LADEN\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n  function loadDB() {\r\n    var ctrl = (\"AbortController\" in window) ? new AbortController() : null;\r\n    var timer = setTimeout(function () { if (ctrl) ctrl.abort(); }, 6000);\r\n    var st = $(\"wfr-db-status\");\r\n\r\n    fetch(CFG.dbUrl, ctrl ? { signal: ctrl.signal } : {})\r\n      .then(function (res) {\r\n        if (!res.ok) throw new Error(\"HTTP \" + res.status);\r\n        return res.json();\r\n      })\r\n      .then(function (data) {\r\n        if (!data || !Array.isArray(data.constructions)) throw new Error(\"Ung\u00fcltiges Format\");\r\n        var clean = data.constructions.filter(function (c) {\r\n          return c && c.id && c.name && c.component && Array.isArray(c.layers);\r\n        }).map(function (c) {\r\n          return {\r\n            id: String(c.id), name: String(c.name), component: String(c.component),\r\n            defaultBoundary: c.defaultBoundary ? String(c.defaultBoundary) : null,\r\n            note: c.note ? String(c.note) : null,\r\n            layers: c.layers.filter(function (l) {\r\n              return l && l.name && (isFinite(l.R) || (isFinite(l.d) && isFinite(l.lambda)));\r\n            }).map(function (l) {\r\n              var o = { name: String(l.name), d: num(l.d) };\r\n              if (isFinite(l.R) && l.R > 0) o.R = Number(l.R); else o.lambda = num(l.lambda);\r\n              if (l.cavity) {                       \/\/ f\u00fcllbarer Hohlraum\r\n                o.cavity = true;\r\n                o.framing = isFinite(l.framing) ? Number(l.framing) : 0;\r\n              }\r\n              return o;\r\n            })\r\n          };\r\n        });\r\n        if (!clean.length) throw new Error(\"Keine g\u00fcltigen Konstruktionen\");\r\n        DB = clean;\r\n        DB_INFO = \"Vorlagen v\" + (data.version || \"?\") +\r\n                  (data.updated ? \" vom \" + data.updated : \"\");\r\n        st.textContent = clean.length + \" Konstruktionsvorlagen geladen.\";\r\n        st.className = \"wfr-status ok\";\r\n      })\r\n      .catch(function (err) {\r\n        DB = FALLBACK.slice();\r\n        st.textContent = \"Vorlagen konnten nicht geladen werden \u2013 vereinfachte Auswahl aktiv. (\" +\r\n          (err && err.name === \"AbortError\" ? \"Zeit\u00fcberschreitung\" : (err.message || \"Fehler\")) + \")\";\r\n        st.className = \"wfr-status warn\";\r\n      })\r\n      .then(function () {\r\n        clearTimeout(timer);\r\n        buildConstructions();\r\n        renderLayers();\r\n        recalc();\r\n      });\r\n  }\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     TRACKING (Google Tag Manager)\r\n\r\n     Gemeldete Events:\r\n       rechner_start             einmalig, sobald der Nutzer etwas ver\u00e4ndert\r\n       rechner_kontakt_geoeffnet Kontaktformular ge\u00f6ffnet\r\n       rechner_anfrage_gesendet  Anfrage erfolgreich \u00fcbermittelt (Conversion)\r\n       rechner_anfrage_fehler    \u00dcbermittlung fehlgeschlagen\r\n       rechner_pdf_gespeichert   PDF erzeugt und heruntergeladen\r\n\r\n     Jedes Event tr\u00e4gt den Rechnerkontext mit: Bauteil, Konstruktion,\r\n     D\u00e4mmst\u00e4rke, Fl\u00e4che, Heizsystem, Ersparnis, Investition, Amortisation\r\n     und CO2-Einsparung. Zahlen werden als Zahl \u00fcbergeben, nicht als Text.\r\n\r\n     Personenbezogene Daten aus dem Kontaktformular \u2013 Name, E-Mail, Telefon,\r\n     Nachricht \u2013 werden bewusst NICHT \u00fcbergeben.\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n\r\n  function track(name, extra) {\r\n    try {\r\n      window.dataLayer = window.dataLayer || [];\r\n      var ev = { event: name }, k;\r\n      var ctx = trackKontext();\r\n      for (k in ctx) ev[k] = ctx[k];\r\n      if (extra) for (k in extra) ev[k] = extra[k];\r\n      window.dataLayer.push(ev);\r\n    } catch (e) { \/* Tracking darf den Rechner nie blockieren *\/ }\r\n  }\r\n\r\n  function trackKontext() {\r\n    var c = currentConstruction(), s = SYSTEMS[elSys.value], L = LAST;\r\n    var d = {\r\n      bauteil:          elComp.options[elComp.selectedIndex].text,\r\n      konstruktion:     c ? c.name : \"\",\r\n      daemmstaerke_cm:  num(elThk.value),\r\n      flaeche_m2:       num(elArea.value),\r\n      heizsystem:       s ? s.label : elSys.value,\r\n      klimaregion:      regionLabel()\r\n    };\r\n    if (L && L.r) {\r\n      var pb = (L.r.save > 0 && L.inv.total > 0) ? L.inv.total \/ L.r.save : null;\r\n      d.ersparnis_eur       = Math.round(L.r.save);\r\n      d.investition_eur     = Math.round(L.inv.total);\r\n      d.zusatzkosten_eur_m2 = L.extra;\r\n      d.amortisation_jahre  = (pb !== null && isFinite(pb)) ? Math.round(pb * 10) \/ 10 : null;\r\n      d.co2_einsparung_kg   = Math.round(L.r.co2Save);\r\n      d.u_wert_bestand      = Math.round(L.r.Uo * 1000) \/ 1000;\r\n      d.u_wert_gedaemmt     = Math.round(L.r.Un * 1000) \/ 1000;\r\n    }\r\n    return d;\r\n  }\r\n\r\n  var startGemeldet = false;\r\n  function meldeStart() {\r\n    if (startGemeldet) return;\r\n    startGemeldet = true;\r\n    track(\"rechner_start\");\r\n  }\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     PDF-EXPORT\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n\r\n  function loadJsPdf() {\r\n    if (window.jspdf && window.jspdf.jsPDF) return Promise.resolve();\r\n    if (loadJsPdf._p) return loadJsPdf._p;\r\n    loadJsPdf._p = new Promise(function (resolve, reject) {\r\n      var s = document.createElement(\"script\");\r\n      s.src = CFG.jsPdfUrl;\r\n      s.onload = function () {\r\n        (window.jspdf && window.jspdf.jsPDF) ? resolve() : reject(new Error(\"jsPDF nicht gefunden\"));\r\n      };\r\n      s.onerror = function () { reject(new Error(\"Skript konnte nicht geladen werden\")); };\r\n      document.head.appendChild(s);\r\n    });\r\n    return loadJsPdf._p;\r\n  }\r\n\r\n  \/* Logo von der Website laden und in ein Format bringen, das jsPDF einbetten kann.\r\n     Ergebnis wird gecacht. Schl\u00e4gt das Laden fehl, wird null geliefert und das\r\n     PDF ohne Bild erzeugt. *\/\r\n  function loadLogo() {\r\n    if (loadLogo._p) return loadLogo._p;\r\n    loadLogo._p = new Promise(function (resolve) {\r\n      if (!CFG.logoUrl) return resolve(null);\r\n\r\n      \/* Notbremse: Antwortet der Server nicht, wird das PDF ohne Logo erzeugt,\r\n         statt dass der Export endlos wartet. *\/\r\n      var fertig = false;\r\n      function ende(wert) { if (!fertig) { fertig = true; clearTimeout(uhr); resolve(wert); } }\r\n      var uhr = setTimeout(function () { ende(null); }, 6000);\r\n\r\n      var img = new Image();\r\n      img.crossOrigin = \"anonymous\";\r\n      img.onload = function () {\r\n        try {\r\n          var cv = document.createElement(\"canvas\");\r\n          cv.width = img.naturalWidth || img.width;\r\n          cv.height = img.naturalHeight || img.height;\r\n          if (!cv.width || !cv.height) return ende(null);\r\n          var ctx = cv.getContext(\"2d\");\r\n          \/* Transparenz auf Wei\u00df legen \u2013 die PDF-Seite ist wei\u00df *\/\r\n          ctx.fillStyle = \"#ffffff\";\r\n          ctx.fillRect(0, 0, cv.width, cv.height);\r\n          ctx.drawImage(img, 0, 0);\r\n          ende({\r\n            data: cv.toDataURL(\"image\/jpeg\", 0.92),\r\n            ratio: cv.width \/ cv.height\r\n          });\r\n        } catch (e) {\r\n          ende(null);      \/\/ z. B. Canvas durch fremde Herkunft gesperrt\r\n        }\r\n      };\r\n      img.onerror = function () { ende(null); };\r\n      img.src = CFG.logoUrl;\r\n    });\r\n    return loadLogo._p;\r\n  }\r\n\r\n  function buildPdf(logo) {\r\n    var doc = new window.jspdf.jsPDF({ unit: \"mm\", format: \"a4\", compress: true });\r\n    var W = 210, M = 18, CW = W - 2 * M;   \/\/ Seitenbreite, Rand, Inhaltsbreite\r\n    var G = CFG.brand;\r\n    var y = 0, seite = 1;\r\n\r\n    function grau(v) { doc.setTextColor(v, v, v); }\r\n    function schwarz() { doc.setTextColor(34, 34, 34); }\r\n\r\n    function fuss() {\r\n      var f = CFG.firma;\r\n      doc.setDrawColor(225); doc.setLineWidth(0.2);\r\n      doc.line(M, 279, W - M, 279);\r\n      doc.setFont(\"helvetica\", \"normal\"); doc.setFontSize(7.5); grau(130);\r\n      var teile = [f.name, f.strasse, f.ort, f.telefon, f.email, f.web]\r\n        .filter(function (t) { return t; });\r\n      doc.text(teile.join(\"  |  \"), M, 283.5);\r\n      doc.text(\"Seite \" + seite, W - M, 283.5, { align: \"right\" });\r\n      doc.setFontSize(6.5);\r\n      doc.text(DB_INFO + \"  \u00b7  Preise und Emissionsfaktoren Stand \" + CFG.datenstand +\r\n               \"  \u00b7  alle Betr\u00e4ge inkl. USt.\", M, 287);\r\n      schwarz();\r\n    }\r\n\r\n    function neueSeite() {\r\n      fuss(); doc.addPage(); seite++; y = M;\r\n    }\r\n    function platz(mm) { if (y + mm > 272) neueSeite(); }\r\n\r\n    \/* \u2500\u2500 Kopf \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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    var kopfUnten = 14;\r\n    if (logo && logo.data) {\r\n      var logoB = CFG.logoBreiteMm;\r\n      var logoH = logoB \/ (logo.ratio || 3.4);\r\n      try {\r\n        doc.addImage(logo.data, \"JPEG\", M, 14, logoB, logoH);\r\n        kopfUnten = 14 + logoH;\r\n      } catch (e) { logo = null; }\r\n    }\r\n    if (!logo || !logo.data) {\r\n      \/* Ohne Bild: Firmenname als Wortmarke *\/\r\n      doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(15);\r\n      doc.setTextColor(G[0], G[1], G[2]);\r\n      doc.text(CFG.firma.name, M, 22);\r\n      kopfUnten = 25;\r\n      schwarz();\r\n    }\r\n\r\n    doc.setFont(\"helvetica\", \"normal\"); doc.setFontSize(8.5); grau(130);\r\n    doc.text(\"Sanierungsrechner\", W - M, 18, { align: \"right\" });\r\n    doc.text(new Date().toLocaleDateString(\"de-AT\",\r\n      { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" }), W - M, 22.5, { align: \"right\" });\r\n\r\n    y = kopfUnten + 9;\r\n    doc.setDrawColor(G[0], G[1], G[2]); doc.setLineWidth(1.1);\r\n    doc.line(M, y, W - M, y);\r\n    y += 9;\r\n\r\n    schwarz(); doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(16);\r\n    doc.text(\"Wirtschaftlichkeit einer Zellulosed\u00e4mmung\", M, y);\r\n    y += 6;\r\n    doc.setFont(\"helvetica\", \"normal\"); doc.setFontSize(9); grau(110);\r\n    doc.text(\"Unverbindliche \u00dcberschlagsrechnung f\u00fcr ein einzelnes Bauteil\", M, y);\r\n    y += 10; schwarz();\r\n\r\n    \/* \u2500\u2500 Abschnitts\u00fcberschrift \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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    function titel(t) {\r\n      platz(14);\r\n      doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(10.5);\r\n      doc.setTextColor(G[0], G[1], G[2]);\r\n      doc.text(t, M, y);\r\n      y += 1.8;\r\n      doc.setDrawColor(G[0], G[1], G[2]); doc.setLineWidth(0.4);\r\n      doc.line(M, y, M + CW, y);\r\n      y += 5.5; schwarz();\r\n    }\r\n\r\n    \/* zweispaltige Zeile: Bezeichnung links, Wert rechts *\/\r\n    function zeile(bez, wert, fett) {\r\n      platz(6);\r\n      doc.setFontSize(9);\r\n      doc.setFont(\"helvetica\", \"normal\"); grau(90);\r\n      doc.text(String(bez), M, y);\r\n      doc.setFont(\"helvetica\", fett ? \"bold\" : \"normal\"); schwarz();\r\n      doc.text(String(wert), M + CW, y, { align: \"right\" });\r\n      y += 5;\r\n    }\r\n\r\n    \/* dreispaltige Vergleichszeile *\/\r\n    function vergleich(bez, alt, neu, fett) {\r\n      platz(6);\r\n      var sp1 = M + CW - 38, sp2 = M + CW;\r\n      doc.setFontSize(9);\r\n      doc.setFont(\"helvetica\", \"normal\"); grau(90);\r\n      doc.text(String(bez), M, y);\r\n      doc.setFont(\"helvetica\", fett ? \"bold\" : \"normal\");\r\n      grau(110); doc.text(String(alt), sp1, y, { align: \"right\" });\r\n      doc.setTextColor(G[0] - 25, G[1] - 40, G[2] - 25);\r\n      doc.text(String(neu), sp2, y, { align: \"right\" });\r\n      y += 5; schwarz();\r\n    }\r\n\r\n    var L = LAST, r = L.r, inv = L.inv;\r\n    var c = currentConstruction();\r\n    var b = BOUNDARIES[L.boundary] || BOUNDARIES.outside;\r\n    var sys = SYSTEMS[elSys.value];\r\n    var s = surfaceR(L.boundary, L.component);\r\n\r\n    \/* \u2500\u2500 Ihre Angaben \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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    titel(\"Ihre Angaben\");\r\n    zeile(\"Bauteil\", elComp.options[elComp.selectedIndex].text);\r\n    zeile(\"Grenzt an\", b.label + \"  (Korrekturfaktor fx = \" + fmt(b.fx, 2) + \")\");\r\n    zeile(\"Bestandskonstruktion\", c ? c.name : \"-\");\r\n    zeile(\"Zu d\u00e4mmende Fl\u00e4che\", fmt(L.area, 0) + \" m\u00b2\");\r\n    zeile(\"Geplante D\u00e4mmst\u00e4rke\", fmt(L.thk, 0) + \" cm Zellulose, Lambda = \" +\r\n          fmt(CFG.cellulose.lambda, 3) + \" W\/(m\u00b7K)\");\r\n    zeile(\"Klimaregion\", regionLabel() + \", \" + fmt(L.hgt, 0) + \" Kd\");\r\n    zeile(\"Heizsystem\", sys.label);\r\n    zeile((sys.kind === \"jaz\" ? \"Jahresarbeitszahl\" : \"Jahresnutzungsgrad\"), fmt(L.eff, 2));\r\n    zeile(sys.preis, fmt(L.price, 3) + \" \u20ac pro kWh\");\r\n    y += 4;\r\n\r\n    \/* \u2500\u2500 Bauteilaufbau \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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    titel(\"Bauteilaufbau und W\u00e4rmedurchlasswiderst\u00e4nde\");\r\n    doc.setFontSize(8.5);\r\n    zeile(\"W\u00e4rme\u00fcbergang innen (Rsi)\", fmt(s.si, 2) + \" m\u00b2K\/W\");\r\n    for (var i = 0; i < L.layers.length; i++) {\r\n      var l = L.layers[i];\r\n      var spec = (isFinite(l.R) && l.R > 0)\r\n        ? \"R = \" + fmt(l.R, 2)\r\n        : \"Lambda = \" + fmt(num(l.lambda), 3);\r\n      zeile(l.name + \"  (\" + fmt(num(l.d) * 1000, 0) + \" mm, \" + spec + \")\" +\r\n            (l.cavity ? \"  \u2013 wird gef\u00fcllt\" : \"\"),\r\n            fmt(layerR(l), 3) + \" m\u00b2K\/W\");\r\n    }\r\n    zeile(\"W\u00e4rme\u00fcbergang au\u00dfen (Rse)\", fmt(s.se, 2) + \" m\u00b2K\/W\");\r\n\r\n    var ins = r.ins || { imCavity: 0, zusatz: 0 };\r\n    if (ins.imCavity > 0) {\r\n      zeile(\"NEU: Zellulose im Hohlraum (\" + fmt(ins.imCavity * 1000, 0) +\r\n            \" mm, ersetzt die Luftschicht)\",\r\n            fmt(layerR({ d: ins.imCavity, lambda: 0.15 * CFG.cellulose.lambdaHolz +\r\n                         0.85 * CFG.cellulose.lambda }), 3) + \" m\u00b2K\/W\", true);\r\n    }\r\n    if (ins.zusatz > 0) {\r\n      zeile(\"NEU: Zellulose \" + (ins.imCavity > 0 ? \"als Aufdopplung\" : \"\") +\r\n            \" (\" + fmt(ins.zusatz * 1000, 0) + \" mm)\",\r\n            fmt(ins.zusatz \/ CFG.cellulose.lambda, 3) + \" m\u00b2K\/W\", true);\r\n    }\r\n    y += 4;\r\n\r\n    \/* \u2500\u2500 Ergebnis \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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    titel(\"Ergebnis\");\r\n    doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(7.5); grau(120);\r\n    doc.text(\"BESTAND\", M + CW - 38, y - 1.5, { align: \"right\" });\r\n    doc.setTextColor(G[0] - 25, G[1] - 40, G[2] - 25);\r\n    doc.text(\"GED\u00c4MMT\", M + CW, y - 1.5, { align: \"right\" });\r\n    y += 3.5; schwarz();\r\n\r\n    vergleich(\"U-Wert (W\/m\u00b2K)\", fmt(r.Uo, 3), fmt(r.Un, 3), true);\r\n    vergleich(\"W\u00e4rmeverlust Bauteil (kWh\/a)\", fmt(r.Qo, 0), fmt(r.Qn, 0));\r\n    vergleich(sys.bedarf + \" (kWh\/a)\", fmt(r.Eo, 0), fmt(r.En, 0));\r\n    vergleich(\"Heizkosten (\u20ac\/a)\", fmt(r.Co, 0), fmt(r.Cn, 0), true);\r\n    vergleich(\"CO2-Aussto\u00df (kg\/a)\", fmt(r.CO2o, 0), fmt(r.CO2n, 0));\r\n    y += 4;\r\n\r\n    \/* \u2500\u2500 Investition \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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    titel(\"Investition\");\r\n    zeile(\"Zellulose-Bedarf\", fmt(inv.kgTotal, 0) + \" kg  (\" + inv.bags + \" Sack a \" +\r\n          fmt(CFG.cellulose.bagWeightKg, 0) + \" kg)\");\r\n    zeile(\"Materialkosten Zellulose\", fmt(inv.material, 0) + \" \u20ac\");\r\n    if (inv.extra > 0) {\r\n      zeile(\"Ausf\u00fchrung (\" + fmt(L.extra, 0) + \" \u20ac\/m\u00b2)\", fmt(inv.extra, 0) + \" \u20ac\");\r\n    }\r\n    zeile(\"Gesamtinvestition\", fmt(inv.total, 0) + \" \u20ac\", true);\r\n    y += 5;\r\n\r\n    \/* \u2500\u2500 Kennzahlen-Boxen \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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    platz(30);\r\n    var payback = (r.save > 0 && inv.total > 0) ? inv.total \/ r.save : Infinity;\r\n    var bw = (CW - 12) \/ 3, bh = 24;\r\n    var x1 = M, x2 = M + bw + 6, x3 = M + 2 * (bw + 6);\r\n\r\n    doc.setLineWidth(0.3);\r\n    doc.setFillColor(237, 250, 237); doc.setDrawColor(182, 229, 182);\r\n    doc.roundedRect(x1, y, bw, bh, 2.5, 2.5, \"FD\");\r\n    doc.setFillColor(240, 247, 255); doc.setDrawColor(187, 214, 245);\r\n    doc.roundedRect(x2, y, bw, bh, 2.5, 2.5, \"FD\");\r\n    doc.setFillColor(244, 248, 241); doc.setDrawColor(207, 227, 194);\r\n    doc.roundedRect(x3, y, bw, bh, 2.5, 2.5, \"FD\");\r\n\r\n    doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(7);\r\n    doc.setTextColor(42, 122, 42); doc.text(\"ERSPARNIS PRO JAHR\", x1 + 5, y + 7);\r\n    doc.setTextColor(32, 96, 160);  doc.text(\"AMORTISATION\", x2 + 5, y + 7);\r\n    doc.setTextColor(74, 112, 48);  doc.text(\"CO2-EINSPARUNG PRO JAHR\", x3 + 5, y + 7);\r\n\r\n    doc.setFontSize(16);\r\n    doc.setTextColor(30, 110, 30);\r\n    doc.text(fmt(r.save, 0) + \" \u20ac\", x1 + 5, y + 16);\r\n    doc.setTextColor(26, 74, 128);\r\n    doc.text(isFinite(payback) ? fmt(payback, 1) + \" Jahre\" : \"-\", x2 + 5, y + 16);\r\n    doc.setTextColor(63, 100, 40);\r\n    doc.text(fmt(r.co2Save, 0) + \" kg\", x3 + 5, y + 16);\r\n\r\n    doc.setFont(\"helvetica\", \"normal\"); doc.setFontSize(7); grau(120);\r\n    if (r.save > 0) {\r\n      doc.text(\"rund \" + fmt(r.save * CFG.horizonYears, 0) + \" \u20ac in \" +\r\n               CFG.horizonYears + \" Jahren\", x1 + 5, y + 21);\r\n    }\r\n    doc.text(\"Investition \/ Jahresersparnis\", x2 + 5, y + 21);\r\n    if (r.co2Save > 0) {\r\n      doc.text(\"rund \" + fmt(r.co2Save * CFG.horizonYears, 0) + \" kg in \" +\r\n               CFG.horizonYears + \" Jahren\", x3 + 5, y + 21);\r\n    }\r\n    y += bh + 9; schwarz();\r\n\r\n    \/* \u2500\u2500 Hinweise \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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    titel(\"Rechenweg und Hinweise\");\r\n    doc.setFont(\"helvetica\", \"normal\"); doc.setFontSize(7.8); grau(90);\r\n\r\n    var text = [\r\n      \"U-Wert nach EN ISO 6946: U = 1 \/ (Rsi + Summe d\/Lambda + Rse).\",\r\n      \"W\u00e4rmeverlust nach dem Heizgradtagverfahren: Q = U x A x HGT x 24 \/ 1000 x fx x \" +\r\n        fmt(CFG.gainFactor, 2) + \". Der Faktor fx ber\u00fccksichtigt Bauteile, die nicht an \" +\r\n        \"Au\u00dfenluft grenzen (\u00d6NORM B 8110-6 \/ DIN 4108-6); der Faktor \" + fmt(CFG.gainFactor, 2) +\r\n        \" ber\u00fccksichtigt, dass ein Teil des rechnerischen Verlusts real durch solare und interne \" +\r\n        \"Gewinne gedeckt wird.\",\r\n      \"Eingekaufte Energie (Endenergie) = W\u00e4rmebedarf geteilt durch Jahresnutzungsgrad bzw. \" +\r\n        \"Jahresarbeitszahl. Der eingegebene Preis ist der Preis pro Kilowattstunde eingekaufter \" +\r\n        \"Energie; die Verluste des W\u00e4rmeerzeugers werden \u00fcber den Nutzungsgrad auf die Menge \" +\r\n        \"aufgeschlagen, nicht auf den Preis.\",\r\n      \"CO2-Aussto\u00df = eingekaufte Energie mal Emissionsfaktor in CO2-\u00c4quivalent, inklusive \" +\r\n        \"Vorkette. Faktoren nach Umweltbundesamt REP-0989 (2025; Stromdaten 2023), \u00d6sterreich. \" +\r\n        \"Nicht enthalten ist der Herstellungsaufwand des D\u00e4mmstoffs; Zellulose aus Altpapier \" +\r\n        \"schneidet hier gegen\u00fcber mineralischen und erd\u00f6lbasierten D\u00e4mmstoffen deutlich besser ab.\",\r\n      \"Die Amortisation ist statisch gerechnet: Investition geteilt durch Jahresersparnis, ohne \" +\r\n        \"Finanzierung, Preis\u00e4nderungen, F\u00f6rderungen und Folgekosten.\",\r\n      \"Nicht enthalten: W\u00e4rmebr\u00fccken, L\u00fcftungsw\u00e4rmeverluste, die \u00fcbrigen Bauteile der \" +\r\n        \"Geb\u00e4udeh\u00fclle sowie m\u00f6gliche F\u00f6rderungen. Ebenfalls nicht bewertet sind der bessere \" +\r\n        \"sommerliche Hitzeschutz, der Schallschutz und die h\u00f6here Behaglichkeit.\",\r\n      \"Die Lambda-Werte der Bestandsschichten sind Normwerte bzw. Literaturwerte. \" +\r\n        \"Bestandsbaustoffe streuen erheblich - die tats\u00e4chlichen Werte k\u00f6nnen abweichen.\",\r\n      \"Diese Berechnung ist eine \u00dcberschlagsrechnung und ersetzt weder einen Energieausweis \" +\r\n        \"noch eine Fachplanung. Alle Angaben ohne Gew\u00e4hr.\"\r\n    ];\r\n    for (var t = 0; t < text.length; t++) {\r\n      var zeilen = doc.splitTextToSize(\"\u2022  \" + text[t], CW);\r\n      platz(zeilen.length * 3.4 + 2);\r\n      doc.text(zeilen, M, y);\r\n      y += zeilen.length * 3.4 + 1.6;\r\n    }\r\n    y += 6;\r\n\r\n    \/* \u2500\u2500 Kontaktbox \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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    platz(34);\r\n    var f = CFG.firma, bh2 = 30;\r\n    doc.setFillColor(247, 251, 247); doc.setDrawColor(G[0], G[1], G[2]); doc.setLineWidth(0.4);\r\n    doc.roundedRect(M, y, CW, bh2, 2.5, 2.5, \"FD\");\r\n\r\n    doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(11);\r\n    doc.setTextColor(G[0] - 25, G[1] - 40, G[2] - 25);\r\n    doc.text(\"Wie geht es weiter?\", M + 7, y + 9);\r\n\r\n    doc.setFont(\"helvetica\", \"normal\"); doc.setFontSize(8.5); grau(80);\r\n    doc.text(\"Gerne sehen wir uns Ihr Bauteil vor Ort an und erstellen Ihnen ein konkretes \" +\r\n             \"Angebot.\", M + 7, y + 15.5);\r\n\r\n    doc.setFont(\"helvetica\", \"bold\"); doc.setFontSize(9); schwarz();\r\n    var kontakt = [f.telefon, f.email, f.web].filter(function (x) { return x; }).join(\"   |   \");\r\n    doc.text(kontakt, M + 7, y + 23);\r\n    y += bh2 + 4;\r\n\r\n    fuss();\r\n\r\n    var name = \"Sanierungsrechner_\" +\r\n      (elComp.value === \"wall\" ? \"Wand\" : elComp.value === \"roof\" ? \"Dach\" : \"Decke\") +\r\n      \"_\" + new Date().toISOString().slice(0, 10) + \".pdf\";\r\n    doc.save(name);\r\n    track(\"rechner_pdf_gespeichert\", { dateiname: name, seiten: seite });\r\n  }\r\n\r\n  function exportPdf() {\r\n    var btn = $(\"wfr-pdf\"), st = $(\"wfr-pdf-status\");\r\n    if (!LAST) { st.textContent = \"Bitte zuerst eine Berechnung durchf\u00fchren.\"; return; }\r\n    btn.disabled = true; st.textContent = \"PDF wird erstellt \u2026\";\r\n\r\n    Promise.all([loadJsPdf(), loadLogo()])\r\n      .then(function (res) { buildPdf(res[1]); st.textContent = \"\"; })\r\n      .catch(function (err) {\r\n        st.innerHTML = \"PDF-Export nicht verf\u00fcgbar (\" + esc(err.message) +\r\n          \"). Sie k\u00f6nnen die Seite stattdessen \u00fcber die Druckfunktion Ihres Browsers \" +\r\n          \"als PDF speichern (Strg+P bzw. Cmd+P).\";\r\n      })\r\n      .then(function () { btn.disabled = false; });\r\n  }\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     KONTAKT\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n  function txt(id) { return ($(id).textContent || \"\u2013\").replace(\/\\s+\/g, \" \").trim(); }\r\n\r\n  function payload() {\r\n    var c = currentConstruction();\r\n    return {\r\n      eingaben: {\r\n        \"Bauteil\": elComp.options[elComp.selectedIndex].text,\r\n        \"Grenzt an\": elBound.options[elBound.selectedIndex] ? elBound.options[elBound.selectedIndex].text : \"\u2013\",\r\n        \"Konstruktion\": c ? c.name : \"\u2013\",\r\n        \"Eigene Zusatzschichten\": customLayers.length\r\n          ? customLayers.map(function (l) {\r\n              return l.name + \" \" + fmt(l.d * 1000, 0) + \" mm \u03bb=\" + fmt(l.lambda, 3);\r\n            }).join(\"; \") : \"keine\",\r\n        \"Fl\u00e4che\": elArea.value + \" m\u00b2\",\r\n        \"D\u00e4mmst\u00e4rke\": elThk.value + \" cm Zellulose (\u03bb=\" + CFG.cellulose.lambda + \")\",\r\n        \"Zusatzkosten\": elExtra.value + \" \u20ac\/m\u00b2\",\r\n        \"Klimaregion\": elRegion.options[elRegion.selectedIndex].text,\r\n        \"Heizgradtage\": elHgt.value + \" Kd\",\r\n        \"Heizsystem\": elSys.options[elSys.selectedIndex].text,\r\n        \"Nutzungsgrad \/ JAZ\": elEff.value,\r\n        \"Energiepreis\": elPrice.value + \" \u20ac\/kWh\"\r\n      },\r\n      ergebnisse: {\r\n        \"U-Wert Bestand\": txt(\"wfr-u-old\"),\r\n        \"U-Wert ged\u00e4mmt\": txt(\"wfr-u-new\"),\r\n        \"Heizkosten Bestand\": txt(\"wfr-c-old\"),\r\n        \"Heizkosten ged\u00e4mmt\": txt(\"wfr-c-new\"),\r\n        \"CO2 Bestand\": txt(\"wfr-co2-old\"),\r\n        \"CO2 ged\u00e4mmt\": txt(\"wfr-co2-new\"),\r\n        \"Gesamtinvestition\": txt(\"wfr-invest\"),\r\n        \"Ersparnis pro Jahr\": txt(\"wfr-save\"),\r\n        \"CO2-Einsparung pro Jahr\": txt(\"wfr-co2-save\"),\r\n        \"Amortisation\": txt(\"wfr-payback\")\r\n      }\r\n    };\r\n  }\r\n\r\n  function fillSummary() {\r\n    var p = payload();\r\n    var rows = [];\r\n    rows.push(\"<b>Ihre Eingaben<\/b>\");\r\n    rows.push(p.eingaben[\"Bauteil\"] + \" \u00b7 \" + p.eingaben[\"Konstruktion\"]);\r\n    rows.push(elArea.value + \" m\u00b2 \u00b7 \" + elThk.value + \" cm Zellulose \u00b7 \" + elHgt.value + \" Kd\");\r\n    rows.push(p.eingaben[\"Heizsystem\"] + \" \u00b7 \" + elPrice.value + \" \u20ac\/kWh\");\r\n    rows.push(\"<b>Ergebnis<\/b>\");\r\n    rows.push(\"Ersparnis \" + p.ergebnisse[\"Ersparnis pro Jahr\"] +\r\n              \" \u00b7 Amortisation \" + p.ergebnisse[\"Amortisation\"] +\r\n              \" \u00b7 CO\u2082 \" + p.ergebnisse[\"CO2-Einsparung pro Jahr\"]);\r\n    rows.push(\"Investition \" + p.ergebnisse[\"Gesamtinvestition\"]);\r\n    $(\"wfr-ct-summary\").innerHTML = rows.join(\"<br>\");\r\n  }\r\n\r\n  function openModal() {\r\n    fillSummary();\r\n    $(\"wfr-ct-status\").style.display = \"none\";\r\n    $(\"wfr-modal\").classList.add(\"open\");\r\n    track(\"rechner_kontakt_geoeffnet\");\r\n  }\r\n  function closeModal() { $(\"wfr-modal\").classList.remove(\"open\"); }\r\n\r\n  function sendContact() {\r\n    var st = $(\"wfr-ct-status\"), btn = $(\"wfr-ct-send\");\r\n    function fail(m) { st.textContent = m; st.style.display = \"block\"; }\r\n\r\n    var name = $(\"wfr-ct-name\").value.trim();\r\n    var mail = $(\"wfr-ct-email\").value.trim();\r\n    if (!name) return fail(\"Bitte geben Sie Ihren Namen ein.\");\r\n    if (!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/.test(mail)) return fail(\"Bitte geben Sie eine g\u00fcltige E-Mail-Adresse ein.\");\r\n    if (!$(\"wfr-ct-consent\").checked) return fail(\"Bitte stimmen Sie der Datenverarbeitung zu.\");\r\n    st.style.display = \"none\";\r\n\r\n    btn.disabled = true; btn.textContent = \"Wird gesendet \u2026\";\r\n\r\n    var body = JSON.stringify({\r\n      name: name, email: mail,\r\n      phone: $(\"wfr-ct-phone\").value.trim(),\r\n      message: $(\"wfr-ct-msg\").value.trim(),\r\n      website: $(\"wfr-ct-hp\").value,   \/\/ Honeypot\r\n      consent: true,\r\n      calc: payload()\r\n    });\r\n\r\n    var base = CFG.wpBase.replace(\/\\\/+$\/, \"\");\r\n    \/* Zwei Schreibweisen: mit h\u00fcbschen Permalinks und ohne.\r\n       Schl\u00e4gt die erste mit 404 fehl, wird automatisch die zweite versucht. *\/\r\n    var urls = [\r\n      base + \"\/wp-json\/wolfinger\/v1\/anfrage\",\r\n      base + \"\/?rest_route=\/wolfinger\/v1\/anfrage\"\r\n    ];\r\n\r\n    function post(i) {\r\n      return fetch(urls[i], {\r\n        method: \"POST\",\r\n        headers: { \"Content-Type\": \"application\/json\" },\r\n        body: body\r\n      }).then(function (r) {\r\n        if (r.status === 404 && i + 1 < urls.length) return post(i + 1);\r\n        return r.json().catch(function () { return {}; })\r\n                .then(function (j) { return { ok: r.ok, j: j }; });\r\n      });\r\n    }\r\n\r\n    post(0)\r\n      .then(function (res) {\r\n        if (res.ok && res.j.ok) {\r\n          track(\"rechner_anfrage_gesendet\", {\r\n            telefon_angegeben: $(\"wfr-ct-phone\").value.trim() !== \"\",\r\n            nachricht_angegeben: $(\"wfr-ct-msg\").value.trim() !== \"\"\r\n          });\r\n          document.querySelector(\"#wfr-modal .wfr-m\").innerHTML =\r\n            '<div style=\"text-align:center;padding:24px 0 12px;\">' +\r\n            '<div style=\"font-size:38px;\">\u2705<\/div>' +\r\n            '<p style=\"color:#2a6e2a;font-weight:600;margin:10px 0 4px;\">Anfrage erfolgreich gesendet<\/p>' +\r\n            '<small style=\"color:#888;\">Wir melden uns so schnell wie m\u00f6glich bei Ihnen.<\/small><br><br>' +\r\n            '<button type=\"button\" class=\"wfr-send\" style=\"max-width:200px;margin:0 auto;\" id=\"wfr-ct-done\">Schlie\u00dfen<\/button><\/div>';\r\n          $(\"wfr-ct-done\").addEventListener(\"click\", closeModal);\r\n        } else {\r\n          track(\"rechner_anfrage_fehler\", { fehler: String(res.j.error || \"unbekannt\") });\r\n          fail(\"Fehler: \" + (res.j.error || \"Bitte versuchen Sie es sp\u00e4ter erneut.\"));\r\n          btn.disabled = false; btn.textContent = \"Anfrage senden\";\r\n        }\r\n      })\r\n      .catch(function () {\r\n        track(\"rechner_anfrage_fehler\", { fehler: \"Verbindungsfehler\" });\r\n        fail(\"Verbindungsfehler. Bitte pr\u00fcfen Sie Ihre Internetverbindung.\");\r\n        btn.disabled = false; btn.textContent = \"Anfrage senden\";\r\n      });\r\n  }\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     EVENTS\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n  \/* Erste Nutzerinteraktion einmalig melden *\/\r\n  [\"change\", \"input\"].forEach(function (typ) {\r\n    $(\"wfr-form\").addEventListener(typ, meldeStart, true);\r\n  });\r\n\r\n  elComp.addEventListener(\"change\", function () {\r\n    clearCustomLayers();\r\n    buildBoundaries();\r\n    buildConstructions();\r\n    applyThicknessDefault();\r\n    updateThkHint();\r\n    renderLayers(); recalc();\r\n  });\r\n  elBound.addEventListener(\"change\", function () { updateBoundaryHint(); renderLayers(); recalc(); });\r\n  elConstr.addEventListener(\"change\", function () { applyConstructionDefaults(); renderLayers(); recalc(); });\r\n\r\n  elRegion.addEventListener(\"change\", function () { applyRegion(); recalc(); });\r\n  elHgt.addEventListener(\"input\", function () { hgtTouched = true; elRegion.value = \"custom\"; recalc(); });\r\n\r\n  elSys.addEventListener(\"change\", function () { applySystem(); recalc(); });\r\n  elPrice.addEventListener(\"input\", function () { priceTouched = true; recalc(); });\r\n  elEff.addEventListener(\"input\", function () { effTouched = true; recalc(); });\r\n  elThk.addEventListener(\"input\", function () { thkTouched = true; recalc(); });\r\n\r\n  [elArea, elExtra].forEach(function (x) { x.addEventListener(\"input\", recalc); });\r\n\r\n  $(\"wfr-add-layer\").addEventListener(\"click\", addCustomLayer);\r\n  $(\"wfr-contact\").addEventListener(\"click\", openModal);\r\n  $(\"wfr-pdf\").addEventListener(\"click\", exportPdf);\r\n  $(\"wfr-modal-close\").addEventListener(\"click\", closeModal);\r\n  $(\"wfr-ct-send\").addEventListener(\"click\", sendContact);\r\n  $(\"wfr-modal\").addEventListener(\"click\", function (e) { if (e.target === $(\"wfr-modal\")) closeModal(); });\r\n  document.addEventListener(\"keydown\", function (e) { if (e.key === \"Escape\") closeModal(); });\r\n\r\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     START\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n  $(\"wfr-lam-txt\").textContent = String(CFG.cellulose.lambda).replace(\".\", \",\");\r\n  buildSystems();\r\n  buildClimate();\r\n  buildBoundaries();\r\n  applySystem();\r\n  applyRegion();\r\n  applyThicknessDefault();\r\n  updateThkHint();\r\n  buildConstructions();\r\n  renderLayers();\r\n  recalc();\r\n  loadDB();\r\n})();\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Sanierungsrechner Zellulosed\u00e4mmung \u2013 Wolfinger Sanierungsrechner Zellulosed\u00e4mmung Berechnet den U-Wert Ihres Bestandsbauteils, die j\u00e4hrliche Heizkosten\u00adersparnis durch eine Zellulose-Einblasd\u00e4mmung und die Amortisationszeit. Grundlage: Transmissions\u00adw\u00e4rmeverlust nach dem Heizgradtag\u00adverfahren (EN ISO 6946 \/ \u00d6NORM B 8110). 1Welches Bauteil m\u00f6chten Sie d\u00e4mmen? Bauteil Au\u00dfenwandDachschr\u00e4geDecke (oberste Gescho\u00dfdecke \/ Kellerdecke) Das Bauteil grenzt an i Bestimmt den Temperatur-Korrekturfaktor fx nach \u00d6NORM B [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-4500","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Sanierungsrechner - Wolfinger<\/title>\n<meta name=\"description\" content=\"Sanierungsrechner von Wolfinger: Berechnung von D\u00e4mmkosten, Energieeinsparungen, CO2-Reduktion und Amortisationsdauer.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wolfinger.at\/daemmen\/sanierungsrechner\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sanierungsrechner - Wolfinger\" \/>\n<meta property=\"og:description\" content=\"Sanierungsrechner von Wolfinger: Berechnung von D\u00e4mmkosten, Energieeinsparungen, CO2-Reduktion und Amortisationsdauer.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wolfinger.at\/daemmen\/sanierungsrechner\/\" \/>\n<meta property=\"og:site_name\" content=\"Wolfinger\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=100090125861398\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-10T10:26:58+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data1\" content=\"6\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/sanierungsrechner\\\/\",\"url\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/sanierungsrechner\\\/\",\"name\":\"Sanierungsrechner - Wolfinger\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/#website\"},\"datePublished\":\"2026-01-28T07:21:23+00:00\",\"dateModified\":\"2026-08-10T10:26:58+00:00\",\"description\":\"Sanierungsrechner von Wolfinger: Berechnung von D\u00e4mmkosten, Energieeinsparungen, CO2-Reduktion und Amortisationsdauer.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/sanierungsrechner\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/sanierungsrechner\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/sanierungsrechner\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sanierungsrechner\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/#website\",\"url\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/\",\"name\":\"Wolfinger Zellulosed\u00e4mmung\",\"description\":\"Zellulosed\u00e4mmung\",\"publisher\":{\"@id\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/#organization\",\"name\":\"Wolfinger GmbH\",\"url\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/wolfinger_fav_144.png\",\"contentUrl\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/wolfinger_fav_144.png\",\"width\":1633,\"height\":1632,\"caption\":\"Wolfinger GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/wolfinger.at\\\/daemmen\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=100090125861398\",\"https:\\\/\\\/www.instagram.com\\\/wolfinger_gmbh\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Sanierungsrechner - Wolfinger","description":"Sanierungsrechner von Wolfinger: Berechnung von D\u00e4mmkosten, Energieeinsparungen, CO2-Reduktion und Amortisationsdauer.","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:\/\/wolfinger.at\/daemmen\/sanierungsrechner\/","og_locale":"de_DE","og_type":"article","og_title":"Sanierungsrechner - Wolfinger","og_description":"Sanierungsrechner von Wolfinger: Berechnung von D\u00e4mmkosten, Energieeinsparungen, CO2-Reduktion und Amortisationsdauer.","og_url":"https:\/\/wolfinger.at\/daemmen\/sanierungsrechner\/","og_site_name":"Wolfinger","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=100090125861398","article_modified_time":"2026-08-10T10:26:58+00:00","twitter_card":"summary_large_image","twitter_misc":{"Gesch\u00e4tzte Lesezeit":"6\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/wolfinger.at\/daemmen\/sanierungsrechner\/","url":"https:\/\/wolfinger.at\/daemmen\/sanierungsrechner\/","name":"Sanierungsrechner - Wolfinger","isPartOf":{"@id":"https:\/\/wolfinger.at\/daemmen\/#website"},"datePublished":"2026-01-28T07:21:23+00:00","dateModified":"2026-08-10T10:26:58+00:00","description":"Sanierungsrechner von Wolfinger: Berechnung von D\u00e4mmkosten, Energieeinsparungen, CO2-Reduktion und Amortisationsdauer.","breadcrumb":{"@id":"https:\/\/wolfinger.at\/daemmen\/sanierungsrechner\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wolfinger.at\/daemmen\/sanierungsrechner\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wolfinger.at\/daemmen\/sanierungsrechner\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/wolfinger.at\/daemmen\/"},{"@type":"ListItem","position":2,"name":"Sanierungsrechner"}]},{"@type":"WebSite","@id":"https:\/\/wolfinger.at\/daemmen\/#website","url":"https:\/\/wolfinger.at\/daemmen\/","name":"Wolfinger Zellulosed\u00e4mmung","description":"Zellulosed\u00e4mmung","publisher":{"@id":"https:\/\/wolfinger.at\/daemmen\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wolfinger.at\/daemmen\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/wolfinger.at\/daemmen\/#organization","name":"Wolfinger GmbH","url":"https:\/\/wolfinger.at\/daemmen\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/wolfinger.at\/daemmen\/#\/schema\/logo\/image\/","url":"https:\/\/wolfinger.at\/daemmen\/wp-content\/uploads\/2024\/03\/wolfinger_fav_144.png","contentUrl":"https:\/\/wolfinger.at\/daemmen\/wp-content\/uploads\/2024\/03\/wolfinger_fav_144.png","width":1633,"height":1632,"caption":"Wolfinger GmbH"},"image":{"@id":"https:\/\/wolfinger.at\/daemmen\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=100090125861398","https:\/\/www.instagram.com\/wolfinger_gmbh\/"]}]}},"_links":{"self":[{"href":"https:\/\/wolfinger.at\/daemmen\/wp-json\/wp\/v2\/pages\/4500","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wolfinger.at\/daemmen\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wolfinger.at\/daemmen\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wolfinger.at\/daemmen\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/wolfinger.at\/daemmen\/wp-json\/wp\/v2\/comments?post=4500"}],"version-history":[{"count":209,"href":"https:\/\/wolfinger.at\/daemmen\/wp-json\/wp\/v2\/pages\/4500\/revisions"}],"predecessor-version":[{"id":5806,"href":"https:\/\/wolfinger.at\/daemmen\/wp-json\/wp\/v2\/pages\/4500\/revisions\/5806"}],"wp:attachment":[{"href":"https:\/\/wolfinger.at\/daemmen\/wp-json\/wp\/v2\/media?parent=4500"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}