{"id":162,"date":"2026-03-27T22:57:18","date_gmt":"2026-03-27T22:57:18","guid":{"rendered":"https:\/\/ctest.al\/?page_id=162"},"modified":"2026-06-15T00:17:49","modified_gmt":"2026-06-15T00:17:49","slug":"map","status":"publish","type":"page","link":"https:\/\/ctest.al\/sq\/map\/","title":{"rendered":"Map"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"162\" class=\"elementor elementor-162\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-15a6f0b e-con-full e-flex e-con e-parent\" data-id=\"15a6f0b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-51d6923 e-con-full header-commit e-flex e-con e-child\" data-id=\"51d6923\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-c99f22a e-con-full e-flex e-con e-child\" data-id=\"c99f22a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8f8752b logo elementor-widget elementor-widget-image\" data-id=\"8f8752b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/ctest.al\/\">\n\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"726\" height=\"143\" src=\"https:\/\/ctest.al\/wp-content\/uploads\/2026\/06\/Commit-Logo-Blu.svg\" class=\"attachment-large size-large wp-image-1338\" alt=\"\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f80ad25 e-con-full e-flex e-con e-child\" data-id=\"f80ad25\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-123e6ec elementor-nav-menu__align-end elementor-nav-menu--dropdown-none elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-nav-menu\" data-id=\"123e6ec\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;layout&quot;:&quot;horizontal&quot;,&quot;submenu_icon&quot;:{&quot;value&quot;:&quot;&lt;svg aria-hidden=\\&quot;true\\&quot; class=\\&quot;e-font-icon-svg e-fas-caret-down\\&quot; viewBox=\\&quot;0 0 320 512\\&quot; xmlns=\\&quot;http:\\\/\\\/www.w3.org\\\/2000\\\/svg\\&quot;&gt;&lt;path d=\\&quot;M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z\\&quot;&gt;&lt;\\\/path&gt;&lt;\\\/svg&gt;&quot;,&quot;library&quot;:&quot;fa-solid&quot;}}\" data-widget_type=\"nav-menu.default\">\n\t\t\t\t\t\t\t\t<nav aria-label=\"Menu\" class=\"elementor-nav-menu--main elementor-nav-menu__container elementor-nav-menu--layout-horizontal e--pointer-underline e--animation-fade\">\n\t\t\t\t<ul id=\"menu-1-123e6ec\" class=\"elementor-nav-menu\"><li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1329\"><a href=\"http:\/\/ctest.al\/properties\/?btype=buy\" class=\"elementor-item\">Buy<\/a><\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1330\"><a href=\"https:\/\/ctest.al\/properties\/?btype=rent\" class=\"elementor-item\">Rent<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-897\"><a href=\"https:\/\/ctest.al\/sq\/sell\/\" class=\"elementor-item\">Sell<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type_archive menu-item-object-agent menu-item-1337\"><a href=\"https:\/\/ctest.al\/sq\/agents\/\" class=\"elementor-item\">Agents<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1325\"><a href=\"https:\/\/ctest.al\/sq\/commit-development\/\" class=\"elementor-item\">Commit Development<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1061\"><a href=\"https:\/\/ctest.al\/sq\/contact-us\/\" class=\"elementor-item\">Contact us<\/a><\/li>\n<\/ul>\t\t\t<\/nav>\n\t\t\t\t\t\t<nav class=\"elementor-nav-menu--dropdown elementor-nav-menu__container\" aria-hidden=\"true\">\n\t\t\t\t<ul id=\"menu-2-123e6ec\" class=\"elementor-nav-menu\"><li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1329\"><a href=\"http:\/\/ctest.al\/properties\/?btype=buy\" class=\"elementor-item\" tabindex=\"-1\">Buy<\/a><\/li>\n<li class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1330\"><a href=\"https:\/\/ctest.al\/properties\/?btype=rent\" class=\"elementor-item\" tabindex=\"-1\">Rent<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-897\"><a href=\"https:\/\/ctest.al\/sq\/sell\/\" class=\"elementor-item\" tabindex=\"-1\">Sell<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type_archive menu-item-object-agent menu-item-1337\"><a href=\"https:\/\/ctest.al\/sq\/agents\/\" class=\"elementor-item\" tabindex=\"-1\">Agents<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1325\"><a href=\"https:\/\/ctest.al\/sq\/commit-development\/\" class=\"elementor-item\" tabindex=\"-1\">Commit Development<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1061\"><a href=\"https:\/\/ctest.al\/sq\/contact-us\/\" class=\"elementor-item\" tabindex=\"-1\">Contact us<\/a><\/li>\n<\/ul>\t\t\t<\/nav>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5497898 elementor-hidden-mobile elementor-widget elementor-widget-button\" data-id=\"5497898\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/ctest.al\/map\/\" id=\"btn-commit\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-map-marked-alt\" viewBox=\"0 0 576 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M288 0c-69.59 0-126 56.41-126 126 0 56.26 82.35 158.8 113.9 196.02 6.39 7.54 17.82 7.54 24.2 0C331.65 284.8 414 182.26 414 126 414 56.41 357.59 0 288 0zm0 168c-23.2 0-42-18.8-42-42s18.8-42 42-42 42 18.8 42 42-18.8 42-42 42zM20.12 215.95A32.006 32.006 0 0 0 0 245.66v250.32c0 11.32 11.43 19.06 21.94 14.86L160 448V214.92c-8.84-15.98-16.07-31.54-21.25-46.42L20.12 215.95zM288 359.67c-14.07 0-27.38-6.18-36.51-16.96-19.66-23.2-40.57-49.62-59.49-76.72v182l192 64V266c-18.92 27.09-39.82 53.52-59.49 76.72-9.13 10.77-22.44 16.95-36.51 16.95zm266.06-198.51L416 224v288l139.88-55.95A31.996 31.996 0 0 0 576 426.34V176.02c0-11.32-11.43-19.06-21.94-14.86z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Properties Map<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8c7b888 open-menu elementor-hidden-mobile elementor-widget elementor-widget-button\" data-id=\"8c7b888\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-size-sm\" role=\"button\" id=\"btn-commit\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-bars\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Menu<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4e37720 open-menu-mobile elementor-hidden-desktop elementor-hidden-tablet elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"4e37720\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-bars\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8922196 htc elementor-widget elementor-widget-html\" data-id=\"8922196\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n    @media (min-width: 1680px) {\r\n        :root {\r\n            --padding: clamp(11.125rem, 7.8125vw, 25rem);\r\n        }\r\n    }\r\n\r\n    @media (max-width: 1680px) {\r\n        :root {\r\n            --padding: 20px !important;\r\n        }\r\n    }\r\n\r\n    .htc {\r\n        display: none;\r\n    }\r\n\r\n    .header-commit {\r\n        transition: background-color 250ms ease;\r\n        background-color: transparent;\r\n    }\r\n\r\n    .logo,\r\n    #btn-commit {\r\n        transition: transform 250ms ease !important;\r\n    }\r\n\r\n    .logo:hover,\r\n    #btn-commit:hover {\r\n        transform: scale(1.025);\r\n    }\r\n\r\n    .logo:active,\r\n    #btn-commit:active {\r\n        transform: scale(0.975);\r\n    }\r\n\r\n    \/* Parent wrapper *\/\r\n    .menu-container {\r\n        pointer-events: none;\r\n        visibility: hidden;\r\n        transition: visibility 0s linear 250ms;\r\n    }\r\n\r\n    .menu-container.show {\r\n        pointer-events: auto;\r\n        visibility: visible;\r\n        transition: visibility 0s linear 0s;\r\n    }\r\n\r\n    \/* Animated child *\/\r\n    .menu-commit {\r\n        opacity: 0;\r\n        transform: translateY(40px);\r\n        box-shadow: 0 0 0 100vmax rgba(0, 0, 0, 0);\r\n        transition: opacity 250ms ease, transform 150ms ease, box-shadow 250ms ease !important;\r\n    }\r\n\r\n    .menu-container.show .menu-commit {\r\n        opacity: 1;\r\n        transform: translateY(0);\r\n        box-shadow: 0 0 0 100vmax rgba(0, 0, 0, 0.7);\r\n    }\r\n    \r\n    .open-menu{\r\n        cursor: pointer;\r\n    }\r\n    \r\n    .menu-mobile {\r\n        opacity: 0;\r\n        pointer-events: none;\r\n        visibility: hidden;\r\n\r\n        transition:\r\n            opacity 250ms ease,\r\n            visibility 0s linear 250ms;\r\n    }\r\n\r\n    .menu-mobile.show {\r\n        opacity: 1;\r\n        pointer-events: auto;\r\n        visibility: visible;\r\n\r\n        transition:\r\n            opacity 250ms ease,\r\n            visibility 0s linear 0s;\r\n    }\r\n<\/style>\r\n\r\n<script>\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n    const header = document.querySelector(\".header-commit\");\r\n    const openMenu = document.querySelector(\".open-menu\");\r\n    const closeMenu = document.querySelector(\".close-menu\");\r\n    const menuContainer = document.querySelector(\".menu-container\");\r\n\r\n    if (!header || !openMenu || !menuContainer) return;\r\n\r\n    const SCROLL_THRESHOLD = 50;\r\n    let open = false;\r\n\r\n    window.addEventListener(\"scroll\", function () {\r\n        if (window.scrollY > SCROLL_THRESHOLD) {\r\n            header.classList.add(\"scrolled\");\r\n        } else {\r\n            header.classList.remove(\"scrolled\");\r\n        }\r\n    }, { passive: true });\r\n\r\n    function showMenu() {\r\n        menuContainer.classList.add(\"show\");\r\n        open = true;\r\n    }\r\n\r\n    function hideMenu() {\r\n        menuContainer.classList.remove(\"show\");\r\n        open = false;\r\n    }\r\n\r\n    openMenu.addEventListener(\"click\", function () {\r\n        if (open) {\r\n            hideMenu();\r\n        } else {\r\n            showMenu();\r\n        }\r\n    });\r\n\r\n    if (closeMenu) {\r\n        closeMenu.addEventListener(\"click\", hideMenu);\r\n    }\r\n    \r\n    \r\n    const openMobile = document.querySelector(\".open-menu-mobile\");\r\n    const closeMobile = document.querySelector(\".close-menu-mobile\");\r\n    const menuMobile = document.querySelector(\".menu-mobile\");\r\n\r\n    if (!openMobile || !menuMobile) return;\r\n\r\n    function showMobileMenu() {\r\n        menuMobile.classList.add(\"show\");\r\n    }\r\n\r\n    function hideMobileMenu() {\r\n        menuMobile.classList.remove(\"show\");\r\n    }\r\n\r\n    openMobile.addEventListener(\"click\", function () {\r\n        menuMobile.classList.toggle(\"show\");\r\n    });\r\n\r\n    if (closeMobile) {\r\n        closeMobile.addEventListener(\"click\", hideMobileMenu);\r\n    }\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4b58e98 elementor-widget elementor-widget-shortcode\" data-id=\"4b58e98\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><link href=\"https:\/\/fonts.googleapis.com\/css2?family=Figtree:wght@400;500;600;700;800&display=swap\" rel=\"stylesheet\">\n\n<div id=\"crm-map-wrap\">\n\n    <!-- \u2550\u2550 TOP BAR \u2550\u2550 -->\n    <div id=\"crm-top-bar\">\n\n        <!-- Search -->\n        <div class=\"crm-search-wrap\">\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\n                <circle cx=\"11\" cy=\"11\" r=\"8\"\/><path d=\"m21 21-4.35-4.35\"\/>\n            <\/svg>\n            <input type=\"text\" id=\"crm-search-input\" placeholder=\"City, neighborhood, property...\">\n        <\/div>\n\n        <!-- City pill -->\n        <div class=\"crm-pill\" id=\"pill-city\" onclick=\"crmTogglePill('dd-city',this)\">\n            <span class=\"crm-pill-label\" id=\"pill-city-label\">All cities<\/span>\n            <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"m6 9 6 6 6-6\"\/><\/svg>\n            <div class=\"crm-pill-dropdown\" id=\"dd-city\">\n                <label><input type=\"radio\" name=\"city_filter\" value=\"\"> All cities<\/label>\n                <label><input type=\"radio\" name=\"city_filter\" value=\"Tirana\"> Tirana<\/label>\n                <label><input type=\"radio\" name=\"city_filter\" value=\"Durres\"> Durres<\/label>\n                <button class=\"crm-dd-apply\" onclick=\"crmApplyPill('city_filter')\">Apply<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- For Sale pill -->\n        <div class=\"crm-pill active\" id=\"pill-btype\" onclick=\"crmTogglePill('dd-btype',this)\">\n            <span class=\"crm-pill-label\" id=\"pill-btype-label\">For Sale<\/span>\n            <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"m6 9 6 6 6-6\"\/><\/svg>\n            <div class=\"crm-pill-dropdown\" id=\"dd-btype\">\n                <label><input type=\"radio\" name=\"btype\" value=\"buy\" checked> For Sale<\/label>\n                <label><input type=\"radio\" name=\"btype\" value=\"rent\"> For Rent<\/label>\n                <label><input type=\"radio\" name=\"btype\" value=\"\"> Any<\/label>\n                <button class=\"crm-dd-apply\" onclick=\"crmApplyPill('btype')\">Apply<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Price pill -->\n        <div class=\"crm-pill\" id=\"pill-price\" onclick=\"crmTogglePill('dd-price',this)\">\n            <span class=\"crm-pill-label\" id=\"pill-price-label\">Any price<\/span>\n            <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"m6 9 6 6 6-6\"\/><\/svg>\n            <div class=\"crm-pill-dropdown\" id=\"dd-price\">\n                <div style=\"padding:8px 10px 4px;font-size:12px;font-weight:600;color:var(--muted);\">PRICE RANGE<\/div>\n                <div class=\"crm-dd-row\">\n                    <input type=\"number\" id=\"f-pmin\" placeholder=\"Min \u20ac\">\n                    <input type=\"number\" id=\"f-pmax\" placeholder=\"Max \u20ac\">\n                <\/div>\n                <button class=\"crm-dd-apply\" onclick=\"crmApplyPill('price')\">Apply<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Neighborhood pill \u2014 populated dynamically by JS after hoodData loads -->\n        <div class=\"crm-pill\" id=\"pill-hood\" onclick=\"crmTogglePill('dd-hood',this)\" style=\"display:none;\">\n            <span class=\"crm-pill-label\" id=\"pill-hood-label\">All neighborhoods<\/span>\n            <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"m6 9 6 6 6-6\"\/><\/svg>\n            <div class=\"crm-pill-dropdown\" id=\"dd-hood\">\n                <div style=\"padding:8px 10px 4px;font-size:12px;font-weight:600;color:var(--muted);\">NEIGHBORHOOD<\/div>\n                <div id=\"dd-hood-options\" style=\"max-height:220px;overflow-y:auto;padding:4px 0;\">\n                    <label><input type=\"radio\" name=\"hood\" value=\"\"> All neighborhoods<\/label>\n                <\/div>\n                <button class=\"crm-dd-apply\" onclick=\"crmApplyPill('hood')\">Apply<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Property type pill -->\n        <div class=\"crm-pill\" id=\"pill-utype\" onclick=\"crmTogglePill('dd-utype',this)\">\n            <span class=\"crm-pill-label\" id=\"pill-utype-label\">All property types<\/span>\n            <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"m6 9 6 6 6-6\"\/><\/svg>\n            <div class=\"crm-pill-dropdown\" id=\"dd-utype\">\n                <label><input type=\"radio\" name=\"utype\" value=\"\"> All types<\/label>\n                                <label><input type=\"radio\" name=\"utype\" value=\"apartment\"> Apartment<\/label>\n                                <label><input type=\"radio\" name=\"utype\" value=\"penthouse\"> Penthouse<\/label>\n                                <label><input type=\"radio\" name=\"utype\" value=\"villa\"> Villa<\/label>\n                                <button class=\"crm-dd-apply\" onclick=\"crmApplyPill('utype')\">Apply<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Beds pill -->\n        <div class=\"crm-pill\" id=\"pill-beds\" onclick=\"crmTogglePill('dd-beds',this)\">\n            <span class=\"crm-pill-label\" id=\"pill-beds-label\">All beds<\/span>\n            <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"m6 9 6 6 6-6\"\/><\/svg>\n            <div class=\"crm-pill-dropdown\" id=\"dd-beds\">\n                <div style=\"padding:8px 10px 4px;font-size:12px;font-weight:600;color:var(--muted);\">BEDROOMS (MIN)<\/div>\n                <div style=\"display:flex;gap:6px;padding:4px 10px 8px;flex-wrap:wrap;\">\n                                        <button onclick=\"crmSetBeds(0)\" class=\"crm-bed-btn\" data-beds=\"0\"\n                        style=\"flex:1;min-width:36px;padding:6px 4px;border:1px solid var(--border);border-radius:8px;font-family:var(--ff);font-size:13px;font-weight:600;cursor:pointer;background:#fff;color:var(--text);transition:all .15s;\">\n                        Any                    <\/button>\n                                        <button onclick=\"crmSetBeds(1)\" class=\"crm-bed-btn\" data-beds=\"1\"\n                        style=\"flex:1;min-width:36px;padding:6px 4px;border:1px solid var(--border);border-radius:8px;font-family:var(--ff);font-size:13px;font-weight:600;cursor:pointer;background:#fff;color:var(--text);transition:all .15s;\">\n                        1+                    <\/button>\n                                        <button onclick=\"crmSetBeds(2)\" class=\"crm-bed-btn\" data-beds=\"2\"\n                        style=\"flex:1;min-width:36px;padding:6px 4px;border:1px solid var(--border);border-radius:8px;font-family:var(--ff);font-size:13px;font-weight:600;cursor:pointer;background:#fff;color:var(--text);transition:all .15s;\">\n                        2+                    <\/button>\n                                        <button onclick=\"crmSetBeds(3)\" class=\"crm-bed-btn\" data-beds=\"3\"\n                        style=\"flex:1;min-width:36px;padding:6px 4px;border:1px solid var(--border);border-radius:8px;font-family:var(--ff);font-size:13px;font-weight:600;cursor:pointer;background:#fff;color:var(--text);transition:all .15s;\">\n                        3+                    <\/button>\n                                        <button onclick=\"crmSetBeds(4)\" class=\"crm-bed-btn\" data-beds=\"4\"\n                        style=\"flex:1;min-width:36px;padding:6px 4px;border:1px solid var(--border);border-radius:8px;font-family:var(--ff);font-size:13px;font-weight:600;cursor:pointer;background:#fff;color:var(--text);transition:all .15s;\">\n                        4+                    <\/button>\n                                        <button onclick=\"crmSetBeds(5)\" class=\"crm-bed-btn\" data-beds=\"5\"\n                        style=\"flex:1;min-width:36px;padding:6px 4px;border:1px solid var(--border);border-radius:8px;font-family:var(--ff);font-size:13px;font-weight:600;cursor:pointer;background:#fff;color:var(--text);transition:all .15s;\">\n                        5+                    <\/button>\n                                    <\/div>\n                <button class=\"crm-dd-apply\" onclick=\"crmApplyPill('beds')\">Apply<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Baths pill -->\n        <div class=\"crm-pill\" id=\"pill-baths\" onclick=\"crmTogglePill('dd-baths',this)\">\n            <span class=\"crm-pill-label\" id=\"pill-baths-label\">All baths<\/span>\n            <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"m6 9 6 6 6-6\"\/><\/svg>\n            <div class=\"crm-pill-dropdown\" id=\"dd-baths\">\n                <div style=\"padding:8px 10px 4px;font-size:12px;font-weight:600;color:var(--muted);\">BATHROOMS (MIN)<\/div>\n                <div style=\"display:flex;gap:6px;padding:4px 10px 8px;flex-wrap:wrap;\">\n                                        <button onclick=\"crmSetBaths(0)\" class=\"crm-bath-btn\" data-baths=\"0\"\n                        style=\"flex:1;min-width:36px;padding:6px 4px;border:1px solid var(--border);border-radius:8px;font-family:var(--ff);font-size:13px;font-weight:600;cursor:pointer;background:#fff;color:var(--text);transition:all .15s;\">\n                        Any                    <\/button>\n                                        <button onclick=\"crmSetBaths(1)\" class=\"crm-bath-btn\" data-baths=\"1\"\n                        style=\"flex:1;min-width:36px;padding:6px 4px;border:1px solid var(--border);border-radius:8px;font-family:var(--ff);font-size:13px;font-weight:600;cursor:pointer;background:#fff;color:var(--text);transition:all .15s;\">\n                        1+                    <\/button>\n                                        <button onclick=\"crmSetBaths(2)\" class=\"crm-bath-btn\" data-baths=\"2\"\n                        style=\"flex:1;min-width:36px;padding:6px 4px;border:1px solid var(--border);border-radius:8px;font-family:var(--ff);font-size:13px;font-weight:600;cursor:pointer;background:#fff;color:var(--text);transition:all .15s;\">\n                        2+                    <\/button>\n                                        <button onclick=\"crmSetBaths(3)\" class=\"crm-bath-btn\" data-baths=\"3\"\n                        style=\"flex:1;min-width:36px;padding:6px 4px;border:1px solid var(--border);border-radius:8px;font-family:var(--ff);font-size:13px;font-weight:600;cursor:pointer;background:#fff;color:var(--text);transition:all .15s;\">\n                        3+                    <\/button>\n                                        <button onclick=\"crmSetBaths(4)\" class=\"crm-bath-btn\" data-baths=\"4\"\n                        style=\"flex:1;min-width:36px;padding:6px 4px;border:1px solid var(--border);border-radius:8px;font-family:var(--ff);font-size:13px;font-weight:600;cursor:pointer;background:#fff;color:var(--text);transition:all .15s;\">\n                        4+                    <\/button>\n                                    <\/div>\n                <button class=\"crm-dd-apply\" onclick=\"crmApplyPill('baths')\">Apply<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Clear Filters button -->\n        <button id=\"crm-btn-clear\" onclick=\"crmClearAllFilters()\">\u2715 Clear Filters<\/button>\n\n        <div class=\"crm-top-right\">\n            <!-- Draw area filter -->\n            <div style=\"display:flex;align-items:center;gap:0;\">\n                <button id=\"btn-draw\">\u270f Draw area<\/button>\n                <button id=\"btn-draw-clear\" title=\"Clear drawn area\">\u2715<\/button>\n            <\/div>\n\n            <!-- View toggle (mobile only) -->\n            <div id=\"crm-view-toggle\">\n                <button class=\"crm-view-btn active\" id=\"vbtn-list\" onclick=\"crmSetView('list')\">\n                    <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"\/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"\/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"\/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"\/><\/svg>\n                    List\n                <\/button>\n                <button class=\"crm-view-btn\" id=\"vbtn-map\" onclick=\"crmSetView('map')\">\n                    <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6-10l6-3m0 16l5.447-2.724A1 1 0 0021 18.382V7.618a1 1 0 00-.553-.894L15 4m0 13V4\"\/><\/svg>\n                    Map\n                <\/button>\n            <\/div>\n        <\/div>\n\n    <\/div>\n\n    <!-- \u2550\u2550 BODY \u2550\u2550 -->\n    <div id=\"crm-body\">\n\n        <!-- LISTINGS LEFT -->\n        <div id=\"crm-listings-panel\">\n            <div id=\"crm-listings-header\">\n                <div id=\"crm-results-count\">Loading...<\/div>\n                <div id=\"crm-results-sub\"><\/div>\n            <\/div>\n            <div id=\"crm-results-grid\"><\/div>\n        <\/div>\n\n        <!-- MAP RIGHT -->\n        <div id=\"crm-map\"><\/div>\n\n    <\/div>\n<\/div>\n\n<script>\n\/\/ \u2500\u2500 Active filter state \u2500\u2500\nvar CRM_FILTERS = {\n    btype: 'buy',\n    pmin: 0, pmax: Infinity,\n    utype: '',\n    city_filter: '',\n    hood: '',\n    beds: 0, baths: 0,\n    search: '',\n    drawn: null\n};\nvar CRM_BEDS_SEL  = 0;\nvar CRM_BATHS_SEL = 0;\n\n\/\/ \u2500\u2500 Pill toggle \u2500\u2500\nfunction crmTogglePill(ddId, pillEl){\n    event.stopPropagation();\n    var dd = document.getElementById(ddId);\n    var isOpen = dd.classList.contains('open');\n    \/\/ Close all\n    document.querySelectorAll('.crm-pill-dropdown').forEach(function(d){ d.classList.remove('open'); });\n    if(!isOpen) dd.classList.add('open');\n}\ndocument.addEventListener('click', function(e){\n    if(!e.target.closest('.crm-pill')) {\n        document.querySelectorAll('.crm-pill-dropdown').forEach(function(d){ d.classList.remove('open'); });\n    }\n});\n\n\/\/ \u2500\u2500 Apply pill \u2500\u2500\nfunction crmApplyPill(type){\n    document.querySelectorAll('.crm-pill-dropdown').forEach(function(d){ d.classList.remove('open'); });\n\n    if(type==='city_filter'){\n        var val = (document.querySelector('input[name=\"city_filter\"]:checked') || {}).value || '';\n        CRM_FILTERS.city_filter = val;\n        var lbl = val ? val : 'All cities';\n        document.getElementById('pill-city-label').textContent = lbl;\n        document.getElementById('pill-city').classList.toggle('active', !!val);\n        if(val){\n            \/\/ Navigate map to this city\n            if(window.albaniaData){\n                var feat = window.albaniaData.features.find(function(f){\n                    return normCity(f.properties.NAME_1) === normCity(val);\n                });\n                if(feat && window.regionLayers && window.regionLayers[feat.properties.NAME_1]){\n                    handleRegionClick(feat.properties.NAME_1, window.regionLayers[feat.properties.NAME_1]);\n                    return;\n                }\n            }\n        } else {\n            \/\/ Reset to country view\n            currentLevel = 1; currentRegion = null; selectedHood = null;\n            showPolygonsForLevel(1);\n            map.flyTo([41.15,19.82], 7, {duration:0.8});\n        }\n        if(window._crmApplyFilters) window._crmApplyFilters();\n        return;\n    }\n    if(type==='btype'){\n        var val = (document.querySelector('input[name=\"btype\"]:checked') || {}).value || '';\n        CRM_FILTERS.btype = val;\n        var lbl = val==='buy'?'For Sale':val==='rent'?'For Rent':'Any type';\n        document.getElementById('pill-btype-label').textContent = lbl;\n        document.getElementById('pill-btype').classList.toggle('active', !!val);\n    }\n    if(type==='price'){\n        var pmin = parseInt(document.getElementById('f-pmin').value)||0;\n        var pmax = parseInt(document.getElementById('f-pmax').value)||Infinity;\n        CRM_FILTERS.pmin = pmin; CRM_FILTERS.pmax = pmax;\n        var lbl = (!pmin&&pmax===Infinity)?'Any price':\n                  (pmin&&pmax<Infinity)?'\u20ac'+fmtK(pmin)+' \u2013 \u20ac'+fmtK(pmax):\n                  (pmin)?'\u20ac'+fmtK(pmin)+'+':'Up to \u20ac'+fmtK(pmax);\n        document.getElementById('pill-price-label').textContent = lbl;\n        document.getElementById('pill-price').classList.toggle('active', pmin>0||pmax<Infinity);\n    }\n    if(type==='utype'){\n        var val = (document.querySelector('input[name=\"utype\"]:checked') || {}).value || '';\n        CRM_FILTERS.utype = val;\n        var lbl = val?ucFirst(val):'All property types';\n        document.getElementById('pill-utype-label').textContent = lbl;\n        document.getElementById('pill-utype').classList.toggle('active', !!val);\n    }\n    if(type==='beds'){\n        CRM_FILTERS.beds = CRM_BEDS_SEL;\n        var lbl = CRM_BEDS_SEL===0?'All beds':CRM_BEDS_SEL+'+ beds';\n        document.getElementById('pill-beds-label').textContent = lbl;\n        document.getElementById('pill-beds').classList.toggle('active', CRM_BEDS_SEL>0);\n    }\n    if(type==='baths'){\n        CRM_FILTERS.baths = CRM_BATHS_SEL;\n        var lbl = CRM_BATHS_SEL===0?'All baths':CRM_BATHS_SEL+'+ baths';\n        document.getElementById('pill-baths-label').textContent = lbl;\n        document.getElementById('pill-baths').classList.toggle('active', CRM_BATHS_SEL>0);\n    }\n    if(type==='hood'){\n        var val = (document.querySelector('input[name=\"hood\"]:checked') || {}).value || '';\n        \/\/ Radio values are exact hood names so direct selection is fine\n        CRM_FILTERS.hood = val;\n        var lbl = val ? val : 'All neighborhoods';\n        document.getElementById('pill-hood-label').textContent = lbl;\n        document.getElementById('pill-hood').classList.toggle('active', !!val);\n        if(val) crmSelectNeighborhoodByName(val);\n        else {\n            \/\/ Cleared \u2014 go back to city view\n            if(currentRegion) showPolygonsForLevel(2);\n            else showPolygonsForLevel(1);\n            applyFilters();\n        }\n    }\n    if(window._crmApplyFilters) window._crmApplyFilters();\n}\n\nfunction crmSetBeds(n){\n    CRM_BEDS_SEL = n;\n    document.querySelectorAll('.crm-bed-btn').forEach(function(b){\n        b.style.background = parseInt(b.dataset.beds)===n ? 'var(--brand)' : '#fff';\n        b.style.color      = parseInt(b.dataset.beds)===n ? '#fff' : 'var(--text)';\n        b.style.borderColor= parseInt(b.dataset.beds)===n ? 'var(--brand)' : 'var(--border)';\n    });\n}\nfunction crmSetBaths(n){\n    CRM_BATHS_SEL = n;\n    document.querySelectorAll('.crm-bath-btn').forEach(function(b){\n        b.style.background = parseInt(b.dataset.baths)===n ? 'var(--brand)' : '#fff';\n        b.style.color      = parseInt(b.dataset.baths)===n ? '#fff' : 'var(--text)';\n        b.style.borderColor= parseInt(b.dataset.baths)===n ? 'var(--brand)' : 'var(--border)';\n    });\n}\n\nfunction fmtK(n){ return n>=1000000?(n\/1000000).toFixed(1).replace('.0','')+'M':n>=1000?(n\/1000).toFixed(0)+'K':n; }\nfunction ucFirst(s){ return s?s.charAt(0).toUpperCase()+s.slice(1):s; }\n\n\/\/ \u2500\u2500 Plain text search \u2500\u2500\nvar searchTimer;\ndocument.getElementById('crm-search-input').addEventListener('input', function(){\n    clearTimeout(searchTimer);\n    searchTimer = setTimeout(function(){\n        CRM_FILTERS.search = document.getElementById('crm-search-input').value.toLowerCase().trim();\n        if(window._crmApplyFilters) window._crmApplyFilters();\n    }, 300);\n});\n\n\/\/ \u2500\u2500 AI Search \u2500\u2500\n\/\/ Apply AI-extracted filters to the map (called from URL params on load)\nwindow.crmApplyAiFilters = function crmApplyAiFilters(filters, query){\n    var LABELS = {\n        business_type:'Type', unit_type:'Property', city:'City',\n        neighborhood:'Neighborhood', min_bedrooms:'Min Beds',\n        min_bathrooms:'Min Baths', min_price:'Min Price',\n        max_price:'Max Price', min_area:'Min Area', max_area:'Max Area'\n    };\n\n    function fmtVal(key, val){\n        if(key==='business_type') return val==='buy'?'For Sale':'For Rent';\n        if(key.includes('price')) return '\u20ac'+Number(val).toLocaleString();\n        if(key.includes('area')) return val+' m\u00b2';\n        if(typeof val==='string') return val.charAt(0).toUpperCase()+val.slice(1);\n        return val;\n    }\n\n    \/\/ Reset all filters first\n    CRM_FILTERS.btype  = '';\n    CRM_FILTERS.utype  = '';\n    CRM_FILTERS.beds   = 0;\n    CRM_FILTERS.baths  = 0;\n    CRM_FILTERS.pmin   = 0;\n    CRM_FILTERS.pmax   = Infinity;\n    CRM_FILTERS.search = '';\n\n    \/\/ Apply extracted filters\n    if(filters.business_type)  CRM_FILTERS.btype = filters.business_type;\n    if(filters.unit_type)      CRM_FILTERS.utype = filters.unit_type;\n    if(filters.min_bedrooms)   CRM_FILTERS.beds  = parseInt(filters.min_bedrooms);\n    if(filters.min_bathrooms)  CRM_FILTERS.baths = parseInt(filters.min_bathrooms);\n    if(filters.min_price)      CRM_FILTERS.pmin  = parseInt(filters.min_price);\n    if(filters.max_price)      CRM_FILTERS.pmax  = parseInt(filters.max_price);\n    if(filters.min_area)       CRM_FILTERS.amin  = parseFloat(filters.min_area);\n    if(filters.max_area)       CRM_FILTERS.amax  = parseFloat(filters.max_area);\n\n    \/\/ Sync pill UI labels\n    if(filters.business_type){\n        var lbl = filters.business_type==='buy'?'For Sale':'For Rent';\n        document.getElementById('pill-btype-label').textContent = lbl;\n        document.getElementById('pill-btype').classList.add('active');\n        document.querySelector('input[name=\"btype\"][value=\"'+filters.business_type+'\"]').checked = true;\n    }\n    if(filters.unit_type){\n        document.getElementById('pill-utype-label').textContent = fmtVal('unit_type', filters.unit_type);\n        document.getElementById('pill-utype').classList.add('active');\n        var ut = document.querySelector('input[name=\"utype\"][value=\"'+filters.unit_type+'\"]');\n        if(ut) ut.checked = true;\n    }\n    if(filters.min_price||filters.max_price){\n        var pmin = filters.min_price||0, pmax = filters.max_price||0;\n        if(pmin) document.getElementById('f-pmin').value = pmin;\n        if(pmax) document.getElementById('f-pmax').value = pmax;\n        var plbl = (pmin&&pmax)?'\u20ac'+fmtK(pmin)+' \u2013 \u20ac'+fmtK(pmax):(pmin?'\u20ac'+fmtK(pmin)+'+':'Up to \u20ac'+fmtK(pmax));\n        document.getElementById('pill-price-label').textContent = plbl;\n        document.getElementById('pill-price').classList.add('active');\n    }\n    if(filters.min_bedrooms){\n        CRM_BEDS_SEL = parseInt(filters.min_bedrooms);\n        crmSetBeds(CRM_BEDS_SEL);\n        document.getElementById('pill-beds-label').textContent = CRM_BEDS_SEL+'+ beds';\n        document.getElementById('pill-beds').classList.add('active');\n    }\n    if(filters.min_bathrooms){\n        CRM_BATHS_SEL = parseInt(filters.min_bathrooms);\n        crmSetBaths(CRM_BATHS_SEL);\n        document.getElementById('pill-baths-label').textContent = CRM_BATHS_SEL+'+ baths';\n        document.getElementById('pill-baths').classList.add('active');\n    }\n\n    \/\/ Navigate map to city\/neighborhood if specified\n    if(filters.city && albaniaData){\n        var regionFeature = albaniaData.features.find(function(f){\n            return normCity(f.properties.NAME_1)===normCity(filters.city);\n        });\n        if(regionFeature){\n            currentRegion = regionFeature.properties.NAME_1;\n            currentLevel  = 2;\n            showPolygonsForLevel(2);\n        }\n    }\n    if(filters.neighborhood){\n        \/\/ Use fuzzy match \u2014 AI may return partial\/approximate names\n        setTimeout(function(){ crmSelectNeighborhoodByName(filters.neighborhood); }, 600);\n    }\n\n    \/\/ Show AI filter pills strip\n    var pillsEl = document.getElementById('crm-ai-pills');\n    pillsEl.innerHTML = '';\n    var keys = Object.keys(filters);\n    keys.forEach(function(key){\n        var c = document.createElement('div');\n        c.className = 'crm-ai-pill';\n        c.innerHTML = '<span class=\"crm-ai-pill-key\">'+(LABELS[key]||key)+'<\/span>'+fmtVal(key, filters[key]);\n        pillsEl.appendChild(c);\n    });\n    var clearBtn = document.createElement('button');\n    clearBtn.id = 'crm-ai-clear';\n    clearBtn.textContent = '\u2715 Clear AI filters';\n    clearBtn.onclick = function(){ crmClearAiFilters(); };\n    pillsEl.appendChild(clearBtn);\n    pillsEl.classList.add('visible');\n\n    if(window._crmApplyFilters) window._crmApplyFilters();\n}\n\n\/\/ Global clear \u2014 called by the Clear Filters button in the top bar\nwindow.crmClearAllFilters = function(){\n    \/\/ Reset filter state\n    CRM_FILTERS.btype  = ''; CRM_FILTERS.utype  = '';\n    CRM_FILTERS.beds   = 0;  CRM_FILTERS.baths  = 0;\n    CRM_FILTERS.pmin   = 0;  CRM_FILTERS.pmax   = Infinity;\n    CRM_FILTERS.amin   = 0;  CRM_FILTERS.amax   = Infinity;\n    CRM_FILTERS.hood   = ''; CRM_FILTERS.search = '';\n    CRM_FILTERS.drawn  = null;\n\n    \/\/ Reset pill labels\n    document.getElementById('pill-btype-label').textContent  = 'For Sale';\n    document.getElementById('pill-btype').classList.remove('active');\n    document.getElementById('pill-price-label').textContent  = 'Any price';\n    document.getElementById('pill-price').classList.remove('active');\n    document.getElementById('pill-utype-label').textContent  = 'All property types';\n    document.getElementById('pill-utype').classList.remove('active');\n    document.getElementById('pill-beds-label').textContent   = 'All beds';\n    document.getElementById('pill-beds').classList.remove('active');\n    document.getElementById('pill-baths-label').textContent  = 'All baths';\n    document.getElementById('pill-baths').classList.remove('active');\n    document.getElementById('pill-hood-label').textContent   = 'All neighborhoods';\n    document.getElementById('pill-hood').classList.remove('active');\n\n    \/\/ Reset inputs\n    document.getElementById('f-pmin').value = '';\n    document.getElementById('f-pmax').value = '';\n    document.getElementById('crm-search-input').value = '';\n    CRM_BEDS_SEL = 0; crmSetBeds(0);\n    CRM_BATHS_SEL = 0; crmSetBaths(0);\n\n    \/\/ Reset radio buttons\n    var btypeRadio = document.querySelector('input[name=\"btype\"][value=\"\"]');\n    if(btypeRadio) btypeRadio.checked = true;\n    var utypeRadio = document.querySelector('input[name=\"utype\"][value=\"\"]');\n    if(utypeRadio) utypeRadio.checked = true;\n    var hoodRadio  = document.querySelector('input[name=\"hood\"][value=\"\"]');\n    if(hoodRadio)  hoodRadio.checked  = true;\n\n    \/\/ Clear drawing\n    clearDrawing();\n\n    \/\/ Clear AI pills strip\n    var pillsEl = document.getElementById('crm-ai-pills');\n    if(pillsEl) pillsEl.classList.remove('visible');\n\n    \/\/ Reset map to country view\n    currentLevel = 1; currentRegion = null; selectedHood = null;\n    showPolygonsForLevel(1);\n    map.flyTo([41.15,19.82], 7, {duration:0.8});\n};\n\nfunction crmClearAiFilters(){\n    \/\/ Reset all filters\n    CRM_FILTERS.btype = 'buy'; CRM_FILTERS.utype = '';\n    CRM_FILTERS.beds  = 0;    CRM_FILTERS.baths  = 0;\n    CRM_FILTERS.pmin  = 0;    CRM_FILTERS.pmax   = Infinity;\n    CRM_FILTERS.amin  = 0;    CRM_FILTERS.amax   = Infinity;\n    CRM_FILTERS.hood  = '';   CRM_FILTERS.search = '';\n    document.getElementById('pill-hood-label').textContent = 'All neighborhoods';\n    document.getElementById('pill-hood').classList.remove('active');\n    var hoodRadio = document.querySelector('input[name=\"hood\"][value=\"\"]');\n    if(hoodRadio) hoodRadio.checked = true;\n    document.getElementById('crm-search-input').value = '';\n    \/\/ Reset pill labels\n    document.getElementById('pill-btype-label').textContent = 'For Sale';\n    document.getElementById('pill-btype').classList.add('active');\n    document.getElementById('pill-price-label').textContent = 'Any price';\n    document.getElementById('pill-price').classList.remove('active');\n    document.getElementById('pill-utype-label').textContent = 'All property types';\n    document.getElementById('pill-utype').classList.remove('active');\n    document.getElementById('pill-beds-label').textContent = 'All beds';\n    document.getElementById('pill-beds').classList.remove('active');\n    document.getElementById('pill-baths-label').textContent = 'All baths';\n    document.getElementById('pill-baths').classList.remove('active');\n    CRM_BEDS_SEL = 0; crmSetBeds(0);\n    CRM_BATHS_SEL = 0; crmSetBaths(0);\n    document.getElementById('crm-ai-pills').classList.remove('visible');\n    currentLevel = 1; currentRegion = null; selectedHood = null;\n    showPolygonsForLevel(1);\n    map.flyTo([41.15,19.82],7,{duration:0.8});\n}\n\n\/\/ Enter key handled by plain search listener above\n\n\/\/ \u2500\u2500 View toggle (mobile) \u2500\u2500\nfunction crmSetView(v){\n    var listPanel = document.getElementById('crm-listings-panel');\n    var mapEl     = document.getElementById('crm-map');\n    document.getElementById('vbtn-list').classList.toggle('active', v==='list');\n    document.getElementById('vbtn-map').classList.toggle('active',  v==='map');\n    if(window.innerWidth > 768) return; \/\/ desktop always shows both\n    listPanel.style.display = v==='list' ? '' : 'none';\n    mapEl.style.flex        = v==='map'  ? '1' : '';\n    mapEl.style.height      = v==='map'  ? '100%' : '';\n    if(window._crmMap) setTimeout(()=>window._crmMap.invalidateSize(), 100);\n}\n<\/script>\n\n<script>\nwindow.crmmap_6a2ff0e4d8a65 = {\n    listingsUrl: 'https:\/\/ctest.al\/sq\/wp-json\/crm-sync\/v1\/listings',\n    albaniaUrl:  'https:\/\/ctest.al\/wp-content\/plugins\/crm-sync\/albania.json',\n    nbUrl:       'https:\/\/ctest.al\/wp-content\/plugins\/crm-sync\/neighborhoods.json'\n};\n<\/script>\n<script>\n(function waitForLeaflet(){\n    if(typeof L==='undefined'){ setTimeout(waitForLeaflet,50); return; }\n    initCrmMap(window.crmmap_6a2ff0e4d8a65.listingsUrl, window.crmmap_6a2ff0e4d8a65.albaniaUrl, window.crmmap_6a2ff0e4d8a65.nbUrl);\n})();\n\nfunction initCrmMap(LISTINGS_URL, ALBANIA_URL, NB_URL){\nvar LISTINGS = [];\n\n\/\/ Polygon styles\nvar S_REGION     = {color:'#999',weight:1.5,fillColor:'transparent',fillOpacity:0,interactive:true};\nvar S_REGION_HOV = {color:'#00bcd4',weight:2.5,fillColor:'#00bcd4',fillOpacity:0.18,interactive:true};\nvar S_HOOD       = {color:'#999',weight:1,fillColor:'transparent',fillOpacity:0,interactive:true};\nvar S_HOOD_HOV   = {color:'#00bcd4',weight:2,fillColor:'#00bcd4',fillOpacity:0.22,interactive:true};\nvar S_HOOD_SEL   = {color:'#00bcd4',weight:2.5,fillColor:'#00bcd4',fillOpacity:0.28,interactive:true};\nvar S_HOOD_DIM   = {color:'#ccc',weight:0.8,fillColor:'transparent',fillOpacity:0,interactive:true};\n\nfunction determineLevel(z){ return z<=11?1:z<=15?2:3; }\nfunction normCity(c){ return (c||'').toLowerCase().replace(\/\u00eb\/g,'e').replace(\/\u00e7\/g,'c').trim(); }\nfunction getHoodCity(n){ var v=normCity(n); if(v==='tirane'||v==='tirana') return 'Tirana'; if(v==='durres') return 'Durres'; return null; }\nfunction getCityForHoodCity(h){ return h==='Tirana'?'Tiran\u00eb':h==='Durres'?'Durr\u00ebs':h; }\nfunction fmtPrice(p){ return p?'\u20ac '+p.toLocaleString('en-US'):'\u2014'; }\nfunction fmtBiz(b){ return b==='buy'?'For Sale':b==='rent'?'For Rent':b||''; }\nfunction buildStats(l){\n    var p=[];\n    if(l.bedrooms)  p.push(l.bedrooms+' bd');\n    if(l.bathrooms) p.push(l.bathrooms+' ba');\n    if(l.area)      p.push(l.area+' m\u00b2');\n    return p.join(' \u00b7 ');\n}\n\n\/\/ Map\n\/\/ Destroy existing map instance if present (prevents \"already initialized\" error)\nif(window._crmMap){ window._crmMap.remove(); window._crmMap = null; }\nvar WORLD_BOUNDS = L.latLngBounds([-85,-180],[85,180]);\nvar map = L.map('crm-map',{\n    center:[41.15,19.82],\n    zoom:7,\n    minZoom:3,\n    zoomControl:true,\n    tap:false,\n    maxBounds:WORLD_BOUNDS,\n    maxBoundsViscosity:1.0\n});\nwindow._crmMap = map;\nL.tileLayer('https:\/\/{s}.basemaps.cartocdn.com\/light_all\/{z}\/{x}\/{y}{r}.png',{\n    attribution:'\u00a9 OpenStreetMap \u00a9 CARTO',subdomains:'abcd',maxZoom:19,noWrap:true\n}).addTo(map);\nwindow.addEventListener('resize',function(){ setTimeout(function(){ map.invalidateSize(); },150); });\n\nvar albaniaData=null, hoodData={};\nvar regionLayers={}, hoodLayers={}, pinLayers={};\n\/\/ Expose on window so city pill handler (outside initCrmMap) can access\nwindow.albaniaData = null;\nwindow.regionLayers = {};\nvar activeId=null, currentLevel=1, lastZoomLevel=7;\nvar currentRegion=null, selectedHood=null;\nvar isDrawing=false, drawPoints=[], drawPolyline=null, drawPolygon=null, drawnFilter=null;\n\n\/\/ Load all data in parallel\nPromise.all([\n    fetch(ALBANIA_URL).then(r=>r.json()),\n    fetch(NB_URL).then(r=>r.json()),\n    fetch(LISTINGS_URL).then(r=>r.json())\n]).then(function(results){\n    albaniaData = results[0];\n    window.albaniaData = albaniaData; \/\/ expose for pill handlers\n    hoodData    = results[1];\n    LISTINGS    = results[2];\n    buildRegionLayers(); buildHoodLayers();\n    window.regionLayers = regionLayers; \/\/ expose for pill handlers\n    populateNeighborhoodPill();\n    showPolygonsForLevel(1);\n\n    \/\/ Auto-apply filters from URL params \u2014 runs here so albaniaData + hoodData are in scope\n    (function(){\n        var params = new URLSearchParams(window.location.search);\n        if(!params.get('ai_query')){ applyFilters(); return; }\n\n        var filters = {};\n        var keymap = {\n            btype:'business_type', utype:'unit_type', city:'city', hood:'neighborhood',\n            beds:'min_bedrooms',   baths:'min_bathrooms',\n            pmin:'min_price',      pmax:'max_price',\n            amin:'min_area',       amax:'max_area'\n        };\n        Object.keys(keymap).forEach(function(p){\n            if(params.get(p)) filters[keymap[p]] = params.get(p);\n        });\n        \/\/ ai_query intentionally NOT written to the search bar \u2014 filters apply silently\n\n        \/\/ Apply non-geographic filters immediately\n        if(filters.business_type) CRM_FILTERS.btype = filters.business_type;\n        if(filters.unit_type)     CRM_FILTERS.utype = filters.unit_type;\n        if(filters.min_bedrooms)  CRM_FILTERS.beds  = parseInt(filters.min_bedrooms);\n        if(filters.min_bathrooms) CRM_FILTERS.baths = parseInt(filters.min_bathrooms);\n        if(filters.min_price)     CRM_FILTERS.pmin  = parseInt(filters.min_price);\n        if(filters.max_price)     CRM_FILTERS.pmax  = parseInt(filters.max_price);\n\n        \/\/ Sync pill labels\n        if(filters.business_type){\n            var bl = filters.business_type==='buy'?'For Sale':'For Rent';\n            document.getElementById('pill-btype-label').textContent = bl;\n            document.getElementById('pill-btype').classList.add('active');\n        }\n        if(filters.unit_type){\n            document.getElementById('pill-utype-label').textContent = ucFirst(filters.unit_type);\n            document.getElementById('pill-utype').classList.add('active');\n        }\n        if(filters.min_bedrooms){\n            CRM_BEDS_SEL = parseInt(filters.min_bedrooms);\n            crmSetBeds(CRM_BEDS_SEL);\n            document.getElementById('pill-beds-label').textContent = CRM_BEDS_SEL+'+ beds';\n            document.getElementById('pill-beds').classList.add('active');\n        }\n        if(filters.min_price||filters.max_price){\n            var pmin=filters.min_price||0, pmax=filters.max_price||0;\n            if(pmin) document.getElementById('f-pmin').value = pmin;\n            if(pmax) document.getElementById('f-pmax').value = pmax;\n            var plbl=(pmin&&pmax)?'\u20ac'+fmtK(pmin)+' \u2013 \u20ac'+fmtK(pmax):(pmin?'\u20ac'+fmtK(pmin)+'+':'Up to \u20ac'+fmtK(pmax));\n            document.getElementById('pill-price-label').textContent = plbl;\n            document.getElementById('pill-price').classList.add('active');\n        }\n\n        \/\/ Navigate city first, then fuzzy-match neighborhood\n        if(filters.city && albaniaData){\n            var regionFeature = albaniaData.features.find(function(f){\n                return normCity(f.properties.NAME_1)===normCity(filters.city);\n            });\n            if(regionFeature){\n                currentRegion = regionFeature.properties.NAME_1;\n                currentLevel  = 2;\n                showPolygonsForLevel(2);\n                \/\/ Sync city pill\n                var cv = getHoodCity(currentRegion) || filters.city;\n                CRM_FILTERS.city_filter = cv;\n                document.getElementById('pill-city-label').textContent = cv;\n                document.getElementById('pill-city').classList.add('active');\n                var cr = document.querySelector('input[name=\"city_filter\"][value=\"'+cv+'\"]');\n                if(cr) cr.checked = true;\n            }\n        }\n\n        if(filters.neighborhood){\n            \/\/ Fuzzy match then zoom \u2014 slight delay so showPolygonsForLevel settles\n            setTimeout(function(){\n                crmSelectNeighborhoodByName(filters.neighborhood);\n            }, 400);\n        } else {\n            applyFilters();\n        }\n    })();\n}).catch(function(e){ console.error('Load error:',e); });\n\n\/\/ Count properties per region \u2014 matches city names to GeoJSON region names\nfunction countPropertiesPerRegion(){\n    var counts = {};\n    if(!LISTINGS || !LISTINGS.length) return counts;\n    LISTINGS.forEach(function(l){\n        var city = (l.city || '').toLowerCase().trim();\n        \/\/ Match listing city to GeoJSON region name\n        albaniaData.features.forEach(function(f){\n            var region = f.properties.NAME_1;\n            var regionLower = region.toLowerCase()\n                .replace('\u00eb','e').replace('\u00e7','c').replace('\u00eb','e');\n            var cityNorm = city\n                .replace('\u00eb','e').replace('\u00e7','c').replace('\u00eb','e')\n                .replace('tirana','tirane').replace('tiran\u00eb','tirane');\n            var regionNorm = regionLower\n                .replace('tirana','tirane').replace('tiran\u00eb','tirane');\n            if(cityNorm === regionNorm ||\n               cityNorm.indexOf(regionNorm) !== -1 ||\n               regionNorm.indexOf(cityNorm) !== -1){\n                counts[region] = (counts[region] || 0) + 1;\n            }\n        });\n    });\n    return counts;\n}\n\n\/\/ Region count markers group \u2014 cleared\/rebuilt when listings load\nvar regionCountMarkers = L.layerGroup();\n\nfunction buildRegionCountMarkers(){\n    regionCountMarkers.clearLayers();\n    var counts = countPropertiesPerRegion();\n    albaniaData.features.forEach(function(feature){\n        var name = feature.properties.NAME_1;\n        var count = counts[name] || 0;\n        if(count === 0) return; \/\/ don't show empty regions\n\n        \/\/ Get region centroid\n        var bounds = L.geoJSON(feature).getBounds();\n        var center = bounds.getCenter();\n\n        var marker = L.marker(center, {\n            icon: L.divIcon({\n                className: '',\n                html: '<div class=\"crm-region-count\">'+count+'<\/div>',\n                iconSize: [36, 36],\n                iconAnchor: [18, 18],\n            }),\n            interactive: false,\n            zIndexOffset: 500,\n        });\n        regionCountMarkers.addLayer(marker);\n    });\n    regionCountMarkers.addTo(map);\n}\n\nfunction buildRegionLayers(){\n    albaniaData.features.forEach(function(feature){\n        var name = feature.properties.NAME_1;\n        var layer = L.geoJSON(feature,{style:S_REGION,interactive:true,bubblingMouseEvents:false});\n        layer.on('mouseover',function(){ layer.setStyle(S_REGION_HOV); });\n        layer.on('mouseout', function(){ layer.setStyle(currentRegion===name?S_REGION_HOV:S_REGION); });\n        layer.on('click',function(e){ L.DomEvent.stopPropagation(e); if(!isDrawing) handleRegionClick(name,layer); });\n        layer.eachLayer(function(l){ if(l._path) l._path.setAttribute('tabindex','-1'); });\n        layer.bindTooltip('<strong style=\"font-family:Figtree,sans-serif\">'+name+'<\/strong>',{sticky:true,opacity:.92});\n        regionLayers[name]=layer;\n    });\n    \/\/ Build count markers after region layers exist\n    buildRegionCountMarkers();\n}\n\nwindow.populateNeighborhoodPill = function populateNeighborhoodPill(){\n    \/\/ Populate the neighborhood dropdown from loaded hoodData\n    var container = document.getElementById('dd-hood-options');\n    var pill      = document.getElementById('pill-hood');\n    if(!container || !hoodData) return;\n\n    container.innerHTML = '<label><input type=\"radio\" name=\"hood\" value=\"\"> All neighborhoods<\/label>';\n\n    Object.entries(hoodData).forEach(function([city, hoods]){\n        \/\/ City header\n        var hdr = document.createElement('div');\n        hdr.style.cssText = 'padding:6px 10px 2px;font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.5px;';\n        hdr.textContent = city;\n        container.appendChild(hdr);\n\n        Object.keys(hoods).sort().forEach(function(name){\n            var lbl = document.createElement('label');\n            lbl.innerHTML = '<input type=\"radio\" name=\"hood\" value=\"'+name+'\"> '+name;\n            container.appendChild(lbl);\n        });\n    });\n\n    \/\/ Show the pill now that it has content\n    pill.style.display = '';\n}\n\n\/\/ \u2500\u2500 Fuzzy neighborhood match \u2500\u2500\n\/\/ Returns the best matching hood name from hoodData, or null\nfunction crmFuzzyMatchHood(query){\n    if(!hoodData || !query) return null;\n    var q = normCity(query.toLowerCase().trim());\n    var bestName = null, bestCity = null, bestScore = 0;\n\n    Object.entries(hoodData).forEach(function([city, hoods]){\n        Object.keys(hoods).forEach(function(name){\n            var n = normCity(name.toLowerCase());\n            var score = 0;\n\n            \/\/ Exact match\n            if(n === q){ score = 100; }\n            \/\/ Query fully contained in hood name\n            else if(n.includes(q)){ score = 80; }\n            \/\/ Hood name fully contained in query\n            else if(q.includes(n)){ score = 70; }\n            else {\n                \/\/ Word overlap score\n                var qWords = q.split(\/\\s+\/).filter(Boolean);\n                var nWords = n.split(\/\\s+\/).filter(Boolean);\n                var matched = qWords.filter(function(w){\n                    return nWords.some(function(nw){ return nw.startsWith(w) || w.startsWith(nw); });\n                });\n                if(matched.length > 0){\n                    score = Math.round((matched.length \/ Math.max(qWords.length, nWords.length)) * 60);\n                }\n                \/\/ Starts-with boost\n                if(n.startsWith(q.split(' ')[0]) || q.startsWith(n.split(' ')[0])){ score += 10; }\n            }\n\n            if(score > bestScore){ bestScore = score; bestName = name; bestCity = city; }\n        });\n    });\n\n    \/\/ Only return if reasonably confident (score >= 30)\n    return bestScore >= 30 ? { name: bestName, city: bestCity, score: bestScore } : null;\n}\n\nwindow.crmSelectNeighborhoodByName = function crmSelectNeighborhoodByName(query){\n    if(!hoodData || !query) return;\n\n    \/\/ Try exact match first, then fuzzy\n    var match = null;\n    Object.entries(hoodData).forEach(function([city, hoods]){\n        if(hoods[query]) match = { name: query, city: city, score: 100 };\n    });\n    if(!match) match = crmFuzzyMatchHood(query);\n    if(!match){ console.log('No neighborhood match for:', query); return; }\n\n    console.log('Neighborhood matched:', query, '->', match.name, '(score:', match.score + ')');\n\n    \/\/ Update pill UI to show resolved name\n    document.getElementById('pill-hood-label').textContent = match.name;\n    document.getElementById('pill-hood').classList.add('active');\n    var radio = document.querySelector('input[name=\"hood\"][value=\"'+match.name+'\"]');\n    if(radio) radio.checked = true;\n    CRM_FILTERS.hood = match.name;\n\n    \/\/ Navigate map to city then hood\n    var regionName = null;\n    if(albaniaData){\n        albaniaData.features.forEach(function(f){\n            if(normCity(f.properties.NAME_1) === normCity(match.city) ||\n               normCity(getHoodCity(f.properties.NAME_1)||'') === normCity(match.city)){\n                regionName = f.properties.NAME_1;\n            }\n        });\n    }\n    if(regionName){\n        currentRegion = regionName;\n        currentLevel  = 2;\n        showPolygonsForLevel(2);\n        setTimeout(function(){ handleHoodClick(match.name, match.city); }, 500);\n    }\n}\n\nfunction buildHoodLayers(){\n    Object.entries(hoodData).forEach(function([city,hoods]){\n        hoodLayers[city]={};\n        Object.entries(hoods).forEach(function([name,rings]){\n            var latlngs = rings.map(function(ring){ return ring.map(function(c){ return [c[0],c[1]]; }); });\n            var poly = L.polygon(latlngs,Object.assign({},S_HOOD,{bubblingMouseEvents:false}));\n            poly.on('mouseover',function(){ if(!isDrawing) poly.setStyle(S_HOOD_HOV); });\n            poly.on('mouseout', function(){\n                if(isDrawing) return;\n                poly.setStyle(selectedHood===name?S_HOOD_SEL:currentLevel===2?S_HOOD:S_HOOD_DIM);\n            });\n            poly.on('click',function(e){ L.DomEvent.stopPropagation(e); if(!isDrawing) handleHoodClick(name,city); });\n            poly.bindTooltip('<span style=\"font-family:Figtree,sans-serif\">'+name+'<\/span>',{sticky:true,opacity:.92});\n            hoodLayers[city][name]=poly;\n        });\n    });\n}\n\nfunction showPolygonsForLevel(level){\n    Object.values(regionLayers).forEach(function(l){ try{map.removeLayer(l);}catch(e){} });\n    Object.values(hoodLayers).forEach(function(c){ Object.values(c).forEach(function(l){ try{map.removeLayer(l);}catch(e){} }); });\n    clearPins();\n\n    \/\/ Show region count markers only at level 1 (zoomed out to regions)\n    if(level===1){\n        if(!map.hasLayer(regionCountMarkers)) regionCountMarkers.addTo(map);\n    } else {\n        if(map.hasLayer(regionCountMarkers)) map.removeLayer(regionCountMarkers);\n    }\n\n    if(level===1){\n        currentRegion=null; selectedHood=null;\n        Object.values(regionLayers).forEach(function(l){ l.setStyle(S_REGION); l.addTo(map); });\n    } else if(level===2){\n        selectedHood=null;\n        var hc=getHoodCity(currentRegion||'');\n        if(hc&&hoodLayers[hc]&&Object.keys(hoodLayers[hc]).length){\n            Object.values(hoodLayers[hc]).forEach(function(l){ l.setStyle(S_HOOD); l.addTo(map); });\n        } else if(regionLayers[currentRegion]){\n            regionLayers[currentRegion].setStyle(Object.assign({},S_REGION,{fillOpacity:0})).addTo(map);\n        }\n    }\n    applyFilters();\n}\n\nfunction handleRegionClick(name,layer){\n    currentRegion=name; currentLevel=2; lastZoomLevel=map.getZoom();\n    var hc=getHoodCity(name);\n    if(hc&&hoodLayers[hc]&&Object.keys(hoodLayers[hc]).length){\n        var allBounds=Object.values(hoodLayers[hc]).map(function(l){ return l.getBounds(); }).reduce(function(a,b){ return a?a.extend(b):b; },null);\n        if(allBounds) map.flyToBounds(allBounds,{padding:[30,30],maxZoom:13,duration:0.8});\n    } else {\n        map.flyToBounds(layer.getBounds(),{padding:[40,40],maxZoom:12,duration:0.8});\n    }\n    \/\/ Sync city pill\n    var cityVal = getHoodCity(name) || '';\n    CRM_FILTERS.city_filter = cityVal;\n    document.getElementById('pill-city-label').textContent = cityVal || 'All cities';\n    document.getElementById('pill-city').classList.toggle('active', !!cityVal);\n    var cityRadio = document.querySelector('input[name=\"city_filter\"][value=\"'+cityVal+'\"]');\n    if(cityRadio) cityRadio.checked = true;\n    \/\/ Sync hood pill \u2014 reset neighborhood when entering a new city\n    document.getElementById('pill-hood-label').textContent='All neighborhoods';\n    document.getElementById('pill-hood').classList.remove('active');\n    var radio=document.querySelector('input[name=\"hood\"][value=\"\"]');\n    if(radio) radio.checked=true;\n    CRM_FILTERS.hood='';\n    showPolygonsForLevel(2);\n}\n\nfunction handleHoodClick(name,hoodCity){\n    if(selectedHood===name){\n        \/\/ Deselect \u2014 clear hood pill\n        selectedHood=null;\n        CRM_FILTERS.hood='';\n        if(hoodLayers[hoodCity]) Object.values(hoodLayers[hoodCity]).forEach(function(l){ l.setStyle(S_HOOD); });\n        \/\/ Reset pill\n        document.getElementById('pill-hood-label').textContent='All neighborhoods';\n        document.getElementById('pill-hood').classList.remove('active');\n        var radio=document.querySelector('input[name=\"hood\"][value=\"\"]');\n        if(radio) radio.checked=true;\n        applyFilters(); return;\n    }\n    selectedHood=name;\n    CRM_FILTERS.hood=name;\n    currentRegion=currentRegion||getCityForHoodCity(hoodCity);\n    if(hoodLayers[hoodCity]){\n        Object.entries(hoodLayers[hoodCity]).forEach(function([n,poly]){ poly.setStyle(n===name?S_HOOD_SEL:S_HOOD_DIM); });\n    }\n    var poly=hoodLayers[hoodCity]&&hoodLayers[hoodCity][name];\n    if(poly) map.flyToBounds(poly.getBounds(),{padding:[40,40],maxZoom:15,duration:0.6});\n\n    \/\/ \u2500\u2500 Sync neighborhood pill \u2500\u2500\n    document.getElementById('pill-hood-label').textContent=name;\n    document.getElementById('pill-hood').classList.add('active');\n    var radio=document.querySelector('input[name=\"hood\"][value=\"'+name+'\"]');\n    if(radio) radio.checked=true;\n\n    \/\/ Auto-select the city pill based on which city this hood belongs to\n    var hoodCityKey = getHoodCity(currentRegion||'') || '';\n    if(hoodCityKey){\n        CRM_FILTERS.city_filter = hoodCityKey;\n        document.getElementById('pill-city-label').textContent = hoodCityKey;\n        document.getElementById('pill-city').classList.add('active');\n        var cr = document.querySelector('input[name=\"city_filter\"][value=\"'+hoodCityKey+'\"]');\n        if(cr) cr.checked = true;\n    }\n\n    applyFilters();\n}\n\n\/\/ Zoom handler\nvar zoomTimeout=null;\nmap.on('zoomend',function(){\n    if(isDrawing) return;\n    clearTimeout(zoomTimeout);\n    zoomTimeout=setTimeout(function(){\n        var zoom=map.getZoom(), targetLevel=determineLevel(zoom);\n        if(Math.abs(zoom-lastZoomLevel)<0.5&&targetLevel===currentLevel) return;\n        lastZoomLevel=zoom;\n        if(targetLevel===currentLevel) return;\n        if(targetLevel<currentLevel){\n            if(targetLevel===1){ currentLevel=1; showPolygonsForLevel(1); }\n            else if(targetLevel===2){ currentLevel=2; selectedHood=null; showPolygonsForLevel(2); }\n        } else {\n            if(targetLevel===2&&currentLevel===1){\n                var center=map.getCenter();\n                var hit=albaniaData&&albaniaData.features.find(function(f){ return pointInFeature([center.lat,center.lng],f); });\n                if(hit){ currentRegion=hit.properties.NAME_1; currentLevel=2; showPolygonsForLevel(2); }\n            } else if(targetLevel===3&&currentLevel===2){\n                currentLevel=3;\n                Object.values(regionLayers).forEach(function(l){ try{map.removeLayer(l);}catch(e){} });\n                Object.values(hoodLayers).forEach(function(c){ Object.values(c).forEach(function(l){ try{map.removeLayer(l);}catch(e){} }); });\n                applyFilters();\n            }\n        }\n    },200);\n});\n\n\/\/ Geo utils\nfunction pointInFeature(point,feature){\n    var geom=feature.geometry;\n    if(geom.type==='Polygon') return pip([point[1],point[0]],geom.coordinates[0]);\n    if(geom.type==='MultiPolygon') return geom.coordinates.some(function(p){ return pip([point[1],point[0]],p[0]); });\n    return false;\n}\nfunction pip(pt,ring){\n    var y=pt[0],x=pt[1],inside=false;\n    for(var i=0,j=ring.length-1;i<ring.length;j=i++){\n        var xi=ring[i][0],yi=ring[i][1],xj=ring[j][0],yj=ring[j][1];\n        if(((yi>x)!==(yj>x))&&(y<(xj-xi)*(x-yi)\/(yj-yi)+xi)) inside=!inside;\n    }return inside;\n}\nfunction pointInLeafletPoly(latlng,poly){\n    var latlngs=poly.getLatLngs(),rings=Array.isArray(latlngs[0])?latlngs:[latlngs],inside=false;\n    rings.forEach(function(ring){\n        var flat=Array.isArray(ring[0])?ring[0]:ring,x=latlng[0],y=latlng[1];\n        for(var i=0,j=flat.length-1;i<flat.length;j=i++){\n            var xi=flat[i].lat,yi=flat[i].lng,xj=flat[j].lat,yj=flat[j].lng;\n            if(((yi>y)!==(yj>y))&&(x<(xj-xi)*(y-yi)\/(yj-yi)+xi)) inside=!inside;\n        }\n    });return inside;\n}\nfunction pointInDrawn(latlng,pts){\n    var x=latlng.lat,y=latlng.lng,inside=false;\n    for(var i=0,j=pts.length-1;i<pts.length;j=i++){\n        var xi=pts[i].lat,yi=pts[i].lng,xj=pts[j].lat,yj=pts[j].lng;\n        if(((yi>y)!==(yj>y))&&(x<(xj-xi)*(y-yi)\/(yj-yi)+xi)) inside=!inside;\n    }return inside;\n}\n\n\/\/ Pins\nfunction clearPins(){ Object.values(pinLayers).forEach(function(m){ try{map.removeLayer(m);}catch(e){} }); pinLayers={}; }\nfunction renderPins(list){\n    clearPins();\n    list.forEach(function(l){\n        if(!l.lat||!l.lng) return;\n        var label=l.price?'\u20ac '+fmtK(l.price):'\ud83d\udccd';\n        var icon=L.divIcon({className:'',html:'<div class=\"crm-pin\" data-id=\"'+l.id+'\">'+label+'<\/div>',iconSize:[0,0],iconAnchor:[0,12]});\n        var m=L.marker([l.lat,l.lng],{icon:icon}).addTo(map).bindPopup(\n            '<div class=\"crm-popup\">'+(l.thumbnail?'<img decoding=\"async\" class=\"crm-popup-img\" src=\"'+l.thumbnail+'\" alt=\"'+l.title+'\" loading=\"lazy\">':'')+\n            '<div class=\"crm-popup-price\">'+fmtPrice(l.price)+'<\/div>'+\n            '<div class=\"crm-popup-title\">'+l.title+'<\/div>'+\n            '<div class=\"crm-popup-meta\">'+buildStats(l)+'<\/div>'+\n            '<a class=\"crm-popup-link\" href=\"'+l.url+'\" target=\"_blank\">View Property \u2192<\/a><\/div>',\n            {maxWidth:240}\n        );\n        m.on('click',function(){ setActive(l.id,false); });\n        pinLayers[l.id]=m;\n    });\n}\nfunction fmtK(n){ return n>=1000000?(n\/1000000).toFixed(1).replace('.0','')+'M':n>=1000?Math.round(n\/1000)+'K':n; }\n\n\/\/ Active\nfunction setActive(id,fly){\n    if(fly===undefined) fly=true;\n    if(activeId){\n        var pc=document.querySelector('.crm-card[data-id=\"'+activeId+'\"]');\n        var pm=document.querySelector('.crm-pin[data-id=\"'+activeId+'\"]');\n        if(pc) pc.classList.remove('active');\n        if(pm) pm.classList.remove('active');\n    }\n    activeId=id;\n    var card=document.querySelector('.crm-card[data-id=\"'+id+'\"]');\n    var pin=document.querySelector('.crm-pin[data-id=\"'+id+'\"]');\n    if(card){ card.classList.add('active'); card.scrollIntoView({behavior:'smooth',block:'nearest'}); }\n    if(pin) pin.classList.add('active');\n    if(!fly) return;\n    var listing=LISTINGS.find(function(l){ return l.id===id; });\n    if(!listing||!listing.lat||!listing.lng) return;\n    if(pinLayers[id]){ map.flyTo(pinLayers[id].getLatLng(),15,{duration:0.7}); setTimeout(function(){ if(pinLayers[id]) pinLayers[id].openPopup(); },800); return; }\n    if(currentLevel===1){\n        var feature=albaniaData&&albaniaData.features.find(function(f){ return pointInFeature([listing.lat,listing.lng],f); });\n        if(feature){ currentRegion=feature.properties.NAME_1; currentLevel=2; showPolygonsForLevel(2); }\n        setTimeout(function(){ map.flyTo([listing.lat,listing.lng],15,{duration:0.9}); setTimeout(function(){ if(pinLayers[id]) pinLayers[id].openPopup(); },1000); },400);\n    } else {\n        map.flyTo([listing.lat,listing.lng],15,{duration:0.8});\n        setTimeout(function(){ if(pinLayers[id]) pinLayers[id].openPopup(); },900);\n    }\n}\n\n\/\/ Cards\nfunction renderCards(list){\n    var grid=document.getElementById('crm-results-grid');\n    var count=document.getElementById('crm-results-count');\n    var sub=document.getElementById('crm-results-sub');\n    var total=LISTINGS.length;\n    count.textContent=list.length.toLocaleString()+' result'+(list.length!==1?'s':'');\n    sub.textContent=total>list.length?'Filtered from '+total.toLocaleString()+' total':'';\n    grid.innerHTML='';\n    if(!list.length){ grid.innerHTML='<div id=\"crm-empty\">No listings found matching your filters.<\/div>'; return; }\n    list.forEach(function(l){\n        var card=document.createElement('div');\n        card.className='crm-card'; card.dataset.id=l.id;\n        var stats=buildStats(l);\n        card.innerHTML=\n            '<div class=\"crm-card-img\">'+\n                (l.thumbnail?'<img decoding=\"async\" src=\"'+l.thumbnail+'\" alt=\"'+l.title+'\" loading=\"lazy\">':'<div class=\"no-photo\"><svg width=\"28\" height=\"28\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"#a0aec0\" stroke-width=\"1.5\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\/><\/svg><span>No photo<\/span><\/div>')+\n                (l.business_type?'<span class=\"crm-card-badge'+(l.business_type==='rent'?' rent':'')+'\">'+fmtBiz(l.business_type)+'<\/span>':'')+\n            '<\/div>'+\n            '<div class=\"crm-card-body\">'+\n                '<div class=\"crm-card-price\">'+fmtPrice(l.price)+'<\/div>'+\n                '<div class=\"crm-card-title\">'+l.title+'<\/div>'+\n                (stats?'<div class=\"crm-card-stats\">'+stats+'<\/div>':'')+\n            '<\/div>';\n        card.addEventListener('click',function(){ setActive(l.id,true); });\n        grid.appendChild(card);\n    });\n}\n\n\/\/ Filters\nfunction applyFilters(){\n    var f=CRM_FILTERS;\n    var list=LISTINGS.filter(function(l){\n        if(f.btype && l.business_type!==f.btype) return false;\n        if(f.utype && l.unit_type!==f.utype) return false;\n        if(f.beds  && (l.bedrooms||0)<f.beds) return false;\n        if(f.baths && (l.bathrooms||0)<f.baths) return false;\n        if(f.pmin  && (l.price||0)<f.pmin) return false;\n        if(f.pmax<Infinity && (l.price||0)>f.pmax) return false;\n        if(f.search && !(l.title+' '+l.city+' '+l.unit_type).toLowerCase().includes(f.search)) return false;\n        if(f.drawn&&l.lat&&l.lng){ if(!pointInDrawn({lat:l.lat,lng:l.lng},f.drawn)) return false; }\n        if(currentLevel>=2&&currentRegion){\n            var hc=getHoodCity(currentRegion);\n            var lc=normCity(l.city);\n            var inCity=hc?(lc===normCity(hc)||lc===normCity(currentRegion)):lc===normCity(currentRegion);\n            if(!inCity) return false;\n            if(selectedHood&&hc&&hoodLayers[hc]&&hoodLayers[hc][selectedHood]){\n                if(!l.lat||!l.lng) return false;\n                return pointInLeafletPoly([l.lat,l.lng],hoodLayers[hc][selectedHood]);\n            }\n            return true;\n        }\n        return true;\n    });\n    if(currentLevel===1&&!f.drawn) clearPins(); else renderPins(list);\n    renderCards(list);\n    activeId=null;\n}\nwindow._crmApplyFilters = applyFilters;\n\n\/\/ \u2500\u2500 AI SEARCH EVENT LISTENER \u2500\u2500\nwindow.addEventListener('crm-ai-filters', function(e){\n    var f = e.detail;\n\n    if(f.clear){\n        CRM_FILTERS.btype='buy'; CRM_FILTERS.utype='';\n        CRM_FILTERS.pmin=0; CRM_FILTERS.pmax=Infinity;\n        CRM_FILTERS.beds=0; CRM_FILTERS.baths=0;\n        document.querySelectorAll('.crm-pill').forEach(function(p){ p.classList.remove('active'); });\n        var bp=document.getElementById('pill-btype'); if(bp){ bp.classList.add('active'); document.getElementById('pill-btype-label').textContent='For Sale'; }\n        document.getElementById('pill-price-label').textContent='Any price';\n        document.getElementById('pill-utype-label').textContent='All property types';\n        document.getElementById('pill-beds-label').textContent='All beds';\n        document.getElementById('pill-baths-label').textContent='All baths';\n        currentLevel=1; currentRegion=null; selectedHood=null;\n        showPolygonsForLevel(1);\n        map.flyTo([41.15,19.82],7,{duration:0.8});\n        return;\n    }\n\n    if(f.business_type){\n        CRM_FILTERS.btype=f.business_type;\n        document.getElementById('pill-btype-label').textContent=f.business_type==='buy'?'For Sale':'For Rent';\n        document.getElementById('pill-btype').classList.add('active');\n        var r=document.querySelector('input[name=\"btype\"][value=\"'+f.business_type+'\"]'); if(r) r.checked=true;\n    }\n    if(f.unit_type){\n        CRM_FILTERS.utype=f.unit_type;\n        document.getElementById('pill-utype-label').textContent=f.unit_type.charAt(0).toUpperCase()+f.unit_type.slice(1);\n        document.getElementById('pill-utype').classList.add('active');\n        var r=document.querySelector('input[name=\"utype\"][value=\"'+f.unit_type+'\"]'); if(r) r.checked=true;\n    }\n    if(f.price_min!=null){ CRM_FILTERS.pmin=f.price_min; var el=document.getElementById('f-pmin'); if(el) el.value=f.price_min; }\n    if(f.price_max!=null){ CRM_FILTERS.pmax=f.price_max; var el=document.getElementById('f-pmax'); if(el) el.value=f.price_max; }\n    if(f.price_min||f.price_max){\n        var lo=f.price_min||0,hi=f.price_max||Infinity;\n        var pl=(lo&&hi<Infinity)?'\u20ac'+fmtK(lo)+' \u2013 \u20ac'+fmtK(hi):(lo?'\u20ac'+fmtK(lo)+'+':'Up to \u20ac'+fmtK(hi));\n        document.getElementById('pill-price-label').textContent=pl;\n        document.getElementById('pill-price').classList.add('active');\n    }\n    if(f.bedrooms_min!=null){ CRM_FILTERS.beds=f.bedrooms_min; crmSetBeds(f.bedrooms_min); document.getElementById('pill-beds-label').textContent=f.bedrooms_min+'+ beds'; document.getElementById('pill-beds').classList.add('active'); }\n    if(f.bathrooms_min!=null){ CRM_FILTERS.baths=f.bathrooms_min; crmSetBaths(f.bathrooms_min); document.getElementById('pill-baths-label').textContent=f.bathrooms_min+'+ baths'; document.getElementById('pill-baths').classList.add('active'); }\n    if(f.area_min!=null){ CRM_FILTERS.amin=f.area_min; var el=document.getElementById('f-amin'); if(el) el.value=f.area_min; }\n    if(f.area_max!=null){ CRM_FILTERS.amax=f.area_max; var el=document.getElementById('f-amax'); if(el) el.value=f.area_max; }\n\n    \/\/ Geographic \u2014 neighborhood or city\n    if(f.neighborhood && hoodLayers){\n        var matched=false;\n        Object.entries(hoodLayers).forEach(function([hc,hoods]){\n            if(matched) return;\n            Object.keys(hoods).forEach(function(hn){\n                if(matched) return;\n                var norm=function(s){ return (s||'').toLowerCase().replace(\/\u00eb\/g,'e').replace(\/\u00e7\/g,'c').trim(); };\n                if(norm(hn).includes(norm(f.neighborhood))||norm(f.neighborhood).includes(norm(hn))){\n                    var cityName=getCityForHoodCity(hc);\n                    var feat=albaniaData&&albaniaData.features.find(function(ft){ return normCity(ft.properties.NAME_1)===normCity(cityName); });\n                    if(feat){\n                        currentRegion=feat.properties.NAME_1; currentLevel=2;\n                        showPolygonsForLevel(2);\n                        setTimeout(function(){ handleHoodClick(hn,hc); },400);\n                        matched=true;\n                    }\n                }\n            });\n        });\n    } else if(f.city && albaniaData){\n        var feat=albaniaData.features.find(function(ft){\n            return normCity(ft.properties.NAME_1).includes(normCity(f.city))||normCity(f.city).includes(normCity(ft.properties.NAME_1));\n        });\n        if(feat){ currentRegion=feat.properties.NAME_1; currentLevel=2; handleRegionClick(currentRegion,regionLayers[currentRegion]); }\n    }\n\n    applyFilters();\n});\n\n\/\/ Draw\nvar btnDraw=document.getElementById('btn-draw');\nvar btnDrawClear=document.getElementById('btn-draw-clear');\nbtnDraw.addEventListener('click',function(){ if(isDrawing) stopDrawing(); else startDrawing(); });\nbtnDrawClear.addEventListener('click',function(){ clearDrawing(); applyFilters(); });\nfunction startDrawing(){\n    clearDrawing();\n    isDrawing=true; drawPoints=[];\n    btnDraw.classList.add('active'); btnDraw.innerHTML='\u270b Stop drawing';\n    document.getElementById('crm-map').classList.add('drawing');\n    map.dragging.disable(); map.on('mousedown',onDrawStart);\n}\nfunction onDrawStart(e){\n    if(drawPolygon){ map.removeLayer(drawPolygon); drawPolygon=null; }\n    if(drawPolyline){ map.removeLayer(drawPolyline); drawPolyline=null; }\n    drawnFilter=null; drawPoints=[e.latlng];\n    drawPolyline=L.polyline([e.latlng],{color:'#11325C',weight:2,dashArray:'6,4'}).addTo(map);\n    map.on('mousemove',onDrawMove); map.on('mouseup',onDrawEnd);\n}\nfunction onDrawMove(e){ if(!drawPolyline) return; drawPoints.push(e.latlng); drawPolyline.addLatLng(e.latlng); }\nfunction onDrawEnd(){\n    map.off('mousemove',onDrawMove); map.off('mouseup',onDrawEnd);\n    if(drawPoints.length<3){ clearDrawing(); return; }\n    stopDrawing();\n    if(drawPolyline){ map.removeLayer(drawPolyline); drawPolyline=null; }\n    drawPolygon=L.polygon(drawPoints,{color:'#11325C',weight:2,fillColor:'#11325C',fillOpacity:0.08,dashArray:'6,4'}).addTo(map);\n    CRM_FILTERS.drawn=[].concat(drawPoints);\n    btnDrawClear.style.display='flex';\n    applyFilters();\n}\nfunction stopDrawing(){\n    isDrawing=false; btnDraw.classList.remove('active'); btnDraw.innerHTML='\u270f Draw area';\n    document.getElementById('crm-map').classList.remove('drawing');\n    map.dragging.enable(); map.off('mousedown',onDrawStart);\n}\nfunction clearDrawing(){\n    if(drawPolyline) map.removeLayer(drawPolyline);\n    if(drawPolygon)  map.removeLayer(drawPolygon);\n    drawPolyline=null; drawPolygon=null; drawPoints=[]; CRM_FILTERS.drawn=null;\n    btnDrawClear.style.display='none'; btnDraw.innerHTML='\u270f Draw area'; btnDraw.classList.remove('active');\n    if(isDrawing){ isDrawing=false; map.dragging.enable(); map.off('mousedown',onDrawStart); document.getElementById('crm-map').classList.remove('drawing'); }\n}\n\n} \/\/ end initCrmMap\n<\/script>\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Properties Map Menu<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_acf_changed":false,"nf_dc_page":"","footnotes":""},"class_list":["post-162","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/ctest.al\/sq\/wp-json\/wp\/v2\/pages\/162","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ctest.al\/sq\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ctest.al\/sq\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ctest.al\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ctest.al\/sq\/wp-json\/wp\/v2\/comments?post=162"}],"version-history":[{"count":5,"href":"https:\/\/ctest.al\/sq\/wp-json\/wp\/v2\/pages\/162\/revisions"}],"predecessor-version":[{"id":1366,"href":"https:\/\/ctest.al\/sq\/wp-json\/wp\/v2\/pages\/162\/revisions\/1366"}],"wp:attachment":[{"href":"https:\/\/ctest.al\/sq\/wp-json\/wp\/v2\/media?parent=162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}