{"id":1010233,"date":"2026-05-22T15:31:06","date_gmt":"2026-05-22T13:31:06","guid":{"rendered":"https:\/\/ekosphere.me\/calculate-real-estate-in-ulcinj-yield-calculator-for-renting-costs-and-value-development\/"},"modified":"2026-06-11T19:15:54","modified_gmt":"2026-06-11T17:15:54","slug":"calculate-real-estate-in-ulcinj-yield-calculator-for-renting-costs-and-value-development","status":"publish","type":"page","link":"https:\/\/ekosphere.me\/en\/calculate-real-estate-in-ulcinj-yield-calculator-for-renting-costs-and-value-development\/","title":{"rendered":"Calculate real estate in Ulcinj: Yield calculator for renting, costs and value development"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"1010233\" class=\"elementor elementor-1010233 elementor-1009226\" data-elementor-post-type=\"page\">\n\t\t\t\t<main class=\"elementor-element elementor-element-d744594 e-flex e-con-boxed e-con e-parent\" data-id=\"d744594\" data-element_type=\"container\" data-e-type=\"container\" id=\"content\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d509101 elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"d509101\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\r\n<figure class=\"ek-hero-image\">\r\n  <img loading=\"lazy\" src=\"https:\/\/ekosphere.me\/wp-content\/uploads\/2026\/05\/renditerechner-fuer-ulcinj-immobilien.webp\" alt=\"ROI calculator for real estate in Ulcinj Montenegro\" width=\"1792\" height=\"1024\" decoding=\"async\">\r\n<\/figure>\r\n\r\n<section class=\"eko-roi-calculator\" id=\"eko21-plan-b-renditerechner\">\r\n  <style>\r\n    #eko21-plan-b-renditerechner{--ek-primary:#00dcff;--ek-secondary:#004f4d;--ek-ink:#0f172a;--ek-muted:#64748b;--ek-soft:#f8fafc;width:100%;margin:0 auto;padding:clamp(22px,4vw,48px);background:#fff;color:var(--ek-ink);font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;box-shadow:0 10px 28px rgba(15,23,42,.06)}\r\n    #eko21-plan-b-renditerechner *{box-sizing:border-box;border-radius:0!important}\r\n    #eko21-plan-b-renditerechner h2,#eko21-plan-b-renditerechner h3,#eko21-plan-b-renditerechner h4,#eko21-plan-b-renditerechner p{margin-top:0}\r\n    #eko21-plan-b-renditerechner h2,#eko21-plan-b-renditerechner h3,#eko21-plan-b-renditerechner h4,#eko21-plan-b-renditerechner label,#eko21-plan-b-renditerechner summary,#eko21-plan-b-renditerechner button{text-align:left}\r\n    #eko21-plan-b-renditerechner .eko-roi-eyebrow{display:inline-flex;margin-bottom:12px;padding:8px 12px;background:rgba(0,220,255,.12);color:var(--ek-secondary);font-weight:800;font-size:14px;letter-spacing:.02em}\r\n    #eko21-plan-b-renditerechner h2{font-size:clamp(28px,4vw,44px);line-height:1.08;margin-bottom:14px;letter-spacing:-.03em;color:var(--ek-secondary)}\r\n    #eko21-plan-b-renditerechner .eko-roi-intro{font-size:clamp(17px,2vw,20px);line-height:1.6;color:#334155;margin-bottom:26px;max-width:1180px;text-align:justify}\r\n    #eko21-plan-b-renditerechner .eko-personal-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}\r\n    #eko21-plan-b-renditerechner .eko-cover-preview{display:none;margin-top:10px;background:#fff;padding:10px;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08)}\r\n    #eko21-plan-b-renditerechner .eko-cover-preview img{display:block;width:100%;max-height:220px;object-fit:cover}\r\n    @media(max-width:720px){#eko21-plan-b-renditerechner .eko-personal-grid{grid-template-columns:1fr}}\r\n    #eko21-plan-b-renditerechner .eko-section{padding:clamp(18px,3vw,28px);margin-bottom:22px;background:var(--ek-soft);border:0}\r\n    #eko21-plan-b-renditerechner .eko-section h3{font-size:clamp(22px,2.6vw,28px);color:var(--ek-secondary);margin-bottom:14px}\r\n    #eko21-plan-b-renditerechner .eko-help-details{margin:0 0 18px;background:#fff;border:0;box-shadow:inset 6px 0 0 var(--ek-primary),0 6px 18px rgba(15,23,42,.04);overflow:hidden}\r\n    #eko21-plan-b-renditerechner .eko-help-details summary{cursor:pointer;list-style:none;padding:14px 16px;font-weight:800;color:var(--ek-secondary);display:flex;justify-content:space-between;gap:12px}\r\n    #eko21-plan-b-renditerechner .eko-help-details summary::-webkit-details-marker{display:none}\r\n    #eko21-plan-b-renditerechner .eko-help-details summary:after{content:\"+\";display:inline-flex;width:24px;height:24px;align-items:center;justify-content:center;background:rgba(0,220,255,.14);font-weight:900;flex:0 0 auto}\r\n    #eko21-plan-b-renditerechner .eko-help-details[open] summary:after{content:\"-\"}\r\n    #eko21-plan-b-renditerechner .eko-help-details div{padding:0 16px 16px;color:#475569;font-size:14px;line-height:1.6}\r\n    #eko21-plan-b-renditerechner .eko-field-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}\r\n    #eko21-plan-b-renditerechner .eko-field,#eko21-plan-b-renditerechner .eko-range-field{display:flex;flex-direction:column;gap:8px;margin-bottom:16px}\r\n    #eko21-plan-b-renditerechner .eko-field label,#eko21-plan-b-renditerechner .eko-range-field label,#eko21-plan-b-renditerechner .eko-radio-title{font-size:14px;font-weight:800;color:#1e293b}\r\n    #eko21-plan-b-renditerechner .eko-field small,#eko21-plan-b-renditerechner .eko-range-field small,#eko21-plan-b-renditerechner .eko-radio small{color:var(--ek-muted);font-size:13px;line-height:1.4}\r\n    #eko21-plan-b-renditerechner .eko-field input,#eko21-plan-b-renditerechner .eko-field select{width:100%;min-height:46px;padding:10px 12px;border:0;background:#fff;color:var(--ek-ink);font:inherit;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08)}\r\n    #eko21-plan-b-renditerechner .eko-field input[readonly]{background:#eef2f7;color:#334155;cursor:not-allowed}\r\n    #eko21-plan-b-renditerechner .eko-field input:focus,#eko21-plan-b-renditerechner .eko-field select:focus,#eko21-plan-b-renditerechner .eko-range-field input:focus{outline:3px solid rgba(0,220,255,.32)}\r\n    #eko21-plan-b-renditerechner .eko-scenario-switch,#eko21-plan-b-renditerechner .eko-radio-group,#eko21-plan-b-renditerechner .eko-model-switch{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:0 0 18px}\r\n    #eko21-plan-b-renditerechner .eko-scenario-switch button,#eko21-plan-b-renditerechner .eko-model-switch button,#eko21-plan-b-renditerechner .eko-btn{border:0;background:#fff;color:var(--ek-secondary);padding:12px 14px;font:inherit;font-weight:900;letter-spacing:.04em;cursor:pointer;box-shadow:inset 0 0 0 1px rgba(0,79,77,.18)}\r\n    #eko21-plan-b-renditerechner .eko-scenario-switch button[aria-pressed=\"true\"],#eko21-plan-b-renditerechner .eko-model-switch button[aria-pressed=\"true\"]{background:var(--ek-secondary);color:#fff;box-shadow:none}\r\n    #eko21-plan-b-renditerechner .eko-radio{display:block;background:#fff;padding:14px;cursor:pointer;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08)}\r\n    #eko21-plan-b-renditerechner .eko-radio input{margin-right:8px;accent-color:var(--ek-secondary)}\r\n    #eko21-plan-b-renditerechner .eko-radio strong{color:var(--ek-secondary);font-weight:900}\r\n    #eko21-plan-b-renditerechner .eko-range-line{display:grid;grid-template-columns:1fr 110px;gap:12px;align-items:center}\r\n    #eko21-plan-b-renditerechner .eko-range-field input[type=\"range\"]{width:100%;accent-color:var(--ek-secondary)}\r\n    #eko21-plan-b-renditerechner .eko-range-value{min-height:38px;display:inline-flex;align-items:center;justify-content:center;background:#fff;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08);font-weight:900;color:var(--ek-secondary)}\r\n    #eko21-plan-b-renditerechner .eko-platform-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:10px 0 14px}\r\n    #eko21-plan-b-renditerechner .eko-platform-check{display:block;background:#fff;padding:14px;cursor:pointer;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08);font-size:14px;line-height:1.45}\r\n    #eko21-plan-b-renditerechner .eko-platform-check input{margin-right:8px;accent-color:var(--ek-secondary)}\r\n    #eko21-plan-b-renditerechner .eko-platform-check strong{color:var(--ek-secondary);font-weight:900}\r\n    #eko21-plan-b-renditerechner .eko-platform-logo{display:flex;align-items:center;justify-content:center;height:44px;margin:0 0 10px}\r\n    #eko21-plan-b-renditerechner .eko-platform-logo img{display:block;max-width:150px;max-height:38px;width:auto;height:auto;object-fit:contain;margin:0 auto}\r\n    #eko21-plan-b-renditerechner .eko-platform-summary{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0 0 12px}\r\n    #eko21-plan-b-renditerechner .eko-platform-summary div{background:#fff;padding:12px;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08)}\r\n    #eko21-plan-b-renditerechner .eko-platform-summary span{display:block;color:var(--ek-muted);font-size:13px;margin-bottom:6px}\r\n    #eko21-plan-b-renditerechner .eko-platform-summary strong{display:block;color:var(--ek-secondary);font-weight:900}\r\n    #eko21-plan-b-renditerechner [data-scenario=\"worst\"],#eko21-plan-b-renditerechner [data-longrent-scenario=\"worst\"],#eko21-plan-b-renditerechner [data-household-scenario=\"worst\"],#eko21-plan-b-renditerechner [data-value-scenario=\"worst\"]{border-left:5px solid #f97316!important}\r\n    #eko21-plan-b-renditerechner [data-scenario=\"average\"],#eko21-plan-b-renditerechner [data-longrent-scenario=\"average\"],#eko21-plan-b-renditerechner [data-household-scenario=\"average\"],#eko21-plan-b-renditerechner [data-value-scenario=\"average\"]{border-left:5px solid #2563eb!important}\r\n    #eko21-plan-b-renditerechner [data-scenario=\"best\"],#eko21-plan-b-renditerechner [data-longrent-scenario=\"best\"],#eko21-plan-b-renditerechner [data-household-scenario=\"best\"],#eko21-plan-b-renditerechner [data-value-scenario=\"best\"]{border-left:5px solid #16a34a!important}\r\n    #eko21-plan-b-renditerechner [data-scenario=\"worst\"][aria-pressed=\"true\"],#eko21-plan-b-renditerechner [data-longrent-scenario=\"worst\"][aria-pressed=\"true\"],#eko21-plan-b-renditerechner [data-household-scenario=\"worst\"][aria-pressed=\"true\"],#eko21-plan-b-renditerechner [data-value-scenario=\"worst\"][aria-pressed=\"true\"]{background:#f97316!important;color:#fff!important;box-shadow:none!important}\r\n    #eko21-plan-b-renditerechner [data-scenario=\"average\"][aria-pressed=\"true\"],#eko21-plan-b-renditerechner [data-longrent-scenario=\"average\"][aria-pressed=\"true\"],#eko21-plan-b-renditerechner [data-household-scenario=\"average\"][aria-pressed=\"true\"],#eko21-plan-b-renditerechner [data-value-scenario=\"average\"][aria-pressed=\"true\"]{background:#2563eb!important;color:#fff!important;box-shadow:none!important}\r\n    #eko21-plan-b-renditerechner [data-scenario=\"best\"][aria-pressed=\"true\"],#eko21-plan-b-renditerechner [data-longrent-scenario=\"best\"][aria-pressed=\"true\"],#eko21-plan-b-renditerechner [data-household-scenario=\"best\"][aria-pressed=\"true\"],#eko21-plan-b-renditerechner [data-value-scenario=\"best\"][aria-pressed=\"true\"]{background:#16a34a!important;color:#fff!important;box-shadow:none!important}\r\n    #eko21-plan-b-renditerechner .eko-results .eko-kpi strong,#eko21-plan-b-renditerechner .eko-results .eko-result-list strong{color:#0f172a!important}\r\n    #eko21-plan-b-renditerechner .eko-results .eko-result-list strong.eko-result-worst{color:#f97316!important}\r\n    #eko21-plan-b-renditerechner .eko-results .eko-result-list strong.eko-result-average{color:#2563eb!important}\r\n    #eko21-plan-b-renditerechner .eko-results .eko-result-list strong.eko-result-best{color:#16a34a!important}\r\n    #eko21-plan-b-renditerechner.eko-tone-worst .eko-bar{background:#f97316!important}\r\n    #eko21-plan-b-renditerechner.eko-tone-average .eko-bar{background:#2563eb!important}\r\n    #eko21-plan-b-renditerechner.eko-tone-best .eko-bar{background:#16a34a!important}\r\n    #eko21-plan-b-renditerechner .eko-season-table,#eko21-plan-b-renditerechner .eko-projection-table{width:100%;border-collapse:collapse;margin-bottom:14px;background:#fff;table-layout:fixed}\r\n    #eko21-plan-b-renditerechner .eko-projection-table col,#eko21-plan-b-renditerechner .eko-season-table col{width:25%}\r\n    #eko21-plan-b-renditerechner .eko-season-table th,#eko21-plan-b-renditerechner .eko-season-table td,#eko21-plan-b-renditerechner .eko-projection-table th,#eko21-plan-b-renditerechner .eko-projection-table td{border:0;padding:10px!important;vertical-align:middle;box-shadow:inset 0 -1px 0 rgba(15,23,42,.08);text-align:left!important;text-align-last:left!important;font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\" 1;white-space:nowrap}\r\n    #eko21-plan-b-renditerechner .eko-projection-table th:not(:first-child),#eko21-plan-b-renditerechner .eko-projection-table td:not(:first-child),#eko21-plan-b-renditerechner .eko-season-table th:not(:first-child),#eko21-plan-b-renditerechner .eko-season-table td:not(:first-child){text-align:left!important;text-align-last:left!important;padding-left:10px!important;padding-right:10px!important}\r\n    #eko21-plan-b-renditerechner .eko-projection-table td[id],#eko21-plan-b-renditerechner .eko-season-table input{direction:ltr!important;unicode-bidi:isolate!important}\r\n    #eko21-plan-b-renditerechner .eko-season-table th,#eko21-plan-b-renditerechner .eko-projection-table th{font-size:13px;color:var(--ek-muted);font-weight:900;background:#f1f5f9}\r\n    #eko21-plan-b-renditerechner .eko-season-table td:first-child{font-weight:900;color:#1e293b}\r\n    #eko21-plan-b-renditerechner .eko-season-table input{width:100%;min-width:78px;height:40px;border:0;background:#fff;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08);padding:8px;font:inherit;text-align:left!important;font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\" 1}\r\n    #eko21-plan-b-renditerechner .eko-results{padding:clamp(20px,3vw,32px);background:linear-gradient(135deg,rgba(0,220,255,.08),rgba(0,79,77,.04));border:0;margin-top:24px;box-shadow:inset 0 0 0 1px rgba(0,220,255,.18)}\r\n    #eko21-plan-b-renditerechner .eko-results h3{font-size:clamp(24px,3vw,32px);color:var(--ek-secondary);margin-bottom:18px}\r\n    #eko21-plan-b-renditerechner .eko-kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin-bottom:18px}\r\n    #eko21-plan-b-renditerechner .eko-kpi{background:#fff;border:0;padding:16px;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08);min-width:0;overflow:hidden}\r\n    #eko21-plan-b-renditerechner .eko-kpi span{display:block;color:var(--ek-muted);font-size:13px;margin-bottom:8px}\r\n    #eko21-plan-b-renditerechner .eko-kpi strong{display:block;font-size:clamp(20px,2.35vw,28px);line-height:1.08;letter-spacing:-.03em;color:var(--ek-secondary);white-space:normal;overflow-wrap:anywhere}\r\n    #eko21-plan-b-renditerechner #eko21-selectedModelResult{font-size:clamp(18px,2vw,24px);letter-spacing:-.02em}\r\n    #eko21-plan-b-renditerechner .eko-compare-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin:0 0 18px}\r\n    #eko21-plan-b-renditerechner .eko-compare-card{background:#fff;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08);padding:18px}\r\n    #eko21-plan-b-renditerechner .eko-compare-card h4{margin:0 0 14px;color:var(--ek-secondary);font-size:20px;line-height:1.2}\r\n    #eko21-plan-b-renditerechner .eko-compare-card ul,#eko21-plan-b-renditerechner .eko-result-list{list-style:none!important;margin:0!important;padding:0!important}\r\n    #eko21-plan-b-renditerechner .eko-compare-card li,#eko21-plan-b-renditerechner .eko-result-list li{list-style:none!important}\r\n    #eko21-plan-b-renditerechner .eko-compare-card li::before,#eko21-plan-b-renditerechner .eko-result-list li::before{content:none!important;display:none!important}\r\n    #eko21-plan-b-renditerechner .eko-compare-card li{display:flex;justify-content:space-between;gap:12px;padding:10px 0;box-shadow:inset 0 -1px 0 rgba(15,23,42,.08);font-size:14px;text-align:left}\r\n    #eko21-plan-b-renditerechner .eko-compare-card li:last-child{box-shadow:none}\r\n    #eko21-plan-b-renditerechner .eko-compare-card span{color:#475569}\r\n    #eko21-plan-b-renditerechner .eko-compare-card strong{text-align:right;color:#0f172a}\r\n    #eko21-plan-b-renditerechner .eko-result-list{background:#fff;border:0;overflow:hidden;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08)}\r\n    #eko21-plan-b-renditerechner .eko-result-list li{display:flex;justify-content:space-between;gap:14px;padding:13px 16px;box-shadow:inset 0 -1px 0 rgba(15,23,42,.08);font-size:15px}\r\n    #eko21-plan-b-renditerechner .eko-result-list li:last-child{box-shadow:none}\r\n    #eko21-plan-b-renditerechner .eko-result-list span:first-child{color:#475569}\r\n    #eko21-plan-b-renditerechner .eko-result-list strong{text-align:right;color:#0f172a}\r\n    #eko21-plan-b-renditerechner .eko-bar-wrap{background:#dbe3ef;height:12px;overflow:hidden;margin:0 0 18px}\r\n    #eko21-plan-b-renditerechner .eko-bar{display:block;height:100%;width:0%;background:linear-gradient(90deg,var(--ek-secondary),var(--ek-primary));transition:width .25s ease}\r\n    #eko21-plan-b-renditerechner .eko-actions{display:flex;flex-wrap:wrap;gap:12px;margin-top:18px}\r\n    #eko21-plan-b-renditerechner .eko-btn-primary{background:var(--ek-primary);color:#001316;box-shadow:none}\r\n    #eko21-plan-b-renditerechner .eko-btn-ghost{background:#fff;color:var(--ek-secondary)}\r\n    #eko21-plan-b-renditerechner .eko-btn-whatsapp{display:inline-flex;align-items:center;gap:8px;background:#25D366;color:#fff!important;text-decoration:none;box-shadow:none}\r\n    #eko21-plan-b-renditerechner .eko-btn-whatsapp span{color:#fff!important}\r\n    #eko21-plan-b-renditerechner .eko-btn-whatsapp:hover{background:#128C7E;color:#fff!important;text-decoration:none}\r\n    #eko21-plan-b-renditerechner .eko-btn-whatsapp:hover span{color:#fff!important}\r\n    #eko21-plan-b-renditerechner .eko-btn-whatsapp img{display:block;width:22px;height:22px;object-fit:contain;flex:0 0 auto}\r\n    #eko21-plan-b-renditerechner .eko-disclaimer{margin:16px 0 0;font-size:13px;line-height:1.5;color:var(--ek-muted);text-align:justify}\r\n    #eko21-plan-b-renditerechner .eko-logo-wrap{display:flex;justify-content:flex-start;align-items:center;margin:0 0 22px}\r\n    #eko21-plan-b-renditerechner .eko-logo-wrap img{width:min(260px,70vw);height:auto;display:block}\r\n    #eko21-plan-b-renditerechner .eko-legal-disclaimer{margin-top:18px;padding:16px;background:#fff;color:#475569;font-size:13px;line-height:1.55;text-align:justify;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08)}\r\n    #eko21-plan-b-renditerechner .eko-hidden{display:none!important}\r\n\r\n    \/* Keep table layout stable: real tables, values left-aligned *\/\r\n    #eko21-plan-b-renditerechner .eko-projection-table,\r\n    #eko21-plan-b-renditerechner .eko-season-table{display:table!important;width:100%!important;border-collapse:collapse!important;table-layout:fixed!important;background:#fff!important}\r\n    #eko21-plan-b-renditerechner .eko-projection-table thead,\r\n    #eko21-plan-b-renditerechner .eko-season-table thead{display:table-header-group!important}\r\n    #eko21-plan-b-renditerechner .eko-projection-table tbody,\r\n    #eko21-plan-b-renditerechner .eko-season-table tbody{display:table-row-group!important}\r\n    #eko21-plan-b-renditerechner .eko-projection-table tr,\r\n    #eko21-plan-b-renditerechner .eko-season-table tr{display:table-row!important}\r\n    #eko21-plan-b-renditerechner .eko-projection-table th,\r\n    #eko21-plan-b-renditerechner .eko-projection-table td,\r\n    #eko21-plan-b-renditerechner .eko-season-table th,\r\n    #eko21-plan-b-renditerechner .eko-season-table td{display:table-cell!important;text-align:left!important;text-align-last:left!important;vertical-align:middle!important;padding:10px!important;white-space:nowrap!important;font-variant-numeric:tabular-nums!important;font-feature-settings:\"tnum\" 1!important}\r\n    #eko21-plan-b-renditerechner .eko-season-table input{display:block!important;width:100%!important;text-align:left!important;text-align-last:left!important;margin:0!important}\r\n    #eko21-plan-b-renditerechner .eko-projection-table th,\r\n    #eko21-plan-b-renditerechner .eko-projection-table td,\r\n    #eko21-plan-b-renditerechner .eko-season-table th,\r\n    #eko21-plan-b-renditerechner .eko-season-table td,\r\n    #eko21-plan-b-renditerechner .eko-projection-table tbody td,\r\n    #eko21-plan-b-renditerechner .eko-season-table tbody td,\r\n    #eko21-plan-b-renditerechner .eko-season-table input{text-align:left!important;font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\" 1}\r\n\r\n    #eko21-plan-b-renditerechner .eko-model-switch{grid-template-columns:repeat(2,minmax(0,1fr))}\r\n    #eko21-plan-b-renditerechner .eko-rate-checks{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:8px;margin-top:4px}\r\n    #eko21-plan-b-renditerechner .eko-rate-check{display:flex;align-items:center;gap:6px;background:#fff;padding:10px;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08);font-size:13px;font-weight:800;color:#1e293b;cursor:pointer}\r\n    #eko21-plan-b-renditerechner .eko-rate-check input{accent-color:var(--ek-secondary)}\r\n    @media(max-width:720px){#eko21-plan-b-renditerechner .eko-rate-checks{grid-template-columns:repeat(2,minmax(0,1fr))}}\r\n\r\n    #eko21-plan-b-renditerechner .eko-rate-checks{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:8px;margin:4px 0 8px}\r\n    #eko21-plan-b-renditerechner .eko-rate-check{display:flex;align-items:center;justify-content:center;gap:6px;background:#fff;padding:12px 10px;box-shadow:inset 0 0 0 1px rgba(15,23,42,.08);font-size:14px;font-weight:800;color:var(--ek-secondary);cursor:pointer}\r\n    #eko21-plan-b-renditerechner .eko-rate-check input{accent-color:var(--ek-secondary)}\r\n    #eko21-plan-b-renditerechner .eko-rate-check:has(input:checked){background:var(--ek-secondary);color:#fff;box-shadow:none}\r\n    #eko21-plan-b-renditerechner .eko-rate-field{grid-column:1\/-1}\r\n    @media(max-width:980px){#eko21-plan-b-renditerechner .eko-rate-checks{grid-template-columns:repeat(4,minmax(0,1fr))}}\r\n    @media(max-width:720px){#eko21-plan-b-renditerechner .eko-rate-checks{grid-template-columns:repeat(2,minmax(0,1fr))}}\r\n    @media(max-width:980px){#eko21-plan-b-renditerechner .eko-field-grid,#eko21-plan-b-renditerechner .eko-kpi-grid,#eko21-plan-b-renditerechner .eko-compare-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}\r\n    @media(max-width:720px){#eko21-plan-b-renditerechner{padding:18px;box-shadow:none}#eko21-plan-b-renditerechner .eko-field-grid,#eko21-plan-b-renditerechner .eko-kpi-grid,#eko21-plan-b-renditerechner .eko-scenario-switch,#eko21-plan-b-renditerechner .eko-radio-group,#eko21-plan-b-renditerechner .eko-model-switch,#eko21-plan-b-renditerechner .eko-compare-grid,#eko21-plan-b-renditerechner .eko-platform-grid,#eko21-plan-b-renditerechner .eko-platform-summary{grid-template-columns:1fr}#eko21-plan-b-renditerechner .eko-result-list li,#eko21-plan-b-renditerechner .eko-compare-card li{display:block}#eko21-plan-b-renditerechner .eko-result-list strong,#eko21-plan-b-renditerechner .eko-compare-card strong{display:block;text-align:left;margin-top:4px}#eko21-plan-b-renditerechner .eko-projection-table,#eko21-plan-b-renditerechner .eko-season-table{display:block!important;overflow-x:auto!important;white-space:nowrap!important}#eko21-plan-b-renditerechner .eko-projection-table thead,#eko21-plan-b-renditerechner .eko-season-table thead{display:table-header-group!important}#eko21-plan-b-renditerechner .eko-projection-table tbody,#eko21-plan-b-renditerechner .eko-season-table tbody{display:table-row-group!important}#eko21-plan-b-renditerechner .eko-projection-table tr,#eko21-plan-b-renditerechner .eko-season-table tr{display:table-row!important}#eko21-plan-b-renditerechner .eko-projection-table th,#eko21-plan-b-renditerechner .eko-projection-table td,#eko21-plan-b-renditerechner .eko-season-table th,#eko21-plan-b-renditerechner .eko-season-table td{display:table-cell!important;min-width:120px!important}}\r\n  <\/style>\r\n\r\n  <span class=\"eko-roi-eyebrow\">Real Estate Calculator \/ Ulcinj<\/span>\r\n  <h2>ROI Calculator for Real Estate in Ulcinj 2026: calculate costs, yield and value appreciation clearly<\/h2>\r\n  <p class=\"eko-roi-intro\"><strong>ROI Calculator for Real Estate in Ulcinj 2026:<\/strong> This neutral tool calculates purchase price, purchase-related costs, transfer tax, electricity, water, waste, internet, management, platform fees, seasonal rental, long-term rental, cash flow, net yield and potential value appreciation. The calculator helps assess real estate in Ulcinj economically before purchase &mdash; not as a forecast, but as a transparent scenario for rental income, cost structure and long-term viability.<\/p>\r\n\r\n  <p class=\"eko-roi-intro\">The <strong>ROI calculator for real estate<\/strong> is suitable for apartments, houses and investment properties in Ulcinj. It shows how different assumptions regarding purchase price, use, consumption, rental model and value development affect annual revenue, net cash flow and yield.<\/p>\r\n\r\n  <p class=\"eko-roi-intro\">For a property-specific review, you can contact us directly via the <a href=\"https:\/\/ekosphere.me\/kontakt\/\">contact page<\/a> .<\/p>\r\n\r\n  <div class=\"eko-section\">\r\n    <h3>Property, purchase price and purchase-related costs<\/h3>\r\n    <details class=\"eko-help-details\">\r\n      <summary>Note on purchase type, transfer tax and purchase-related costs<\/summary>\r\n      <div>The calculator uses an embedded progressive transfer-tax scenario for existing properties. New-build property purchased directly from the investor is calculated with 0.00 euros transfer tax. The actual contract and tax structure must be reviewed for the specific property.<\/div>\r\n    <\/details>\r\n\r\n    <div class=\"eko-field-grid\">\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-purchasePrice\">Purchase price<\/label>\r\n        <input id=\"eko21-purchasePrice\" autocomplete=\"off\" type=\"text\" value=\"160.000,00 &euro;\" data-eko-input inputmode=\"decimal\">\r\n        <small>Basis for transfer tax, property tax, ancillary costs, yield and value development.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-purchaseType\">Purchase type<\/label>\r\n        <select id=\"eko21-purchaseType\" autocomplete=\"off\" data-eko-input>\r\n          <option value=\"existing\" selected>Existing property<\/option>\r\n          <option value=\"newbuild\">New-build property<\/option>\r\n        <\/select>\r\n        <small>Existing property: transfer tax is calculated. New-build property: transfer tax is set to 0.00 euros in the calculator.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-livingArea\">Living area in m&sup2;<\/label>\r\n        <input id=\"eko21-livingArea\" autocomplete=\"off\" type=\"text\" value=\"54,00\" data-eko-input inputmode=\"decimal\">\r\n        <small>Basis for building management: living area &times; rate per m&sup2; &times; 12 months.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-bedroomType\">Number of bedrooms<\/label>\r\n        <select id=\"eko21-bedroomType\" autocomplete=\"off\" data-eko-input>\r\n          <option value=\"studio\">One-room apartment \/ studio<\/option>\r\n          <option value=\"one\" selected>1 bedroom<\/option>\r\n          <option value=\"two\">2 bedrooms<\/option>\r\n          <option value=\"three\">3 bedrooms<\/option>\r\n        <\/select>\r\n        <small>Controls the default prices in the seasonal model: average-case high season = 80.00 euros per bedroom and night; worst \/ best cases as well as pre-season \/ post-season are derived from this.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-extraCosts\">Notarial purchase-related costs<\/label>\r\n        <input id=\"eko21-extraCosts\" autocomplete=\"off\" type=\"text\" value=\"0,00 &euro;\" readonly>\r\n        <small>One-time acquisition costs. Calculator formula: notary estimate, 21 percent VAT, cadastre, translation \/ interpreter and reserve. Excluding transfer tax.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-stateTransferTax\">One-time real estate transfer tax<\/label>\r\n        <input id=\"eko21-stateTransferTax\" autocomplete=\"off\" type=\"text\" value=\"0,00 &euro;\" readonly>\r\n        <small>One-time acquisition costs. Progressively calculated for existing properties. 0.00 euros for new-build properties.<\/small>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"eko-section\">\r\n    <h3>Select rental model<\/h3>\r\n    <details class=\"eko-help-details\">\r\n      <summary>Select the model first, then review the scenario<\/summary>\r\n      <div>First select whether the property should be calculated as a seasonal rental or as a long-term rental. In the seasonal model, household consumption is not requested and is not included in the calculation. In the long-term rental model, electricity, water, waste and internet are treated as recoverable tenant service charges and do not reduce the owner cash flow.<\/div>\r\n    <\/details>\r\n\r\n    <div class=\"eko-model-switch\" aria-label=\"Select rental model\">\r\n      <button type=\"button\" data-rental-model=\"season\" aria-pressed=\"true\">Seasonal model<\/button>\r\n      <button type=\"button\" data-rental-model=\"longrent\" aria-pressed=\"false\">Long-term rental model<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"eko-section\" id=\"eko21-householdSection\">\r\n    <h3>Household consumption: electricity, water, waste and internet<\/h3>\r\n    <details class=\"eko-help-details\">\r\n      <summary>Note on electricity, night electricity and water<\/summary>\r\n      <div>This block is only displayed when the long-term rental model or model comparison is selected. The calculator uses 0.112 euros gross per kWh for day electricity and 0.0605 euros gross per kWh for night electricity as default assumptions. Monthly base fees for electricity, water, waste and internet are also considered. In the long-term rental model, these positions are treated as recoverable tenant service charges and do not reduce the owner cash flow.<\/div>\r\n    <\/details>\r\n\r\n    <div class=\"eko-scenario-switch\" aria-label=\"Select consumption scenario\">\r\n      <button type=\"button\" data-household-scenario=\"worst\" aria-pressed=\"false\">Worst Case<\/button>\r\n      <button type=\"button\" data-household-scenario=\"average\" aria-pressed=\"true\">Average Case<\/button>\r\n      <button type=\"button\" data-household-scenario=\"best\" aria-pressed=\"false\">Best Case<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"eko-radio-title\">Household assumption<\/div>\r\n    <div class=\"eko-radio-group\" role=\"radiogroup\" aria-label=\"Household assumption for electricity and water\">\r\n      <label class=\"eko-radio\"><input type=\"radio\" autocomplete=\"off\" name=\"eko21-householdProfile\" value=\"one\" data-eko-input> <strong>1 person<\/strong><br><small id=\"eko21-profileOneInfo\">Average case: 120 kWh electricity \/ month, 4 m&sup3; water \/ month.<\/small><\/label>\r\n      <label class=\"eko-radio\"><input type=\"radio\" autocomplete=\"off\" name=\"eko21-householdProfile\" value=\"two\" checked data-eko-input> <strong>2 persons<\/strong><br><small id=\"eko21-profileTwoInfo\">Average case: 200 kWh electricity \/ month, 8 m&sup3; water \/ month.<\/small><\/label>\r\n      <label class=\"eko-radio\"><input type=\"radio\" autocomplete=\"off\" name=\"eko21-householdProfile\" value=\"family\" data-eko-input> <strong>Family<\/strong><br><small id=\"eko21-profileFamilyInfo\">Average case: 340 kWh electricity \/ month, 14 m&sup3; water \/ month.<\/small><\/label>\r\n    <\/div>\r\n\r\n    <div class=\"eko-field-grid\">\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-dayPowerPrice\">Day electricity \/ kWh gross<\/label>\r\n        <input id=\"eko21-dayPowerPrice\" autocomplete=\"off\" type=\"text\" value=\"0,112 &euro;\" data-eko-input inputmode=\"decimal\">\r\n        <small>Default: 0.112 euros gross per kWh day electricity.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-nightPowerPrice\">Night electricity \/ kWh gross<\/label>\r\n        <input id=\"eko21-nightPowerPrice\" autocomplete=\"off\" type=\"text\" value=\"0,0605 &euro;\" data-eko-input inputmode=\"decimal\">\r\n        <small>Default: 0.0605 euros gross per kWh night electricity.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-powerBaseMonthly\">Electricity base fee \/ month<\/label>\r\n        <input id=\"eko21-powerBaseMonthly\" autocomplete=\"off\" type=\"text\" value=\"4,00 &euro;\" data-eko-input inputmode=\"decimal\">\r\n        <small>Monthly electricity base fee.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-nightPowerShare\">Night electricity share in %<\/label>\r\n        <input id=\"eko21-nightPowerShare\" autocomplete=\"off\" type=\"text\" value=\"20,00%\" data-eko-input data-power-share=\"night\" inputmode=\"decimal\">\r\n        <small>The day electricity share is calculated automatically as the countervalue.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-dayPowerShare\">Day electricity share in %<\/label>\r\n        <input id=\"eko21-dayPowerShare\" autocomplete=\"off\" type=\"text\" value=\"80,00%\" data-eko-input data-power-share=\"day\" inputmode=\"decimal\">\r\n        <small>Day electricity + night electricity always equal 100.00 percent.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-powerMonthly\">Electricity costs \/ month<\/label>\r\n        <input id=\"eko21-powerMonthly\" autocomplete=\"off\" type=\"text\" value=\"0,00 &euro;\" readonly>\r\n        <small>Formula: day electricity share &times; day electricity price + night electricity share &times; night electricity price + electricity base fee.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-waterPrice\">Water price per m&sup3;<\/label>\r\n        <input id=\"eko21-waterPrice\" autocomplete=\"off\" type=\"text\" value=\"1,20 &euro;\" data-eko-input inputmode=\"decimal\">\r\n        <small>Default: 1.20 euros per cubic meter.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-waterBaseMonthly\">Water base fee \/ month<\/label>\r\n        <input id=\"eko21-waterBaseMonthly\" autocomplete=\"off\" type=\"text\" value=\"4,00 &euro;\" data-eko-input inputmode=\"decimal\">\r\n        <small>Monthly water base fee.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-waterMonthly\">Water costs \/ month<\/label>\r\n        <input id=\"eko21-waterMonthly\" autocomplete=\"off\" type=\"text\" value=\"0,00 &euro;\" readonly>\r\n        <small>Formula: m&sup3; consumption &times; water price + water base fee.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-wasteMonthly\">Waste base fee \/ month<\/label>\r\n        <input id=\"eko21-wasteMonthly\" autocomplete=\"off\" type=\"text\" value=\"4,00 &euro;\" data-eko-input inputmode=\"decimal\">\r\n        <small>Default assumption: 4.00 euros monthly. Treated as recoverable in the long-term rental model.<\/small>\r\n      <\/div>\r\n\r\n      <div class=\"eko-field\">\r\n        <label for=\"eko21-internetMonthly\">Internet costs \/ month<\/label>\r\n        <input id=\"eko21-internetMonthly\" autocomplete=\"off\" type=\"text\" value=\"20,00 &euro;\" data-eko-input inputmode=\"decimal\">\r\n        <small>Default assumption: 20.00 euros monthly. Treated as recoverable tenant service charges in the long-term rental model.<\/small>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"eko-section\" id=\"eko21-seasonModelSection\">\r\n    <h3>Seasonal model with scenario selection<\/h3>\r\n    <details class=\"eko-help-details\">\r\n      <summary>Note on the seasonal model<\/summary>\r\n      <div>The year is divided into high season, pre-season, post-season and winter stay. Annual revenue is calculated from days &times; occupancy &times; price per overnight stay. MONSTAT publishes reliable arrivals and overnight stays, but no average private apartment nightly rates for Ulcinj. The price fields therefore remain editable market assumptions and are prefilled via the apartment type \/ number of bedrooms. Household consumption, electricity, water, waste and internet are not requested in the seasonal model and are not treated as owner costs.<\/div>\r\n    <\/details>\r\n\r\n    <div class=\"eko-scenario-switch\" aria-label=\"Select seasonal scenario\">\r\n      <button type=\"button\" data-scenario=\"worst\" aria-pressed=\"false\">Worst Case<\/button>\r\n      <button type=\"button\" data-scenario=\"average\" aria-pressed=\"true\">Average Case<\/button>\r\n      <button type=\"button\" data-scenario=\"best\" aria-pressed=\"false\">Best Case<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"eko-field-grid\">\r\n      <div class=\"eko-field\"><label for=\"eko21-seasonIncomeGrowthActive\">Active rent increase p.a.<\/label><input id=\"eko21-seasonIncomeGrowthActive\" autocomplete=\"off\" type=\"text\" value=\"6,00%\" readonly><small>Automatically based on the active seasonal scenario.<\/small><\/div>\r\n      <div class=\"eko-field\"><label for=\"eko21-seasonRevenueYear1\">Seasonal revenue year 1<\/label><input id=\"eko21-seasonRevenueYear1\" autocomplete=\"off\" type=\"text\" value=\"0,00 &euro;\" readonly><small>Calculated from overnights, prices and occupancy.<\/small><\/div>\r\n      <div class=\"eko-field\"><label for=\"eko21-seasonRevenueYear5\">Seasonal revenue year 5<\/label><input id=\"eko21-seasonRevenueYear5\" autocomplete=\"off\" type=\"text\" value=\"0,00 &euro;\" readonly><small>Year-5 revenue with active income growth.<\/small><\/div>\r\n    <\/div>\r\n\r\n    <p class=\"eko-disclaimer\">MONSTAT reference: The seasonal logic is based on official tourism data on arrivals and overnight stays. Average private nightly rates for individual apartment types are not published by MONSTAT as a reliable price series; the price fields therefore remain editable assumptions.<\/p>\r\n\r\n    <table class=\"eko-season-table\" aria-label=\"Seasonal values for short-term rental\">\r\n      <colgroup><col><col><col><col><\/colgroup>\r\n      <thead><tr><th>Season period<\/th><th>Days<\/th><th>Price \/ overnight stay<\/th><th>Occupancy<\/th><\/tr><\/thead>\r\n      <tbody>\r\n        <tr><td>High season &middot; 90 days<\/td><td><input id=\"eko21-nightsHigh\" autocomplete=\"off\" type=\"text\" value=\"90,00\" data-eko-input inputmode=\"decimal\"><\/td><td><input id=\"eko21-rateHigh\" autocomplete=\"off\" type=\"text\" value=\"80,00 &euro;\" data-eko-input inputmode=\"decimal\"><\/td><td><input id=\"eko21-occHigh\" autocomplete=\"off\" type=\"text\" value=\"82,00%\" data-eko-input inputmode=\"decimal\"><\/td><\/tr>\r\n        <tr><td>Pre-season &middot; 90 days<\/td><td><input id=\"eko21-nightsPre\" autocomplete=\"off\" type=\"text\" value=\"90,00\" data-eko-input inputmode=\"decimal\"><\/td><td><input id=\"eko21-ratePre\" autocomplete=\"off\" type=\"text\" value=\"60,00 &euro;\" data-eko-input inputmode=\"decimal\"><\/td><td><input id=\"eko21-occPre\" autocomplete=\"off\" type=\"text\" value=\"42,00%\" data-eko-input inputmode=\"decimal\"><\/td><\/tr>\r\n        <tr><td>Post-season &middot; 60 days<\/td><td><input id=\"eko21-nightsPost\" autocomplete=\"off\" type=\"text\" value=\"60,00\" data-eko-input inputmode=\"decimal\"><\/td><td><input id=\"eko21-ratePost\" autocomplete=\"off\" type=\"text\" value=\"50,00 &euro;\" data-eko-input inputmode=\"decimal\"><\/td><td><input id=\"eko21-occPost\" autocomplete=\"off\" type=\"text\" value=\"32,00%\" data-eko-input inputmode=\"decimal\"><\/td><\/tr>\r\n        <tr><td>Winter stay &middot; 125 days<\/td><td><input id=\"eko21-nightsWinter\" autocomplete=\"off\" type=\"text\" value=\"125,00\" data-eko-input inputmode=\"decimal\"><\/td><td><input id=\"eko21-rateWinter\" autocomplete=\"off\" type=\"text\" value=\"32,00 &euro;\" data-eko-input inputmode=\"decimal\"><\/td><td><input id=\"eko21-occWinter\" autocomplete=\"off\" type=\"text\" value=\"16,00%\" data-eko-input inputmode=\"decimal\"><\/td><\/tr>\r\n      <\/tbody>\r\n    <\/table>\r\n\r\n    <table class=\"eko-projection-table\" aria-label=\"Seasonal projection\">\r\n      <colgroup><col><col><col><col><\/colgroup>\r\n      <thead><tr><th>Period<\/th><th>Worst Case<\/th><th>Average Case<\/th><th>Best Case<\/th><\/tr><\/thead>\r\n      <tbody>\r\n        <tr><td>5 years<\/td><td id=\"eko21-seasonWorst5\">0,00 &euro;<\/td><td id=\"eko21-seasonAverage5\">0,00 &euro;<\/td><td id=\"eko21-seasonBest5\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>10 years<\/td><td id=\"eko21-seasonWorst10\">0,00 &euro;<\/td><td id=\"eko21-seasonAverage10\">0,00 &euro;<\/td><td id=\"eko21-seasonBest10\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>15 years<\/td><td id=\"eko21-seasonWorst15\">0,00 &euro;<\/td><td id=\"eko21-seasonAverage15\">0,00 &euro;<\/td><td id=\"eko21-seasonBest15\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>20 years<\/td><td id=\"eko21-seasonWorst20\">0,00 &euro;<\/td><td id=\"eko21-seasonAverage20\">0,00 &euro;<\/td><td id=\"eko21-seasonBest20\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>25 years<\/td><td id=\"eko21-seasonWorst25\">0,00 &euro;<\/td><td id=\"eko21-seasonAverage25\">0,00 &euro;<\/td><td id=\"eko21-seasonBest25\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>30 years<\/td><td id=\"eko21-seasonWorst30\">0,00 &euro;<\/td><td id=\"eko21-seasonAverage30\">0,00 &euro;<\/td><td id=\"eko21-seasonBest30\">0,00 &euro;<\/td><\/tr>\r\n      <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  <div class=\"eko-section eko-hidden\" id=\"eko21-longRentModelSection\">\r\n    <h3>Long-term rental model with scenario selection<\/h3>\r\n    <details class=\"eko-help-details\">\r\n      <summary>Note on the long-term rental model<\/summary>\r\n      <div>The long-term rental model calculates with monthly rent, rented months per year and progressive rental income growth p.a. Electricity, water, waste and internet are treated as recoverable tenant service charges and do not reduce the owner cash flow.<\/div>\r\n    <\/details>\r\n\r\n    <div class=\"eko-scenario-switch\" aria-label=\"Select long-term rental scenario\">\r\n      <button type=\"button\" data-longrent-scenario=\"worst\" aria-pressed=\"false\">Worst Case<\/button>\r\n      <button type=\"button\" data-longrent-scenario=\"average\" aria-pressed=\"true\">Average Case<\/button>\r\n      <button type=\"button\" data-longrent-scenario=\"best\" aria-pressed=\"false\">Best Case<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"eko-field-grid\">\r\n      <div class=\"eko-field\"><label for=\"eko21-longRentMonthly\">Rent \/ month<\/label><input id=\"eko21-longRentMonthly\" autocomplete=\"off\" type=\"text\" value=\"450,00 &euro;\" data-eko-input inputmode=\"decimal\"><small>Monthly net rent as starting value.<\/small><\/div>\r\n      <div class=\"eko-field\"><label for=\"eko21-longRentMonths\">Rented months \/ year<\/label><input id=\"eko21-longRentMonths\" autocomplete=\"off\" type=\"text\" value=\"12,00\" data-eko-input inputmode=\"decimal\"><small>Default: 12 months. Vacancy can be represented through fewer months.<\/small><\/div>\r\n      <div class=\"eko-field\"><label for=\"eko21-longRentGrowthActive\">Active rent increase p.a.<\/label><input id=\"eko21-longRentGrowthActive\" autocomplete=\"off\" type=\"text\" value=\"6,00%\" readonly><small>Automatically based on the active long-term rental scenario.<\/small><\/div>\r\n    <\/div>\r\n\r\n    <table class=\"eko-projection-table\" aria-label=\"Long-term rental projection\">\r\n      <colgroup><col><col><col><col><\/colgroup>\r\n      <thead><tr><th>Period<\/th><th>Worst Case<\/th><th>Average Case<\/th><th>Best Case<\/th><\/tr><\/thead>\r\n      <tbody>\r\n        <tr><td>5 years<\/td><td id=\"eko21-longRentWorst5\">0,00 &euro;<\/td><td id=\"eko21-longRentAverage5\">0,00 &euro;<\/td><td id=\"eko21-longRentBest5\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>10 years<\/td><td id=\"eko21-longRentWorst10\">0,00 &euro;<\/td><td id=\"eko21-longRentAverage10\">0,00 &euro;<\/td><td id=\"eko21-longRentBest10\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>15 years<\/td><td id=\"eko21-longRentWorst15\">0,00 &euro;<\/td><td id=\"eko21-longRentAverage15\">0,00 &euro;<\/td><td id=\"eko21-longRentBest15\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>20 years<\/td><td id=\"eko21-longRentWorst20\">0,00 &euro;<\/td><td id=\"eko21-longRentAverage20\">0,00 &euro;<\/td><td id=\"eko21-longRentBest20\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>25 years<\/td><td id=\"eko21-longRentWorst25\">0,00 &euro;<\/td><td id=\"eko21-longRentAverage25\">0,00 &euro;<\/td><td id=\"eko21-longRentBest25\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>30 years<\/td><td id=\"eko21-longRentWorst30\">0,00 &euro;<\/td><td id=\"eko21-longRentAverage30\">0,00 &euro;<\/td><td id=\"eko21-longRentBest30\">0,00 &euro;<\/td><\/tr>\r\n      <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  <div class=\"eko-section\">\r\n    <h3>Fees, management and reserves<\/h3>\r\n    <details class=\"eko-help-details\">\r\n      <summary>Note on ongoing costs and fees<\/summary>\r\n      <div>Ongoing costs are treated depending on the model: in the seasonal model, household consumption, electricity, water, waste and internet are not applied. In the long-term rental model, these positions are shown as recoverable tenant service charges and are not deducted from the owner cash flow.<\/div>\r\n    <\/details>\r\n\r\n    <div class=\"eko-field-grid\">\r\n      <div class=\"eko-field eko-rate-field\">\r\n        <div class=\"eko-radio-title\">Management per m&sup2; \/ month<\/div>\r\n        <input id=\"eko21-propertyManagementPerSqm\" autocomplete=\"off\" type=\"hidden\" value=\"0,00 &euro;\" data-eko-input>\r\n        <div class=\"eko-rate-checks\" role=\"radiogroup\" aria-label=\"Select management rate per square meter and month\">\r\n          <label class=\"eko-rate-check\"><input type=\"radio\" name=\"eko21-managementRate\" autocomplete=\"off\" data-management-rate=\"0.20\">20 Cent<\/label>\r\n          <label class=\"eko-rate-check\"><input type=\"radio\" name=\"eko21-managementRate\" autocomplete=\"off\" data-management-rate=\"0.25\">25 Cent<\/label>\r\n          <label class=\"eko-rate-check\"><input type=\"radio\" name=\"eko21-managementRate\" autocomplete=\"off\" data-management-rate=\"0.30\">30 Cent<\/label>\r\n          <label class=\"eko-rate-check\"><input type=\"radio\" name=\"eko21-managementRate\" autocomplete=\"off\" data-management-rate=\"0.35\">35 Cent<\/label>\r\n          <label class=\"eko-rate-check\"><input type=\"radio\" name=\"eko21-managementRate\" autocomplete=\"off\" data-management-rate=\"0.40\">40 Cent<\/label>\r\n          <label class=\"eko-rate-check\"><input type=\"radio\" name=\"eko21-managementRate\" autocomplete=\"off\" data-management-rate=\"0.45\">45 Cent<\/label>\r\n          <label class=\"eko-rate-check\"><input type=\"radio\" name=\"eko21-managementRate\" autocomplete=\"off\" data-management-rate=\"0.50\">50 Cent<\/label>\r\n        <\/div>\r\n        <small>Only one rate is calculated as active at a time. If no selection is made, 0.00 euros are applied.<\/small>\r\n      <\/div>\r\n      <div class=\"eko-field\"><label for=\"eko21-propertyManagementMonthly\">Management costs \/ month<\/label><input id=\"eko21-propertyManagementMonthly\" autocomplete=\"off\" type=\"text\" value=\"0,00 &euro;\" readonly><small>Automatically from living area and rate per m&sup2;.<\/small><\/div>\r\n      <div class=\"eko-field\"><label for=\"eko21-propertyTaxRate\">Property tax p.a. in %<\/label><input id=\"eko21-propertyTaxRate\" autocomplete=\"off\" type=\"text\" value=\"0,25%\" data-eko-input inputmode=\"decimal\"><small>Formula: purchase price &times; tax rate. Ongoing owner costs.<\/small><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"eko-field\" id=\"eko21-platformFeeSection\">\r\n      <div class=\"eko-radio-title\">Select platform \/ payment fees<\/div>\r\n      <div class=\"eko-platform-grid\" aria-label=\"Select platform fees\">\r\n        <label class=\"eko-platform-check\"><span class=\"eko-platform-logo\"><img src=\"https:\/\/ekosphere.me\/wp-content\/uploads\/2026\/05\/airbnb-logo-e1779459741569.png\" alt=\"Airbnb\" loading=\"lazy\" decoding=\"async\"><\/span><input type=\"checkbox\" autocomplete=\"off\" value=\"airbnb\" data-platform-fee=\"15.5\" data-eko-input> <strong>Airbnb<\/strong><br><small>15.50 percent as host-fee assumption.<\/small><\/label>\r\n        <label class=\"eko-platform-check\"><span class=\"eko-platform-logo\"><img src=\"https:\/\/ekosphere.me\/wp-content\/uploads\/2026\/05\/booking-logo-e1779450421538.png\" alt=\"Booking.com\" loading=\"lazy\" decoding=\"async\"><\/span><input type=\"checkbox\" autocomplete=\"off\" value=\"booking\" data-platform-fee=\"15\" data-eko-input> <strong>Booking.com<\/strong><br><small>15.00 percent as standard commission assumption.<\/small><\/label>\r\n        <label class=\"eko-platform-check\"><span class=\"eko-platform-logo\"><img src=\"https:\/\/ekosphere.me\/wp-content\/uploads\/2026\/05\/expedia-logo-e1779450484250.png\" alt=\"Expedia\" loading=\"lazy\" decoding=\"async\"><\/span><input type=\"checkbox\" autocomplete=\"off\" value=\"expedia\" data-platform-fee=\"18\" data-eko-input> <strong>Expedia<\/strong><br><small>18.00 percent as conservative OTA assumption.<\/small><\/label>\r\n      <\/div>\r\n      <div class=\"eko-platform-summary\">\r\n        <div><span>Selected platform fees<\/span><strong id=\"eko21-selectedPlatformFees\">No platform selected<\/strong><\/div>\r\n        <div><span>Applied average<\/span><strong id=\"eko21-platformFeeAverageOut\">0,00%<\/strong><\/div>\r\n      <\/div>\r\n      <small>Platform costs are applied only in the seasonal model as variable deductions. If multiple platforms are active, the simple average of the selected commission rates is calculated, not the sum.<\/small>\r\n    <\/div>\r\n\r\n    <div class=\"eko-range-field\">\r\n      <label for=\"eko21-managementFee\">Management \/ support<\/label>\r\n      <div class=\"eko-range-line\"><input id=\"eko21-managementFee\" autocomplete=\"off\" type=\"range\" min=\"0\" max=\"35\" step=\"0.5\" value=\"0\" data-eko-input><output class=\"eko-range-value\" id=\"eko21-managementFeeOut\">0,00%<\/output><\/div>\r\n      <small>Default 0.00 percent. Support, handover, coordination, communication and ongoing property organization can be applied optionally.<\/small>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"eko-section\">\r\n    <h3>Value appreciation: 5 to 30 years<\/h3>\r\n    <details class=\"eko-help-details\">\r\n      <summary>Note on value development<\/summary>\r\n      <div>Value appreciation is prefilled with worst case 3.00 percent p.a., average case 6.00 percent p.a. and best case 9.00 percent p.a. The values remain editable and are not a forecast or guarantee.<\/div>\r\n    <\/details>\r\n\r\n    <div class=\"eko-scenario-switch\" aria-label=\"Select value-appreciation scenario\">\r\n      <button type=\"button\" data-value-scenario=\"worst\" aria-pressed=\"false\">Worst Case<\/button>\r\n      <button type=\"button\" data-value-scenario=\"average\" aria-pressed=\"true\">Average Case<\/button>\r\n      <button type=\"button\" data-value-scenario=\"best\" aria-pressed=\"false\">Best Case<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"eko-field-grid\">\r\n      <div class=\"eko-field\"><label for=\"eko21-appWorst\">Growth rate p.a.<\/label><input id=\"eko21-appWorst\" autocomplete=\"off\" type=\"text\" value=\"3,00%\" data-eko-input inputmode=\"decimal\"><small>Prefilled, editable.<\/small><\/div>\r\n      <div class=\"eko-field\"><label for=\"eko21-appAverage\">Growth rate p.a.<\/label><input id=\"eko21-appAverage\" autocomplete=\"off\" type=\"text\" value=\"6,00%\" data-eko-input inputmode=\"decimal\"><small>Prefilled, editable.<\/small><\/div>\r\n      <div class=\"eko-field\"><label for=\"eko21-appBest\">Growth rate p.a.<\/label><input id=\"eko21-appBest\" autocomplete=\"off\" type=\"text\" value=\"9,00%\" data-eko-input inputmode=\"decimal\"><small>Prefilled, editable.<\/small><\/div>\r\n    <\/div>\r\n\r\n    <table class=\"eko-projection-table\" aria-label=\"Value-appreciation scenarios\">\r\n      <colgroup><col><col><col><col><\/colgroup>\r\n      <thead><tr><th>Period<\/th><th>Worst Case<\/th><th>Average Case<\/th><th>Best Case<\/th><\/tr><\/thead>\r\n      <tbody>\r\n        <tr><td>5 years<\/td><td id=\"eko21-valueWorst5\">0,00 &euro;<\/td><td id=\"eko21-valueAverage5\">0,00 &euro;<\/td><td id=\"eko21-valueBest5\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>10 years<\/td><td id=\"eko21-valueWorst10\">0,00 &euro;<\/td><td id=\"eko21-valueAverage10\">0,00 &euro;<\/td><td id=\"eko21-valueBest10\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>15 years<\/td><td id=\"eko21-valueWorst15\">0,00 &euro;<\/td><td id=\"eko21-valueAverage15\">0,00 &euro;<\/td><td id=\"eko21-valueBest15\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>20 years<\/td><td id=\"eko21-valueWorst20\">0,00 &euro;<\/td><td id=\"eko21-valueAverage20\">0,00 &euro;<\/td><td id=\"eko21-valueBest20\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>25 years<\/td><td id=\"eko21-valueWorst25\">0,00 &euro;<\/td><td id=\"eko21-valueAverage25\">0,00 &euro;<\/td><td id=\"eko21-valueBest25\">0,00 &euro;<\/td><\/tr>\r\n        <tr><td>30 years<\/td><td id=\"eko21-valueWorst30\">0,00 &euro;<\/td><td id=\"eko21-valueAverage30\">0,00 &euro;<\/td><td id=\"eko21-valueBest30\">0,00 &euro;<\/td><\/tr>\r\n      <\/tbody>\r\n    <\/table>\r\n  <\/div>\r\n\r\n  <div class=\"eko-results\" aria-label=\"Calculated result\">\r\n    <h3>Result<\/h3>\r\n\r\n    <div class=\"eko-kpi-grid\">\r\n      <div class=\"eko-kpi\"><span>Selected model<\/span><strong id=\"eko21-selectedModelResult\">Seasonal model<\/strong><\/div>\r\n      <div class=\"eko-kpi\"><span>Gross annual revenue<\/span><strong id=\"eko21-grossRevenue\">0,00 &euro;<\/strong><\/div>\r\n      <div class=\"eko-kpi\"><span>Net cash flow p.a.<\/span><strong id=\"eko21-netCashflow\">0,00 &euro;<\/strong><\/div>\r\n      <div class=\"eko-kpi\"><span>Net rental yield<\/span><strong id=\"eko21-netYield\">0,00%<\/strong><\/div>\r\n      <div class=\"eko-kpi\"><span>Property value after 10 years<\/span><strong id=\"eko21-activeValue10Kpi\">0,00 &euro;<\/strong><\/div>\r\n      <div class=\"eko-kpi\"><span>Overall picture after 10 years<\/span><strong id=\"eko21-activeTotal10Kpi\">0,00 &euro;<\/strong><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"eko-compare-grid eko-hidden\" id=\"eko21-compareResultGrid\">\r\n      <div class=\"eko-compare-card\">\r\n        <h4>Seasonal model<\/h4>\r\n        <ul>\r\n          <li><span>Scenario<\/span><strong id=\"eko21-compareSeasonScenario\">Average Case<\/strong><\/li>\r\n          <li><span>Rented overnights<\/span><strong id=\"eko21-compareSeasonNights\">0.00 overnights<\/strong><\/li>\r\n          <li><span>Gross annual revenue<\/span><strong id=\"eko21-compareSeasonRevenue\">0,00 &euro;<\/strong><\/li>\r\n          <li><span>Variable deductions<\/span><strong id=\"eko21-compareSeasonVariable\">0,00 &euro;<\/strong><\/li>\r\n          <li><span>Owner fixed costs<\/span><strong id=\"eko21-compareSeasonFixed\">0,00 &euro;<\/strong><\/li>\r\n          <li><span>Net cash flow \/ year<\/span><strong id=\"eko21-compareSeasonNet\">0,00 &euro;<\/strong><\/li>\r\n          <li><span>Net yield<\/span><strong id=\"eko21-compareSeasonYield\">0,00%<\/strong><\/li>\r\n        <\/ul>\r\n      <\/div>\r\n\r\n      <div class=\"eko-compare-card\">\r\n        <h4>Long-term rental model<\/h4>\r\n        <ul>\r\n          <li><span>Scenario<\/span><strong id=\"eko21-compareLongScenario\">Average Case<\/strong><\/li>\r\n          <li><span>Rented months<\/span><strong id=\"eko21-compareLongMonths\">0.00 months<\/strong><\/li>\r\n          <li><span>Gross annual revenue<\/span><strong id=\"eko21-compareLongRevenue\">0,00 &euro;<\/strong><\/li>\r\n          <li><span>Variable deductions<\/span><strong id=\"eko21-compareLongVariable\">0,00 &euro;<\/strong><\/li>\r\n          <li><span>Owner fixed costs<\/span><strong id=\"eko21-compareLongFixed\">0,00 &euro;<\/strong><\/li>\r\n          <li><span>Recoverable tenant service charges<\/span><strong id=\"eko21-compareLongPassThrough\">0,00 &euro;<\/strong><\/li>\r\n          <li><span>Net cash flow \/ year<\/span><strong id=\"eko21-compareLongNet\">0,00 &euro;<\/strong><\/li>\r\n          <li><span>Net yield<\/span><strong id=\"eko21-compareLongYield\">0,00%<\/strong><\/li>\r\n        <\/ul>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"eko-bar-wrap\" aria-hidden=\"true\"><span class=\"eko-bar\" id=\"eko21-yieldBar\"><\/span><\/div>\r\n\r\n    <ul class=\"eko-result-list\" id=\"eko21-resultList\">\r\n      <li data-result-model=\"season compare\"><span>Active seasonal scenario<\/span><strong id=\"eko21-activeScenario\">Average Case<\/strong><\/li>\r\n      <li data-result-model=\"longrent compare\"><span>Active long-term rental scenario<\/span><strong id=\"eko21-activeLongRentScenario\">Average Case<\/strong><\/li>\r\n      <li data-result-model=\"longrent compare\"><span>Active consumption scenario<\/span><strong id=\"eko21-activeHouseholdScenario\">Average Case<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Active value-appreciation scenario<\/span><strong id=\"eko21-activeValueScenario\">Average Case<\/strong><\/li>\r\n      <li data-result-model=\"season compare\"><span>Rented overnights seasonal model<\/span><strong id=\"eko21-bookedNights\">0.00 overnights<\/strong><\/li>\r\n      <li data-result-model=\"season compare\"><span>Annual revenue seasonal model<\/span><strong id=\"eko21-seasonRevenueResult\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"longrent compare\"><span>Annual revenue long-term rental model<\/span><strong id=\"eko21-longRentRevenueResult\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"season compare\"><span>Seasonal model income growth p.a.<\/span><strong id=\"eko21-seasonGrowthResult\">6,00%<\/strong><\/li>\r\n      <li data-result-model=\"longrent compare\"><span>Long-term rental model income growth p.a.<\/span><strong id=\"eko21-longRentGrowthResult\">6,00%<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>One-time transfer tax payable to the State of Montenegro<\/span><strong id=\"eko21-transferTax\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>One-time notarial \/ technical purchase-related costs<\/span><strong id=\"eko21-autoPurchaseCosts\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Total investment incl. one-time ancillary costs<\/span><strong id=\"eko21-totalInvestment\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"longrent compare\"><span>Electricity \/ year<\/span><strong id=\"eko21-powerYearly\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"longrent compare\"><span>Water \/ year<\/span><strong id=\"eko21-waterYearly\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"longrent compare\"><span>Waste \/ year<\/span><strong id=\"eko21-wasteYearly\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Building management \/ year<\/span><strong id=\"eko21-propertyManagementYearly\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"longrent compare\"><span>Internet \/ year<\/span><strong id=\"eko21-internetYearly\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Annual property tax<\/span><strong id=\"eko21-annualPropertyTax\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Owner fixed costs \/ year<\/span><strong id=\"eko21-fixedCostsYearly\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"longrent compare\"><span>Recoverable tenant service charges \/ year<\/span><strong id=\"eko21-passThroughCostsYearly\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Variable deductions<\/span><strong id=\"eko21-variableCosts\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Payback based on net cash flow<\/span><strong id=\"eko21-payback\">&ndash;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Active value appreciation p.a.<\/span><strong id=\"eko21-activeValueGrowthRate\">0,00%<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Property value active scenario after 5 years<\/span><strong id=\"eko21-activeValue5\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Property value active scenario after 10 years<\/span><strong id=\"eko21-activeValue10\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Property value active scenario after 20 years<\/span><strong id=\"eko21-activeValue20\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Property value active scenario after 30 years<\/span><strong id=\"eko21-activeValue30\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Cumulative rental income active model after 10 years<\/span><strong id=\"eko21-activeIncome10\">0,00 &euro;<\/strong><\/li>\r\n      <li data-result-model=\"all\"><span>Overall picture active model after 10 years<\/span><strong id=\"eko21-activeTotal10\">0,00 &euro;<\/strong><\/li>\r\n    <\/ul>\r\n\r\n    <p class=\"eko-disclaimer\">Note: This calculator is a neutral scenario tool for real estate in Ulcinj. It does not replace tax, notarial, legal or property-specific review. Financing, personal income tax, specific municipal assessments, renovation risks, permit status, tourist registration obligations and individual structuring are not included. External market data should be checked against current local data and official sources such as <a href=\"https:\/\/www.monstat.org\/eng\/page.php?id=321&amp;pageid=321\" target=\"_blank\" rel=\"noopener noreferrer\">MONSTAT<\/a> .<\/p>\r\n\r\n    <div class=\"eko-legal-disclaimer\"><strong>Disclaimer:<\/strong> This calculation tool is intended solely as non-binding orientation for real estate in Ulcinj. All results are based on assumptions, input values and simplified scenarios. There is no guarantee for actual rentability, occupancy, value appreciation, yield, tax treatment, cost level or economic performance. Use is at your own discretion and responsibility. Before making an investment decision, the property, contract, tax consequences, permit status, management costs and market environment must be reviewed individually.<\/div>\r\n\r\n\r\n    <details class=\"eko-help-details\" id=\"eko21-personalReportDetails\">\r\n      <summary>Optional information for personalized report<\/summary>\r\n      <div>\r\n        <p>This information is optional. It appears only in the PDF output if completed or if a cover image has been selected.<\/p>\r\n        <div class=\"eko-personal-grid\">\r\n          <div class=\"eko-field\">\r\n            <label for=\"eko21-reportTitle\">Title \/ personal salutation<\/label>\r\n            <input id=\"eko21-reportTitle\" autocomplete=\"off\" type=\"text\" value=\"\" placeholder=\"e.g. profitability analysis for Hans-Dieter Kuschner\" data-eko-input>\r\n            <small>Optional title for the report cover page.<\/small>\r\n          <\/div>\r\n          <div class=\"eko-field\">\r\n            <label for=\"eko21-reportRecipient\">Recipient \/ client<\/label>\r\n            <input id=\"eko21-reportRecipient\" autocomplete=\"off\" type=\"text\" value=\"\" placeholder=\"z. B. Hans-Dieter Kuschner\" data-eko-input>\r\n            <small>Optional recipient name for the report.<\/small>\r\n          <\/div>\r\n          <div class=\"eko-field\">\r\n            <label for=\"eko21-coverImageFile\">Cover image \/ property photo<\/label>\r\n            <input id=\"eko21-coverImageFile\" autocomplete=\"off\" type=\"file\" accept=\"image\/*\">\r\n            <small>Optional. The image is processed only locally in the browser and included in the PDF output.<\/small>\r\n            <div class=\"eko-cover-preview\" id=\"eko21-coverImagePreview\"><img alt=\"Vorschau Deckblattbild\" loading=\"lazy\"><\/div>\r\n          <\/div>\r\n          <div class=\"eko-field\">\r\n            <label for=\"eko21-objectAddress\">Property address \/ location description<\/label>\r\n            <input id=\"eko21-objectAddress\" autocomplete=\"off\" type=\"text\" value=\"\" placeholder=\"z. B. Ulcinj, Pinje&scaron; \/ Donji &Scaron;toj\" data-eko-input>\r\n            <small>Optional location note for the PDF report.<\/small>\r\n          <\/div>\r\n          <div class=\"eko-field\">\r\n            <label for=\"eko21-lnNumber\">List nepokretnosti \/ LN \/ PL<\/label>\r\n            <input id=\"eko21-lnNumber\" autocomplete=\"off\" type=\"text\" value=\"\" placeholder=\"z. B. LN 245\" data-eko-input>\r\n            <small>Optional: land register sheet \/ possession sheet.<\/small>\r\n          <\/div>\r\n          <div class=\"eko-field\">\r\n            <label for=\"eko21-pdNumber\">PD \/ apartment number<\/label>\r\n            <input id=\"eko21-pdNumber\" autocomplete=\"off\" type=\"text\" value=\"\" placeholder=\"e.g. PD 12 \/ apartment 4\" data-eko-input>\r\n            <small>Optional: apartment, building-part or PD information.<\/small>\r\n          <\/div>\r\n          <div class=\"eko-field\">\r\n            <label for=\"eko21-parcelNumber\">Parcel number<\/label>\r\n            <input id=\"eko21-parcelNumber\" autocomplete=\"off\" type=\"text\" value=\"\" placeholder=\"z. B. 781 \/ 22\" data-eko-input>\r\n            <small>Optional: cadastral parcel.<\/small>\r\n          <\/div>\r\n          <div class=\"eko-field\">\r\n            <label for=\"eko21-koNumber\">KO \/ cadastral municipality<\/label>\r\n            <input id=\"eko21-koNumber\" autocomplete=\"off\" type=\"text\" value=\"\" placeholder=\"z. B. KO Zoganje\" data-eko-input>\r\n            <small>Optional: cadastral municipality.<\/small>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/details>\r\n\r\n    <div class=\"eko-actions\">\r\n      <button type=\"button\" class=\"eko-btn eko-btn-primary\" id=\"eko21-ekoReset\">reset<\/button>\r\n      <button type=\"button\" class=\"eko-btn eko-btn-ghost\" id=\"eko21-ekoPdf\">PDF output<\/button>\r\n      <button type=\"button\" class=\"eko-btn eko-btn-ghost\" id=\"eko21-ekoCopy\">copy<\/button>\r\n      <a class=\"eko-btn eko-btn-whatsapp\" id=\"eko21-whatsappResult\" href=\"#\" rel=\"noopener noreferrer\" target=\"_blank\" aria-label=\"Discuss calculator result via WhatsApp\">\r\n        <img loading=\"lazy\" src=\"https:\/\/ekosphere.me\/wp-content\/uploads\/2026\/02\/whatsApp-Chat-Symbol-direct.png\" alt=\"WhatsApp Chat Symbol direct\" aria-hidden=\"true\" width=\"22\" height=\"22\" decoding=\"async\">\r\n        <span>Discuss result via WhatsApp<\/span>\r\n      <\/a>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  \r\n  <script>\r\n    (function(){\r\n      'use strict';\r\n      var root = document.getElementById('eko21-plan-b-renditerechner');\r\n      if(!root) return;\r\n\r\n      var EURO = String.fromCharCode(8364);\r\n      var UEN = String.fromCharCode(220) + 'N';\r\n      var M3 = 'm' + String.fromCharCode(179);\r\n      var UMLAGE = 'umlagef' + String.fromCharCode(228) + 'hig';\r\n\r\n      function byId(name){ return document.getElementById('eko21-' + name); }\r\n      function qsa(selector){ return Array.prototype.slice.call(root.querySelectorAll(selector)); }\r\n      function qs(selector){ return root.querySelector(selector); }\r\n\r\n      var labels = {\r\n        season:'Seasonal model',\r\n        longrent:'Long-term rental model',\r\n        worst:'Worst Case',\r\n        average:'Average Case',\r\n        best:'Best Case'\r\n      };\r\n\r\n      var state = {\r\n        rentalModel:'season',\r\n        seasonScenario:'average',\r\n        longRentScenario:'average',\r\n        householdScenario:'average',\r\n        valueScenario:'average'\r\n      };\r\n\r\n      var incomeGrowth = {worst:0.03, average:0.06, best:0.09};\r\n      var bedroomCounts = {studio:1, one:1, two:2, three:3};\r\n      var seasonPresets = {\r\n        worst:{high:[90,65,65], pre:[90,48,28], post:[60,40,22], winter:[125,24,8]},\r\n        average:{high:[90,80,82], pre:[90,60,42], post:[60,50,32], winter:[125,32,16]},\r\n        best:{high:[90,100,92], pre:[90,75,56], post:[60,65,44], winter:[125,42,24]}\r\n      };\r\n      var longRentPresets = {\r\n        worst:{monthly:360, months:10},\r\n        average:{monthly:450, months:12},\r\n        best:{monthly:600, months:12}\r\n      };\r\n      var householdProfiles = {\r\n        one:{worst:{power:155,water:5}, average:{power:120,water:4}, best:{power:95,water:3}},\r\n        two:{worst:{power:260,water:10}, average:{power:200,water:8}, best:{power:160,water:6}},\r\n        family:{worst:{power:430,water:18}, average:{power:340,water:14}, best:{power:280,water:11}}\r\n      };\r\n      var scenarioInputState = {season:{}, longrent:{}};\r\n      var reportCoverImageData = '';\r\n\r\n      function parseLocalizedNumber(raw){\r\n        raw = String(raw || '0').replace(\/\\u00a0\/g,'').replace(\/\\s\/g,'').replace(EURO,'').replace('&euro;','').replace('%','').replace(\/[^\\d,.-]\/g,'');\r\n        var hasComma = raw.indexOf(',') !== -1;\r\n        var hasDot = raw.indexOf('.') !== -1;\r\n        if(hasComma && hasDot) raw = raw.replace(\/\\.\/g,'').replace(',','.');\r\n        else if(hasComma) raw = raw.replace(',','.');\r\n        else if(hasDot && \/^\\d{1,3}(\\.\\d{3})+$\/.test(raw)) raw = raw.replace(\/\\.\/g,'');\r\n        var value = parseFloat(raw);\r\n        return Number.isFinite(value) ? value : 0;\r\n      }\r\n      function readNumber(name){ var el = byId(name); return el ? parseLocalizedNumber(decodeHtmlEntities(el.value || el.textContent || '0')) : 0; }\r\n      function formatMoney(v){ return (Number.isFinite(v)?v:0).toLocaleString('de-DE',{minimumFractionDigits:2,maximumFractionDigits:2}) + ' ' + EURO; }\r\n      function formatNumber(v){ return (Number.isFinite(v)?v:0).toLocaleString('de-DE',{minimumFractionDigits:2,maximumFractionDigits:2}); }\r\n      function formatPercent(v){ return (Number.isFinite(v)?v:0).toLocaleString('de-DE',{minimumFractionDigits:2,maximumFractionDigits:2}) + '%'; }\r\n      function writeText(name,value){ var el = byId(name); if(el) el.textContent = decodeHtmlEntities(value); }\r\n      function writeValue(name,value){ var el = byId(name); if(el) el.value = decodeHtmlEntities(value); }\r\n      function writeMoney(name,value){ writeText(name,formatMoney(value)); }\r\n      function writeInputMoney(name,value){ writeValue(name,formatMoney(value)); }\r\n      function normalizeInputEntities(){\r\n        qsa('input, textarea, option').forEach(function(el){\r\n          if(typeof el.value === 'string' && el.value.indexOf('&') !== -1){ el.value = decodeHtmlEntities(el.value); }\r\n          if(el.tagName === 'OPTION' && el.textContent.indexOf('&') !== -1){ el.textContent = decodeHtmlEntities(el.textContent); }\r\n        });\r\n      }\r\n\r\n      function getBedroomCount(){ var el = byId('bedroomType'); return bedroomCounts[el ? el.value : 'one'] || 1; }\r\n      function clonePresetSeason(scenario){\r\n        var p = seasonPresets[scenario];\r\n        if(!p) return null;\r\n        var bedrooms = getBedroomCount();\r\n        return {\r\n          high:[p.high[0], p.high[1]*bedrooms, p.high[2]],\r\n          pre:[p.pre[0], p.pre[1]*bedrooms, p.pre[2]],\r\n          post:[p.post[0], p.post[1]*bedrooms, p.post[2]],\r\n          winter:[p.winter[0], p.winter[1]*bedrooms, p.winter[2]]\r\n        };\r\n      }\r\n      function clonePresetLongRent(scenario){ var p = longRentPresets[scenario]; return p ? {monthly:p.monthly, months:p.months} : null; }\r\n      function getSeasonInputValues(){\r\n        return {\r\n          high:[readNumber('nightsHigh'),readNumber('rateHigh'),readNumber('occHigh')],\r\n          pre:[readNumber('nightsPre'),readNumber('ratePre'),readNumber('occPre')],\r\n          post:[readNumber('nightsPost'),readNumber('ratePost'),readNumber('occPost')],\r\n          winter:[readNumber('nightsWinter'),readNumber('rateWinter'),readNumber('occWinter')]\r\n        };\r\n      }\r\n      function getLongRentInputValues(){ return {monthly:readNumber('longRentMonthly'), months:readNumber('longRentMonths')}; }\r\n      function rememberActiveScenarioInputs(){\r\n        if(byId('nightsHigh')) scenarioInputState.season[state.seasonScenario] = getSeasonInputValues();\r\n        if(byId('longRentMonthly')) scenarioInputState.longrent[state.longRentScenario] = getLongRentInputValues();\r\n      }\r\n      function applySeasonValues(values){\r\n        if(!values) return;\r\n        writeValue('nightsHigh',formatNumber(values.high[0])); writeValue('rateHigh',formatMoney(values.high[1])); writeValue('occHigh',formatPercent(values.high[2]));\r\n        writeValue('nightsPre',formatNumber(values.pre[0])); writeValue('ratePre',formatMoney(values.pre[1])); writeValue('occPre',formatPercent(values.pre[2]));\r\n        writeValue('nightsPost',formatNumber(values.post[0])); writeValue('ratePost',formatMoney(values.post[1])); writeValue('occPost',formatPercent(values.post[2]));\r\n        writeValue('nightsWinter',formatNumber(values.winter[0])); writeValue('rateWinter',formatMoney(values.winter[1])); writeValue('occWinter',formatPercent(values.winter[2]));\r\n      }\r\n      function applySeasonScenario(scenario,forceDefault){\r\n        var values = forceDefault ? clonePresetSeason(scenario) : (scenarioInputState.season[scenario] || clonePresetSeason(scenario));\r\n        scenarioInputState.season[scenario] = values;\r\n        applySeasonValues(values);\r\n      }\r\n      function applyLongRentScenario(scenario,forceDefault){\r\n        var values = forceDefault ? clonePresetLongRent(scenario) : (scenarioInputState.longrent[scenario] || clonePresetLongRent(scenario));\r\n        scenarioInputState.longrent[scenario] = values;\r\n        if(values){ writeValue('longRentMonthly',formatMoney(values.monthly)); writeValue('longRentMonths',formatNumber(values.months)); }\r\n      }\r\n      function setPressed(selector,active){\r\n        qsa(selector).forEach(function(btn){\r\n          var value = btn.getAttribute('data-rental-model') || btn.getAttribute('data-scenario') || btn.getAttribute('data-longrent-scenario') || btn.getAttribute('data-household-scenario') || btn.getAttribute('data-value-scenario');\r\n          btn.setAttribute('aria-pressed', value === active ? 'true' : 'false');\r\n        });\r\n      }\r\n\r\n      function updateModelVisibility(){\r\n        var seasonSection = byId('seasonModelSection');\r\n        var longRentSection = byId('longRentModelSection');\r\n        var householdSection = byId('householdSection');\r\n        var platformFeeSection = byId('platformFeeSection');\r\n        var compareGrid = byId('compareResultGrid');\r\n        if(seasonSection) seasonSection.classList.toggle('eko-hidden', state.rentalModel !== 'season');\r\n        if(longRentSection) longRentSection.classList.toggle('eko-hidden', state.rentalModel !== 'longrent');\r\n        if(householdSection) householdSection.classList.toggle('eko-hidden', state.rentalModel === 'season');\r\n        if(platformFeeSection) platformFeeSection.classList.toggle('eko-hidden', state.rentalModel === 'longrent');\r\n        if(compareGrid) compareGrid.classList.add('eko-hidden');\r\n        setPressed('[data-rental-model]',state.rentalModel);\r\n      }\r\n      function updateResultRows(){\r\n        qsa('[data-result-model]').forEach(function(row){\r\n          var rule = row.getAttribute('data-result-model') || 'all';\r\n          var show = rule === 'all' || rule.split(' ').indexOf(state.rentalModel) !== -1;\r\n          row.classList.toggle('eko-hidden', !show);\r\n        });\r\n      }\r\n      function updateTone(){\r\n        root.classList.remove('eko-tone-worst','eko-tone-average','eko-tone-best');\r\n        root.classList.add('eko-tone-' + (state.rentalModel === 'longrent' ? state.longRentScenario : state.seasonScenario));\r\n      }\r\n      function setResultTone(name,scenario){\r\n        var el = byId(name);\r\n        if(el){ el.classList.remove('eko-result-worst','eko-result-average','eko-result-best'); el.classList.add('eko-result-' + scenario); }\r\n      }\r\n\r\n      function calculateTransferTax(price){\r\n        var type = byId('purchaseType') ? byId('purchaseType').value : 'existing';\r\n        if(type === 'newbuild') return 0;\r\n        if(price <= 150000) return price * 0.03;\r\n        if(price <= 500000) return 4500 + (price - 150000) * 0.05;\r\n        return 22000 + (price - 500000) * 0.06;\r\n      }\r\n      function calculatePurchaseCosts(price){ return Math.max(350,Math.min(1200,price*0.0035))*1.21 + 80 + 250; }\r\n      function updatePurchaseFields(){\r\n        var price = readNumber('purchasePrice');\r\n        var tax = calculateTransferTax(price);\r\n        var costs = calculatePurchaseCosts(price);\r\n        var total = price + tax + costs;\r\n        writeInputMoney('extraCosts',costs); writeInputMoney('stateTransferTax',tax);\r\n        return {purchasePrice:price,transferTax:tax,purchaseCosts:costs,totalInvestment:total};\r\n      }\r\n      function calculateSeasonRevenue(){\r\n        var rows = [['nightsHigh','rateHigh','occHigh'],['nightsPre','ratePre','occPre'],['nightsPost','ratePost','occPost'],['nightsWinter','rateWinter','occWinter']];\r\n        var revenue = 0, bookedNights = 0;\r\n        rows.forEach(function(row){\r\n          var nights=readNumber(row[0]), rate=readNumber(row[1]), occ=readNumber(row[2])\/100;\r\n          var booked=nights*occ;\r\n          bookedNights += booked; revenue += booked*rate;\r\n        });\r\n        return {revenue:revenue, bookedNights:bookedNights};\r\n      }\r\n      function calculateSeasonRevenueFromValues(values){\r\n        if(!values) return 0;\r\n        return ['high','pre','post','winter'].reduce(function(sum,k){ return sum + values[k][0] * (values[k][2]\/100) * values[k][1]; },0);\r\n      }\r\n      function calculateLongRentRevenue(){ return readNumber('longRentMonthly') * readNumber('longRentMonths'); }\r\n      function calculateLongRentRevenueFromValues(v){ return v ? v.monthly * v.months : 0; }\r\n      function calculateProgressiveSum(first,growth,years){ var total=0; for(var y=0;y<years;y++) total += first * Math.pow(1+growth,y); return total; }\r\n      function calculateFutureValue(base,growth,years){ return base * Math.pow(1+growth,years); }\r\n\r\n      function getHouseholdProfile(){ var checked=qs('input[name=\"eko21-householdProfile\"]:checked'); return checked ? checked.value : 'two'; }\r\n      function updateHouseholdInfo(){\r\n        var s = state.householdScenario;\r\n        writeText('profileOneInfo', labels[s] + ': ' + householdProfiles.one[s].power + ' kWh electricity \/ month, ' + householdProfiles.one[s].water + ' ' + M3 + ' water \/ month.');\r\n        writeText('profileTwoInfo', labels[s] + ': ' + householdProfiles.two[s].power + ' kWh electricity \/ month, ' + householdProfiles.two[s].water + ' ' + M3 + ' water \/ month.');\r\n        writeText('profileFamilyInfo', labels[s] + ': ' + householdProfiles.family[s].power + ' kWh electricity \/ month, ' + householdProfiles.family[s].water + ' ' + M3 + ' water \/ month.');\r\n      }\r\n      function calculateHouseholdCosts(){\r\n        var data = householdProfiles[getHouseholdProfile()][state.householdScenario];\r\n        var nightPct = Math.min(100,Math.max(0,readNumber('nightPowerShare')));\r\n        var dayPct = 100 - nightPct;\r\n        writeValue('dayPowerShare',formatPercent(dayPct));\r\n        var power = (data.power*(dayPct\/100)*readNumber('dayPowerPrice')) + (data.power*(nightPct\/100)*readNumber('nightPowerPrice')) + readNumber('powerBaseMonthly');\r\n        var water = (data.water*readNumber('waterPrice')) + readNumber('waterBaseMonthly');\r\n        writeInputMoney('powerMonthly',power); writeInputMoney('waterMonthly',water); updateHouseholdInfo();\r\n        return {powerMonthly:power, waterMonthly:water};\r\n      }\r\n      function calculateCostBuckets(){\r\n        var household = calculateHouseholdCosts();\r\n        var price = readNumber('purchasePrice');\r\n        var living = readNumber('livingArea');\r\n        var propertyManagementMonthly = living * readNumber('propertyManagementPerSqm');\r\n        writeInputMoney('propertyManagementMonthly',propertyManagementMonthly);\r\n        var powerYearly = household.powerMonthly*12;\r\n        var waterYearly = household.waterMonthly*12;\r\n        var wasteYearly = readNumber('wasteMonthly')*12;\r\n        var internetYearly = readNumber('internetMonthly')*12;\r\n        var propertyManagementYearly = propertyManagementMonthly*12;\r\n        var annualPropertyTax = price * (readNumber('propertyTaxRate')\/100);\r\n        var utilityCosts = powerYearly + waterYearly + wasteYearly + internetYearly;\r\n        var ownerBaseCosts = propertyManagementYearly + annualPropertyTax;\r\n        return {powerYearly:powerYearly,waterYearly:waterYearly,wasteYearly:wasteYearly,internetYearly:internetYearly,propertyManagementYearly:propertyManagementYearly,annualPropertyTax:annualPropertyTax,utilityCosts:utilityCosts,seasonOwnerCosts:ownerBaseCosts,longRentOwnerCosts:ownerBaseCosts};\r\n      }\r\n      function readSelectedPlatformFees(){\r\n        var selected = qsa('[data-platform-fee]:checked').map(function(input){\r\n          var labelNode = input.closest('label') ? input.closest('label').querySelector('strong') : null;\r\n          return {key:input.value,label:labelNode ? labelNode.textContent : input.value,fee:parseLocalizedNumber(input.getAttribute('data-platform-fee')||'0')};\r\n        });\r\n        var total = selected.reduce(function(sum,item){ return sum + item.fee; },0);\r\n        var average = selected.length ? total \/ selected.length : 0;\r\n        return {selected:selected,total:total,average:average};\r\n      }\r\n      function calculateNetFromGross(gross,model,costs){\r\n        var fees = readSelectedPlatformFees();\r\n        var platformFee = model === 'season' ? fees.average\/100 : 0;\r\n        var managementFee = readNumber('managementFee')\/100;\r\n        var variableCosts = gross * (platformFee + managementFee);\r\n        var ownerFixedCosts = model === 'longrent' ? costs.longRentOwnerCosts : costs.seasonOwnerCosts;\r\n        var passThroughCosts = model === 'longrent' ? costs.utilityCosts : 0;\r\n        return {grossRevenue:gross,variableCosts:variableCosts,ownerFixedCosts:ownerFixedCosts,passThroughCosts:passThroughCosts,netCashflow:gross-variableCosts-ownerFixedCosts};\r\n      }\r\n      function getValueGrowth(){ return {worst:readNumber('appWorst')\/100, average:readNumber('appAverage')\/100, best:readNumber('appBest')\/100}; }\r\n      function updateProjectionTables(){\r\n        var yearsList=[5,10,15,20,25,30], price=readNumber('purchasePrice'), growth=getValueGrowth();\r\n        var sr={\r\n          worst:calculateSeasonRevenueFromValues(scenarioInputState.season.worst || clonePresetSeason('worst')),\r\n          average:calculateSeasonRevenueFromValues(scenarioInputState.season.average || clonePresetSeason('average')),\r\n          best:calculateSeasonRevenueFromValues(scenarioInputState.season.best || clonePresetSeason('best'))\r\n        };\r\n        var lr={\r\n          worst:calculateLongRentRevenueFromValues(scenarioInputState.longrent.worst || clonePresetLongRent('worst')),\r\n          average:calculateLongRentRevenueFromValues(scenarioInputState.longrent.average || clonePresetLongRent('average')),\r\n          best:calculateLongRentRevenueFromValues(scenarioInputState.longrent.best || clonePresetLongRent('best'))\r\n        };\r\n        yearsList.forEach(function(y){\r\n          writeMoney('seasonWorst'+y,calculateProgressiveSum(sr.worst,incomeGrowth.worst,y)); writeMoney('seasonAverage'+y,calculateProgressiveSum(sr.average,incomeGrowth.average,y)); writeMoney('seasonBest'+y,calculateProgressiveSum(sr.best,incomeGrowth.best,y));\r\n          writeMoney('longRentWorst'+y,calculateProgressiveSum(lr.worst,incomeGrowth.worst,y)); writeMoney('longRentAverage'+y,calculateProgressiveSum(lr.average,incomeGrowth.average,y)); writeMoney('longRentBest'+y,calculateProgressiveSum(lr.best,incomeGrowth.best,y));\r\n          writeMoney('valueWorst'+y,calculateFutureValue(price,growth.worst,y)); writeMoney('valueAverage'+y,calculateFutureValue(price,growth.average,y)); writeMoney('valueBest'+y,calculateFutureValue(price,growth.best,y));\r\n        });\r\n      }\r\n      function updateRangeOutputs(){\r\n        var fees = readSelectedPlatformFees();\r\n        writeText('selectedPlatformFees', fees.selected.length ? fees.selected.map(function(i){return i.label + ': ' + formatPercent(i.fee);}).join(' \/ ') : 'No platform selected');\r\n        writeText('platformFeeAverageOut', state.rentalModel === 'longrent' ? '0.00% in long-term rental model' : formatPercent(fees.average));\r\n        writeText('managementFeeOut',formatPercent(readNumber('managementFee')));\r\n      }\r\n      function updateResult(){\r\n        rememberActiveScenarioInputs();\r\n        updateModelVisibility(); updateResultRows(); updateTone(); updateRangeOutputs();\r\n        var purchase = updatePurchaseFields();\r\n        var costs = calculateCostBuckets();\r\n        var season = calculateSeasonRevenue();\r\n        var longRevenue = calculateLongRentRevenue();\r\n        var seasonNet = calculateNetFromGross(season.revenue,'season',costs);\r\n        var longNet = calculateNetFromGross(longRevenue,'longrent',costs);\r\n        var seasonYield = purchase.totalInvestment>0 ? seasonNet.netCashflow\/purchase.totalInvestment*100 : 0;\r\n        var longYield = purchase.totalInvestment>0 ? longNet.netCashflow\/purchase.totalInvestment*100 : 0;\r\n        var activeNet = state.rentalModel === 'longrent' ? longNet : seasonNet;\r\n        var activeYield = state.rentalModel === 'longrent' ? longYield : seasonYield;\r\n        var activeRevenue = state.rentalModel === 'longrent' ? longRevenue : season.revenue;\r\n        var activeGrowth = state.rentalModel === 'longrent' ? incomeGrowth[state.longRentScenario] : incomeGrowth[state.seasonScenario];\r\n        var valueGrowth = getValueGrowth()[state.valueScenario] || 0;\r\n        var value5=calculateFutureValue(purchase.purchasePrice,valueGrowth,5), value10=calculateFutureValue(purchase.purchasePrice,valueGrowth,10), value20=calculateFutureValue(purchase.purchasePrice,valueGrowth,20), value30=calculateFutureValue(purchase.purchasePrice,valueGrowth,30);\r\n        var income10 = calculateProgressiveSum(activeRevenue,activeGrowth,10);\r\n        var total10 = value10 + income10;\r\n        writeText('selectedModelResult',labels[state.rentalModel]); writeText('grossRevenue',formatMoney(activeNet.grossRevenue)); writeText('netCashflow',formatMoney(activeNet.netCashflow)); writeText('netYield',formatPercent(activeYield));\r\n        var bar=byId('yieldBar'); if(bar) bar.style.width = Math.max(0,Math.min(100,activeYield*8)) + '%';\r\n        writeText('activeScenario',labels[state.seasonScenario]); writeText('activeLongRentScenario',labels[state.longRentScenario]); writeText('activeHouseholdScenario',state.rentalModel==='season'?'Not applied in the seasonal model':labels[state.householdScenario]); writeText('activeValueScenario',labels[state.valueScenario]);\r\n        setResultTone('activeScenario',state.seasonScenario); setResultTone('activeLongRentScenario',state.longRentScenario); setResultTone('activeHouseholdScenario',state.householdScenario); setResultTone('activeValueScenario',state.valueScenario);\r\n        writeText('bookedNights',formatNumber(season.bookedNights)+' '+UEN); writeMoney('seasonRevenueResult',season.revenue); writeMoney('longRentRevenueResult',longRevenue);\r\n        writeText('seasonGrowthResult',formatPercent(incomeGrowth[state.seasonScenario]*100)); writeText('longRentGrowthResult',formatPercent(incomeGrowth[state.longRentScenario]*100));\r\n        writeValue('seasonIncomeGrowthActive',formatPercent(incomeGrowth[state.seasonScenario]*100)); writeValue('longRentGrowthActive',formatPercent(incomeGrowth[state.longRentScenario]*100));\r\n        writeValue('seasonRevenueYear1',formatMoney(season.revenue)); writeValue('seasonRevenueYear5',formatMoney(season.revenue*Math.pow(1+incomeGrowth[state.seasonScenario],4)));\r\n        writeMoney('transferTax',purchase.transferTax); writeMoney('autoPurchaseCosts',purchase.purchaseCosts); writeMoney('totalInvestment',purchase.totalInvestment);\r\n        if(state.rentalModel === 'season'){\r\n          writeText('powerYearly','Not applied in the seasonal model'); writeText('waterYearly','Not applied in the seasonal model'); writeText('wasteYearly','Not applied in the seasonal model'); writeText('internetYearly','Not applied in the seasonal model'); writeText('passThroughCostsYearly','0,00 &euro;');\r\n        }else{\r\n          writeText('powerYearly',formatMoney(0)+' cashflowwirksam \/ '+formatMoney(costs.powerYearly)+' '+UMLAGE); writeText('waterYearly',formatMoney(0)+' cashflowwirksam \/ '+formatMoney(costs.waterYearly)+' '+UMLAGE); writeText('wasteYearly',formatMoney(0)+' cashflowwirksam \/ '+formatMoney(costs.wasteYearly)+' '+UMLAGE); writeText('internetYearly',formatMoney(0)+' cashflowwirksam \/ '+formatMoney(costs.internetYearly)+' '+UMLAGE); writeMoney('passThroughCostsYearly',costs.utilityCosts);\r\n        }\r\n        writeMoney('propertyManagementYearly',costs.propertyManagementYearly); writeMoney('annualPropertyTax',costs.annualPropertyTax); writeMoney('fixedCostsYearly',activeNet.ownerFixedCosts); writeMoney('variableCosts',activeNet.variableCosts);\r\n        writeText('payback',activeNet.netCashflow>0 ? formatNumber(purchase.totalInvestment\/activeNet.netCashflow)+' years' : 'not representable');\r\n        writeText('activeValueGrowthRate',formatPercent(valueGrowth*100)); writeMoney('activeValue5',value5); writeMoney('activeValue10',value10); writeMoney('activeValue20',value20); writeMoney('activeValue30',value30); writeMoney('activeIncome10',income10); writeMoney('activeTotal10',total10); writeText('activeValue10Kpi',formatMoney(value10)); writeText('activeTotal10Kpi',formatMoney(total10));\r\n        updateProjectionTables();\r\n      }\r\n      function normalizeField(el){\r\n        if(!el || el.readOnly || el.type==='hidden' || el.type==='radio' || el.type==='checkbox' || el.type==='range' || el.tagName==='SELECT') return;\r\n        var name=(el.id||'').replace('eko21-','');\r\n        var money=['purchasePrice','dayPowerPrice','nightPowerPrice','powerBaseMonthly','waterPrice','waterBaseMonthly','wasteMonthly','internetMonthly','longRentMonthly','rateHigh','ratePre','ratePost','rateWinter'];\r\n        var percent=['nightPowerShare','dayPowerShare','occHigh','occPre','occPost','occWinter','propertyTaxRate','appWorst','appAverage','appBest'];\r\n        var numbers=['livingArea','longRentMonths','nightsHigh','nightsPre','nightsPost','nightsWinter'];\r\n        var v=parseLocalizedNumber(el.value);\r\n        if(money.indexOf(name)!==-1) el.value=formatMoney(v); else if(percent.indexOf(name)!==-1) el.value=formatPercent(v); else if(numbers.indexOf(name)!==-1) el.value=formatNumber(v);\r\n      }\r\n      function setManagementRateFromRadio(){\r\n        var checked = qs('[data-management-rate]:checked');\r\n        writeValue('propertyManagementPerSqm', checked ? formatMoney(parseFloat(checked.getAttribute('data-management-rate')||'0')) : formatMoney(0));\r\n      }\r\n      function bindEvents(){\r\n        qsa('[data-rental-model]').forEach(function(btn){btn.addEventListener('click',function(e){e.preventDefault(); rememberActiveScenarioInputs(); state.rentalModel=btn.getAttribute('data-rental-model'); updateResult();});});\r\n        qsa('[data-scenario]').forEach(function(btn){btn.addEventListener('click',function(e){e.preventDefault(); rememberActiveScenarioInputs(); state.seasonScenario=btn.getAttribute('data-scenario'); applySeasonScenario(state.seasonScenario,false); setPressed('[data-scenario]',state.seasonScenario); updateResult();});});\r\n        qsa('[data-longrent-scenario]').forEach(function(btn){btn.addEventListener('click',function(e){e.preventDefault(); rememberActiveScenarioInputs(); state.longRentScenario=btn.getAttribute('data-longrent-scenario'); applyLongRentScenario(state.longRentScenario,false); setPressed('[data-longrent-scenario]',state.longRentScenario); updateResult();});});\r\n        qsa('[data-household-scenario]').forEach(function(btn){btn.addEventListener('click',function(e){e.preventDefault(); state.householdScenario=btn.getAttribute('data-household-scenario'); setPressed('[data-household-scenario]',state.householdScenario); updateResult();});});\r\n        qsa('[data-value-scenario]').forEach(function(btn){btn.addEventListener('click',function(e){e.preventDefault(); state.valueScenario=btn.getAttribute('data-value-scenario'); setPressed('[data-value-scenario]',state.valueScenario); updateResult();});});\r\n        qsa('[data-eko-input]').forEach(function(el){\r\n          el.addEventListener('input',function(){\r\n            if(el.getAttribute('data-power-share')){\r\n              var val=Math.min(100,Math.max(0,parseLocalizedNumber(el.value)));\r\n              if(el.getAttribute('data-power-share')==='night') writeValue('dayPowerShare',formatPercent(100-val));\r\n              if(el.getAttribute('data-power-share')==='day') writeValue('nightPowerShare',formatPercent(100-val));\r\n            }\r\n            updateResult();\r\n          });\r\n          el.addEventListener('change',function(){updateResult();});\r\n          el.addEventListener('blur',function(){normalizeField(el); updateResult();});\r\n        });\r\n        qsa('[data-platform-fee]').forEach(function(el){ el.addEventListener('change',updateResult); });\r\n        qsa('[data-management-rate]').forEach(function(el){ el.addEventListener('change',function(){setManagementRateFromRadio(); updateResult();}); });\r\n        var bedroomTypeInput = byId('bedroomType');\r\n        if(bedroomTypeInput){\r\n          bedroomTypeInput.addEventListener('change',function(){\r\n            scenarioInputState.season = {};\r\n            applySeasonScenario(state.seasonScenario,true);\r\n            updateResult();\r\n          });\r\n        }\r\n        var slider = byId('managementFee');\r\n        if(slider){ slider.addEventListener('input',updateResult); slider.addEventListener('change',updateResult); }\r\n        var coverInput=byId('coverImageFile');\r\n        if(coverInput){\r\n          coverInput.addEventListener('change',function(){\r\n            var file=coverInput.files && coverInput.files[0] ? coverInput.files[0] : null;\r\n            var preview=byId('coverImagePreview');\r\n            if(!file){\r\n              reportCoverImageData='';\r\n              if(preview){preview.style.display='none';}\r\n              return;\r\n            }\r\n            var reader=new FileReader();\r\n            reader.onload=function(ev){\r\n              reportCoverImageData=String(ev.target && ev.target.result ? ev.target.result : '');\r\n              if(preview){\r\n                var img=preview.querySelector('img');\r\n                if(img) img.src=reportCoverImageData;\r\n                preview.style.display=reportCoverImageData ? 'block' : 'none';\r\n              }\r\n            };\r\n            reader.readAsDataURL(file);\r\n          });\r\n        }\r\n        var resetButton=byId('ekoReset');\r\n        if(resetButton) resetButton.addEventListener('click',resetCalculator);\r\n        var pdfButton=byId('ekoPdf');\r\n        if(pdfButton) pdfButton.addEventListener('click',openPdfOutput);\r\n        var copyButton=byId('ekoCopy');\r\n        if(copyButton) copyButton.addEventListener('click',copyResult);\r\n        var whatsappButton=byId('whatsappResult');\r\n        if(whatsappButton){\r\n          whatsappButton.addEventListener('click',function(event){\r\n            event.preventDefault();\r\n            var url='https:\/\/wa.me\/38230681227?text='+encodeURIComponent(buildWhatsAppResultMessage());\r\n            window.open(url,'_blank');\r\n          });\r\n        }\r\n      }\r\n      function resetCalculator(){\r\n        Object.assign(state,{rentalModel:'season',seasonScenario:'average',longRentScenario:'average',householdScenario:'average',valueScenario:'average'});\r\n        writeValue('purchasePrice','160.000,00 &euro;'); writeValue('livingArea','54,00'); writeValue('internetMonthly','20,00 &euro;'); writeValue('dayPowerPrice','0,112 &euro;'); writeValue('nightPowerPrice','0,0605 &euro;'); writeValue('powerBaseMonthly','4,00 &euro;'); writeValue('nightPowerShare','20,00%'); writeValue('dayPowerShare','80,00%'); writeValue('waterPrice','1,20 &euro;'); writeValue('waterBaseMonthly','4,00 &euro;'); writeValue('wasteMonthly','4,00 &euro;'); writeValue('propertyManagementPerSqm','0,00 &euro;'); writeValue('propertyTaxRate','0,25%'); writeValue('appWorst','3,00%'); writeValue('appAverage','6,00%'); writeValue('appBest','9,00%'); writeValue('managementFee','0'); writeValue('reportTitle',''); writeValue('reportRecipient',''); writeValue('objectAddress',''); writeValue('lnNumber',''); writeValue('pdNumber',''); writeValue('parcelNumber',''); writeValue('koNumber',''); reportCoverImageData=''; var cp=byId('coverImagePreview'); if(cp){cp.style.display='none'; var ci=cp.querySelector('img'); if(ci) ci.removeAttribute('src');} var cf=byId('coverImageFile'); if(cf) cf.value='';\r\n        var purchaseType=byId('purchaseType'); if(purchaseType) purchaseType.value='existing';\r\n        var bedroomType=byId('bedroomType'); if(bedroomType) bedroomType.value='one';\r\n        var householdTwo=qs('input[name=\"eko21-householdProfile\"][value=\"two\"]'); if(householdTwo) householdTwo.checked=true;\r\n        qsa('[data-platform-fee],[data-management-rate]').forEach(function(input){input.checked=false;});\r\n        scenarioInputState.season={}; scenarioInputState.longrent={};\r\n        applySeasonScenario('average',true); applyLongRentScenario('average',true); setPressed('[data-rental-model]',state.rentalModel); setPressed('[data-scenario]',state.seasonScenario); setPressed('[data-longrent-scenario]',state.longRentScenario); setPressed('[data-household-scenario]',state.householdScenario); setPressed('[data-value-scenario]',state.valueScenario); updateResult();\r\n      }\r\n      function clean(value){return String(value||'').replace(\/\\s+\/g,' ').trim();}\r\n      function getText(name){var el=byId(name); return el ? clean(el.textContent || el.value) : '';}\r\n      function decodeHtmlEntities(value){\r\n        var textarea=document.createElement('textarea');\r\n        textarea.innerHTML=String(value||'');\r\n        return textarea.value;\r\n      }\r\n      function plainWhatsAppLine(label,value){\r\n        return decodeHtmlEntities(label+': '+String(value||'').trim());\r\n      }\r\n      function buildWhatsAppResultMessage(){\r\n        updateResult();\r\n\r\n        var activeScenario = state.rentalModel === 'season' ? getText('activeScenario') : getText('activeLongRentScenario');\r\n        var bedroomSelect = byId('bedroomType');\r\n        var bedroomText = bedroomSelect && bedroomSelect.selectedOptions && bedroomSelect.selectedOptions[0] ? bedroomSelect.selectedOptions[0].textContent : '';\r\n\r\n        var lines=[\r\n          'Hello, I would like to discuss the profitability analysis for a property in Ulcinj.',\r\n          '',\r\n          'Short summary of the analysis:',\r\n          plainWhatsAppLine('Model',getText('selectedModelResult')),\r\n          plainWhatsAppLine('Scenario',activeScenario),\r\n          plainWhatsAppLine('Purchase price',byId('purchasePrice') ? byId('purchasePrice').value : ''),\r\n          plainWhatsAppLine('Living area',(byId('livingArea') ? byId('livingArea').value : '')+' m&sup2;'),\r\n          plainWhatsAppLine('Bedrooms',bedroomText),\r\n          plainWhatsAppLine('Gross annual revenue',getText('grossRevenue')),\r\n          plainWhatsAppLine('Net cash flow \/ year',getText('netCashflow')),\r\n          plainWhatsAppLine('Net rental yield',getText('netYield')),\r\n          plainWhatsAppLine('Total investment',getText('totalInvestment')),\r\n          plainWhatsAppLine('Property value after 10 years',getText('activeValue10Kpi')),\r\n          plainWhatsAppLine('Overall picture after 10 years',getText('activeTotal10')),\r\n          '',\r\n          'Please contact me to discuss this analysis further.'\r\n        ];\r\n\r\n        return decodeHtmlEntities(lines.join('\\n'))\r\n          .replace(\/&nbsp;\/g,' ')\r\n          .replace(\/(?:\\n\\s*){3,}\/g,'\\n\\n')\r\n          .trim();\r\n      }\r\n      function visibleRows(){return qsa('#eko21-resultList li').filter(function(r){return !r.classList.contains('eko-hidden');}).map(function(r){return {label:r.querySelector('span') ? r.querySelector('span').textContent.trim() : '', value:r.querySelector('strong') ? r.querySelector('strong').textContent.trim() : ''};});}\r\n      function esc(v){return String(v||'').replace(\/[&<>\"']\/g,function(c){return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c];});}\r\n      function makeNode(doc, tag, className, text){\r\n        var el = doc.createElement(tag);\r\n        if(className) el.className = className;\r\n        if(text !== undefined && text !== null) el.textContent = decodeHtmlEntities(text);\r\n        return el;\r\n      }\r\n      function addKpi(doc, parent, label, value){\r\n        var card = makeNode(doc,'div','kpi');\r\n        card.appendChild(makeNode(doc,'span','',label));\r\n        card.appendChild(makeNode(doc,'strong','',value));\r\n        parent.appendChild(card);\r\n      }\r\n      function addBar(doc, parent, label, value, width){\r\n        var box = makeNode(doc,'div','box');\r\n        box.appendChild(makeNode(doc,'div','barlabel',label + (value ? ': ' + value : '')));\r\n        var track = makeNode(doc,'div','track');\r\n        var fill = makeNode(doc,'div','fill');\r\n        fill.style.width = Math.max(0,Math.min(100,width || 0)).toFixed(2) + '%';\r\n        track.appendChild(fill);\r\n        box.appendChild(track);\r\n        parent.appendChild(box);\r\n      }\r\n      function reportValue(name){ return decodeHtmlEntities(getText(name)); }\r\n      function inputValue(name){ var el=byId(name); return el ? decodeHtmlEntities(el.value) : ''; }\r\n      function personalValue(name){ var v=inputValue(name); return v ? v.trim() : ''; }\r\n      function reportPercent(name){ return reportValue(name); }\r\n      function reportCurrency(name){ return reportValue(name); }\r\n      function reportScenarioLabel(){ return state.rentalModel === 'season' ? labels[state.seasonScenario] : labels[state.longRentScenario]; }\r\n      function selectedPlatformsText(){\r\n        var selected=qsa('[data-platform-fee]:checked').map(function(el){\r\n          var label=(el.closest('label') && el.closest('label').querySelector('strong')) ? el.closest('label').querySelector('strong').textContent.trim() : el.value;\r\n          return label + ' (' + formatPercent(parseFloat(el.getAttribute('data-platform-fee')||'0')) + ')';\r\n        });\r\n        return selected.length ? selected.join(' \/ ') : 'No platform selected';\r\n      }\r\n      function makeHr(doc){ return makeNode(doc,'div','rule'); }\r\n      function makeSection(doc, parent, number, title, subtitle){\r\n        var section=makeNode(doc,'section','report-section');\r\n        var head=makeNode(doc,'div','section-head');\r\n        head.appendChild(makeNode(doc,'span','section-no',number));\r\n        var titleWrap=makeNode(doc,'div','');\r\n        titleWrap.appendChild(makeNode(doc,'h2','',title));\r\n        if(subtitle) titleWrap.appendChild(makeNode(doc,'p','section-sub',subtitle));\r\n        head.appendChild(titleWrap);\r\n        section.appendChild(head);\r\n        parent.appendChild(section);\r\n        return section;\r\n      }\r\n      function addReportKpi(doc, parent, label, value, sub){\r\n        var card=makeNode(doc,'div','report-kpi');\r\n        card.appendChild(makeNode(doc,'span','',label));\r\n        card.appendChild(makeNode(doc,'strong','',value));\r\n        if(sub) card.appendChild(makeNode(doc,'em','',sub));\r\n        parent.appendChild(card);\r\n      }\r\n      function addReportRow(doc, tbody, label, value, note){\r\n        var tr=doc.createElement('tr');\r\n        var td1=makeNode(doc,'td','',label);\r\n        var td2=makeNode(doc,'td','',value);\r\n        var td3=makeNode(doc,'td','',note || '');\r\n        tr.appendChild(td1); tr.appendChild(td2); tr.appendChild(td3);\r\n        tbody.appendChild(tr);\r\n      }\r\n      function addSimpleTable(doc, parent, rows){\r\n        var table=doc.createElement('table');\r\n        var thead=doc.createElement('thead');\r\n        var headRow=doc.createElement('tr');\r\n        ['Position','Value','Classification'].forEach(function(h){ headRow.appendChild(makeNode(doc,'th','',h)); });\r\n        thead.appendChild(headRow); table.appendChild(thead);\r\n        var tbody=doc.createElement('tbody');\r\n        rows.forEach(function(row){ addReportRow(doc,tbody,row[0],row[1],row[2]||''); });\r\n        table.appendChild(tbody); parent.appendChild(table);\r\n      }\r\n      function addMiniBar(doc, parent, label, value, width, helper){\r\n        var box=makeNode(doc,'div','metric-bar');\r\n        var top=makeNode(doc,'div','metric-top');\r\n        top.appendChild(makeNode(doc,'span','',label));\r\n        top.appendChild(makeNode(doc,'strong','',value));\r\n        box.appendChild(top);\r\n        var track=makeNode(doc,'div','metric-track');\r\n        var fill=makeNode(doc,'div','metric-fill');\r\n        fill.style.width=Math.max(0,Math.min(100,width||0)).toFixed(2)+'%';\r\n        track.appendChild(fill); box.appendChild(track);\r\n        if(helper) box.appendChild(makeNode(doc,'p','metric-helper',helper));\r\n        parent.appendChild(box);\r\n      }\r\n      function addScenarioProjectionTable(doc, parent, prefix, label){\r\n        var table=doc.createElement('table');\r\n        table.className='projection';\r\n        var thead=doc.createElement('thead');\r\n        var hr=doc.createElement('tr');\r\n        ['Period',label + ' Worst Case',label + ' Average Case',label + ' Best Case'].forEach(function(h){hr.appendChild(makeNode(doc,'th','',h));});\r\n        thead.appendChild(hr); table.appendChild(thead);\r\n        var tbody=doc.createElement('tbody');\r\n        [5,10,15,20,25,30].forEach(function(year){\r\n          var tr=doc.createElement('tr');\r\n          tr.appendChild(makeNode(doc,'td','',year + ' years'));\r\n          tr.appendChild(makeNode(doc,'td','',reportValue(prefix+'Worst'+year)));\r\n          tr.appendChild(makeNode(doc,'td','',reportValue(prefix+'Average'+year)));\r\n          tr.appendChild(makeNode(doc,'td','',reportValue(prefix+'Best'+year)));\r\n          tbody.appendChild(tr);\r\n        });\r\n        table.appendChild(tbody); parent.appendChild(table);\r\n      }\r\n      function addSeasonAssumptionTable(doc, parent){\r\n        var ids=[['High season','nightsHigh','rateHigh','occHigh'],['Vorsaison','nightsPre','ratePre','occPre'],['Nachsaison','nightsPost','ratePost','occPost'],['Winter stay','nightsWinter','rateWinter','occWinter']];\r\n        var table=doc.createElement('table');\r\n        var thead=doc.createElement('thead');\r\n        var hr=doc.createElement('tr');\r\n        ['Season phase','Days','Price per overnight stay','Occupancy'].forEach(function(h){hr.appendChild(makeNode(doc,'th','',h));});\r\n        thead.appendChild(hr); table.appendChild(thead);\r\n        var tbody=doc.createElement('tbody');\r\n        ids.forEach(function(row){\r\n          var tr=doc.createElement('tr');\r\n          tr.appendChild(makeNode(doc,'td','',row[0]));\r\n          tr.appendChild(makeNode(doc,'td','',inputValue(row[1])));\r\n          tr.appendChild(makeNode(doc,'td','',inputValue(row[2])));\r\n          tr.appendChild(makeNode(doc,'td','',inputValue(row[3])));\r\n          tbody.appendChild(tr);\r\n        });\r\n        table.appendChild(tbody); parent.appendChild(table);\r\n      }\r\n      function openPdfOutput(){\r\n        updateResult();\r\n\r\n        var w=window.open('', '_blank');\r\n        if(!w){\r\n          alert('The PDF output was blocked by the browser. Please allow pop-ups for this page and click PDF output again.');\r\n          return;\r\n        }\r\n        try{ w.opener=null; }catch(e){}\r\n\r\n        var doc=w.document;\r\n        doc.open();\r\n        doc.write('<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><title>Real Estate Profitability Analysis Ulcinj<body>');\r\n        doc.close();\r\n\r\n        var style=doc.createElement('style');\r\n        style.textContent='@page{size:A4;margin:15mm 13mm}*{box-sizing:border-box}body{margin:0;background:#fff;color:#0f172a;font-family:Arial,Helvetica,sans-serif;font-size:10.5px;line-height:1.42}.report{max-width:190mm;margin:0 auto}.print-actions{position:sticky;top:0;z-index:10;background:#fff;padding:8px 0 10px;text-align:right;border-bottom:1px solid #dbe3ef}.printbtn{border:0;background:#004f4d;color:#fff;padding:9px 12px;font-size:11px;font-weight:800;cursor:pointer}.cover{min-height:255mm;display:flex;flex-direction:column;justify-content:space-between;page-break-after:always}.brand-line{height:6px;background:#004f4d;margin-bottom:22px}.eyebrow{font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:#004f4d;font-weight:800;margin-bottom:12px}.cover h1{font-size:30px;line-height:1.08;letter-spacing:-.04em;color:#004f4d;margin:0 0 14px}.lead{font-size:13px;line-height:1.55;max-width:165mm;color:#334155;margin:0 0 18px;text-align:justify}.cover-image{width:100%;height:78mm;object-fit:cover;border:1px solid #dbe3ef;margin:0 0 16px;background:#f8fafc}.meta-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-top:22px}.meta{border:1px solid #dbe3ef;padding:10px;background:#f8fafc}.meta span,.report-kpi span{display:block;color:#64748b;font-size:9.5px;margin-bottom:4px}.meta strong,.report-kpi strong{display:block;color:#0f172a;font-size:14px;line-height:1.15}.cover-note{font-size:9.5px;color:#64748b;border-top:1px solid #dbe3ef;padding-top:10px;text-align:justify}.report-section{page-break-inside:avoid;margin:0 0 14px}.section-head{display:flex;gap:10px;align-items:flex-start;border-bottom:2px solid #004f4d;padding-bottom:6px;margin:0 0 9px}.section-no{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;background:#004f4d;color:#fff;font-weight:900;font-size:11px;flex:0 0 auto}.section-head h2{font-size:17px;line-height:1.18;color:#004f4d;margin:0}.section-sub{font-size:9.8px;color:#64748b;margin:3px 0 0;text-align:justify}.kpi-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:8px 0 12px}.report-kpi{border:1px solid #dbe3ef;background:#fff;padding:9px;min-height:58px;page-break-inside:avoid}.report-kpi em{display:block;margin-top:4px;color:#64748b;font-size:8.8px;font-style:normal;text-align:justify}.box{border:1px solid #dbe3ef;background:#fff;padding:10px;page-break-inside:avoid}.box h3{font-size:13px;color:#004f4d;margin:0 0 6px}.box p{margin:0 0 6px;color:#334155;text-align:justify}table{width:100%;border-collapse:collapse;margin:7px 0 12px;font-size:9.8px;page-break-inside:auto}tr{page-break-inside:avoid;page-break-after:auto}th{background:#f1f5f9;color:#334155;font-weight:900;text-align:left;border:1px solid #dbe3ef;padding:6px}td{border:1px solid #e2e8f0;padding:6px;vertical-align:top;text-align:justify}.projection td:not(:first-child),.projection th:not(:first-child){text-align:right}.metric-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin:8px 0 12px}.metric-bar{border:1px solid #dbe3ef;padding:8px;background:#fff;page-break-inside:avoid}.metric-top{display:flex;justify-content:space-between;gap:10px;margin-bottom:6px}.metric-top span{font-size:9.5px;color:#64748b}.metric-top strong{font-size:11px;color:#0f172a}.metric-track{height:9px;background:#e2e8f0;overflow:hidden}.metric-fill{height:9px;background:#004f4d}.metric-helper{font-size:8.8px;color:#64748b;margin:5px 0 0;text-align:justify}.signature{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:20px}.sigline{border-top:1px solid #0f172a;padding-top:6px;color:#64748b;font-size:9px}.toc{display:grid;grid-template-columns:1fr 1fr;gap:8px}.toc div{border:1px solid #dbe3ef;padding:9px;background:#f8fafc}.toc strong{display:block;color:#004f4d;margin-bottom:3px}.disclaimer{border:1px solid #dbe3ef;background:#f8fafc;padding:10px;color:#334155;font-size:9.3px;text-align:justify}.optional-note{font-size:9.2px;color:#64748b;margin:3px 0 0;text-align:justify}.resource-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin:10px 0 12px}.resource-card{border:1px solid #dbe3ef;background:#fff;padding:10px;page-break-inside:avoid}.resource-card strong{display:block;color:#004f4d;font-size:11px;margin-bottom:4px}.resource-card a{color:#004f4d;text-decoration:underline;font-weight:800;word-break:break-word}.wa-report-btn{display:inline-flex;align-items:center;gap:7px;background:#25D366;color:#0f172a!important;text-decoration:none!important;font-weight:900;padding:9px 12px;margin-top:6px;border:1px solid #128C7E}.wa-report-btn img{width:16px;height:16px;display:block}@media print{.print-actions{display:none}.report{max-width:none}.cover{min-height:267mm}.page{page-break-before:always}body{print-color-adjust:exact;-webkit-print-color-adjust:exact}}';\r\n        doc.head.appendChild(style);\r\n\r\n        var report=makeNode(doc,'main','report');\r\n        doc.body.appendChild(report);\r\n\r\n        var actions=makeNode(doc,'div','print-actions');\r\n        var printButton=makeNode(doc,'button','printbtn','Save \/ print as PDF');\r\n        printButton.type='button';\r\n        printButton.addEventListener('click',function(){ w.print(); });\r\n        actions.appendChild(printButton);\r\n        report.appendChild(actions);\r\n\r\n        var now=new Date();\r\n        var dateString=now.toLocaleDateString('en-GB',{year:'numeric',month:'2-digit',day:'2-digit'});\r\n        var title=personalValue('reportTitle') || 'Real Estate Profitability Analysis Ulcinj';\r\n        var recipient=personalValue('reportRecipient');\r\n        var objectAddress=personalValue('objectAddress');\r\n        var lnNumber=personalValue('lnNumber');\r\n        var pdNumber=personalValue('pdNumber');\r\n        var parcelNumber=personalValue('parcelNumber');\r\n        var koNumber=personalValue('koNumber');\r\n\r\n        var cover=makeNode(doc,'section','cover');\r\n        var coverTop=makeNode(doc,'div','');\r\n        coverTop.appendChild(makeNode(doc,'div','brand-line'));\r\n        coverTop.appendChild(makeNode(doc,'div','eyebrow','Real Estate \/ Ulcinj \/ ROI Analysis'));\r\n        if(reportCoverImageData){\r\n          var img=doc.createElement('img');\r\n          img.className='cover-image';\r\n          img.alt='Property photo';\r\n          img.src=reportCoverImageData;\r\n          coverTop.appendChild(img);\r\n        }\r\n        coverTop.appendChild(makeNode(doc,'h1','', title));\r\n        coverTop.appendChild(makeNode(doc,'p','lead','This analysis documents the input values, scenarios, cost positions, yield metrics and long-term value assumptions currently entered in the calculator. It is designed as a structured decision-support document and does not replace tax, notarial, legal or property-specific review.'));\r\n\r\n        var metaGrid=makeNode(doc,'div','meta-grid');\r\n        var metaItems=[\r\n          ['Analysis date',dateString],\r\n          ['Calculation model',reportValue('selectedModelResult')],\r\n          ['Aktives Scenario',reportScenarioLabel()],\r\n          ['Property location',objectAddress || 'Ulcinj, Montenegro'],\r\n          ['Purchase price',inputValue('purchasePrice')],\r\n          ['Living area',inputValue('livingArea')+' m&sup2;'],\r\n          ['Bedrooms',byId('bedroomType') && byId('bedroomType').selectedOptions[0] ? byId('bedroomType').selectedOptions[0].textContent : ''],\r\n          ['Purchase type',byId('purchaseType') && byId('purchaseType').selectedOptions[0] ? byId('purchaseType').selectedOptions[0].textContent : '']\r\n        ];\r\n        if(recipient) metaItems.unshift(['Recipient \/ client',recipient]);\r\n        if(lnNumber) metaItems.push(['List nepokretnosti \/ LN \/ PL',lnNumber]);\r\n        if(pdNumber) metaItems.push(['PD \/ apartment number',pdNumber]);\r\n        if(parcelNumber) metaItems.push(['Parcel number',parcelNumber]);\r\n        if(koNumber) metaItems.push(['KO \/ cadastral municipality',koNumber]);\r\n\r\n        metaItems.forEach(function(item){\r\n          var m=makeNode(doc,'div','meta');\r\n          m.appendChild(makeNode(doc,'span','',item[0]));\r\n          m.appendChild(makeNode(doc,'strong','',item[1]));\r\n          metaGrid.appendChild(m);\r\n        });\r\n        coverTop.appendChild(metaGrid);\r\n        cover.appendChild(coverTop);\r\n        cover.appendChild(makeNode(doc,'p','cover-note','Created as a calculation-based scenario analysis. All values are based on inputs, assumptions and simplified calculation models.'));\r\n        report.appendChild(cover);\r\n\r\n        var tocSection=makeSection(doc,report,'0','Content and review structure','Structure of the detailed profitability analysis.');\r\n        var toc=makeNode(doc,'div','toc');\r\n        [['1','Management summary and key figures'],['2','Input parameters, property information and investment basis'],['3','Rental model and income assumptions'],['4','Cost, fee and cash-flow structure'],['5','Value appreciation and long-term projection'],['6','Methodological notes and disclaimer']].forEach(function(item){\r\n          var d=makeNode(doc,'div','');\r\n          d.appendChild(makeNode(doc,'strong','',item[0]));\r\n          d.appendChild(makeNode(doc,'span','',item[1]));\r\n          toc.appendChild(d);\r\n        });\r\n        tocSection.appendChild(toc);\r\n\r\n        var s1=makeSection(doc,report,'1','Management summary and key figures','Condensed view of the economic result based on the current calculator configuration.');\r\n        var kpis=makeNode(doc,'div','kpi-grid');\r\n        s1.appendChild(kpis);\r\n        addReportKpi(doc,kpis,'Gross annual revenue',reportValue('grossRevenue'),'Gross income of the active model p.a.');\r\n        addReportKpi(doc,kpis,'Net cash flow p.a.',reportValue('netCashflow'),'Annual cash flow after applied costs.');\r\n        addReportKpi(doc,kpis,'Net rental yield',reportValue('netYield'),'Net cash flow relative to total investment.');\r\n        addReportKpi(doc,kpis,'Total investment',reportValue('totalInvestment'),'Purchase price plus one-time ancillary costs.');\r\n        addReportKpi(doc,kpis,'Property value after 10 years',reportValue('activeValue10Kpi'),'Active value-appreciation scenario.');\r\n        addReportKpi(doc,kpis,'Overall picture after 10 years',reportValue('activeTotal10Kpi'),'Property value plus cumulative rental income.');\r\n\r\n        var gross=parseLocalizedNumber(reportValue('grossRevenue'));\r\n        var net=parseLocalizedNumber(reportValue('netCashflow'));\r\n        var y=parseLocalizedNumber(reportValue('netYield'));\r\n        var total=parseLocalizedNumber(reportValue('totalInvestment'));\r\n        var variable=parseLocalizedNumber(reportValue('variableCosts'));\r\n        var fixed=parseLocalizedNumber(reportValue('fixedCostsYearly'));\r\n        var bars=makeNode(doc,'div','metric-grid');\r\n        s1.appendChild(bars);\r\n        addMiniBar(doc,bars,'Net rental yield',reportValue('netYield'),y*5,'Scaling: 20 percent yield corresponds to 100 percent bar width.');\r\n        addMiniBar(doc,bars,'Net cash flow to gross revenue',gross>0 ? formatPercent(net\/gross*100) : '0,00%',gross>0 ? net\/gross*100 : 0,'Shows what share of gross revenue remains after deductions.');\r\n        addMiniBar(doc,bars,'Variable deductions to revenue',gross>0 ? formatPercent(variable\/gross*100) : '0,00%',gross>0 ? variable\/gross*100 : 0,'Platform and support deductions relative to gross revenue.');\r\n        addMiniBar(doc,bars,'Fixed costs to total investment',total>0 ? formatPercent(fixed\/total*100) : '0,00%',total>0 ? fixed\/total*500 : 0,'Ongoing owner fixed costs relative to total investment.');\r\n\r\n        var s2=makeSection(doc,report,'2','Input parameters, property information and investment basis','Documentation of capital-related core assumptions, optional property identification and one-time acquisition costs.');\r\n        var baseRows=[\r\n          ['Purchase price',inputValue('purchasePrice'),'Base value for transfer tax, yield and value development.'],\r\n          ['Purchase type',byId('purchaseType') && byId('purchaseType').selectedOptions[0] ? byId('purchaseType').selectedOptions[0].textContent : '','Controls the treatment of real estate transfer tax.'],\r\n          ['Living area',inputValue('livingArea')+' m&sup2;','Basis for area-dependent management costs.'],\r\n          ['Bedrooms',byId('bedroomType') && byId('bedroomType').selectedOptions[0] ? byId('bedroomType').selectedOptions[0].textContent : '','Controls default prices in the seasonal model.'],\r\n          ['Notarial \/ technical purchase-related costs',inputValue('extraCosts'),'One-time acquisition costs excluding transfer tax.'],\r\n          ['One-time real estate transfer tax',inputValue('stateTransferTax'),'Progressive for existing properties, 0.00 euros for new-build property in the calculator.'],\r\n          ['Total investment incl. ancillary costs',reportValue('totalInvestment'),'Reference value for net yield and payback.']\r\n        ];\r\n        if(objectAddress) baseRows.push(['Property address \/ location',objectAddress,'Optional property description from the personalized report.']);\r\n        if(lnNumber) baseRows.push(['List nepokretnosti \/ LN \/ PL',lnNumber,'Grundbuch- \/ Besitzblattangabe.']);\r\n        if(pdNumber) baseRows.push(['PD \/ apartment number',pdNumber,'Apartment, building-part or PD information.']);\r\n        if(parcelNumber) baseRows.push(['Parcel number',parcelNumber,'Katasterparzelle.']);\r\n        if(koNumber) baseRows.push(['KO \/ cadastral municipality',koNumber,'Cadastral municipality.']);\r\n        addSimpleTable(doc,s2,baseRows);\r\n\r\n        var s3=makeSection(doc,report,'3','Rental model and income assumptions','Presentation exclusively of the currently selected income model. Non-active comparison models are intentionally hidden in this output.');\r\n        if(state.rentalModel==='season'){\r\n          addSimpleTable(doc,s3,[\r\n            ['Active model',reportValue('selectedModelResult'),'Selection in the calculator.'],\r\n            ['Active seasonal scenario',reportValue('activeScenario'),'Relevant in the seasonal model.'],\r\n            ['Annual revenue seasonal model',reportValue('seasonRevenueResult'),'Short-term rental based on days, prices and occupancy.'],\r\n            ['Rented overnight stays seasonal model',reportValue('bookedNights'),'Calculated booked nights in the active seasonal profile.'],\r\n            ['Seasonal model income growth p.a.',reportValue('seasonGrowthResult'),'Active growth assumption for seasonal revenue.']\r\n          ]);\r\n          s3.appendChild(makeNode(doc,'h3','', 'Seasonal assumptions'));\r\n          addSeasonAssumptionTable(doc,s3);\r\n        }else{\r\n          addSimpleTable(doc,s3,[\r\n            ['Active model',reportValue('selectedModelResult'),'Selection in the calculator.'],\r\n            ['Active long-term rental scenario',reportValue('activeLongRentScenario'),'Relevant in the long-term rental model.'],\r\n            ['Annual revenue long-term rental model',reportValue('longRentRevenueResult'),'Long-term rental on a monthly basis.'],\r\n            ['Rent \/ month',inputValue('longRentMonthly'),'Monthly net rent as starting value.'],\r\n            ['Rented months \/ year',inputValue('longRentMonths'),'Vacancy can be represented through fewer months.'],\r\n            ['Long-term rental model income growth p.a.',reportValue('longRentGrowthResult'),'Active growth assumption for long-term rent.']\r\n          ]);\r\n        }\r\n\r\n        var s4=makeSection(doc,report,'4','Cost, fee and cash-flow structure','Breakdown of ongoing costs, platform assumptions and net cash-flow effect.');\r\n        var costRows=[];\r\n        if(state.rentalModel==='season'){\r\n          costRows.push(['Selected platforms',selectedPlatformsText(),'Multiple platforms are applied as a simple average.']);\r\n          costRows.push(['Applied platform average',reportValue('platformFeeAverageOut'),'Relevant only in the seasonal model as variable deductions.']);\r\n          costRows.push(['Management \/ support',inputValue('managementFee')+'%','Optional percentage deduction from revenue.']);\r\n        }\r\n        costRows.push(['Building management \/ year',reportValue('propertyManagementYearly'),'From living area and selected cent rate per m&sup2; \/ month.']);\r\n        costRows.push(['Annual property tax',reportValue('annualPropertyTax'),'Purchase price multiplied by tax rate.']);\r\n        costRows.push(['Owner fixed costs \/ year',reportValue('fixedCostsYearly'),'Ongoing fixed costs from the owner perspective.']);\r\n        costRows.push(['Variable deductions',reportValue('variableCosts'),state.rentalModel==='season' ? 'Platform and support deductions.' : 'In the long-term rental model, usually 0.00 euros unless additional deductions are applied.']);\r\n        costRows.push(['Net cash flow p.a.',reportValue('netCashflow'),'Result after applied cost positions.']);\r\n        costRows.push(['Payback based on net cash flow',reportValue('payback'),'Simplified calculated capital payback period.']);\r\n        addSimpleTable(doc,s4,costRows);\r\n        if(state.rentalModel==='longrent'){\r\n          addSimpleTable(doc,s4,[\r\n            ['Active consumption scenario',reportValue('activeHouseholdScenario'),'Visible only in the long-term rental model.'],\r\n            ['Electricity \/ year',reportValue('powerYearly'),'Shown as recoverable tenant service charges.'],\r\n            ['Water \/ year',reportValue('waterYearly'),'Shown as recoverable tenant service charges.'],\r\n            ['Waste \/ year',reportValue('wasteYearly'),'Shown as recoverable tenant service charges.'],\r\n            ['Internet \/ year',reportValue('internetYearly'),'Shown as recoverable tenant service charges.'],\r\n            ['Recoverable tenant service charges \/ year',reportValue('passThroughCostsYearly'),'Do not reduce the owner cash flow in the calculator.']\r\n          ]);\r\n        }\r\n\r\n        var s5=makeSection(doc,report,'5','Value appreciation and long-term projection','Scenario-based value development and cumulative view across multiple periods.');\r\n        addSimpleTable(doc,s5,[\r\n          ['Active value-appreciation scenario',reportValue('activeValueScenario'),'Selected scenario for value development.'],\r\n          ['Active value appreciation p.a.',reportValue('activeValueGrowthRate'),'Annual growth assumption.'],\r\n          ['Property value after 5 years',reportValue('activeValue5'),'Aktives Scenario.'],\r\n          ['Property value after 10 years',reportValue('activeValue10'),'Aktives Scenario.'],\r\n          ['Property value after 20 years',reportValue('activeValue20'),'Aktives Scenario.'],\r\n          ['Property value after 30 years',reportValue('activeValue30'),'Aktives Scenario.'],\r\n          ['Cumulative rental income after 10 years',reportValue('activeIncome10'),'Active rental model.'],\r\n          ['Overall picture after 10 years',reportValue('activeTotal10'),'Property value plus cumulative rental income.']\r\n        ]);\r\n        s5.appendChild(makeNode(doc,'h3','', 'Projection matrix value appreciation'));\r\n        addScenarioProjectionTable(doc,s5,'value','Property value');\r\n        s5.appendChild(makeNode(doc,'h3','', state.rentalModel==='season' ? 'Projection matrix seasonal revenue' : 'Projection matrix long-term rent'));\r\n        addScenarioProjectionTable(doc,s5,state.rentalModel==='season' ? 'season' : 'longRent',state.rentalModel==='season' ? 'Seasonal revenue' : 'Long-term rent');\r\n\r\n        var s6=makeSection(doc,report,'6','Methodological notes and disclaimer','Limitation of the informative value of this calculation-based scenario analysis.');\r\n        var disclaimer=makeNode(doc,'div','disclaimer');\r\n        disclaimer.appendChild(makeNode(doc,'p','', 'This output is a calculation-based profitability analysis. It documents the currently visible values of the calculator and condenses them into a reviewable structure. It is not a market value appraisal, tax advice, legal advice, notarial review or binding investment recommendation.'));\r\n        disclaimer.appendChild(makeNode(doc,'p','', 'Individual financing costs, personal income tax, specific municipal assessments, construction risks, renovation costs, registration and permit obligations, actual occupancy, payment risks, exchange-rate effects and property-specific factors are not included.'));\r\n        disclaimer.appendChild(makeNode(doc,'p','', 'All results depend directly on input values, model assumptions and simplified calculation rules. Before making an investment decision, the property, contract, land register, tax consequences, rentability and market environment must be reviewed individually.'));\r\n        s6.appendChild(disclaimer);\r\n\r\n        var resources=makeNode(doc,'div','box');\r\n        resources.appendChild(makeNode(doc,'h3','', 'Further platforms and contact'));\r\n        resources.appendChild(makeNode(doc,'p','', 'The following platforms can be used for further review, property marketing, construction execution or interior furnishing.'));\r\n\r\n        var resourceGrid=makeNode(doc,'div','resource-grid');\r\n        [\r\n          ['Real estate portal','montenegro-listings.me','https:\/\/montenegro-listings.me\/'],\r\n          ['Main platform','ekosphere.me','https:\/\/ekosphere.me\/'],\r\n          ['Construction company','ekosphere-construction.me','https:\/\/ekosphere-construction.me\/'],\r\n          ['Custom-made furniture','ekosphere-concept.me','https:\/\/ekosphere-concept.me\/']\r\n        ].forEach(function(item){\r\n          var card=makeNode(doc,'div','resource-card');\r\n          card.appendChild(makeNode(doc,'strong','',item[0]));\r\n          var link=doc.createElement('a');\r\n          link.href=item[2];\r\n          link.target='_blank';\r\n          link.rel='noopener noreferrer';\r\n          link.textContent=item[1];\r\n          card.appendChild(link);\r\n          resourceGrid.appendChild(card);\r\n        });\r\n        resources.appendChild(resourceGrid);\r\n\r\n        var wa=doc.createElement('a');\r\n        wa.className='wa-report-btn';\r\n        wa.href='https:\/\/wa.me\/38230681227?text='+encodeURIComponent(buildWhatsAppResultMessage());\r\n        wa.target='_blank';\r\n        wa.rel='noopener noreferrer';\r\n        var waIcon=doc.createElement('img');\r\n        waIcon.src='https:\/\/upload.wikimedia.org\/wikipedia\/commons\/5\/5e\/WhatsApp_icon.png?_=20200503174721';\r\n        waIcon.alt='';\r\n        waIcon.setAttribute('aria-hidden','true');\r\n        wa.appendChild(waIcon);\r\n        wa.appendChild(makeNode(doc,'span','', 'Discuss the analysis via WhatsApp'));\r\n        resources.appendChild(wa);\r\n        s6.appendChild(resources);\r\n\r\n        var sig=makeNode(doc,'div','signature');\r\n        sig.appendChild(makeNode(doc,'div','sigline','Analysis created on '+dateString));\r\n        sig.appendChild(makeNode(doc,'div','sigline','Real Estate \/ Ulcinj \/ ROI Analysis'));\r\n        s6.appendChild(sig);\r\n\r\n        setTimeout(function(){ try{ w.focus(); }catch(e){} },250);\r\n      }\r\n      function copyResult(){\r\n        var copyButton=byId('ekoCopy');\r\n        var text=['Real Estate Calculator Ulcinj Result','Model: '+getText('selectedModelResult'),'Gross annual revenue: '+getText('grossRevenue'),'Net cash flow \/ year: '+getText('netCashflow'),'Net yield: '+getText('netYield'),'Total investment: '+getText('totalInvestment'),'Payback: '+getText('payback')].join('\\n');\r\n        if(navigator.clipboard && navigator.clipboard.writeText){navigator.clipboard.writeText(text).then(function(){if(copyButton){copyButton.textContent='Copied'; setTimeout(function(){copyButton.textContent='copy';},1600);}});}\r\n      }\r\n\r\n      normalizeInputEntities();\r\n      bindEvents();\r\n      setPressed('[data-rental-model]',state.rentalModel); setPressed('[data-scenario]',state.seasonScenario); setPressed('[data-longrent-scenario]',state.longRentScenario); setPressed('[data-household-scenario]',state.householdScenario); setPressed('[data-value-scenario]',state.valueScenario);\r\n      applySeasonScenario('average',true); applyLongRentScenario('average',true); setManagementRateFromRadio(); updateResult();\r\n    })();\r\n  <\/script>\r\n\r\n<\/section>\r\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-db1b093 elementor-widget elementor-widget-html\" data-id=\"db1b093\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>(function(){\r\n  function getTopOverlayBottom(){\r\n    const els = document.elementsFromPoint(10, 10);\r\n    let bottom = 0;\r\n\r\n    for(const el of els){\r\n      const cs = window.getComputedStyle(el);\r\n      if(cs.position !== \"fixed\" && cs.position !== \"sticky\") continue;\r\n\r\n      const r = el.getBoundingClientRect();\r\n      if(r.top <= 0 && r.bottom > bottom) bottom = r.bottom;\r\n    }\r\n\r\n    return Math.round(bottom);\r\n  }\r\n\r\n  function normalizeScrollTo(id){\r\n    const el = document.getElementById(id);\r\n    if(!el) return;\r\n\r\n    el.scrollIntoView({ block:\"start\", behavior:\"auto\" });\r\n\r\n    requestAnimationFrame(function(){\r\n      requestAnimationFrame(function(){\r\n        const overlay = getTopOverlayBottom();\r\n        const desired = overlay + 12;\r\n        const top = el.getBoundingClientRect().top;\r\n        const delta = Math.round(top - desired);\r\n\r\n        if(Math.abs(delta) > 2){\r\n          window.scrollBy({ top: delta, left: 0, behavior: \"auto\" });\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  function handleAnchorClick(e){\r\n    const a = e.target.closest(\"ol[data-ek-toc] a[href^='#'], ul[data-ek-toc] a[href^='#']\");\r\n    if(!a) return;\r\n\r\n    const id = (a.getAttribute(\"href\") || \"\").slice(1);\r\n    if(!id || !document.getElementById(id)) return;\r\n\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    if(e.stopImmediatePropagation) e.stopImmediatePropagation();\r\n\r\n    history.pushState(null, \"\", \"#\" + id);\r\n    normalizeScrollTo(id);\r\n  }\r\n\r\n  function init(){\r\n    document.addEventListener(\"click\", handleAnchorClick, true);\r\n\r\n    if(location.hash){\r\n      normalizeScrollTo(location.hash.slice(1));\r\n    }\r\n\r\n    window.addEventListener(\"hashchange\", function(){\r\n      if(location.hash){\r\n        normalizeScrollTo(location.hash.slice(1));\r\n      }\r\n    });\r\n  }\r\n\r\n  if(document.readyState === \"loading\"){\r\n    document.addEventListener(\"DOMContentLoaded\", init);\r\n  } else {\r\n    init();\r\n  }\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/main>\n\t\t\t\t<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Real Estate Calculator \/ Ulcinj ROI Calculator for Real Estate in Ulcinj 2026: calculate costs, yield and value appreciation clearly ROI Calculator for Real Estate in Ulcinj 2026: This neutral tool calculates purchase price, purchase-related costs, transfer tax, electricity, water, waste, internet, management, platform fees, seasonal rental, long-term rental, cash flow, net yield and potential [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":1010152,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-1010233","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/ekosphere.me\/en\/wp-json\/wp\/v2\/pages\/1010233","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ekosphere.me\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ekosphere.me\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ekosphere.me\/en\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/ekosphere.me\/en\/wp-json\/wp\/v2\/comments?post=1010233"}],"version-history":[{"count":5,"href":"https:\/\/ekosphere.me\/en\/wp-json\/wp\/v2\/pages\/1010233\/revisions"}],"predecessor-version":[{"id":1010749,"href":"https:\/\/ekosphere.me\/en\/wp-json\/wp\/v2\/pages\/1010233\/revisions\/1010749"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ekosphere.me\/en\/wp-json\/wp\/v2\/media\/1010152"}],"wp:attachment":[{"href":"https:\/\/ekosphere.me\/en\/wp-json\/wp\/v2\/media?parent=1010233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}