


<style id="elementor-post-21898">.elementor-21898 .elementor-element.elementor-element-1c37de6{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;--margin-top:-134px;--margin-bottom:0px;--margin-left:0px;--margin-right:0px;}.elementor-21898 .elementor-element.elementor-element-525038e{--display:flex;--justify-content:center;--margin-top:-26px;--margin-bottom:0px;--margin-left:0px;--margin-right:0px;}.elementor-widget-heading .elementor-heading-title{font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-weight:var( --e-global-typography-primary-font-weight );color:var( --e-global-color-primary );}.elementor-21898 .elementor-element.elementor-element-5c36aa2 > .elementor-widget-container{padding:0px 0px 0px 0px;}.elementor-21898 .elementor-element.elementor-element-5c36aa2{text-align:center;}.elementor-21898 .elementor-element.elementor-element-5c36aa2 .elementor-heading-title{font-family:"Roboto", Sans-serif;font-size:29px;font-weight:600;-webkit-text-stroke-color:#000;stroke:#000;text-shadow:0px 0px 0px rgba(0,0,0,0.3);color:#33558B;}.elementor-21898 .elementor-element.elementor-element-5c36aa2 .elementor-heading-title a{transition-duration:0s;}.elementor-21898 .elementor-element.elementor-element-0553750{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;--margin-top:-6px;--margin-bottom:0px;--margin-left:0px;--margin-right:0px;}.elementor-21898 .elementor-element.elementor-element-0b8ebf2{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;}.elementor-21898 .elementor-element.elementor-element-7153843{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;}.elementor-21898 .elementor-element.elementor-element-8c7397b{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;}.elementor-21898 .elementor-element.elementor-element-d64c95d{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;}.elementor-widget-text-editor{font-family:var( --e-global-typography-text-font-family ), Sans-serif;font-weight:var( --e-global-typography-text-font-weight );color:var( --e-global-color-text );}.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:var( --e-global-color-primary );}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap, .elementor-widget-text-editor.elementor-drop-cap-view-default .elementor-drop-cap{color:var( --e-global-color-primary );border-color:var( --e-global-color-primary );}.elementor-21898 .elementor-element.elementor-element-a6c25e7{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;}.elementor-widget-image .widget-image-caption{color:var( --e-global-color-text );font-family:var( --e-global-typography-text-font-family ), Sans-serif;font-weight:var( --e-global-typography-text-font-weight );}.elementor-21898 .elementor-element.elementor-element-f5fdee7 img{width:100%;}@media(max-width:1024px){.elementor-21898 .elementor-element.elementor-element-5c36aa2 > .elementor-widget-container{padding:0px 0px 0px 0px;}}@media(max-width:767px){.elementor-21898 .elementor-element.elementor-element-401cbcf > .elementor-widget-container{margin:96px 0px 0px 0px;}.elementor-21898 .elementor-element.elementor-element-525038e{--padding-top:0px;--padding-bottom:0px;--padding-left:0px;--padding-right:0px;}.elementor-21898 .elementor-element.elementor-element-5c36aa2 > .elementor-widget-container{padding:010px 010px 5px 010px;}.elementor-21898 .elementor-element.elementor-element-5c36aa2{text-align:center;}.elementor-21898 .elementor-element.elementor-element-5c36aa2 .elementor-heading-title{font-size:17px;-webkit-text-stroke-width:0px;stroke-width:0px;}.elementor-21898 .elementor-element.elementor-element-0553750{--margin-top:-24px;--margin-bottom:0px;--margin-left:0px;--margin-right:0px;}}@media(min-width:768px){.elementor-21898 .elementor-element.elementor-element-525038e{--content-width:1600px;}}</style>{"id":21898,"date":"2026-09-24T09:52:09","date_gmt":"2026-09-24T05:52:09","guid":{"rendered":"https:\/\/datvale.ge\/%e1%83%90%e1%83%a3%e1%83%96%e1%83%98%e1%83%a1-%e1%83%9b%e1%83%9d%e1%83%95%e1%83%9a%e1%83%98%e1%83%a1-%e1%83%a4%e1%83%90%e1%83%a1%e1%83%98\/"},"modified":"2026-10-07T18:41:08","modified_gmt":"2026-10-07T14:41:08","slug":"pool-maintenance-cost","status":"publish","type":"page","link":"https:\/\/datvale.ge\/en\/pool-maintenance-cost\/","title":{"rendered":"Pool Maintenance Cost"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"21898\" class=\"elementor elementor-21898 elementor-20470\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1c37de6 e-flex e-con-boxed e-con e-parent\" data-id=\"1c37de6\" 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-401cbcf elementor-widget elementor-widget-html\" data-id=\"401cbcf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"dv-kalkulatorebi-banner\">\r\n\r\n  <img decoding=\"async\"\r\n    src=\"https:\/\/datvale.ge\/wp-content\/uploads\/2026\/10\/remontis-kalkulatori-2.webp\"\r\n    alt=\"Datvale Calculators\"\r\n  >\r\n\r\n<\/div>\r\n\r\n<style>\r\n\r\n.dv-kalkulatorebi-banner,\r\n.dv-kalkulatorebi-banner *{\r\n  box-sizing:border-box;\r\n}\r\n\r\n.dv-kalkulatorebi-banner{\r\n  position:relative;\r\n  overflow:hidden;\r\n\r\n  width:100%;\r\n  height:215px;\r\n\r\n  margin:18px 0;\r\n\r\n  border-radius:22px;\r\n\r\n  background:#eef1f4;\r\n}\r\n\r\n.dv-kalkulatorebi-banner img{\r\n  display:block;\r\n\r\n  width:100%;\r\n  height:100%;\r\n\r\n  margin:0;\r\n  padding:0;\r\n\r\n  border:0;\r\n\r\n  object-fit:cover;\r\n  object-position:center;\r\n\r\n  image-rendering:auto;\r\n}\r\n\r\n\r\n\/* TABLET *\/\r\n\r\n@media(max-width:900px){\r\n\r\n  .dv-kalkulatorebi-banner{\r\n    height:190px;\r\n  }\r\n\r\n}\r\n\r\n\r\n\/* MOBILE *\/\r\n\r\n@media(max-width:700px){\r\n\r\n  .dv-kalkulatorebi-banner{\r\n    height:183px;\r\n\r\n    margin:10px 0;\r\n\r\n    border-radius:14px;\r\n  }\r\n\r\n}\r\n\r\n\r\n\/* SMALL MOBILE *\/\r\n\r\n@media(max-width:380px){\r\n\r\n  .dv-kalkulatorebi-banner{\r\n    height:165px;\r\n  }\r\n\r\n}\r\n\r\n<\/style>\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-525038e e-flex e-con-boxed e-con e-parent\" data-id=\"525038e\" 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-5c36aa2 elementor-widget elementor-widget-heading\" data-id=\"5c36aa2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Pool Maintenance Cost 2026 \u2013 Pool Maintenance Calculator<\/h1>\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-0553750 e-flex e-con-boxed e-con e-parent\" data-id=\"0553750\" 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-e95153e elementor-widget elementor-widget-html\" data-id=\"e95153e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"dv-pool-maintenance-calculator\">\r\n\r\n<style>\r\n#dv-pool-maintenance-calculator,\r\n#dv-pool-maintenance-calculator * {\r\n  box-sizing:border-box;\r\n}\r\n\r\n#dv-pool-maintenance-calculator {\r\n  --dv-blue:#0b3a78;\r\n  --dv-blue-2:#1764bd;\r\n  --dv-text:#173558;\r\n  --dv-muted:#5f7287;\r\n  --dv-border:#e3ebf5;\r\n  --dv-success:#13795b;\r\n  --dv-warning:#9a6700;\r\n\r\n  position:relative;\r\n  isolation:isolate;\r\n  width:100%;\r\n  max-width:1260px;\r\n  margin:26px auto;\r\n  padding:42px 22px;\r\n  border:1px solid var(--dv-border);\r\n  border-radius:24px;\r\n  background:\r\n    radial-gradient(circle at top right,rgba(52,86,150,.09),transparent 34%),\r\n    linear-gradient(180deg,#f8fbff 0%,#eef4fb 100%);\r\n  color:var(--dv-text);\r\n  font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;\r\n  box-shadow:0 16px 42px rgba(11,58,120,.10);\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-calculator {\r\n  width:100%;\r\n  max-width:1180px;\r\n  margin:0 auto;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-input-card,\r\n#dv-pool-maintenance-calculator .dv-result-card,\r\n#dv-pool-maintenance-calculator .dv-summary,\r\n#dv-pool-maintenance-calculator .dv-info-card,\r\n#dv-pool-maintenance-calculator .dv-partner-card {\r\n  border:1px solid var(--dv-border);\r\n  border-radius:22px;\r\n  background:#fff;\r\n  box-shadow:0 16px 40px rgba(11,58,120,.10);\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-input-card {\r\n  padding:28px;\r\n  margin-bottom:24px;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-section-title {\r\n  display:flex;\r\n  align-items:center;\r\n  gap:11px;\r\n  margin:0 0 22px;\r\n  color:var(--dv-text);\r\n  font-size:24px;\r\n  font-weight:950;\r\n  line-height:1.18;\r\n  letter-spacing:-.02em;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-section-number {\r\n  display:inline-flex;\r\n  width:36px;\r\n  height:36px;\r\n  align-items:center;\r\n  justify-content:center;\r\n  flex:0 0 36px;\r\n  border-radius:50%;\r\n  background:linear-gradient(135deg,var(--dv-blue),var(--dv-blue-2));\r\n  color:#fff;\r\n  font-size:14px;\r\n  font-weight:950;\r\n  box-shadow:0 8px 18px rgba(11,58,120,.18);\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-input-grid,\r\n#dv-pool-maintenance-calculator .dv-options-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-pool-maintenance-calculator .dv-options-grid {\r\n  margin-top:20px;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-field {\r\n  min-width:0;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-field label {\r\n  display:block;\r\n  min-height:21px;\r\n  margin-bottom:8px;\r\n  color:var(--dv-text);\r\n  font-size:14px;\r\n  font-weight:850;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-input-wrap {\r\n  position:relative;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-field input,\r\n#dv-pool-maintenance-calculator .dv-field select {\r\n  display:block;\r\n  width:100%;\r\n  height:56px;\r\n  margin:0;\r\n  border:1px solid #d8e3ef;\r\n  border-radius:14px;\r\n  outline:none;\r\n  background:#f8fbff;\r\n  color:var(--dv-text);\r\n  font-size:16px;\r\n  font-weight:800;\r\n  transition:border-color .2s ease,box-shadow .2s ease,background .2s ease;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-field input {\r\n  padding:0 52px 0 15px;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-field select {\r\n  padding:0 42px 0 15px;\r\n  cursor:pointer;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-field input:focus,\r\n#dv-pool-maintenance-calculator .dv-field select:focus {\r\n  border-color:var(--dv-blue-2);\r\n  background:#fff;\r\n  box-shadow:0 0 0 4px rgba(23,100,189,.10);\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-unit {\r\n  position:absolute;\r\n  top:50%;\r\n  right:14px;\r\n  transform:translateY(-50%);\r\n  color:var(--dv-muted);\r\n  font-size:13px;\r\n  font-weight:850;\r\n  pointer-events:none;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-note {\r\n  margin-top:20px;\r\n  padding:14px 16px;\r\n  border:1px solid #dce7f2;\r\n  border-radius:14px;\r\n  background:#f8fbff;\r\n  color:#526b84;\r\n  font-size:13px;\r\n  line-height:1.55;\r\n  font-weight:650;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-calculate-v2 {\r\n  display:flex;\r\n  width:100%;\r\n  min-height:58px;\r\n  align-items:center;\r\n  justify-content:center;\r\n  margin-top:22px;\r\n  padding:14px 24px;\r\n  border:0;\r\n  border-radius:14px;\r\n  cursor:pointer;\r\n  background:linear-gradient(135deg,var(--dv-blue),var(--dv-blue-2));\r\n  color:#fff;\r\n  font-size:17px;\r\n  font-weight:950;\r\n  box-shadow:0 12px 28px rgba(11,58,120,.22);\r\n  transition:transform .2s ease,box-shadow .2s ease,filter .2s ease;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-calculate-v2:hover {\r\n  transform:translateY(-2px);\r\n  filter:brightness(1.03);\r\n  box-shadow:0 16px 34px rgba(11,58,120,.26);\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-error {\r\n  display:none;\r\n  margin-top:14px;\r\n  padding:13px 15px;\r\n  border:1px solid rgba(174,32,32,.18);\r\n  border-radius:12px;\r\n  background:#fff2f2;\r\n  color:#a32020;\r\n  font-size:14px;\r\n  font-weight:850;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-output {\r\n  display:none;\r\n  scroll-margin-top:150px;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-output.dv-show {\r\n  display:block;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-results {\r\n  display:grid;\r\n  grid-template-columns:repeat(2,minmax(0,1fr));\r\n  gap:18px;\r\n  max-width:1080px;\r\n  margin:0 auto;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-result-card {\r\n  overflow:hidden;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-result-head {\r\n  display:flex;\r\n  align-items:center;\r\n  gap:10px;\r\n  padding:17px 20px;\r\n  background:linear-gradient(135deg,var(--dv-blue),var(--dv-blue-2));\r\n  color:#fff;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-result-icon {\r\n  display:inline-flex;\r\n  width:34px;\r\n  height:34px;\r\n  align-items:center;\r\n  justify-content:center;\r\n  flex:0 0 34px;\r\n  border-radius:10px;\r\n  background:rgba(255,255,255,.14);\r\n  font-size:17px;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-result-head h3 {\r\n  margin:0;\r\n  color:#fff;\r\n  font-size:18px;\r\n  font-weight:950;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-result-body {\r\n  padding:10px 18px 15px;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-row {\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr) auto;\r\n  gap:15px;\r\n  align-items:center;\r\n  padding:12px 0;\r\n  border-bottom:1px dashed #d9e4ef;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-row:last-child {\r\n  border-bottom:0;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-row-name {\r\n  min-width:0;\r\n  color:#425a74;\r\n  font-size:14px;\r\n  line-height:1.45;\r\n  font-weight:650;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-row-value {\r\n  color:var(--dv-text);\r\n  text-align:right;\r\n  white-space:nowrap;\r\n  font-size:15px;\r\n  font-weight:950;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-card-total {\r\n  margin:7px 0 2px;\r\n  padding:14px 15px;\r\n  border:1px solid #d8e3ef;\r\n  border-radius:13px;\r\n  background:#f4f8fd;\r\n  color:var(--dv-text);\r\n  font-size:15px;\r\n  font-weight:950;\r\n  text-align:right;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-summary {\r\n  max-width:1080px;\r\n  margin:22px auto 0;\r\n  padding:26px;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-summary-grid {\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-pool-maintenance-calculator .dv-summary-item {\r\n  padding:18px;\r\n  border:1px solid #e1e9f3;\r\n  border-radius:16px;\r\n  background:#f8fbff;\r\n  text-align:center;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-summary-label {\r\n  display:block;\r\n  margin-bottom:7px;\r\n  color:var(--dv-muted);\r\n  font-size:13px;\r\n  font-weight:850;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-summary-value {\r\n  color:var(--dv-text);\r\n  font-size:22px;\r\n  font-weight:950;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-grand-total {\r\n  position:relative;\r\n  overflow:hidden;\r\n  margin-top:16px;\r\n  padding:29px 20px;\r\n  border-radius:18px;\r\n  background:\r\n    radial-gradient(circle at top right,rgba(255,255,255,.18),transparent 36%),\r\n    linear-gradient(135deg,var(--dv-blue),var(--dv-blue-2));\r\n  color:#fff;\r\n  text-align:center;\r\n  box-shadow:0 14px 30px rgba(11,58,120,.20);\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-grand-total small {\r\n  display:block;\r\n  margin-bottom:8px;\r\n  color:rgba(255,255,255,.82);\r\n  font-size:14px;\r\n  font-weight:850;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-grand-total strong {\r\n  display:block;\r\n  color:#fff;\r\n  font-size:clamp(34px,6vw,52px);\r\n  line-height:1;\r\n  font-weight:1000;\r\n  letter-spacing:-.04em;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-info-card,\r\n#dv-pool-maintenance-calculator .dv-partner-card {\r\n  max-width:1080px;\r\n  margin:20px auto 0;\r\n  padding:22px;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-info-card h3,\r\n#dv-pool-maintenance-calculator .dv-partner-card h3 {\r\n  margin:0 0 10px;\r\n  color:var(--dv-text);\r\n  font-size:20px;\r\n  font-weight:950;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-info-card p,\r\n#dv-pool-maintenance-calculator .dv-partner-card p {\r\n  margin:0;\r\n  color:#526b84;\r\n  font-size:13px;\r\n  line-height:1.65;\r\n  font-weight:650;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-partner-card {\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr) auto;\r\n  align-items:center;\r\n  gap:22px;\r\n  background:linear-gradient(135deg,#f8fbff,#eaf2fb);\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-partner-button {\r\n  display:inline-flex;\r\n  min-width:240px;\r\n  min-height:54px;\r\n  align-items:center;\r\n  justify-content:center;\r\n  padding:13px 20px;\r\n  border-radius:12px;\r\n  background:linear-gradient(135deg,var(--dv-blue),var(--dv-blue-2));\r\n  color:#fff!important;\r\n  font-size:14px;\r\n  font-weight:950;\r\n  text-decoration:none!important;\r\n  text-align:center;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-pdf-button {\r\n  display:flex;\r\n  width:100%;\r\n  min-height:56px;\r\n  align-items:center;\r\n  justify-content:center;\r\n  gap:9px;\r\n  margin-top:15px;\r\n  padding:14px 22px;\r\n  border:0;\r\n  border-radius:14px;\r\n  cursor:pointer;\r\n  background:linear-gradient(135deg,#13795b,#0e9a70);\r\n  color:#fff;\r\n  font-size:16px;\r\n  font-weight:950;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-source {\r\n  margin-top:12px;\r\n  color:#70849a;\r\n  font-size:12px;\r\n  line-height:1.55;\r\n  font-weight:650;\r\n}\r\n\r\n\/* Company call request *\/\r\n#dv-pool-maintenance-calculator .dv-call-request{\r\n  display:none;\r\n  width:100%;\r\n  max-width:100%;\r\n  min-width:0;\r\n  margin-top:14px;\r\n  padding:18px;\r\n  border:1px solid #d8e3ef;\r\n  border-radius:16px;\r\n  background:#f8fbff;\r\n  overflow:hidden;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-call-request-title{\r\n  margin:0 0 6px;\r\n  color:var(--dv-text);\r\n  font-size:17px;\r\n  font-weight:950;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-call-request-text{\r\n  margin:0 0 12px;\r\n  color:var(--dv-muted);\r\n  font-size:13px;\r\n  line-height:1.5;\r\n  font-weight:650;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-call-request-row{\r\n  display:grid;\r\n  width:100%;\r\n  max-width:100%;\r\n  min-width:0;\r\n  grid-template-columns:minmax(0,1fr) auto;\r\n  gap:10px;\r\n  align-items:center;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-call-phone{\r\n  display:block;\r\n  width:100%;\r\n  max-width:100%;\r\n  min-width:0;\r\n  height:52px;\r\n  padding:0 14px;\r\n  border:1px solid #d8e3ef;\r\n  border-radius:12px;\r\n  outline:none;\r\n  background:#fff;\r\n  color:var(--dv-text);\r\n  font-size:15px;\r\n  font-weight:750;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-call-phone:focus{\r\n  border-color:var(--dv-success);\r\n  box-shadow:0 0 0 4px rgba(19,121,91,.10);\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-call-request-row.dv-has-saved-phone{\r\n  grid-template-columns:1fr;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-call-request-row.dv-has-saved-phone .dv-call-phone{\r\n  display:none;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-request-call-btn{\r\n  min-height:52px;\r\n  max-width:100%;\r\n  min-width:0;\r\n  padding:13px 20px;\r\n  border:0;\r\n  border-radius:12px;\r\n  cursor:pointer;\r\n  background:linear-gradient(135deg,#13795b,#0e9a70);\r\n  color:#fff;\r\n  font-size:14px;\r\n  font-weight:950;\r\n  white-space:nowrap;\r\n  box-shadow:0 10px 24px rgba(19,121,91,.22);\r\n  transition:transform .18s ease,box-shadow .18s ease,filter .18s ease;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-request-call-btn:hover{\r\n  transform:translateY(-1px);\r\n  box-shadow:0 14px 30px rgba(19,121,91,.26);\r\n  filter:brightness(1.03);\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-request-call-btn:disabled{\r\n  opacity:.65;\r\n  cursor:wait;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-call-request-status{\r\n  display:none;\r\n  margin-top:10px;\r\n  padding:10px 12px;\r\n  border-radius:10px;\r\n  font-size:13px;\r\n  line-height:1.45;\r\n  font-weight:800;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-call-request-status.dv-success{\r\n  display:block;\r\n  background:#eefaf5;\r\n  color:#13795b;\r\n  border:1px solid rgba(19,121,91,.16);\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-call-request-status.dv-error{\r\n  display:block;\r\n  background:#fff2f2;\r\n  color:#a32020;\r\n  border:1px solid rgba(174,32,32,.18);\r\n}\r\n\r\n@media(max-width:760px){\r\n  #dv-pool-maintenance-calculator .dv-call-request{\r\n    width:100%;\r\n    max-width:100%;\r\n    min-width:0;\r\n    overflow:hidden;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-call-request-row{\r\n    width:100%;\r\n    max-width:100%;\r\n    min-width:0;\r\n    grid-template-columns:minmax(0,1fr);\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-call-phone{\r\n    width:100%;\r\n    max-width:100%;\r\n    min-width:0;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-request-call-btn{\r\n    display:block;\r\n    width:100%;\r\n    max-width:100%;\r\n    min-width:0;\r\n    white-space:normal;\r\n    overflow-wrap:anywhere;\r\n  }\r\n}\r\n\r\n@media(max-width:980px) {\r\n  #dv-pool-maintenance-calculator {\r\n    padding:34px 18px;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-input-grid {\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-options-grid {\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-summary-grid {\r\n    grid-template-columns:repeat(2,minmax(0,1fr));\r\n  }\r\n}\r\n\r\n@media(max-width:760px) {\r\n  #dv-pool-maintenance-calculator {\r\n    margin:18px auto;\r\n    padding:26px 12px;\r\n    border-radius:18px;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-input-card,\r\n  #dv-pool-maintenance-calculator .dv-summary {\r\n    padding:18px;\r\n    border-radius:18px;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-input-grid,\r\n  #dv-pool-maintenance-calculator .dv-options-grid,\r\n  #dv-pool-maintenance-calculator .dv-results,\r\n  #dv-pool-maintenance-calculator .dv-summary-grid,\r\n  #dv-pool-maintenance-calculator .dv-partner-card {\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-section-title {\r\n    font-size:21px;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-partner-button {\r\n    width:100%;\r\n    min-width:0;\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-pool-maintenance-calculator,\r\n  #dv-pool-maintenance-calculator * {\r\n    visibility:visible!important;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator {\r\n    position:absolute;\r\n    inset:0;\r\n    max-width:none;\r\n    margin:0;\r\n    padding:0;\r\n    border:0;\r\n    box-shadow:none;\r\n    background:#fff;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-input-card,\r\n  #dv-pool-maintenance-calculator .dv-partner-card,\r\n  #dv-pool-maintenance-calculator .dv-pdf-button {\r\n    display:none!important;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-output {\r\n    display:block!important;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-result-card,\r\n  #dv-pool-maintenance-calculator .dv-summary,\r\n  #dv-pool-maintenance-calculator .dv-info-card {\r\n    break-inside:avoid;\r\n    box-shadow:none;\r\n  }\r\n}\r\n\r\n\/* After the first free calculation *\/\r\n#dv-pool-maintenance-calculator .dv-free-next-step{\r\n  display:none;\r\n  max-width:1080px;\r\n  margin:0 auto 20px;\r\n  padding:22px 24px;\r\n  border:1px solid #d7e6f5;\r\n  border-radius:20px;\r\n  background:\r\n    radial-gradient(circle at top right,rgba(23,100,189,.12),transparent 34%),\r\n    linear-gradient(135deg,#ffffff 0%,#eef5fc 100%);\r\n  box-shadow:0 14px 34px rgba(11,58,120,.10);\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-free-next-step.dv-show{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr) auto;\r\n  gap:22px;\r\n  align-items:center;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-free-next-step-kicker{\r\n  display:inline-block;\r\n  margin-bottom:6px;\r\n  color:#13795b;\r\n  font-size:12px;\r\n  font-weight:950;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-free-next-step h3{\r\n  margin:0 0 7px;\r\n  color:#173558;\r\n  font-size:22px;\r\n  font-weight:950;\r\n  line-height:1.2;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-free-next-step p{\r\n  margin:0;\r\n  color:#526b84;\r\n  font-size:14px;\r\n  line-height:1.55;\r\n  font-weight:650;\r\n}\r\n\r\n#dv-pool-maintenance-calculator .dv-free-next-step a{\r\n  display:inline-flex;\r\n  min-width:240px;\r\n  min-height:52px;\r\n  align-items:center;\r\n  justify-content:center;\r\n  padding:13px 20px;\r\n  border-radius:13px;\r\n  background:linear-gradient(135deg,#0b3a78,#1764bd);\r\n  color:#fff!important;\r\n  font-size:14px;\r\n  font-weight:950;\r\n  text-decoration:none!important;\r\n  text-align:center;\r\n  box-shadow:0 10px 24px rgba(11,58,120,.20);\r\n}\r\n\r\n@media(max-width:760px){\r\n  #dv-pool-maintenance-calculator .dv-free-next-step.dv-show{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-free-next-step{\r\n    padding:18px;\r\n  }\r\n\r\n  #dv-pool-maintenance-calculator .dv-free-next-step a{\r\n    width:100%;\r\n    min-width:0;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<div class=\"dv-calculator\">\r\n\r\n  <div class=\"dv-input-card\">\r\n\r\n    <h3 class=\"dv-section-title\">\r\n      <span class=\"dv-section-number\">1<\/span>\r\n      Enter Pool Details\r\n    <\/h3>\r\n\r\n    <div class=\"dv-input-grid\">\r\n\r\n      <div class=\"dv-field\">\r\n        <label for=\"dvMaintLength\">Pool Length<\/label>\r\n        <div class=\"dv-input-wrap\">\r\n          <input type=\"text\" id=\"dvMaintLength\" placeholder=\"e.g. 8\" inputmode=\"decimal\">\r\n          <span class=\"dv-unit\">m<\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"dv-field\">\r\n        <label for=\"dvMaintWidth\">Pool Width<\/label>\r\n        <div class=\"dv-input-wrap\">\r\n          <input type=\"text\" id=\"dvMaintWidth\" placeholder=\"e.g. 4\" inputmode=\"decimal\">\r\n          <span class=\"dv-unit\">m<\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"dv-field\">\r\n        <label for=\"dvMaintDepth\">Average Depth<\/label>\r\n        <div class=\"dv-input-wrap\">\r\n          <input type=\"text\" id=\"dvMaintDepth\" placeholder=\"e.g. 1.5\" inputmode=\"decimal\">\r\n          <span class=\"dv-unit\">m<\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"dv-options-grid\">\r\n\r\n      <div class=\"dv-field\">\r\n        <label for=\"dvMaintUsage\">Usage Intensity<\/label>\r\n        <select id=\"dvMaintUsage\">\r\n          <option value=\"normal\">Medium<\/option>\r\n          <option value=\"low\">Low<\/option>\r\n          <option value=\"high\">High<\/option>\r\n        <\/select>\r\n      <\/div>\r\n\r\n      <div class=\"dv-field\">\r\n        <label for=\"dvMaintRobot\">Do you use a pool robot?<\/label>\r\n        <select id=\"dvMaintRobot\">\r\n          <option value=\"no\">No<\/option>\r\n          <option value=\"yes\">Yes<\/option>\r\n        <\/select>\r\n      <\/div>\r\n\r\n      <div class=\"dv-field\">\r\n        <label for=\"dvMaintPh\">Current pH (optional)<\/label>\r\n        <div class=\"dv-input-wrap\">\r\n          <input type=\"text\" id=\"dvMaintPh\" placeholder=\"e.g. 7.4\" inputmode=\"decimal\">\r\n          <span class=\"dv-unit\">pH<\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"dv-note\">\r\n      Basic monthly maintenance is calculated based on chlorine and algaecide usage.\r\n      A pH adjustment product is added only if the user enters the current pH level\r\n      and a one-time correction is required.\r\n    <\/div>\r\n\r\n    <button type=\"button\" class=\"dv-calculate-v2\" id=\"dvMaintCalculateFreeFlowV2\">\r\n      Calculate Pool Maintenance Cost\r\n    <\/button>\r\n\r\n    <div class=\"dv-error\" id=\"dvMaintError\">\r\n      Please enter the pool length, width, and average depth correctly.\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n  <div class=\"dv-output\" id=\"dvMaintOutput\">\r\n\r\n    <div class=\"dv-free-next-step\" id=\"dvMaintFreeNextStep\">\r\n      <div>\r\n        <span class=\"dv-free-next-step-kicker\">\u2713 Free calculation used<\/span>\r\n        <h3>A package is required for the next calculation<\/h3>\r\n        <p>\r\n          You have used one free calculation.\r\n          Choose a package to make your next calculation.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <a href=\"https:\/\/datvale.ge\/en\/packages\/\">\r\n        Choose a Package\r\n      <\/a>\r\n    <\/div>\r\n\r\n    <div class=\"dv-results\">\r\n\r\n      <div class=\"dv-result-card\">\r\n        <div class=\"dv-result-head\">\r\n          <span class=\"dv-result-icon\">\ud83d\udca7<\/span>\r\n          <h3>Pool Details<\/h3>\r\n        <\/div>\r\n\r\n        <div class=\"dv-result-body\">\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Water Volume<\/span>\r\n            <span class=\"dv-row-value\" id=\"dvMaintVolume\">\u2014<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Usage Level<\/span>\r\n            <span class=\"dv-row-value\" id=\"dvMaintUsageText\">\u2014<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Pool Robot<\/span>\r\n            <span class=\"dv-row-value\" id=\"dvMaintRobotText\">\u2014<\/span>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"dv-result-card\">\r\n        <div class=\"dv-result-head\">\r\n          <span class=\"dv-result-icon\">\ud83e\uddea<\/span>\r\n          <h3>Chlorine 56% Granules<\/h3>\r\n        <\/div>\r\n\r\n        <div class=\"dv-result-body\">\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Single Dose<\/span>\r\n            <span class=\"dv-row-value\" id=\"dvMaintChlorineDose\">\u2014<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Estimated Doses per Month<\/span>\r\n            <span class=\"dv-row-value\" id=\"dvMaintChlorineDoses\">\u2014<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Required Monthly Quantity<\/span>\r\n            <span class=\"dv-row-value\" id=\"dvMaintChlorineQty\">\u2014<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Price: 1 kg<\/span>\r\n            <span class=\"dv-row-value\">15.01 \u20be<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-card-total\">\r\n            Monthly Consumption Cost:\r\n            <span id=\"dvMaintChlorineCost\">\u2014<\/span>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"dv-result-card\">\r\n        <div class=\"dv-result-head\">\r\n          <span class=\"dv-result-icon\">\ud83c\udf3f<\/span>\r\n          <h3>Algaecide ALBA SUPER K 14%<\/h3>\r\n        <\/div>\r\n\r\n        <div class=\"dv-result-body\">\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Single Dose<\/span>\r\n            <span class=\"dv-row-value\" id=\"dvMaintAlgDose\">\u2014<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Dosage<\/span>\r\n            <span class=\"dv-row-value\">Every 2 Weeks<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Required Monthly Quantity<\/span>\r\n            <span class=\"dv-row-value\" id=\"dvMaintAlgQty\">\u2014<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Price: 5 L<\/span>\r\n            <span class=\"dv-row-value\">58.00 \u20be<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-card-total\">\r\n            Monthly Consumption Cost:\r\n            <span id=\"dvMaintAlgCost\">\u2014<\/span>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"dv-result-card\">\r\n        <div class=\"dv-result-head\">\r\n          <span class=\"dv-result-icon\">\u2696\ufe0f<\/span>\r\n          <h3>pH Adjustment<\/h3>\r\n        <\/div>\r\n\r\n        <div class=\"dv-result-body\">\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Entered pH<\/span>\r\n            <span class=\"dv-row-value\" id=\"dvMaintPhValue\">Not Provided<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Recommended Action<\/span>\r\n            <span class=\"dv-row-value\" id=\"dvMaintPhAction\">\u2014<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-row\">\r\n            <span class=\"dv-row-name\">Required Quantity<\/span>\r\n            <span class=\"dv-row-value\" id=\"dvMaintPhQty\">\u2014<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"dv-card-total\">\r\n            One-Time Adjustment Cost:\r\n            <span id=\"dvMaintPhCost\">\u2014<\/span>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"dv-summary\">\r\n\r\n      <h3 class=\"dv-section-title\">\r\n        <span class=\"dv-section-number\">2<\/span>\r\n        Monthly Maintenance Summary\r\n      <\/h3>\r\n\r\n      <div class=\"dv-summary-grid\">\r\n\r\n        <div class=\"dv-summary-item\">\r\n          <span class=\"dv-summary-label\">Water Volume<\/span>\r\n          <span class=\"dv-summary-value\" id=\"dvMaintSummaryVolume\">\u2014<\/span>\r\n        <\/div>\r\n\r\n        <div class=\"dv-summary-item\">\r\n          <span class=\"dv-summary-label\">Monthly Chlorine<\/span>\r\n          <span class=\"dv-summary-value\" id=\"dvMaintSummaryChlorine\">\u2014<\/span>\r\n        <\/div>\r\n\r\n        <div class=\"dv-summary-item\">\r\n          <span class=\"dv-summary-label\">Monthly Algaecide<\/span>\r\n          <span class=\"dv-summary-value\" id=\"dvMaintSummaryAlg\">\u2014<\/span>\r\n        <\/div>\r\n\r\n        <div class=\"dv-summary-item\">\r\n          <span class=\"dv-summary-label\">Monthly Chemical Cost<\/span>\r\n          <span class=\"dv-summary-value\" id=\"dvMaintSummaryCost\">\u2014<\/span>\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"dv-grand-total\">\r\n        <small>Estimated Monthly Basic Pool Maintenance Cost<\/small>\r\n        <strong id=\"dvMaintGrandTotal\">\u2014<\/strong>\r\n      <\/div>\r\n\r\n      <button type=\"button\" class=\"dv-pdf-button\" id=\"dvMaintPrint\">\r\n        \ud83d\udcc4 Download PDF\r\n      <\/button>\r\n\r\n      <div class=\"dv-call-request\" id=\"dvMaintCallRequest\">\r\n        <h4 class=\"dv-call-request-title\">Would you like a company consultation?<\/h4>\r\n\r\n        <p class=\"dv-call-request-text\">\r\n          Request a call from the company and they will contact you with additional information.\r\n        <\/p>\r\n\r\n        <div class=\"dv-call-request-row\" id=\"dvMaintCallRow\">\r\n\r\n          <input\r\n            class=\"dv-call-phone\"\r\n            id=\"dvMaintCallPhone\"\r\n            type=\"tel\"\r\n            inputmode=\"tel\"\r\n            autocomplete=\"tel\"\r\n            placeholder=\"e.g. 599123456\"\r\n          >\r\n\r\n          <button\r\n            class=\"dv-request-call-btn\"\r\n            id=\"dvMaintRequestCall\"\r\n            type=\"button\"\r\n          >\r\n            Request a Company Call\r\n          <\/button>\r\n\r\n        <\/div>\r\n\r\n        <div\r\n          class=\"dv-call-request-status\"\r\n          id=\"dvMaintCallStatus\"\r\n          aria-live=\"polite\"\r\n        ><\/div>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"dv-info-card\">\r\n      <h3>Important Information<\/h3>\r\n\r\n      <p id=\"dvMaintRobotNote\">\r\n        A pool robot reduces the need for mechanical cleaning; however, in this calculator\r\n        the dosage of chemicals is not automatically reduced. The quantities of chlorine and algaecide\r\n        are calculated according to the product manufacturer\u2019s dosage recommendations.\r\n      <\/p>\r\n\r\n      <p class=\"dv-source\">\r\n        Prices and base dosage data are estimates.\r\n        Prices may change, and the actual dosage depends on the condition of the water.\r\n      <\/p>\r\n    <\/div>\r\n\r\n    <div class=\"dv-partner-card\">\r\n      <div>\r\n        <h3>Pool Maintenance Products<\/h3>\r\n\r\n        <p>\r\n          A partner company offer, discount,\r\n          or direct purchase link for the required pool chemicals can be placed here.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <a class=\"dv-partner-button\" href=\"#\" onclick=\"return false;\">\r\n        Partner Offer\r\n      <\/a>\r\n    <\/div>\r\n\r\n  <\/div>\r\n\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\r\n  \"use strict\";\r\n\r\n  const root =\r\n    document.getElementById(\r\n      \"dv-pool-maintenance-calculator\"\r\n    );\r\n\r\n  if (!root) return;\r\n\r\n  const get =\r\n    (id) =>\r\n      root.querySelector(\"#\" + id);\r\n\r\n\r\n  const prices = {\r\n    chlorine56PerKg:15.01,\r\n    algicide5L:58.00,\r\n    phMinus15Kg:18.00,\r\n    phPlus1Kg:18.00\r\n  };\r\n\r\n\r\n  const usageProfiles = {\r\n\r\n    low:{\r\n      label:\"Low\",\r\n      chlorineIntervalDays:6,\r\n      algicideMlPer10m3:100\r\n    },\r\n\r\n    normal:{\r\n      label:\"Medium\",\r\n      chlorineIntervalDays:4.5,\r\n      algicideMlPer10m3:125\r\n    },\r\n\r\n    high:{\r\n      label:\"High\",\r\n      chlorineIntervalDays:3,\r\n      algicideMlPer10m3:172.5\r\n    }\r\n\r\n  };\r\n\r\n\r\n  function numberValue(id) {\r\n\r\n    const input = get(id);\r\n\r\n    if (!input) return 0;\r\n\r\n    const value =\r\n      parseFloat(\r\n        String(input.value)\r\n          .replace(\",\",\".\")\r\n      );\r\n\r\n    return Number.isFinite(value)\r\n      ? value\r\n      : 0;\r\n  }\r\n\r\n\r\n  function money(value) {\r\n\r\n    return new Intl.NumberFormat(\r\n      \"en-US\",\r\n      {\r\n        minimumFractionDigits:2,\r\n        maximumFractionDigits:2\r\n      }\r\n    ).format(value) + \" \u20be\";\r\n  }\r\n\r\n\r\n  function decimal(value,digits) {\r\n\r\n    return new Intl.NumberFormat(\r\n      \"en-US\",\r\n      {\r\n        minimumFractionDigits:digits,\r\n        maximumFractionDigits:digits\r\n      }\r\n    ).format(value);\r\n  }\r\n\r\n\r\n  function setText(id,value) {\r\n\r\n    const el = get(id);\r\n\r\n    if (el) {\r\n      el.textContent = value;\r\n    }\r\n  }\r\n\r\n\r\n  function validateMaintenanceInputs(showError) {\r\n\r\n    const length =\r\n      numberValue(\"dvMaintLength\");\r\n\r\n    const width =\r\n      numberValue(\"dvMaintWidth\");\r\n\r\n    const depth =\r\n      numberValue(\"dvMaintDepth\");\r\n\r\n\r\n    const error =\r\n      get(\"dvMaintError\");\r\n\r\n    const output =\r\n      get(\"dvMaintOutput\");\r\n\r\n\r\n    const invalid =\r\n      length <= 0 ||\r\n      width <= 0 ||\r\n      depth <= 0 ||\r\n      length > 50 ||\r\n      width > 30 ||\r\n      depth > 5;\r\n\r\n\r\n    if (invalid) {\r\n\r\n      if (error) {\r\n        error.style.display =\r\n          showError\r\n            ? \"block\"\r\n            : \"none\";\r\n      }\r\n\r\n      if (output) {\r\n        output.classList.remove(\r\n          \"dv-show\"\r\n        );\r\n      }\r\n\r\n      return false;\r\n    }\r\n\r\n\r\n    if (error) {\r\n      error.style.display = \"none\";\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n\r\n  let dvMaintClickBusy = false;\r\n\r\n\r\n  function showMaintenanceFreeNextStep() {\r\n\r\n    const box =\r\n      get(\"dvMaintFreeNextStep\");\r\n\r\n    if (box) {\r\n      box.classList.add(\"dv-show\");\r\n    }\r\n  }\r\n\r\n\r\n  function openMaintenanceRegistrationPopup() {\r\n\r\n    const redirect =\r\n      window.location.pathname +\r\n      window.location.search +\r\n      window.location.hash;\r\n\r\n\r\n    if (\r\n      typeof window.openAuthModal ===\r\n      \"function\"\r\n    ) {\r\n\r\n      window.openAuthModal(\r\n        \"register\",\r\n        redirect\r\n      );\r\n\r\n      return true;\r\n    }\r\n\r\n\r\n    const registerTrigger =\r\n      document.querySelector(\r\n        '.cpdf-auth[data-auth-action=\"register\"]'\r\n      );\r\n\r\n\r\n    if (registerTrigger) {\r\n\r\n      registerTrigger.setAttribute(\r\n        \"data-redirect\",\r\n        redirect\r\n      );\r\n\r\n      registerTrigger.click();\r\n\r\n      return true;\r\n    }\r\n\r\n\r\n    window.location.href =\r\n      \"\/en\/login\/?redirect_to=\" +\r\n      encodeURIComponent(redirect);\r\n\r\n    return false;\r\n  }\r\n\r\n\r\n  function openPackagePurchasePrompt() {\r\n\r\n    if (\r\n      typeof window.jQuery !==\r\n        \"undefined\" &&\r\n      window.jQuery(\r\n        \"#membership-modal\"\r\n      ).length\r\n    ) {\r\n\r\n      window.jQuery(\r\n        \"#membership-modal\"\r\n      ).css(\r\n        \"display\",\r\n        \"block\"\r\n      );\r\n\r\n      return true;\r\n    }\r\n\r\n\r\n    const membershipTrigger =\r\n      document.querySelector(\r\n        \"#membership-purchase-btn, .membership-purchase-btn, [data-membership-modal]\"\r\n      );\r\n\r\n\r\n    if (membershipTrigger) {\r\n\r\n      membershipTrigger.click();\r\n\r\n      return true;\r\n    }\r\n\r\n\r\n    window.location.href =\r\n      \"\/en\/packages\/\";\r\n\r\n    return false;\r\n  }\r\n\r\n\r\n  async function authorizeMaintenanceFlow() {\r\n\r\n    if (\r\n      !window.DatvaleHtmlAccess ||\r\n      typeof window.DatvaleHtmlAccess.authorize !==\r\n        \"function\"\r\n    ) {\r\n\r\n      alert(\r\n        \"The access system could not be loaded. Refresh the page and try again.\"\r\n      );\r\n\r\n      return {\r\n        allowed:false,\r\n        mode:\"error\"\r\n      };\r\n    }\r\n\r\n\r\n    const result =\r\n      await window.DatvaleHtmlAccess.authorize(\r\n        \"pool_maintenance\"\r\n      );\r\n\r\n\r\n    if (\r\n      result &&\r\n      result.success &&\r\n      result.data &&\r\n      result.data.allowed === true\r\n    ) {\r\n\r\n      return {\r\n        allowed:true,\r\n        mode:\r\n          result.data.mode ||\r\n          \"membership\"\r\n      };\r\n    }\r\n\r\n\r\n    const data =\r\n      result && result.data\r\n        ? result.data\r\n        : {};\r\n\r\n\r\n    if (\r\n      data.code === \"login_required\"\r\n    ) {\r\n\r\n      openMaintenanceRegistrationPopup();\r\n\r\n      return {\r\n        allowed:false,\r\n        mode:\"login_required\"\r\n      };\r\n    }\r\n\r\n\r\n    if (\r\n      data.code ===\r\n      \"package_required\"\r\n    ) {\r\n\r\n      openPackagePurchasePrompt();\r\n\r\n      return {\r\n        allowed:false,\r\n        mode:\"package_required\"\r\n      };\r\n    }\r\n\r\n\r\n    alert(\r\n      data.message ||\r\n      \"Unable to verify access. Please try again.\"\r\n    );\r\n\r\n\r\n    return {\r\n      allowed:false,\r\n      mode:\"error\"\r\n    };\r\n  }\r\n\r\n\r\n  async function claimMaintenanceFreeCalculation() {\r\n\r\n    if (\r\n      !window.DatvaleHtmlAccess ||\r\n      typeof window.DatvaleHtmlAccess.claimFree !==\r\n        \"function\"\r\n    ) {\r\n\r\n      return false;\r\n    }\r\n\r\n\r\n    const result =\r\n      await window.DatvaleHtmlAccess.claimFree(\r\n        \"pool_maintenance\"\r\n      );\r\n\r\n\r\n    return !!(\r\n      result &&\r\n      result.success &&\r\n      result.data &&\r\n      result.data.claimed === true\r\n    );\r\n  }\r\n\r\n\r\n  function calculate(showError) {\r\n\r\n    const length =\r\n      numberValue(\"dvMaintLength\");\r\n\r\n    const width =\r\n      numberValue(\"dvMaintWidth\");\r\n\r\n    const depth =\r\n      numberValue(\"dvMaintDepth\");\r\n\r\n\r\n    const error =\r\n      get(\"dvMaintError\");\r\n\r\n    const output =\r\n      get(\"dvMaintOutput\");\r\n\r\n\r\n    if (\r\n      length <= 0 ||\r\n      width <= 0 ||\r\n      depth <= 0 ||\r\n      length > 50 ||\r\n      width > 30 ||\r\n      depth > 5\r\n    ) {\r\n\r\n      if (\r\n        error &&\r\n        showError\r\n      ) {\r\n        error.style.display =\r\n          \"block\";\r\n      }\r\n\r\n      if (output) {\r\n        output.classList.remove(\r\n          \"dv-show\"\r\n        );\r\n      }\r\n\r\n      return false;\r\n    }\r\n\r\n\r\n    if (error) {\r\n      error.style.display = \"none\";\r\n    }\r\n\r\n\r\n    const volume =\r\n      length *\r\n      width *\r\n      depth;\r\n\r\n\r\n    const usageKey =\r\n      get(\"dvMaintUsage\").value;\r\n\r\n\r\n    const usage =\r\n      usageProfiles[usageKey] ||\r\n      usageProfiles.normal;\r\n\r\n\r\n    const robot =\r\n      get(\"dvMaintRobot\").value ===\r\n      \"yes\";\r\n\r\n\r\n    const chlorineDoseGrams =\r\n      35 *\r\n      (volume \/ 10);\r\n\r\n\r\n    const chlorineDosesPerMonth =\r\n      30 \/\r\n      usage.chlorineIntervalDays;\r\n\r\n\r\n    const chlorineMonthlyKg =\r\n      (\r\n        chlorineDoseGrams *\r\n        chlorineDosesPerMonth\r\n      ) \/\r\n      1000;\r\n\r\n\r\n    const chlorineMonthlyCost =\r\n      chlorineMonthlyKg *\r\n      prices.chlorine56PerKg;\r\n\r\n\r\n    const algicideDoseMl =\r\n      usage.algicideMlPer10m3 *\r\n      (volume \/ 10);\r\n\r\n\r\n    const algicideMonthlyLiters =\r\n      (\r\n        algicideDoseMl *\r\n        2\r\n      ) \/\r\n      1000;\r\n\r\n\r\n    const algicidePricePerLiter =\r\n      prices.algicide5L \/\r\n      5;\r\n\r\n\r\n    const algicideMonthlyCost =\r\n      algicideMonthlyLiters *\r\n      algicidePricePerLiter;\r\n\r\n\r\n    const ph =\r\n      numberValue(\"dvMaintPh\");\r\n\r\n\r\n    let phAction =\r\n      \"pH Not Provided\";\r\n\r\n    let phQtyText =\r\n      \"\u2014\";\r\n\r\n    let phCostText =\r\n      \"\u2014\";\r\n\r\n\r\n    if (ph > 0) {\r\n\r\n      setText(\r\n        \"dvMaintPhValue\",\r\n        decimal(ph,1)\r\n      );\r\n\r\n\r\n      if (ph > 7.4) {\r\n\r\n        const steps =\r\n          (ph - 7.4) \/\r\n          0.2;\r\n\r\n\r\n        const grams =\r\n          150 *\r\n          (volume \/ 10) *\r\n          steps;\r\n\r\n\r\n        const kg =\r\n          grams \/\r\n          1000;\r\n\r\n\r\n        const pricePerKg =\r\n          prices.phMinus15Kg \/\r\n          1.5;\r\n\r\n\r\n        const cost =\r\n          kg *\r\n          pricePerKg;\r\n\r\n\r\n        phAction =\r\n          \"pH MINUS\";\r\n\r\n        phQtyText =\r\n          decimal(kg,2) +\r\n          \" kg\";\r\n\r\n        phCostText =\r\n          money(cost);\r\n\r\n\r\n      } else if (ph < 7.0) {\r\n\r\n        const steps =\r\n          (7.0 - ph) \/\r\n          0.2;\r\n\r\n\r\n        const grams =\r\n          100 *\r\n          (volume \/ 10) *\r\n          steps;\r\n\r\n\r\n        const kg =\r\n          grams \/\r\n          1000;\r\n\r\n\r\n        const pricePerKg =\r\n          prices.phPlus1Kg;\r\n\r\n\r\n        const cost =\r\n          kg *\r\n          pricePerKg;\r\n\r\n\r\n        phAction =\r\n          \"pH PLUS\";\r\n\r\n        phQtyText =\r\n          decimal(kg,2) +\r\n          \" kg\";\r\n\r\n        phCostText =\r\n          money(cost);\r\n\r\n\r\n      } else {\r\n\r\n        phAction =\r\n          \"No adjustment is required\";\r\n\r\n        phQtyText =\r\n          \"0\";\r\n\r\n        phCostText =\r\n          money(0);\r\n      }\r\n\r\n\r\n    } else {\r\n\r\n      setText(\r\n        \"dvMaintPhValue\",\r\n        \"Not Provided\"\r\n      );\r\n    }\r\n\r\n\r\n    const monthlyTotal =\r\n      chlorineMonthlyCost +\r\n      algicideMonthlyCost;\r\n\r\n\r\n    setText(\r\n      \"dvMaintVolume\",\r\n      decimal(volume,1) +\r\n      \" m\u00b3\"\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintUsageText\",\r\n      usage.label\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintRobotText\",\r\n      robot\r\n        ? \"Yes\"\r\n        : \"No\"\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintChlorineDose\",\r\n      decimal(\r\n        chlorineDoseGrams,\r\n        0\r\n      ) +\r\n      \" g\"\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintChlorineDoses\",\r\n      decimal(\r\n        chlorineDosesPerMonth,\r\n        1\r\n      ) +\r\n      \" times\"\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintChlorineQty\",\r\n      decimal(\r\n        chlorineMonthlyKg,\r\n        2\r\n      ) +\r\n      \" kg\"\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintChlorineCost\",\r\n      money(\r\n        chlorineMonthlyCost\r\n      )\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintAlgDose\",\r\n      decimal(\r\n        algicideDoseMl,\r\n        0\r\n      ) +\r\n      \" ml\"\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintAlgQty\",\r\n      decimal(\r\n        algicideMonthlyLiters,\r\n        2\r\n      ) +\r\n      \" L\"\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintAlgCost\",\r\n      money(\r\n        algicideMonthlyCost\r\n      )\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintPhAction\",\r\n      phAction\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintPhQty\",\r\n      phQtyText\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintPhCost\",\r\n      phCostText\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintSummaryVolume\",\r\n      decimal(volume,1) +\r\n      \" m\u00b3\"\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintSummaryChlorine\",\r\n      decimal(\r\n        chlorineMonthlyKg,\r\n        2\r\n      ) +\r\n      \" kg\"\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintSummaryAlg\",\r\n      decimal(\r\n        algicideMonthlyLiters,\r\n        2\r\n      ) +\r\n      \" L\"\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintSummaryCost\",\r\n      money(monthlyTotal)\r\n    );\r\n\r\n\r\n    setText(\r\n      \"dvMaintGrandTotal\",\r\n      money(monthlyTotal)\r\n    );\r\n\r\n\r\n    const robotNote =\r\n      get(\"dvMaintRobotNote\");\r\n\r\n\r\n    if (robotNote) {\r\n\r\n      robotNote.textContent =\r\n        robot\r\n          ? \"You use a pool robot. The robot reduces the need for mechanical cleaning of the pool floor and walls, but the chemical dosage has intentionally not been reduced.\"\r\n          : \"Without a pool robot, the pool floor and walls will require more frequent mechanical cleaning. The quantities of chlorine and algaecide are calculated based on the specified dosage data.\";\r\n    }\r\n\r\n\r\n    if (output) {\r\n\r\n      output.classList.add(\r\n        \"dv-show\"\r\n      );\r\n\r\n\r\n      window.setTimeout(\r\n        function () {\r\n\r\n          output.scrollIntoView({\r\n            behavior:\"smooth\",\r\n            block:\"start\"\r\n          });\r\n\r\n        },\r\n        80\r\n      );\r\n    }\r\n\r\n\r\n    return true;\r\n  }\r\n\r\n\r\n  const calculateButton =\r\n    get(\r\n      \"dvMaintCalculateFreeFlowV2\"\r\n    );\r\n\r\n\r\n  if (calculateButton) {\r\n\r\n    calculateButton.addEventListener(\r\n      \"click\",\r\n      async function (event) {\r\n\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        event.stopImmediatePropagation();\r\n\r\n\r\n        if (\r\n          dvMaintClickBusy\r\n        ) {\r\n          return;\r\n        }\r\n\r\n\r\n        if (\r\n          !validateMaintenanceInputs(\r\n            true\r\n          )\r\n        ) {\r\n          return;\r\n        }\r\n\r\n\r\n        dvMaintClickBusy =\r\n          true;\r\n\r\n\r\n        const originalText =\r\n          calculateButton.textContent;\r\n\r\n\r\n        calculateButton.disabled =\r\n          true;\r\n\r\n\r\n        calculateButton.textContent =\r\n          \"Checking access...\";\r\n\r\n\r\n        try {\r\n\r\n          const access =\r\n            await authorizeMaintenanceFlow();\r\n\r\n\r\n          if (\r\n            !access ||\r\n            !access.allowed\r\n          ) {\r\n            return;\r\n          }\r\n\r\n\r\n          const success =\r\n            calculate(true);\r\n\r\n\r\n          if (!success) {\r\n            return;\r\n          }\r\n\r\n\r\n          triggerMaintenanceCompletedSms();\r\n\r\n\r\n          if (\r\n            access.mode === \"free\"\r\n          ) {\r\n\r\n            const claimed =\r\n              await claimMaintenanceFreeCalculation();\r\n\r\n\r\n            if (claimed) {\r\n\r\n              showMaintenanceFreeNextStep();\r\n            }\r\n\r\n          }\r\n\r\n\r\n        } finally {\r\n\r\n          calculateButton.disabled =\r\n            false;\r\n\r\n\r\n          calculateButton.textContent =\r\n            originalText;\r\n\r\n\r\n          dvMaintClickBusy =\r\n            false;\r\n        }\r\n\r\n      },\r\n      true\r\n    );\r\n  }\r\n\r\n\r\n  const dvMaintCallRequest =\r\n    get(\r\n      \"dvMaintCallRequest\"\r\n    );\r\n\r\n  const dvMaintRequestCall =\r\n    get(\r\n      \"dvMaintRequestCall\"\r\n    );\r\n\r\n  const dvMaintCallPhone =\r\n    get(\r\n      \"dvMaintCallPhone\"\r\n    );\r\n\r\n  const dvMaintCallStatus =\r\n    get(\r\n      \"dvMaintCallStatus\"\r\n    );\r\n\r\n  const dvMaintCallRow =\r\n    get(\r\n      \"dvMaintCallRow\"\r\n    );\r\n\r\n\r\n  let dvMaintCallConfig = {\r\n    enabled:false,\r\n    isLoggedIn:false,\r\n    hasSavedPhone:false\r\n  };\r\n\r\n\r\n  function maintenanceAjaxUrl() {\r\n\r\n    return (\r\n      window.cpdf_auth &&\r\n      window.cpdf_auth.ajaxurl\r\n    )\r\n      ? window.cpdf_auth.ajaxurl\r\n      : \"\/wp-admin\/admin-ajax.php\";\r\n  }\r\n\r\n\r\n  function setMaintCallStatus(\r\n    message,\r\n    type\r\n  ) {\r\n\r\n    if (\r\n      !dvMaintCallStatus\r\n    ) {\r\n      return;\r\n    }\r\n\r\n\r\n    dvMaintCallStatus.textContent =\r\n      message ||\r\n      \"\";\r\n\r\n\r\n    dvMaintCallStatus.classList.remove(\r\n      \"dv-success\",\r\n      \"dv-error\"\r\n    );\r\n\r\n\r\n    if (type) {\r\n\r\n      dvMaintCallStatus.classList.add(\r\n        type === \"success\"\r\n          ? \"dv-success\"\r\n          : \"dv-error\"\r\n      );\r\n    }\r\n  }\r\n\r\n\r\n  function syncMaintCallPhoneVisibility() {\r\n\r\n    const useSavedPhone =\r\n      dvMaintCallConfig.isLoggedIn &&\r\n      dvMaintCallConfig.hasSavedPhone;\r\n\r\n\r\n    if (\r\n      dvMaintCallRow\r\n    ) {\r\n\r\n      dvMaintCallRow.classList.toggle(\r\n        \"dv-has-saved-phone\",\r\n        useSavedPhone\r\n      );\r\n    }\r\n\r\n\r\n    if (\r\n      dvMaintCallPhone\r\n    ) {\r\n\r\n      dvMaintCallPhone.required =\r\n        !useSavedPhone;\r\n\r\n\r\n      if (\r\n        useSavedPhone\r\n      ) {\r\n        dvMaintCallPhone.value =\r\n          \"\";\r\n      }\r\n    }\r\n  }\r\n\r\n\r\n  async function loadMaintCallConfig() {\r\n\r\n    try {\r\n\r\n      const response =\r\n        await fetch(\r\n          maintenanceAjaxUrl() +\r\n          \"?action=gosms_call_request_config&calculator=pool_maintenance&_=\" +\r\n          Date.now(),\r\n          {\r\n            method:\"GET\",\r\n            credentials:\"same-origin\",\r\n            cache:\"no-store\"\r\n          }\r\n        );\r\n\r\n\r\n      const json =\r\n        await response.json();\r\n\r\n\r\n      if (\r\n        !json ||\r\n        !json.success ||\r\n        !json.data\r\n      ) {\r\n        return;\r\n      }\r\n\r\n\r\n      dvMaintCallConfig = {\r\n        enabled:\r\n          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\r\n      if (\r\n        dvMaintCallRequest\r\n      ) {\r\n\r\n        dvMaintCallRequest.style.display =\r\n          dvMaintCallConfig.enabled\r\n            ? \"block\"\r\n            : \"none\";\r\n      }\r\n\r\n\r\n      syncMaintCallPhoneVisibility();\r\n\r\n\r\n    } catch (error) {\r\n\r\n      if (\r\n        dvMaintCallRequest\r\n      ) {\r\n\r\n        dvMaintCallRequest.style.display =\r\n          \"none\";\r\n      }\r\n    }\r\n  }\r\n\r\n\r\n  async function requestMaintCompanyCall() {\r\n\r\n    if (\r\n      !dvMaintRequestCall ||\r\n      !dvMaintCallConfig.enabled\r\n    ) {\r\n      return;\r\n    }\r\n\r\n\r\n    const useSavedPhone =\r\n      dvMaintCallConfig.isLoggedIn &&\r\n      dvMaintCallConfig.hasSavedPhone;\r\n\r\n\r\n    const phone =\r\n      !useSavedPhone &&\r\n      dvMaintCallPhone\r\n        ? String(\r\n            dvMaintCallPhone.value ||\r\n            \"\"\r\n          ).trim()\r\n        : \"\";\r\n\r\n\r\n    if (\r\n      !useSavedPhone &&\r\n      !phone\r\n    ) {\r\n\r\n      setMaintCallStatus(\r\n        \"Please enter a phone number, e.g. 599123456\",\r\n        \"error\"\r\n      );\r\n\r\n\r\n      if (\r\n        dvMaintCallPhone\r\n      ) {\r\n        dvMaintCallPhone.focus();\r\n      }\r\n\r\n      return;\r\n    }\r\n\r\n\r\n    const originalText =\r\n      dvMaintRequestCall.textContent;\r\n\r\n\r\n    dvMaintRequestCall.disabled =\r\n      true;\r\n\r\n\r\n    dvMaintRequestCall.textContent =\r\n      \"Sending...\";\r\n\r\n\r\n    setMaintCallStatus(\r\n      \"\",\r\n      null\r\n    );\r\n\r\n\r\n    try {\r\n\r\n      const body =\r\n        new URLSearchParams();\r\n\r\n\r\n      body.set(\r\n        \"action\",\r\n        \"gosms_request_call\"\r\n      );\r\n\r\n\r\n      body.set(\r\n        \"calculator\",\r\n        \"pool_maintenance\"\r\n      );\r\n\r\n\r\n      if (phone) {\r\n\r\n        body.set(\r\n          \"phone\",\r\n          phone\r\n        );\r\n      }\r\n\r\n\r\n      const response =\r\n        await fetch(\r\n          maintenanceAjaxUrl(),\r\n          {\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:\r\n              body.toString()\r\n          }\r\n        );\r\n\r\n\r\n      const json =\r\n        await response.json();\r\n\r\n\r\n      if (\r\n        json &&\r\n        json.success\r\n      ) {\r\n\r\n        setMaintCallStatus(\r\n          json.data &&\r\n          json.data.message\r\n            ? json.data.message\r\n            : \"Your request has been received. You will be contacted soon.\",\r\n          \"success\"\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      const data =\r\n        json &&\r\n        json.data\r\n          ? json.data\r\n          : {};\r\n\r\n\r\n      if (\r\n        data &&\r\n        data.disabled\r\n      ) {\r\n\r\n        dvMaintCallConfig.enabled =\r\n          false;\r\n\r\n\r\n        if (\r\n          dvMaintCallRequest\r\n        ) {\r\n\r\n          dvMaintCallRequest.style.display =\r\n            \"none\";\r\n        }\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      if (\r\n        data &&\r\n        data.need_phone\r\n      ) {\r\n\r\n        dvMaintCallConfig.hasSavedPhone =\r\n          false;\r\n\r\n\r\n        syncMaintCallPhoneVisibility();\r\n\r\n\r\n        setMaintCallStatus(\r\n          data.message ||\r\n          \"Please enter a phone number.\",\r\n          \"error\"\r\n        );\r\n\r\n\r\n        if (\r\n          dvMaintCallPhone\r\n        ) {\r\n          dvMaintCallPhone.focus();\r\n        }\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      setMaintCallStatus(\r\n        data.message ||\r\n        \"Unable to send the request.\",\r\n        \"error\"\r\n      );\r\n\r\n\r\n    } catch (error) {\r\n\r\n      setMaintCallStatus(\r\n        \"An error occurred. Please try again.\",\r\n        \"error\"\r\n      );\r\n\r\n\r\n    } finally {\r\n\r\n      dvMaintRequestCall.disabled =\r\n        false;\r\n\r\n\r\n      dvMaintRequestCall.textContent =\r\n        originalText;\r\n    }\r\n  }\r\n\r\n\r\n  if (\r\n    dvMaintRequestCall\r\n  ) {\r\n\r\n    dvMaintRequestCall.addEventListener(\r\n      \"click\",\r\n      requestMaintCompanyCall\r\n    );\r\n  }\r\n\r\n\r\n  loadMaintCallConfig();\r\n\r\n\r\n  function triggerMaintenanceCompletedSms() {\r\n\r\n    try {\r\n\r\n      fetch(\r\n        maintenanceAjaxUrl(),\r\n        {\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:\r\n            new URLSearchParams({\r\n              action:\r\n                \"gosms_calculation_completed\",\r\n              calculator:\r\n                \"pool_maintenance\"\r\n            }).toString()\r\n        }\r\n      ).catch(function(){});\r\n\r\n    } catch(error) {}\r\n  }\r\n\r\n\r\n  const printButton =\r\n    get(\r\n      \"dvMaintPrint\"\r\n    );\r\n\r\n\r\n  if (printButton) {\r\n\r\n    printButton.addEventListener(\r\n      \"click\",\r\n      async function () {\r\n\r\n        if (\r\n          !get(\"dvMaintOutput\") ||\r\n          !get(\"dvMaintOutput\")\r\n            .classList\r\n            .contains(\"dv-show\")\r\n        ) {\r\n          return;\r\n        }\r\n\r\n\r\n        if (\r\n          !window.jspdf ||\r\n          !window.jspdf.jsPDF\r\n        ) {\r\n\r\n          alert(\r\n            \"The PDF module could not be loaded. Refresh the page and try again.\"\r\n          );\r\n\r\n          return;\r\n        }\r\n\r\n\r\n        const originalHTML =\r\n          printButton.innerHTML;\r\n\r\n\r\n        printButton.disabled =\r\n          true;\r\n\r\n\r\n        printButton.innerHTML =\r\n          \"Creating PDF...\";\r\n\r\n\r\n        try {\r\n\r\n          const {\r\n            jsPDF\r\n          } =\r\n            window.jspdf;\r\n\r\n\r\n          const doc =\r\n            new jsPDF({\r\n              unit:\"mm\",\r\n              format:\"a4\",\r\n              orientation:\"portrait\"\r\n            });\r\n\r\n\r\n          const pageWidth =\r\n            doc.internal.pageSize.getWidth();\r\n\r\n\r\n          const pageHeight =\r\n            doc.internal.pageSize.getHeight();\r\n\r\n\r\n          const marginX =\r\n            12;\r\n\r\n\r\n          const contentWidth =\r\n            pageWidth -\r\n            marginX * 2;\r\n\r\n\r\n          const blue =\r\n            [11,58,120];\r\n\r\n\r\n          const lightBlue =\r\n            [244,248,253];\r\n\r\n\r\n          const border =\r\n            [216,227,239];\r\n\r\n\r\n          const green =\r\n            [19,121,91];\r\n\r\n\r\n          let y =\r\n            12;\r\n\r\n\r\n          function ensureSpace(\r\n            neededHeight\r\n          ) {\r\n\r\n            if (\r\n              y +\r\n              neededHeight >\r\n              pageHeight -\r\n              12\r\n            ) {\r\n\r\n              doc.addPage();\r\n\r\n              y =\r\n                12;\r\n            }\r\n          }\r\n\r\n\r\n          async function addTextImage(\r\n            text,\r\n            x,\r\n            yPos,\r\n            widthPx,\r\n            widthMm,\r\n            options\r\n          ) {\r\n\r\n            options =\r\n              options ||\r\n              {};\r\n\r\n\r\n            const canvas =\r\n              document.createElement(\r\n                \"canvas\"\r\n              );\r\n\r\n\r\n            const ctx =\r\n              canvas.getContext(\r\n                \"2d\"\r\n              );\r\n\r\n\r\n            const scale =\r\n              2;\r\n\r\n\r\n            const fontSize =\r\n              options.fontSize ||\r\n              18;\r\n\r\n\r\n            const fontWeight =\r\n              options.fontWeight ||\r\n              700;\r\n\r\n\r\n            const padding =\r\n              5;\r\n\r\n\r\n            const lineHeight =\r\n              fontSize *\r\n              1.45;\r\n\r\n\r\n            ctx.font =\r\n              fontWeight +\r\n              \" \" +\r\n              fontSize +\r\n              'px \"Segoe UI\", Arial, sans-serif';\r\n\r\n\r\n            const words =\r\n              String(\r\n                text ||\r\n                \"\"\r\n              ).split(\/\\s+\/);\r\n\r\n\r\n            const lines =\r\n              [];\r\n\r\n\r\n            let current =\r\n              \"\";\r\n\r\n\r\n            for (\r\n              const word of words\r\n            ) {\r\n\r\n              const test =\r\n                current\r\n                  ? current +\r\n                    \" \" +\r\n                    word\r\n                  : word;\r\n\r\n\r\n              if (\r\n                ctx.measureText(\r\n                  test\r\n                ).width >\r\n                widthPx -\r\n                padding *\r\n                2\r\n              ) {\r\n\r\n                if (current) {\r\n                  lines.push(\r\n                    current\r\n                  );\r\n                }\r\n\r\n                current =\r\n                  word;\r\n\r\n              } else {\r\n\r\n                current =\r\n                  test;\r\n              }\r\n            }\r\n\r\n\r\n            if (current) {\r\n\r\n              lines.push(\r\n                current\r\n              );\r\n            }\r\n\r\n\r\n            canvas.width =\r\n              widthPx *\r\n              scale;\r\n\r\n\r\n            canvas.height =\r\n              Math.max(\r\n                34,\r\n                (\r\n                  lines.length *\r\n                  lineHeight +\r\n                  padding *\r\n                  2\r\n                ) *\r\n                scale\r\n              );\r\n\r\n\r\n            const ctx2 =\r\n              canvas.getContext(\r\n                \"2d\"\r\n              );\r\n\r\n\r\n            ctx2.scale(\r\n              scale,\r\n              scale\r\n            );\r\n\r\n\r\n            ctx2.fillStyle =\r\n              options.color ||\r\n              \"#173558\";\r\n\r\n\r\n            ctx2.font =\r\n              fontWeight +\r\n              \" \" +\r\n              fontSize +\r\n              'px \"Segoe UI\", Arial, sans-serif';\r\n\r\n\r\n            ctx2.textBaseline =\r\n              \"top\";\r\n\r\n\r\n            let align =\r\n              options.align ||\r\n              \"left\";\r\n\r\n\r\n            for (\r\n              let i = 0;\r\n              i <\r\n              lines.length;\r\n              i++\r\n            ) {\r\n\r\n              const line =\r\n                lines[i];\r\n\r\n\r\n              let dx =\r\n                padding;\r\n\r\n\r\n              const lineWidth =\r\n                ctx2.measureText(\r\n                  line\r\n                ).width;\r\n\r\n\r\n              if (\r\n                align ===\r\n                \"center\"\r\n              ) {\r\n\r\n                dx =\r\n                  (\r\n                    widthPx -\r\n                    lineWidth\r\n                  ) \/\r\n                  2;\r\n\r\n              } else if (\r\n                align ===\r\n                \"right\"\r\n              ) {\r\n\r\n                dx =\r\n                  widthPx -\r\n                  lineWidth -\r\n                  padding;\r\n              }\r\n\r\n\r\n              ctx2.fillText(\r\n                line,\r\n                dx,\r\n                padding +\r\n                i *\r\n                lineHeight\r\n              );\r\n            }\r\n\r\n\r\n            const heightMm =\r\n              widthMm *\r\n              (\r\n                canvas.height \/\r\n                canvas.width\r\n              );\r\n\r\n\r\n            doc.addImage(\r\n              canvas.toDataURL(\r\n                \"image\/png\"\r\n              ),\r\n              \"PNG\",\r\n              x,\r\n              yPos,\r\n              widthMm,\r\n              heightMm,\r\n              undefined,\r\n              \"FAST\"\r\n            );\r\n\r\n\r\n            return heightMm;\r\n          }\r\n\r\n\r\n          doc.setFillColor(\r\n            ...blue\r\n          );\r\n\r\n\r\n          doc.roundedRect(\r\n            marginX,\r\n            y,\r\n            contentWidth,\r\n            20,\r\n            2,\r\n            2,\r\n            \"F\"\r\n          );\r\n\r\n\r\n          await addTextImage(\r\n            \"Datvale.ge \u2014 Pool Maintenance Cost Estimate\",\r\n            marginX +\r\n            2,\r\n            y +\r\n            3,\r\n            1000,\r\n            contentWidth -\r\n            4,\r\n            {\r\n              fontSize:23,\r\n              fontWeight:800,\r\n              color:\"#ffffff\",\r\n              align:\"center\"\r\n            }\r\n          );\r\n\r\n\r\n          y +=\r\n            27;\r\n\r\n\r\n          const cards =\r\n            Array.from(\r\n              get(\r\n                \"dvMaintOutput\"\r\n              ).querySelectorAll(\r\n                \".dv-result-card\"\r\n              )\r\n            );\r\n\r\n\r\n          for (\r\n            const card of cards\r\n          ) {\r\n\r\n            const titleSource =\r\n              card.querySelector(\r\n                \".dv-result-head h3\"\r\n              );\r\n\r\n\r\n            const rows =\r\n              Array.from(\r\n                card.querySelectorAll(\r\n                  \".dv-row\"\r\n                )\r\n              );\r\n\r\n\r\n            const totalSource =\r\n              card.querySelector(\r\n                \".dv-card-total\"\r\n              );\r\n\r\n\r\n            const estimatedHeight =\r\n              13 +\r\n              rows.length *\r\n              12 +\r\n              (\r\n                totalSource\r\n                  ? 13\r\n                  : 4\r\n              );\r\n\r\n\r\n            ensureSpace(\r\n              estimatedHeight\r\n            );\r\n\r\n\r\n            doc.setDrawColor(\r\n              ...border\r\n            );\r\n\r\n\r\n            doc.roundedRect(\r\n              marginX,\r\n              y,\r\n              contentWidth,\r\n              estimatedHeight,\r\n              2,\r\n              2,\r\n              \"S\"\r\n            );\r\n\r\n\r\n            doc.setFillColor(\r\n              ...blue\r\n            );\r\n\r\n\r\n            doc.roundedRect(\r\n              marginX,\r\n              y,\r\n              contentWidth,\r\n              9,\r\n              2,\r\n              2,\r\n              \"F\"\r\n            );\r\n\r\n\r\n            await addTextImage(\r\n              titleSource\r\n                ? titleSource.textContent.trim()\r\n                : \"\",\r\n              marginX +\r\n              2,\r\n              y +\r\n              .7,\r\n              850,\r\n              contentWidth -\r\n              4,\r\n              {\r\n                fontSize:20,\r\n                fontWeight:800,\r\n                color:\"#ffffff\",\r\n                align:\"left\"\r\n              }\r\n            );\r\n\r\n\r\n            y +=\r\n              11;\r\n\r\n\r\n            for (\r\n              const row of rows\r\n            ) {\r\n\r\n              const nameSource =\r\n                row.querySelector(\r\n                  \".dv-row-name\"\r\n                );\r\n\r\n\r\n              const valueSource =\r\n                row.querySelector(\r\n                  \".dv-row-value\"\r\n                );\r\n\r\n\r\n              await addTextImage(\r\n                nameSource\r\n                  ? nameSource.textContent.trim()\r\n                  : \"\",\r\n                marginX +\r\n                3,\r\n                y +\r\n                .7,\r\n                900,\r\n                contentWidth *\r\n                .68,\r\n                {\r\n                  fontSize:18,\r\n                  fontWeight:700,\r\n                  color:\"#173558\",\r\n                  align:\"left\"\r\n                }\r\n              );\r\n\r\n\r\n              await addTextImage(\r\n                valueSource\r\n                  ? valueSource.textContent.trim()\r\n                  : \"\",\r\n                marginX +\r\n                contentWidth *\r\n                .70,\r\n                y +\r\n                .7,\r\n                400,\r\n                contentWidth *\r\n                .27,\r\n                {\r\n                  fontSize:18,\r\n                  fontWeight:800,\r\n                  color:\"#071f39\",\r\n                  align:\"right\"\r\n                }\r\n              );\r\n\r\n\r\n              doc.setDrawColor(\r\n                225,\r\n                233,\r\n                242\r\n              );\r\n\r\n\r\n              doc.line(\r\n                marginX +\r\n                3,\r\n                y +\r\n                9,\r\n                marginX +\r\n                contentWidth -\r\n                3,\r\n                y +\r\n                9\r\n              );\r\n\r\n\r\n              y +=\r\n                12;\r\n            }\r\n\r\n\r\n            if (\r\n              totalSource\r\n            ) {\r\n\r\n              doc.setFillColor(\r\n                ...lightBlue\r\n              );\r\n\r\n\r\n              doc.setDrawColor(\r\n                ...border\r\n              );\r\n\r\n\r\n              doc.roundedRect(\r\n                marginX +\r\n                3,\r\n                y,\r\n                contentWidth -\r\n                6,\r\n                10,\r\n                1.5,\r\n                1.5,\r\n                \"FD\"\r\n              );\r\n\r\n\r\n              await addTextImage(\r\n                totalSource.textContent\r\n                  .replace(\/\\s+\/g,\" \")\r\n                  .trim(),\r\n                marginX +\r\n                4,\r\n                y +\r\n                .8,\r\n                900,\r\n                contentWidth -\r\n                8,\r\n                {\r\n                  fontSize:18,\r\n                  fontWeight:800,\r\n                  color:\"#071f39\",\r\n                  align:\"right\"\r\n                }\r\n              );\r\n\r\n\r\n              y +=\r\n                12;\r\n\r\n\r\n            } else {\r\n\r\n              y +=\r\n                3;\r\n            }\r\n\r\n\r\n            y +=\r\n              4;\r\n          }\r\n\r\n\r\n          ensureSpace(\r\n            52\r\n          );\r\n\r\n\r\n          await addTextImage(\r\n            \"Monthly Maintenance Summary\",\r\n            marginX,\r\n            y,\r\n            850,\r\n            contentWidth,\r\n            {\r\n              fontSize:23,\r\n              fontWeight:800,\r\n              color:\"#071f39\",\r\n              align:\"left\"\r\n            }\r\n          );\r\n\r\n\r\n          y +=\r\n            12;\r\n\r\n\r\n          const summaryItems =\r\n            Array.from(\r\n              get(\r\n                \"dvMaintOutput\"\r\n              ).querySelectorAll(\r\n                \".dv-summary-item\"\r\n              )\r\n            );\r\n\r\n\r\n          const sGap =\r\n            3;\r\n\r\n\r\n          const sBoxWidth =\r\n            (\r\n              contentWidth -\r\n              sGap *\r\n              3\r\n            ) \/\r\n            4;\r\n\r\n\r\n          for (\r\n            let i = 0;\r\n            i <\r\n            summaryItems.length;\r\n            i++\r\n          ) {\r\n\r\n            const item =\r\n              summaryItems[i];\r\n\r\n\r\n            const labelSource =\r\n              item.querySelector(\r\n                \".dv-summary-label\"\r\n              );\r\n\r\n\r\n            const valueSource =\r\n              item.querySelector(\r\n                \".dv-summary-value\"\r\n              );\r\n\r\n\r\n            const x =\r\n              marginX +\r\n              i *\r\n              (\r\n                sBoxWidth +\r\n                sGap\r\n              );\r\n\r\n\r\n            doc.setFillColor(\r\n              ...lightBlue\r\n            );\r\n\r\n\r\n            doc.setDrawColor(\r\n              ...border\r\n            );\r\n\r\n\r\n            doc.roundedRect(\r\n              x,\r\n              y,\r\n              sBoxWidth,\r\n              18,\r\n              2,\r\n              2,\r\n              \"FD\"\r\n            );\r\n\r\n\r\n            await addTextImage(\r\n              labelSource\r\n                ? labelSource.textContent.trim()\r\n                : \"\",\r\n              x +\r\n              1.5,\r\n              y +\r\n              1.5,\r\n              420,\r\n              sBoxWidth -\r\n              3,\r\n              {\r\n                fontSize:16,\r\n                fontWeight:800,\r\n                color:\"#071f39\",\r\n                align:\"center\"\r\n              }\r\n            );\r\n\r\n\r\n            await addTextImage(\r\n              valueSource\r\n                ? valueSource.textContent.trim()\r\n                : \"\",\r\n              x +\r\n              1.5,\r\n              y +\r\n              8.5,\r\n              420,\r\n              sBoxWidth -\r\n              3,\r\n              {\r\n                fontSize:18,\r\n                fontWeight:800,\r\n                color:\"#071f39\",\r\n                align:\"center\"\r\n              }\r\n            );\r\n          }\r\n\r\n\r\n          y +=\r\n            22;\r\n\r\n\r\n          ensureSpace(\r\n            27\r\n          );\r\n\r\n\r\n          doc.setFillColor(\r\n            ...green\r\n          );\r\n\r\n\r\n          doc.roundedRect(\r\n            marginX,\r\n            y,\r\n            contentWidth,\r\n            20,\r\n            2,\r\n            2,\r\n            \"F\"\r\n          );\r\n\r\n\r\n          await addTextImage(\r\n            \"Estimated Monthly Basic Pool Maintenance Cost\",\r\n            marginX +\r\n            2,\r\n            y +\r\n            2,\r\n            850,\r\n            contentWidth -\r\n            4,\r\n            {\r\n              fontSize:13,\r\n              fontWeight:700,\r\n              color:\"#ffffff\",\r\n              align:\"center\"\r\n            }\r\n          );\r\n\r\n\r\n          await addTextImage(\r\n            get(\r\n              \"dvMaintGrandTotal\"\r\n            ).textContent.trim(),\r\n            marginX +\r\n            2,\r\n            y +\r\n            9,\r\n            850,\r\n            contentWidth -\r\n            4,\r\n            {\r\n              fontSize:34,\r\n              fontWeight:800,\r\n              color:\"#ffffff\",\r\n              align:\"center\"\r\n            }\r\n          );\r\n\r\n\r\n          y +=\r\n            24;\r\n\r\n\r\n          ensureSpace(\r\n            28\r\n          );\r\n\r\n\r\n          await addTextImage(\r\n            \"Important Information\",\r\n            marginX,\r\n            y,\r\n            850,\r\n            contentWidth,\r\n            {\r\n              fontSize:20,\r\n              fontWeight:800,\r\n              color:\"#071f39\",\r\n              align:\"left\"\r\n            }\r\n          );\r\n\r\n\r\n          y +=\r\n            9;\r\n\r\n\r\n          const noteText =\r\n            get(\r\n              \"dvMaintRobotNote\"\r\n            )\r\n              ? get(\r\n                  \"dvMaintRobotNote\"\r\n                ).textContent\r\n                  .replace(\/\\s+\/g,\" \")\r\n                  .trim()\r\n              : \"\";\r\n\r\n\r\n          if (\r\n            noteText\r\n          ) {\r\n\r\n            const noteCanvas =\r\n              document.createElement(\r\n                \"canvas\"\r\n              );\r\n\r\n\r\n            const ctx =\r\n              noteCanvas.getContext(\r\n                \"2d\"\r\n              );\r\n\r\n\r\n            const fontSize =\r\n              17;\r\n\r\n\r\n            const widthPx =\r\n              900;\r\n\r\n\r\n            const padding =\r\n              8;\r\n\r\n\r\n            const lineHeight =\r\n              27;\r\n\r\n\r\n            const scale =\r\n              2;\r\n\r\n\r\n            ctx.font =\r\n              '700 ' +\r\n              fontSize +\r\n              'px \"Segoe UI\", Arial, sans-serif';\r\n\r\n\r\n            const words =\r\n              noteText.split(\r\n                \/\\s+\/\r\n              );\r\n\r\n\r\n            const lines =\r\n              [];\r\n\r\n\r\n            let current =\r\n              \"\";\r\n\r\n\r\n            for (\r\n              const word of words\r\n            ) {\r\n\r\n              const test =\r\n                current\r\n                  ? current +\r\n                    \" \" +\r\n                    word\r\n                  : word;\r\n\r\n\r\n              if (\r\n                ctx.measureText(\r\n                  test\r\n                ).width >\r\n                widthPx -\r\n                padding *\r\n                2\r\n              ) {\r\n\r\n                if (\r\n                  current\r\n                ) {\r\n\r\n                  lines.push(\r\n                    current\r\n                  );\r\n                }\r\n\r\n                current =\r\n                  word;\r\n\r\n              } else {\r\n\r\n                current =\r\n                  test;\r\n              }\r\n            }\r\n\r\n\r\n            if (\r\n              current\r\n            ) {\r\n\r\n              lines.push(\r\n                current\r\n              );\r\n            }\r\n\r\n\r\n            noteCanvas.width =\r\n              widthPx *\r\n              scale;\r\n\r\n\r\n            noteCanvas.height =\r\n              Math.max(\r\n                40,\r\n                (\r\n                  lines.length *\r\n                  lineHeight +\r\n                  padding *\r\n                  2\r\n                ) *\r\n                scale\r\n              );\r\n\r\n\r\n            const ctx2 =\r\n              noteCanvas.getContext(\r\n                \"2d\"\r\n              );\r\n\r\n\r\n            ctx2.scale(\r\n              scale,\r\n              scale\r\n            );\r\n\r\n\r\n            ctx2.fillStyle =\r\n              \"#526b84\";\r\n\r\n\r\n            ctx2.font =\r\n              '700 ' +\r\n              fontSize +\r\n              'px \"Segoe UI\", Arial, sans-serif';\r\n\r\n\r\n            ctx2.textBaseline =\r\n              \"top\";\r\n\r\n\r\n            lines.forEach(\r\n              function (\r\n                line,\r\n                index\r\n              ) {\r\n\r\n                ctx2.fillText(\r\n                  line,\r\n                  padding,\r\n                  padding +\r\n                  index *\r\n                  lineHeight\r\n                );\r\n              }\r\n            );\r\n\r\n\r\n            const noteMmHeight =\r\n              contentWidth *\r\n              (\r\n                noteCanvas.height \/\r\n                noteCanvas.width\r\n              );\r\n\r\n\r\n            ensureSpace(\r\n              noteMmHeight +\r\n              4\r\n            );\r\n\r\n\r\n            doc.addImage(\r\n              noteCanvas.toDataURL(\r\n                \"image\/png\"\r\n              ),\r\n              \"PNG\",\r\n              marginX,\r\n              y,\r\n              contentWidth,\r\n              noteMmHeight,\r\n              undefined,\r\n              \"FAST\"\r\n            );\r\n\r\n\r\n            y +=\r\n              noteMmHeight +\r\n              5;\r\n          }\r\n\r\n\r\n          ensureSpace(\r\n            12\r\n          );\r\n\r\n\r\n          await addTextImage(\r\n            \"Prices and dosage data are estimates and may change. Actual requirements depend on water conditions and usage intensity.\",\r\n            marginX,\r\n            y,\r\n            1000,\r\n            contentWidth,\r\n            {\r\n              fontSize:12,\r\n              fontWeight:600,\r\n              color:\"#70849a\",\r\n              align:\"center\"\r\n            }\r\n          );\r\n\r\n\r\n          doc.save(\r\n            \"Datvale-auzis-movlis-kharjtagricxva.pdf\"\r\n          );\r\n\r\n\r\n        } catch (error) {\r\n\r\n          console.error(\r\n            \"Datvale Pool Maintenance PDF generation error:\",\r\n            error\r\n          );\r\n\r\n\r\n          alert(\r\n            \"Unable to create the PDF.\"\r\n          );\r\n\r\n\r\n        } finally {\r\n\r\n          printButton.disabled =\r\n            false;\r\n\r\n\r\n          printButton.innerHTML =\r\n            originalHTML;\r\n        }\r\n\r\n      }\r\n    );\r\n  }\r\n\r\n})();\r\n<\/script>\r\n\r\n<\/div>\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-0b8ebf2 e-flex e-con-boxed e-con e-parent\" data-id=\"0b8ebf2\" 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-fa7c629 elementor-widget elementor-widget-html\" data-id=\"fa7c629\" 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<a\r\n  href=\"https:\/\/datvale.ge\/en\/property-insurance\/\"\r\n  class=\"dv-property-offer\"\r\n  aria-label=\"Calculate the cost of property insurance\"\r\n>\r\n\r\n  <div class=\"dv-property-offer-copy\">\r\n\r\n    <strong>\r\n      Calculate the cost of property insurance\r\n    <\/strong>\r\n\r\n    <span>\r\n      Get a special offer for your apartment or house\r\n    <\/span>\r\n\r\n  <\/div>\r\n\r\n  <div class=\"dv-property-offer-button\">\r\n    Calculate Price\r\n    <b>\u2192<\/b>\r\n  <\/div>\r\n\r\n<\/a>\r\n\r\n\r\n<style>\r\n\r\n.dv-property-offer,\r\n.dv-property-offer *{\r\n  box-sizing:border-box;\r\n}\r\n\r\n.dv-property-offer{\r\n  position:relative;\r\n  overflow:hidden;\r\n\r\n  width:100%;\r\n\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n\r\n  gap:20px;\r\n\r\n  padding:18px 20px;\r\n\r\n  border:1px solid rgba(110,73,22,.16);\r\n  border-radius:18px;\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle at 90% 0%,\r\n      rgba(255,255,255,.88),\r\n      transparent 28%\r\n    ),\r\n    linear-gradient(\r\n      135deg,\r\n      #f4dfb4 0%,\r\n      #d6aa5c 48%,\r\n      #b88132 100%\r\n    );\r\n\r\n  box-shadow:\r\n    0 14px 34px rgba(106,70,19,.20),\r\n    inset 0 1px 0 rgba(255,255,255,.58);\r\n\r\n  text-decoration:none !important;\r\n\r\n  transition:\r\n    transform .22s ease,\r\n    box-shadow .22s ease;\r\n}\r\n\r\n.dv-property-offer::before{\r\n  content:\"\";\r\n\r\n  position:absolute;\r\n  top:-80px;\r\n  right:90px;\r\n\r\n  width:170px;\r\n  height:170px;\r\n\r\n  border-radius:50%;\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle,\r\n      rgba(255,255,255,.36),\r\n      transparent 68%\r\n    );\r\n\r\n  pointer-events:none;\r\n}\r\n\r\n.dv-property-offer:hover{\r\n  transform:translateY(-2px);\r\n\r\n  box-shadow:\r\n    0 18px 42px rgba(106,70,19,.27),\r\n    inset 0 1px 0 rgba(255,255,255,.62);\r\n\r\n  text-decoration:none !important;\r\n}\r\n\r\n\r\n.dv-property-offer-copy{\r\n  position:relative;\r\n  z-index:2;\r\n\r\n  min-width:0;\r\n\r\n  display:flex;\r\n  flex-direction:column;\r\n\r\n  gap:4px;\r\n}\r\n\r\n.dv-property-offer-copy strong{\r\n  color:#2e2111;\r\n\r\n  font-size:19px;\r\n  line-height:1.2;\r\n\r\n  font-weight:950;\r\n\r\n  letter-spacing:-.01em;\r\n}\r\n\r\n.dv-property-offer-copy span{\r\n  color:rgba(46,33,17,.78);\r\n\r\n  font-size:13px;\r\n  line-height:1.35;\r\n\r\n  font-weight:700;\r\n}\r\n\r\n\r\n.dv-property-offer-button{\r\n  position:relative;\r\n  z-index:2;\r\n\r\n  flex:0 0 auto;\r\n\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n\r\n  gap:7px;\r\n\r\n  min-height:46px;\r\n\r\n  padding:11px 16px;\r\n\r\n  border:1px solid rgba(46,33,17,.10);\r\n  border-radius:11px;\r\n\r\n  background:#21170c;\r\n\r\n  color:#ffffff;\r\n\r\n  font-size:13px;\r\n  line-height:1;\r\n\r\n  font-weight:900;\r\n\r\n  white-space:nowrap;\r\n\r\n  box-shadow:\r\n    0 7px 18px rgba(33,23,12,.20);\r\n}\r\n\r\n.dv-property-offer-button b{\r\n  font-size:15px;\r\n  line-height:1;\r\n\r\n  transition:transform .2s ease;\r\n}\r\n\r\n.dv-property-offer:hover\r\n.dv-property-offer-button b{\r\n  transform:translateX(2px);\r\n}\r\n\r\n\r\n\/* TABLET *\/\r\n\r\n@media(max-width:900px){\r\n\r\n  .dv-property-offer{\r\n    padding:16px 17px;\r\n\r\n    border-radius:15px;\r\n  }\r\n\r\n  .dv-property-offer-copy strong{\r\n    font-size:17px;\r\n  }\r\n\r\n}\r\n\r\n\r\n\/* MOBILE *\/\r\n\r\n@media(max-width:600px){\r\n\r\n  .dv-property-offer{\r\n    gap:10px;\r\n\r\n    padding:12px;\r\n\r\n    border-radius:13px;\r\n  }\r\n\r\n  .dv-property-offer-copy{\r\n    gap:2px;\r\n  }\r\n\r\n  .dv-property-offer-copy strong{\r\n    font-size:14px;\r\n    line-height:1.2;\r\n  }\r\n\r\n  .dv-property-offer-copy span{\r\n    font-size:10.5px;\r\n    line-height:1.25;\r\n  }\r\n\r\n  .dv-property-offer-button{\r\n    min-height:37px;\r\n\r\n    padding:8px 10px;\r\n\r\n    border-radius:8px;\r\n\r\n    font-size:10.5px;\r\n  }\r\n\r\n  .dv-property-offer-button b{\r\n    font-size:12px;\r\n  }\r\n\r\n}\r\n\r\n\r\n\/* SMALL MOBILE *\/\r\n\r\n@media(max-width:380px){\r\n\r\n  .dv-property-offer{\r\n    gap:8px;\r\n\r\n    padding:10px;\r\n  }\r\n\r\n  .dv-property-offer-copy strong{\r\n    font-size:13px;\r\n  }\r\n\r\n  .dv-property-offer-copy span{\r\n    font-size:9.5px;\r\n  }\r\n\r\n  .dv-property-offer-button{\r\n    padding:7px 8px;\r\n\r\n    font-size:10px;\r\n  }\r\n\r\n}\r\n\r\n<\/style>\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-7153843 e-flex e-con-boxed e-con e-parent\" data-id=\"7153843\" 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-29dc659 elementor-widget elementor-widget-html\" data-id=\"29dc659\" 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<section class=\"dv-partners\">\r\n\r\n  <div class=\"dv-partners-head\">\r\n\r\n    <span>DATVALE.GE PARTNERS<\/span>\r\n\r\n    <h2>Special Offers<\/h2>\r\n\r\n    <p>\r\n      Take advantage of special offers from Datvale partner companies\r\n      for renovation, construction and interior projects.\r\n    <\/p>\r\n\r\n  <\/div>\r\n\r\n\r\n  <div class=\"dv-partners-grid\">\r\n\r\n\r\n    <!-- NEW LIGHT -->\r\n\r\n    <article class=\"dv-card\">\r\n\r\n      <div class=\"dv-logo\">\r\n\r\n        <img decoding=\"async\"\r\n          src=\"https:\/\/datvale.ge\/wp-content\/uploads\/2025\/06\/dbd6fc01-a56b-490f-b2a5-59f3445fe63a.jpg\"\r\n          alt=\"New Light\"\r\n          loading=\"lazy\"\r\n        >\r\n\r\n        <span class=\"dv-badge\">\r\n          -15%\r\n        <\/span>\r\n\r\n      <\/div>\r\n\r\n\r\n      <button\r\n        class=\"dv-toggle\"\r\n        type=\"button\"\r\n        aria-expanded=\"false\"\r\n      >\r\n        View Offer\r\n      <\/button>\r\n\r\n\r\n      <div class=\"dv-details\">\r\n\r\n        <h3>New Light<\/h3>\r\n\r\n\r\n        <div class=\"dv-type\">\r\n          Lighting Store\r\n        <\/div>\r\n\r\n\r\n        <p>\r\n          A wide selection of international lighting brands, including\r\n          Philips, Eglo, Artemide, Luceplan, Vibia, Osram and more.\r\n        <\/p>\r\n\r\n\r\n        <div class=\"dv-links\">\r\n\r\n          <a href=\"https:\/\/newlight.ge\/\" target=\"_blank\" rel=\"noopener\">\r\n            newlight.ge\r\n          <\/a>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n    <\/article>\r\n\r\n\r\n\r\n    <!-- NOVA -->\r\n\r\n    <article class=\"dv-card\">\r\n\r\n      <div class=\"dv-logo\">\r\n\r\n        <img decoding=\"async\"\r\n          src=\"https:\/\/datvale.ge\/wp-content\/uploads\/2025\/08\/\u10da\u10dd\u10d2\u10dd\u10d4\u10d1\u10d8-26-2.png\"\r\n          alt=\"Nova\"\r\n          loading=\"lazy\"\r\n        >\r\n\r\n        <span class=\"dv-badge\">\r\n          Up to 20%\r\n        <\/span>\r\n\r\n      <\/div>\r\n\r\n\r\n      <button\r\n        class=\"dv-toggle\"\r\n        type=\"button\"\r\n        aria-expanded=\"false\"\r\n      >\r\n        View Offer\r\n      <\/button>\r\n\r\n\r\n      <div class=\"dv-details\">\r\n\r\n        <h3>Nova<\/h3>\r\n\r\n\r\n        <div class=\"dv-type\">\r\n          Construction & Renovation Hypermarket\r\n        <\/div>\r\n\r\n\r\n        <p>\r\n          A wide range of construction and renovation products,\r\n          including own-brand manufacturing and international brands\r\n          for renovation and construction projects.\r\n        <\/p>\r\n\r\n\r\n        <div class=\"dv-links\">\r\n\r\n          <a href=\"https:\/\/nova.ge\/\" target=\"_blank\" rel=\"noopener\">\r\n            nova.ge\r\n          <\/a>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n    <\/article>\r\n\r\n\r\n\r\n    <!-- VITRA -->\r\n\r\n    <article class=\"dv-card\">\r\n\r\n      <div class=\"dv-logo\">\r\n\r\n        <img decoding=\"async\"\r\n          src=\"https:\/\/datvale.ge\/wp-content\/uploads\/2025\/06\/\u10da\u10dd\u10d2\u10dd\u10d4\u10d1\u10d8-28.png\"\r\n          alt=\"VitrA Georgia\"\r\n          loading=\"lazy\"\r\n        >\r\n\r\n        <span class=\"dv-badge\">\r\n          -15%\r\n        <\/span>\r\n\r\n      <\/div>\r\n\r\n\r\n      <button\r\n        class=\"dv-toggle\"\r\n        type=\"button\"\r\n        aria-expanded=\"false\"\r\n      >\r\n        View Offer\r\n      <\/button>\r\n\r\n\r\n      <div class=\"dv-details\">\r\n\r\n        <h3>VitrA Georgia<\/h3>\r\n\r\n\r\n        <div class=\"dv-type\">\r\n          Sanitary Ware & Ceramic Tiles\r\n        <\/div>\r\n\r\n\r\n        <p>\r\n          A wide selection of bathroom sanitary ware and ceramic tiles\r\n          for creating a modern and functional bathroom.\r\n        <\/p>\r\n\r\n\r\n        <div class=\"dv-links\">\r\n\r\n          <a href=\"https:\/\/vitra.com.ge\/ka\/\" target=\"_blank\" rel=\"noopener\">\r\n            vitra.com.ge\r\n          <\/a>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n    <\/article>\r\n\r\n\r\n\r\n    <!-- CAPAROL -->\r\n\r\n    <article class=\"dv-card\">\r\n\r\n      <div class=\"dv-logo\">\r\n\r\n        <img decoding=\"async\"\r\n          src=\"https:\/\/datvale.ge\/wp-content\/uploads\/2025\/10\/24.09.2025-33.png\"\r\n          alt=\"Caparol\"\r\n          loading=\"lazy\"\r\n        >\r\n\r\n        <span class=\"dv-badge\">\r\n          -10%\r\n        <\/span>\r\n\r\n      <\/div>\r\n\r\n\r\n      <button\r\n        class=\"dv-toggle\"\r\n        type=\"button\"\r\n        aria-expanded=\"false\"\r\n      >\r\n        View Offer\r\n      <\/button>\r\n\r\n\r\n      <div class=\"dv-details\">\r\n\r\n        <h3>Caparol<\/h3>\r\n\r\n\r\n        <div class=\"dv-type\">\r\n          Paints & Finishing Materials\r\n        <\/div>\r\n\r\n\r\n        <p>\r\n          An international brand of interior and facade paints,\r\n          decorative coatings and finishing materials.\r\n        <\/p>\r\n\r\n\r\n        <div class=\"dv-address\">\r\n\r\n          <span>\r\n            Tbilisi \u2014 8 Petre Kavtaradze St. \u2022 599 44 55 67\r\n          <\/span>\r\n\r\n          <span>\r\n            Tbilisi \u2014 15 Samtredia St. \u2022 599 58 26 25\r\n          <\/span>\r\n\r\n          <span>\r\n            Batumi \u2014 35 Pushkin St. \u2022 558 04 04 96\r\n          <\/span>\r\n\r\n        <\/div>\r\n\r\n\r\n        <div class=\"dv-links\">\r\n\r\n          <a href=\"https:\/\/caparol.ge\" target=\"_blank\" rel=\"noopener\">\r\n            caparol.ge\r\n          <\/a>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n    <\/article>\r\n\r\n\r\n  <\/div>\r\n\r\n\r\n  <!-- ALL PARTNERS -->\r\n\r\n  <div class=\"dv-all-partners\">\r\n\r\n    <a href=\"https:\/\/datvale.ge\/en\/partners\/\">\r\n      All Partners\r\n    <\/a>\r\n\r\n  <\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<style>\r\n\r\n.dv-partners,\r\n.dv-partners *{\r\n  box-sizing:border-box;\r\n}\r\n\r\n\r\n.dv-partners{\r\n  --blue:#0b4187;\r\n  --blue2:#176bc5;\r\n  --text:#173a61;\r\n  --muted:#65788c;\r\n  --border:#e1e9f2;\r\n  --light:#f7faff;\r\n\r\n  width:100%;\r\n  max-width:1200px;\r\n\r\n  margin:40px auto;\r\n  padding:0 15px;\r\n\r\n  font-family:\r\n    system-ui,\r\n    -apple-system,\r\n    BlinkMacSystemFont,\r\n    \"Segoe UI\",\r\n    sans-serif;\r\n}\r\n\r\n\r\n\/* HEADER *\/\r\n\r\n.dv-partners-head{\r\n  max-width:760px;\r\n\r\n  margin:0 auto 28px;\r\n\r\n  text-align:center;\r\n}\r\n\r\n\r\n.dv-partners-head > span{\r\n  display:block;\r\n\r\n  margin-bottom:7px;\r\n\r\n  color:var(--blue2);\r\n\r\n  font-size:12px;\r\n  font-weight:900;\r\n  letter-spacing:.08em;\r\n}\r\n\r\n\r\n.dv-partners-head h2{\r\n  margin:0 0 9px;\r\n\r\n  color:var(--text);\r\n\r\n  font-size:clamp(27px,4vw,38px);\r\n  line-height:1.15;\r\n  font-weight:950;\r\n}\r\n\r\n\r\n.dv-partners-head p{\r\n  margin:0;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:15px;\r\n  line-height:1.6;\r\n}\r\n\r\n\r\n\/* GRID *\/\r\n\r\n.dv-partners-grid{\r\n  display:grid;\r\n\r\n  grid-template-columns:\r\n    repeat(4,minmax(0,1fr));\r\n\r\n  gap:16px;\r\n\r\n  align-items:start;\r\n}\r\n\r\n\r\n\/* CARD *\/\r\n\r\n.dv-card{\r\n  position:relative;\r\n\r\n  width:100%;\r\n  height:220px;\r\n\r\n  overflow:hidden;\r\n\r\n  border:\r\n    1px solid var(--border);\r\n\r\n  border-radius:20px;\r\n\r\n  background:#fff;\r\n\r\n  box-shadow:\r\n    0 8px 28px rgba(27,61,98,.08);\r\n\r\n  transition:\r\n    transform .22s ease,\r\n    box-shadow .22s ease,\r\n    border-color .22s ease;\r\n}\r\n\r\n\r\n.dv-card:hover{\r\n  transform:translateY(-3px);\r\n\r\n  border-color:#cfdeed;\r\n\r\n  box-shadow:\r\n    0 15px 36px rgba(27,61,98,.13);\r\n}\r\n\r\n\r\n.dv-card.dv-open{\r\n  height:auto;\r\n  overflow:visible;\r\n}\r\n\r\n\r\n\/* LOGO *\/\r\n\r\n.dv-logo{\r\n  position:relative;\r\n\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n\r\n  width:100%;\r\n  height:158px;\r\n\r\n  padding:20px;\r\n\r\n  background:#fff;\r\n}\r\n\r\n\r\n.dv-logo img{\r\n  display:block;\r\n\r\n  width:auto;\r\n  height:auto;\r\n\r\n  max-width:100%;\r\n  max-height:105px;\r\n\r\n  object-fit:contain;\r\n}\r\n\r\n\r\n\/* BADGE *\/\r\n\r\n.dv-badge{\r\n  position:absolute;\r\n\r\n  top:12px;\r\n  right:12px;\r\n\r\n  z-index:2;\r\n\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n\r\n  min-height:31px;\r\n\r\n  padding:6px 10px;\r\n\r\n  border-radius:100px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n      var(--blue),\r\n      var(--blue2)\r\n    );\r\n\r\n  color:#fff;\r\n\r\n  font-size:11px;\r\n  line-height:1;\r\n  font-weight:950;\r\n\r\n  box-shadow:\r\n    0 6px 15px rgba(11,65,135,.23);\r\n}\r\n\r\n\r\n\/* BUTTON *\/\r\n\r\n.dv-toggle{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n\r\n  width:calc(100% - 28px);\r\n  height:46px;\r\n\r\n  margin:0 14px 16px;\r\n\r\n  padding:10px 12px;\r\n\r\n  border:0;\r\n\r\n  border-radius:12px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n      var(--blue),\r\n      var(--blue2)\r\n    );\r\n\r\n  color:#fff;\r\n\r\n  font:inherit;\r\n\r\n  font-size:13px;\r\n  font-weight:900;\r\n\r\n  cursor:pointer;\r\n\r\n  box-shadow:\r\n    0 7px 18px rgba(11,65,135,.18);\r\n\r\n  transition:\r\n    transform .2s ease,\r\n    box-shadow .2s ease,\r\n    background .2s ease;\r\n}\r\n\r\n\r\n.dv-toggle:hover{\r\n  transform:translateY(-1px);\r\n\r\n  box-shadow:\r\n    0 10px 23px rgba(11,65,135,.25);\r\n}\r\n\r\n\r\n\/* DETAILS *\/\r\n\r\n.dv-details{\r\n  display:none;\r\n\r\n  padding:18px;\r\n\r\n  border-top:\r\n    1px solid var(--border);\r\n\r\n  background:var(--light);\r\n}\r\n\r\n\r\n.dv-card.dv-open .dv-details{\r\n  display:block;\r\n}\r\n\r\n\r\n\/* OPEN BUTTON *\/\r\n\r\n.dv-card.dv-open .dv-toggle{\r\n  margin-bottom:14px;\r\n\r\n  background:#eaf2fb;\r\n\r\n  color:var(--blue);\r\n\r\n  box-shadow:none;\r\n}\r\n\r\n\r\n\/* NAME *\/\r\n\r\n.dv-details h3{\r\n  margin:0 0 7px;\r\n\r\n  color:var(--text);\r\n\r\n  font-size:18px;\r\n  line-height:1.3;\r\n  font-weight:950;\r\n}\r\n\r\n\r\n\/* TYPE *\/\r\n\r\n.dv-type{\r\n  display:inline-block;\r\n\r\n  margin-bottom:12px;\r\n\r\n  padding:5px 9px;\r\n\r\n  border-radius:7px;\r\n\r\n  background:#e8f1fb;\r\n\r\n  color:var(--blue);\r\n\r\n  font-size:11px;\r\n  line-height:1.35;\r\n  font-weight:850;\r\n}\r\n\r\n\r\n\/* DESCRIPTION *\/\r\n\r\n.dv-details p{\r\n  margin:0;\r\n\r\n  color:#49637d;\r\n\r\n  font-size:13px;\r\n  line-height:1.62;\r\n}\r\n\r\n\r\n\/* LINKS *\/\r\n\r\n.dv-links{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n\r\n  gap:8px;\r\n\r\n  margin-top:14px;\r\n}\r\n\r\n\r\n.dv-links a{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n\r\n  flex:1 1 auto;\r\n\r\n  min-height:40px;\r\n\r\n  padding:9px 12px;\r\n\r\n  border:\r\n    1px solid #d2dfed;\r\n\r\n  border-radius:10px;\r\n\r\n  background:#fff;\r\n\r\n  color:\r\n    var(--blue)!important;\r\n\r\n  font-size:12px;\r\n  font-weight:900;\r\n\r\n  text-decoration:none!important;\r\n\r\n  transition:\r\n    background .2s ease,\r\n    border-color .2s ease;\r\n}\r\n\r\n\r\n.dv-links a:hover{\r\n  background:#edf5fd;\r\n\r\n  border-color:#bcd2e8;\r\n}\r\n\r\n\r\n\/* CAPAROL ADDRESSES *\/\r\n\r\n.dv-address{\r\n  display:flex;\r\n  flex-direction:column;\r\n\r\n  gap:6px;\r\n\r\n  margin-top:13px;\r\n}\r\n\r\n\r\n.dv-address span{\r\n  display:block;\r\n\r\n  padding:8px 10px;\r\n\r\n  border:\r\n    1px solid #e2eaf3;\r\n\r\n  border-radius:9px;\r\n\r\n  background:#fff;\r\n\r\n  color:#526a82;\r\n\r\n  font-size:11px;\r\n  line-height:1.45;\r\n}\r\n\r\n\r\n\/* ALL PARTNERS BUTTON *\/\r\n\r\n.dv-all-partners{\r\n  display:flex;\r\n  justify-content:center;\r\n\r\n  margin-top:22px;\r\n}\r\n\r\n\r\n.dv-all-partners a{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n\r\n  min-height:46px;\r\n\r\n  padding:10px 22px;\r\n\r\n  border-radius:12px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n      var(--blue),\r\n      var(--blue2)\r\n    );\r\n\r\n  color:#fff!important;\r\n\r\n  font-size:13px;\r\n  font-weight:900;\r\n\r\n  text-decoration:none!important;\r\n\r\n  box-shadow:\r\n    0 7px 18px rgba(11,65,135,.18);\r\n\r\n  transition:\r\n    transform .2s ease,\r\n    box-shadow .2s ease;\r\n}\r\n\r\n\r\n.dv-all-partners a:hover{\r\n  transform:translateY(-1px);\r\n\r\n  box-shadow:\r\n    0 10px 23px rgba(11,65,135,.25);\r\n}\r\n\r\n\r\n\/* TABLET *\/\r\n\r\n@media(max-width:950px){\r\n\r\n  .dv-partners-grid{\r\n    grid-template-columns:\r\n      repeat(2,minmax(0,1fr));\r\n  }\r\n\r\n}\r\n\r\n\r\n\/* MOBILE *\/\r\n\r\n@media(max-width:700px){\r\n\r\n  .dv-partners{\r\n    margin:28px auto;\r\n\r\n    padding:0 9px;\r\n  }\r\n\r\n\r\n  .dv-partners-head{\r\n    margin-bottom:20px;\r\n  }\r\n\r\n\r\n  .dv-partners-head p{\r\n    font-size:14px;\r\n  }\r\n\r\n\r\n  .dv-partners-grid{\r\n    grid-template-columns:\r\n      repeat(2,minmax(0,1fr));\r\n\r\n    gap:10px;\r\n  }\r\n\r\n\r\n  .dv-card{\r\n    height:174px;\r\n\r\n    border-radius:15px;\r\n  }\r\n\r\n\r\n  .dv-logo{\r\n    height:120px;\r\n\r\n    padding:12px;\r\n  }\r\n\r\n\r\n  .dv-logo img{\r\n    max-height:82px;\r\n  }\r\n\r\n\r\n  .dv-badge{\r\n    top:7px;\r\n    right:7px;\r\n\r\n    min-height:25px;\r\n\r\n    padding:5px 7px;\r\n\r\n    font-size:9px;\r\n  }\r\n\r\n\r\n  .dv-toggle{\r\n    width:calc(100% - 16px);\r\n    height:40px;\r\n\r\n    margin:0 8px 14px;\r\n\r\n    padding:7px;\r\n\r\n    border-radius:9px;\r\n\r\n    font-size:10.5px;\r\n  }\r\n\r\n\r\n  .dv-details{\r\n    padding:14px 11px;\r\n  }\r\n\r\n\r\n  .dv-details h3{\r\n    font-size:16px;\r\n  }\r\n\r\n\r\n  .dv-type{\r\n    margin-bottom:10px;\r\n\r\n    font-size:10px;\r\n  }\r\n\r\n\r\n  .dv-details p{\r\n    font-size:11.5px;\r\n\r\n    line-height:1.6;\r\n  }\r\n\r\n\r\n  .dv-links{\r\n    flex-direction:column;\r\n  }\r\n\r\n\r\n  .dv-links a{\r\n    width:100%;\r\n  }\r\n\r\n\r\n  .dv-address span{\r\n    font-size:10.5px;\r\n  }\r\n\r\n\r\n  .dv-all-partners{\r\n    margin-top:18px;\r\n  }\r\n\r\n\r\n  .dv-all-partners a{\r\n    min-height:42px;\r\n\r\n    padding:9px 18px;\r\n\r\n    font-size:11px;\r\n  }\r\n\r\n}\r\n\r\n\r\n\/* VERY SMALL MOBILE *\/\r\n\r\n@media(max-width:340px){\r\n\r\n  .dv-partners-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n\r\n<script>\r\n\r\n(function(){\r\n\r\n  const section =\r\n    document.querySelector('.dv-partners');\r\n\r\n\r\n  if(!section){\r\n    return;\r\n  }\r\n\r\n\r\n  const buttons =\r\n    section.querySelectorAll('.dv-toggle');\r\n\r\n\r\n  buttons.forEach(function(button){\r\n\r\n    button.addEventListener(\r\n      'click',\r\n      function(){\r\n\r\n        const card =\r\n          button.closest('.dv-card');\r\n\r\n\r\n        const isOpen =\r\n          card.classList.contains('dv-open');\r\n\r\n\r\n        \/*\r\n         * Close all open cards\r\n         *\/\r\n\r\n        section\r\n          .querySelectorAll('.dv-card.dv-open')\r\n          .forEach(function(openCard){\r\n\r\n            openCard\r\n              .classList\r\n              .remove('dv-open');\r\n\r\n\r\n            const openButton =\r\n              openCard.querySelector('.dv-toggle');\r\n\r\n\r\n            if(openButton){\r\n\r\n              openButton.textContent =\r\n                'View Offer';\r\n\r\n\r\n              openButton.setAttribute(\r\n                'aria-expanded',\r\n                'false'\r\n              );\r\n\r\n            }\r\n\r\n          });\r\n\r\n\r\n        \/*\r\n         * Open the selected card\r\n         *\/\r\n\r\n        if(!isOpen){\r\n\r\n          card\r\n            .classList\r\n            .add('dv-open');\r\n\r\n\r\n          button.textContent =\r\n            'Close Offer';\r\n\r\n\r\n          button.setAttribute(\r\n            'aria-expanded',\r\n            'true'\r\n          );\r\n\r\n        }\r\n\r\n      }\r\n    );\r\n\r\n  });\r\n\r\n})();\r\n\r\n<\/script>\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-8c7397b e-flex e-con-boxed e-con e-parent\" data-id=\"8c7397b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d64c95d e-flex e-con-boxed e-con e-parent\" data-id=\"d64c95d\" 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-d972221 elementor-widget elementor-widget-text-editor\" data-id=\"d972221\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2>Pool Maintenance Cost<\/h2>\n<p><strong>Pool maintenance cost<\/strong> depends on the size of the pool, water volume, frequency of use, season, and required level of service. Regular <strong>pool maintenance<\/strong> includes water cleaning, checking the filtration system, cleaning pool surfaces, and maintaining the correct chemical balance of the water.<\/p>\n<p>Datvale\u2019s Pool Maintenance Calculator allows you to estimate the expected maintenance cost in advance. Enter your pool details and get a quick online estimate of the maintenance expenses.<\/p>\n<h2>How Much Does Pool Maintenance Cost?<\/h2>\n<p>There is no single fixed answer to the question <strong>how much does pool maintenance cost?<\/strong> The final price depends on the pool volume, level of contamination, water condition, and the amount of work required.<\/p>\n<p>Maintaining a small residential pool is different from maintaining a large swimming pool, where more water, more chemicals, and more working time are required.<\/p>\n<p>For this reason, the <strong>pool maintenance cost<\/strong> should be estimated according to the specific parameters of the pool.<\/p>\n<h2>Pool Cleaning<\/h2>\n<p><strong>Pool cleaning<\/strong> is one of the most important parts of regular maintenance. Leaves, dust, and other debris can accumulate on the water surface, while deposits may gradually form on the pool walls and floor.<\/p>\n<p>Pool cleaning may include removing surface debris, cleaning the pool floor, washing the walls, and checking the filtration system.<\/p>\n<p>Regular <strong>pool cleaning<\/strong> helps keep the water clean and reduces the risk of heavy contamination.<\/p>\n<h2>Pool Chemicals<\/h2>\n<p><strong>Pool chemicals<\/strong> are essential for maintaining water quality and keeping the pool in a safe condition. Water parameters should be monitored regularly and adjusted when necessary.<\/p>\n<p>Pool chemicals may include disinfectants, pH adjustment products, and other specialized treatment products.<\/p>\n<p>The required amount of chemicals depends on the water volume, environmental conditions, and the intensity of pool use.<\/p>\n<h2>Pool Maintenance<\/h2>\n<p><strong>Pool maintenance<\/strong> is not only about keeping the water visually clean. Proper pool maintenance also requires ensuring that the filtration and circulation systems operate correctly.<\/p>\n<p>During regular maintenance, water quality is checked, the pool is cleaned, and appropriate <strong>pool chemicals<\/strong> are used when necessary.<\/p>\n<p>Regular maintenance is easier than restoring a heavily contaminated pool, so it is recommended to service the pool consistently.<\/p>\n<h2>What Is Included in the Pool Maintenance Cost?<\/h2>\n<p><strong>Pool maintenance cost<\/strong> may include several main services:<\/p>\n<ul>\n<li>Cleaning the pool surface<\/li>\n<li>Cleaning the floor and walls<\/li>\n<li>Checking the filtration system<\/li>\n<li>Monitoring water parameters<\/li>\n<li>Using pool chemicals<\/li>\n<li>Additional cleaning when required<\/li>\n<\/ul>\n<p>The final cost depends on the condition of the pool and the level of maintenance it requires.<\/p>\n<h2>What Affects the Pool Maintenance Cost?<\/h2>\n<p>The most important factors are the size of the pool and the water volume. The larger the pool, the more time and resources are required for maintenance.<\/p>\n<p>It also matters how frequently the pool is used, whether it is located outdoors, and how quickly the water becomes contaminated.<\/p>\n<p>These factors affect both <strong>pool cleaning<\/strong>, the required amount of <strong>pool chemicals<\/strong>, and the final maintenance cost.<\/p>\n<h2>How Often Is Pool Cleaning Required?<\/h2>\n<p><strong>Pool cleaning<\/strong> should be carried out regularly, especially during periods of active use.<\/p>\n<p>Outdoor pools accumulate debris and dust more quickly, so they may require more frequent cleaning. Indoor pools are generally exposed to less contamination, but regular water quality monitoring is still essential.<\/p>\n<p>The required cleaning frequency depends on pool usage, environmental conditions, and the efficiency of the filtration system.<\/p>\n<h2>Why Is Proper Use of Pool Chemicals Important?<\/h2>\n<p><strong>Pool chemicals<\/strong> should be used correctly and in appropriate quantities. Using too much or too little chemical treatment can negatively affect water quality.<\/p>\n<p>Water parameters should be checked regularly, and the appropriate products should be used when necessary.<\/p>\n<p>Properly planned pool maintenance combines mechanical cleaning with the control of the water\u2019s chemical balance.<\/p>\n<h2>How to Use the Pool Maintenance Calculator<\/h2>\n<p>First, enter the basic details of your pool. Based on this information, the calculator will estimate the size of the pool and the required level of maintenance.<\/p>\n<p>The system will then help you understand approximately <strong>how much pool maintenance costs<\/strong> for your specific pool.<\/p>\n<p>The result will help you estimate the <strong>pool maintenance cost<\/strong> in advance, plan <strong>pool cleaning<\/strong>, chemical expenses, and regular <strong>pool maintenance<\/strong>.<\/p>\n<p>Follow us on <a href=\"https:\/\/facebook.com\/datvale.ge\">Facebook<\/a> and <a href=\"https:\/\/youtube.com\/@datvale\" target=\"_blank\" rel=\"noopener\">YouTube<\/a>.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a6c25e7 e-flex e-con-boxed e-con e-parent\" data-id=\"a6c25e7\" 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-f5fdee7 elementor-widget elementor-widget-image\" data-id=\"f5fdee7\" 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=\"341\" src=\"https:\/\/datvale.ge\/wp-content\/uploads\/2026\/09\/auzis-movla-1024x341.webp\" class=\"attachment-large size-large wp-image-21682\" alt=\"Pool Maintenance Cost\" srcset=\"https:\/\/datvale.ge\/wp-content\/uploads\/2026\/09\/auzis-movla-1024x341.webp 1024w, https:\/\/datvale.ge\/wp-content\/uploads\/2026\/09\/auzis-movla-300x100.webp 300w, https:\/\/datvale.ge\/wp-content\/uploads\/2026\/09\/auzis-movla-768x256.webp 768w, https:\/\/datvale.ge\/wp-content\/uploads\/2026\/09\/auzis-movla.webp 1100w, https:\/\/datvale.ge\/wp-content\/uploads\/2026\/09\/auzis-movla-600x200.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\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Pool Maintenance Cost 2026 \u2013 Pool Maintenance Calculator 1 Enter Pool Details Pool Length m Pool Width m Average Depth m Usage Intensity MediumLowHigh Do you use a pool robot? NoYes Current pH (optional) pH Basic monthly maintenance is calculated based on chlorine and algaecide usage. A pH adjustment product is added only if the&#8230;<\/p>\n","protected":false},"author":67,"featured_media":0,"parent":0,"menu_order":20,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-21898","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/datvale.ge\/en\/wp-json\/wp\/v2\/pages\/21898","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=21898"}],"version-history":[{"count":1,"href":"https:\/\/datvale.ge\/en\/wp-json\/wp\/v2\/pages\/21898\/revisions"}],"predecessor-version":[{"id":22128,"href":"https:\/\/datvale.ge\/en\/wp-json\/wp\/v2\/pages\/21898\/revisions\/22128"}],"wp:attachment":[{"href":"https:\/\/datvale.ge\/en\/wp-json\/wp\/v2\/media?parent=21898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}