



{"id":23431,"date":"2026-10-21T18:54:48","date_gmt":"2026-10-21T14:54:48","guid":{"rendered":"https:\/\/datvale.ge\/central-heating-cost-calculator\/"},"modified":"2026-10-21T19:21:15","modified_gmt":"2026-10-21T15:21:15","slug":"central-heating-cost-calculator","status":"publish","type":"page","link":"https:\/\/datvale.ge\/en\/central-heating-cost-calculator\/","title":{"rendered":"Central Heating Cost Calculator"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"23431\" class=\"elementor elementor-23431 elementor-23413\">\n\t\t\t\t<div class=\"elementor-element elementor-element-47b0cb3 e-flex e-con-boxed e-con e-parent\" data-id=\"47b0cb3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d8eb744 elementor-widget elementor-widget-image\" data-id=\"d8eb744\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"194\" src=\"https:\/\/datvale.ge\/wp-content\/uploads\/2026\/10\/gatboba-1024x194.webp\" class=\"attachment-large size-large wp-image-23430\" alt=\"Central Heating\" srcset=\"https:\/\/datvale.ge\/wp-content\/uploads\/2026\/10\/gatboba-1024x194.webp 1024w, https:\/\/datvale.ge\/wp-content\/uploads\/2026\/10\/gatboba-300x57.webp 300w, https:\/\/datvale.ge\/wp-content\/uploads\/2026\/10\/gatboba-768x145.webp 768w, https:\/\/datvale.ge\/wp-content\/uploads\/2026\/10\/gatboba-1536x291.webp 1536w, https:\/\/datvale.ge\/wp-content\/uploads\/2026\/10\/gatboba-2048x388.webp 2048w, https:\/\/datvale.ge\/wp-content\/uploads\/2026\/10\/gatboba-600x114.webp 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6e51e1d e-con-full e-flex e-con e-child\" data-id=\"6e51e1d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-013cbdc elementor-widget elementor-widget-heading\" data-id=\"013cbdc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Central Heating \u2013 Calculate Heating Material Costs<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3136f55 e-flex e-con-boxed e-con e-parent\" data-id=\"3136f55\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-28a374a elementor-widget elementor-widget-html\" data-id=\"28a374a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n<div id=\"dv-heating-calculator-en\" lang=\"en-US\">\r\n\r\n<style>\r\n#dv-heating-calculator-en,\r\n#dv-heating-calculator-en * {\r\n  box-sizing: border-box;\r\n}\r\n\r\n#dv-heating-calculator-en {\r\n  --b: #0b3a78;\r\n  --b2: #1764bd;\r\n  --t: #173558;\r\n  --m: #5f7287;\r\n  --bd: #e3ebf5;\r\n\r\n  max-width: 1260px;\r\n  width: 100%;\r\n  margin: 26px auto;\r\n  padding: 42px 22px;\r\n  border: 1px solid var(--bd);\r\n  border-radius: 24px;\r\n  background: linear-gradient(180deg,#f8fbff,#eef4fb);\r\n  color: var(--t);\r\n  font-family: system-ui,-apple-system,\"Segoe UI\",sans-serif;\r\n  box-shadow: 0 16px 42px rgba(11,58,120,.10);\r\n}\r\n\r\n#dv-heating-calculator-en .dv-inner {\r\n  max-width: 1180px;\r\n  margin: auto;\r\n}\r\n\r\n#dv-heating-calculator-en .card,\r\n#dv-heating-calculator-en .result-card,\r\n#dv-heating-calculator-en .summary,\r\n#dv-heating-calculator-en .performance {\r\n  background: #fff;\r\n  border: 1px solid var(--bd);\r\n  border-radius: 22px;\r\n  box-shadow: 0 12px 32px rgba(11,58,120,.08);\r\n}\r\n\r\n#dv-heating-calculator-en .card {\r\n  padding: 28px;\r\n  margin-bottom: 24px;\r\n}\r\n\r\n#dv-heating-calculator-en .title {\r\n  margin: 0 0 22px;\r\n  color: var(--t);\r\n  font-size: 24px;\r\n  font-weight: 900;\r\n  line-height: 1.4;\r\n}\r\n\r\n#dv-heating-calculator-en .grid {\r\n  display: grid;\r\n  grid-template-columns: repeat(3,minmax(0,1fr));\r\n  gap: 18px;\r\n}\r\n\r\n#dv-heating-calculator-en .field {\r\n  min-width: 0;\r\n}\r\n\r\n#dv-heating-calculator-en label {\r\n  display: block;\r\n  margin: 0 0 8px;\r\n  font-size: 14px;\r\n  font-weight: 800;\r\n}\r\n\r\n#dv-heating-calculator-en input,\r\n#dv-heating-calculator-en select {\r\n  width: 100%;\r\n  min-height: 56px;\r\n  padding: 10px 14px;\r\n  border: 1px solid #d8e3ef;\r\n  border-radius: 14px;\r\n  background: #f8fbff;\r\n  color: var(--t);\r\n  font-size: 15px;\r\n  font-weight: 700;\r\n  outline: none;\r\n}\r\n\r\n#dv-heating-calculator-en input:focus,\r\n#dv-heating-calculator-en select:focus {\r\n  border-color: var(--b2);\r\n  box-shadow: 0 0 0 4px rgba(23,100,189,.10);\r\n}\r\n\r\n#dv-heating-calculator-en button {\r\n  font-family: inherit;\r\n}\r\n\r\n#dv-heating-calculator-en .btn {\r\n  display: inline-flex;\r\n  justify-content: center;\r\n  align-items: center;\r\n  gap: 8px;\r\n  min-height: 54px;\r\n  padding: 12px 18px;\r\n  border: 0;\r\n  border-radius: 14px;\r\n  cursor: pointer;\r\n  font-size: 15px;\r\n  font-weight: 900;\r\n  text-align: center;\r\n}\r\n\r\n#dv-heating-calculator-en .btn-primary {\r\n  background: linear-gradient(135deg,var(--b),var(--b2));\r\n  color: #fff;\r\n}\r\n\r\n#dv-heating-calculator-en .btn-green {\r\n  background: linear-gradient(135deg,#13795b,#0e9a70);\r\n  color: #fff;\r\n}\r\n\r\n#dv-heating-calculator-en .btn-light {\r\n  background: #eef5fc;\r\n  color: var(--b);\r\n  border: 1px solid #d8e3ef;\r\n}\r\n\r\n#dv-heating-calculator-en button:disabled {\r\n  opacity: .6;\r\n  cursor: wait;\r\n}\r\n\r\n#dv-heating-calculator-en .full {\r\n  width: 100%;\r\n}\r\n\r\n#dv-heating-calculator-en .muted {\r\n  color: var(--m);\r\n  font-size: 13px;\r\n  line-height: 1.65;\r\n}\r\n\r\n#dv-heating-calculator-en .note {\r\n  margin: 17px 0;\r\n  padding: 15px 17px;\r\n  border: 1px solid #d8e3ef;\r\n  border-radius: 13px;\r\n  background: #f8fbff;\r\n  color: #52677f;\r\n  font-size: 13px;\r\n  line-height: 1.7;\r\n}\r\n\r\n#dv-heating-calculator-en .rooms {\r\n  display: grid;\r\n  gap: 13px;\r\n}\r\n\r\n#dv-heating-calculator-en .room {\r\n  border: 1px solid #dce6f2;\r\n  border-radius: 17px;\r\n  padding: 17px;\r\n  background: #f8fbff;\r\n}\r\n\r\n#dv-heating-calculator-en .room-head {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  gap: 12px;\r\n  margin-bottom: 13px;\r\n}\r\n\r\n#dv-heating-calculator-en .room-head strong {\r\n  font-size: 16px;\r\n  color: var(--b);\r\n}\r\n\r\n#dv-heating-calculator-en .room-grid {\r\n  display: grid;\r\n  grid-template-columns: repeat(4,minmax(0,1fr));\r\n  gap: 12px;\r\n}\r\n\r\n#dv-heating-calculator-en .room .remove {\r\n  min-height: 34px;\r\n  padding: 6px 12px;\r\n  border: 0;\r\n  border-radius: 9px;\r\n  background: #ffecec;\r\n  color: #a32020;\r\n  font-weight: 800;\r\n  cursor: pointer;\r\n}\r\n\r\n#dv-heating-calculator-en .err {\r\n  display: none;\r\n  margin-top: 15px;\r\n  padding: 14px;\r\n  border-radius: 12px;\r\n  background: #fff0f0;\r\n  color: #a32020;\r\n  font-weight: 800;\r\n}\r\n\r\n#dv-heating-calculator-en .output {\r\n  display: none;\r\n  scroll-margin-top: 110px;\r\n}\r\n\r\n#dv-heating-calculator-en .output.show {\r\n  display: block;\r\n}\r\n\r\n#dv-heating-calculator-en .performance,\r\n#dv-heating-calculator-en .summary {\r\n  padding: 24px;\r\n  margin: 20px auto;\r\n  max-width: 1080px;\r\n}\r\n\r\n#dv-heating-calculator-en .pgrid,\r\n#dv-heating-calculator-en .sgrid {\r\n  display: grid;\r\n  grid-template-columns: repeat(4,minmax(0,1fr));\r\n  gap: 14px;\r\n}\r\n\r\n#dv-heating-calculator-en .pitem,\r\n#dv-heating-calculator-en .sitem {\r\n  padding: 17px 12px;\r\n  border: 1px solid #e1e9f3;\r\n  border-radius: 15px;\r\n  background: #f8fbff;\r\n  text-align: center;\r\n}\r\n\r\n#dv-heating-calculator-en .plabel,\r\n#dv-heating-calculator-en .slabel {\r\n  display: block;\r\n  margin-bottom: 8px;\r\n  color: var(--m);\r\n  font-size: 12px;\r\n  font-weight: 800;\r\n}\r\n\r\n#dv-heating-calculator-en .pval,\r\n#dv-heating-calculator-en .sval {\r\n  display: block;\r\n  font-size: 18px;\r\n  font-weight: 900;\r\n  overflow-wrap: anywhere;\r\n}\r\n\r\n#dv-heating-calculator-en .results {\r\n  display: grid;\r\n  gap: 18px;\r\n  max-width: 1080px;\r\n  margin: auto;\r\n}\r\n\r\n#dv-heating-calculator-en .result-card {\r\n  overflow: hidden;\r\n}\r\n\r\n#dv-heating-calculator-en .rhead {\r\n  padding: 17px 20px;\r\n  background: linear-gradient(135deg,var(--b),var(--b2));\r\n  color: #fff;\r\n}\r\n\r\n#dv-heating-calculator-en .rhead h3 {\r\n  margin: 0;\r\n  color: #fff;\r\n  font-size: 18px;\r\n  font-weight: 900;\r\n}\r\n\r\n#dv-heating-calculator-en .rbody {\r\n  padding: 10px 20px 18px;\r\n}\r\n\r\n#dv-heating-calculator-en .item-row {\r\n  display: grid;\r\n  grid-template-columns: minmax(0,1fr) auto;\r\n  gap: 15px;\r\n  padding: 13px 0;\r\n  border-bottom: 1px dashed #d9e4ef;\r\n  align-items: center;\r\n}\r\n\r\n#dv-heating-calculator-en .rname {\r\n  display: block;\r\n  color: #425a74;\r\n  font-size: 14px;\r\n  font-weight: 700;\r\n}\r\n\r\n#dv-heating-calculator-en .rmeta {\r\n  display: block;\r\n  color: #75869b;\r\n  font-size: 12px;\r\n  margin-top: 3px;\r\n  font-weight: 500;\r\n}\r\n\r\n#dv-heating-calculator-en .rval {\r\n  font-size: 15px;\r\n  font-weight: 900;\r\n  text-align: right;\r\n  white-space: nowrap;\r\n}\r\n\r\n#dv-heating-calculator-en .ctotal {\r\n  margin-top: 12px;\r\n  padding: 14px;\r\n  background: #f4f8fd;\r\n  border-radius: 12px;\r\n  text-align: right;\r\n  font-weight: 900;\r\n}\r\n\r\n#dv-heating-calculator-en .grand {\r\n  margin-top: 18px;\r\n  padding: 30px 18px;\r\n  border-radius: 18px;\r\n  background: linear-gradient(135deg,var(--b),var(--b2));\r\n  color: #fff;\r\n  text-align: center;\r\n}\r\n\r\n#dv-heating-calculator-en .grand small {\r\n  display: block;\r\n  margin-bottom: 10px;\r\n  color: #fff;\r\n  font-size: 14px;\r\n}\r\n\r\n#dv-heating-calculator-en .grand strong {\r\n  display: block;\r\n  color: #fff;\r\n  font-size: clamp(30px,5vw,50px);\r\n  font-weight: 900;\r\n}\r\n\r\n#dv-heating-calculator-en .actions {\r\n  display: grid;\r\n  grid-template-columns: repeat(3,1fr);\r\n  gap: 12px;\r\n  margin-top: 16px;\r\n}\r\n\r\n#dv-heating-calculator-en .callbox {\r\n  display: none;\r\n  margin-top: 18px;\r\n  padding: 18px;\r\n  border: 1px solid #d8e3ef;\r\n  border-radius: 16px;\r\n  background: #f8fbff;\r\n}\r\n\r\n#dv-heating-calculator-en .callbox h4 {\r\n  margin: 0 0 7px;\r\n  color: var(--b);\r\n  font-size: 17px;\r\n}\r\n\r\n#dv-heating-calculator-en .callrow {\r\n  display: grid;\r\n  grid-template-columns: minmax(0,1fr) auto;\r\n  gap: 10px;\r\n  margin-top: 12px;\r\n}\r\n\r\n#dv-heating-calculator-en .callrow.saved {\r\n  grid-template-columns: 1fr;\r\n}\r\n\r\n#dv-heating-calculator-en .callrow.saved input {\r\n  display: none;\r\n}\r\n\r\n#dv-heating-calculator-en .callstatus {\r\n  display: none;\r\n  margin-top: 10px;\r\n  padding: 12px;\r\n  border-radius: 10px;\r\n  font-size: 13px;\r\n  font-weight: 800;\r\n}\r\n\r\n#dv-heating-calculator-en .callstatus.ok {\r\n  display: block;\r\n  background: #eefaf5;\r\n  color: #13795b;\r\n}\r\n\r\n#dv-heating-calculator-en .callstatus.bad {\r\n  display: block;\r\n  background: #fff2f2;\r\n  color: #a32020;\r\n}\r\n\r\n#dv-heating-calculator-en .price-warning {\r\n  border-left: 4px solid #d59b22;\r\n  background: #fff9e9;\r\n  border-radius: 12px;\r\n  padding: 14px 17px;\r\n  margin-top: 15px;\r\n  font-size: 13px;\r\n  line-height: 1.7;\r\n}\r\n\r\n@media(max-width:900px) {\r\n  #dv-heating-calculator-en .grid {\r\n    grid-template-columns: repeat(2,1fr);\r\n  }\r\n\r\n  #dv-heating-calculator-en .room-grid {\r\n    grid-template-columns: repeat(2,1fr);\r\n  }\r\n\r\n  #dv-heating-calculator-en .pgrid,\r\n  #dv-heating-calculator-en .sgrid {\r\n    grid-template-columns: repeat(2,1fr);\r\n  }\r\n}\r\n\r\n@media(max-width:600px) {\r\n  #dv-heating-calculator-en {\r\n    padding: 22px 12px;\r\n  }\r\n\r\n  #dv-heating-calculator-en .card,\r\n  #dv-heating-calculator-en .performance,\r\n  #dv-heating-calculator-en .summary {\r\n    padding: 18px;\r\n  }\r\n\r\n  #dv-heating-calculator-en .grid,\r\n  #dv-heating-calculator-en .room-grid,\r\n  #dv-heating-calculator-en .actions,\r\n  #dv-heating-calculator-en .callrow {\r\n    grid-template-columns: 1fr;\r\n  }\r\n\r\n  #dv-heating-calculator-en .title {\r\n    font-size: 21px;\r\n  }\r\n\r\n  #dv-heating-calculator-en .item-row {\r\n    grid-template-columns: 1fr;\r\n    gap: 5px;\r\n  }\r\n\r\n  #dv-heating-calculator-en .rval,\r\n  #dv-heating-calculator-en .ctotal {\r\n    text-align: left;\r\n  }\r\n\r\n  #dv-heating-calculator-en .btn {\r\n    width: 100%;\r\n  }\r\n}\r\n\r\n@media print {\r\n  body * {\r\n    visibility: hidden !important;\r\n  }\r\n\r\n  #dv-heating-calculator-en .output,\r\n  #dv-heating-calculator-en .output * {\r\n    visibility: visible !important;\r\n  }\r\n\r\n  #dv-heating-calculator-en .output {\r\n    display: block !important;\r\n    position: absolute;\r\n    left: 0;\r\n    top: 0;\r\n    width: 100%;\r\n  }\r\n\r\n  #dv-heating-calculator-en .actions,\r\n  #dv-heating-calculator-en .callbox {\r\n    display: none !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<div class=\"dv-inner\">\r\n\r\n<div class=\"card\">\r\n  <h3 class=\"title\">1. Heating System Details<\/h3>\r\n\r\n  <div class=\"grid\">\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-area-en\">Heated Area, m\u00b2<\/label>\r\n      <input id=\"dh-area-en\" type=\"number\"\r\n        min=\"10\" max=\"1000\" step=\"1\" value=\"100\">\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-height-en\">Ceiling Height, m<\/label>\r\n      <input id=\"dh-height-en\" type=\"number\"\r\n        min=\"2.2\" max=\"5\" step=\".1\" value=\"2.8\">\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-object-en\">Property Type<\/label>\r\n      <select id=\"dh-object-en\">\r\n        <option value=\"apartment\">Apartment<\/option>\r\n        <option value=\"house\">Private House<\/option>\r\n        <option value=\"cottage\">Cottage<\/option>\r\n        <option value=\"office\">Office<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-insulation-en\">Insulation Quality<\/label>\r\n      <select id=\"dh-insulation-en\">\r\n        <option value=\"good\">Good<\/option>\r\n        <option value=\"standard\" selected>Average<\/option>\r\n        <option value=\"poor\">Poor<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-climate-en\">Climate Conditions<\/label>\r\n      <select id=\"dh-climate-en\">\r\n        <option value=\"mild\">Mild Climate<\/option>\r\n        <option value=\"normal\" selected>Moderate Climate<\/option>\r\n        <option value=\"cold\">Cold Climate<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-radiator-en\">Radiator Type<\/label>\r\n      <select id=\"dh-radiator-en\">\r\n        <option value=\"panel\">COPA T22 Panel Radiator<\/option>\r\n        <option value=\"section\">Global VOX EXTRA Sectional Radiator<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-boiler-en\">Heating Boiler<\/label>\r\n      <select id=\"dh-boiler-en\">\r\n        <option value=\"auto\">Automatic Selection<\/option>\r\n        <option value=\"macro24\">Macro 24 \u2014 1,699 GEL<\/option>\r\n        <option value=\"sime25\">SIME Go 18\/25 BF \u2014 2,149 GEL<\/option>\r\n        <option value=\"macro36\">Macro 36 \u2014 2,099 GEL<\/option>\r\n        <option value=\"sime35\">SIME EDEA HM 35 \u2014 3,750 GEL<\/option>\r\n        <option value=\"none\">Without Boiler<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-pipe-en\">Pipe Type<\/label>\r\n      <select id=\"dh-pipe-en\">\r\n        <option value=\"multilayer\">Multilayer Pipe<\/option>\r\n        <option value=\"pex\">PEX Pipe<\/option>\r\n        <option value=\"ppr\">PPR Pipe<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-layout-en\">Piping Layout<\/label>\r\n      <select id=\"dh-layout-en\">\r\n        <option value=\"collector\">Manifold System<\/option>\r\n        <option value=\"two\" selected>Two-Pipe System<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-roomcount-en\">Estimated Number of Rooms<\/label>\r\n      <input id=\"dh-roomcount-en\" type=\"number\"\r\n        min=\"1\" max=\"40\" value=\"5\">\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-hotwater-en\">Domestic Hot Water Required?<\/label>\r\n      <select id=\"dh-hotwater-en\">\r\n        <option value=\"yes\" selected>Yes<\/option>\r\n        <option value=\"no\">No<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-budget-en\">Material Quality Level<\/label>\r\n      <select id=\"dh-budget-en\">\r\n        <option value=\"economy\">Economy<\/option>\r\n        <option value=\"standard\" selected>Standard<\/option>\r\n        <option value=\"premium\">Premium<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n  <div class=\"note\">\r\n    Add individual rooms to calculate radiator quantities\r\n    in greater detail. If no rooms are added, the calculator\r\n    will use an estimated area-based distribution.\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"card\">\r\n  <h3 class=\"title\">2. Room Details<\/h3>\r\n\r\n  <div id=\"dh-rooms-en\" class=\"rooms\"><\/div>\r\n\r\n  <button type=\"button\" id=\"dh-addroom-en\"\r\n    class=\"btn btn-light full\" style=\"margin-top:15px\">\r\n    + Add Room\r\n  <\/button>\r\n\r\n  <p class=\"muted\" style=\"margin:13px 0 0\">\r\n    The total area of all added rooms must match\r\n    the heated area entered above.\r\n  <\/p>\r\n<\/div>\r\n\r\n<div class=\"card\">\r\n  <h3 class=\"title\">3. Additional Heating Components<\/h3>\r\n\r\n  <div class=\"grid\">\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-floor-en\">Underfloor Heating Area, m\u00b2<\/label>\r\n      <input id=\"dh-floor-en\" type=\"number\"\r\n        min=\"0\" max=\"1000\" value=\"0\">\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-bath-en\">Bathroom Towel Radiators<\/label>\r\n      <input id=\"dh-bath-en\" type=\"number\"\r\n        min=\"0\" max=\"20\" value=\"1\">\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-thermostat-en\">Room Thermostats<\/label>\r\n      <input id=\"dh-thermostat-en\" type=\"number\"\r\n        min=\"0\" max=\"40\" value=\"1\">\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-extra-pipe-en\">Additional Pipe Length, m<\/label>\r\n      <input id=\"dh-extra-pipe-en\" type=\"number\"\r\n        min=\"0\" max=\"1000\" value=\"0\">\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-extra-en\">Material Contingency<\/label>\r\n      <select id=\"dh-extra-en\">\r\n        <option value=\"0\">0%<\/option>\r\n        <option value=\".05\" selected>5%<\/option>\r\n        <option value=\".10\">10%<\/option>\r\n        <option value=\".15\">15%<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"field\">\r\n      <label for=\"dh-pump-en\">Additional Circulation Pump<\/label>\r\n      <select id=\"dh-pump-en\">\r\n        <option value=\"no\" selected>No<\/option>\r\n        <option value=\"yes\">Yes<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n  <div class=\"price-warning\">\r\n    Prices are intended for preliminary budgeting.\r\n    Some product prices are based on publicly listed\r\n    catalog prices, while pipe and accessory prices\r\n    are estimates. This calculation is not an official\r\n    commercial quotation from any supplier.\r\n  <\/div>\r\n\r\n  <button type=\"button\" id=\"dh-calc-en\"\r\n    class=\"btn btn-primary full\" style=\"margin-top:20px\">\r\n    Calculate Heating Material Costs\r\n  <\/button>\r\n\r\n  <div id=\"dh-error-en\" class=\"err\" role=\"alert\"><\/div>\r\n<\/div>\r\n\r\n<div id=\"dh-output-en\" class=\"output\">\r\n\r\n  <div class=\"performance\">\r\n    <h3 class=\"title\">4. Heating System Recommendation<\/h3>\r\n\r\n    <div class=\"pgrid\">\r\n\r\n      <div class=\"pitem\">\r\n        <span class=\"plabel\">Estimated Heat Demand<\/span>\r\n        <strong class=\"pval\" id=\"dh-load-en\">\u2014<\/strong>\r\n      <\/div>\r\n\r\n      <div class=\"pitem\">\r\n        <span class=\"plabel\">Selected Boiler<\/span>\r\n        <strong class=\"pval\" id=\"dh-selected-boiler-en\">\u2014<\/strong>\r\n      <\/div>\r\n\r\n      <div class=\"pitem\">\r\n        <span class=\"plabel\">Radiators<\/span>\r\n        <strong class=\"pval\" id=\"dh-radiators-en\">\u2014<\/strong>\r\n      <\/div>\r\n\r\n      <div class=\"pitem\">\r\n        <span class=\"plabel\">Heating Pipes<\/span>\r\n        <strong class=\"pval\" id=\"dh-pipe-length-en\">\u2014<\/strong>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n    <p class=\"muted\" id=\"dh-technical-note-en\"\r\n      style=\"margin:16px 0 0\"><\/p>\r\n  <\/div>\r\n\r\n  <div id=\"dh-results-en\" class=\"results\"><\/div>\r\n\r\n  <div class=\"summary\">\r\n    <h3 class=\"title\">5. Material Cost Summary<\/h3>\r\n\r\n    <div class=\"sgrid\">\r\n\r\n      <div class=\"sitem\">\r\n        <span class=\"slabel\">Heating Boiler<\/span>\r\n        <strong class=\"sval\" id=\"dh-s-boiler-en\">\u2014<\/strong>\r\n      <\/div>\r\n\r\n      <div class=\"sitem\">\r\n        <span class=\"slabel\">Radiators<\/span>\r\n        <strong class=\"sval\" id=\"dh-s-radiator-en\">\u2014<\/strong>\r\n      <\/div>\r\n\r\n      <div class=\"sitem\">\r\n        <span class=\"slabel\">Pipes and Fittings<\/span>\r\n        <strong class=\"sval\" id=\"dh-s-pipes-en\">\u2014<\/strong>\r\n      <\/div>\r\n\r\n      <div class=\"sitem\">\r\n        <span class=\"slabel\">Additional Materials<\/span>\r\n        <strong class=\"sval\" id=\"dh-s-other-en\">\u2014<\/strong>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"grand\">\r\n      <small>Estimated Total Heating Material Cost<\/small>\r\n      <strong id=\"dh-total-en\">\u2014<\/strong>\r\n    <\/div>\r\n\r\n    <p class=\"muted\" style=\"text-align:center;margin:14px 0\">\r\n      The total includes materials and equipment only.\r\n      Installation and labor costs are excluded.\r\n    <\/p>\r\n\r\n    <div class=\"actions\">\r\n      <button type=\"button\" id=\"dh-pdf-en\"\r\n        class=\"btn btn-green\">\ud83d\udcc4 Download PDF<\/button>\r\n\r\n      <button type=\"button\" id=\"dh-csv-en\"\r\n        class=\"btn btn-light\">\ud83d\udcca Excel \/ CSV<\/button>\r\n\r\n      <button type=\"button\" id=\"dh-print-en\"\r\n        class=\"btn btn-light\">\ud83d\udda8\ufe0f Print<\/button>\r\n    <\/div>\r\n\r\n    <div id=\"dh-callbox-en\" class=\"callbox\">\r\n      <h4>Would You Like a Heating Specialist Consultation?<\/h4>\r\n\r\n      <p class=\"muted\">\r\n        Request a call from a specialist for advice\r\n        on selecting a suitable heating system.\r\n      <\/p>\r\n\r\n      <div id=\"dh-callrow-en\" class=\"callrow\">\r\n        <input type=\"tel\" id=\"dh-phone-en\"\r\n          placeholder=\"e.g. 599123456\"\r\n          inputmode=\"tel\" autocomplete=\"tel\">\r\n\r\n        <button type=\"button\" id=\"dh-call-en\"\r\n          class=\"btn btn-green\">\r\n          Request a Specialist Call\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <div id=\"dh-callstatus-en\"\r\n        class=\"callstatus\" aria-live=\"polite\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"note\">\r\n      Heat demand and material quantities are preliminary\r\n      estimates. Final system design requires verification\r\n      of room-by-room heat losses, actual radiator operating\r\n      temperatures, pipe hydraulics, and boiler compatibility.\r\n    <\/div>\r\n  <\/div>\r\n\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<script src=\"https:\/\/datvale.ge\/wp-content\/uploads\/datvale-assets\/jspdf.umd.min.js\"><\/script>\r\n\r\n<script>\r\n(function(){\r\n\"use strict\";\r\n\r\nconst root=document.getElementById(\"dv-heating-calculator-en\");\r\nif(!root||root.dataset.initialized===\"1\")return;\r\nroot.dataset.initialized=\"1\";\r\n\r\nconst $=id=>root.querySelector(\"#\"+id+\"-en\");\r\nconst val=id=>$(id).value;\r\nconst num=id=>Number(String(val(id)).replace(\",\",\".\"))||0;\r\nconst ceil=(n,s=1)=>Math.ceil(n\/s)*s;\r\nconst round=n=>Math.round(n*100)\/100;\r\n\r\nconst money=n=>new Intl.NumberFormat(\"en-US\",{\r\n maximumFractionDigits:0\r\n}).format(Math.round(n))+\" GEL\";\r\n\r\nconst fmt=n=>new Intl.NumberFormat(\"en-US\",{\r\n maximumFractionDigits:2\r\n}).format(n);\r\n\r\nconst set=(id,text)=>{$(id).textContent=text};\r\n\r\nconst escapeHtml=s=>String(s).replace(\/[&<>\"']\/g,c=>({\r\n \"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\r\n '\"':\"&quot;\",\"'\":\"&#39;\"\r\n})[c]);\r\n\r\n\/*\r\n ENGLISH LOCALIZATION\r\n Original calculation formulas and prices\r\n are preserved from the Georgian version.\r\n\r\n All displayed monetary values use GEL.\r\n\r\n Product prices are budget references.\r\n Verify current supplier prices and\r\n manufacturer specifications before use.\r\n*\/\r\n\r\nconst BOILERS={\r\n macro24:{\r\n  name:\"Macro 24\",\r\n  price:1699,\r\n  capacity:24,\r\n  catalog:true\r\n },\r\n sime25:{\r\n  name:\"SIME Go 18\/25 BF\",\r\n  price:2149,\r\n  capacity:18,\r\n  catalog:true\r\n },\r\n macro36:{\r\n  name:\"Macro 36\",\r\n  price:2099,\r\n  capacity:36,\r\n  catalog:true\r\n },\r\n sime35:{\r\n  name:\"SIME EDEA HM 35\",\r\n  price:3750,\r\n  capacity:35,\r\n  catalog:true\r\n }\r\n};\r\n\r\nconst PRICE={\r\n panel:{\r\n  small:{\r\n   watts:750,\r\n   price:105,\r\n   label:\"Small\"\r\n  },\r\n  medium:{\r\n   watts:1150,\r\n   price:175,\r\n   label:\"Medium\"\r\n  },\r\n  large:{\r\n   watts:1700,\r\n   price:265,\r\n   label:\"Large\"\r\n  },\r\n  xlarge:{\r\n   watts:2200,\r\n   price:335,\r\n   label:\"Extra Large\"\r\n  }\r\n },\r\n section:{\r\n  watts:119,\r\n  price:45\r\n },\r\n pipe:{\r\n  multilayer:7.5,\r\n  pex:5.5,\r\n  ppr:5\r\n },\r\n fitting:{\r\n  multilayer:15,\r\n  pex:12,\r\n  ppr:9\r\n },\r\n valveSet:55,\r\n collectorPort:48,\r\n collectorBox:150,\r\n floorPipe:5.5,\r\n floorInsulation:16,\r\n floorFixings:4,\r\n floorControls:12,\r\n towel:110,\r\n thermostat:210,\r\n filter:65,\r\n safety:90,\r\n boilerConnection:160,\r\n pipeInsulation:2.8,\r\n pipeFixings:2,\r\n pump:480,\r\n manifoldAccessories:110,\r\n radiatorBracket:20\r\n};\r\n\r\nconst QUALITY={\r\n economy:0.9,\r\n standard:1,\r\n premium:1.18\r\n};\r\n\r\nconst ROOM_NAMES=[\r\n \"Living Room\",\r\n \"Bedroom\",\r\n \"Kitchen\",\r\n \"Bedroom 2\",\r\n \"Bedroom 3\",\r\n \"Home Office\",\r\n \"Hallway\",\r\n \"Other\"\r\n];\r\n\r\nconst roomsEl=$(\"dh-rooms\");\r\n\r\nlet roomSeq=0;\r\nlet last=null;\r\nlet busy=false;\r\n\r\n\/* ROOM MANAGEMENT *\/\r\n\r\nfunction addRoom(name=\"\",area=\"\"){\r\n roomSeq++;\r\n\r\n const el=document.createElement(\"div\");\r\n el.className=\"room\";\r\n el.dataset.roomId=roomSeq;\r\n\r\n const opts=ROOM_NAMES.map(n=>\r\n  `<option value=\"${escapeHtml(n)}\"${\r\n   n===name?\" selected\":\"\"\r\n  }>${escapeHtml(n)}<\/option>`\r\n ).join(\"\");\r\n\r\n el.innerHTML=`\r\n  <div class=\"room-head\">\r\n   <strong>Room #${roomSeq}<\/strong>\r\n   <button type=\"button\" class=\"remove\">\r\n    Remove\r\n   <\/button>\r\n  <\/div>\r\n\r\n  <div class=\"room-grid\">\r\n\r\n   <div class=\"field\">\r\n    <label>Room Type<\/label>\r\n    <select class=\"room-name\">\r\n     ${opts}\r\n    <\/select>\r\n   <\/div>\r\n\r\n   <div class=\"field\">\r\n    <label>Room Area, m\u00b2<\/label>\r\n    <input class=\"room-area\" type=\"number\"\r\n     min=\"1\" max=\"1000\" step=\".5\"\r\n     value=\"${escapeHtml(area)}\"\r\n     placeholder=\"e.g. 20\">\r\n   <\/div>\r\n\r\n   <div class=\"field\">\r\n    <label>Number of Radiators<\/label>\r\n    <select class=\"room-rads\">\r\n     <option value=\"auto\">Automatic<\/option>\r\n     <option value=\"1\">1 Radiator<\/option>\r\n     <option value=\"2\">2 Radiators<\/option>\r\n     <option value=\"3\">3 Radiators<\/option>\r\n     <option value=\"4\">4 Radiators<\/option>\r\n    <\/select>\r\n   <\/div>\r\n\r\n   <div class=\"field\">\r\n    <label>Room Insulation<\/label>\r\n    <select class=\"room-ins\">\r\n     <option value=\"same\">\r\n      Use Main Setting\r\n     <\/option>\r\n     <option value=\"good\">Good<\/option>\r\n     <option value=\"standard\">Average<\/option>\r\n     <option value=\"poor\">Poor<\/option>\r\n    <\/select>\r\n   <\/div>\r\n\r\n  <\/div>`;\r\n\r\n el.querySelector(\".remove\").addEventListener(\r\n  \"click\",()=>el.remove()\r\n );\r\n\r\n roomsEl.appendChild(el);\r\n}\r\n\r\n$(\"dh-addroom\").addEventListener(\"click\",()=>{\r\n if(roomsEl.children.length>=40)return;\r\n addRoom();\r\n});\r\n\r\nfunction getRooms(){\r\n return [...roomsEl.querySelectorAll(\".room\")].map(el=>({\r\n  name:el.querySelector(\".room-name\").value,\r\n  area:Number(el.querySelector(\".room-area\").value),\r\n  count:el.querySelector(\".room-rads\").value,\r\n  insulation:el.querySelector(\".room-ins\").value\r\n }));\r\n}\r\n\r\n\/* THERMAL ESTIMATE *\/\r\n\r\nfunction heatRate(insulation){\r\n return {\r\n  good:55,\r\n  standard:80,\r\n  poor:110\r\n }[insulation]||80;\r\n}\r\n\r\nfunction loadFor(area,ins,height,climate,object){\r\n const climateFactor={\r\n  mild:.85,\r\n  normal:1,\r\n  cold:1.25\r\n }[climate]||1;\r\n\r\n const objectFactor={\r\n  apartment:1,\r\n  house:1.08,\r\n  cottage:1.12,\r\n  office:1\r\n }[object]||1;\r\n\r\n return area*heatRate(ins)*\r\n  Math.max(.85,height\/2.8)*\r\n  climateFactor*objectFactor;\r\n}\r\n\r\nfunction makeAutoRooms(area,count){\r\n const n=Math.max(1,Math.min(40,count));\r\n const each=area\/n;\r\n\r\n return Array.from({length:n},(_,i)=>({\r\n  name:\"Room \"+(i+1),\r\n  area:each,\r\n  count:\"auto\",\r\n  insulation:\"same\"\r\n }));\r\n}\r\n\r\nfunction chooseBoiler(loadKw,hotWater){\r\n const required=loadKw*1.15;\r\n\r\n const available=Object.entries(BOILERS)\r\n  .filter(([k,b])=>b.capacity>=required)\r\n  .sort((a,b)=>a[1].capacity-b[1].capacity);\r\n\r\n if(!available.length)return null;\r\n\r\n if(hotWater&&required<=18){\r\n  return BOILERS.macro24;\r\n }\r\n\r\n return available[0][1];\r\n}\r\n\r\nfunction choosePanel(watts){\r\n const list=Object.values(PRICE.panel);\r\n\r\n return list.find(p=>p.watts>=watts)||\r\n  list[list.length-1];\r\n}\r\n\r\nfunction line(name,qty,unit,price,source=\"estimate\"){\r\n return {\r\n  name,\r\n  qty:round(qty),\r\n  unit,\r\n  price:round(price),\r\n  total:round(qty*price),\r\n  source\r\n };\r\n}\r\n\r\nfunction group(title,items){\r\n return {\r\n  title,\r\n  items:items.filter(x=>x.qty>0),\r\n  total:round(items.reduce((s,x)=>s+x.total,0))\r\n };\r\n}\r\n\r\n\/* MAIN CALCULATION *\/\r\n\r\nfunction calculate(){\r\n const area=num(\"dh-area\");\r\n const height=num(\"dh-height\");\r\n const count=num(\"dh-roomcount\");\r\n const floor=num(\"dh-floor\");\r\n const bath=num(\"dh-bath\");\r\n const thermostats=num(\"dh-thermostat\");\r\n const extraPipe=num(\"dh-extra-pipe\");\r\n\r\n const error=$(\"dh-error\");\r\n\r\n const fail=message=>{\r\n  error.textContent=message;\r\n  error.style.display=\"block\";\r\n  $(\"dh-output\").classList.remove(\"show\");\r\n  return false;\r\n };\r\n\r\n if(area<10||area>1000)\r\n  return fail(\r\n   \"The heated area must be between 10 and 1,000 m\u00b2.\"\r\n  );\r\n\r\n if(height<2.2||height>5)\r\n  return fail(\r\n   \"Ceiling height must be between 2.2 and 5 m.\"\r\n  );\r\n\r\n if(count<1||count>40||!Number.isInteger(count))\r\n  return fail(\r\n   \"Please enter between 1 and 40 rooms.\"\r\n  );\r\n\r\n if(floor<0||floor>area)\r\n  return fail(\r\n   \"Underfloor heating area cannot exceed the total heated area.\"\r\n  );\r\n\r\n if([bath,thermostats,extraPipe].some(x=>x<0))\r\n  return fail(\r\n   \"Quantities cannot be negative.\"\r\n  );\r\n\r\n const object=val(\"dh-object\");\r\n const ins=val(\"dh-insulation\");\r\n const climate=val(\"dh-climate\");\r\n const radType=val(\"dh-radiator\");\r\n const pipeType=val(\"dh-pipe\");\r\n const layout=val(\"dh-layout\");\r\n const hotWater=val(\"dh-hotwater\")===\"yes\";\r\n const quality=QUALITY[val(\"dh-budget\")];\r\n const reserve=num(\"dh-extra\");\r\n const extraPump=val(\"dh-pump\")===\"yes\";\r\n\r\n let rooms=getRooms();\r\n\r\n if(rooms.length){\r\n  if(rooms.some(r=>\r\n   !Number.isFinite(r.area)||r.area<=0\r\n  )){\r\n   return fail(\r\n    \"Please enter a valid area for every added room.\"\r\n   );\r\n  }\r\n\r\n  const sum=rooms.reduce((s,r)=>s+r.area,0);\r\n\r\n  if(Math.abs(sum-area)>.5){\r\n   return fail(\r\n    \"The combined room area (\"+\r\n    fmt(sum)+\" m\u00b2) must match the total \"+\r\n    \"heated area (\"+fmt(area)+\" m\u00b2).\"\r\n   );\r\n  }\r\n\r\n }else{\r\n  rooms=makeAutoRooms(area,count);\r\n }\r\n\r\n error.style.display=\"none\";\r\n\r\n let totalWatts=0;\r\n let radiatorCount=0;\r\n let sectionCount=0;\r\n let panelItems=[];\r\n let sectionItems=[];\r\n let roomReport=[];\r\n\r\n const floorRatio=floor\/area;\r\n\r\n rooms.forEach(r=>{\r\n  const insulation=r.insulation===\"same\"?\r\n   ins:r.insulation;\r\n\r\n  const watts=loadFor(\r\n   r.area,insulation,height,climate,object\r\n  );\r\n\r\n  totalWatts+=watts;\r\n\r\n  const radWatts=watts*(1-floorRatio);\r\n\r\n  if(radWatts<=0){\r\n   roomReport.push({\r\n    name:r.name,\r\n    area:r.area,\r\n    watts,\r\n    radWatts:0,\r\n    quantity:0\r\n   });\r\n   return;\r\n  }\r\n\r\n  let qty=r.count===\"auto\"?\r\n   Math.max(1,Math.ceil(radWatts\/1700)):\r\n   Number(r.count);\r\n\r\n  qty=Math.max(1,Math.min(4,qty));\r\n\r\n  if(radType===\"panel\"){\r\n   qty=Math.max(\r\n    qty,\r\n    Math.ceil(radWatts\/2200)\r\n   );\r\n\r\n   const per=radWatts\/qty;\r\n   const panel=choosePanel(per);\r\n\r\n   panelItems.push({\r\n    name:r.name+\" \u2014 COPA T22 (\"+\r\n     panel.label+\")\",\r\n    qty,\r\n    watts:panel.watts,\r\n    price:panel.price\r\n   });\r\n\r\n   radiatorCount+=qty;\r\n\r\n   roomReport.push({\r\n    name:r.name,\r\n    area:r.area,\r\n    watts,\r\n    radWatts,\r\n    quantity:qty,\r\n    detail:panel.label\r\n   });\r\n\r\n  }else{\r\n   const sections=Math.max(\r\n    qty*4,\r\n    Math.ceil(radWatts\/PRICE.section.watts)\r\n   );\r\n\r\n   const groups=Math.max(\r\n    qty,\r\n    Math.ceil(sections\/14)\r\n   );\r\n\r\n   sectionCount+=sections;\r\n   radiatorCount+=groups;\r\n\r\n   sectionItems.push({\r\n    name:r.name+\" \u2014 Global VOX EXTRA 500\",\r\n    qty:sections,\r\n    groups,\r\n    price:PRICE.section.price\r\n   });\r\n\r\n   roomReport.push({\r\n    name:r.name,\r\n    area:r.area,\r\n    watts,\r\n    radWatts,\r\n    quantity:groups,\r\n    sections\r\n   });\r\n  }\r\n });\r\n\r\n const loadKw=totalWatts\/1000;\r\n const boilerSelection=val(\"dh-boiler\");\r\n\r\n let boiler=null;\r\n\r\n if(boilerSelection===\"auto\"){\r\n  boiler=chooseBoiler(loadKw,hotWater);\r\n }else if(boilerSelection!==\"none\"){\r\n  boiler=BOILERS[boilerSelection];\r\n }\r\n\r\n const boilerItems=[];\r\n\r\n if(boiler){\r\n  boilerItems.push(\r\n   line(\r\n    boiler.name,\r\n    1,\r\n    \"unit\",\r\n    boiler.price,\r\n    \"catalog\"\r\n   )\r\n  );\r\n }\r\n\r\n const radItems=[];\r\n\r\n if(radType===\"panel\"){\r\n  panelItems.forEach(p=>{\r\n   radItems.push(\r\n    line(\r\n     p.name,\r\n     p.qty,\r\n     \"units\",\r\n     p.price*quality,\r\n     \"estimate\"\r\n    )\r\n   );\r\n  });\r\n\r\n }else{\r\n  sectionItems.forEach(p=>{\r\n   radItems.push(\r\n    line(\r\n     p.name,\r\n     p.qty,\r\n     \"sections\",\r\n     p.price,\r\n     \"catalog\"\r\n    )\r\n   );\r\n  });\r\n }\r\n\r\n radItems.push(\r\n  line(\r\n   \"Radiator Mounting Brackets\",\r\n   radiatorCount,\r\n   \"sets\",\r\n   PRICE.radiatorBracket*quality\r\n  )\r\n );\r\n\r\n radItems.push(\r\n  line(\r\n   \"Radiator Valve Sets\",\r\n   radiatorCount,\r\n   \"sets\",\r\n   PRICE.valveSet*quality\r\n  )\r\n );\r\n\r\n radItems.push(\r\n  line(\r\n   \"Bathroom Towel Radiators\",\r\n   bath,\r\n   \"units\",\r\n   PRICE.towel*quality,\r\n   \"estimate\"\r\n  )\r\n );\r\n\r\n const pipeLength=ceil(\r\n  area*(layout===\"collector\"?1.75:1.35)+\r\n  radiatorCount*2+\r\n  extraPipe,\r\n  1\r\n );\r\n\r\n const fittingCount=ceil(\r\n  radiatorCount*\r\n   (layout===\"collector\"?4:5)+\r\n  pipeLength\/8,\r\n  1\r\n );\r\n\r\n const pipeNames={\r\n  multilayer:\"Multilayer\",\r\n  pex:\"PEX\",\r\n  ppr:\"PPR\"\r\n };\r\n\r\n const pipeItems=[\r\n  line(\r\n   \"Heating Pipes \u2014 \"+pipeNames[pipeType],\r\n   pipeLength,\r\n   \"m\",\r\n   PRICE.pipe[pipeType]*quality\r\n  ),\r\n\r\n  line(\r\n   \"Pipe Fittings\",\r\n   fittingCount,\r\n   \"units\",\r\n   PRICE.fitting[pipeType]*quality\r\n  ),\r\n\r\n  line(\r\n   \"Pipe Thermal Insulation\",\r\n   ceil(pipeLength*.55),\r\n   \"m\",\r\n   PRICE.pipeInsulation*quality\r\n  ),\r\n\r\n  line(\r\n   \"Pipe Fixing Clips\",\r\n   ceil(pipeLength\/1.5),\r\n   \"units\",\r\n   PRICE.pipeFixings*quality\r\n  )\r\n ];\r\n\r\n const collectorPorts=\r\n  layout===\"collector\"?radiatorCount:0;\r\n\r\n const collectorItems=[\r\n  line(\r\n   \"Manifold Outlets\",\r\n   collectorPorts,\r\n   \"circuits\",\r\n   PRICE.collectorPort*quality\r\n  ),\r\n\r\n  line(\r\n   \"Manifold Cabinet\",\r\n   collectorPorts?\r\n    Math.max(1,Math.ceil(collectorPorts\/12)):0,\r\n   \"units\",\r\n   PRICE.collectorBox*quality\r\n  ),\r\n\r\n  line(\r\n   \"Manifold Accessories\",\r\n   collectorPorts?1:0,\r\n   \"set\",\r\n   PRICE.manifoldAccessories*quality\r\n  )\r\n ];\r\n\r\n const floorLoops=floor>0?\r\n  Math.max(1,Math.ceil(floor\/15)):0;\r\n\r\n const floorPipeLength=floor>0?\r\n  ceil(floor*6.5,1):0;\r\n\r\n const floorItems=[\r\n  line(\r\n   \"Underfloor Heating Pipes\",\r\n   floorPipeLength,\r\n   \"m\",\r\n   PRICE.floorPipe*quality\r\n  ),\r\n\r\n  line(\r\n   \"Underfloor Thermal Insulation\",\r\n   floor,\r\n   \"m\u00b2\",\r\n   PRICE.floorInsulation*quality\r\n  ),\r\n\r\n  line(\r\n   \"Pipe Fixings and Accessories\",\r\n   floor,\r\n   \"m\u00b2\",\r\n   PRICE.floorFixings*quality\r\n  ),\r\n\r\n  line(\r\n   \"Underfloor Manifold Circuits\",\r\n   floorLoops,\r\n   \"circuits\",\r\n   PRICE.collectorPort*quality\r\n  ),\r\n\r\n  line(\r\n   \"Underfloor Heating Control Accessories\",\r\n   floorLoops,\r\n   \"circuits\",\r\n   PRICE.floorControls*quality\r\n  )\r\n ];\r\n\r\n const extraItems=[\r\n  line(\r\n   \"Room Thermostat\",\r\n   thermostats,\r\n   \"units\",\r\n   PRICE.thermostat,\r\n   \"catalog-reference\"\r\n  ),\r\n\r\n  line(\r\n   \"System Filter\",\r\n   boiler?1:0,\r\n   \"unit\",\r\n   PRICE.filter*quality\r\n  ),\r\n\r\n  line(\r\n   \"Safety Valves and Fittings\",\r\n   boiler?1:0,\r\n   \"set\",\r\n   PRICE.safety*quality\r\n  ),\r\n\r\n  line(\r\n   \"Boiler Connection Materials\",\r\n   boiler?1:0,\r\n   \"set\",\r\n   PRICE.boilerConnection*quality\r\n  ),\r\n\r\n  line(\r\n   \"Additional Circulation Pump\",\r\n   extraPump?1:0,\r\n   \"unit\",\r\n   PRICE.pump*quality\r\n  )\r\n ];\r\n\r\n const groups=[\r\n  group(\"\ud83d\udd25 Heating Boiler\",boilerItems),\r\n  group(\"\ud83c\udf21\ufe0f Radiators\",radItems),\r\n  group(\"\ud83d\udd27 Heating Pipes and Fittings\",pipeItems),\r\n  group(\"\u2699\ufe0f Manifolds\",collectorItems),\r\n  group(\"\ud83c\udfe0 Underfloor Heating\",floorItems),\r\n  group(\"\ud83d\udee0\ufe0f Additional Components\",extraItems)\r\n ];\r\n\r\n const subtotal=groups.reduce(\r\n  (s,g)=>s+g.total,0\r\n );\r\n\r\n const reserveCost=round(subtotal*reserve);\r\n const total=round(subtotal+reserveCost);\r\n\r\n const categoryTotal=i=>groups[i].total;\r\n\r\n const radTotal=categoryTotal(1);\r\n\r\n const pipeTotal=\r\n  categoryTotal(2)+categoryTotal(3);\r\n\r\n const otherTotal=\r\n  categoryTotal(4)+\r\n  categoryTotal(5)+\r\n  reserveCost;\r\n\r\n last={\r\n  date:new Date().toLocaleDateString(\"en-US\"),\r\n  area,\r\n  height,\r\n  object,\r\n  ins,\r\n  climate,\r\n  radType,\r\n  pipeType,\r\n  layout,\r\n  hotWater,\r\n  quality:val(\"dh-budget\"),\r\n  loadKw,\r\n  boiler,\r\n  radiatorCount,\r\n  sectionCount,\r\n  pipeLength,\r\n  floor,\r\n  floorLoops,\r\n  rooms:roomReport,\r\n  groups,\r\n  subtotal,\r\n  reserveCost,\r\n  total\r\n };\r\n\r\n set(\"dh-load\",fmt(loadKw)+\" kW\");\r\n\r\n set(\r\n  \"dh-selected-boiler\",\r\n  boiler?boiler.name:\"Not Selected\"\r\n );\r\n\r\n set(\r\n  \"dh-radiators\",\r\n  radType===\"section\"?\r\n   radiatorCount+\" radiators \/ \"+\r\n   sectionCount+\" sections\":\r\n   radiatorCount+\" units\"\r\n );\r\n\r\n set(\r\n  \"dh-pipe-length\",\r\n  pipeLength+\" m\"\r\n );\r\n\r\n const boilerWarning=\r\n  boiler&&boiler.capacity<loadKw*1.15?\r\n   \" The selected boiler may not have \"+\r\n   \"sufficient estimated heating capacity.\":\r\n   \"\";\r\n\r\n set(\r\n  \"dh-technical-note\",\r\n  \"This estimate is based on \"+\r\n  fmt(area)+\" m\u00b2 of heated area \"+\r\n  \"and an approximate heat demand of \"+\r\n  fmt(loadKw)+\" kW.\"+\r\n  boilerWarning+\r\n  \" Before selecting a boiler, verify \"+\r\n  \"its actual heating output, domestic \"+\r\n  \"hot water capacity, and manufacturer \"+\r\n  \"specifications.\"\r\n );\r\n\r\n const results=$(\"dh-results\");\r\n results.replaceChildren();\r\n\r\n groups.forEach(g=>{\r\n  if(!g.items.length)return;\r\n\r\n  const card=document.createElement(\"div\");\r\n  card.className=\"result-card\";\r\n\r\n  const head=document.createElement(\"div\");\r\n  head.className=\"rhead\";\r\n\r\n  const h=document.createElement(\"h3\");\r\n  h.textContent=g.title;\r\n  head.appendChild(h);\r\n\r\n  const body=document.createElement(\"div\");\r\n  body.className=\"rbody\";\r\n\r\n  g.items.forEach(item=>{\r\n   const row=document.createElement(\"div\");\r\n   row.className=\"item-row\";\r\n\r\n   const left=document.createElement(\"div\");\r\n\r\n   const name=document.createElement(\"span\");\r\n   name.className=\"rname\";\r\n   name.textContent=item.name;\r\n\r\n   const meta=document.createElement(\"span\");\r\n   meta.className=\"rmeta\";\r\n\r\n   const sourceLabel=\r\n    item.source===\"catalog\"?\r\n     \"Catalog-listed price\":\r\n    item.source===\"catalog-reference\"?\r\n     \"Indicative catalog price\":\r\n     \"Estimated price\";\r\n\r\n   meta.textContent=\r\n    fmt(item.qty)+\" \"+item.unit+\r\n    \" \u00d7 \"+money(item.price)+\r\n    \" \u00b7 \"+sourceLabel;\r\n\r\n   left.append(name,meta);\r\n\r\n   const right=document.createElement(\"strong\");\r\n   right.className=\"rval\";\r\n   right.textContent=money(item.total);\r\n\r\n   row.append(left,right);\r\n   body.appendChild(row);\r\n  });\r\n\r\n  const totalEl=document.createElement(\"div\");\r\n  totalEl.className=\"ctotal\";\r\n  totalEl.textContent=\r\n   \"Subtotal: \"+money(g.total);\r\n\r\n  body.appendChild(totalEl);\r\n\r\n  card.append(head,body);\r\n  results.appendChild(card);\r\n });\r\n\r\n if(reserveCost>0){\r\n  const card=document.createElement(\"div\");\r\n  card.className=\"result-card\";\r\n\r\n  card.innerHTML=\r\n   '<div class=\"rhead\">'+\r\n   '<h3>\ud83d\udce6 Material Contingency<\/h3>'+\r\n   '<\/div>'+\r\n   '<div class=\"rbody\">'+\r\n   '<div class=\"ctotal\">'+\r\n   money(reserveCost)+\r\n   '<\/div><\/div>';\r\n\r\n  results.appendChild(card);\r\n }\r\n\r\n set(\r\n  \"dh-s-boiler\",\r\n  money(categoryTotal(0))\r\n );\r\n\r\n set(\r\n  \"dh-s-radiator\",\r\n  money(radTotal)\r\n );\r\n\r\n set(\r\n  \"dh-s-pipes\",\r\n  money(pipeTotal)\r\n );\r\n\r\n set(\r\n  \"dh-s-other\",\r\n  money(otherTotal)\r\n );\r\n\r\n set(\"dh-total\",money(total));\r\n\r\n $(\"dh-output\").classList.add(\"show\");\r\n\r\n setTimeout(()=>{\r\n  $(\"dh-output\").scrollIntoView({\r\n   behavior:\"smooth\",\r\n   block:\"start\"\r\n  });\r\n },80);\r\n\r\n return true;\r\n}\r\n\r\n\/* MEMBERSHIP ACCESS *\/\r\n\r\nconst FREE=\"dv_heating_free_used_v1\";\r\n\r\nfunction used(){\r\n try{\r\n  return localStorage.getItem(FREE)===\"1\";\r\n }catch(e){\r\n  return false;\r\n }\r\n}\r\n\r\nfunction mark(){\r\n try{\r\n  localStorage.setItem(FREE,\"1\");\r\n }catch(e){}\r\n}\r\n\r\nfunction logged(){\r\n if(\r\n  window.cpdf_auth&&\r\n  typeof window.cpdf_auth.isLoggedIn!==\"undefined\"\r\n ){\r\n  const v=window.cpdf_auth.isLoggedIn;\r\n\r\n  return v===true||\r\n   v===1||\r\n   v===\"1\"||\r\n   v===\"true\";\r\n }\r\n\r\n return document.body.classList.contains(\r\n  \"logged-in\"\r\n );\r\n}\r\n\r\nfunction register(){\r\n if(typeof window.openAuthModal===\"function\"){\r\n  window.openAuthModal(\r\n   \"register\",\r\n   \"\/en\/calculators\/\"\r\n  );\r\n  return;\r\n }\r\n\r\n const btn=document.querySelector(\r\n  '.cpdf-auth[data-auth-action=\"register\"]'\r\n );\r\n\r\n if(btn){\r\n  btn.setAttribute(\r\n   \"data-redirect\",\r\n   \"\/en\/calculators\/\"\r\n  );\r\n  btn.click();\r\n  return;\r\n }\r\n\r\n \/*\r\n  No confirmed English account URL is\r\n  available here. Use the existing\r\n  site's account endpoint as fallback.\r\n *\/\r\n location.href=\"\/my-account\/\";\r\n}\r\n\r\nfunction packageModal(){\r\n if(\r\n  window.jQuery&&\r\n  window.jQuery(\"#membership-modal\").length\r\n ){\r\n  window.jQuery(\"#membership-modal\").css(\r\n   \"display\",\"block\"\r\n  );\r\n  return;\r\n }\r\n\r\n const btn=document.querySelector(\r\n  \"#membership-purchase-btn,\"+\r\n  \".membership-purchase-btn,\"+\r\n  \"[data-membership-modal]\"\r\n );\r\n\r\n if(btn){\r\n  btn.click();\r\n  return;\r\n }\r\n\r\n \/*\r\n  Do not invent an English packages URL.\r\n  The existing membership interface\r\n  should supply the correct destination.\r\n *\/\r\n alert(\r\n  \"Please select a membership package \"+\r\n  \"to continue using the calculator.\"\r\n );\r\n}\r\n\r\nasync function access(){\r\n if(!used()){\r\n  return {\r\n   allowed:true,\r\n   first:true\r\n  };\r\n }\r\n\r\n if(!logged()){\r\n  register();\r\n\r\n  return {\r\n   allowed:false,\r\n   first:false\r\n  };\r\n }\r\n\r\n if(\r\n  !window.cpdf_auth?.ajaxurl||\r\n  !window.jQuery\r\n ){\r\n  packageModal();\r\n\r\n  return {\r\n   allowed:false,\r\n   first:false\r\n  };\r\n }\r\n\r\n try{\r\n  const r=await window.jQuery.ajax({\r\n   url:window.cpdf_auth.ajaxurl,\r\n   type:\"POST\",\r\n   data:{\r\n    action:\"cpdf_check_membership\"\r\n   },\r\n   timeout:20000\r\n  });\r\n\r\n  if(\r\n   r?.success&&\r\n   r?.data?.can_calculate\r\n  ){\r\n   return {\r\n    allowed:true,\r\n    first:false\r\n   };\r\n  }\r\n\r\n }catch(e){}\r\n\r\n packageModal();\r\n\r\n return {\r\n  allowed:false,\r\n  first:false\r\n };\r\n}\r\n\r\n$(\"dh-calc\").addEventListener(\r\n \"click\",\r\n async function(e){\r\n  e.preventDefault();\r\n  e.stopPropagation();\r\n\r\n  if(busy)return;\r\n\r\n  busy=true;\r\n\r\n  const old=this.textContent;\r\n\r\n  this.disabled=true;\r\n  this.textContent=\"Checking access...\";\r\n\r\n  try{\r\n   const a=await access();\r\n\r\n   if(!a.allowed)return;\r\n\r\n   if(calculate()&&a.first){\r\n    mark();\r\n   }\r\n\r\n  }catch(e){\r\n   console.error(e);\r\n\r\n   $(\"dh-error\").textContent=\r\n    \"Unable to complete the calculation.\";\r\n\r\n   $(\"dh-error\").style.display=\"block\";\r\n\r\n  }finally{\r\n   this.disabled=false;\r\n   this.textContent=old;\r\n   busy=false;\r\n  }\r\n }\r\n);\r\n\r\n\/* CSV EXPORT *\/\r\n\r\n$(\"dh-csv\").addEventListener(\"click\",()=>{\r\n if(!last)return;\r\n\r\n const rows=[\r\n  [\"Datvale.ge \u2014 Heating Material Cost Estimate\"],\r\n  [\"Date\",last.date],\r\n  [\"Heated Area\",last.area+\" m\u00b2\"],\r\n  [\"Estimated Heat Demand\",fmt(last.loadKw)+\" kW\"],\r\n  [],\r\n  [\r\n   \"Material\",\r\n   \"Quantity\",\r\n   \"Unit\",\r\n   \"Unit Price (GEL)\",\r\n   \"Total (GEL)\"\r\n  ]\r\n ];\r\n\r\n last.groups.forEach(g=>{\r\n  rows.push([g.title]);\r\n\r\n  g.items.forEach(x=>{\r\n   rows.push([\r\n    x.name,\r\n    x.qty,\r\n    x.unit,\r\n    x.price,\r\n    x.total\r\n   ]);\r\n  });\r\n\r\n  rows.push([\r\n   \"Subtotal\",\r\n   \"\",\r\n   \"\",\r\n   \"\",\r\n   g.total\r\n  ]);\r\n\r\n  rows.push([]);\r\n });\r\n\r\n rows.push([\r\n  \"Material Contingency\",\r\n  \"\",\r\n  \"\",\r\n  \"\",\r\n  last.reserveCost\r\n ]);\r\n\r\n rows.push([\r\n  \"Grand Total\",\r\n  \"\",\r\n  \"\",\r\n  \"\",\r\n  last.total\r\n ]);\r\n\r\n rows.push([\r\n  \"Installation and labor costs are excluded.\"\r\n ]);\r\n\r\n rows.push([\r\n  \"All prices are indicative estimates.\"\r\n ]);\r\n\r\n const csv=\"\\uFEFF\"+rows.map(r=>\r\n  r.map(v=>\r\n   '\"'+String(v??\"\")\r\n    .replace(\/\"\/g,'\"\"')+'\"'\r\n  ).join(\";\")\r\n ).join(\"\\r\\n\");\r\n\r\n const blob=new Blob([csv],{\r\n  type:\"text\/csv;charset=utf-8;\"\r\n });\r\n\r\n const url=URL.createObjectURL(blob);\r\n\r\n const a=document.createElement(\"a\");\r\n a.href=url;\r\n a.download=\"datvale-heating-materials.csv\";\r\n\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n\r\n setTimeout(()=>{\r\n  URL.revokeObjectURL(url);\r\n },1000);\r\n});\r\n\r\n\/* PRINT *\/\r\n\r\n$(\"dh-print\").addEventListener(\"click\",()=>{\r\n if(last)window.print();\r\n});\r\n\r\n\/* PDF GENERATION *\/\r\n\r\nfunction canvasText(text,opt={}){\r\n const o=Object.assign({\r\n  w:1200,\r\n  p:18,\r\n  fs:25,\r\n  fw:700,\r\n  c:\"#173558\",\r\n  bg:null,\r\n  align:\"left\"\r\n },opt);\r\n\r\n const canvas=document.createElement(\"canvas\");\r\n const ctx=canvas.getContext(\"2d\");\r\n\r\n ctx.font=o.fw+\" \"+o.fs+\r\n  'px \"Segoe UI\",Arial,sans-serif';\r\n\r\n const words=String(text).split(\/\\s+\/);\r\n const lines=[];\r\n let line=\"\";\r\n\r\n for(const word of words){\r\n  const candidate=line?\r\n   line+\" \"+word:word;\r\n\r\n  if(\r\n   ctx.measureText(candidate).width>\r\n   o.w-o.p*2&&line\r\n  ){\r\n   lines.push(line);\r\n   line=word;\r\n  }else{\r\n   line=candidate;\r\n  }\r\n }\r\n\r\n if(line)lines.push(line);\r\n\r\n canvas.width=o.w;\r\n\r\n canvas.height=Math.max(\r\n  70,\r\n  lines.length*o.fs*1.4+o.p*2\r\n );\r\n\r\n const g=canvas.getContext(\"2d\");\r\n\r\n g.font=o.fw+\" \"+o.fs+\r\n  'px \"Segoe UI\",Arial,sans-serif';\r\n\r\n g.textBaseline=\"top\";\r\n g.textAlign=o.align;\r\n\r\n if(o.bg){\r\n  g.fillStyle=o.bg;\r\n  g.fillRect(\r\n   0,0,canvas.width,canvas.height\r\n  );\r\n }\r\n\r\n g.fillStyle=o.c;\r\n\r\n const x=\r\n  o.align===\"center\"?\r\n   canvas.width\/2:\r\n  o.align===\"right\"?\r\n   canvas.width-o.p:\r\n   o.p;\r\n\r\n lines.forEach((v,i)=>{\r\n  g.fillText(\r\n   v,\r\n   x,\r\n   o.p+i*o.fs*1.4\r\n  );\r\n });\r\n\r\n return canvas.toDataURL(\"image\/png\");\r\n}\r\n\r\n$(\"dh-pdf\").addEventListener(\r\n \"click\",\r\n async function(){\r\n  if(!last)return;\r\n\r\n  const J=window.jspdf?.jsPDF;\r\n\r\n  if(!J){\r\n   alert(\r\n    \"The PDF generator could not be loaded.\"\r\n   );\r\n   return;\r\n  }\r\n\r\n  const old=this.textContent;\r\n\r\n  this.disabled=true;\r\n  this.textContent=\"Generating PDF...\";\r\n\r\n  try{\r\n   const pdf=new J({\r\n    unit:\"mm\",\r\n    format:\"a4\",\r\n    compress:true\r\n   });\r\n\r\n   const pw=pdf.internal.pageSize.getWidth();\r\n   const ph=pdf.internal.pageSize.getHeight();\r\n\r\n   const margin=14;\r\n   const width=pw-margin*2;\r\n\r\n   let y=14;\r\n\r\n   function add(text,opt={}){\r\n    const img=canvasText(text,opt);\r\n    const props=pdf.getImageProperties(img);\r\n    const h=width*props.height\/props.width;\r\n\r\n    if(y+h>ph-14){\r\n     pdf.addPage();\r\n     y=14;\r\n    }\r\n\r\n    pdf.addImage(\r\n     img,\r\n     \"PNG\",\r\n     margin,\r\n     y,\r\n     width,\r\n     h,\r\n     undefined,\r\n     \"FAST\"\r\n    );\r\n\r\n    y+=h+2;\r\n   }\r\n\r\n   add(\"Heating Material Cost Estimate\",{\r\n    fs:35,\r\n    fw:900,\r\n    c:\"#0b3a78\",\r\n    align:\"center\"\r\n   });\r\n\r\n   add(\"Datvale.ge\",{\r\n    fs:23,\r\n    align:\"center\",\r\n    c:\"#526b84\"\r\n   });\r\n\r\n   add(\"Date: \"+last.date,{\r\n    fs:18,\r\n    align:\"center\"\r\n   });\r\n\r\n   add(\r\n    \"Heated Area: \"+last.area+\r\n    \" m\u00b2 | Ceiling Height: \"+\r\n    last.height+\r\n    \" m | Heat Demand: \"+\r\n    fmt(last.loadKw)+\" kW\",{\r\n     fs:20,\r\n     bg:\"#eef5fc\"\r\n    }\r\n   );\r\n\r\n   add(\r\n    \"Heating Boiler: \"+\r\n    (last.boiler?\r\n     last.boiler.name:\r\n     \"Not Selected\"),{\r\n     fs:21\r\n    }\r\n   );\r\n\r\n   add(\r\n    \"Radiators: \"+\r\n    last.radiatorCount+\r\n    \" units | Heating Pipes: \"+\r\n    last.pipeLength+\" m\",{\r\n     fs:21\r\n    }\r\n   );\r\n\r\n   last.groups.forEach(g=>{\r\n    if(!g.items.length)return;\r\n\r\n    add(g.title,{\r\n     fs:28,\r\n     fw:900,\r\n     c:\"#0b3a78\",\r\n     bg:\"#eef5fc\"\r\n    });\r\n\r\n    g.items.forEach(item=>{\r\n     add(\r\n      item.name+\" \u2014 \"+\r\n      fmt(item.qty)+\" \"+\r\n      item.unit+\" \u00d7 \"+\r\n      money(item.price)+\r\n      \" = \"+money(item.total),{\r\n       fs:19,\r\n       fw:600\r\n      }\r\n     );\r\n    });\r\n\r\n    add(\r\n     \"Subtotal: \"+money(g.total),{\r\n      fs:22,\r\n      fw:900\r\n     }\r\n    );\r\n   });\r\n\r\n   if(last.reserveCost){\r\n    add(\r\n     \"Material Contingency: \"+\r\n     money(last.reserveCost),{\r\n      fs:21\r\n     }\r\n    );\r\n   }\r\n\r\n   add(\r\n    \"Total Materials: \"+\r\n    money(last.total),{\r\n     fs:39,\r\n     fw:900,\r\n     c:\"#fff\",\r\n     bg:\"#0b3a78\",\r\n     align:\"center\"\r\n    }\r\n   );\r\n\r\n   add(\r\n    \"Installation and labor costs are excluded.\",{\r\n     fs:21,\r\n     fw:900\r\n    }\r\n   );\r\n\r\n   add(\r\n    \"Prices and quantities are indicative estimates. \"+\r\n    \"Final product selection requires technical \"+\r\n    \"design and verification of current prices.\",{\r\n     fs:17,\r\n     fw:600,\r\n     c:\"#526b84\"\r\n    }\r\n   );\r\n\r\n   pdf.save(\r\n    \"datvale-heating-materials.pdf\"\r\n   );\r\n\r\n  }catch(e){\r\n   console.error(e);\r\n\r\n   alert(\r\n    \"Unable to generate the PDF.\"\r\n   );\r\n\r\n  }finally{\r\n   this.disabled=false;\r\n   this.textContent=old;\r\n  }\r\n }\r\n);\r\n\r\n\/* GoSMS CALLBACK INTEGRATION *\/\r\n\r\nconst callbox=$(\"dh-callbox\");\r\nconst callrow=$(\"dh-callrow\");\r\nconst callphone=$(\"dh-phone\");\r\nconst callbutton=$(\"dh-call\");\r\nconst callstatus=$(\"dh-callstatus\");\r\n\r\nlet callConfig={\r\n enabled:false,\r\n isLoggedIn:false,\r\n hasSavedPhone:false\r\n};\r\n\r\nfunction ajaxUrl(){\r\n return window.cpdf_auth?.ajaxurl||\r\n  \"\/wp-admin\/admin-ajax.php\";\r\n}\r\n\r\nfunction status(message,success){\r\n callstatus.textContent=message;\r\n\r\n callstatus.className=\r\n  \"callstatus \"+(success?\"ok\":\"bad\");\r\n}\r\n\r\nasync function loadCallConfig(){\r\n try{\r\n  const r=await fetch(\r\n   ajaxUrl()+\r\n   \"?action=gosms_call_request_config\"+\r\n   \"&calculator=heating&_=\"+Date.now(),{\r\n    credentials:\"same-origin\",\r\n    cache:\"no-store\"\r\n   }\r\n  );\r\n\r\n  const json=await r.json();\r\n\r\n  if(!json?.success||!json.data)return;\r\n\r\n  callConfig={\r\n   enabled:json.data.enabled===true,\r\n   isLoggedIn:\r\n    json.data.is_logged_in===true,\r\n   hasSavedPhone:\r\n    json.data.has_saved_phone===true\r\n  };\r\n\r\n  callbox.style.display=\r\n   callConfig.enabled?\"block\":\"none\";\r\n\r\n  callrow.classList.toggle(\r\n   \"saved\",\r\n   callConfig.isLoggedIn&&\r\n   callConfig.hasSavedPhone\r\n  );\r\n\r\n }catch(e){\r\n  callbox.style.display=\"none\";\r\n }\r\n}\r\n\r\ncallbutton.addEventListener(\r\n \"click\",\r\n async()=>{\r\n  if(!callConfig.enabled)return;\r\n\r\n  const saved=\r\n   callConfig.isLoggedIn&&\r\n   callConfig.hasSavedPhone;\r\n\r\n  const phone=saved?\r\n   \"\":callphone.value.trim();\r\n\r\n  if(\r\n   !saved&&\r\n   !\/^(\\+?995)?5\\d{8}$\/.test(\r\n    phone.replace(\/\\s|-\/g,\"\")\r\n   )\r\n  ){\r\n   status(\r\n    \"Please enter a valid Georgian mobile \"+\r\n    \"number, e.g. 599123456.\",\r\n    false\r\n   );\r\n   return;\r\n  }\r\n\r\n  const old=callbutton.textContent;\r\n\r\n  callbutton.disabled=true;\r\n  callbutton.textContent=\"Sending...\";\r\n\r\n  try{\r\n   const body=new URLSearchParams();\r\n\r\n   body.set(\r\n    \"action\",\r\n    \"gosms_request_call\"\r\n   );\r\n\r\n   body.set(\r\n    \"calculator\",\r\n    \"heating\"\r\n   );\r\n\r\n   if(phone){\r\n    body.set(\"phone\",phone);\r\n   }\r\n\r\n   const r=await fetch(ajaxUrl(),{\r\n    method:\"POST\",\r\n    credentials:\"same-origin\",\r\n    headers:{\r\n     \"Content-Type\":\r\n      \"application\/x-www-form-urlencoded; charset=UTF-8\"\r\n    },\r\n    body:body.toString()\r\n   });\r\n\r\n   const json=await r.json();\r\n\r\n   if(json?.success){\r\n    status(\r\n     json.data?.message||\r\n     \"Your request has been received.\",\r\n     true\r\n    );\r\n\r\n   }else{\r\n    if(json?.data?.disabled){\r\n     callbox.style.display=\"none\";\r\n\r\n    }else if(json?.data?.need_phone){\r\n     callConfig.hasSavedPhone=false;\r\n     callrow.classList.remove(\"saved\");\r\n\r\n     status(\r\n      json.data?.message||\r\n      \"Please enter your phone number.\",\r\n      false\r\n     );\r\n\r\n    }else{\r\n     status(\r\n      json?.data?.message||\r\n      \"Unable to submit your request.\",\r\n      false\r\n     );\r\n    }\r\n   }\r\n\r\n  }catch(e){\r\n   status(\r\n    \"Connection error. Please try again.\",\r\n    false\r\n   );\r\n\r\n  }finally{\r\n   callbutton.disabled=false;\r\n   callbutton.textContent=old;\r\n  }\r\n }\r\n);\r\n\r\n\/* COMPLETION SMS INTEGRATION *\/\r\n\r\nasync function completedSms(){\r\n try{\r\n  const body=new URLSearchParams();\r\n\r\n  body.set(\r\n   \"action\",\r\n   \"gosms_calculator_completed\"\r\n  );\r\n\r\n  body.set(\r\n   \"calculator\",\r\n   \"heating\"\r\n  );\r\n\r\n  await fetch(ajaxUrl(),{\r\n   method:\"POST\",\r\n   credentials:\"same-origin\",\r\n   headers:{\r\n    \"Content-Type\":\r\n     \"application\/x-www-form-urlencoded; charset=UTF-8\"\r\n   },\r\n   body:body.toString()\r\n  });\r\n\r\n }catch(e){}\r\n}\r\n\r\n\/*\r\n Completion SMS remains inactive until\r\n the GoSMS plugin supports and verifies\r\n the \"heating\" calculator identifier.\r\n*\/\r\n\r\nloadCallConfig();\r\n\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8a595c7 e-flex e-con-boxed e-con e-parent\" data-id=\"8a595c7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b00db09 elementor-widget elementor-widget-html\" data-id=\"b00db09\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n<section class=\"dv-heat-guide\" lang=\"en-US\" aria-label=\"Central heating materials and prices\">\r\n\r\n<style>\r\n.dv-heat-guide {\r\n  --dv-blue:#0b3a78;\r\n  --dv-blue2:#1765ad;\r\n  --dv-text:#29384a;\r\n  --dv-muted:#607086;\r\n  --dv-border:#e1e8f1;\r\n  --dv-soft:#f5f8fc;\r\n  width:100%;\r\n  max-width:1160px;\r\n  margin:35px auto;\r\n  padding:0 20px;\r\n  box-sizing:border-box;\r\n  color:var(--dv-text);\r\n  font-family:inherit;\r\n  font-size:16px;\r\n  line-height:1.85;\r\n}\r\n\r\n.dv-heat-guide *,\r\n.dv-heat-guide *::before,\r\n.dv-heat-guide *::after {\r\n  box-sizing:border-box;\r\n}\r\n\r\n.dv-heat-guide h2 {\r\n  color:var(--dv-blue);\r\n  font-size:27px;\r\n  font-weight:750;\r\n  line-height:1.35;\r\n  margin:40px 0 16px;\r\n}\r\n\r\n.dv-heat-guide h3 {\r\n  color:#174675;\r\n  font-size:21px;\r\n  font-weight:700;\r\n  line-height:1.45;\r\n  margin:25px 0 12px;\r\n}\r\n\r\n.dv-heat-guide p {\r\n  margin:0 0 18px;\r\n}\r\n\r\n.dv-heat-guide strong {\r\n  font-weight:700;\r\n}\r\n\r\n.dv-heat-guide ul,\r\n.dv-heat-guide ol {\r\n  padding-left:25px;\r\n  margin:12px 0 23px;\r\n}\r\n\r\n.dv-heat-guide li {\r\n  margin-bottom:9px;\r\n}\r\n\r\n.dv-heat-guide a {\r\n  color:#075da9;\r\n  text-decoration:underline;\r\n  text-underline-offset:3px;\r\n}\r\n\r\n.dv-heat-guide .dv-heat-intro {\r\n  font-size:17px;\r\n  line-height:1.9;\r\n}\r\n\r\n.dv-heat-guide .dv-heat-highlight {\r\n  background:var(--dv-soft);\r\n  border-left:4px solid var(--dv-blue);\r\n  border-radius:12px;\r\n  padding:20px 22px;\r\n  margin:24px 0;\r\n}\r\n\r\n.dv-heat-guide .dv-heat-grid {\r\n  display:grid;\r\n  grid-template-columns:repeat(2,minmax(0,1fr));\r\n  gap:16px;\r\n  margin:22px 0 28px;\r\n}\r\n\r\n.dv-heat-guide .dv-heat-card {\r\n  border:1px solid var(--dv-border);\r\n  background:#fff;\r\n  border-radius:15px;\r\n  padding:20px;\r\n}\r\n\r\n.dv-heat-guide .dv-heat-card h3 {\r\n  font-size:19px;\r\n  margin:0 0 10px;\r\n}\r\n\r\n.dv-heat-guide .dv-heat-card p {\r\n  margin:0;\r\n  color:var(--dv-muted);\r\n}\r\n\r\n.dv-heat-guide .dv-heat-table-wrap {\r\n  overflow-x:auto;\r\n  margin:22px 0 28px;\r\n  border:1px solid var(--dv-border);\r\n  border-radius:13px;\r\n}\r\n\r\n.dv-heat-guide table {\r\n  width:100%;\r\n  border-collapse:collapse;\r\n  min-width:590px;\r\n  font-size:15px;\r\n}\r\n\r\n.dv-heat-guide th {\r\n  background:var(--dv-blue);\r\n  color:#fff;\r\n  padding:14px;\r\n  text-align:left;\r\n  font-weight:700;\r\n}\r\n\r\n.dv-heat-guide td {\r\n  padding:13px 14px;\r\n  border-bottom:1px solid var(--dv-border);\r\n  vertical-align:top;\r\n}\r\n\r\n.dv-heat-guide tr:last-child td {\r\n  border-bottom:0;\r\n}\r\n\r\n.dv-heat-guide tbody tr:nth-child(even) {\r\n  background:#f8fafd;\r\n}\r\n\r\n.dv-heat-guide .dv-heat-faq details {\r\n  border:1px solid var(--dv-border);\r\n  border-radius:12px;\r\n  margin:11px 0;\r\n  background:#fff;\r\n  overflow:hidden;\r\n}\r\n\r\n.dv-heat-guide .dv-heat-faq summary {\r\n  cursor:pointer;\r\n  padding:16px 20px;\r\n  color:var(--dv-blue);\r\n  font-weight:700;\r\n  line-height:1.55;\r\n}\r\n\r\n.dv-heat-guide .dv-heat-faq details p {\r\n  padding:0 20px 18px;\r\n  margin:0;\r\n}\r\n\r\n.dv-heat-guide .dv-heat-ending {\r\n  margin:35px 0 15px;\r\n  padding:25px;\r\n  border-radius:17px;\r\n  background:var(--dv-soft);\r\n  border:1px solid var(--dv-border);\r\n}\r\n\r\n.dv-heat-guide .dv-heat-ending h2 {\r\n  margin-top:0;\r\n}\r\n\r\n@media(max-width:767px) {\r\n  .dv-heat-guide {\r\n    padding:0 15px;\r\n    margin:25px auto;\r\n    font-size:15px;\r\n  }\r\n\r\n  .dv-heat-guide h2 {\r\n    font-size:23px;\r\n    margin-top:32px;\r\n  }\r\n\r\n  .dv-heat-guide h3 {\r\n    font-size:19px;\r\n  }\r\n\r\n  .dv-heat-guide .dv-heat-intro {\r\n    font-size:16px;\r\n  }\r\n\r\n  .dv-heat-guide .dv-heat-grid {\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  .dv-heat-guide .dv-heat-card {\r\n    padding:17px;\r\n  }\r\n\r\n  .dv-heat-guide .dv-heat-highlight,\r\n  .dv-heat-guide .dv-heat-ending {\r\n    padding:18px;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<!-- Introduction -->\r\n\r\n<p class=\"dv-heat-intro\">\r\n<strong>Central heating<\/strong> is one of the most important\r\nelements of comfort in modern apartments, private houses,\r\nand cottages. A properly selected <strong>heating boiler<\/strong>,\r\nradiators, pipes, and other components help ensure even\r\nheat distribution, reliable system operation, and efficient\r\nenergy consumption.\r\n<\/p>\r\n\r\n<p>\r\nIf you are planning to install a heating system or upgrade\r\nan existing one, it is important to understand which\r\nmaterials are required, how their technical specifications\r\ndiffer, and which factors determine their cost.\r\n<\/p>\r\n\r\n<p>\r\nOn Datvale.ge, you can learn about the basic principles\r\nof selecting heating boilers, panel and sectional radiators,\r\nheating pipes, manifolds, and additional components.\r\nYou can also use the heating calculator to estimate\r\npotential expenses before starting your project.\r\n<\/p>\r\n\r\n<p>\r\nOur goal is to help you make informed decisions\r\nand select a heating system that meets your property's\r\nrequirements and budget.\r\n<\/p>\r\n\r\n<h2>Central Heating: What Materials and Equipment Are Required?<\/h2>\r\n\r\n<p>\r\n<strong>Central heating<\/strong> is an integrated system\r\nin which the heat source, piping, distribution equipment,\r\nand radiators work together.\r\n<\/p>\r\n\r\n<p>\r\nSystem efficiency does not depend solely on the quality\r\nof the boiler. Proper component selection, compatibility,\r\nand professional installation are equally important.\r\n<\/p>\r\n\r\n<div class=\"dv-heat-grid\">\r\n\r\n  <div class=\"dv-heat-card\">\r\n    <h3>Heating Boilers<\/h3>\r\n    <p>\r\n      The system's heat source, whose capacity and\r\n      technology must match the building's heating requirements.\r\n    <\/p>\r\n  <\/div>\r\n\r\n  <div class=\"dv-heat-card\">\r\n    <h3>Radiators<\/h3>\r\n    <p>\r\n      Panel and sectional models that distribute\r\n      heat throughout individual rooms.\r\n    <\/p>\r\n  <\/div>\r\n\r\n  <div class=\"dv-heat-card\">\r\n    <h3>Heating Pipes<\/h3>\r\n    <p>\r\n      Piping that carries the heating medium\r\n      from the boiler to the heat emitters.\r\n    <\/p>\r\n  <\/div>\r\n\r\n  <div class=\"dv-heat-card\">\r\n    <h3>Manifolds and Fittings<\/h3>\r\n    <p>\r\n      Distribution and connection components\r\n      that support system control and reliable operation.\r\n    <\/p>\r\n  <\/div>\r\n\r\n<\/div>\r\n\r\n<p>\r\nIn addition to the main equipment, a heating system\r\nmay require a circulation pump, expansion vessel,\r\nsafety group, filters, thermostats, valves,\r\nand other components. Their necessity depends\r\non the selected technical design.\r\n<\/p>\r\n\r\n<h2>Heating Boiler: Types, Capacity, and Selection<\/h2>\r\n\r\n<p>\r\nA <strong>heating boiler<\/strong> is the main component\r\nof a central heating system. Choosing the right boiler\r\naffects energy efficiency, comfort, and operating costs.\r\n<\/p>\r\n\r\n<p>\r\nGas boilers are widely used for residential heating\r\nin Georgia. However, depending on the property's\r\nspecific conditions, another type of heat source\r\nmay also be suitable.\r\n<\/p>\r\n\r\n<h3>Conventional Gas Heating Boiler<\/h3>\r\n\r\n<p>\r\nA conventional gas boiler can be used with radiators\r\nand other compatible heating circuits.\r\nDepending on the model, it may provide space heating\r\nonly or both space heating and domestic hot water.\r\n<\/p>\r\n\r\n<p>\r\nWhen selecting a boiler, consider the manufacturer's\r\ntechnical specifications, operating capacity range,\r\ncontrol features, and availability of maintenance services.\r\n<\/p>\r\n\r\n<h3>Condensing Heating Boiler<\/h3>\r\n\r\n<p>\r\nA condensing boiler recovers additional heat\r\nfrom combustion gases. Under suitable operating\r\nconditions, this technology can improve\r\nfuel efficiency.\r\n<\/p>\r\n\r\n<p>\r\nIts efficiency depends significantly on the heating\r\nsystem's operating temperature. Therefore,\r\nthe technical characteristics of the entire system\r\nshould be considered when choosing a boiler.\r\n<\/p>\r\n\r\n<h3>How Many Kilowatts Should a Heating Boiler Have?<\/h3>\r\n\r\n<p>\r\nThe required boiler capacity cannot be determined\r\naccurately from the floor area of an apartment\r\nor house alone.\r\n<\/p>\r\n\r\n<p>Important factors include:<\/p>\r\n\r\n<ul>\r\n  <li>Total building area and heated floor area<\/li>\r\n  <li>Ceiling height<\/li>\r\n  <li>Wall and roof insulation<\/li>\r\n  <li>Window size and quality<\/li>\r\n  <li>Outdoor climate conditions<\/li>\r\n  <li>Building heat losses<\/li>\r\n  <li>Domestic hot water requirements<\/li>\r\n  <li>Type of radiators or underfloor heating<\/li>\r\n<\/ul>\r\n\r\n<div class=\"dv-heat-highlight\">\r\n<strong>Important:<\/strong>\r\nSelecting an oversized or undersized boiler may negatively\r\naffect system performance and operating costs.\r\nThe final required capacity should be determined\r\nthrough a technical heat-load calculation.\r\n<\/div>\r\n\r\n<h2>Heating Boiler Prices: What Determines the Cost?<\/h2>\r\n\r\n<p>\r\nThe <strong>price of a heating boiler<\/strong> depends\r\non the manufacturer, model, capacity, energy efficiency,\r\ncontrol features, and included equipment.\r\n<\/p>\r\n\r\n<p>\r\nWhen comparing boilers, it is not advisable\r\nto consider only the initial purchase price.\r\nMaintenance conditions, spare parts availability,\r\nand expected operating costs are also important.\r\n<\/p>\r\n\r\n<p>\r\nBefore purchasing a heating boiler, check whether\r\nthe listed price includes the required installation\r\ncomponents, flue system, control devices,\r\nand other accessories.\r\n<\/p>\r\n\r\n<h2>Radiator Prices and Types<\/h2>\r\n\r\n<p>\r\nA radiator is one of the main components\r\nof a heating system. Its purpose is to transfer\r\nheat into a room.\r\n<\/p>\r\n\r\n<p>\r\n<strong>Radiator prices<\/strong> depend on the material,\r\nsize, construction, heat output, manufacturer,\r\nand technical specifications.\r\n<\/p>\r\n\r\n<p>\r\nPanel and sectional radiators are common\r\nin residential properties. They differ in construction,\r\ndimensions, and application requirements.\r\n<\/p>\r\n\r\n<h3>Panel Radiators<\/h3>\r\n\r\n<p>\r\nA <strong>panel radiator<\/strong> is commonly used\r\nin apartments and private houses. Its construction\r\nallows users to choose from models with different\r\ndimensions and heat outputs.\r\n<\/p>\r\n\r\n<p>\r\nPanel radiators vary in height, length,\r\nnumber of panels, and convector elements.\r\n<\/p>\r\n\r\n<p>\r\nWhen selecting a model, consider the room's heat demand,\r\nconnection type, system operating temperature,\r\nand the manufacturer's specified heat output.\r\n<\/p>\r\n\r\n<h3>Sectional Radiators<\/h3>\r\n\r\n<p>\r\nA <strong>sectional radiator<\/strong> consists\r\nof interconnected sections. Some models allow\r\nthe number of sections to be selected,\r\nmaking it easier to adapt the radiator\r\nto a specific room's requirements.\r\n<\/p>\r\n\r\n<p>\r\nSectional radiators may be manufactured\r\nfrom aluminum, bimetal, or other materials.\r\n<\/p>\r\n\r\n<p>\r\nTheir price depends on the material,\r\nnumber of sections, dimensions,\r\nand technical specifications.\r\n<\/p>\r\n\r\n<h3>Aluminum Radiators<\/h3>\r\n\r\n<p>\r\nAluminum radiators are characterized by\r\ntheir relatively low weight and good\r\nthermal conductivity. When using them,\r\nthe quality of the system water and\r\nthe manufacturer's requirements should\r\nbe taken into account.\r\n<\/p>\r\n\r\n<h3>Bimetallic Radiators<\/h3>\r\n\r\n<p>\r\nBimetallic radiators combine different metals.\r\nTheir technical characteristics and operating\r\npressure depend on the specific model.\r\n<\/p>\r\n\r\n<h3>Panel or Sectional Radiator: Which Should You Choose?<\/h3>\r\n\r\n<p>\r\nThe choice should be based on the room's heat demand,\r\nthe heating system's operating conditions,\r\ninterior design, and available budget.\r\n<\/p>\r\n\r\n<div class=\"dv-heat-table-wrap\">\r\n<table>\r\n<thead>\r\n<tr>\r\n  <th>Feature<\/th>\r\n  <th>Panel Radiator<\/th>\r\n  <th>Sectional Radiator<\/th>\r\n<\/tr>\r\n<\/thead>\r\n<tbody>\r\n<tr>\r\n  <td>Construction<\/td>\r\n  <td>Single integrated panel body<\/td>\r\n  <td>Individual interconnected sections<\/td>\r\n<\/tr>\r\n<tr>\r\n  <td>Size Selection<\/td>\r\n  <td>Based on available model dimensions<\/td>\r\n  <td>Based on section count in certain models<\/td>\r\n<\/tr>\r\n<tr>\r\n  <td>Material<\/td>\r\n  <td>Often steel<\/td>\r\n  <td>Aluminum, bimetal, and other materials<\/td>\r\n<\/tr>\r\n<tr>\r\n  <td>Heat Output<\/td>\r\n  <td>Depends on the model and operating temperature<\/td>\r\n  <td>Depends on the sections and operating temperature<\/td>\r\n<\/tr>\r\n<tr>\r\n  <td>Price<\/td>\r\n  <td>Depends on dimensions and manufacturer<\/td>\r\n  <td>Depends on material and number of sections<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\r\n\r\n<h2>Heating Pipes: Types, Applications, and Prices<\/h2>\r\n\r\n<p>\r\n<strong>Heating pipes<\/strong> circulate the heating\r\nmedium throughout the system. Proper pipe selection\r\nis important for reliability and long-term operation.\r\n<\/p>\r\n\r\n<p>\r\nHeating pipe prices depend on the material,\r\ndiameter, technical specifications,\r\nmanufacturer, and required length.\r\n<\/p>\r\n\r\n<h3>Multilayer Pipes<\/h3>\r\n\r\n<p>\r\nMultilayer pipes combine layers of different materials.\r\nDepending on the specific type, they can be used\r\nin radiator heating and other compatible systems.\r\n<\/p>\r\n\r\n<p>\r\nCompatibility between pipes, fittings,\r\nand installation tools is essential.\r\n<\/p>\r\n\r\n<h3>PEX Pipes<\/h3>\r\n\r\n<p>\r\nPEX pipes are used in various building services systems,\r\nincluding underfloor heating, provided they meet\r\nthe required technical classification.\r\n<\/p>\r\n\r\n<p>\r\nWhen selecting PEX pipes, check their permissible\r\ntemperature and pressure ratings, oxygen diffusion\r\nbarrier, and manufacturer recommendations.\r\n<\/p>\r\n\r\n<h3>What Diameter Should Heating Pipes Have?<\/h3>\r\n\r\n<p>\r\nPipe diameter should be determined through\r\nhydraulic calculations. Important factors include\r\nheat load, water flow rate, pipe length,\r\nand pressure losses.\r\n<\/p>\r\n\r\n<p>\r\nAn incorrectly selected pipe diameter may cause\r\nnoise, uneven heating, or circulation problems.\r\n<\/p>\r\n\r\n<h2>Manifolds, Fittings, and Heating Accessories<\/h2>\r\n\r\n<p>\r\nA central heating system requires more than\r\na boiler, radiators, and pipes.\r\n<\/p>\r\n\r\n<p>\r\nDepending on the system design,\r\nthe following components may be required:\r\n<\/p>\r\n\r\n<ul>\r\n  <li>Heating manifold<\/li>\r\n  <li>Pipe fittings<\/li>\r\n  <li>Radiator valves<\/li>\r\n  <li>Thermostatic radiator heads<\/li>\r\n  <li>Circulation pump<\/li>\r\n  <li>Expansion vessel<\/li>\r\n  <li>Air vents<\/li>\r\n  <li>Safety valves<\/li>\r\n  <li>Filters and protective components<\/li>\r\n  <li>Thermostats and control devices<\/li>\r\n  <li>Pipe supports and thermal insulation<\/li>\r\n<\/ul>\r\n\r\n<p>\r\nNot every component listed above is necessary\r\nfor every project. The required equipment\r\ndepends on the heating system type\r\nand technical design.\r\n<\/p>\r\n\r\n<h2>Underfloor Heating Materials and Prices<\/h2>\r\n\r\n<p>\r\nUnderfloor heating distributes heat\r\nfrom the floor surface. A properly designed\r\nsystem can maintain a comfortable\r\nindoor temperature.\r\n<\/p>\r\n\r\n<p>\r\nInstalling underfloor heating may require:\r\n<\/p>\r\n\r\n<ul>\r\n  <li>Suitable heating pipes<\/li>\r\n  <li>Thermal insulation layer<\/li>\r\n  <li>Pipe fixing components<\/li>\r\n  <li>Manifold and manifold cabinet<\/li>\r\n  <li>Flow control components<\/li>\r\n  <li>Thermostats<\/li>\r\n  <li>Mixing unit, if required by the design<\/li>\r\n  <li>Suitable floor construction<\/li>\r\n<\/ul>\r\n\r\n<p>\r\nThe <strong>cost of underfloor heating<\/strong>\r\ndepends on the heated area, system construction,\r\nmaterial quality, and scope of installation work.\r\n<\/p>\r\n\r\n<h2>Central Heating Cost: How Is the Total Budget Calculated?<\/h2>\r\n\r\n<p>\r\nThe <strong>cost of central heating<\/strong>\r\nconsists of several main expense categories.\r\nEvaluating them separately helps you understand\r\nhow your budget is distributed.\r\n<\/p>\r\n\r\n<div class=\"dv-heat-table-wrap\">\r\n<table>\r\n<thead>\r\n<tr>\r\n  <th>Cost Category<\/th>\r\n  <th>What Is Included<\/th>\r\n<\/tr>\r\n<\/thead>\r\n<tbody>\r\n<tr>\r\n  <td>Heating Boiler<\/td>\r\n  <td>Boiler and compatible components<\/td>\r\n<\/tr>\r\n<tr>\r\n  <td>Radiators<\/td>\r\n  <td>Panel or sectional models<\/td>\r\n<\/tr>\r\n<tr>\r\n  <td>Heating Pipes<\/td>\r\n  <td>Pipes, fittings, and supports<\/td>\r\n<\/tr>\r\n<tr>\r\n  <td>Manifolds<\/td>\r\n  <td>Distribution and control components<\/td>\r\n<\/tr>\r\n<tr>\r\n  <td>Additional Materials<\/td>\r\n  <td>Valves, filters, and accessories<\/td>\r\n<\/tr>\r\n<tr>\r\n  <td>Installation<\/td>\r\n  <td>Pipe installation, equipment installation, and commissioning<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\r\n\r\n<p>\r\nThe final price depends on product brands,\r\nquantities, technical specifications,\r\nand the working conditions of the property.\r\n<\/p>\r\n\r\n<h2>Heating Installation Costs and Work Stages<\/h2>\r\n\r\n<p>\r\nIn addition to product quality,\r\nproper installation is essential\r\nfor reliable heating system operation.\r\n<\/p>\r\n\r\n<p>\r\n<strong>Heating installation costs<\/strong>\r\ndepend on the scope of work, piping complexity,\r\nnumber of radiators, and additional\r\ntechnical requirements.\r\n<\/p>\r\n\r\n<p>\r\nThe installation process may include:\r\n<\/p>\r\n\r\n<ol>\r\n  <li>Inspecting the property and assessing technical conditions<\/li>\r\n  <li>Preparing the heating system layout<\/li>\r\n  <li>Installing heating pipes<\/li>\r\n  <li>Installing manifolds and valves<\/li>\r\n  <li>Installing radiators<\/li>\r\n  <li>Installing the boiler by an authorized specialist<\/li>\r\n  <li>Checking the system for leaks<\/li>\r\n  <li>Filling the system and removing trapped air<\/li>\r\n  <li>Starting and adjusting the heating system<\/li>\r\n<\/ol>\r\n\r\n<div class=\"dv-heat-highlight\">\r\n<strong>Safety:<\/strong>\r\nGas appliance connections, adjustments,\r\nand commissioning must be carried out\r\nby a qualified specialist in accordance\r\nwith applicable safety requirements.\r\n<\/div>\r\n\r\n<h2>How to Choose High-Quality Heating Materials<\/h2>\r\n\r\n<p>\r\nWhen selecting heating products,\r\ntechnical compatibility, reliability,\r\nand service conditions are just as important\r\nas the purchase price.\r\n<\/p>\r\n\r\n<p>\r\nBefore purchasing, it is recommended\r\nto check the following:\r\n<\/p>\r\n\r\n<ul>\r\n  <li>Manufacturer's technical documentation<\/li>\r\n  <li>Product compatibility with the heating system<\/li>\r\n  <li>Permissible operating pressure and temperature<\/li>\r\n  <li>Warranty conditions<\/li>\r\n  <li>Availability of spare parts<\/li>\r\n  <li>Service and technical support options<\/li>\r\n  <li>Installation requirements<\/li>\r\n  <li>Total cost of the complete equipment package<\/li>\r\n<\/ul>\r\n\r\n<p>\r\nChoosing suitable, high-quality materials\r\nreduces the risk of malfunctions\r\nand unexpected expenses.\r\n<\/p>\r\n\r\n<h2>Why Is It Important to Estimate Heating Costs in Advance?<\/h2>\r\n\r\n<p>\r\nEstimating your budget before installing\r\na heating system helps you understand\r\nthe approximate cost of the required materials\r\nand the scope of work.\r\n<\/p>\r\n\r\n<p>\r\nThe <strong>Datvale.ge heating calculator<\/strong>\r\nis designed to simplify this process.\r\nIt allows you to estimate potential heating\r\nsystem costs before making a purchase.\r\n<\/p>\r\n\r\n<p>\r\nThe final budget should be confirmed\r\nbased on the selected products,\r\ntechnical design, and installation conditions.\r\n<\/p>\r\n\r\n<h2>Why Choose Datvale.ge?<\/h2>\r\n\r\n<p>\r\nDatvale.ge is an online renovation\r\nand construction platform that helps users\r\nestimate costs, plan work, and access\r\nuseful information.\r\n<\/p>\r\n\r\n<p>\r\nThe platform's advantages include:\r\n<\/p>\r\n\r\n<ul>\r\n  <li>Online cost estimation calculators<\/li>\r\n  <li>Material and labor cost estimates<\/li>\r\n  <li>Information about renovation and construction stages<\/li>\r\n  <li>Special offers from partner companies<\/li>\r\n  <li>Personal advisor services included in eligible packages<\/li>\r\n  <li>Useful articles and practical recommendations<\/li>\r\n  <li>Georgian, English, and Russian language versions<\/li>\r\n<\/ul>\r\n\r\n<p>\r\nOur goal is to help users access more information\r\nbefore purchasing materials or beginning\r\ninstallation work.\r\n<\/p>\r\n\r\n<h2>Frequently Asked Questions About Central Heating<\/h2>\r\n\r\n<div class=\"dv-heat-faq\">\r\n\r\n<details>\r\n  <summary>What Materials Are Needed for Central Heating?<\/summary>\r\n  <p>\r\n    A typical system requires a heating boiler,\r\n    radiators or other heat emitters, heating pipes,\r\n    fittings, valves, and suitable auxiliary components.\r\n    The exact list depends on the project.\r\n  <\/p>\r\n<\/details>\r\n\r\n<details>\r\n  <summary>How Much Does a Heating Boiler Cost?<\/summary>\r\n  <p>\r\n    Heating boiler prices depend on the brand,\r\n    capacity, technology, and additional features.\r\n    Before purchasing, compare technical specifications\r\n    and the total cost of the complete equipment package.\r\n  <\/p>\r\n<\/details>\r\n\r\n<details>\r\n  <summary>Which Is Better: Panel or Sectional Radiators?<\/summary>\r\n  <p>\r\n    The choice depends on the room's heat demand,\r\n    the heating system's operating temperature,\r\n    design preferences, and budget.\r\n    Both types can be effective when selected correctly.\r\n  <\/p>\r\n<\/details>\r\n\r\n<details>\r\n  <summary>What Determines Radiator Prices?<\/summary>\r\n  <p>\r\n    Radiator prices depend on the type, material,\r\n    dimensions, heat output, manufacturer,\r\n    and number of sections in sectional models.\r\n  <\/p>\r\n<\/details>\r\n\r\n<details>\r\n  <summary>Which Types of Heating Pipes Are Used?<\/summary>\r\n  <p>\r\n    Multilayer or PEX pipes may be used\r\n    in compatible heating systems.\r\n    Temperature, pressure, diameter,\r\n    and manufacturer requirements\r\n    are important selection factors.\r\n  <\/p>\r\n<\/details>\r\n\r\n<details>\r\n  <summary>How Much Does a Central Heating System Cost?<\/summary>\r\n  <p>\r\n    Central heating costs depend on the heated area,\r\n    insulation, boiler, radiators, pipes,\r\n    and installation work.\r\n    The exact cost is determined\r\n    by the requirements of each project.\r\n  <\/p>\r\n<\/details>\r\n\r\n<details>\r\n  <summary>How Many Radiators Do I Need for My Home?<\/summary>\r\n  <p>\r\n    The number and capacity of radiators\r\n    should be determined by the heat losses\r\n    of each individual room.\r\n    Floor area alone is not sufficient\r\n    for accurate radiator selection.\r\n  <\/p>\r\n<\/details>\r\n\r\n<details>\r\n  <summary>Can Radiators and Underfloor Heating Be Used Together?<\/summary>\r\n  <p>\r\n    Yes. A combined system is possible\r\n    when hydraulic requirements and operating\r\n    temperatures are properly designed.\r\n  <\/p>\r\n<\/details>\r\n\r\n<details>\r\n  <summary>How Much Does Heating Installation Cost?<\/summary>\r\n  <p>\r\n    Installation costs depend on pipe length,\r\n    the number of radiators, boiler installation\r\n    conditions, and the complexity of the work.\r\n  <\/p>\r\n<\/details>\r\n\r\n<details>\r\n  <summary>How Can I Estimate Heating Costs in Advance?<\/summary>\r\n  <p>\r\n    You can use the Datvale.ge heating calculator\r\n    to estimate your preliminary budget.\r\n    Final prices should be confirmed\r\n    based on the selected materials\r\n    and required work.\r\n  <\/p>\r\n<\/details>\r\n\r\n<\/div>\r\n\r\n<div class=\"dv-heat-ending\">\r\n\r\n<h2>Central Heating: Choose Your Materials and Plan Your Budget<\/h2>\r\n\r\n<p>\r\nIf you are planning to install a heating system\r\nin an apartment, private house, or cottage,\r\nstart by learning about the characteristics\r\nof heating boilers, radiators, pipes,\r\nand additional components.\r\n<\/p>\r\n\r\n<p>\r\nCompare product specifications,\r\nconsider installation requirements,\r\nand use the Datvale.ge heating calculator\r\nto estimate your preliminary budget.\r\n<\/p>\r\n\r\n<p>\r\n<strong>\r\nProperly selected heating materials\r\nand professional installation are the foundation\r\nof a comfortable, reliable, and efficient\r\nheating system.\r\n<\/strong>\r\n<\/p>\r\n\r\n<\/div>\r\n\r\n<p>\r\nFor more information, follow us on\r\n<a href=\"https:\/\/facebook.com\/datvale.ge\"\r\ntarget=\"_blank\"\r\nrel=\"noopener noreferrer\">Facebook<\/a>\r\nand\r\n<a href=\"https:\/\/youtube.com\/@datvale\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube<\/a>.\r\n<\/p>\r\n\r\n<\/section>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Central Heating \u2013 Calculate Heating Material Costs 1. Heating System Details Heated Area, m\u00b2 Ceiling Height, m Property Type ApartmentPrivate HouseCottageOffice Insulation Quality GoodAveragePoor Climate Conditions Mild ClimateModerate ClimateCold Climate Radiator Type COPA T22 Panel RadiatorGlobal VOX EXTRA Sectional Radiator Heating Boiler Automatic SelectionMacro 24 \u2014 1,699 GELSIME Go 18\/25 BF \u2014 2,149 GELMacro 36&#8230;<\/p>\n","protected":false},"author":67,"featured_media":0,"parent":0,"menu_order":24,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-23431","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/datvale.ge\/en\/wp-json\/wp\/v2\/pages\/23431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/datvale.ge\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/datvale.ge\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/datvale.ge\/en\/wp-json\/wp\/v2\/users\/67"}],"replies":[{"embeddable":true,"href":"https:\/\/datvale.ge\/en\/wp-json\/wp\/v2\/comments?post=23431"}],"version-history":[{"count":1,"href":"https:\/\/datvale.ge\/en\/wp-json\/wp\/v2\/pages\/23431\/revisions"}],"predecessor-version":[{"id":23432,"href":"https:\/\/datvale.ge\/en\/wp-json\/wp\/v2\/pages\/23431\/revisions\/23432"}],"wp:attachment":[{"href":"https:\/\/datvale.ge\/en\/wp-json\/wp\/v2\/media?parent=23431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}