{"id":6661,"date":"2026-01-07T17:01:10","date_gmt":"2026-01-07T16:01:10","guid":{"rendered":"https:\/\/roseo.es\/?page_id=6661"},"modified":"2026-01-21T13:04:52","modified_gmt":"2026-01-21T12:04:52","slug":"informe","status":"publish","type":"page","link":"https:\/\/roseo.es\/en\/informe\/","title":{"rendered":"Informe"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"6661\" class=\"elementor elementor-6661\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-30da79a e-con-full e-flex e-con e-parent\" data-id=\"30da79a\" 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-f5b7fc0 e-con-full e-flex e-con e-child\" data-id=\"f5b7fc0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f2d2466 elementor-widget elementor-widget-heading\" data-id=\"f2d2466\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">INFORME<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5d81ceb e-con-full e-flex e-con e-child\" data-id=\"5d81ceb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7fb069a elementor-widget elementor-widget-html\" data-id=\"7fb069a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"scroll-wrapper\">\r\n  <div class=\"scroll-indicator\">\r\n    <p class=\"scroll-label\">Descubre m\u00e1s<\/p>\r\n    <div class=\"scroll-shell\">\r\n      <div class=\"scroll-thumb\"><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n  .scroll-wrapper {\r\n    display: flex;\r\n    justify-content: center;\r\n    align-items: flex-end;\r\n    height: 100%;\r\n    width: 100%;\r\n    position: relative;\r\n  }\r\n\r\n  .scroll-indicator {\r\n    text-align: center;\r\n    opacity: 0.7;\r\n  }\r\n\r\n  .scroll-label {\r\n    font-family: 'Gotham', sans-serif;\r\n    font-size: 14px;\r\n    margin-bottom: 10px;\r\n    text-transform: uppercase;\r\n    letter-spacing: 2px;\r\n    color: #ffffff;\r\n  }\r\n\r\n  .scroll-shell {\r\n    width: 30px;\r\n    height: 50px;\r\n    border: 2px solid #ffffff;\r\n    border-radius: 20px;\r\n    margin: 0 auto;\r\n    position: relative;\r\n  }\r\n\r\n  .scroll-thumb {\r\n    width: 6px;\r\n    height: 10px;\r\n    background: #ffffff;\r\n    border-radius: 3px;\r\n    position: absolute;\r\n    left: 50%;\r\n    transform: translateX(-50%);\r\n    animation: scrollMotion 2s infinite;\r\n  }\r\n\r\n  @keyframes scrollMotion {\r\n    0% {\r\n      top: 8px;\r\n      opacity: 1;\r\n    }\r\n    50% {\r\n      top: 28px;\r\n      opacity: 0;\r\n    }\r\n    100% {\r\n      top: 8px;\r\n      opacity: 0;\r\n    }\r\n  }\r\n\r\n  @media (max-width: 600px) {\r\n    .scroll-label {\r\n      font-size: 12px;\r\n    }\r\n    .scroll-shell {\r\n      width: 24px;\r\n      height: 40px;\r\n    }\r\n    .scroll-thumb {\r\n      width: 5px;\r\n      height: 8px;\r\n    }\r\n  }\r\n<\/style>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-956381e e-flex e-con-boxed e-con e-parent\" data-id=\"956381e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a8b1507 elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"a8b1507\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Cu\u00e9ntanos tu Proyecto<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9ab78f9 elementor-widget elementor-widget-html\" data-id=\"9ab78f9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div style=\"text-align: center; margin: 0; line-height: 0;\">\r\n    \r\n    <svg width=\"100%\" viewBox=\"0 0 130 10\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\r\n         style=\"max-width: 130px; height: auto; display: inline-block;\">\r\n        \r\n        <circle cx=\"3\" cy=\"5\" r=\"2\" fill=\"#0B5F30\"\/>\r\n        <circle cx=\"10\" cy=\"5\" r=\"2\" fill=\"#0B5F30\"\/>\r\n        <circle cx=\"17\" cy=\"5\" r=\"2\" fill=\"#0B5F30\"\/>\r\n        \r\n        <rect x=\"25\" y=\"3.5\" width=\"105\" height=\"4\" rx=\"1.5\" fill=\"#0B5F30\"\/>\r\n    <\/svg>\r\n\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-13e184f elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"13e184f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Completa el siguiente formulario para que podamos analizar tu consulta detalladamente. Nuestro equipo t\u00e9cnico se pondr\u00e1 en contacto contigo a la mayor brevedad para ofrecerte la mejor soluci\u00f3n.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-977c492 e-flex e-con-boxed e-con e-parent\" data-id=\"977c492\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d4c4ebb elementor-widget elementor-widget-shortcode\" data-id=\"d4c4ebb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">        <!-- Font Awesome - Inline fallback to ensure icons always load -->\n        <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.5.1\/css\/all.min.css\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\" \/>\n        \n        <style id=\"roseo-critical-css\">\n        \/* Minimal critical CSS - just ensure the form wrapper displays properly *\/\n        #roseo-form-wrapper, .roseo-form-wrapper {\n            display: block !important;\n            visibility: visible !important;\n            opacity: 1 !important;\n            width: 100% !important;\n            max-width: 100% !important;\n            min-height: 100vh;\n            margin: 0 !important;\n            padding: 0 !important;\n        }\n        \n        \/* Admin bar adjustment *\/\n        body.admin-bar #roseo-form-wrapper {\n            min-height: calc(100vh - 32px);\n        }\n        <\/style>\n        <div id=\"roseo-form-wrapper\" class=\"roseo-form-wrapper\" data-step1-show-desc=\"1\" data-step1-1-show-icons=\"1\" data-step2-show-benefits=\"1\" data-step3-show-numbers=\"1\" data-step3-tab-style=\"accordion\" data-step4-show-desc=\"1\" data-step5-checkbox-style=\"default\" data-step5-layout=\"cards\" data-completed-confetti=\"1\">\n            \n            <!-- Home Screen -->\n            <div id=\"roseo-home-screen-container\" class=\"roseo-home-visible\">\n                <style id=\"home-screen-vars\">\n.roseo-home-screen {\n    --home-bg-gradient-start: #015328;\n    --home-bg-gradient-end: #009239;\n    --home-title-size: 48px;\n    --home-subtitle-size: 20px;\n    --home-icon-size: 120px;\n}\n<\/style>\n<div class=\"roseo-home-screen\" id=\"home-screen\">\n    <div class=\"home-hero\">\n                <div class=\"mfm-language-selector\">\n            <button type=\"button\" class=\"mfm-lang-btn\" data-lang=\"es\" title=\"Espa\u00f1ol\">\n                <span class=\"mfm-lang-flag\">\ud83c\uddea\ud83c\uddf8<\/span>\n                <span class=\"mfm-lang-code\">ES<\/span>\n            <\/button>\n            <button type=\"button\" class=\"mfm-lang-btn\" data-lang=\"eu\" title=\"Euskara\">\n                <img decoding=\"async\" src=\"https:\/\/roseo.es\/wp-content\/plugins\/roseo-form-plugin\/assets\/images\/flags\/euskadi.svg\" alt=\"Euskara\" class=\"mfm-lang-flag-img\">\n                <span class=\"mfm-lang-code\">EU<\/span>\n            <\/button>\n            <button type=\"button\" class=\"mfm-lang-btn active\" data-lang=\"en\" title=\"English\">\n                <span class=\"mfm-lang-flag\">\ud83c\uddec\ud83c\udde7<\/span>\n                <span class=\"mfm-lang-code\">EN<\/span>\n            <\/button>\n        <\/div>\n                <div class=\"home-hero-icon\">\n            <img decoding=\"async\" src=\"https:\/\/roseo.es\/wp-content\/plugins\/roseo-form-plugin\/assets\/images\/icon.png\" alt=\"Roseo E\u00f3lica Urbana\" \/>\n        <\/div>\n        <h1 class=\"home-title\">Energy Installation Request<\/h1>\n        <p class=\"home-subtitle\">\n            Evaluate your renewable energy project in 5 simple steps.<br>\n            Fast, secure process with auto-save.        <\/p>\n        <div class=\"home-buttons\">\n                            <button type=\"button\" class=\"roseo-btn roseo-btn-start\" id=\"btn-start-form\">\n                    <span>Get started<\/span>\n                    <i class=\"fa-solid fa-arrow-right\"><\/i>\n                <\/button>\n                    <\/div>\n        <p class=\"home-help\">Need help? We\u2019re here to help via email<\/p>\n    <\/div>\n<\/div>\n<script>\ndocument.addEventListener('DOMContentLoaded', function() {\n    var currentCookie = document.cookie.match(\/mfm_lang=([^;]+)\/)?.[1] || 'NOT_SET';\n    var currentLS = localStorage.getItem('mfm_user_lang') || 'NOT_SET';\n    if (currentLS !== 'NOT_SET' && ['es', 'eu', 'en'].includes(currentLS)) {\n        if (currentCookie === 'NOT_SET' || currentCookie !== currentLS) {\n            document.cookie = 'mfm_lang=' + currentLS + '; path=\/; max-age=31536000; SameSite=Lax';\n        }\n    }\n    (function detectProgressFromLocalStorage() {\n        try {\n            var savedState = localStorage.getItem('roseo_state_v2');\n            if (savedState) {\n                var state = JSON.parse(savedState);\n                var currentStep = state.current_step || 'step_1';\n                var formData = state.form || {};\n                var tipoCliente = formData.tipo_cliente || '';\n                var isCompleted = currentStep === 'completed' || currentStep === 'step_completed';\n                var hasProgress = !isCompleted && (currentStep !== 'step_1' && currentStep !== 'step_1_1');\n                if (isCompleted) {\n                    localStorage.removeItem('roseo_state_v2');\n                    localStorage.removeItem('roseo_state');\n                    document.cookie = 'roseo_current_step=; path=\/; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n                    document.cookie = 'roseo_form_started=; path=\/; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n                    return; \/\/ Salir, mostrar bot\u00f3n \"Empezar\" normal\n                }\n                if (hasProgress) {\n                    var btnStart = document.getElementById('btn-start-form');\n                    var btnContinue = document.getElementById('btn-continue-form');\n                    var btnStartNew = document.getElementById('btn-start-new');\n                    var progressInfo = document.querySelector('.progress-info');\n                    if (btnStart && !btnContinue) {\n                        var buttonsContainer = btnStart.parentNode;\n                        btnStart.style.display = 'none';\n                        var stepNumberMap = {\n                            'step_1': 1,\n                            'step_1_1': 1,\n                            'step_2': 2,\n                            'step_3': 3,\n                            'step_3_item': 3,\n                            'step_3_hub': 3,\n                            'step_3_municipal': 3,\n                            'step_3_supramunicipal': 3,\n                            'step_4': 4,\n                            'step_5': 5,\n                            'completed': 5,\n                            'step_completed': 5\n                        };\n                        var stepNumber = stepNumberMap[currentStep] || 1;\n                        var continueBtn = document.createElement('button');\n                        continueBtn.type = 'button';\n                        continueBtn.className = 'roseo-btn roseo-btn-continue';\n                        continueBtn.id = 'btn-continue-form';\n                        continueBtn.style.cssText = 'display: inline-flex !important;';\n                        continueBtn.innerHTML = '<i class=\"fas fa-play-circle\"><\/i><span>Continuar desde paso ' + stepNumber + '<\/span>';\n                        var newBtn = document.createElement('button');\n                        newBtn.type = 'button';\n                        newBtn.className = 'roseo-btn roseo-btn-start-new';\n                        newBtn.id = 'btn-start-new';\n                        newBtn.style.cssText = 'display: inline-flex !important;';\n                        newBtn.innerHTML = '<i class=\"fas fa-redo\"><\/i><span>Let\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s start a fresh one! (New Project)<\/span>';\n                        var stepNames = {\"1\":\"Contact details\",\"2\":\"Tell us your idea\",\"3\":\"System to be installed\",\"4\":\"Your energy profile\",\"5\":\"Location\"};\n                        var stepName = stepNames[stepNumber] || ('paso ' + stepNumber);\n                        var infoP = document.createElement('div');\n                        infoP.className = 'progress-info';\n                        infoP.innerHTML = '<i class=\"fas fa-bookmark\"><\/i><span>Te quedaste en: <strong>' + stepName + '<\/strong><\/span>';\n                        buttonsContainer.appendChild(continueBtn);\n                        buttonsContainer.appendChild(newBtn);\n                        buttonsContainer.appendChild(infoP);\n                        continueBtn.addEventListener('click', function(e) {\n                            e.preventDefault();\n                            showFormulario();\n                        });\n                        newBtn.addEventListener('click', function(e) {\n                            e.preventDefault();\n                            var cookiesToClear = [\n                                'roseo_current_step',\n                                'roseo_tipo_cliente',\n                                'roseo_numero_ubicaciones',\n                                'roseo_session_id'\n                            ];\n                            cookiesToClear.forEach(function(name) {\n                                document.cookie = name + '=; path=\/; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n                            });\n                            var storageKeys = [\n                                'roseo_state_v2',\n                                'roseo_form_state',\n                                'roseo_form_data',\n                                'roseo_ubicaciones',\n                                'roseo_current_location',\n                                'roseo_completed_steps',\n                                'roseo_state', \/\/ Add legacy state key\n                                'mfm_cache'    \/\/ Clear MFM cache if any\n                            ];\n                            storageKeys.forEach(function(key) {\n                                try { localStorage.removeItem(key); } catch(e) {}\n                                try { sessionStorage.removeItem(key); } catch(e) {} \/\/ Also clear session storage\n                            });\n                            if (window.RoseoStateV2) {\n                                window.RoseoStateV2.reset(false);\n                            }\n                            fetch('https:\/\/roseo.es\/wp-admin\/admin-ajax.php', {\n                                method: 'POST',\n                                headers: { 'Content-Type': 'application\/x-www-form-urlencoded' },\n                                body: 'action=roseo_reset_session'\n                            }).then(function() {\n                                if (window.RoseoStateV2) {\n                                    if (!window.RoseoStateV2._initialized) {\n                                        window.RoseoStateV2.init();\n                                    }\n                                    window.RoseoStateV2.setCurrentStep('step_1');\n                                    window.RoseoStateV2.saveToStorage();\n                                }\n                                showFormulario();\n                            }).catch(function(err) {\n                                showFormulario();\n                            });\n                        });\n                    }\n                }\n            }\n        } catch(e) {\n        }\n    })();\n    function showFormulario() {\n        var homeContainer = document.getElementById('roseo-home-screen-container');\n        if (homeContainer) {\n            homeContainer.classList.remove('roseo-home-visible');\n            homeContainer.classList.add('roseo-form-hidden');\n        }\n        var mainForm = document.getElementById('roseo-unified-form');\n        if (mainForm) {\n            mainForm.classList.remove('roseo-form-hidden');\n            mainForm.classList.add('roseo-form-visible');\n        } else {\n        }\n        ['roseo-header-container', 'roseo-footer-container', 'roseo-step-container'].forEach(function(id) {\n            var el = document.getElementById(id);\n            if (el) {\n                el.classList.remove('roseo-form-hidden');\n                el.classList.add('roseo-form-visible');\n            } else {\n            }\n        });\n        var footerContainer = document.getElementById('roseo-footer-container');\n        if (footerContainer) {\n            footerContainer.classList.add('roseo-form-visible');\n            footerContainer.classList.remove('roseo-form-hidden');\n            footerContainer.style.display = '';\n            footerContainer.style.visibility = '';\n        }\n        var footerNav = document.querySelector('.roseo-footer-navigation');\n        if (footerNav) {\n            footerNav.classList.add('roseo-form-visible');\n            footerNav.classList.remove('roseo-form-hidden');\n            footerNav.classList.remove('roseo-footer-hidden');\n            footerNav.style.display = '';\n            footerNav.style.visibility = '';\n        }\n        var footerNavById = document.getElementById('roseo-footer-nav');\n        if (footerNavById) {\n            footerNavById.classList.remove('roseo-footer-hidden');\n            footerNavById.style.display = '';\n            footerNavById.style.visibility = '';\n        }\n        \/\/ Quitar clase completed del body si existe\n        document.body.classList.remove('roseo-completed');\n        setTimeout(function() {\n            var formWrapper = document.getElementById('roseo-form-wrapper');\n            if (formWrapper) formWrapper.scrollIntoView({ behavior: 'smooth', block: 'start' });\n        }, 100);\n        setTimeout(function() {\n            if (window.RoseoHeaderNav) {\n                window.RoseoHeaderNav.init();\n            }\n            if (window.RoseoFooterNav) {\n                window.RoseoFooterNav.init();\n            }\n            if (window.RoseoRouter) {\n                var targetStep = 'step_1';\n                if (window.RoseoStateV2) {\n                    var state = window.RoseoStateV2.getState();\n                    targetStep = state.current_step || 'step_1';\n                }\n                if (!window.RoseoRouter.initialized) {\n                    window.RoseoRouter.init();\n                } else {\n                    window.RoseoRouter.showStepByState(targetStep);\n                }\n            }\n            ensureFooterVisible();\n        }, 300);\n        var watchdogCount = 0;\n        function ensureFooterVisible() {\n            var mainForm = document.getElementById('roseo-unified-form');\n            if (mainForm && mainForm.classList.contains('roseo-form-visible')) {\n                var footerContainer = document.getElementById('roseo-footer-container');\n                var footerNav = document.querySelector('.roseo-footer-navigation');\n                var footerNavById = document.getElementById('roseo-footer-nav');\n                \n                \/\/ Quitar clase roseo-completed del body (podr\u00eda quedar de visita anterior)\n                document.body.classList.remove('roseo-completed');\n                \n                if (footerContainer) {\n                    footerContainer.classList.add('roseo-form-visible');\n                    footerContainer.classList.remove('roseo-form-hidden');\n                    footerContainer.style.display = '';\n                    footerContainer.style.visibility = '';\n                }\n                if (footerNav) {\n                    footerNav.classList.add('roseo-form-visible');\n                    footerNav.classList.remove('roseo-form-hidden');\n                    footerNav.classList.remove('roseo-footer-hidden');\n                    footerNav.style.display = '';\n                    footerNav.style.visibility = '';\n                }\n                if (footerNavById) {\n                    footerNavById.classList.remove('roseo-footer-hidden');\n                    footerNavById.style.display = '';\n                    footerNavById.style.visibility = '';\n                }\n            }\n            adjustContentPadding();\n            watchdogCount++;\n            if (watchdogCount < 5) {\n                setTimeout(ensureFooterVisible, 500);\n            }\n        }\n        function adjustContentPadding() {\n            var footerContainer = document.getElementById('roseo-footer-container');\n            var stepContainer = document.querySelector('.roseo-step-container');\n            if (footerContainer && stepContainer) {\n                var footerHeight = footerContainer.offsetHeight;\n                var paddingNeeded = footerHeight + 20;\n                stepContainer.style.paddingBottom = paddingNeeded + 'px';\n            }\n        }\n        window.addEventListener('resize', adjustContentPadding);\n    }\n    document.querySelectorAll('.mfm-lang-btn').forEach(function(btn) {\n        btn.addEventListener('click', function(e) {\n            e.preventDefault();\n            var lang = this.dataset.lang;\n            if (lang && ['es', 'eu', 'en'].includes(lang)) {\n                localStorage.setItem('mfm_user_lang', lang);\n                document.cookie = 'mfm_lang=' + lang + '; path=\/; max-age=31536000; SameSite=Lax';\n                var verify = document.cookie.match(\/mfm_lang=([^;]+)\/)?.[1];\n                setTimeout(function() {\n                    var url = new URL(window.location.href);\n                    url.searchParams.set('mfm_force_lang', lang);\n                    window.location.href = url.toString();\n                }, 100);\n            }\n        });\n    });\n    if (window.location.search.includes('mfm_force_lang')) {\n        var url = new URL(window.location.href);\n        url.searchParams.delete('mfm_force_lang');\n        window.history.replaceState({}, document.title, url.toString());\n    }\n    var btnStart = document.getElementById('btn-start-form');\n    var btnContinue = document.getElementById('btn-continue-form');\n    var btnStartNew = document.getElementById('btn-start-new');\n    function handleStartClick(e, isNewStart) {\n        e.preventDefault();\n        if (isNewStart) {\n            localStorage.removeItem('roseo_form_state');\n            localStorage.removeItem('roseo_form_data');\n            localStorage.removeItem('roseo_state_v2');\n            localStorage.removeItem('roseo_state');\n            localStorage.removeItem('roseo_ubicaciones');\n            localStorage.removeItem('roseo_current_location');\n            try { sessionStorage.clear(); } catch(e) {}\n            document.cookie = 'roseo_current_step=; path=\/; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.reset(false);\n            }\n        }\n        showFormulario();\n        if (isNewStart) {\n            fetch('https:\/\/roseo.es\/wp-admin\/admin-ajax.php', {\n                method: 'POST',\n                headers: { 'Content-Type': 'application\/x-www-form-urlencoded' },\n                body: 'action=roseo_reset_session'\n            }).then(function() {\n                if (window.RoseoStateV2) {\n                    if (!window.RoseoStateV2._initialized) {\n                        window.RoseoStateV2.init();\n                    }\n                    window.RoseoStateV2.setCurrentStep('step_1');\n                    window.RoseoStateV2.saveToStorage();\n                }\n            }).catch(function(err) {\n            });\n        }\n    }\n    if (btnStart) {\n        btnStart.addEventListener('click', function(e) {\n            handleStartClick(e, true);\n        });\n    }\n    if (btnContinue) {\n        btnContinue.addEventListener('click', function(e) {\n            handleStartClick(e, false);\n        });\n    }\n    if (btnStartNew) {\n        btnStartNew.addEventListener('click', function(e) {\n            handleStartClick(e, true);\n        });\n    }\n    if (!btnStart && !btnContinue && !btnStartNew) {\n    }\n});\n<\/script>\n            <\/div>\n            \n            <!-- Form unificado -->\n            <form id=\"roseo-unified-form\" method=\"POST\" novalidate class=\"roseo-form-hidden\">\n                <input type=\"hidden\" id=\"roseo_form_nonce\" name=\"roseo_form_nonce\" value=\"6d5242ba4e\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/6661\" \/>                \n                <div id=\"roseo-header-container\" class=\"roseo-form-hidden\">\n                    \n<div class=\"roseo-header-navigation\" id=\"roseo-header-nav\">\n    <!-- Header compacto - solo subt\u00edtulo -->\n    <div class=\"roseo-cards-header\">\n        <p class=\"roseo-cards-subtitle\" id=\"step-subtitle\" data-template=\"You are on step {current} of 5 - {remaining} steps remaining\">\n            You are on step 1 of 5 - 4 steps remaining        <\/p>\n    <\/div>\n    \n    <script>\n        \/\/ Expose template safely to JS to avoid attribute encoding issues\n        window.RoseoHeaderTemplate = \"You are on step {current} of 5 - {remaining} steps remaining\";\n    <\/script>\n\n    <!-- Barra de progreso -->\n    <div class=\"roseo-progress-bar\">\n        <div class=\"roseo-progress-fill\" id=\"progress-fill\" style=\"width: 20%;\"><\/div>\n    <\/div>\n\n    <!-- Cards de navegaci\u00f3n -->\n    <div class=\"roseo-cards-container\" id=\"cards-container\">\n        \n                <div class=\"roseo-card-step active\" data-step=\"1\" id=\"card-step-1\">\n            <div class=\"roseo-card-header\">\n                <div class=\"roseo-card-number\">1<\/div>\n                <div class=\"roseo-card-title\">Identification<\/div>\n            <\/div>\n            <div class=\"roseo-card-description\">\n                Select the profile that fits you            <\/div>\n        <\/div>\n                <div class=\"roseo-card-step\" data-step=\"2\" id=\"card-step-2\">\n            <div class=\"roseo-card-header\">\n                <div class=\"roseo-card-number\">2<\/div>\n                <div class=\"roseo-card-title\">Scope<\/div>\n            <\/div>\n            <div class=\"roseo-card-description\">\n                Define single or multiple locations            <\/div>\n        <\/div>\n                <div class=\"roseo-card-step\" data-step=\"3\" id=\"card-step-3\">\n            <div class=\"roseo-card-header\">\n                <div class=\"roseo-card-number\">3<\/div>\n                <div class=\"roseo-card-title\">System to be installed<\/div>\n            <\/div>\n            <div class=\"roseo-card-description\">\n                Let\\\\\\&#039;s define your solution            <\/div>\n        <\/div>\n                <div class=\"roseo-card-step\" data-step=\"4\" id=\"card-step-4\">\n            <div class=\"roseo-card-header\">\n                <div class=\"roseo-card-number\">4<\/div>\n                <div class=\"roseo-card-title\">Tell us what you are looking for<\/div>\n            <\/div>\n            <div class=\"roseo-card-description\">\n                Indicate your objectives and execution timelines            <\/div>\n        <\/div>\n                <div class=\"roseo-card-step\" data-step=\"5\" id=\"card-step-5\">\n            <div class=\"roseo-card-header\">\n                <div class=\"roseo-card-number\">5<\/div>\n                <div class=\"roseo-card-title\">Let\\\\\\&#039;s make sure everything is in order<\/div>\n            <\/div>\n            <div class=\"roseo-card-description\">\n                Summary and legal terms            <\/div>\n        <\/div>\n        \n    <\/div>\n<\/div>\n\n<style>\n\/* RESPONSIVE HEADER FIX *\/\n#roseo-header-nav .roseo-cards-container {\n    display: flex !important;\n    flex-wrap: wrap !important;\n    gap: 10px !important;\n    justify-content: center !important;\n}\n\n#roseo-header-nav .roseo-card-step {\n    flex: 1 1 160px !important; \/* Min width 160px, grow to fill *\/\n    min-width: 140px !important;\n    max-width: 100% !important;\n    margin-bottom: 5px !important;\n    box-sizing: border-box !important;\n}\n\n@media (max-width: 768px) {\n    \/* On mobile, maybe show compacted view or just wrap nicely *\/\n    #roseo-header-nav .roseo-card-step {\n        flex-basis: 100% !important; \/* Stack vertically on very small screens *\/\n    }\n    \n    \/* Optional: Hide non-active steps on very small mobile if requested? \n       For now, wrapping is the safe non-destructive fix. *\/\n}\n<\/style>\n                <\/div>\n                \n                <div id=\"roseo-step-container\" class=\"roseo-step-container roseo-form-hidden\">\n                    \n<div id=\"roseo-router-container\" class=\"roseo-router-container\">\n    \n    <!-- STEP 1: Tipo de Cliente -->\n    <div id=\"step-1\" class=\"roseo-step\" data-state=\"step_1\" style=\"display:none !important;\">\n        <div class=\"roseo-step-content roseo-step-fullheight\" id=\"step-1-content\">\n    <div class=\"roseo-step-header\">\n        <h2 class=\"roseo-step-title\">\n            <i class=\"fas fa-users\"><\/i>\n            We\u2019d like to get to know you better        <\/h2>\n        <p class=\"roseo-step-description\">\n            Select the client type that best represents you        <\/p>\n    <\/div>\n    <div class=\"roseo-card-grid\" id=\"tipo-cliente-grid\">\n                <label class=\"roseo-selection-card \">\n            <input type=\"radio\" name=\"tipo_cliente\" value=\"particular\" \n                    style=\"display:none;\">\n            <div class=\"card-icon\">\n                <i class=\"fa-solid fa-user\"><\/i>\n            <\/div>\n            <h3 class=\"card-title\">Individual<\/h3>\n            <p class=\"card-description\">For my home<\/p>\n        <\/label>\n                <label class=\"roseo-selection-card \">\n            <input type=\"radio\" name=\"tipo_cliente\" value=\"empresa\" \n                    style=\"display:none;\">\n            <div class=\"card-icon\">\n                <i class=\"fa-solid fa-building\"><\/i>\n            <\/div>\n            <h3 class=\"card-title\">Company<\/h3>\n            <p class=\"card-description\">Business \/ Corporate<\/p>\n        <\/label>\n                <label class=\"roseo-selection-card \">\n            <input type=\"radio\" name=\"tipo_cliente\" value=\"entidad_publica\" \n                    style=\"display:none;\">\n            <div class=\"card-icon\">\n                <i class=\"fa-solid fa-landmark\"><\/i>\n            <\/div>\n            <h3 class=\"card-title\">Public Entity<\/h3>\n            <p class=\"card-description\">Public Administration<\/p>\n        <\/label>\n                <label class=\"roseo-selection-card \">\n            <input type=\"radio\" name=\"tipo_cliente\" value=\"ayuntamiento\" \n                    style=\"display:none;\">\n            <div class=\"card-icon\">\n                <i class=\"fa-solid fa-city\"><\/i>\n            <\/div>\n            <h3 class=\"card-title\">City Council<\/h3>\n            <p class=\"card-description\">Municipal government<\/p>\n        <\/label>\n                <label class=\"roseo-selection-card \">\n            <input type=\"radio\" name=\"tipo_cliente\" value=\"comunidad_energetica\" \n                    style=\"display:none;\">\n            <div class=\"card-icon\">\n                <i class=\"fa-solid fa-bolt\"><\/i>\n            <\/div>\n            <h3 class=\"card-title\">Energy Community<\/h3>\n            <p class=\"card-description\">Association or cooperative<\/p>\n        <\/label>\n                <label class=\"roseo-selection-card \">\n            <input type=\"radio\" name=\"tipo_cliente\" value=\"mancomunidad\" \n                    style=\"display:none;\">\n            <div class=\"card-icon\">\n                <i class=\"fa-solid fa-network-wired\"><\/i>\n            <\/div>\n            <h3 class=\"card-title\">Inter-municipal Association<\/h3>\n            <p class=\"card-description\">Local Consortium<\/p>\n        <\/label>\n                <label class=\"roseo-selection-card \">\n            <input type=\"radio\" name=\"tipo_cliente\" value=\"otro\" \n                    style=\"display:none;\">\n            <div class=\"card-icon\">\n                <i class=\"fa-solid fa-question\"><\/i>\n            <\/div>\n            <h3 class=\"card-title\">Other case<\/h3>\n            <p class=\"card-description\">Special situation<\/p>\n        <\/label>\n            <\/div>\n<\/div>\n<script>\n(function() {\n    'use strict';\n    function initStep1() {\n        const cards = document.querySelectorAll('#tipo-cliente-grid .roseo-selection-card');\n        function restoreSelection() {\n            let savedTipoCliente = null;\n            if (window.RoseoStateV2 && window.RoseoStateV2.isReady()) {\n                savedTipoCliente = window.RoseoStateV2.getFormData('tipo_cliente');\n            }\n            if (!savedTipoCliente) {\n                try {\n                    const rawState = localStorage.getItem('roseo_state_v2');\n                    if (rawState) {\n                        const parsed = JSON.parse(rawState);\n                        if (parsed.form && parsed.form.tipo_cliente) {\n                            savedTipoCliente = parsed.form.tipo_cliente;\n                        }\n                    }\n                } catch(e) {\n                }\n            }\n            if (!savedTipoCliente) {\n                const cookies = document.cookie.split(';');\n                for (let cookie of cookies) {\n                    const [name, value] = cookie.trim().split('=');\n                    if (name === 'roseo_tipo_cliente' && value) {\n                        savedTipoCliente = decodeURIComponent(value);\n                        break;\n                    }\n                }\n            }\n            if (!savedTipoCliente) {\n                const selectedCard = document.querySelector('#tipo-cliente-grid .roseo-selection-card.selected');\n                if (selectedCard) {\n                    const radio = selectedCard.querySelector('input[type=\"radio\"]');\n                    if (radio && radio.value) {\n                        savedTipoCliente = radio.value;\n                    }\n                }\n            }\n            if (savedTipoCliente) {\n                if (window.RoseoStateV2 && window.RoseoStateV2.isReady()) {\n                    window.RoseoStateV2.setFormData('tipo_cliente', savedTipoCliente);\n                }\n                document.cookie = 'roseo_tipo_cliente=' + encodeURIComponent(savedTipoCliente) + '; path=\/; SameSite=Lax; max-age=86400';\n                cards.forEach(card => {\n                    const radio = card.querySelector('input[type=\"radio\"]');\n                    if (radio && radio.value === savedTipoCliente) {\n                        cards.forEach(c => c.classList.remove('selected'));\n                        card.classList.add('selected');\n                        radio.checked = true;\n                    }\n                });\n            }\n        }\n        function waitForStateV2(callback, maxWait = 3000) {\n            const startTime = Date.now();\n            function check() {\n                if (window.RoseoStateV2 && window.RoseoStateV2.isReady()) {\n                    callback();\n                } else if (window.RoseoStateV2 && typeof window.RoseoStateV2.onReady === 'function') {\n                    window.RoseoStateV2.onReady(callback);\n                } else if (Date.now() - startTime < maxWait) {\n                    setTimeout(check, 100);\n                } else {\n                    callback();\n                }\n            }\n            check();\n        }\n        restoreSelection();\n        waitForStateV2(restoreSelection);\n        cards.forEach(card => {\n            card.addEventListener('click', function() {\n                const radio = this.querySelector('input[type=\"radio\"]');\n                if (radio) {\n                    const value = radio.value;\n                    if (window.RoseoStateV2) {\n                        window.RoseoStateV2.setFormData('tipo_cliente', value);\n                    }\n                    document.cookie = 'roseo_tipo_cliente=' + encodeURIComponent(value) + '; path=\/; SameSite=Lax; max-age=86400';\n                    if (window.RoseoAnalytics && typeof window.RoseoAnalytics.trackFormField === 'function') {\n                        window.RoseoAnalytics.trackFormField('tipo_cliente', value);\n                    } else if (window.RoseoAnalytics && typeof window.RoseoAnalytics.trackEvent === 'function') {\n                        window.RoseoAnalytics.trackEvent('form_data', {\n                            field_name: 'tipo_cliente',\n                            field_value: value,\n                            step: 'step_1'\n                        });\n                    }\n                    cards.forEach(c => c.classList.remove('selected'));\n                    this.classList.add('selected');\n                }\n            });\n        });\n    }\n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', initStep1);\n    } else {\n        initStep1();\n    }\n    document.addEventListener('roseo:step-loaded', initStep1);\n})();\n<\/script>    <\/div>\n    \n    <!-- STEP 1.1: Datos de Contacto -->\n    <div id=\"step-1-1\" class=\"roseo-step\" data-state=\"step_1_1\" style=\"display:none !important;\">\n        <div class=\"roseo-step-content roseo-step-1-1-layout\" id=\"step-1-1-content\">\n    <div class=\"roseo-step-header\">\n        <h2 class=\"roseo-step-title\">\n            <i class=\"fas fa-id-card\"><\/i>\n            Contact Details        <\/h2>\n        <p class=\"roseo-step-description\">\n            Complete your personal details to continue with the request        <\/p>\n            <\/div>\n    \n    <div class=\"roseo-form-fields\">\n                                <div class=\"roseo-form-group roseo-field-width-33\" \n                 style=\"display: none;\"\n                 data-field-name=\"custom_n_empresa\" \n                 data-client-types=\"[&quot;empresa&quot;]\"\n                 data-custom-field=\"n_empresa\">\n                <label for=\"custom_n_empresa\" class=\"roseo-form-label\">\n                    <i class=\"fa-solid fa-building\"><\/i>\n                    Company <span class=\"required\">*<\/span>                <\/label>\n                \n                                    <input \n                        type=\"text\" \n                        id=\"custom_n_empresa\" \n                        name=\"custom_n_empresa\" \n                        class=\"roseo-form-field\"\n                        value=\"\"\n                        required                        placeholder=\"\"\n                                                data-required=\"true\"\n                                                                                                onblur=\"RoseoStep1_1.validateField(this)\">\n                                \n                <span class=\"error-message\" id=\"error-custom_n_empresa\"><\/span>\n            <\/div>\n                                    <div class=\"roseo-form-group roseo-field-width-33\" \n                 style=\"\"\n                 data-field-name=\"nombre\" \n                 data-client-types=\"[]\"\n                 >\n                <label for=\"nombre\" class=\"roseo-form-label\">\n                    <i class=\"fa-solid fa-user\"><\/i>\n                    First Name <span class=\"required\">*<\/span>                <\/label>\n                \n                                    <input \n                        type=\"text\" \n                        id=\"nombre\" \n                        name=\"nombre\" \n                        class=\"roseo-form-field\"\n                        value=\"\"\n                        required                        placeholder=\"E.g.: John\"\n                                                data-error-msg=\"Name is required\"\n                                                data-required=\"true\"\n                        minlength=\"2\" autocomplete=\"on\"                                                                        onblur=\"RoseoStep1_1.validateField(this)\">\n                                \n                <span class=\"error-message\" id=\"error-nombre\"><\/span>\n            <\/div>\n                                    <div class=\"roseo-form-group roseo-field-width-33\" \n                 style=\"\"\n                 data-field-name=\"apellido\" \n                 data-client-types=\"[]\"\n                 >\n                <label for=\"apellido\" class=\"roseo-form-label\">\n                    <i class=\"fa-solid fa-user\"><\/i>\n                    Last Name <span class=\"required\">*<\/span>                <\/label>\n                \n                                    <input \n                        type=\"text\" \n                        id=\"apellido\" \n                        name=\"apellido\" \n                        class=\"roseo-form-field\"\n                        value=\"\"\n                        required                        placeholder=\"E.g.: Smith\"\n                                                data-error-msg=\"Last name is required\"\n                                                data-required=\"true\"\n                        minlength=\"2\" autocomplete=\"on\"                                                                        onblur=\"RoseoStep1_1.validateField(this)\">\n                                \n                <span class=\"error-message\" id=\"error-apellido\"><\/span>\n            <\/div>\n                                    <div class=\"roseo-form-group roseo-field-width-33\" \n                 style=\"\"\n                 data-field-name=\"email\" \n                 data-client-types=\"[]\"\n                 >\n                <label for=\"email\" class=\"roseo-form-label\">\n                    <i class=\"fa-solid fa-envelope\"><\/i>\n                    Email <span class=\"required\">*<\/span>                <\/label>\n                \n                                    <input \n                        type=\"email\" \n                        id=\"email\" \n                        name=\"email\" \n                        class=\"roseo-form-field\"\n                        value=\"\"\n                        required                        placeholder=\"example@email.com\"\n                                                data-error-msg=\"Invalid email\"\n                                                data-required=\"true\"\n                                                                        autocomplete=\"email\"                        onblur=\"RoseoStep1_1.validateField(this)\">\n                                \n                <span class=\"error-message\" id=\"error-email\"><\/span>\n            <\/div>\n                                    <div class=\"roseo-form-group roseo-field-width-33\" \n                 style=\"\"\n                 data-field-name=\"telefono\" \n                 data-client-types=\"[]\"\n                 >\n                <label for=\"telefono\" class=\"roseo-form-label\">\n                    <i class=\"fa-solid fa-phone\"><\/i>\n                    Phone <span class=\"required\">*<\/span>                <\/label>\n                \n                                    <input \n                        type=\"tel\" \n                        id=\"telefono\" \n                        name=\"telefono\" \n                        class=\"roseo-form-field\"\n                        value=\"\"\n                        required                        placeholder=\"E.g.: 612345678\"\n                                                data-error-msg=\"Invalid phone (min. 9 digits)\"\n                                                data-required=\"true\"\n                                                minlength=\"9\" autocomplete=\"tel\"                                                onblur=\"RoseoStep1_1.validateField(this)\">\n                                \n                <span class=\"error-message\" id=\"error-telefono\"><\/span>\n            <\/div>\n                <\/div>\n    \n    <!-- Consentimiento Analytics - al final antes de continuar -->\n    <div class=\"roseo-analytics-consent\" style=\"background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%); border: 1px solid #cbd5e1; border-radius: 12px; padding: 14px 18px; margin-top: 24px;\">\n        <label style=\"display: flex; align-items: flex-start; gap: 12px; cursor: pointer; margin: 0;\">\n            <input type=\"checkbox\" \n                   id=\"acepta_analytics\" \n                   name=\"acepta_analytics\"\n                   required\n                   data-required=\"true\"\n                   style=\"width: 18px; height: 18px; accent-color: #009239; margin-top: 3px; flex-shrink: 0;\">\n            <span style=\"font-size: 13px; color: #475569; line-height: 1.5;\">\n                I agree that my data will be processed to improve my experience. Data will be stored securely and I can exercise my rights according to the                <a href=\"https:\/\/roseo.es\/politica-privacidad\/\" \n                   target=\"_blank\" \n                   rel=\"noopener\" \n                   style=\"color: #009239; font-weight: 600; text-decoration: underline;\">\n                    Privacy Policy<\/a>.\n            <\/span>\n        <\/label>\n    <\/div>\n<\/div>\n<script>\n\/**\n * L\u00f3gica del Step 1.1 con Campos Personalizados\n *\/\nwindow.RoseoStep1_1 = {\n    \/**\n     * Validar campo individual\n     *\/\n    validateField: function(input) {\n        const fieldName = input.name;\n        const value = (input.type === 'checkbox') ? input.checked : input.value.trim();\n        const errorElement = document.getElementById('error-' + fieldName);\n        let isValid = true;\n        let errorMessage = '';\n        \n        \/\/ Validaci\u00f3n espec\u00edfica para campos est\u00e1ndar\n        if (fieldName === 'nombre' || fieldName === 'apellido') {\n            if (value.length < 2) {\n                isValid = false;\n                errorMessage = 'M\u00ednimo 2 caracteres';\n            } else if (!\/^[a-z\u00e1\u00e9\u00ed\u00f3\u00fa\u00f1\u00fcA-Z\u00c1\u00c9\u00cd\u00d3\u00da\u00d1\u00dc\\s\\-'\\.]+$\/.test(value)) {\n                isValid = false;\n                errorMessage = 'Solo letras permitidas';\n            }\n        }\n        else if (fieldName === 'email') {\n            const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\n            if (!emailRegex.test(value)) {\n                isValid = false;\n                errorMessage = 'Email inv\u00e1lido';\n            }\n        }\n        else if (fieldName === 'telefono') {\n            \/\/ Limpiar todo lo que no sea n\u00famero\n            const digits = value.replace(\/[^0-9]\/g, '');\n            \/\/ Validar que tenga al menos 9 d\u00edgitos\n            if (digits.length < 9) {\n                isValid = false;\n                errorMessage = 'Tel\u00e9fono inv\u00e1lido (m\u00ednimo 9 d\u00edgitos)';\n            }\n        }\n        \/\/ Validaci\u00f3n gen\u00e9rica para campos personalizados requeridos\n        else if (input.dataset.required === 'true') {\n            if (input.type === 'checkbox') {\n                if (!input.checked) {\n                    isValid = false;\n                    errorMessage = 'Este campo es obligatorio';\n                }\n            } else if (value === '') {\n                isValid = false;\n                errorMessage = 'Este campo es obligatorio';\n            }\n        }\n\n        \/\/ Mostrar\/Ocultar errores\n        if (!isValid && (value.length > 0 || input.dataset.touched === 'true')) {\n            input.classList.add('error');\n            input.classList.remove('valid');\n            if (errorElement) {\n                errorElement.textContent = errorMessage;\n                errorElement.classList.add('show');\n            }\n        } else if (isValid && (value.length > 0 || input.type === 'checkbox')) {\n            input.classList.remove('error');\n            input.classList.add('valid');\n            if (errorElement) errorElement.classList.remove('show');\n        } else {\n            input.classList.remove('error', 'valid');\n            if (errorElement) errorElement.classList.remove('show');\n        }\n        \n        return isValid;\n    },\n\n    \/**\n     * Validar todos los campos (est\u00e1ndar + personalizados)\n     *\/\n    validateAllFields: function() {\n        let allValid = true;\n        \n        \/\/ 1. Campos est\u00e1ndar\n        \/\/ 1. Campos est\u00e1ndar\n        ['nombre', 'apellido', 'email', 'telefono'].forEach(fieldName => {\n            const input = document.getElementById(fieldName);\n            \/\/ Solo validar si existe Y es visible (dimensiones reales > 0)\n            if (input) {\n                const rect = input.getBoundingClientRect();\n                const isVisible = rect.width > 0 && rect.height > 0 && window.getComputedStyle(input).visibility !== 'hidden';\n                \n                if (!isVisible) return; \/\/ Ignorar campos ocultos\n\n                const isValid = this.validateField(input);\n                if (!isValid) {\n                    allValid = false;\n                }\n                \/\/ Si es requerido y est\u00e1 vac\u00edo, marcar inv\u00e1lido\n                if (input.hasAttribute('required') && input.value.trim() === '') {\n                    allValid = false;\n                }\n            }\n        });\n\n        \/\/ 2. Campos personalizados requeridos\n        const customInputs = document.querySelectorAll('[data-custom-field]');\n        customInputs.forEach(div => {\n           \/\/ Solo si el contenedor del campo personalizado es visible\n           const rect = div.getBoundingClientRect();\n           if (rect.width === 0 || rect.height === 0) return;\n            \n           \/\/ Buscar input, select o textarea dentro\n           const input = div.querySelector('input, select, textarea');\n           if (input && input.dataset.required === 'true') {\n               const isValid = this.validateField(input);\n               if (!isValid) allValid = false;\n               \n               if (input.type === 'checkbox') {\n                   if (!input.checked) allValid = false;\n               } else {\n                   if (input.value.trim() === '') allValid = false;\n               }\n           }\n        });\n\n        return allValid;\n    },\n\n    \/**\n     * Actualizar estado del bot\u00f3n siguiente\n     *\/\n    updateNextButton: function() {\n        const nextBtn = document.getElementById('btn-next-step');\n        if (nextBtn) {\n            const isValid = this.validateAllFields();\n            nextBtn.disabled = !isValid;\n            if (isValid) {\n                nextBtn.classList.add('enabled');\n            } else {\n                nextBtn.classList.remove('enabled');\n            }\n        }\n    },\n\n    \/**\n     * Update field visibility based on Client Type\n     *\/\n    updateVisibility: function() {\n        let currentType = '';\n        if (window.RoseoStateV2) {\n             const data = window.RoseoStateV2.getFormData();\n             currentType = data ? (data.tipo_cliente || '') : '';\n        }\n        \n        const groups = document.querySelectorAll('.roseo-form-group[data-client-types]');\n        groups.forEach(group => {\n            const allowedJson = group.dataset.clientTypes;\n            if (!allowedJson) return;\n            \n            try {\n                const allowed = JSON.parse(allowedJson);\n                if (!Array.isArray(allowed) || allowed.length === 0) {\n                    group.style.display = '';\n                } else {\n                    if (currentType && allowed.includes(currentType)) {\n                         group.style.display = '';\n                    } else {\n                         group.style.display = 'none';\n                    }\n                }\n            } catch(e) {\n                console.error('Roseo Error: parsing client types', e);\n            }\n        });\n    }\n};\n\n(function() {\n    function initializeStep11() {\n        const nombreInput = document.getElementById('nombre');\n        if (!nombreInput) {\n            setTimeout(initializeStep11, 100);\n            return;\n        }\n\n        function setupField(input) {\n            if (!input) return;\n            \n            const fieldName = input.name;\n            const isCheckbox = input.type === 'checkbox';\n            let lastSavedValue = input.value; \/\/ Track last saved value to avoid duplicates\n\n            \/\/ Event listener para validaci\u00f3n y guardado\n            const handler = () => {\n                input.dataset.touched = 'true';\n                RoseoStep1_1.validateField(input);\n                RoseoStep1_1.updateNextButton();\n                \n                const currentVal = isCheckbox ? (input.checked ? '1' : '0') : input.value.trim();\n                \n                \/\/ Solo guardar si el valor cambi\u00f3 (evita doble logging de change+blur)\n                if (window.RoseoStateV2 && currentVal !== lastSavedValue) {\n                    lastSavedValue = currentVal;\n                    window.RoseoStateV2.setFormData(fieldName, currentVal);\n                }\n            };\n\n            \/\/ input.addEventListener('input', handler); \/\/ Desactivado por rendimiento (evitar lag al escribir)\n            input.addEventListener('change', handler); \/\/ Para selects y checkboxes\n            input.addEventListener('blur', handler);\n        }\n\n        \/\/ Inicializar campos est\u00e1ndar\n        ['nombre', 'apellido', 'email', 'telefono'].forEach(name => {\n            setupField(document.getElementById(name));\n        });\n\n        \/\/ Inicializar campos personalizados\n        document.querySelectorAll('[data-custom-field] input, [data-custom-field] select, [data-custom-field] textarea').forEach(input => {\n            setupField(input);\n        });\n\n        \/\/ Restaurar estado\n        if (window.RoseoStateV2) {\n            const restore = () => {\n                const data = window.RoseoStateV2.getFormData(); \/\/ Obtener todo\n                if (!data) return;\n\n                \/\/ Restaurar est\u00e1ndar\n                ['nombre', 'apellido', 'email', 'telefono'].forEach(name => {\n                    if (data[name]) document.getElementById(name).value = data[name];\n                });\n\n                \/\/ Restaurar personalizados\n                document.querySelectorAll('[data-custom-field] input, [data-custom-field] select, [data-custom-field] textarea').forEach(input => {\n                    const name = input.name;\n                    if (data[name] !== undefined) {\n                        if (input.type === 'checkbox') {\n                            input.checked = (data[name] == '1');\n                        } else {\n                            input.value = data[name];\n                        }\n                    }\n                });\n                \n                RoseoStep1_1.updateNextButton();\n                RoseoStep1_1.updateVisibility(); \/\/ Call after restore\n            };\n\n            if (window.RoseoStateV2.isReady()) {\n                restore();\n            } else {\n                window.RoseoStateV2.onReady(restore);\n            }\n        }\n        \n        \/\/ Listen for step changes (navigation back to this step)\n        if (typeof jQuery !== 'undefined') {\n            jQuery(document).on('roseo:step-changed', function(e, data) {\n                \/\/ If navigating to step 1 (1.1 is part of '1' usually, or separate?)\n                \/\/ Assuming step-1-1 is visible\n                setTimeout(function() {\n                    RoseoStep1_1.updateVisibility();\n                }, 100);\n            });\n        }\n        \n        RoseoStep1_1.updateNextButton();\n        RoseoStep1_1.updateVisibility();\n    }\n    \n    \/\/ Asegurar que DOM est\u00e9 listo\n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', initializeStep11);\n    } else {\n        setTimeout(initializeStep11, 200);\n    }\n})();\n<\/script>\n    <\/div>\n    \n    <!-- STEP 2: Ubicaciones -->\n    <div id=\"step-2\" class=\"roseo-step\" data-state=\"step_2\" style=\"display:none !important;\">\n        <div class=\"roseo-step-content\" id=\"step-2-content\">\n    <div class=\"roseo-step-header\">\n        <h2 class=\"roseo-step-title\">\n            <i class=\"fas fa-map-marker-alt\"><\/i>\n            Locations        <\/h2>\n        <p class=\"roseo-step-subtitle\">\n            Let us know if you prefer to analyze a specific site or compare different options        <\/p>\n    <\/div>\n        <div class=\"roseo-card-grid roseo-card-grid-step2\" id=\"numero-ubicaciones-grid\">\n                    <label class=\"roseo-selection-card roseo-selection-card-step2  \" \n                   data-value=\"unica\"\n                   data-visible-for='[&quot;particular&quot;,&quot;empresa&quot;,&quot;entidad_publica&quot;,&quot;comunidad_energetica&quot;,&quot;ayuntamiento&quot;,&quot;mancomunidad&quot;,&quot;otro&quot;]'\n                   style=\" overflow:visible !important; height:auto !important; min-height:280px !important;\">\n                <input type=\"radio\" \n                       name=\"numero_ubicaciones\" \n                       value=\"unica\" \n                                              style=\"display:none;\">\n                <div class=\"card-icon-large\" style=\"display:flex !important; visibility:visible !important; width:72px !important; height:72px !important; min-width:72px !important; min-height:72px !important; border-radius:50% !important; background:linear-gradient(135deg, #009239 0%, #015328 100%) !important; align-items:center !important; justify-content:center !important; margin-bottom:20px !important; flex-shrink:0 !important;\">\n                    <i class=\"fa-solid fa-map-marker-alt\" style=\"font-size:32px !important; color:#fff !important;\"><\/i>\n                <\/div>\n                <h3 class=\"card-title\" style=\"display:block !important; visibility:visible !important; height:auto !important; min-height:28px !important; overflow:visible !important; color:#015328 !important; font-size:22px !important; font-weight:700 !important; text-indent:0 !important; -webkit-text-fill-color:#015328 !important; opacity:1 !important; margin:0 0 10px 0 !important; line-height:1.3 !important;\">Single location<\/h3>\n                <p class=\"card-description\" style=\"display:block !important; visibility:visible !important; height:auto !important; min-height:22px !important; overflow:visible !important; color:#54595F !important; font-size:16px !important; font-weight:400 !important; text-indent:0 !important; -webkit-text-fill-color:#54595F !important; opacity:0.9 !important; margin:0 0 20px 0 !important; line-height:1.4 !important;\">One specific plot, land or roof<\/p>\n                <ul class=\"card-benefits\" style=\"display:block !important; visibility:visible !important; height:auto !important; overflow:visible !important; list-style:none !important; padding:0 !important; margin:0 !important;\">\n                                            <li style=\"display:flex !important; visibility:visible !important; height:auto !important; align-items:center !important; gap:10px !important; margin-bottom:10px !important; color:#54595F !important; font-size:15px !important; line-height:1.4 !important;\">\n                            <i class=\"fa-solid fa-check-circle\" style=\"color:#009239 !important; font-size:16px !important; flex-shrink:0 !important;\"><\/i>\n                            <span style=\"display:inline !important; visibility:visible !important; height:auto !important;\">Installation in one place<\/span>\n                        <\/li>\n                                            <li style=\"display:flex !important; visibility:visible !important; height:auto !important; align-items:center !important; gap:10px !important; margin-bottom:10px !important; color:#54595F !important; font-size:15px !important; line-height:1.4 !important;\">\n                            <i class=\"fa-solid fa-check-circle\" style=\"color:#009239 !important; font-size:16px !important; flex-shrink:0 !important;\"><\/i>\n                            <span style=\"display:inline !important; visibility:visible !important; height:auto !important;\">Faster process<\/span>\n                        <\/li>\n                                            <li style=\"display:flex !important; visibility:visible !important; height:auto !important; align-items:center !important; gap:10px !important; margin-bottom:10px !important; color:#54595F !important; font-size:15px !important; line-height:1.4 !important;\">\n                            <i class=\"fa-solid fa-check-circle\" style=\"color:#009239 !important; font-size:16px !important; flex-shrink:0 !important;\"><\/i>\n                            <span style=\"display:inline !important; visibility:visible !important; height:auto !important;\">Simplified management<\/span>\n                        <\/li>\n                                    <\/ul>\n            <\/label>\n                    <label class=\"roseo-selection-card roseo-selection-card-step2  \" \n                   data-value=\"multiples\"\n                   data-visible-for='[&quot;particular&quot;,&quot;empresa&quot;,&quot;entidad_publica&quot;,&quot;comunidad_energetica&quot;,&quot;ayuntamiento&quot;,&quot;mancomunidad&quot;,&quot;otro&quot;]'\n                   style=\" overflow:visible !important; height:auto !important; min-height:280px !important;\">\n                <input type=\"radio\" \n                       name=\"numero_ubicaciones\" \n                       value=\"multiples\" \n                                              style=\"display:none;\">\n                <div class=\"card-icon-large\" style=\"display:flex !important; visibility:visible !important; width:72px !important; height:72px !important; min-width:72px !important; min-height:72px !important; border-radius:50% !important; background:linear-gradient(135deg, #009239 0%, #015328 100%) !important; align-items:center !important; justify-content:center !important; margin-bottom:20px !important; flex-shrink:0 !important;\">\n                    <i class=\"fa-solid fa-map-marked-alt\" style=\"font-size:32px !important; color:#fff !important;\"><\/i>\n                <\/div>\n                <h3 class=\"card-title\" style=\"display:block !important; visibility:visible !important; height:auto !important; min-height:28px !important; overflow:visible !important; color:#015328 !important; font-size:22px !important; font-weight:700 !important; text-indent:0 !important; -webkit-text-fill-color:#015328 !important; opacity:1 !important; margin:0 0 10px 0 !important; line-height:1.3 !important;\">Multiple locations<\/h3>\n                <p class=\"card-description\" style=\"display:block !important; visibility:visible !important; height:auto !important; min-height:22px !important; overflow:visible !important; color:#54595F !important; font-size:16px !important; font-weight:400 !important; text-indent:0 !important; -webkit-text-fill-color:#54595F !important; opacity:0.9 !important; margin:0 0 20px 0 !important; line-height:1.4 !important;\">Different plots, lands and\/or roofs<\/p>\n                <ul class=\"card-benefits\" style=\"display:block !important; visibility:visible !important; height:auto !important; overflow:visible !important; list-style:none !important; padding:0 !important; margin:0 !important;\">\n                                            <li style=\"display:flex !important; visibility:visible !important; height:auto !important; align-items:center !important; gap:10px !important; margin-bottom:10px !important; color:#54595F !important; font-size:15px !important; line-height:1.4 !important;\">\n                            <i class=\"fa-solid fa-check-circle\" style=\"color:#009239 !important; font-size:16px !important; flex-shrink:0 !important;\"><\/i>\n                            <span style=\"display:inline !important; visibility:visible !important; height:auto !important;\">Multiple installations<\/span>\n                        <\/li>\n                                            <li style=\"display:flex !important; visibility:visible !important; height:auto !important; align-items:center !important; gap:10px !important; margin-bottom:10px !important; color:#54595F !important; font-size:15px !important; line-height:1.4 !important;\">\n                            <i class=\"fa-solid fa-check-circle\" style=\"color:#009239 !important; font-size:16px !important; flex-shrink:0 !important;\"><\/i>\n                            <span style=\"display:inline !important; visibility:visible !important; height:auto !important;\">Distributed optimization<\/span>\n                        <\/li>\n                                            <li style=\"display:flex !important; visibility:visible !important; height:auto !important; align-items:center !important; gap:10px !important; margin-bottom:10px !important; color:#54595F !important; font-size:15px !important; line-height:1.4 !important;\">\n                            <i class=\"fa-solid fa-check-circle\" style=\"color:#009239 !important; font-size:16px !important; flex-shrink:0 !important;\"><\/i>\n                            <span style=\"display:inline !important; visibility:visible !important; height:auto !important;\">Greater coverage<\/span>\n                        <\/li>\n                                    <\/ul>\n            <\/label>\n                    <label class=\"roseo-selection-card roseo-selection-card-step2  \" \n                   data-value=\"municipal\"\n                   data-visible-for='[&quot;ayuntamiento&quot;,&quot;mancomunidad&quot;,&quot;entidad_publica&quot;,&quot;otro&quot;]'\n                   style=\" overflow:visible !important; height:auto !important; min-height:280px !important;\">\n                <input type=\"radio\" \n                       name=\"numero_ubicaciones\" \n                       value=\"municipal\" \n                                              style=\"display:none;\">\n                <div class=\"card-icon-large\" style=\"display:flex !important; visibility:visible !important; width:72px !important; height:72px !important; min-width:72px !important; min-height:72px !important; border-radius:50% !important; background:linear-gradient(135deg, #009239 0%, #015328 100%) !important; align-items:center !important; justify-content:center !important; margin-bottom:20px !important; flex-shrink:0 !important;\">\n                    <i class=\"fa-solid fa-city\" style=\"font-size:32px !important; color:#fff !important;\"><\/i>\n                <\/div>\n                <h3 class=\"card-title\" style=\"display:block !important; visibility:visible !important; height:auto !important; min-height:28px !important; overflow:visible !important; color:#015328 !important; font-size:22px !important; font-weight:700 !important; text-indent:0 !important; -webkit-text-fill-color:#015328 !important; opacity:1 !important; margin:0 0 10px 0 !important; line-height:1.3 !important;\">Municipal level<\/h3>\n                <p class=\"card-description\" style=\"display:block !important; visibility:visible !important; height:auto !important; min-height:22px !important; overflow:visible !important; color:#54595F !important; font-size:16px !important; font-weight:400 !important; text-indent:0 !important; -webkit-text-fill-color:#54595F !important; opacity:0.9 !important; margin:0 0 20px 0 !important; line-height:1.4 !important;\">Global study for the entire municipality<\/p>\n                <ul class=\"card-benefits\" style=\"display:block !important; visibility:visible !important; height:auto !important; overflow:visible !important; list-style:none !important; padding:0 !important; margin:0 !important;\">\n                                            <li style=\"display:flex !important; visibility:visible !important; height:auto !important; align-items:center !important; gap:10px !important; margin-bottom:10px !important; color:#54595F !important; font-size:15px !important; line-height:1.4 !important;\">\n                            <i class=\"fa-solid fa-check-circle\" style=\"color:#009239 !important; font-size:16px !important; flex-shrink:0 !important;\"><\/i>\n                            <span style=\"display:inline !important; visibility:visible !important; height:auto !important;\">Comprehensive analysis<\/span>\n                        <\/li>\n                                            <li style=\"display:flex !important; visibility:visible !important; height:auto !important; align-items:center !important; gap:10px !important; margin-bottom:10px !important; color:#54595F !important; font-size:15px !important; line-height:1.4 !important;\">\n                            <i class=\"fa-solid fa-check-circle\" style=\"color:#009239 !important; font-size:16px !important; flex-shrink:0 !important;\"><\/i>\n                            <span style=\"display:inline !important; visibility:visible !important; height:auto !important;\">Strategic planning<\/span>\n                        <\/li>\n                                            <li style=\"display:flex !important; visibility:visible !important; height:auto !important; align-items:center !important; gap:10px !important; margin-bottom:10px !important; color:#54595F !important; font-size:15px !important; line-height:1.4 !important;\">\n                            <i class=\"fa-solid fa-check-circle\" style=\"color:#009239 !important; font-size:16px !important; flex-shrink:0 !important;\"><\/i>\n                            <span style=\"display:inline !important; visibility:visible !important; height:auto !important;\">Resource optimization<\/span>\n                        <\/li>\n                                    <\/ul>\n            <\/label>\n                    <label class=\"roseo-selection-card roseo-selection-card-step2  \" \n                   data-value=\"supramunicipal\"\n                   data-visible-for='[&quot;mancomunidad&quot;,&quot;entidad_publica&quot;,&quot;otro&quot;]'\n                   style=\" overflow:visible !important; height:auto !important; min-height:280px !important;\">\n                <input type=\"radio\" \n                       name=\"numero_ubicaciones\" \n                       value=\"supramunicipal\" \n                                              style=\"display:none;\">\n                <div class=\"card-icon-large\" style=\"display:flex !important; visibility:visible !important; width:72px !important; height:72px !important; min-width:72px !important; min-height:72px !important; border-radius:50% !important; background:linear-gradient(135deg, #009239 0%, #015328 100%) !important; align-items:center !important; justify-content:center !important; margin-bottom:20px !important; flex-shrink:0 !important;\">\n                    <i class=\"fa-solid fa-layer-group\" style=\"font-size:32px !important; color:#fff !important;\"><\/i>\n                <\/div>\n                <h3 class=\"card-title\" style=\"display:block !important; visibility:visible !important; height:auto !important; min-height:28px !important; overflow:visible !important; color:#015328 !important; font-size:22px !important; font-weight:700 !important; text-indent:0 !important; -webkit-text-fill-color:#015328 !important; opacity:1 !important; margin:0 0 10px 0 !important; line-height:1.3 !important;\">Regional\/Higher-level authority<\/h3>\n                <p class=\"card-description\" style=\"display:block !important; visibility:visible !important; height:auto !important; min-height:22px !important; overflow:visible !important; color:#54595F !important; font-size:16px !important; font-weight:400 !important; text-indent:0 !important; -webkit-text-fill-color:#54595F !important; opacity:0.9 !important; margin:0 0 20px 0 !important; line-height:1.4 !important;\">Study for multiple municipalities (commonwealth)<\/p>\n                <ul class=\"card-benefits\" style=\"display:block !important; visibility:visible !important; height:auto !important; overflow:visible !important; list-style:none !important; padding:0 !important; margin:0 !important;\">\n                                            <li style=\"display:flex !important; visibility:visible !important; height:auto !important; align-items:center !important; gap:10px !important; margin-bottom:10px !important; color:#54595F !important; font-size:15px !important; line-height:1.4 !important;\">\n                            <i class=\"fa-solid fa-check-circle\" style=\"color:#009239 !important; font-size:16px !important; flex-shrink:0 !important;\"><\/i>\n                            <span style=\"display:inline !important; visibility:visible !important; height:auto !important;\">Multi-municipality analysis<\/span>\n                        <\/li>\n                                            <li style=\"display:flex !important; visibility:visible !important; height:auto !important; align-items:center !important; gap:10px !important; margin-bottom:10px !important; color:#54595F !important; font-size:15px !important; line-height:1.4 !important;\">\n                            <i class=\"fa-solid fa-check-circle\" style=\"color:#009239 !important; font-size:16px !important; flex-shrink:0 !important;\"><\/i>\n                            <span style=\"display:inline !important; visibility:visible !important; height:auto !important;\">Territorial coordination<\/span>\n                        <\/li>\n                                            <li style=\"display:flex !important; visibility:visible !important; height:auto !important; align-items:center !important; gap:10px !important; margin-bottom:10px !important; color:#54595F !important; font-size:15px !important; line-height:1.4 !important;\">\n                            <i class=\"fa-solid fa-check-circle\" style=\"color:#009239 !important; font-size:16px !important; flex-shrink:0 !important;\"><\/i>\n                            <span style=\"display:inline !important; visibility:visible !important; height:auto !important;\">Joint planning<\/span>\n                        <\/li>\n                                    <\/ul>\n            <\/label>\n            <\/div>\n<\/div>\n<script>\n\/**\n * Step 2 - Filtrado din\u00e1mico por tipo_cliente\n * Los datos est\u00e1n en localStorage (StateV2), no en PHP SESSION\n *\/\n(function() {\n    'use strict';\n    function initStep2() {\n        const grid = document.getElementById('numero-ubicaciones-grid');\n        if (!grid) {\n            return;\n        }\n        const cards = grid.querySelectorAll('.roseo-selection-card-step2');\n        let tipoCliente = '';\n        let savedNumeroUbicaciones = '';\n        if (window.RoseoStateV2 && window.RoseoStateV2.isReady()) {\n            const state = window.RoseoStateV2.getState();\n            tipoCliente = state.form?.tipo_cliente || '';\n            savedNumeroUbicaciones = state.form?.numero_ubicaciones || '';\n        }\n        let visibleCount = 0;\n        cards.forEach(card => {\n            const visibleFor = JSON.parse(card.getAttribute('data-visible-for') || '[]');\n            const value = card.getAttribute('data-value');\n            const shouldShow = visibleFor.length === 0 || !tipoCliente || visibleFor.includes(tipoCliente);\n            if (shouldShow) {\n                card.removeAttribute('style');\n                card.classList.remove('hidden-by-filter', 'hidden-by-php');\n                visibleCount++;\n            } else {\n                card.classList.add('hidden-by-filter');\n                if (card.classList.contains('selected')) {\n                    card.classList.remove('selected');\n                    const radio = card.querySelector('input[type=\"radio\"]');\n                    if (radio) radio.checked = false;\n                }\n            }\n        });\n        grid.classList.remove('roseo-card-grid-3cols', 'roseo-card-grid-4cols');\n        if (visibleCount === 3) {\n            grid.classList.add('roseo-card-grid-3cols');\n        } else if (visibleCount === 4) {\n            grid.classList.add('roseo-card-grid-4cols');\n        }\n        if (savedNumeroUbicaciones) {\n            const savedCard = grid.querySelector(`.roseo-selection-card-step2[data-value=\"${savedNumeroUbicaciones}\"]`);\n            if (savedCard && !savedCard.classList.contains('hidden-by-filter')) {\n                cards.forEach(c => c.classList.remove('selected'));\n                cards.forEach(c => {\n                    const r = c.querySelector('input[type=\"radio\"]');\n                    if (r) r.checked = false;\n                });\n                savedCard.classList.add('selected');\n                const radio = savedCard.querySelector('input[type=\"radio\"]');\n                if (radio) radio.checked = true;\n            }\n        }\n        cards.forEach(card => {\n            card.addEventListener('click', function() {\n                if (this.classList.contains('hidden-by-filter')) return;\n                const value = this.getAttribute('data-value');\n                if (window.RoseoStateV2) {\n                    window.RoseoStateV2.setFormData('numero_ubicaciones', value);\n                }\n                if (window.RoseoAnalytics && typeof window.RoseoAnalytics.trackFormField === 'function') {\n                    window.RoseoAnalytics.trackFormField('numero_ubicaciones', value);\n                } else if (window.RoseoAnalytics && typeof window.RoseoAnalytics.trackEvent === 'function') {\n                    window.RoseoAnalytics.trackEvent('form_data', {\n                        field_name: 'numero_ubicaciones',\n                        field_value: value,\n                        step: 'step_2'\n                    });\n                }\n                cards.forEach(c => c.classList.remove('selected'));\n                this.classList.add('selected');\n                const radio = this.querySelector('input[type=\"radio\"]');\n                if (radio) radio.checked = true;\n            });\n        });\n    }\n    window.Step2Refilter = function() {\n        initStep2();\n    };\n    if (window.RoseoStateV2 && window.RoseoStateV2.isReady()) {\n        initStep2();\n    } else if (window.RoseoStateV2) {\n        window.RoseoStateV2.onReady(function() {\n            initStep2();\n        });\n    } else {\n        document.addEventListener('DOMContentLoaded', function() {\n            setTimeout(initStep2, 300);\n        });\n    }\n    document.addEventListener('roseo:step-changed', function(e) {\n        setTimeout(initStep2, 100);\n    });\n    if (typeof jQuery !== 'undefined') {\n        jQuery(document).on('roseo:step-changed', function(event, data) {\n            if (data && data.current_state === 'step_2') {\n                setTimeout(initStep2, 100);\n            }\n        });\n    }\n    document.addEventListener('roseo-navigation-update', function(e) {\n        if (e.detail && e.detail.current_state === 'step_2') {\n            setTimeout(initStep2, 100);\n        }\n    });\n    const observer = new MutationObserver(function(mutations) {\n        mutations.forEach(function(mutation) {\n            if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n                const step2Div = document.querySelector('[data-state=\"step_2\"]');\n                if (step2Div && step2Div.classList.contains('roseo-step-active')) {\n                    setTimeout(initStep2, 50);\n                }\n            }\n        });\n    });\n    setTimeout(function() {\n        const step2Div = document.querySelector('[data-state=\"step_2\"]');\n        if (step2Div) {\n            observer.observe(step2Div, { attributes: true });\n        }\n    }, 500);\n})();\n<\/script>\n    <\/div>\n    \n    <!-- STEP 3: Selector Instalaci\u00f3n (solo ubicaci\u00f3n \u00fanica) -->\n    <div id=\"step-3\" class=\"roseo-step\" data-state=\"step_3\" style=\"display:none !important;\">\n        <div class=\"roseo-step-header\">\n    <h2 class=\"roseo-step-title\">\n        <i class=\"fas fa-cogs\"><\/i>\n        Installation type    <\/h2>\n    <p class=\"roseo-step-subtitle\">Select the type of installation you want to analyze.<\/p>\n<\/div>\n<div class=\"roseo-step-content\">\n    <div class=\"selector-container\">\n                <div class=\"selector-grid\">\n                                            <div class=\"selector-card\" \n                   data-value=\"fv_ampliar_mini\"\n                   onclick=\"selectTipo('fv_ampliar_mini')\">\n                <input type=\"radio\" \n                       name=\"tipo_instalacion\" \n                       value=\"fv_ampliar_mini\" \n                       style=\"display: none;\">\n                <div class=\"card-icon\">\n                    <i class=\"fa-solid fa-plug\"><\/i>                <\/div>\n                                <h3>I have photovoltaic and want mini-wind<\/h3>\n                <p>Already have panels and i want to add wind<\/p>\n            <\/div>\n                                        <div class=\"selector-card\" \n                   data-value=\"solo_mini\"\n                   onclick=\"selectTipo('solo_mini')\">\n                <input type=\"radio\" \n                       name=\"tipo_instalacion\" \n                       value=\"solo_mini\" \n                       style=\"display: none;\">\n                <div class=\"card-icon\">\n                    <i class=\"fa-solid fa-wind\"><\/i>                <\/div>\n                                <h3>Mini-wind only<\/h3>\n                <p>mini-wind turbine study only<\/p>\n            <\/div>\n                                        <div class=\"selector-card\" \n                   data-value=\"mini_fv\"\n                   onclick=\"selectTipo('mini_fv')\">\n                <input type=\"radio\" \n                       name=\"tipo_instalacion\" \n                       value=\"mini_fv\" \n                       style=\"display: none;\">\n                <div class=\"card-icon\">\n                    <i class=\"fa-solid fa-bolt\"><\/i>                <\/div>\n                                <h3>Mini wind + Photovoltaic<\/h3>\n                <p>Full hybrid system analysis<\/p>\n            <\/div>\n                                        <div class=\"selector-card\" \n                   data-value=\"solo_fv\"\n                   onclick=\"selectTipo('solo_fv')\">\n                <input type=\"radio\" \n                       name=\"tipo_instalacion\" \n                       value=\"solo_fv\" \n                       style=\"display: none;\">\n                <div class=\"card-icon\">\n                    <i class=\"fa-solid fa-solar-panel\"><\/i>                <\/div>\n                                <h3>Photovoltaic only<\/h3>\n                <p>Photovoltaic installation study only<\/p>\n            <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n<script>\nfunction selectTipo(valor) {\n    document.querySelectorAll('.selector-card').forEach(card => {\n        card.classList.remove('selected');\n    });\n    const selectedCard = document.querySelector('.selector-card[data-value=\"' + valor + '\"]');\n    if (selectedCard) {\n        selectedCard.classList.add('selected');\n    }\n    const radioInput = document.querySelector('.selector-card[data-value=\"' + valor + '\"] input[type=\"radio\"]');\n    if (radioInput) {\n        radioInput.checked = true;\n    }\n    \n    \/\/ CRITICAL: FORCEFULLY override ALL legacy globals with the user's selection\n    \/\/ This ensures the card selection is AUTHORITATIVE\n    window.roseoTipoInstalacion = valor;\n    if (window.itemData) {\n        window.itemData.tipo_instalacion = valor;\n    } else {\n        window.itemData = { tipo_instalacion: valor };\n    }\n    \n    if (window.RoseoStateV2) {\n        window.RoseoStateV2.setFormData('tipo_instalacion', valor);\n        \/\/ Also set in current_location to ensure it's available later\n        window.RoseoStateV2.setLocationField('tipo_instalacion', valor);\n        \/\/ Guardar inmediatamente en localStorage para persistir entre cargas\n        window.RoseoStateV2.saveToStorage();\n        \n        if (window.RoseoAnalytics && typeof window.RoseoAnalytics.trackFormField === 'function') {\n            window.RoseoAnalytics.trackFormField('tipo_instalacion', valor);\n        } else if (window.RoseoAnalytics && typeof window.RoseoAnalytics.trackEvent === 'function') {\n            window.RoseoAnalytics.trackEvent('form_data', {\n                field_name: 'tipo_instalacion',\n                field_value: valor,\n                step: 'step_3_selector'\n            });\n        }\n        const state = window.RoseoStateV2.getState();\n        const numeroUbicaciones = (state.form && state.form.numero_ubicaciones) || '';\n        if (numeroUbicaciones === 'municipal') {\n            setTimeout(function() {\n                window.RoseoStateV2.gotoStep('step_3_municipal');\n            }, 100);\n            return;\n        }\n        if (numeroUbicaciones === 'supramunicipal') {\n            setTimeout(function() {\n                window.RoseoStateV2.gotoStep('step_3_supramunicipal');\n            }, 100);\n            return;\n        }\n        window.RoseoStateV2.startNewLocation(valor);\n        window.RoseoStateV2.gotoStep('step_3_item');\n        setTimeout(function() {\n            if (typeof window.actualizarComponentesItem === 'function') {\n                window.actualizarComponentesItem(true); \/\/ Forzar actualizaci\u00f3n y scroll\n            }\n            if (typeof window.actualizarHeaderItem === 'function') {\n                window.actualizarHeaderItem();\n            }\n        }, 300); \/\/ Un poco m\u00e1s de delay para asegurar que el DOM est\u00e9 listo\n    } \n    else {\n        if (window.RoseoRouter && typeof window.RoseoRouter.saveField === 'function') {\n            window.RoseoRouter.saveField('tipo_instalacion', valor);\n            setTimeout(function() {\n                if (window.RoseoStateManager && typeof window.RoseoStateManager.loadCurrentStep === 'function') {\n                    window.RoseoStateManager.loadCurrentStep();\n                } else if (window.RoseoRouter && typeof window.RoseoRouter.loadStep === 'function') {\n                    window.RoseoRouter.loadStep(window.RoseoRouter.currentStep);\n                }\n            }, 300);\n        }\n    }\n}\ndocument.addEventListener('DOMContentLoaded', function() {\n    function restoreSelection() {\n        if (window.RoseoStateV2 && window.RoseoStateV2.isReady()) {\n            const savedTipo = window.RoseoStateV2.getFormData('tipo_instalacion');\n            if (savedTipo) {\n                document.querySelectorAll('.selector-card').forEach(card => {\n                    card.classList.remove('selected');\n                });\n                const savedCard = document.querySelector('.selector-card[data-value=\"' + savedTipo + '\"]');\n                if (savedCard) {\n                    savedCard.classList.add('selected');\n                    const radio = savedCard.querySelector('input[type=\"radio\"]');\n                    if (radio) radio.checked = true;\n                }\n            }\n        }\n    }\n    if (window.RoseoStateV2 && window.RoseoStateV2.isReady()) {\n        restoreSelection();\n    } else if (window.RoseoStateV2) {\n        window.RoseoStateV2.onReady(restoreSelection);\n    }\n    setTimeout(function() {\n        const selectedRadio = document.querySelector('input[name=\"tipo_instalacion\"]:checked');\n        const btnNext = document.getElementById('btn-next-step');\n        if (selectedRadio && btnNext) {\n            btnNext.disabled = false;\n            btnNext.classList.add('enabled');\n        }\n    }, 200);\n});\n<\/script>\n    <\/div>\n    \n    <!-- STEP 3 HUB: M\u00faltiples ubicaciones -->\n    <div id=\"step-3-hub\" class=\"roseo-step\" data-state=\"step_3_hub\" style=\"display:none !important;\">\n        <div class=\"roseo-step-header\">\n    <h2 class=\"roseo-step-title\">\n        <i class=\"fas fa-map-marked-alt\"><\/i>\n        Location Management    <\/h2>\n    <p class=\"roseo-step-description\">\n        Manage your project locations    <\/p>\n    <p class=\"roseo-step-subtitle\" id=\"hub-subtitle\">\n        Loading locations...    <\/p>\n<\/div>\n<div class=\"roseo-step-content\">\n<div class=\"hub-container\">\n    <div class=\"hub-header\">\n        <h3 id=\"hub-titulo\">Loading locations...<\/h3>\n        <p id=\"hub-descripcion\">Por favor espera mientras cargamos tus ubicaciones.<\/p>\n    <\/div>\n    <div class=\"ubicaciones-lista\" id=\"ubicaciones-lista\">\n        <div class=\"hub-vacio\" id=\"loading-placeholder\">\n            <i class=\"fas fa-spinner fa-spin\"><\/i>\n            <h3>Cargando ubicaciones..<\/h3>\n        <\/div>\n    <\/div>\n    <div class=\"hub-botones\" id=\"hub-botones\">\n    <\/div>\n<\/div>\n<\/div>\n<script>\nif (typeof window.HUB_CONFIG === 'undefined') {\n    window.HUB_CONFIG = {\n        numeroUbicaciones: 'unica'\n    };\n} else {\n    window.HUB_CONFIG.numeroUbicaciones = 'unica';\n}\nif (typeof window.HUB_TEXTS === 'undefined') {\n    window.HUB_TEXTS = {\"cargando\":\"Loading locations...\",\"sin_ubicaciones_0\":\"Your location list is empty. Add the first one and let\\\\'s get started!\",\"ubicacion_1\":\"You currently have 1 saved location.\",\"ubicaciones_n\":\"You currently have {n} saved locations.\",\"titulo_con_items\":\"Registered locations\",\"titulo_sin_items\":\"Begin by adding your first location\",\"desc_con_items\":\"Manage your locations using the edit, delete, or add options located below\",\"desc_sin_items\":\"Press \\\\\\\"Add new location\\\\\\\" to register the site\\\\'s primary data\",\"no_hay_ubicaciones\":\"Your location list is empty\",\"a\u00f1ade_primera\":\"Add your first location to get started\",\"potencia_fv\":\"PV Power\",\"bateria\":\"Battery\",\"bateria_si\":\"Yes\",\"bateria_no\":\"No\",\"minieolica\":\"Mini wind\",\"fotovoltaica\":\"Photovoltaic\",\"editar\":\"Edit\",\"btn_nueva\":\"Add a new location\",\"btn_primera\":\"Add your first location\",\"btn_configurar\":\"Configure your location\",\"btn_finalizar\":\"Finish and Continue\",\"confirmar_eliminar\":\"Are you sure you want to delete this location?\",\"ubicacion_no_encontrada\":\"Location not found\",\"desconocido\":\"Unknown\",\"modo_unica_info\":\"Este proyecto solo permite una ubicaci\u00f3n. Puedes editarla o continuar.\",\"tipo_solo_fv\":\"Photovoltaic only\",\"tipo_solo_mini\":\"Mini-wind only\",\"tipo_fv_ampliar_mini\":\"I have photovoltaic and want mini-wind\",\"tipo_mini_fv\":\"Mini wind + Photovoltaic\",\"ubicacion_cubierta\":\"Cubierta\",\"ubicacion_terreno\":\"Terreno\",\"ubicacion_ambas\":\"Cubierta + Terreno\",\"ubicacion_no_se\":\"No lo s\u00e9\"};\n}\n\nwindow.TIPOS_INSTALACION = {\n    'solo_fv': window.HUB_TEXTS.tipo_solo_fv,\n    'solo_mini': window.HUB_TEXTS.tipo_solo_mini,\n    'fv_ampliar_mini': window.HUB_TEXTS.tipo_fv_ampliar_mini,\n    'mini_fv': window.HUB_TEXTS.tipo_mini_fv\n};\nwindow.UBICACIONES_MINI = {\n    'cubierta': window.HUB_TEXTS.ubicacion_cubierta,\n    'terreno': window.HUB_TEXTS.ubicacion_terreno,\n    'ambas': window.HUB_TEXTS.ubicacion_ambas,\n    'no_se': window.HUB_TEXTS.ubicacion_no_se\n};\nfunction initHubV2() {\n    const mainForm = document.getElementById('roseo-unified-form');\n    if (!mainForm || !mainForm.classList.contains('roseo-form-visible')) {\n        return;\n    }\n    if (!window.RoseoStateV2) {\n        setTimeout(initHubV2, 200);\n        return;\n    }\n    if (window.RoseoStateV2.onReady) {\n        window.RoseoStateV2.onReady(function() {\n            renderHubContent();\n        });\n    } else if (window.RoseoStateV2.isReady && window.RoseoStateV2.isReady()) {\n        renderHubContent();\n    } else {\n        setTimeout(initHubV2, 300);\n    }\n}\nfunction renderHubContent() {\n    const ubicaciones = window.RoseoStateV2.getUbicaciones();\n    const total = ubicaciones.length;\n    const currentStep = window.RoseoStateV2.getState().current_step;\n    const fullState = window.RoseoStateV2.getState();\n    const subtitulo = document.getElementById('hub-subtitle');\n    if (subtitulo) {\n        if (total === 0) {\n            subtitulo.textContent = HUB_TEXTS.sin_ubicaciones_0;\n        } else if (total === 1) {\n            subtitulo.textContent = HUB_TEXTS.ubicacion_1;\n        } else {\n            subtitulo.textContent = HUB_TEXTS.ubicaciones_n.replace('{n}', total);\n        }\n    }\n    const titulo = document.getElementById('hub-titulo');\n    const descripcion = document.getElementById('hub-descripcion');\n    if (titulo) {\n        titulo.textContent = total > 0 ? HUB_TEXTS.titulo_con_items : HUB_TEXTS.titulo_sin_items;\n    }\n    if (descripcion) {\n        descripcion.textContent = total > 0 \n            ? HUB_TEXTS.desc_con_items\n            : HUB_TEXTS.desc_sin_items;\n    }\n    renderUbicacionesLista(ubicaciones);\n    renderBotones(total);\n}\nfunction renderUbicacionesLista(ubicaciones) {\n    const lista = document.getElementById('ubicaciones-lista');\n    if (!lista) return;\n    if (ubicaciones.length === 0) {\n        lista.innerHTML = `\n            <div class=\"hub-vacio\">\n                <i class=\"fas fa-inbox\"><\/i>\n                <h3>${HUB_TEXTS.no_hay_ubicaciones}<\/h3>\n                <p>${HUB_TEXTS.a\u00f1ade_primera}<\/p>\n            <\/div>\n        `;\n        return;\n    }\n    let html = '';\n    ubicaciones.forEach((ubicacion, index) => {\n        const tipoClase = (ubicacion.tipo_instalacion || '').replace(\/_\/g, '-');\n        const tipoNombre = window.TIPOS_INSTALACION[ubicacion.tipo_instalacion] || HUB_TEXTS.desconocido;\n        let detalles = '';\n        if (ubicacion.potencia_fv) {\n            detalles += `<div><strong>${HUB_TEXTS.potencia_fv}:<\/strong> ${ubicacion.potencia_fv} kW<\/div>`;\n        }\n        if (ubicacion.bateria) {\n            let batText = ubicacion.bateria === 'si' ? HUB_TEXTS.bateria_si : HUB_TEXTS.bateria_no;\n            if (ubicacion.bateria === 'si' && ubicacion.capacidad_bateria) {\n                batText += ` (${ubicacion.capacidad_bateria} kWh)`;\n            }\n            detalles += `<div><strong>${HUB_TEXTS.bateria}:<\/strong> ${batText}<\/div>`;\n        }\n        if (ubicacion.ubicacion_mini) {\n            detalles += `<div><strong>${HUB_TEXTS.minieolica}:<\/strong> ${window.UBICACIONES_MINI[ubicacion.ubicacion_mini] || ''}<\/div>`;\n        }\n        if (ubicacion.ubicacion_fv) {\n            \/\/ Mapping for FV location uses same keys as mini (terreno, cubierta, ambas)\n            detalles += `<div><strong>${HUB_TEXTS.fotovoltaica}:<\/strong> ${window.UBICACIONES_MINI[ubicacion.ubicacion_fv] || ''}<\/div>`;\n        }\n        html += `\n            <div class=\"ubicacion-card\" data-index=\"${index}\">\n                <div class=\"ubicacion-info\">\n                    <span class=\"ubicacion-tipo tipo-${tipoClase}\">${tipoNombre}<\/span>\n                    <div class=\"ubicacion-detalles\">${detalles}<\/div>\n                <\/div>\n                <div class=\"ubicacion-acciones\">\n                    <button type=\"button\" class=\"btn-hub btn-editar\" onclick=\"editarUbicacion(${index})\">\n                        <i class=\"fas fa-edit\"><\/i> ${HUB_TEXTS.editar}\n                    <\/button>\n                    <button type=\"button\" class=\"btn-hub btn-eliminar\" onclick=\"eliminarUbicacion(${index})\">\n                        <i class=\"fas fa-trash\"><\/i>\n                    <\/button>\n                <\/div>\n            <\/div>\n        `;\n    });\n    lista.innerHTML = html;\n}\nfunction renderBotones(total) {\n    const botones = document.getElementById('hub-botones');\n    if (!botones) return;\n    const stateNumero = window.RoseoStateV2?.getFormData('numero_ubicaciones') || 'unica';\n    const isMultiple = window.HUB_CONFIG.numeroUbicaciones === 'multiples' || stateNumero === 'multiples';\n    if (total === 0 && isMultiple) {\n        botones.innerHTML = `\n            <button type=\"button\" class=\"btn-a\u00f1adir\" onclick=\"a\u00f1adirNuevaUbicacion()\">\n                <i class=\"fas fa-plus-circle\"><\/i>\n                ${HUB_TEXTS.btn_primera}\n            <\/button>\n        `;\n        return;\n    } else if (total === 0) {\n        botones.innerHTML = `\n            <button type=\"button\" class=\"btn-a\u00f1adir\" onclick=\"window.RoseoStateV2?.gotoStep('step_3')\">\n                <i class=\"fas fa-plus-circle\"><\/i>\n                ${HUB_TEXTS.btn_configurar}\n            <\/button>\n        `;\n        return;\n    }\n    let html = '';\n    if (!isMultiple && total >= 1) {\n        html += `\n            <div class=\"hub-info-unica\" style=\"background: linear-gradient(135deg, #f0fdf4 0%, #dcfce7 100%); border: 1px solid #86efac; border-radius: 8px; padding: 12px 16px; margin-bottom: 12px; display: flex; align-items: center; gap: 10px;\">\n                <i class=\"fas fa-info-circle\" style=\"color: #009239; font-size: 18px;\"><\/i>\n                <span style=\"color: #015328; font-size: 14px;\">${HUB_TEXTS.modo_unica_info}<\/span>\n            <\/div>\n        `;\n    }\n    if (isMultiple) {\n        html += `\n            <button type=\"button\" class=\"btn-a\u00f1adir\" onclick=\"a\u00f1adirNuevaUbicacion()\">\n                <i class=\"fas fa-plus-circle\"><\/i>\n                ${HUB_TEXTS.btn_nueva}\n            <\/button>\n        `;\n    }\n    html += `\n        <button type=\"button\" class=\"btn-finalizar\" onclick=\"finalizarTodasUbicaciones()\">\n            <i class=\"fas fa-check-circle\"><\/i>\n            ${HUB_TEXTS.btn_finalizar}\n        <\/button>\n    `;\n    botones.innerHTML = html;\n}\nfunction a\u00f1adirNuevaUbicacion() {\n    window.RoseoStateV2.startNewLocation('');\n    window.RoseoStateV2.setFormData('tipo_instalacion', '');\n    window.RoseoStateV2.gotoStep('step_3');\n}\nfunction editarUbicacion(index) {\n    if (window.RoseoStateV2.editLocation(index)) {\n        const ubicacion = window.RoseoStateV2.getUbicacion(index);\n        window.RoseoStateV2.setFormData('tipo_instalacion', ubicacion.tipo_instalacion);\n        window.RoseoStateV2.gotoStep('step_3_item');\n    } else {\n        alert(HUB_TEXTS.ubicacion_no_encontrada);\n    }\n}\nfunction eliminarUbicacion(index) {\n    if (!confirm(HUB_TEXTS.confirmar_eliminar)) {\n        return;\n    }\n    window.RoseoStateV2.deleteUbicacion(index);\n    renderHubContent();\n    window.RoseoStateV2.syncToServer(function(response) {\n    });\n}\nfunction finalizarTodasUbicaciones() {\n    window.RoseoStateV2.syncToServer(function(response) {\n        window.RoseoStateV2.gotoStep('step_4');\n    });\n}\nfunction onHubVisible() {\n    if (window.RoseoStateV2) {\n        if (window.RoseoStateV2.onReady) {\n            window.RoseoStateV2.onReady(function() {\n                renderHubContent();\n            });\n        } else {\n            renderHubContent();\n        }\n    }\n}\nfunction checkAndInitHub() {\n    const mainForm = document.getElementById('roseo-unified-form');\n    if (!mainForm || !mainForm.classList.contains('roseo-form-visible')) {\n        return;\n    }\n    initHubV2();\n}\nfunction setupHubObserver() {\n    const hubStep = document.getElementById('step-3-hub');\n    if (!hubStep) {\n        return;\n    }\n    const observer = new MutationObserver(function(mutations) {\n        mutations.forEach(function(mutation) {\n            if (mutation.type === 'attributes' && mutation.attributeName === 'style') {\n                const display = window.getComputedStyle(hubStep).display;\n                if (display !== 'none') {\n                    onHubVisible();\n                }\n            }\n            if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n                if (hubStep.classList.contains('active')) {\n                    onHubVisible();\n                }\n            }\n        });\n    });\n    observer.observe(hubStep, { attributes: true });\n    const display = window.getComputedStyle(hubStep).display;\n    if (display !== 'none' || hubStep.classList.contains('active')) {\n        onHubVisible();\n    }\n}\nif (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', function() {\n        checkAndInitHub();\n        setupHubObserver();\n    });\n} else {\n    setTimeout(function() {\n        checkAndInitHub();\n        setupHubObserver();\n    }, 100);\n}\nwindow.refreshHubV2 = onHubVisible;\n<\/script>\n    <\/div>\n    \n    <!-- STEP 3 ITEM: Configurar ubicaci\u00f3n individual -->\n    <div id=\"step-3-item\" class=\"roseo-step\" data-state=\"step_3_item\" style=\"display:none !important;\">\n        <script>\n    \/\/ CLEANUP: Force clear any lingering map instances from previous locations\n    if (window.RoseoMapInstances) {\n        Object.keys(window.RoseoMapInstances).forEach(function(key) {\n            try { \n                if (window.RoseoMapInstances[key].destroy) {\n                    window.RoseoMapInstances[key].destroy(); \n                }\n            } catch(e) { console.error(e); }\n            delete window.RoseoMapInstances[key];\n        });\n        window.RoseoMapInstances = {};\n    }\n    \n    \/\/ CLEANUP: Reset itemData aggressively\n    window.itemData = {};\n    \n    window.roseoNumeroUbicaciones = '';\n    \n    \/\/ CRITICAL: Only set from PHP if client-side doesn't already have a value\n    \/\/ This prevents card selection in selector from being overwritten\n    (function() {\n        var phpTipo = '';\n        var clientTipo = '';\n        \n        \/\/ Check RoseoStateV2 first (most authoritative)\n        if (window.RoseoStateV2) {\n            try {\n                var state = window.RoseoStateV2.getState();\n                clientTipo = (state.current_location && state.current_location.tipo_instalacion) ||\n                             (state.form && state.form.tipo_instalacion) || '';\n            } catch(e) {}\n        }\n        \n        \/\/ Tambi\u00e9n verificar itemData que puede haber sido seteado por el selector\n        if (!clientTipo && window.itemData && window.itemData.tipo_instalacion) {\n            clientTipo = window.itemData.tipo_instalacion;\n        }\n        \n        \/\/ If client has a value, USE IT. Otherwise fallback to PHP value.\n        if (clientTipo && clientTipo.length > 0) {\n            window.roseoTipoInstalacion = clientTipo;\n            \/\/ CRITICAL: Sync back to state if came from itemData\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('tipo_instalacion', clientTipo);\n                window.RoseoStateV2.saveToStorage();\n            }\n        } else if (phpTipo && phpTipo.length > 0) {\n            window.roseoTipoInstalacion = phpTipo;\n        }\n        \n        \/\/ Sync itemData if it exists\n        if (window.itemData && window.roseoTipoInstalacion) {\n            window.itemData.tipo_instalacion = window.roseoTipoInstalacion;\n        }\n    })();\n    \n    window.itemTexts = {\"pendiente\":\"Action required\",\"completado\":\"Completed\",\"guardar\":\"Save\",\"cancelar\":\"Cancel\",\"guardar_poligono\":\"Save Polygon\",\"delimita_poligono\":\"Delimit your installation polygon\",\"poligono_guardado\":\"Polygon saved successfully.\",\"poligono_cubierta_guardado\":\"Roof polygon saved.\",\"poligono_terreno_guardado\":\"Land polygon saved.\",\"poligono_fv_guardado\":\"Polygon of photovoltaic panesl saved.\",\"completa_datos\":\"Complete the additional data.\",\"ubicacion_guardada\":\"Site successfully registered.\",\"potencia_requerida\":\"Please indicate the installed photovoltaic power.\",\"bateria_requerida\":\"Select a battery option.\",\"capacidad_requerida\":\"Indicate the battery capacity.\",\"consumo_requerido\":\"Select a consumption type.\",\"factura_requerida\":\"Please attach the invoice.\",\"valor_consumo_requerido\":\"Indicate the consumption value.\",\"ubicacion_mini_requerida\":\"Select where you will install the mini wind turbine.\",\"tipologia_cubierta_requerida\":\"Please select a roof typology\",\"poligono_cubierta_requerido\":\"You must draw the roof polygon.\",\"poligono_terreno_requerido\":\"You must draw the land polygon.\",\"poligonos_ambos_requeridos\":\"You must draw both polygons (roof and land).\",\"potencia_obligatoria\":\"Photovoltaic power is required\",\"poligono_fv_requerido\":\"You must draw the photovoltaic polygon\",\"baterias_requeridas\":\"You must indicate if you have batteries\",\"capacidad_obligatoria\":\"Battery capacity is required\",\"consumo_obligatorio\":\"You must indicate your consumption type\",\"valor_obligatorio\":\"Consumption value is required\",\"factura_obligatoria\":\"You must upload the invoice\",\"ubicacion_mini_obligatoria\":\"You must select where you will install the mini wind turbine\",\"tipologia_obligatoria\":\"Roof typology is required\",\"poligonos_requeridos\":\"You must draw both polygons\",\"confirmar_salir\":\"Warning! You have unsaved changes that will be lost\",\"mapa_instrucciones_dibujar\":\"Draw the mini wind turbine installation polygon(s):\",\"sin_poligonos\":\"No area has been defined. Please draw a polygon on the map.\",\"ubicaciones_guardadas\":\"Already saved locations\",\"puedes_anadir_mas\":\"Add new locations to perform a comparison\",\"tab_consumo_titulo\":\"Consumption\",\"tab_consumo_desc\":\"Indicate your electricity consumption\",\"volver_hub\":\"Back to Locations Hub\",\"tipo_fv_ampliar_mini\":\"I have photovoltaic and want mini-wind\",\"tipo_solo_mini\":\"Mini-wind only\",\"tipo_mini_fv\":\"Mini wind + Photovoltaic\",\"tipo_solo_fv\":\"Photovoltaic only\",\"mapa_titulo_modal\":\"Delimit your Installation Polygon\",\"mapa_btn_cancelar\":\"Cancel\",\"mapa_btn_guardar\":\"Save Polygon\",\"mapa_status_default\":\"Draw the polygon of your installation\",\"mapa_paso_1\":\"Search location:\",\"mapa_paso_1_desc\":\"Use the search bar at the top right\",\"mapa_paso_2\":\"Position:\",\"mapa_paso_2_desc\":\"Drag the map and use scroll to zoom\",\"mapa_paso_3\":\"Draw:\",\"mapa_paso_3_desc\":\"Click on the draw icon (left) and mark vertices\",\"mapa_paso_4\":\"Edit:\",\"mapa_paso_4_desc\":\"Use pencil to move points or select trash icon to delete the geometry\",\"consumo_label_euros_mes\":\"Monthly cost (\u20ac)\",\"consumo_label_euros_anio\":\"Annual cost (\u20ac)\",\"consumo_label_kwh_mes\":\"Monthly consumption (kWh)\",\"consumo_label_kwh_anio\":\"Annual consumption (kWh)\",\"consumo_label_valor\":\"Value\"};\n<\/script>\n<div class=\"item-wrapper\">\n    <div class=\"roseo-step-header\" style=\"text-align: center; margin-bottom: 30px;\">\n        <h2 class=\"roseo-step-title\" style=\"font-size: 28px; color: var(--mfm-primary); margin-bottom: 10px;\">\n            <i class=\"fas fa-solar-panel\"><\/i>\n            Configuration        <\/h2>\n        <p style=\"color: var(--mfm-text); font-size: 16px;\">Configure the details of your installation<\/p>\n            <\/div>\n    <script>\n    window.ITEM_TEXTS = {\"pendiente\":\"Action required\",\"completado\":\"Completed\",\"guardar\":\"Save\",\"cancelar\":\"Cancel\",\"guardar_poligono\":\"Save Polygon\",\"delimita_poligono\":\"Delimit your installation polygon\",\"poligono_guardado\":\"Polygon saved successfully.\",\"poligono_cubierta_guardado\":\"Roof polygon saved.\",\"poligono_terreno_guardado\":\"Land polygon saved.\",\"poligono_fv_guardado\":\"Polygon of photovoltaic panesl saved.\",\"completa_datos\":\"Complete the additional data.\",\"ubicacion_guardada\":\"Site successfully registered.\",\"potencia_requerida\":\"Please indicate the installed photovoltaic power.\",\"bateria_requerida\":\"Select a battery option.\",\"capacidad_requerida\":\"Indicate the battery capacity.\",\"consumo_requerido\":\"Select a consumption type.\",\"factura_requerida\":\"Please attach the invoice.\",\"valor_consumo_requerido\":\"Indicate the consumption value.\",\"ubicacion_mini_requerida\":\"Select where you will install the mini wind turbine.\",\"tipologia_cubierta_requerida\":\"Please select a roof typology\",\"poligono_cubierta_requerido\":\"You must draw the roof polygon.\",\"poligono_terreno_requerido\":\"You must draw the land polygon.\",\"poligonos_ambos_requeridos\":\"You must draw both polygons (roof and land).\",\"potencia_obligatoria\":\"Photovoltaic power is required\",\"poligono_fv_requerido\":\"You must draw the photovoltaic polygon\",\"baterias_requeridas\":\"You must indicate if you have batteries\",\"capacidad_obligatoria\":\"Battery capacity is required\",\"consumo_obligatorio\":\"You must indicate your consumption type\",\"valor_obligatorio\":\"Consumption value is required\",\"factura_obligatoria\":\"You must upload the invoice\",\"ubicacion_mini_obligatoria\":\"You must select where you will install the mini wind turbine\",\"tipologia_obligatoria\":\"Roof typology is required\",\"poligonos_requeridos\":\"You must draw both polygons\",\"confirmar_salir\":\"Warning! You have unsaved changes that will be lost\",\"mapa_instrucciones_dibujar\":\"Draw the mini wind turbine installation polygon(s):\",\"sin_poligonos\":\"No area has been defined. Please draw a polygon on the map.\",\"ubicaciones_guardadas\":\"Already saved locations\",\"puedes_anadir_mas\":\"Add new locations to perform a comparison\",\"tab_consumo_titulo\":\"Consumption\",\"tab_consumo_desc\":\"Indicate your electricity consumption\",\"volver_hub\":\"Back to Locations Hub\",\"tipo_fv_ampliar_mini\":\"I have photovoltaic and want mini-wind\",\"tipo_solo_mini\":\"Mini-wind only\",\"tipo_mini_fv\":\"Mini wind + Photovoltaic\",\"tipo_solo_fv\":\"Photovoltaic only\",\"mapa_titulo_modal\":\"Delimit your Installation Polygon\",\"mapa_btn_cancelar\":\"Cancel\",\"mapa_btn_guardar\":\"Save Polygon\",\"mapa_status_default\":\"Draw the polygon of your installation\",\"mapa_paso_1\":\"Search location:\",\"mapa_paso_1_desc\":\"Use the search bar at the top right\",\"mapa_paso_2\":\"Position:\",\"mapa_paso_2_desc\":\"Drag the map and use scroll to zoom\",\"mapa_paso_3\":\"Draw:\",\"mapa_paso_3_desc\":\"Click on the draw icon (left) and mark vertices\",\"mapa_paso_4\":\"Edit:\",\"mapa_paso_4_desc\":\"Use pencil to move points or select trash icon to delete the geometry\",\"consumo_label_euros_mes\":\"Monthly cost (\u20ac)\",\"consumo_label_euros_anio\":\"Annual cost (\u20ac)\",\"consumo_label_kwh_mes\":\"Monthly consumption (kWh)\",\"consumo_label_kwh_anio\":\"Annual consumption (kWh)\",\"consumo_label_valor\":\"Value\"};\n    (function() {\n        const titulos = {\n            'fv_ampliar_mini': window.ITEM_TEXTS.tipo_fv_ampliar_mini,\n            'solo_mini': window.ITEM_TEXTS.tipo_solo_mini,\n            'mini_fv': window.ITEM_TEXTS.tipo_mini_fv,\n            'solo_fv': window.ITEM_TEXTS.tipo_solo_fv\n        };\n        const iconos = {\n            'fv_ampliar_mini': 'fa-solar-panel',\n            'solo_mini': 'fa-wind',\n            'mini_fv': 'fa-wind',\n            'solo_fv': 'fa-solar-panel'\n        };\n        window.actualizarHeaderItem = function() {\n            let tipo = '';\n            if (window.RoseoStateV2 && typeof window.RoseoStateV2.getState === 'function') {\n                const state = window.RoseoStateV2.getState();\n                tipo = (state.current_location && state.current_location.tipo_instalacion) ||\n                       (state.form && state.form.tipo_instalacion) || '';\n            }\n            if (!tipo && window.itemData) {\n                tipo = window.itemData.tipo_instalacion || '';\n            }\n            if (!tipo) {\n                tipo = window.roseoTipoInstalacion || '';\n            }\n            if (tipo && titulos[tipo]) {\n                const headerTitle = document.querySelector('.item-wrapper .roseo-step-title');\n                if (headerTitle) {\n                    const icono = iconos[tipo] || 'fa-cogs';\n                    headerTitle.innerHTML = '<i class=\"fas ' + icono + '\"><\/i> ' + titulos[tipo];\n                }\n            }\n        };\n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', function() { \n                setTimeout(window.actualizarHeaderItem, 150); \n            });\n        } else {\n            setTimeout(window.actualizarHeaderItem, 150);\n        }\n        if (window.RoseoStateV2 && typeof window.RoseoStateV2.onReady === 'function') {\n            window.RoseoStateV2.onReady(window.actualizarHeaderItem);\n        }\n        if (typeof jQuery !== 'undefined') {\n            jQuery(document).on('roseo:step-changed', function(e, detail) {\n                if (detail && detail.current_state === 'step_3_item') {\n                    setTimeout(window.actualizarHeaderItem, 100);\n                }\n            });\n        }\n        document.addEventListener('roseo:step-shown', function(e) {\n            if (e.detail && e.detail.step === 'step_3_item') {\n                setTimeout(window.actualizarHeaderItem, 100);\n            }\n        });\n    })();\n    <\/script>\n        <div id=\"contador-ubicaciones\" style=\"margin-top:16px; padding:12px 20px; background:#f0fdf4; border-radius:8px; border:2px solid var(--mfm-secondary); display:none;\">\n            <i class=\"fas fa-check-circle\" style=\"color:var(--mfm-secondary);\"><\/i>\n            <strong style=\"color:var(--mfm-primary);\">Already saved locations: <span id=\"total-ubicaciones\">0<\/span><\/strong>\n                    <\/div>\n    <\/div>\n    <div id=\"tab-consumo-general-container\" style=\"display: none;\">\n        <div class=\"item-tab active\" id=\"tab-consumo-general\" data-tab=\"consumo-general\">\n            <div class=\"item-tab-header\" onclick=\"toggleTab('consumo-general')\">\n                <div class=\"item-tab-left\">\n                    <div class=\"item-tab-number\">1<\/div>\n                    <div class=\"item-tab-title\">\n                        <h3><i class=\"fas fa-bolt\"><\/i> Consumption<\/h3>\n                        <p>Indicate your electricity consumption<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"item-tab-right\">\n                    <span class=\"item-tab-status\">Action required<\/span>\n                    <i class=\"fas fa-chevron-down item-tab-icon\"><\/i>\n                <\/div>\n            <\/div>\n            <div class=\"item-tab-body\">\n                <div class=\"item-tab-content\">\n                    <div id=\"tab-general-consumo-content\" class=\"consumo-component-content\">\n    <div class=\"item-cards\" style=\"grid-template-columns: repeat(3, 1fr);\">\n        <div class=\"item-card\" onclick=\"seleccionarTipoConsumo_general('euros_mes')\" data-value=\"euros_mes\">\n            <div class=\"item-card-icon\"><i class=\"fas fa-euro-sign\"><\/i><\/div>\n            <div class=\"item-card-title\">\u20ac\/month<\/div>\n            <div class=\"item-card-desc\">Monthly cost in euros<\/div>\n        <\/div>\n        <div class=\"item-card\" onclick=\"seleccionarTipoConsumo_general('euros_anio')\" data-value=\"euros_anio\">\n            <div class=\"item-card-icon\"><i class=\"fas fa-calendar-alt\"><\/i><\/div>\n            <div class=\"item-card-title\">\u20ac\/year<\/div>\n            <div class=\"item-card-desc\">Annual cost in euros<\/div>\n        <\/div>\n        <div class=\"item-card\" onclick=\"seleccionarTipoConsumo_general('kwh_mes')\" data-value=\"kwh_mes\">\n            <div class=\"item-card-icon\"><i class=\"fas fa-bolt\"><\/i><\/div>\n            <div class=\"item-card-title\">kWh\/month<\/div>\n            <div class=\"item-card-desc\">Monthly consumption<\/div>\n        <\/div>\n        <div class=\"item-card\" onclick=\"seleccionarTipoConsumo_general('kwh_anio')\" data-value=\"kwh_anio\">\n            <div class=\"item-card-icon\"><i class=\"fas fa-chart-line\"><\/i><\/div>\n            <div class=\"item-card-title\">kWh\/year<\/div>\n            <div class=\"item-card-desc\">Annual consumption<\/div>\n        <\/div>\n        <div class=\"item-card\" onclick=\"seleccionarTipoConsumo_general('no_se')\" data-value=\"no_se\">\n            <div class=\"item-card-icon\"><i class=\"fas fa-question-circle\"><\/i><\/div>\n            <div class=\"item-card-title\">I don\\&#039;t know<\/div>\n            <div class=\"item-card-desc\">I don\\&#039;t have this data<\/div>\n        <\/div>\n        <div class=\"item-card\" onclick=\"seleccionarTipoConsumo_general('factura')\" data-value=\"factura\">\n            <div class=\"item-card-icon\"><i class=\"fas fa-file-invoice\"><\/i><\/div>\n            <div class=\"item-card-title\">Attach Bill<\/div>\n            <div class=\"item-card-desc\">Upload electricity bill<\/div>\n        <\/div>\n    <\/div>\n    <div class=\"item-field hidden\" id=\"field-valor-consumo-general\">\n        <label id=\"label-consumo-general\"><i class=\"fas fa-bolt\"><\/i> Consumption Value<\/label>\n        <input type=\"number\" \n               id=\"input-valor-consumo-general\" \n               placeholder=\"Enter value\"\n               step=\"1\"\n               min=\"0\">\n    <\/div>\n    <div class=\"item-field hidden\" id=\"field-factura-general\">\n        <label><i class=\"fas fa-file-pdf\"><\/i> Electricity bill (PDF)<\/label>\n        <input type=\"file\" \n               id=\"input-factura-pdf-general\" \n               accept=\".pdf,image\/*\"\n               onchange=\"procesarFactura_general(this)\">\n        <small style=\"color: var(--mfm-text); display: block; margin-top: 5px;\">\n            Admitted formats: PDF, JPG, PNG (max. 5MB)        <\/small>\n    <\/div>\n    <div class=\"item-btn-group\">\n        <button type=\"button\" class=\"item-btn item-btn-primary hidden\" onclick=\"guardarTabConsumo_general(); return false;\" id=\"btn-guardar-consumo-general\">\n            <i class=\"fas fa-check\"><\/i> Save Consumption        <\/button>\n    <\/div>\n<\/div>\n<script>\n(function() {\n    const componentId = 'general';\n    const nextTab = 'ubicacion';\n    const onCompleteCallback = '';\n    const labels = {\"euros_mes\":{\"icon\":\"fa-euro-sign\",\"text\":\"Monthly cost (\u20ac)\",\"placeholder\":\"E.g.: 120\"},\"euros_anio\":{\"icon\":\"fa-euro-sign\",\"text\":\"Annual cost (\u20ac)\",\"placeholder\":\"E.g.: 1440\"},\"kwh_mes\":{\"icon\":\"fa-bolt\",\"text\":\"Monthly consumption (kWh)\",\"placeholder\":\"E.g.: 1000\"},\"kwh_anio\":{\"icon\":\"fa-chart-line\",\"text\":\"Annual consumption (kWh)\",\"placeholder\":\"E.g.: 12000\"}};\n    const alertTipo = 'Please select a consumption type';\n    const alertValor = 'Please enter the consumption value';\n    const alertFactura = 'Please upload the bill';\n    const alertArchivoTipo = 'Please select a PDF or image file (JPG, PNG)';\n    const alertArchivoGrande = 'File is too large. Maximum 5MB.';\n    window['seleccionarTipoConsumo_' + componentId] = function(tipo) {\n        const container = document.getElementById('tab-' + componentId + '-consumo-content');\n        container.querySelectorAll('.item-card').forEach(card => {\n            card.classList.remove('selected');\n        });\n        const selectedCard = container.querySelector('.item-card[data-value=\"' + tipo + '\"]');\n        if (selectedCard) selectedCard.classList.add('selected');\n        if (window.itemData) {\n            window.itemData.tipo_consumo = tipo;\n        }\n        const fieldValor = document.getElementById('field-valor-consumo-' + componentId);\n        const fieldFactura = document.getElementById('field-factura-' + componentId);\n        const btnGuardar = document.getElementById('btn-guardar-consumo-' + componentId);\n        const labelConsumo = document.getElementById('label-consumo-' + componentId);\n        const inputValor = document.getElementById('input-valor-consumo-' + componentId);\n        fieldValor.classList.add('hidden');\n        fieldFactura.classList.add('hidden');\n        btnGuardar.classList.add('hidden');\n        if (labels[tipo]) {\n            labelConsumo.innerHTML = '<i class=\"fas ' + labels[tipo].icon + '\"><\/i> ' + labels[tipo].text;\n            inputValor.placeholder = labels[tipo].placeholder;\n            fieldValor.classList.remove('hidden');\n            btnGuardar.classList.remove('hidden');\n        } else if (tipo === 'no_se') {\n            btnGuardar.classList.remove('hidden');\n            setTimeout(function() {\n                window['guardarTabConsumo_' + componentId]();\n            }, 300);\n        } else if (tipo === 'factura') {\n            fieldFactura.classList.remove('hidden');\n            btnGuardar.classList.remove('hidden');\n        }\n    };\n    window['procesarFactura_' + componentId] = function(input) {\n        const file = input.files[0];\n        if (!file) return;\n        const validTypes = ['application\/pdf', 'image\/jpeg', 'image\/png', 'image\/jpg'];\n        if (!validTypes.includes(file.type)) {\n            alert(alertArchivoTipo);\n            input.value = '';\n            return;\n        }\n        if (file.size > 5 * 1024 * 1024) {\n            alert(alertArchivoGrande);\n            input.value = '';\n            return;\n        }\n        const reader = new FileReader();\n        reader.onload = function(e) {\n            if (window.itemData) {\n                window.itemData.factura_pdf = e.target.result;\n                window.itemData.factura_nombre = file.name;\n            }\n            const container = document.getElementById('field-factura-' + componentId);\n            let successMsg = container.querySelector('.factura-success');\n            if (!successMsg) {\n                successMsg = document.createElement('div');\n                successMsg.className = 'factura-success';\n                successMsg.style.cssText = 'color: green; margin-top: 10px;';\n                container.appendChild(successMsg);\n            }\n            successMsg.innerHTML = '<i class=\"fas fa-check-circle\"><\/i> Archivo seleccionado: ' + file.name;\n        };\n        reader.readAsDataURL(file);\n    };\n    window['guardarTabConsumo_' + componentId] = function() {\n        const tipo = window.itemData ? window.itemData.tipo_consumo : null;\n        if (!tipo) {\n            alert(alertTipo);\n            return;\n        }\n        const tiposConValor = ['euros_mes', 'euros_anio', 'kwh_mes', 'kwh_anio'];\n        if (tiposConValor.includes(tipo)) {\n            const inputValor = document.getElementById('input-valor-consumo-' + componentId);\n            const valor = inputValor ? inputValor.value : '';\n            if (!valor || parseFloat(valor) <= 0) {\n                alert(alertValor);\n                return;\n            }\n            if (window.itemData) {\n                window.itemData.valor_consumo = valor;\n            }\n        } else if (tipo === 'factura') {\n            if (!window.itemData || !window.itemData.factura_pdf) {\n                alert(alertFactura);\n                return;\n            }\n        }\n        if (window.RoseoStateV2) {\n            window.RoseoStateV2.setLocationField('tipo_consumo', tipo);\n            window.RoseoStateV2.setLocationField('valor_consumo', window.itemData ? window.itemData.valor_consumo || '' : '');\n            window.RoseoStateV2.setLocationField('factura_pdf', window.itemData ? window.itemData.factura_pdf || '' : '');\n        }\n        if (typeof marcarTabCompleto === 'function') {\n            marcarTabCompleto('consumo');\n        }\n        if (onCompleteCallback && typeof window[onCompleteCallback] === 'function') {\n            window[onCompleteCallback]();\n        } else if (nextTab && typeof abrirSiguienteTab === 'function') {\n            abrirSiguienteTab('consumo');\n        } else if (typeof abrirSiguienteTab === 'function') {\n            abrirSiguienteTab('consumo');\n        }\n    };\n})();\n<\/script>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div id=\"componente-fotovoltaica\" style=\"display: none;\">\n                <div class=\"component-fotovoltaica\" data-component=\"fotovoltaica\">\n            <div class=\"item-header\">\n                <h2>Fotovoltaica Existente<\/h2>\n                <span class=\"tipo-badge\">\n                    <i class=\"fas fa-solar-panel\"><\/i> Fotovoltaica Existente                <\/span>\n            <\/div>\n            <div class=\"item-tabs\" id=\"fotovoltaica-tabs\">\n                                            <div class=\"item-tab\" id=\"tab-fv\" data-tab=\"fv\">\n            <div class=\"item-tab-header\" onclick=\"toggleTab('fv')\">\n                <div class=\"item-tab-left\">\n                    <div class=\"item-tab-number\">1<\/div>\n                    <div class=\"item-tab-title\">\n                        <h3><i class=\"fas fa-solar-panel\"><\/i> Photovoltaic power<\/h3>\n                        <p>Indica la potencia de la instalaci\u00f3n fotovoltaica que tienes instalada<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"item-tab-right\">\n                    <span class=\"item-tab-status\">Action required<\/span>\n                    <i class=\"fas fa-chevron-down item-tab-icon\"><\/i>\n                <\/div>\n            <\/div>\n            <div class=\"item-tab-body\">\n                <div class=\"item-tab-content\">\n                            <div id=\"tab-fv-content\">\n            <div class=\"item-field show\">\n                <label><i class=\"fas fa-bolt\"><\/i> Photovoltaic power (kWp)<\/label>\n                <input type=\"number\" \n                       id=\"input-potencia-fv\" \n                       placeholder=\"E.g.: 10\"\n                       step=\"0.5\"\n                       min=\"0\">\n                <small style=\"color: var(--mfm-text); display: block; margin-top: 5px;\">\n                    Indica la potencia de la instalaci\u00f3n fotovoltaica que tienes instalada                <\/small>\n            <\/div>\n            <div class=\"item-field show\" style=\"margin-top: 20px;\">\n                <label><i class=\"fas fa-map-marked-alt\"><\/i> Ubicaci\u00f3n de tu FV existente<\/label>\n                <input type=\"hidden\" id=\"input-mapaFotovoltaica\" name=\"geojson_fv\">\n<div class=\"mapa-button-container\" style=\"display: block !important; margin-top: 10px;\">\n    <button type=\"button\" class=\"btn-abrir-mapa\" onclick=\"abrirMapa_mapaFotovoltaica(); return false;\" style=\"display: inline-flex !important;\">\n        <i class=\"fas fa-map-marked-alt\"><\/i> Marcar ubicaci\u00f3n FV existente    <\/button>\n<\/div>\n<div id=\"resumen-mapaFotovoltaica\" class=\"mapa-resumen\" style=\"display:none;\">\n    <div class=\"mapa-resumen-preview\" id=\"preview-mapaFotovoltaica\">\n        <!-- Mini-mapa est\u00e1tico se insertar\u00e1 aqu\u00ed -->\n    <\/div>\n    <div class=\"mapa-resumen-info\">\n        <i class=\"fas fa-check-circle\"><\/i> \n        <span>Polygon drawn - Area: <strong id=\"area-texto-mapaFotovoltaica\">0<\/strong> ha<\/span>\n        <button type=\"button\" class=\"btn-reabrir\" onclick=\"abrirMapa_mapaFotovoltaica(); return false;\">\n            <i class=\"fas fa-edit\"><\/i> Edit        <\/button>\n    <\/div>\n<\/div>\n<style>\n.mapa-resumen {\n    display: flex !important;\n    flex-direction: column;\n    gap: 10px;\n    margin-top: 10px;\n    padding: 12px;\n    background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);\n    border-radius: 12px;\n    border: 1px solid var(--mfm-border, #ddd);\n}\n.mapa-resumen-preview {\n    width: 100%;\n    height: 120px;\n    border-radius: 8px;\n    overflow: hidden;\n    background: #eee;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n.mapa-resumen-preview img {\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n}\n.mapa-resumen-preview .preview-placeholder {\n    color: #999;\n    font-size: 12px;\n}\n.mapa-resumen-info {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    flex-wrap: wrap;\n}\n.mapa-resumen-info i.fa-check-circle {\n    color: var(--mfm-secondary, #009239);\n    font-size: 18px;\n}\n.mapa-resumen-info span {\n    flex: 1;\n    font-size: 14px;\n}\n.btn-reabrir {\n    padding: 6px 12px;\n    font-size: 12px;\n    background: var(--mfm-primary, #015328);\n    color: white;\n    border: none;\n    border-radius: 6px;\n    cursor: pointer;\n    transition: background 0.2s;\n}\n.btn-reabrir:hover {\n    background: var(--mfm-secondary, #009239);\n}\n@media (min-width: 480px) {\n    .mapa-resumen {\n        flex-direction: row;\n        align-items: stretch;\n    }\n    .mapa-resumen-preview {\n        width: 160px;\n        height: auto;\n        min-height: 100px;\n        flex-shrink: 0;\n    }\n    .mapa-resumen-info {\n        flex: 1;\n    }\n}\n<\/style>\n<div id=\"modal-mapaFotovoltaica\" class=\"mapa-modal-fullscreen\">\n    <div class=\"mapa-modal-header\">\n        <div class=\"header-top\">\n            <h3><i class=\"fas fa-map-marked-alt\"><\/i> Indica d\u00f3nde est\u00e1 tu instalaci\u00f3n fotovoltaica actual<\/h3>\n            <button type=\"button\" class=\"modal-close\" onclick=\"cerrarMapa_mapaFotovoltaica(); return false;\">&times;<\/button>\n        <\/div>\n        <div class=\"header-instrucciones\">\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-search-location\"><\/i>\n                <span><strong>1.<\/strong> Search for your location<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-draw-polygon\"><\/i>\n                <span><strong>2.<\/strong> Click on the polygon button (top left)<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-mouse-pointer\"><\/i>\n                <span><strong>3.<\/strong> Click on the map to create each vertex<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-check-circle\"><\/i>\n                <span><strong>4.<\/strong> Double click to close the polygon<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-trash\"><\/i>\n                <span><strong>5.<\/strong> Use the trash icon to delete and redraw<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div class=\"mapa-modal-body\">\n        <div id=\"mapaFotovoltaica\" class=\"mapa-container-full\"><\/div>\n        <div id=\"status-mapaFotovoltaica\" class=\"mapa-status\">\n            <i class=\"fas fa-info-circle\"><\/i> Draw your installation polygon        <\/div>\n    <\/div>\n    <div class=\"mapa-modal-footer\">\n        <div class=\"footer-stats\">\n            <span id=\"stats-mapaFotovoltaica\">Area: <strong>0<\/strong> ha<\/span>\n        <\/div>\n        <div class=\"footer-actions\">\n            <button type=\"button\" class=\"btn-cancelar\" onclick=\"cerrarMapa_mapaFotovoltaica(); return false;\">\n                <i class=\"fas fa-times\"><\/i> Cancel            <\/button>\n            <button type=\"button\" id=\"btn-guardar-mapaFotovoltaica\" class=\"btn-guardar\" onclick=\"guardarMapa_mapaFotovoltaica(); return false;\" disabled>\n                <i class=\"fas fa-save\"><\/i> Save polygon            <\/button>\n        <\/div>\n    <\/div>\n<\/div>\n<script>\nif (!window.RoseoMapManager) {\n    window.RoseoMapManager = {\n        map: null,\n        draw: null,\n        currentPolygon: null,\n        lastAddress: null,\n        lastMapPosition: null, \/\/ \u2705 FIX: Guardar \u00faltima posici\u00f3n del mapa\n        \n        \/\/ \u2705 FIX: Funci\u00f3n para obtener la \u00faltima posici\u00f3n guardada\n        getLastPosition: function() {\n            \/\/ 1. Primero intentar desde memoria\n            if (this.lastMapPosition) {\n                return this.lastMapPosition;\n            }\n            \/\/ 2. Luego desde sessionStorage\n            try {\n                const saved = sessionStorage.getItem('roseo_last_map_position');\n                if (saved) {\n                    return JSON.parse(saved);\n                }\n            } catch (e) {}\n            \/\/ 3. Default: Portugalete\n            return null;\n        },\n        \n        \/\/ \u2705 FIX: Funci\u00f3n para guardar la posici\u00f3n actual\n        saveCurrentPosition: function() {\n            if (!this.map) return;\n            const center = this.map.getCenter();\n            const zoom = this.map.getZoom();\n            this.lastMapPosition = {\n                center: [center.lng, center.lat],\n                zoom: zoom\n            };\n            try {\n                sessionStorage.setItem('roseo_last_map_position', JSON.stringify(this.lastMapPosition));\n            } catch (e) {}\n            console.log('[MAP] Posici\u00f3n guardada:', this.lastMapPosition);\n        },\n        \n        init: function(containerId, options = {}) {\n            \/\/ \u2705 FIX: Usar \u00faltima posici\u00f3n guardada si existe\n            const lastPos = this.getLastPosition();\n            const defaults = {\n                center: lastPos ? lastPos.center : [-3.022731543334405, 43.327417650863055],\n                zoom: lastPos ? lastPos.zoom : 14,\n                fieldId: 'item-geojson'\n            };\n            const config = { ...defaults, ...options };\n            const MAPBOX_TOKEN = 'pk.eyJ1IjoiY2J1c3RhbWEiLCJhIjoiY21tdzM2ajkwMmdvMDJwc2I4cXgxeDhqcCJ9.WNQRvG6BOPVp6ucyQXLkAA';\n            mapboxgl.accessToken = MAPBOX_TOKEN;\n            this.map = new mapboxgl.Map({\n                container: containerId,\n                style: 'mapbox:\/\/styles\/mapbox\/satellite-v9',\n                center: config.center,\n                zoom: config.zoom\n            });\n            \n            \/\/ \u2705 FIX: Guardar posici\u00f3n cuando el usuario mueve el mapa\n            this.map.on('moveend', () => {\n                this.saveCurrentPosition();\n            });\n            \n            const geocoder = new MapboxGeocoder({\n                accessToken: mapboxgl.accessToken,\n                mapboxgl: mapboxgl,\n                placeholder: 'Search address...',\n                countries: 'es',\n                language: 'es',\n                marker: { color: '#009239' },\n                flyTo: { speed: 1.2, zoom: 18, essential: true }\n            });\n            geocoder.on('result', (e) => {\n                if (e && e.result) {\n                    this.lastAddress = e.result.place_name || e.result.text;\n                    \/\/ \u2705 FIX: Guardar posici\u00f3n despu\u00e9s de b\u00fasqueda\n                    setTimeout(() => this.saveCurrentPosition(), 1500);\n                }\n            });\n            this.map.addControl(geocoder, 'top-right');\n            this.draw = new MapboxDraw({\n                displayControlsDefault: false,\n                controls: { polygon: true, trash: true },\n                styles: [\n                    {\n                        'id': 'gl-draw-polygon-fill-active',\n                        'type': 'fill',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'true']],\n                        'paint': { 'fill-color': '#B3C8BB', 'fill-opacity': 0.4 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-stroke-active',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'true']],\n                        'paint': { 'line-color': '#009239', 'line-width': 3 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-fill-inactive',\n                        'type': 'fill',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'false']],\n                        'paint': { 'fill-color': '#B3C8BB', 'fill-opacity': 0.4 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-stroke-inactive',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'false']],\n                        'paint': { 'line-color': '#009239', 'line-width': 3 }\n                    },\n                    {\n                        'id': 'gl-draw-line-active',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'LineString'], ['==', 'active', 'true']],\n                        'paint': { 'line-color': '#009239', 'line-width': 2 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-and-line-vertex-active',\n                        'type': 'circle',\n                        'filter': ['all', ['==', 'meta', 'vertex'], ['==', '$type', 'Point']],\n                        'paint': { 'circle-radius': 5, 'circle-color': '#009239' }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-midpoint',\n                        'type': 'circle',\n                        'filter': ['all', ['==', 'meta', 'midpoint'], ['==', '$type', 'Point']],\n                        'paint': { 'circle-radius': 3, 'circle-color': '#54595F' }\n                    }\n                ]\n            });\n            this.map.addControl(this.draw, 'top-left');\n            this.map.on('draw.create', (e) => {\n                if (this.currentPolygon) this.draw.delete(this.currentPolygon);\n                this.currentPolygon = e.features[0].id;\n            });\n            this.map.on('draw.delete', () => {\n                this.currentPolygon = null;\n            });\n            this.fieldId = config.fieldId;\n            return this;\n        },\n        getGeoJSON: function() {\n            const allFeatures = this.draw.getAll();\n            if (allFeatures.features.length === 0) {\n                return {\n                    type: \"FeatureCollection\",\n                    features: [],\n                    metadata: {\n                        total_polygons: 0,\n                        center_location: null,\n                        total_area_ha: 0\n                    }\n                };\n            }\n            const feature = allFeatures.features[0];\n            const coords = feature.geometry.coordinates[0];\n            let sumLng = 0, sumLat = 0;\n            coords.forEach(coord => {\n                sumLng += coord[0];\n                sumLat += coord[1];\n            });\n            const centerLng = sumLng \/ coords.length;\n            const centerLat = sumLat \/ coords.length;\n            let area = 0;\n            for (let i = 0; i < coords.length - 1; i++) {\n                const j = (i + 1);\n                area += coords[i][0] * coords[j][1];\n                area -= coords[j][0] * coords[i][1];\n            }\n            area = Math.abs(area \/ 2.0);\n            const areaM2 = area * 111000 * 111000;\n            feature.properties = {\n                created_at: new Date().toISOString(),\n                center_lat: centerLat,\n                center_lng: centerLng,\n                area_m2: Math.round(areaM2),\n                area_ha: (areaM2 \/ 10000).toFixed(2),\n                address: this.lastAddress || ''\n            };\n            return {\n                type: \"FeatureCollection\",\n                features: [feature],\n                metadata: {\n                    total_polygons: 1,\n                    center_location: [centerLat, centerLng],\n                    total_area_ha: (areaM2 \/ 10000).toFixed(2)\n                }\n            };\n        },\n        getPolygonCount: function() {\n            return this.currentPolygon ? 1 : 0;\n        },\n        clearAll: function() {\n            if (this.draw) {\n                this.draw.deleteAll();\n            }\n            this.currentPolygon = null;\n        },\n        resize: function() {\n            if (this.map) {\n                setTimeout(() => this.map.resize(), 100);\n            }\n        },\n        destroy: function() {\n            if (this.draw) {\n                this.map.removeControl(this.draw);\n                this.draw = null;\n            }\n            if (this.map) {\n                this.map.remove();\n                this.map = null;\n            }\n            this.currentPolygon = null;\n        }\n    };\n}\n(function(){\nconst mapId='mapaFotovoltaica';\nconst callbackFn='onMapaFVGuardado';\nif (!window.RoseoMapInstances) {\n    window.RoseoMapInstances = {};\n}\nwindow['abrirMapa_'+mapId]=function(){\n    document.getElementById('modal-'+mapId).classList.add('show');\n    setTimeout(function(){\n        if(!window.RoseoMapManager){\n            return;\n        }\n        \n        if(!window.RoseoMapInstances[mapId]){\n            window.RoseoMapInstances[mapId] = Object.create(window.RoseoMapManager);\n            \/\/ \u2705 FIX: Usar \u00faltima posici\u00f3n guardada del mapa\n            const lastPos = window.RoseoMapManager.getLastPosition();\n            window.RoseoMapInstances[mapId].init(mapId,{\n                center: lastPos ? lastPos.center : [-3.022731543334405, 43.327417650863055],\n                zoom: lastPos ? lastPos.zoom : 14,\n                fieldId:'input-'+mapId\n            });\n            if (window.RoseoMapInstances[mapId].map) {\n                window.RoseoMapInstances[mapId].map.on('load', function() {\n                    setTimeout(function() {\n                        window.RoseoMapInstances[mapId].map.resize();\n                    }, 100);\n                });\n            }\n        }else{\n            \/\/ \u2705 FIX: NO borrar pol\u00edgono existente al reabrir - solo redimensionar\n            window.RoseoMapInstances[mapId].resize();\n            setTimeout(function() {\n                window.RoseoMapInstances[mapId].resize();\n            }, 300);\n        }\n        actualizarEstado(null);\n    },200);\n};\nwindow['cerrarMapa_'+mapId]=function(){\n    const poligonos=window.RoseoMapInstances[mapId]?window.RoseoMapInstances[mapId].getPolygonCount():0;\n    if(poligonos>0&&!document.getElementById('input-'+mapId).value){\n        if(!confirm('Warning! You are going to leave without saving the polygon'))return;\n    }\n    if(window.RoseoMapInstances[mapId]){\n        window.RoseoMapInstances[mapId].clearAll();\n    }\n    document.getElementById('modal-'+mapId).classList.remove('show');\n};\nwindow['guardarMapa_'+mapId]=function(){\n    const mapInstance = window.RoseoMapInstances[mapId];\n    if(!mapInstance || mapInstance.getPolygonCount()===0){\n        alert('Please draw the polygon on the map.');\n        return;\n    }\n    const featureCollection=mapInstance.getGeoJSON();\n    const f=featureCollection.features[0];\n    const areaHa=f.properties.area_ha;\n    const geojsonStr=JSON.stringify(f);\n    \n    document.getElementById('input-'+mapId).value=geojsonStr;\n    document.getElementById('area-texto-'+mapId).textContent=areaHa;\n    document.getElementById('resumen-'+mapId).style.display='flex';\n    \n    \/\/ \u2705 Generar mini-mapa est\u00e1tico con Mapbox Static Images API\n    generarMiniMapa(mapId, f);\n    \n    document.getElementById('modal-'+mapId).classList.remove('show');\n    const fieldName = 'geojson_fv';\n    if (window.itemData && fieldName) {\n        window.itemData[fieldName] = geojsonStr;\n    }\n    document.dispatchEvent(new CustomEvent('mapa-poligono-completado',{\n        detail:{\n            mapId:mapId,\n            area_ha:areaHa,\n            geojson:featureCollection,\n            feature:f\n        }\n    }));\n    if(callbackFn&&typeof window[callbackFn]==='function'){\n        window[callbackFn](featureCollection,f,areaHa);\n    }\n};\n\n\/\/ \u2705 FIX: Funci\u00f3n para generar mini-mapa est\u00e1tico\nfunction generarMiniMapa(mapId, feature) {\n    const previewEl = document.getElementById('preview-' + mapId);\n    if (!previewEl) return;\n    \n    try {\n        const coords = feature.geometry.coordinates[0];\n        const center = [feature.properties.center_lng, feature.properties.center_lat];\n        \n        \/\/ Calcular el bounding box para zoom apropiado\n        let minLng = coords[0][0], maxLng = coords[0][0];\n        let minLat = coords[0][1], maxLat = coords[0][1];\n        coords.forEach(c => {\n            minLng = Math.min(minLng, c[0]);\n            maxLng = Math.max(maxLng, c[0]);\n            minLat = Math.min(minLat, c[1]);\n            maxLat = Math.max(maxLat, c[1]);\n        });\n        \n        \/\/ Calcular zoom basado en el tama\u00f1o del pol\u00edgono\n        const diffLng = maxLng - minLng;\n        const diffLat = maxLat - minLat;\n        const maxDiff = Math.max(diffLng, diffLat);\n        let zoom = 15;\n        if (maxDiff > 0.1) zoom = 10;\n        else if (maxDiff > 0.05) zoom = 11;\n        else if (maxDiff > 0.02) zoom = 12;\n        else if (maxDiff > 0.01) zoom = 13;\n        else if (maxDiff > 0.005) zoom = 14;\n        else zoom = 15;\n        \n        \/\/ Crear overlay GeoJSON para el pol\u00edgono\n        const geoJsonOverlay = encodeURIComponent(JSON.stringify({\n            type: 'Feature',\n            properties: {\n                'stroke': '#009239',\n                'stroke-width': 3,\n                'stroke-opacity': 1,\n                'fill': '#B3C8BB',\n                'fill-opacity': 0.4\n            },\n            geometry: feature.geometry\n        }));\n        \n        \/\/ Construir URL de Mapbox Static Images\n        const mapboxToken = 'pk.eyJ1IjoiY2J1c3RhbWEiLCJhIjoiY21tdzM2ajkwMmdvMDJwc2I4cXgxeDhqcCJ9.WNQRvG6BOPVp6ucyQXLkAA';\n        const staticUrl = `https:\/\/api.mapbox.com\/styles\/v1\/mapbox\/satellite-v9\/static\/geojson(${geoJsonOverlay})\/${center[0]},${center[1]},${zoom},0\/300x150@2x?access_token=${mapboxToken}`;\n        \n        \/\/ Crear elemento imagen\n        const img = document.createElement('img');\n        img.src = staticUrl;\n        img.alt = 'Vista previa del pol\u00edgono';\n        img.loading = 'lazy';\n        img.onerror = function() {\n            \/\/ Fallback: mostrar placeholder si falla\n            previewEl.innerHTML = '<div class=\"preview-placeholder\"><i class=\"fas fa-map\"><\/i> Pol\u00edgono guardado<\/div>';\n        };\n        \n        previewEl.innerHTML = '';\n        previewEl.appendChild(img);\n        \n    } catch (e) {\n        console.warn('[MiniMapa] Error generando preview:', e);\n        previewEl.innerHTML = '<div class=\"preview-placeholder\"><i class=\"fas fa-check-circle\"><\/i> Pol\u00edgono guardado<\/div>';\n    }\n}\nfunction actualizarEstado(feature){\n    const statusEl=document.getElementById('status-'+mapId);\n    const statsEl=document.getElementById('stats-'+mapId);\n    const btnGuardar=document.getElementById('btn-guardar-'+mapId);\n    const rootStyles = getComputedStyle(document.documentElement);\n    const primaryColor = rootStyles.getPropertyValue('--mfm-primary').trim() || '#015328';\n    const secondaryColor = rootStyles.getPropertyValue('--mfm-secondary').trim() || '#009239';\n    const textColor = rootStyles.getPropertyValue('--mfm-text').trim() || '#54595F';\n    const txtPoligonoDibujado = 'Polygon drawn';\n    const txtPuedesEditarlo = 'You can edit it';\n    const txtStatusInicial = 'Draw your installation polygon';\n    const txtAreaLabel = 'Area';\n    const txtHectareas = 'ha';\n    if(feature){\n        const areaHa=feature.properties.area_ha||'0.00';\n        statusEl.innerHTML='<i class=\"fas fa-check-circle\" style=\"color:'+secondaryColor+';\"><\/i> <strong>'+txtPoligonoDibujado+'<\/strong> - '+txtPuedesEditarlo;\n        statusEl.style.color=primaryColor;\n        statsEl.innerHTML=txtAreaLabel+': <strong>'+areaHa+'<\/strong> '+txtHectareas;\n        btnGuardar.disabled=false;\n    }else{\n        statusEl.innerHTML='<i class=\"fas fa-info-circle\"><\/i> '+txtStatusInicial;\n        statusEl.style.color=textColor;\n        statsEl.innerHTML=txtAreaLabel+': <strong>0<\/strong> '+txtHectareas;\n        btnGuardar.disabled=true;\n    }\n}\nsetInterval(function(){\n    const mapInstance=window.RoseoMapInstances[mapId];\n    if(mapInstance&&mapInstance.currentPolygon){\n        const geojson=mapInstance.getGeoJSON();\n        if(geojson.features.length>0){\n            actualizarEstado(geojson.features[0]);\n        }\n    }\n},500);\n})();\n<\/script>\n            <\/div>\n            <div class=\"item-btn-group\">\n                <button type=\"button\" class=\"item-btn item-btn-primary\" onclick=\"guardarTabFV(); return false;\">\n                    <i class=\"fas fa-arrow-right\"><\/i> Continuar                <\/button>\n            <\/div>\n        <\/div>\n        <script>\n        (function() {\n            const tabFVContent = document.getElementById('tab-fv-content');\n            if (tabFVContent) {\n                tabFVContent.querySelectorAll('.item-field').forEach(field => {\n                    if (!field.classList.contains('show')) {\n                        field.classList.add('show');\n                    }\n                });\n            }\n        })();\n        function guardarTabFV() {\n            const potencia = document.getElementById('input-potencia-fv').value;\n            if (!potencia || potencia <= 0) {\n                alert('Please indicate the installed photovoltaic power.');\n                return;\n            }\n            if (!window.itemData.poligonos_fv || window.itemData.poligonos_fv.length === 0) {\n                alert('Please draw at least one polygon on the map');\n                return;\n            }\n            window.itemData.potencia_fv = potencia;\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('potencia_fv', potencia);\n                window.RoseoStateV2.setPolygons('fv', window.itemData.poligonos_fv);\n            }\n            marcarTabCompleto('fv');\n            abrirSiguienteTab('fv');\n        }\n        <\/script>\n                        <\/div>\n            <\/div>\n        <\/div>\n                                                    <div class=\"item-tab\" id=\"tab-bateria\" data-tab=\"bateria\">\n            <div class=\"item-tab-header\" onclick=\"toggleTab('bateria')\">\n                <div class=\"item-tab-left\">\n                    <div class=\"item-tab-number\">2<\/div>\n                    <div class=\"item-tab-title\">\n                        <h3><i class=\"fas fa-battery-full\"><\/i> Battery system<\/h3>\n                        <p>Indica si ya dispones de bater\u00edas<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"item-tab-right\">\n                    <span class=\"item-tab-status\">Action required<\/span>\n                    <i class=\"fas fa-chevron-down item-tab-icon\"><\/i>\n                <\/div>\n            <\/div>\n            <div class=\"item-tab-body\">\n                <div class=\"item-tab-content\">\n                            <div id=\"tab-bateria-content\">\n            <div class=\"item-cards\">\n                <div class=\"item-card\" onclick=\"seleccionarBateria('si')\" data-value=\"si\">\n                    <div class=\"item-card-icon\"><i class=\"fas fa-battery-full\"><\/i><\/div>\n                    <div class=\"item-card-title\">Yes<\/div>\n                    <div class=\"item-card-desc\">Ya tengo sistema de almacenamiento<\/div>\n                <\/div>\n                <div class=\"item-card\" onclick=\"seleccionarBateria('no')\" data-value=\"no\">\n                    <div class=\"item-card-icon\"><i class=\"fas fa-battery-empty\"><\/i><\/div>\n                    <div class=\"item-card-title\">No<\/div>\n                    <div class=\"item-card-desc\">No tengo bater\u00edas instaladas<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"item-field hidden\" id=\"field-capacidad-bateria\">\n                <label><i class=\"fas fa-battery-three-quarters\"><\/i> Battery capacity (kWh)<\/label>\n                <input type=\"number\" \n                       id=\"input-capacidad-bateria\" \n                       placeholder=\"E.g.: 10\"\n                       step=\"0.5\"\n                       min=\"0\">\n            <\/div>\n            <div class=\"item-btn-group\">\n                <button type=\"button\" class=\"item-btn item-btn-primary hidden\" onclick=\"guardarTabBateria(); return false;\" id=\"btn-guardar-bateria\">\n                    <i class=\"fas fa-check\"><\/i> Save now Battery system                <\/button>\n            <\/div>\n        <\/div>\n        <script>\n        function seleccionarBateria(valor) {\n            const container = document.getElementById('tab-bateria-content');\n            if (!container) {\n                return;\n            }\n            document.querySelectorAll('#tab-bateria-content .item-card').forEach(card => {\n                card.classList.remove('selected');\n            });\n            const selectedCard = document.querySelector(`#tab-bateria-content .item-card[data-value=\"${valor}\"]`);\n            if (selectedCard) {\n                selectedCard.classList.add('selected');\n            } else {\n                return;\n            }\n            window.itemData.bateria = valor;\n            const fieldCapacidad = document.getElementById('field-capacidad-bateria');\n            const btnGuardar = document.getElementById('btn-guardar-bateria');\n            if (valor === 'si') {\n                fieldCapacidad.classList.remove('hidden');\n                fieldCapacidad.classList.add('show');\n                btnGuardar.classList.remove('hidden');\n            } else {\n                fieldCapacidad.classList.add('hidden');\n                fieldCapacidad.classList.remove('show');\n                window.itemData.capacidad_bateria = '';\n                setTimeout(() => guardarTabBateria(), 300);\n            }\n        }\n        function guardarTabBateria() {\n            if (window.itemData.bateria === 'si') {\n                const capacidad = document.getElementById('input-capacidad-bateria').value;\n                if (!capacidad || capacidad <= 0) {\n                    alert('Please indicate the battery capacity');\n                    return;\n                }\n                window.itemData.capacidad_bateria = capacidad;\n            }\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('bateria', window.itemData.bateria);\n                window.RoseoStateV2.setLocationField('capacidad_bateria', window.itemData.capacidad_bateria || '');\n            }\n            if (window.RoseoRouter && typeof window.RoseoRouter.saveField === 'function') {\n                window.RoseoRouter.saveField('bateria', window.itemData.bateria);\n                window.RoseoRouter.saveField('capacidad_bateria', window.itemData.capacidad_bateria || '');\n            }\n            marcarTabCompleto('bateria');\n            abrirSiguienteTab('bateria');\n        }\n        <\/script>\n                        <\/div>\n            <\/div>\n        <\/div>\n                                                    <div class=\"item-tab\" id=\"tab-consumo\" data-tab=\"consumo\">\n            <div class=\"item-tab-header\" onclick=\"toggleTab('consumo')\">\n                <div class=\"item-tab-left\">\n                    <div class=\"item-tab-number\">3<\/div>\n                    <div class=\"item-tab-title\">\n                        <h3><i class=\"fas fa-bolt\"><\/i> Consumption<\/h3>\n                        <p>Consumption Value<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"item-tab-right\">\n                    <span class=\"item-tab-status\">Action required<\/span>\n                    <i class=\"fas fa-chevron-down item-tab-icon\"><\/i>\n                <\/div>\n            <\/div>\n            <div class=\"item-tab-body\">\n                <div class=\"item-tab-content\">\n                    <div id=\"tab-fv-consumo-content\" class=\"consumo-component-content\">\n    <div class=\"item-cards\" style=\"grid-template-columns: repeat(3, 1fr);\">\n        <div class=\"item-card\" onclick=\"seleccionarTipoConsumo_fv('euros_mes')\" data-value=\"euros_mes\">\n            <div class=\"item-card-icon\"><i class=\"fas fa-euro-sign\"><\/i><\/div>\n            <div class=\"item-card-title\">\u20ac\/month<\/div>\n            <div class=\"item-card-desc\">Monthly cost in euros<\/div>\n        <\/div>\n        <div class=\"item-card\" onclick=\"seleccionarTipoConsumo_fv('euros_anio')\" data-value=\"euros_anio\">\n            <div class=\"item-card-icon\"><i class=\"fas fa-calendar-alt\"><\/i><\/div>\n            <div class=\"item-card-title\">\u20ac\/year<\/div>\n            <div class=\"item-card-desc\">Annual cost in euros<\/div>\n        <\/div>\n        <div class=\"item-card\" onclick=\"seleccionarTipoConsumo_fv('kwh_mes')\" data-value=\"kwh_mes\">\n            <div class=\"item-card-icon\"><i class=\"fas fa-bolt\"><\/i><\/div>\n            <div class=\"item-card-title\">kWh\/month<\/div>\n            <div class=\"item-card-desc\">Monthly consumption<\/div>\n        <\/div>\n        <div class=\"item-card\" onclick=\"seleccionarTipoConsumo_fv('kwh_anio')\" data-value=\"kwh_anio\">\n            <div class=\"item-card-icon\"><i class=\"fas fa-chart-line\"><\/i><\/div>\n            <div class=\"item-card-title\">kWh\/year<\/div>\n            <div class=\"item-card-desc\">Annual consumption<\/div>\n        <\/div>\n        <div class=\"item-card\" onclick=\"seleccionarTipoConsumo_fv('no_se')\" data-value=\"no_se\">\n            <div class=\"item-card-icon\"><i class=\"fas fa-question-circle\"><\/i><\/div>\n            <div class=\"item-card-title\">I don\\&#039;t know<\/div>\n            <div class=\"item-card-desc\">I don\\&#039;t have this data<\/div>\n        <\/div>\n        <div class=\"item-card\" onclick=\"seleccionarTipoConsumo_fv('factura')\" data-value=\"factura\">\n            <div class=\"item-card-icon\"><i class=\"fas fa-file-invoice\"><\/i><\/div>\n            <div class=\"item-card-title\">Attach Bill<\/div>\n            <div class=\"item-card-desc\">Upload electricity bill<\/div>\n        <\/div>\n    <\/div>\n    <div class=\"item-field hidden\" id=\"field-valor-consumo-fv\">\n        <label id=\"label-consumo-fv\"><i class=\"fas fa-bolt\"><\/i> Consumption Value<\/label>\n        <input type=\"number\" \n               id=\"input-valor-consumo-fv\" \n               placeholder=\"Enter value\"\n               step=\"1\"\n               min=\"0\">\n    <\/div>\n    <div class=\"item-field hidden\" id=\"field-factura-fv\">\n        <label><i class=\"fas fa-file-pdf\"><\/i> Electricity bill (PDF)<\/label>\n        <input type=\"file\" \n               id=\"input-factura-pdf-fv\" \n               accept=\".pdf,image\/*\"\n               onchange=\"procesarFactura_fv(this)\">\n        <small style=\"color: var(--mfm-text); display: block; margin-top: 5px;\">\n            Admitted formats: PDF, JPG, PNG (max. 5MB)        <\/small>\n    <\/div>\n    <div class=\"item-btn-group\">\n        <button type=\"button\" class=\"item-btn item-btn-primary hidden\" onclick=\"guardarTabConsumo_fv(); return false;\" id=\"btn-guardar-consumo-fv\">\n            <i class=\"fas fa-check\"><\/i> Save Consumption        <\/button>\n    <\/div>\n<\/div>\n<script>\n(function() {\n    const componentId = 'fv';\n    const nextTab = 'ubicacion';\n    const onCompleteCallback = '';\n    const labels = {\"euros_mes\":{\"icon\":\"fa-euro-sign\",\"text\":\"Monthly cost (\u20ac)\",\"placeholder\":\"E.g.: 120\"},\"euros_anio\":{\"icon\":\"fa-euro-sign\",\"text\":\"Annual cost (\u20ac)\",\"placeholder\":\"E.g.: 1440\"},\"kwh_mes\":{\"icon\":\"fa-bolt\",\"text\":\"Monthly consumption (kWh)\",\"placeholder\":\"E.g.: 1000\"},\"kwh_anio\":{\"icon\":\"fa-chart-line\",\"text\":\"Annual consumption (kWh)\",\"placeholder\":\"E.g.: 12000\"}};\n    const alertTipo = 'Please select a consumption type';\n    const alertValor = 'Please enter the consumption value';\n    const alertFactura = 'Please upload the bill';\n    const alertArchivoTipo = 'Please select a PDF or image file (JPG, PNG)';\n    const alertArchivoGrande = 'File is too large. Maximum 5MB.';\n    window['seleccionarTipoConsumo_' + componentId] = function(tipo) {\n        const container = document.getElementById('tab-' + componentId + '-consumo-content');\n        container.querySelectorAll('.item-card').forEach(card => {\n            card.classList.remove('selected');\n        });\n        const selectedCard = container.querySelector('.item-card[data-value=\"' + tipo + '\"]');\n        if (selectedCard) selectedCard.classList.add('selected');\n        if (window.itemData) {\n            window.itemData.tipo_consumo = tipo;\n        }\n        const fieldValor = document.getElementById('field-valor-consumo-' + componentId);\n        const fieldFactura = document.getElementById('field-factura-' + componentId);\n        const btnGuardar = document.getElementById('btn-guardar-consumo-' + componentId);\n        const labelConsumo = document.getElementById('label-consumo-' + componentId);\n        const inputValor = document.getElementById('input-valor-consumo-' + componentId);\n        fieldValor.classList.add('hidden');\n        fieldFactura.classList.add('hidden');\n        btnGuardar.classList.add('hidden');\n        if (labels[tipo]) {\n            labelConsumo.innerHTML = '<i class=\"fas ' + labels[tipo].icon + '\"><\/i> ' + labels[tipo].text;\n            inputValor.placeholder = labels[tipo].placeholder;\n            fieldValor.classList.remove('hidden');\n            btnGuardar.classList.remove('hidden');\n        } else if (tipo === 'no_se') {\n            btnGuardar.classList.remove('hidden');\n            setTimeout(function() {\n                window['guardarTabConsumo_' + componentId]();\n            }, 300);\n        } else if (tipo === 'factura') {\n            fieldFactura.classList.remove('hidden');\n            btnGuardar.classList.remove('hidden');\n        }\n    };\n    window['procesarFactura_' + componentId] = function(input) {\n        const file = input.files[0];\n        if (!file) return;\n        const validTypes = ['application\/pdf', 'image\/jpeg', 'image\/png', 'image\/jpg'];\n        if (!validTypes.includes(file.type)) {\n            alert(alertArchivoTipo);\n            input.value = '';\n            return;\n        }\n        if (file.size > 5 * 1024 * 1024) {\n            alert(alertArchivoGrande);\n            input.value = '';\n            return;\n        }\n        const reader = new FileReader();\n        reader.onload = function(e) {\n            if (window.itemData) {\n                window.itemData.factura_pdf = e.target.result;\n                window.itemData.factura_nombre = file.name;\n            }\n            const container = document.getElementById('field-factura-' + componentId);\n            let successMsg = container.querySelector('.factura-success');\n            if (!successMsg) {\n                successMsg = document.createElement('div');\n                successMsg.className = 'factura-success';\n                successMsg.style.cssText = 'color: green; margin-top: 10px;';\n                container.appendChild(successMsg);\n            }\n            successMsg.innerHTML = '<i class=\"fas fa-check-circle\"><\/i> Archivo seleccionado: ' + file.name;\n        };\n        reader.readAsDataURL(file);\n    };\n    window['guardarTabConsumo_' + componentId] = function() {\n        const tipo = window.itemData ? window.itemData.tipo_consumo : null;\n        if (!tipo) {\n            alert(alertTipo);\n            return;\n        }\n        const tiposConValor = ['euros_mes', 'euros_anio', 'kwh_mes', 'kwh_anio'];\n        if (tiposConValor.includes(tipo)) {\n            const inputValor = document.getElementById('input-valor-consumo-' + componentId);\n            const valor = inputValor ? inputValor.value : '';\n            if (!valor || parseFloat(valor) <= 0) {\n                alert(alertValor);\n                return;\n            }\n            if (window.itemData) {\n                window.itemData.valor_consumo = valor;\n            }\n        } else if (tipo === 'factura') {\n            if (!window.itemData || !window.itemData.factura_pdf) {\n                alert(alertFactura);\n                return;\n            }\n        }\n        if (window.RoseoStateV2) {\n            window.RoseoStateV2.setLocationField('tipo_consumo', tipo);\n            window.RoseoStateV2.setLocationField('valor_consumo', window.itemData ? window.itemData.valor_consumo || '' : '');\n            window.RoseoStateV2.setLocationField('factura_pdf', window.itemData ? window.itemData.factura_pdf || '' : '');\n        }\n        if (typeof marcarTabCompleto === 'function') {\n            marcarTabCompleto('consumo');\n        }\n        if (onCompleteCallback && typeof window[onCompleteCallback] === 'function') {\n            window[onCompleteCallback]();\n        } else if (nextTab && typeof abrirSiguienteTab === 'function') {\n            abrirSiguienteTab('consumo');\n        } else if (typeof abrirSiguienteTab === 'function') {\n            abrirSiguienteTab('consumo');\n        }\n    };\n})();\n<\/script>\n                <\/div>\n            <\/div>\n        <\/div>\n                                    <\/div>\n        <\/div>\n        <script>\n        window.fotovoltaicaManager = null;\n        document.addEventListener('DOMContentLoaded', function() {\n            if (typeof UbicacionManager !== 'undefined' && window.RoseoStateManager) {\n                window.fotovoltaicaManager = new UbicacionManager({\n                    storageKey: 'ubicaciones_fotovoltaica',\n                    editIndexKey: 'editando_fotovoltaica',\n                    tipoProyecto: 'fotovoltaica',\n                    debug: true\n                });\n                window.fotovoltaicaManager.init(window.RoseoStateManager);\n                window.fotovoltaicaManager.loadCurrentIndexFromState();\n            }\n        });\n        <\/script>\n            <\/div>\n    <div id=\"componente-fv-instalacion\" style=\"display: none;\">\n                <div class=\"component-fv-instalacion\" data-component=\"fv-instalacion\">\n            <div class=\"item-header\">\n                <h2>Photovoltaic Installation<\/h2>\n                <span class=\"tipo-badge\" style=\"background: linear-gradient(135deg, var(--mfm-primary) 0%, var(--mfm-secondary) 100%);\">\n                    <i class=\"fas fa-solar-panel\"><\/i> Photovoltaic                <\/span>\n            <\/div>\n            <div class=\"item-tabs\" id=\"fv-instalacion-tabs\">\n                                            <div class=\"item-tab fv-tab-static\" id=\"tab-ubicacion_fv\" data-tab=\"ubicacion_fv\" >\n            <div class=\"item-tab-header\" onclick=\"toggleTab('ubicacion_fv')\">\n                <div class=\"item-tab-left\">\n                    <div class=\"item-tab-number\">1<\/div>\n                    <div class=\"item-tab-title\">\n                        <h3><i class=\"fas fa-map-marker-alt\"><\/i> Photovoltaic Location<\/h3>\n                        <p>Where will you install the panels?<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"item-tab-right\">\n                    <span class=\"item-tab-status\">Pending<\/span>\n                    <i class=\"fas fa-chevron-down item-tab-icon\"><\/i>\n                <\/div>\n            <\/div>\n            <div class=\"item-tab-body\">\n                <div class=\"item-tab-content\">\n                            <div id=\"tab-ubicacion-fv-content\">\n            <p style=\"color: var(--mfm-text); margin-bottom: 20px; text-align: center;\">\n                Select the location type for photovoltaic installation:            <\/p>\n            <div class=\"item-cards\">\n                <div class=\"item-card\" onclick=\"seleccionarUbicacionFV('cubierta')\" data-value=\"cubierta\">\n                    <div class=\"item-card-icon\"><i class=\"fas fa-home\"><\/i><\/div>\n                    <div class=\"item-card-title\">Building\/House Roof<\/div>\n                    <div class=\"item-card-desc\">Installation on roof or rooftop<\/div>\n                <\/div>\n                <div class=\"item-card\" onclick=\"seleccionarUbicacionFV('terreno')\" data-value=\"terreno\">\n                    <div class=\"item-card-icon\"><i class=\"fas fa-mountain\"><\/i><\/div>\n                    <div class=\"item-card-title\">Land<\/div>\n                    <div class=\"item-card-desc\">Installation on plot<\/div>\n                <\/div>\n                <div class=\"item-card\" onclick=\"seleccionarUbicacionFV('ambas')\" data-value=\"ambas\">\n                    <div class=\"item-card-icon\"><i class=\"fas fa-layer-group\"><\/i><\/div>\n                    <div class=\"item-card-title\">Both<\/div>\n                    <div class=\"item-card-desc\">Roof + Land<\/div>\n                <\/div>\n                <div class=\"item-card\" onclick=\"seleccionarUbicacionFV('no_se')\" data-value=\"no_se\">\n                    <div class=\"item-card-icon\"><i class=\"fas fa-question-circle\"><\/i><\/div>\n                    <div class=\"item-card-title\">I don&#039;t know<\/div>\n                    <div class=\"item-card-desc\">I haven&#039;t decided yet<\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        <script>\n        window.fvTipoUbicacion = '';\n        window.FV_TEXTS = {\n            status: {\n                completo: 'Complete'\n            }\n        };\n        function seleccionarUbicacionFV(tipo) {\n            document.querySelectorAll('#tab-ubicacion-fv-content .item-card').forEach(card => {\n                card.classList.remove('selected');\n            });\n            const card = document.querySelector(`#tab-ubicacion-fv-content .item-card[data-value=\"${tipo}\"]`);\n            if (card) card.classList.add('selected');\n            window.fvTipoUbicacion = tipo;\n            if (window.itemData) {\n                window.itemData.ubicacion_fv = tipo;\n            }\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('ubicacion_fv', tipo);\n            }\n            \n            \/\/ CRITICAL: Limpiar pol\u00edgonos que ya no aplican seg\u00fan el nuevo tipo seleccionado\n            limpiarPoligonosFVNoAplicables(tipo);\n            \n            const tab = document.getElementById('tab-ubicacion_fv');\n            if (tab) {\n                tab.classList.add('completed');\n                const status = tab.querySelector('.item-tab-status');\n                if (status) status.textContent = window.FV_TEXTS.status.completo;\n            }\n            setTimeout(() => {\n                generarTabsFVInstalacion(tipo);\n                if (tipo === 'terreno' || tipo === 'ambas' || tipo === 'no_se') {\n                    if (typeof habilitarTab === 'function') habilitarTab('terreno_fv');\n                    if (typeof toggleTab === 'function') toggleTab('terreno_fv');\n                } else if (tipo === 'cubierta') {\n                    if (typeof habilitarTab === 'function') habilitarTab('cubierta_fv');\n                    if (typeof toggleTab === 'function') toggleTab('cubierta_fv');\n                }\n            }, 300);\n        }\n        \n        \/**\n         * Limpia los pol\u00edgonos FV que ya no aplican seg\u00fan el tipo de ubicaci\u00f3n seleccionado\n         * Ej: Si cambia de \"ambas\" a \"terreno\", elimina pol\u00edgonos de cubierta\n         *\/\n        function limpiarPoligonosFVNoAplicables(nuevoTipo) {\n            \/\/ Si es \"terreno\" => limpiar cubierta\n            if (nuevoTipo === 'terreno') {\n                if (window.itemData) {\n                    window.itemData.poligonos_fv_cubierta = [];\n                    window.itemData.geojson_fv_cubierta = null;\n                    \/\/ Limpiar campos de cubierta\n                    window.itemData.cubierta_fv_tipologia = null;\n                    window.itemData.cubierta_fv_acceso = null;\n                    window.itemData.cubierta_fv_futuras_obras = null;\n                    window.itemData.cubierta_fv_obras_descripcion = null;\n                    window.itemData.cubierta_fv_comentarios = null;\n                }\n                if (window.RoseoStateV2) {\n                    window.RoseoStateV2.setPolygons('fv_cubierta', []);\n                    window.RoseoStateV2.setLocationField('geojson_fv_cubierta', null);\n                    window.RoseoStateV2.setLocationField('cubierta_fv_tipologia', null);\n                    window.RoseoStateV2.setLocationField('cubierta_fv_acceso', null);\n                }\n                \/\/ Reset visual del tab cubierta\n                const tabCubierta = document.getElementById('tab-cubierta_fv');\n                if (tabCubierta) {\n                    tabCubierta.classList.remove('completed');\n                    const status = tabCubierta.querySelector('.item-tab-status');\n                    if (status) status.textContent = '';\n                }\n            }\n            \/\/ Si es \"cubierta\" => limpiar terreno\n            else if (nuevoTipo === 'cubierta') {\n                if (window.itemData) {\n                    window.itemData.poligonos_fv_terreno = [];\n                    window.itemData.geojson_fv_terreno = null;\n                    \/\/ Limpiar campos de terreno\n                    window.itemData.terreno_fv_acceso = null;\n                    window.itemData.terreno_fv_futuras_obras = null;\n                    window.itemData.terreno_fv_obras_descripcion = null;\n                    window.itemData.terreno_fv_comentarios = null;\n                }\n                if (window.RoseoStateV2) {\n                    window.RoseoStateV2.setPolygons('fv_terreno', []);\n                    window.RoseoStateV2.setLocationField('geojson_fv_terreno', null);\n                    window.RoseoStateV2.setLocationField('terreno_fv_acceso', null);\n                    window.RoseoStateV2.setLocationField('terreno_fv_futuras_obras', null);\n                }\n                \/\/ Reset visual del tab terreno\n                const tabTerreno = document.getElementById('tab-terreno_fv');\n                if (tabTerreno) {\n                    tabTerreno.classList.remove('completed');\n                    const status = tabTerreno.querySelector('.item-tab-status');\n                    if (status) status.textContent = '';\n                }\n            }\n            \/\/ Si es \"ambas\" o \"no_se\" => no limpiar nada, permite ambos tipos\n        }\n        function generarTabsFVInstalacion(tipoUbicacion) {\n            const tabTerreno = document.getElementById('tab-terreno_fv');\n            const tabCubierta = document.getElementById('tab-cubierta_fv');\n            if (tabTerreno) tabTerreno.style.display = 'none';\n            if (tabCubierta) tabCubierta.style.display = 'none';\n            if (tipoUbicacion === 'terreno') {\n                if (tabTerreno) {\n                    tabTerreno.style.display = 'block';\n                    tabTerreno.classList.remove('disabled');\n                }\n            } else if (tipoUbicacion === 'cubierta') {\n                if (tabCubierta) {\n                    tabCubierta.style.display = 'block';\n                    tabCubierta.classList.remove('disabled');\n                }\n            } else if (tipoUbicacion === 'ambas' || tipoUbicacion === 'no_se') {\n                if (tabTerreno) {\n                    tabTerreno.style.display = 'block';\n                    tabTerreno.classList.remove('disabled');\n                }\n                if (tabCubierta) {\n                    tabCubierta.style.display = 'block';\n                    tabCubierta.classList.add('disabled'); \/\/ Cubierta deshabilitada hasta completar terreno\n                }\n            }\n        }\n        <\/script>\n                        <\/div>\n            <\/div>\n        <\/div>\n                                                    <div class=\"item-tab fv-tab-static\" id=\"tab-terreno_fv\" data-tab=\"terreno_fv\" style=\"display:none;\">\n            <div class=\"item-tab-header\" onclick=\"toggleTab('terreno_fv')\">\n                <div class=\"item-tab-left\">\n                    <div class=\"item-tab-number\">2<\/div>\n                    <div class=\"item-tab-title\">\n                        <h3><i class=\"fas fa-mountain\"><\/i> Land\/Plot<\/h3>\n                        <p>Delimit and describe the land<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"item-tab-right\">\n                    <span class=\"item-tab-status\">Pending<\/span>\n                    <i class=\"fas fa-chevron-down item-tab-icon\"><\/i>\n                <\/div>\n            <\/div>\n            <div class=\"item-tab-body\">\n                <div class=\"item-tab-content\">\n                            <div id=\"tab-terreno-fv-content\">\n            <p style=\"color: var(--mfm-text); margin-bottom: 20px; text-align: center;\">\n                <i class=\"fas fa-solar-panel\" style=\"color: var(--mfm-secondary);\"><\/i>\n                Delimit the land where you will install the photovoltaic panels            <\/p>\n            <div class=\"item-field show\" style=\"margin-bottom: 20px;\">\n                <label><i class=\"fas fa-map-marked-alt\"><\/i> Land Area<\/label>\n                <input type=\"hidden\" id=\"input-mapaFVTerreno\" name=\"geojson_fv_terreno\">\n<div class=\"mapa-button-container\" style=\"display: block !important; margin-top: 10px;\">\n    <button type=\"button\" class=\"btn-abrir-mapa\" onclick=\"abrirMapa_mapaFVTerreno(); return false;\" style=\"display: inline-flex !important;\">\n        <i class=\"fas fa-map-marked-alt\"><\/i> Draw Polygon    <\/button>\n<\/div>\n<div id=\"resumen-mapaFVTerreno\" class=\"mapa-resumen\" style=\"display:none;\">\n    <div class=\"mapa-resumen-preview\" id=\"preview-mapaFVTerreno\">\n        <!-- Mini-mapa est\u00e1tico se insertar\u00e1 aqu\u00ed -->\n    <\/div>\n    <div class=\"mapa-resumen-info\">\n        <i class=\"fas fa-check-circle\"><\/i> \n        <span>Polygon drawn - Area: <strong id=\"area-texto-mapaFVTerreno\">0<\/strong> ha<\/span>\n        <button type=\"button\" class=\"btn-reabrir\" onclick=\"abrirMapa_mapaFVTerreno(); return false;\">\n            <i class=\"fas fa-edit\"><\/i> Edit        <\/button>\n    <\/div>\n<\/div>\n<style>\n.mapa-resumen {\n    display: flex !important;\n    flex-direction: column;\n    gap: 10px;\n    margin-top: 10px;\n    padding: 12px;\n    background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);\n    border-radius: 12px;\n    border: 1px solid var(--mfm-border, #ddd);\n}\n.mapa-resumen-preview {\n    width: 100%;\n    height: 120px;\n    border-radius: 8px;\n    overflow: hidden;\n    background: #eee;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n.mapa-resumen-preview img {\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n}\n.mapa-resumen-preview .preview-placeholder {\n    color: #999;\n    font-size: 12px;\n}\n.mapa-resumen-info {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    flex-wrap: wrap;\n}\n.mapa-resumen-info i.fa-check-circle {\n    color: var(--mfm-secondary, #009239);\n    font-size: 18px;\n}\n.mapa-resumen-info span {\n    flex: 1;\n    font-size: 14px;\n}\n.btn-reabrir {\n    padding: 6px 12px;\n    font-size: 12px;\n    background: var(--mfm-primary, #015328);\n    color: white;\n    border: none;\n    border-radius: 6px;\n    cursor: pointer;\n    transition: background 0.2s;\n}\n.btn-reabrir:hover {\n    background: var(--mfm-secondary, #009239);\n}\n@media (min-width: 480px) {\n    .mapa-resumen {\n        flex-direction: row;\n        align-items: stretch;\n    }\n    .mapa-resumen-preview {\n        width: 160px;\n        height: auto;\n        min-height: 100px;\n        flex-shrink: 0;\n    }\n    .mapa-resumen-info {\n        flex: 1;\n    }\n}\n<\/style>\n<div id=\"modal-mapaFVTerreno\" class=\"mapa-modal-fullscreen\">\n    <div class=\"mapa-modal-header\">\n        <div class=\"header-top\">\n            <h3><i class=\"fas fa-map-marked-alt\"><\/i> Delimit the land area for photovoltaic installation<\/h3>\n            <button type=\"button\" class=\"modal-close\" onclick=\"cerrarMapa_mapaFVTerreno(); return false;\">&times;<\/button>\n        <\/div>\n        <div class=\"header-instrucciones\">\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-search-location\"><\/i>\n                <span><strong>1.<\/strong> Search for your location<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-draw-polygon\"><\/i>\n                <span><strong>2.<\/strong> Click on the polygon button (top left)<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-mouse-pointer\"><\/i>\n                <span><strong>3.<\/strong> Click on the map to create each vertex<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-check-circle\"><\/i>\n                <span><strong>4.<\/strong> Double click to close the polygon<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-trash\"><\/i>\n                <span><strong>5.<\/strong> Use the trash icon to delete and redraw<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div class=\"mapa-modal-body\">\n        <div id=\"mapaFVTerreno\" class=\"mapa-container-full\"><\/div>\n        <div id=\"status-mapaFVTerreno\" class=\"mapa-status\">\n            <i class=\"fas fa-info-circle\"><\/i> Draw your installation polygon        <\/div>\n    <\/div>\n    <div class=\"mapa-modal-footer\">\n        <div class=\"footer-stats\">\n            <span id=\"stats-mapaFVTerreno\">Area: <strong>0<\/strong> ha<\/span>\n        <\/div>\n        <div class=\"footer-actions\">\n            <button type=\"button\" class=\"btn-cancelar\" onclick=\"cerrarMapa_mapaFVTerreno(); return false;\">\n                <i class=\"fas fa-times\"><\/i> Cancel            <\/button>\n            <button type=\"button\" id=\"btn-guardar-mapaFVTerreno\" class=\"btn-guardar\" onclick=\"guardarMapa_mapaFVTerreno(); return false;\" disabled>\n                <i class=\"fas fa-save\"><\/i> Save polygon            <\/button>\n        <\/div>\n    <\/div>\n<\/div>\n<script>\nif (!window.RoseoMapManager) {\n    window.RoseoMapManager = {\n        map: null,\n        draw: null,\n        currentPolygon: null,\n        lastAddress: null,\n        lastMapPosition: null, \/\/ \u2705 FIX: Guardar \u00faltima posici\u00f3n del mapa\n        \n        \/\/ \u2705 FIX: Funci\u00f3n para obtener la \u00faltima posici\u00f3n guardada\n        getLastPosition: function() {\n            \/\/ 1. Primero intentar desde memoria\n            if (this.lastMapPosition) {\n                return this.lastMapPosition;\n            }\n            \/\/ 2. Luego desde sessionStorage\n            try {\n                const saved = sessionStorage.getItem('roseo_last_map_position');\n                if (saved) {\n                    return JSON.parse(saved);\n                }\n            } catch (e) {}\n            \/\/ 3. Default: Portugalete\n            return null;\n        },\n        \n        \/\/ \u2705 FIX: Funci\u00f3n para guardar la posici\u00f3n actual\n        saveCurrentPosition: function() {\n            if (!this.map) return;\n            const center = this.map.getCenter();\n            const zoom = this.map.getZoom();\n            this.lastMapPosition = {\n                center: [center.lng, center.lat],\n                zoom: zoom\n            };\n            try {\n                sessionStorage.setItem('roseo_last_map_position', JSON.stringify(this.lastMapPosition));\n            } catch (e) {}\n            console.log('[MAP] Posici\u00f3n guardada:', this.lastMapPosition);\n        },\n        \n        init: function(containerId, options = {}) {\n            \/\/ \u2705 FIX: Usar \u00faltima posici\u00f3n guardada si existe\n            const lastPos = this.getLastPosition();\n            const defaults = {\n                center: lastPos ? lastPos.center : [-3.022731543334405, 43.327417650863055],\n                zoom: lastPos ? lastPos.zoom : 14,\n                fieldId: 'item-geojson'\n            };\n            const config = { ...defaults, ...options };\n            const MAPBOX_TOKEN = 'pk.eyJ1IjoiY2J1c3RhbWEiLCJhIjoiY21tdzM2ajkwMmdvMDJwc2I4cXgxeDhqcCJ9.WNQRvG6BOPVp6ucyQXLkAA';\n            mapboxgl.accessToken = MAPBOX_TOKEN;\n            this.map = new mapboxgl.Map({\n                container: containerId,\n                style: 'mapbox:\/\/styles\/mapbox\/satellite-v9',\n                center: config.center,\n                zoom: config.zoom\n            });\n            \n            \/\/ \u2705 FIX: Guardar posici\u00f3n cuando el usuario mueve el mapa\n            this.map.on('moveend', () => {\n                this.saveCurrentPosition();\n            });\n            \n            const geocoder = new MapboxGeocoder({\n                accessToken: mapboxgl.accessToken,\n                mapboxgl: mapboxgl,\n                placeholder: 'Search address...',\n                countries: 'es',\n                language: 'es',\n                marker: { color: '#009239' },\n                flyTo: { speed: 1.2, zoom: 18, essential: true }\n            });\n            geocoder.on('result', (e) => {\n                if (e && e.result) {\n                    this.lastAddress = e.result.place_name || e.result.text;\n                    \/\/ \u2705 FIX: Guardar posici\u00f3n despu\u00e9s de b\u00fasqueda\n                    setTimeout(() => this.saveCurrentPosition(), 1500);\n                }\n            });\n            this.map.addControl(geocoder, 'top-right');\n            this.draw = new MapboxDraw({\n                displayControlsDefault: false,\n                controls: { polygon: true, trash: true },\n                styles: [\n                    {\n                        'id': 'gl-draw-polygon-fill-active',\n                        'type': 'fill',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'true']],\n                        'paint': { 'fill-color': '#B3C8BB', 'fill-opacity': 0.4 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-stroke-active',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'true']],\n                        'paint': { 'line-color': '#009239', 'line-width': 3 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-fill-inactive',\n                        'type': 'fill',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'false']],\n                        'paint': { 'fill-color': '#B3C8BB', 'fill-opacity': 0.4 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-stroke-inactive',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'false']],\n                        'paint': { 'line-color': '#009239', 'line-width': 3 }\n                    },\n                    {\n                        'id': 'gl-draw-line-active',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'LineString'], ['==', 'active', 'true']],\n                        'paint': { 'line-color': '#009239', 'line-width': 2 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-and-line-vertex-active',\n                        'type': 'circle',\n                        'filter': ['all', ['==', 'meta', 'vertex'], ['==', '$type', 'Point']],\n                        'paint': { 'circle-radius': 5, 'circle-color': '#009239' }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-midpoint',\n                        'type': 'circle',\n                        'filter': ['all', ['==', 'meta', 'midpoint'], ['==', '$type', 'Point']],\n                        'paint': { 'circle-radius': 3, 'circle-color': '#54595F' }\n                    }\n                ]\n            });\n            this.map.addControl(this.draw, 'top-left');\n            this.map.on('draw.create', (e) => {\n                if (this.currentPolygon) this.draw.delete(this.currentPolygon);\n                this.currentPolygon = e.features[0].id;\n            });\n            this.map.on('draw.delete', () => {\n                this.currentPolygon = null;\n            });\n            this.fieldId = config.fieldId;\n            return this;\n        },\n        getGeoJSON: function() {\n            const allFeatures = this.draw.getAll();\n            if (allFeatures.features.length === 0) {\n                return {\n                    type: \"FeatureCollection\",\n                    features: [],\n                    metadata: {\n                        total_polygons: 0,\n                        center_location: null,\n                        total_area_ha: 0\n                    }\n                };\n            }\n            const feature = allFeatures.features[0];\n            const coords = feature.geometry.coordinates[0];\n            let sumLng = 0, sumLat = 0;\n            coords.forEach(coord => {\n                sumLng += coord[0];\n                sumLat += coord[1];\n            });\n            const centerLng = sumLng \/ coords.length;\n            const centerLat = sumLat \/ coords.length;\n            let area = 0;\n            for (let i = 0; i < coords.length - 1; i++) {\n                const j = (i + 1);\n                area += coords[i][0] * coords[j][1];\n                area -= coords[j][0] * coords[i][1];\n            }\n            area = Math.abs(area \/ 2.0);\n            const areaM2 = area * 111000 * 111000;\n            feature.properties = {\n                created_at: new Date().toISOString(),\n                center_lat: centerLat,\n                center_lng: centerLng,\n                area_m2: Math.round(areaM2),\n                area_ha: (areaM2 \/ 10000).toFixed(2),\n                address: this.lastAddress || ''\n            };\n            return {\n                type: \"FeatureCollection\",\n                features: [feature],\n                metadata: {\n                    total_polygons: 1,\n                    center_location: [centerLat, centerLng],\n                    total_area_ha: (areaM2 \/ 10000).toFixed(2)\n                }\n            };\n        },\n        getPolygonCount: function() {\n            return this.currentPolygon ? 1 : 0;\n        },\n        clearAll: function() {\n            if (this.draw) {\n                this.draw.deleteAll();\n            }\n            this.currentPolygon = null;\n        },\n        resize: function() {\n            if (this.map) {\n                setTimeout(() => this.map.resize(), 100);\n            }\n        },\n        destroy: function() {\n            if (this.draw) {\n                this.map.removeControl(this.draw);\n                this.draw = null;\n            }\n            if (this.map) {\n                this.map.remove();\n                this.map = null;\n            }\n            this.currentPolygon = null;\n        }\n    };\n}\n(function(){\nconst mapId='mapaFVTerreno';\nconst callbackFn='onMapaFVTerrenoGuardado';\nif (!window.RoseoMapInstances) {\n    window.RoseoMapInstances = {};\n}\nwindow['abrirMapa_'+mapId]=function(){\n    document.getElementById('modal-'+mapId).classList.add('show');\n    setTimeout(function(){\n        if(!window.RoseoMapManager){\n            return;\n        }\n        \n        if(!window.RoseoMapInstances[mapId]){\n            window.RoseoMapInstances[mapId] = Object.create(window.RoseoMapManager);\n            \/\/ \u2705 FIX: Usar \u00faltima posici\u00f3n guardada del mapa\n            const lastPos = window.RoseoMapManager.getLastPosition();\n            window.RoseoMapInstances[mapId].init(mapId,{\n                center: lastPos ? lastPos.center : [-3.022731543334405, 43.327417650863055],\n                zoom: lastPos ? lastPos.zoom : 14,\n                fieldId:'input-'+mapId\n            });\n            if (window.RoseoMapInstances[mapId].map) {\n                window.RoseoMapInstances[mapId].map.on('load', function() {\n                    setTimeout(function() {\n                        window.RoseoMapInstances[mapId].map.resize();\n                    }, 100);\n                });\n            }\n        }else{\n            \/\/ \u2705 FIX: NO borrar pol\u00edgono existente al reabrir - solo redimensionar\n            window.RoseoMapInstances[mapId].resize();\n            setTimeout(function() {\n                window.RoseoMapInstances[mapId].resize();\n            }, 300);\n        }\n        actualizarEstado(null);\n    },200);\n};\nwindow['cerrarMapa_'+mapId]=function(){\n    const poligonos=window.RoseoMapInstances[mapId]?window.RoseoMapInstances[mapId].getPolygonCount():0;\n    if(poligonos>0&&!document.getElementById('input-'+mapId).value){\n        if(!confirm('Warning! You are going to leave without saving the polygon'))return;\n    }\n    if(window.RoseoMapInstances[mapId]){\n        window.RoseoMapInstances[mapId].clearAll();\n    }\n    document.getElementById('modal-'+mapId).classList.remove('show');\n};\nwindow['guardarMapa_'+mapId]=function(){\n    const mapInstance = window.RoseoMapInstances[mapId];\n    if(!mapInstance || mapInstance.getPolygonCount()===0){\n        alert('Please draw the polygon on the map.');\n        return;\n    }\n    const featureCollection=mapInstance.getGeoJSON();\n    const f=featureCollection.features[0];\n    const areaHa=f.properties.area_ha;\n    const geojsonStr=JSON.stringify(f);\n    \n    document.getElementById('input-'+mapId).value=geojsonStr;\n    document.getElementById('area-texto-'+mapId).textContent=areaHa;\n    document.getElementById('resumen-'+mapId).style.display='flex';\n    \n    \/\/ \u2705 Generar mini-mapa est\u00e1tico con Mapbox Static Images API\n    generarMiniMapa(mapId, f);\n    \n    document.getElementById('modal-'+mapId).classList.remove('show');\n    const fieldName = 'geojson_fv_terreno';\n    if (window.itemData && fieldName) {\n        window.itemData[fieldName] = geojsonStr;\n    }\n    document.dispatchEvent(new CustomEvent('mapa-poligono-completado',{\n        detail:{\n            mapId:mapId,\n            area_ha:areaHa,\n            geojson:featureCollection,\n            feature:f\n        }\n    }));\n    if(callbackFn&&typeof window[callbackFn]==='function'){\n        window[callbackFn](featureCollection,f,areaHa);\n    }\n};\n\n\/\/ \u2705 FIX: Funci\u00f3n para generar mini-mapa est\u00e1tico\nfunction generarMiniMapa(mapId, feature) {\n    const previewEl = document.getElementById('preview-' + mapId);\n    if (!previewEl) return;\n    \n    try {\n        const coords = feature.geometry.coordinates[0];\n        const center = [feature.properties.center_lng, feature.properties.center_lat];\n        \n        \/\/ Calcular el bounding box para zoom apropiado\n        let minLng = coords[0][0], maxLng = coords[0][0];\n        let minLat = coords[0][1], maxLat = coords[0][1];\n        coords.forEach(c => {\n            minLng = Math.min(minLng, c[0]);\n            maxLng = Math.max(maxLng, c[0]);\n            minLat = Math.min(minLat, c[1]);\n            maxLat = Math.max(maxLat, c[1]);\n        });\n        \n        \/\/ Calcular zoom basado en el tama\u00f1o del pol\u00edgono\n        const diffLng = maxLng - minLng;\n        const diffLat = maxLat - minLat;\n        const maxDiff = Math.max(diffLng, diffLat);\n        let zoom = 15;\n        if (maxDiff > 0.1) zoom = 10;\n        else if (maxDiff > 0.05) zoom = 11;\n        else if (maxDiff > 0.02) zoom = 12;\n        else if (maxDiff > 0.01) zoom = 13;\n        else if (maxDiff > 0.005) zoom = 14;\n        else zoom = 15;\n        \n        \/\/ Crear overlay GeoJSON para el pol\u00edgono\n        const geoJsonOverlay = encodeURIComponent(JSON.stringify({\n            type: 'Feature',\n            properties: {\n                'stroke': '#009239',\n                'stroke-width': 3,\n                'stroke-opacity': 1,\n                'fill': '#B3C8BB',\n                'fill-opacity': 0.4\n            },\n            geometry: feature.geometry\n        }));\n        \n        \/\/ Construir URL de Mapbox Static Images\n        const mapboxToken = 'pk.eyJ1IjoiY2J1c3RhbWEiLCJhIjoiY21tdzM2ajkwMmdvMDJwc2I4cXgxeDhqcCJ9.WNQRvG6BOPVp6ucyQXLkAA';\n        const staticUrl = `https:\/\/api.mapbox.com\/styles\/v1\/mapbox\/satellite-v9\/static\/geojson(${geoJsonOverlay})\/${center[0]},${center[1]},${zoom},0\/300x150@2x?access_token=${mapboxToken}`;\n        \n        \/\/ Crear elemento imagen\n        const img = document.createElement('img');\n        img.src = staticUrl;\n        img.alt = 'Vista previa del pol\u00edgono';\n        img.loading = 'lazy';\n        img.onerror = function() {\n            \/\/ Fallback: mostrar placeholder si falla\n            previewEl.innerHTML = '<div class=\"preview-placeholder\"><i class=\"fas fa-map\"><\/i> Pol\u00edgono guardado<\/div>';\n        };\n        \n        previewEl.innerHTML = '';\n        previewEl.appendChild(img);\n        \n    } catch (e) {\n        console.warn('[MiniMapa] Error generando preview:', e);\n        previewEl.innerHTML = '<div class=\"preview-placeholder\"><i class=\"fas fa-check-circle\"><\/i> Pol\u00edgono guardado<\/div>';\n    }\n}\nfunction actualizarEstado(feature){\n    const statusEl=document.getElementById('status-'+mapId);\n    const statsEl=document.getElementById('stats-'+mapId);\n    const btnGuardar=document.getElementById('btn-guardar-'+mapId);\n    const rootStyles = getComputedStyle(document.documentElement);\n    const primaryColor = rootStyles.getPropertyValue('--mfm-primary').trim() || '#015328';\n    const secondaryColor = rootStyles.getPropertyValue('--mfm-secondary').trim() || '#009239';\n    const textColor = rootStyles.getPropertyValue('--mfm-text').trim() || '#54595F';\n    const txtPoligonoDibujado = 'Polygon drawn';\n    const txtPuedesEditarlo = 'You can edit it';\n    const txtStatusInicial = 'Draw your installation polygon';\n    const txtAreaLabel = 'Area';\n    const txtHectareas = 'ha';\n    if(feature){\n        const areaHa=feature.properties.area_ha||'0.00';\n        statusEl.innerHTML='<i class=\"fas fa-check-circle\" style=\"color:'+secondaryColor+';\"><\/i> <strong>'+txtPoligonoDibujado+'<\/strong> - '+txtPuedesEditarlo;\n        statusEl.style.color=primaryColor;\n        statsEl.innerHTML=txtAreaLabel+': <strong>'+areaHa+'<\/strong> '+txtHectareas;\n        btnGuardar.disabled=false;\n    }else{\n        statusEl.innerHTML='<i class=\"fas fa-info-circle\"><\/i> '+txtStatusInicial;\n        statusEl.style.color=textColor;\n        statsEl.innerHTML=txtAreaLabel+': <strong>0<\/strong> '+txtHectareas;\n        btnGuardar.disabled=true;\n    }\n}\nsetInterval(function(){\n    const mapInstance=window.RoseoMapInstances[mapId];\n    if(mapInstance&&mapInstance.currentPolygon){\n        const geojson=mapInstance.getGeoJSON();\n        if(geojson.features.length>0){\n            actualizarEstado(geojson.features[0]);\n        }\n    }\n},500);\n})();\n<\/script>\n            <\/div>\n            <div class=\"item-field show\">\n                <label><i class=\"fas fa-road\"><\/i> Select access type<\/label>\n                <select id=\"select-terreno-fv-acceso\" class=\"form-select\" style=\"width: 100%; padding: 12px; border: 2px solid var(--mfm-border); border-radius: 8px; font-size: 15px;\">\n                    <option value=\"\">Select access type...<\/option>\n                    <option value=\"carretera_asfaltada\">Paved road<\/option>\n                    <option value=\"camino_tierra\">Dirt or gravel road<\/option>\n                    <option value=\"servidumbre_paso\">Right of way easement<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"item-field show\" style=\"margin-top: 20px;\">\n                <label><i class=\"fas fa-hard-hat\"><\/i> Are there future works planned?<\/label>\n                <div style=\"display: flex; gap: 20px; margin-top: 10px;\">\n                    <label style=\"display: flex; align-items: center; gap: 8px; cursor: pointer;\">\n                        <input type=\"radio\" name=\"terreno_fv_futuras_obras\" value=\"no\" onchange=\"toggleFuturasObrasTerrenoFV(false)\" checked>\n                        <span>No<\/span>\n                    <\/label>\n                    <label style=\"display: flex; align-items: center; gap: 8px; cursor: pointer;\">\n                        <input type=\"radio\" name=\"terreno_fv_futuras_obras\" value=\"si\" onchange=\"toggleFuturasObrasTerrenoFV(true)\">\n                        <span>Yes<\/span>\n                    <\/label>\n                <\/div>\n            <\/div>\n            <div id=\"terreno-fv-futuras-obras-detalle\" class=\"item-field\" style=\"margin-top: 15px; display: none;\">\n                <label><i class=\"fas fa-edit\"><\/i> Describe planned works<\/label>\n                <textarea id=\"textarea-terreno-fv-obras-descripcion\" \n                          placeholder=\"Describe the future works planned on the land...\"\n                          rows=\"3\"\n                          style=\"width: 100%; padding: 12px; border: 2px solid var(--mfm-border); border-radius: 8px; font-size: 15px; resize: vertical;\"><\/textarea>\n            <\/div>\n            <div class=\"item-field show\">\n                <label><i class=\"fas fa-comment-alt\"><\/i> Comments<\/label>\n                <textarea id=\"textarea-terreno-fv-comentarios\" \n                          placeholder=\"Add any relevant information about the land...\"\n                          style=\"width: 100%; padding: 12px; border: 2px solid var(--mfm-border); border-radius: 8px; font-size: 15px; min-height: 100px; resize: vertical;\"><\/textarea>\n            <\/div>\n            <div class=\"item-btn-group\">\n                <button type=\"button\" class=\"item-btn item-btn-primary\" onclick=\"guardarTabTerrenoFV(); return false;\">\n                    <i class=\"fas fa-check\"><\/i> Save Land                <\/button>\n            <\/div>\n        <\/div>\n        <script>\n        window.FV_TEXTS = window.FV_TEXTS || {};\n        window.FV_TEXTS.validacion = {\n            poligono_requerido: 'Please draw at least one polygon on the map',\n            acceso_requerido: 'Please select the access type'\n        };\n        window.onMapaFVTerrenoGuardado = function(geojson) {\n            if (window.itemData) {\n                window.itemData.poligonos_fv_terreno = geojson;\n            }\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setPolygons('fv_terreno', geojson);\n            }\n        };\n        window.toggleFuturasObrasTerrenoFV = function(mostrar) {\n            const detalle = document.getElementById('terreno-fv-futuras-obras-detalle');\n            if (detalle) {\n                \/\/ Only clear obras description if switching from visible to hidden (not on initial load)\n                if (!mostrar && detalle.style.display !== 'none' && detalle.style.display !== '') {\n                    const obrasField = document.getElementById('textarea-terreno-fv-obras-descripcion');\n                    if (obrasField) obrasField.value = '';\n                }\n                detalle.style.display = mostrar ? 'block' : 'none';\n            }\n            if (window.itemData) window.itemData.terreno_fv_futuras_obras = mostrar ? 'si' : 'no';\n        };\n        window.guardarTabTerrenoFV = function() {\n            const acceso = document.getElementById('select-terreno-fv-acceso').value;\n            const futurasObras = document.querySelector('input[name=\"terreno_fv_futuras_obras\"]:checked')?.value || 'no';\n            const obrasDescripcion = document.getElementById('textarea-terreno-fv-obras-descripcion')?.value || '';\n            const comentarios = document.getElementById('textarea-terreno-fv-comentarios').value;\n            if (!window.itemData.poligonos_fv_terreno || window.itemData.poligonos_fv_terreno.length === 0) {\n                alert(window.FV_TEXTS.validacion.poligono_requerido);\n                return;\n            }\n            if (!acceso) {\n                alert(window.FV_TEXTS.validacion.acceso_requerido);\n                return;\n            }\n            if (window.itemData) {\n                window.itemData.terreno_fv_acceso = acceso;\n                window.itemData.terreno_fv_futuras_obras = futurasObras;\n                window.itemData.terreno_fv_obras_descripcion = obrasDescripcion;\n                window.itemData.terreno_fv_comentarios = comentarios;\n            }\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('terreno_fv_acceso', acceso);\n                window.RoseoStateV2.setLocationField('terreno_fv_futuras_obras', futurasObras);\n                window.RoseoStateV2.setLocationField('terreno_fv_obras_descripcion', obrasDescripcion);\n                window.RoseoStateV2.setLocationField('terreno_fv_comentarios', comentarios);\n            }\n            marcarTabCompleto('terreno_fv');\n            const tipoUbicacion = window.fvTipoUbicacion || window.itemData?.ubicacion_fv || '';\n            if (tipoUbicacion === 'ambas' || tipoUbicacion === 'no_se') {\n                if (typeof habilitarTab === 'function') habilitarTab('cubierta_fv');\n                if (typeof toggleTab === 'function') toggleTab('cubierta_fv');\n            } else {\n                finalizarFVInstalacion();\n            }\n        };\n        <\/script>\n                        <\/div>\n            <\/div>\n        <\/div>\n                                                    <div class=\"item-tab fv-tab-static\" id=\"tab-cubierta_fv\" data-tab=\"cubierta_fv\" style=\"display:none;\">\n            <div class=\"item-tab-header\" onclick=\"toggleTab('cubierta_fv')\">\n                <div class=\"item-tab-left\">\n                    <div class=\"item-tab-number\">3<\/div>\n                    <div class=\"item-tab-title\">\n                        <h3><i class=\"fas fa-home\"><\/i> Roof<\/h3>\n                        <p>Delimit and describe the roof<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"item-tab-right\">\n                    <span class=\"item-tab-status\">Pending<\/span>\n                    <i class=\"fas fa-chevron-down item-tab-icon\"><\/i>\n                <\/div>\n            <\/div>\n            <div class=\"item-tab-body\">\n                <div class=\"item-tab-content\">\n                            <div id=\"tab-cubierta-fv-content\">\n            <p style=\"color: var(--mfm-text); margin-bottom: 20px; text-align: center;\">\n                <i class=\"fas fa-solar-panel\" style=\"color: var(--mfm-secondary);\"><\/i>\n                Delimit the roof where you will install the photovoltaic panels            <\/p>\n            <div class=\"item-field show\" style=\"margin-bottom: 20px;\">\n                <label><i class=\"fas fa-map-marked-alt\"><\/i> Roof Area<\/label>\n                <input type=\"hidden\" id=\"input-mapaFVCubierta\" name=\"geojson_fv_cubierta\">\n<div class=\"mapa-button-container\" style=\"display: block !important; margin-top: 10px;\">\n    <button type=\"button\" class=\"btn-abrir-mapa\" onclick=\"abrirMapa_mapaFVCubierta(); return false;\" style=\"display: inline-flex !important;\">\n        <i class=\"fas fa-map-marked-alt\"><\/i> Draw Polygon    <\/button>\n<\/div>\n<div id=\"resumen-mapaFVCubierta\" class=\"mapa-resumen\" style=\"display:none;\">\n    <div class=\"mapa-resumen-preview\" id=\"preview-mapaFVCubierta\">\n        <!-- Mini-mapa est\u00e1tico se insertar\u00e1 aqu\u00ed -->\n    <\/div>\n    <div class=\"mapa-resumen-info\">\n        <i class=\"fas fa-check-circle\"><\/i> \n        <span>Polygon drawn - Area: <strong id=\"area-texto-mapaFVCubierta\">0<\/strong> ha<\/span>\n        <button type=\"button\" class=\"btn-reabrir\" onclick=\"abrirMapa_mapaFVCubierta(); return false;\">\n            <i class=\"fas fa-edit\"><\/i> Edit        <\/button>\n    <\/div>\n<\/div>\n<style>\n.mapa-resumen {\n    display: flex !important;\n    flex-direction: column;\n    gap: 10px;\n    margin-top: 10px;\n    padding: 12px;\n    background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);\n    border-radius: 12px;\n    border: 1px solid var(--mfm-border, #ddd);\n}\n.mapa-resumen-preview {\n    width: 100%;\n    height: 120px;\n    border-radius: 8px;\n    overflow: hidden;\n    background: #eee;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n.mapa-resumen-preview img {\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n}\n.mapa-resumen-preview .preview-placeholder {\n    color: #999;\n    font-size: 12px;\n}\n.mapa-resumen-info {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    flex-wrap: wrap;\n}\n.mapa-resumen-info i.fa-check-circle {\n    color: var(--mfm-secondary, #009239);\n    font-size: 18px;\n}\n.mapa-resumen-info span {\n    flex: 1;\n    font-size: 14px;\n}\n.btn-reabrir {\n    padding: 6px 12px;\n    font-size: 12px;\n    background: var(--mfm-primary, #015328);\n    color: white;\n    border: none;\n    border-radius: 6px;\n    cursor: pointer;\n    transition: background 0.2s;\n}\n.btn-reabrir:hover {\n    background: var(--mfm-secondary, #009239);\n}\n@media (min-width: 480px) {\n    .mapa-resumen {\n        flex-direction: row;\n        align-items: stretch;\n    }\n    .mapa-resumen-preview {\n        width: 160px;\n        height: auto;\n        min-height: 100px;\n        flex-shrink: 0;\n    }\n    .mapa-resumen-info {\n        flex: 1;\n    }\n}\n<\/style>\n<div id=\"modal-mapaFVCubierta\" class=\"mapa-modal-fullscreen\">\n    <div class=\"mapa-modal-header\">\n        <div class=\"header-top\">\n            <h3><i class=\"fas fa-map-marked-alt\"><\/i> Delimit the roof area for photovoltaic installation<\/h3>\n            <button type=\"button\" class=\"modal-close\" onclick=\"cerrarMapa_mapaFVCubierta(); return false;\">&times;<\/button>\n        <\/div>\n        <div class=\"header-instrucciones\">\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-search-location\"><\/i>\n                <span><strong>1.<\/strong> Search for your location<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-draw-polygon\"><\/i>\n                <span><strong>2.<\/strong> Click on the polygon button (top left)<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-mouse-pointer\"><\/i>\n                <span><strong>3.<\/strong> Click on the map to create each vertex<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-check-circle\"><\/i>\n                <span><strong>4.<\/strong> Double click to close the polygon<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-trash\"><\/i>\n                <span><strong>5.<\/strong> Use the trash icon to delete and redraw<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div class=\"mapa-modal-body\">\n        <div id=\"mapaFVCubierta\" class=\"mapa-container-full\"><\/div>\n        <div id=\"status-mapaFVCubierta\" class=\"mapa-status\">\n            <i class=\"fas fa-info-circle\"><\/i> Draw your installation polygon        <\/div>\n    <\/div>\n    <div class=\"mapa-modal-footer\">\n        <div class=\"footer-stats\">\n            <span id=\"stats-mapaFVCubierta\">Area: <strong>0<\/strong> ha<\/span>\n        <\/div>\n        <div class=\"footer-actions\">\n            <button type=\"button\" class=\"btn-cancelar\" onclick=\"cerrarMapa_mapaFVCubierta(); return false;\">\n                <i class=\"fas fa-times\"><\/i> Cancel            <\/button>\n            <button type=\"button\" id=\"btn-guardar-mapaFVCubierta\" class=\"btn-guardar\" onclick=\"guardarMapa_mapaFVCubierta(); return false;\" disabled>\n                <i class=\"fas fa-save\"><\/i> Save polygon            <\/button>\n        <\/div>\n    <\/div>\n<\/div>\n<script>\nif (!window.RoseoMapManager) {\n    window.RoseoMapManager = {\n        map: null,\n        draw: null,\n        currentPolygon: null,\n        lastAddress: null,\n        lastMapPosition: null, \/\/ \u2705 FIX: Guardar \u00faltima posici\u00f3n del mapa\n        \n        \/\/ \u2705 FIX: Funci\u00f3n para obtener la \u00faltima posici\u00f3n guardada\n        getLastPosition: function() {\n            \/\/ 1. Primero intentar desde memoria\n            if (this.lastMapPosition) {\n                return this.lastMapPosition;\n            }\n            \/\/ 2. Luego desde sessionStorage\n            try {\n                const saved = sessionStorage.getItem('roseo_last_map_position');\n                if (saved) {\n                    return JSON.parse(saved);\n                }\n            } catch (e) {}\n            \/\/ 3. Default: Portugalete\n            return null;\n        },\n        \n        \/\/ \u2705 FIX: Funci\u00f3n para guardar la posici\u00f3n actual\n        saveCurrentPosition: function() {\n            if (!this.map) return;\n            const center = this.map.getCenter();\n            const zoom = this.map.getZoom();\n            this.lastMapPosition = {\n                center: [center.lng, center.lat],\n                zoom: zoom\n            };\n            try {\n                sessionStorage.setItem('roseo_last_map_position', JSON.stringify(this.lastMapPosition));\n            } catch (e) {}\n            console.log('[MAP] Posici\u00f3n guardada:', this.lastMapPosition);\n        },\n        \n        init: function(containerId, options = {}) {\n            \/\/ \u2705 FIX: Usar \u00faltima posici\u00f3n guardada si existe\n            const lastPos = this.getLastPosition();\n            const defaults = {\n                center: lastPos ? lastPos.center : [-3.022731543334405, 43.327417650863055],\n                zoom: lastPos ? lastPos.zoom : 14,\n                fieldId: 'item-geojson'\n            };\n            const config = { ...defaults, ...options };\n            const MAPBOX_TOKEN = 'pk.eyJ1IjoiY2J1c3RhbWEiLCJhIjoiY21tdzM2ajkwMmdvMDJwc2I4cXgxeDhqcCJ9.WNQRvG6BOPVp6ucyQXLkAA';\n            mapboxgl.accessToken = MAPBOX_TOKEN;\n            this.map = new mapboxgl.Map({\n                container: containerId,\n                style: 'mapbox:\/\/styles\/mapbox\/satellite-v9',\n                center: config.center,\n                zoom: config.zoom\n            });\n            \n            \/\/ \u2705 FIX: Guardar posici\u00f3n cuando el usuario mueve el mapa\n            this.map.on('moveend', () => {\n                this.saveCurrentPosition();\n            });\n            \n            const geocoder = new MapboxGeocoder({\n                accessToken: mapboxgl.accessToken,\n                mapboxgl: mapboxgl,\n                placeholder: 'Search address...',\n                countries: 'es',\n                language: 'es',\n                marker: { color: '#009239' },\n                flyTo: { speed: 1.2, zoom: 18, essential: true }\n            });\n            geocoder.on('result', (e) => {\n                if (e && e.result) {\n                    this.lastAddress = e.result.place_name || e.result.text;\n                    \/\/ \u2705 FIX: Guardar posici\u00f3n despu\u00e9s de b\u00fasqueda\n                    setTimeout(() => this.saveCurrentPosition(), 1500);\n                }\n            });\n            this.map.addControl(geocoder, 'top-right');\n            this.draw = new MapboxDraw({\n                displayControlsDefault: false,\n                controls: { polygon: true, trash: true },\n                styles: [\n                    {\n                        'id': 'gl-draw-polygon-fill-active',\n                        'type': 'fill',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'true']],\n                        'paint': { 'fill-color': '#B3C8BB', 'fill-opacity': 0.4 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-stroke-active',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'true']],\n                        'paint': { 'line-color': '#009239', 'line-width': 3 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-fill-inactive',\n                        'type': 'fill',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'false']],\n                        'paint': { 'fill-color': '#B3C8BB', 'fill-opacity': 0.4 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-stroke-inactive',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'false']],\n                        'paint': { 'line-color': '#009239', 'line-width': 3 }\n                    },\n                    {\n                        'id': 'gl-draw-line-active',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'LineString'], ['==', 'active', 'true']],\n                        'paint': { 'line-color': '#009239', 'line-width': 2 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-and-line-vertex-active',\n                        'type': 'circle',\n                        'filter': ['all', ['==', 'meta', 'vertex'], ['==', '$type', 'Point']],\n                        'paint': { 'circle-radius': 5, 'circle-color': '#009239' }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-midpoint',\n                        'type': 'circle',\n                        'filter': ['all', ['==', 'meta', 'midpoint'], ['==', '$type', 'Point']],\n                        'paint': { 'circle-radius': 3, 'circle-color': '#54595F' }\n                    }\n                ]\n            });\n            this.map.addControl(this.draw, 'top-left');\n            this.map.on('draw.create', (e) => {\n                if (this.currentPolygon) this.draw.delete(this.currentPolygon);\n                this.currentPolygon = e.features[0].id;\n            });\n            this.map.on('draw.delete', () => {\n                this.currentPolygon = null;\n            });\n            this.fieldId = config.fieldId;\n            return this;\n        },\n        getGeoJSON: function() {\n            const allFeatures = this.draw.getAll();\n            if (allFeatures.features.length === 0) {\n                return {\n                    type: \"FeatureCollection\",\n                    features: [],\n                    metadata: {\n                        total_polygons: 0,\n                        center_location: null,\n                        total_area_ha: 0\n                    }\n                };\n            }\n            const feature = allFeatures.features[0];\n            const coords = feature.geometry.coordinates[0];\n            let sumLng = 0, sumLat = 0;\n            coords.forEach(coord => {\n                sumLng += coord[0];\n                sumLat += coord[1];\n            });\n            const centerLng = sumLng \/ coords.length;\n            const centerLat = sumLat \/ coords.length;\n            let area = 0;\n            for (let i = 0; i < coords.length - 1; i++) {\n                const j = (i + 1);\n                area += coords[i][0] * coords[j][1];\n                area -= coords[j][0] * coords[i][1];\n            }\n            area = Math.abs(area \/ 2.0);\n            const areaM2 = area * 111000 * 111000;\n            feature.properties = {\n                created_at: new Date().toISOString(),\n                center_lat: centerLat,\n                center_lng: centerLng,\n                area_m2: Math.round(areaM2),\n                area_ha: (areaM2 \/ 10000).toFixed(2),\n                address: this.lastAddress || ''\n            };\n            return {\n                type: \"FeatureCollection\",\n                features: [feature],\n                metadata: {\n                    total_polygons: 1,\n                    center_location: [centerLat, centerLng],\n                    total_area_ha: (areaM2 \/ 10000).toFixed(2)\n                }\n            };\n        },\n        getPolygonCount: function() {\n            return this.currentPolygon ? 1 : 0;\n        },\n        clearAll: function() {\n            if (this.draw) {\n                this.draw.deleteAll();\n            }\n            this.currentPolygon = null;\n        },\n        resize: function() {\n            if (this.map) {\n                setTimeout(() => this.map.resize(), 100);\n            }\n        },\n        destroy: function() {\n            if (this.draw) {\n                this.map.removeControl(this.draw);\n                this.draw = null;\n            }\n            if (this.map) {\n                this.map.remove();\n                this.map = null;\n            }\n            this.currentPolygon = null;\n        }\n    };\n}\n(function(){\nconst mapId='mapaFVCubierta';\nconst callbackFn='onMapaFVCubiertaGuardado';\nif (!window.RoseoMapInstances) {\n    window.RoseoMapInstances = {};\n}\nwindow['abrirMapa_'+mapId]=function(){\n    document.getElementById('modal-'+mapId).classList.add('show');\n    setTimeout(function(){\n        if(!window.RoseoMapManager){\n            return;\n        }\n        \n        if(!window.RoseoMapInstances[mapId]){\n            window.RoseoMapInstances[mapId] = Object.create(window.RoseoMapManager);\n            \/\/ \u2705 FIX: Usar \u00faltima posici\u00f3n guardada del mapa\n            const lastPos = window.RoseoMapManager.getLastPosition();\n            window.RoseoMapInstances[mapId].init(mapId,{\n                center: lastPos ? lastPos.center : [-3.022731543334405, 43.327417650863055],\n                zoom: lastPos ? lastPos.zoom : 14,\n                fieldId:'input-'+mapId\n            });\n            if (window.RoseoMapInstances[mapId].map) {\n                window.RoseoMapInstances[mapId].map.on('load', function() {\n                    setTimeout(function() {\n                        window.RoseoMapInstances[mapId].map.resize();\n                    }, 100);\n                });\n            }\n        }else{\n            \/\/ \u2705 FIX: NO borrar pol\u00edgono existente al reabrir - solo redimensionar\n            window.RoseoMapInstances[mapId].resize();\n            setTimeout(function() {\n                window.RoseoMapInstances[mapId].resize();\n            }, 300);\n        }\n        actualizarEstado(null);\n    },200);\n};\nwindow['cerrarMapa_'+mapId]=function(){\n    const poligonos=window.RoseoMapInstances[mapId]?window.RoseoMapInstances[mapId].getPolygonCount():0;\n    if(poligonos>0&&!document.getElementById('input-'+mapId).value){\n        if(!confirm('Warning! You are going to leave without saving the polygon'))return;\n    }\n    if(window.RoseoMapInstances[mapId]){\n        window.RoseoMapInstances[mapId].clearAll();\n    }\n    document.getElementById('modal-'+mapId).classList.remove('show');\n};\nwindow['guardarMapa_'+mapId]=function(){\n    const mapInstance = window.RoseoMapInstances[mapId];\n    if(!mapInstance || mapInstance.getPolygonCount()===0){\n        alert('Please draw the polygon on the map.');\n        return;\n    }\n    const featureCollection=mapInstance.getGeoJSON();\n    const f=featureCollection.features[0];\n    const areaHa=f.properties.area_ha;\n    const geojsonStr=JSON.stringify(f);\n    \n    document.getElementById('input-'+mapId).value=geojsonStr;\n    document.getElementById('area-texto-'+mapId).textContent=areaHa;\n    document.getElementById('resumen-'+mapId).style.display='flex';\n    \n    \/\/ \u2705 Generar mini-mapa est\u00e1tico con Mapbox Static Images API\n    generarMiniMapa(mapId, f);\n    \n    document.getElementById('modal-'+mapId).classList.remove('show');\n    const fieldName = 'geojson_fv_cubierta';\n    if (window.itemData && fieldName) {\n        window.itemData[fieldName] = geojsonStr;\n    }\n    document.dispatchEvent(new CustomEvent('mapa-poligono-completado',{\n        detail:{\n            mapId:mapId,\n            area_ha:areaHa,\n            geojson:featureCollection,\n            feature:f\n        }\n    }));\n    if(callbackFn&&typeof window[callbackFn]==='function'){\n        window[callbackFn](featureCollection,f,areaHa);\n    }\n};\n\n\/\/ \u2705 FIX: Funci\u00f3n para generar mini-mapa est\u00e1tico\nfunction generarMiniMapa(mapId, feature) {\n    const previewEl = document.getElementById('preview-' + mapId);\n    if (!previewEl) return;\n    \n    try {\n        const coords = feature.geometry.coordinates[0];\n        const center = [feature.properties.center_lng, feature.properties.center_lat];\n        \n        \/\/ Calcular el bounding box para zoom apropiado\n        let minLng = coords[0][0], maxLng = coords[0][0];\n        let minLat = coords[0][1], maxLat = coords[0][1];\n        coords.forEach(c => {\n            minLng = Math.min(minLng, c[0]);\n            maxLng = Math.max(maxLng, c[0]);\n            minLat = Math.min(minLat, c[1]);\n            maxLat = Math.max(maxLat, c[1]);\n        });\n        \n        \/\/ Calcular zoom basado en el tama\u00f1o del pol\u00edgono\n        const diffLng = maxLng - minLng;\n        const diffLat = maxLat - minLat;\n        const maxDiff = Math.max(diffLng, diffLat);\n        let zoom = 15;\n        if (maxDiff > 0.1) zoom = 10;\n        else if (maxDiff > 0.05) zoom = 11;\n        else if (maxDiff > 0.02) zoom = 12;\n        else if (maxDiff > 0.01) zoom = 13;\n        else if (maxDiff > 0.005) zoom = 14;\n        else zoom = 15;\n        \n        \/\/ Crear overlay GeoJSON para el pol\u00edgono\n        const geoJsonOverlay = encodeURIComponent(JSON.stringify({\n            type: 'Feature',\n            properties: {\n                'stroke': '#009239',\n                'stroke-width': 3,\n                'stroke-opacity': 1,\n                'fill': '#B3C8BB',\n                'fill-opacity': 0.4\n            },\n            geometry: feature.geometry\n        }));\n        \n        \/\/ Construir URL de Mapbox Static Images\n        const mapboxToken = 'pk.eyJ1IjoiY2J1c3RhbWEiLCJhIjoiY21tdzM2ajkwMmdvMDJwc2I4cXgxeDhqcCJ9.WNQRvG6BOPVp6ucyQXLkAA';\n        const staticUrl = `https:\/\/api.mapbox.com\/styles\/v1\/mapbox\/satellite-v9\/static\/geojson(${geoJsonOverlay})\/${center[0]},${center[1]},${zoom},0\/300x150@2x?access_token=${mapboxToken}`;\n        \n        \/\/ Crear elemento imagen\n        const img = document.createElement('img');\n        img.src = staticUrl;\n        img.alt = 'Vista previa del pol\u00edgono';\n        img.loading = 'lazy';\n        img.onerror = function() {\n            \/\/ Fallback: mostrar placeholder si falla\n            previewEl.innerHTML = '<div class=\"preview-placeholder\"><i class=\"fas fa-map\"><\/i> Pol\u00edgono guardado<\/div>';\n        };\n        \n        previewEl.innerHTML = '';\n        previewEl.appendChild(img);\n        \n    } catch (e) {\n        console.warn('[MiniMapa] Error generando preview:', e);\n        previewEl.innerHTML = '<div class=\"preview-placeholder\"><i class=\"fas fa-check-circle\"><\/i> Pol\u00edgono guardado<\/div>';\n    }\n}\nfunction actualizarEstado(feature){\n    const statusEl=document.getElementById('status-'+mapId);\n    const statsEl=document.getElementById('stats-'+mapId);\n    const btnGuardar=document.getElementById('btn-guardar-'+mapId);\n    const rootStyles = getComputedStyle(document.documentElement);\n    const primaryColor = rootStyles.getPropertyValue('--mfm-primary').trim() || '#015328';\n    const secondaryColor = rootStyles.getPropertyValue('--mfm-secondary').trim() || '#009239';\n    const textColor = rootStyles.getPropertyValue('--mfm-text').trim() || '#54595F';\n    const txtPoligonoDibujado = 'Polygon drawn';\n    const txtPuedesEditarlo = 'You can edit it';\n    const txtStatusInicial = 'Draw your installation polygon';\n    const txtAreaLabel = 'Area';\n    const txtHectareas = 'ha';\n    if(feature){\n        const areaHa=feature.properties.area_ha||'0.00';\n        statusEl.innerHTML='<i class=\"fas fa-check-circle\" style=\"color:'+secondaryColor+';\"><\/i> <strong>'+txtPoligonoDibujado+'<\/strong> - '+txtPuedesEditarlo;\n        statusEl.style.color=primaryColor;\n        statsEl.innerHTML=txtAreaLabel+': <strong>'+areaHa+'<\/strong> '+txtHectareas;\n        btnGuardar.disabled=false;\n    }else{\n        statusEl.innerHTML='<i class=\"fas fa-info-circle\"><\/i> '+txtStatusInicial;\n        statusEl.style.color=textColor;\n        statsEl.innerHTML=txtAreaLabel+': <strong>0<\/strong> '+txtHectareas;\n        btnGuardar.disabled=true;\n    }\n}\nsetInterval(function(){\n    const mapInstance=window.RoseoMapInstances[mapId];\n    if(mapInstance&&mapInstance.currentPolygon){\n        const geojson=mapInstance.getGeoJSON();\n        if(geojson.features.length>0){\n            actualizarEstado(geojson.features[0]);\n        }\n    }\n},500);\n})();\n<\/script>\n            <\/div>\n            <div class=\"item-field show\">\n                <label><i class=\"fas fa-building\"><\/i> Roof Type<\/label>\n                <select id=\"select-cubierta-fv-tipologia\" class=\"form-select\" style=\"width: 100%; padding: 12px; border: 2px solid var(--mfm-border); border-radius: 8px; font-size: 15px;\">\n                    <option value=\"\">Select an option<\/option>\n                    <option value=\"plana\">Flat roof<\/option>\n                    <option value=\"inclinada_teja\">Pitched roof (tile)<\/option>\n                    <option value=\"inclinada_chapa\">Pitched roof (metal sheet)<\/option>\n                    <option value=\"sandwich\">Sandwich panel<\/option>\n                    <option value=\"fibrocemento\">Fiber cement<\/option>\n                    <option value=\"mixta\">Mixed<\/option>\n                    <option value=\"otro\">Other<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"item-field show\">\n                <label><i class=\"fas fa-stairs\"><\/i> Select access type<\/label>\n                <select id=\"select-cubierta-fv-acceso\" class=\"form-select\" style=\"width: 100%; padding: 12px; border: 2px solid var(--mfm-border); border-radius: 8px; font-size: 15px;\">\n                    <option value=\"\">Select access type...<\/option>\n                    <option value=\"escalera_interior\">Interior stairs<\/option>\n                    <option value=\"escalera_exterior\">Exterior stairs<\/option>\n                    <option value=\"trampilla\">Roof hatch<\/option>\n                    <option value=\"grua\">Requires crane\/elevator<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"item-field show\" style=\"margin-top: 20px;\">\n                <label><i class=\"fas fa-hard-hat\"><\/i> Are there future works planned?<\/label>\n                <div style=\"display: flex; gap: 20px; margin-top: 10px;\">\n                    <label style=\"display: flex; align-items: center; gap: 8px; cursor: pointer;\">\n                        <input type=\"radio\" name=\"cubierta_fv_futuras_obras\" value=\"no\" onchange=\"toggleFuturasObrasCubiertaFV(false)\" checked>\n                        <span>No<\/span>\n                    <\/label>\n                    <label style=\"display: flex; align-items: center; gap: 8px; cursor: pointer;\">\n                        <input type=\"radio\" name=\"cubierta_fv_futuras_obras\" value=\"si\" onchange=\"toggleFuturasObrasCubiertaFV(true)\">\n                        <span>Yes<\/span>\n                    <\/label>\n                <\/div>\n            <\/div>\n            <div id=\"cubierta-fv-futuras-obras-detalle\" class=\"item-field\" style=\"margin-top: 15px; display: none;\">\n                <label><i class=\"fas fa-edit\"><\/i> Describe planned works<\/label>\n                <textarea id=\"textarea-cubierta-fv-obras-descripcion\" \n                          placeholder=\"Describe the future works planned on the roof...\"\n                          rows=\"3\"\n                          style=\"width: 100%; padding: 12px; border: 2px solid var(--mfm-border); border-radius: 8px; font-size: 15px; resize: vertical;\"><\/textarea>\n            <\/div>\n            <div class=\"item-field show\">\n                <label><i class=\"fas fa-comment-alt\"><\/i> Comments<\/label>\n                <textarea id=\"textarea-cubierta-fv-comentarios\" \n                          placeholder=\"Add any relevant information about the roof...\"\n                          style=\"width: 100%; padding: 12px; border: 2px solid var(--mfm-border); border-radius: 8px; font-size: 15px; min-height: 100px; resize: vertical;\"><\/textarea>\n            <\/div>\n            <div class=\"item-btn-group\">\n                <button type=\"button\" class=\"item-btn item-btn-primary\" onclick=\"guardarTabCubiertaFV(); return false;\">\n                    <i class=\"fas fa-check\"><\/i> Save Roof                <\/button>\n            <\/div>\n        <\/div>\n        <script>\n        window.onMapaFVCubiertaGuardado = function(geojson) {\n            if (window.itemData) {\n                window.itemData.poligonos_fv_cubierta = geojson;\n            }\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setPolygons('fv_cubierta', geojson);\n            }\n        };\n        window.toggleFuturasObrasCubiertaFV = function(mostrar) {\n            const detalle = document.getElementById('cubierta-fv-futuras-obras-detalle');\n            if (detalle) {\n                if (!mostrar && detalle.style.display !== 'none' && detalle.style.display !== '') {\n                    const obrasField = document.getElementById('textarea-cubierta-fv-obras-descripcion');\n                    if (obrasField) obrasField.value = '';\n                }\n                detalle.style.display = mostrar ? 'block' : 'none';\n            }\n            if (window.itemData) window.itemData.cubierta_fv_futuras_obras = mostrar ? 'si' : 'no';\n        };\n        window.guardarTabCubiertaFV = function() {\n            const tipologia = document.getElementById('select-cubierta-fv-tipologia').value;\n            const acceso = document.getElementById('select-cubierta-fv-acceso').value;\n            const futurasObras = document.querySelector('input[name=\"cubierta_fv_futuras_obras\"]:checked')?.value || 'no';\n            const obrasDescripcion = document.getElementById('textarea-cubierta-fv-obras-descripcion')?.value || '';\n            const comentarios = document.getElementById('textarea-cubierta-fv-comentarios').value;\n            if (!window.itemData.poligonos_fv_cubierta || window.itemData.poligonos_fv_cubierta.length === 0) {\n                alert(window.FV_TEXTS.validacion.poligono_requerido);\n                return;\n            }\n            if (!acceso) {\n                alert(window.FV_TEXTS.validacion.acceso_requerido);\n                return;\n            }\n            if (window.itemData) {\n                window.itemData.cubierta_fv_tipologia = tipologia;\n                window.itemData.cubierta_fv_acceso = acceso;\n                window.itemData.cubierta_fv_futuras_obras = futurasObras;\n                window.itemData.cubierta_fv_obras_descripcion = obrasDescripcion;\n                window.itemData.cubierta_fv_comentarios = comentarios;\n            }\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('cubierta_fv_tipologia', tipologia);\n                window.RoseoStateV2.setLocationField('cubierta_fv_acceso', acceso);\n                window.RoseoStateV2.setLocationField('cubierta_fv_futuras_obras', futurasObras);\n                window.RoseoStateV2.setLocationField('cubierta_fv_obras_descripcion', obrasDescripcion);\n                window.RoseoStateV2.setLocationField('cubierta_fv_comentarios', comentarios);\n            }\n            marcarTabCompleto('cubierta_fv');\n            finalizarFVInstalacion();\n        };\n        function finalizarFVInstalacion() {\n            let tipoInstalacion = window.itemData?.tipo_instalacion || '';\n            if (!tipoInstalacion && window.RoseoStateV2) {\n                const state = window.RoseoStateV2.getState();\n                tipoInstalacion = (state.current_location && state.current_location.tipo_instalacion) ||\n                                  (state.form && state.form.tipo_instalacion) || '';\n            }\n            if (!tipoInstalacion) {\n                tipoInstalacion = window.roseoTipoInstalacion || '';\n            }\n            \n            \/\/ \u2705 FIX: SIEMPRE sincronizar pol\u00edgonos FV a StateV2 antes de cualquier transici\u00f3n\n            if (window.RoseoStateV2) {\n                \n                \/\/ Sync terreno FV polygons\n                if (window.itemData.poligonos_fv_terreno && window.itemData.poligonos_fv_terreno.length > 0) {\n                    window.RoseoStateV2.setPolygons('fv_terreno', window.itemData.poligonos_fv_terreno);\n                } else if (window.itemData.geojson_fv_terreno) {\n                    try {\n                        const geo = typeof window.itemData.geojson_fv_terreno === 'string' \n                            ? JSON.parse(window.itemData.geojson_fv_terreno) \n                            : window.itemData.geojson_fv_terreno;\n                        const features = geo.features || [geo];\n                        window.RoseoStateV2.setPolygons('fv_terreno', features);\n                    } catch(e) { \/* parse error *\/ }\n                }\n                \n                \/\/ Sync cubierta FV polygons\n                if (window.itemData.poligonos_fv_cubierta && window.itemData.poligonos_fv_cubierta.length > 0) {\n                    window.RoseoStateV2.setPolygons('fv_cubierta', window.itemData.poligonos_fv_cubierta);\n                } else if (window.itemData.geojson_fv_cubierta) {\n                    try {\n                        const geo = typeof window.itemData.geojson_fv_cubierta === 'string' \n                            ? JSON.parse(window.itemData.geojson_fv_cubierta) \n                            : window.itemData.geojson_fv_cubierta;\n                        const features = geo.features || [geo];\n                        window.RoseoStateV2.setPolygons('fv_cubierta', features);\n                    } catch(e) { \/* parse error *\/ }\n                }\n                \n                \/\/ Sync ubicacion_fv y todos los campos de texto FV\n                if (window.itemData.ubicacion_fv) window.RoseoStateV2.setLocationField('ubicacion_fv', window.itemData.ubicacion_fv);\n                \/\/ Terreno FV\n                if (window.itemData.terreno_fv_acceso) window.RoseoStateV2.setLocationField('terreno_fv_acceso', window.itemData.terreno_fv_acceso);\n                if (window.itemData.terreno_fv_futuras_obras) window.RoseoStateV2.setLocationField('terreno_fv_futuras_obras', window.itemData.terreno_fv_futuras_obras);\n                if (window.itemData.terreno_fv_obras_descripcion) window.RoseoStateV2.setLocationField('terreno_fv_obras_descripcion', window.itemData.terreno_fv_obras_descripcion);\n                if (window.itemData.terreno_fv_comentarios) window.RoseoStateV2.setLocationField('terreno_fv_comentarios', window.itemData.terreno_fv_comentarios);\n                \/\/ Cubierta FV\n                if (window.itemData.cubierta_fv_tipologia) window.RoseoStateV2.setLocationField('cubierta_fv_tipologia', window.itemData.cubierta_fv_tipologia);\n                if (window.itemData.cubierta_fv_acceso) window.RoseoStateV2.setLocationField('cubierta_fv_acceso', window.itemData.cubierta_fv_acceso);\n                if (window.itemData.cubierta_fv_futuras_obras) window.RoseoStateV2.setLocationField('cubierta_fv_futuras_obras', window.itemData.cubierta_fv_futuras_obras);\n                if (window.itemData.cubierta_fv_obras_descripcion) window.RoseoStateV2.setLocationField('cubierta_fv_obras_descripcion', window.itemData.cubierta_fv_obras_descripcion);\n                if (window.itemData.cubierta_fv_comentarios) window.RoseoStateV2.setLocationField('cubierta_fv_comentarios', window.itemData.cubierta_fv_comentarios);\n                \/\/ GeoJSON refs\n                if (window.itemData.geojson_fv_terreno) window.RoseoStateV2.setLocationField('geojson_fv_terreno', window.itemData.geojson_fv_terreno);\n                if (window.itemData.geojson_fv_cubierta) window.RoseoStateV2.setLocationField('geojson_fv_cubierta', window.itemData.geojson_fv_cubierta);\n                \n                \/\/ Save to localStorage immediately\n                window.RoseoStateV2.saveToStorage();\n            }\n            \n            if (tipoInstalacion === 'mini_fv') {\n                if (typeof activarNuevoComponente === 'function') {\n                    const compFV = document.getElementById('componente-fv-instalacion');\n                    const tabActivo = compFV ? compFV.querySelector('.item-tab.active') : null;\n                    const tabId = tabActivo ? tabActivo.id : null;\n                    if (tabId) {\n                        activarNuevoComponente(tabId, 'componente-minieolica');\n                    } else {\n                        const compMini = document.getElementById('componente-minieolica');\n                        if (compMini) {\n                            compMini.style.display = 'block';\n                            const primerTabMini = compMini.querySelector('.item-tab');\n                            if (primerTabMini) {\n                                primerTabMini.classList.remove('disabled');\n                                setTimeout(() => {\n                                    primerTabMini.classList.add('active');\n                                    const header = primerTabMini.querySelector('.item-tab-header') || primerTabMini;\n                                    header.scrollIntoView({ behavior: 'smooth', block: 'start' });\n                                }, 50);\n                            }\n                        }\n                    }\n                } else {\n                    const compMini = document.getElementById('componente-minieolica');\n                    if (compMini) {\n                        const primerTabMini = compMini.querySelector('.item-tab');\n                        if (primerTabMini) {\n                            primerTabMini.classList.remove('disabled');\n                            setTimeout(() => {\n                                primerTabMini.classList.add('active');\n                                const header = primerTabMini.querySelector('.item-tab-header') || primerTabMini;\n                                header.scrollIntoView({ behavior: 'smooth', block: 'start' });\n                            }, 100);\n                        }\n                    }\n                }\n            } else {\n                if (typeof finalizarItem === 'function') {\n                    finalizarItem();\n                } else if (typeof irAlHubOSiguiente === 'function') {\n                    irAlHubOSiguiente();\n                } else {\n                }\n            }\n        }\n        <\/script>\n                        <\/div>\n            <\/div>\n        <\/div>\n                                    <\/div>\n        <\/div>\n        <script>\n        window.fvInstalacionManager = null;\n        document.addEventListener('DOMContentLoaded', function() {\n            \/*\n            \/\/ DISABLED: StateManager V2 handles location data natively.\n            if (typeof UbicacionManager !== 'undefined' && window.RoseoStateManager) {\n                window.fvInstalacionManager = new UbicacionManager({\n                    storageKey: 'ubicaciones_fv_instalacion',\n                    editIndexKey: 'editando_fv_instalacion',\n                    tipoProyecto: 'fv_instalacion',\n                    debug: true\n                });\n                window.fvInstalacionManager.init(window.RoseoStateManager);\n                window.fvInstalacionManager.loadCurrentIndexFromState();\n            }\n            *\/\n        });\n        <\/script>\n            <\/div>\n    <div id=\"componente-minieolica\" style=\"display: none;\">\n                <div class=\"component-minieolica\" data-component=\"minieolica\">\n            <div class=\"item-header\">\n                <h2>Mini wind Installation<\/h2>\n                <span class=\"tipo-badge\" style=\"background: var(--mfm-gradient-primary);\">\n                    <i class=\"fas fa-wind\"><\/i> Mini wind                <\/span>\n            <\/div>\n            <div class=\"item-tabs\" id=\"minieolica-tabs\">\n                                            <div class=\"item-tab mini-tab-static\" id=\"tab-ubicacion\" data-tab=\"ubicacion\" >\n            <div class=\"item-tab-header\" onclick=\"toggleTab('ubicacion')\">\n                <div class=\"item-tab-left\">\n                    <div class=\"item-tab-number\">1<\/div>\n                    <div class=\"item-tab-title\">\n                        <h3><i class=\"fas fa-map-marker-alt\"><\/i> Mini wind Location<\/h3>\n                        <p>Where will you install the turbin\/es?<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"item-tab-right\">\n                    <span class=\"item-tab-status\">Action required<\/span>\n                    <i class=\"fas fa-chevron-down item-tab-icon\"><\/i>\n                <\/div>\n            <\/div>\n            <div class=\"item-tab-body\">\n                <div class=\"item-tab-content\">\n                            <div id=\"tab-ubicacion-content\">\n            <p style=\"color: var(--mfm-text); margin-bottom: 20px; text-align: center;\">\n                Select the location type for mini-wind installation:            <\/p>\n            <div class=\"item-cards\">\n                <div class=\"item-card\" onclick=\"seleccionarUbicacionMini('cubierta')\" data-value=\"cubierta\">\n                    <div class=\"item-card-icon\"><i class=\"fas fa-home\"><\/i><\/div>\n                    <div class=\"item-card-title\">Building\/House Roof<\/div>\n                    <div class=\"item-card-desc\">Installation on roof<\/div>\n                <\/div>\n                <div class=\"item-card\" onclick=\"seleccionarUbicacionMini('terreno')\" data-value=\"terreno\">\n                    <div class=\"item-card-icon\"><i class=\"fas fa-mountain\"><\/i><\/div>\n                    <div class=\"item-card-title\">Land<\/div>\n                    <div class=\"item-card-desc\">Installation on plot<\/div>\n                <\/div>\n                <div class=\"item-card\" onclick=\"seleccionarUbicacionMini('ambas')\" data-value=\"ambas\">\n                    <div class=\"item-card-icon\"><i class=\"fas fa-layer-group\"><\/i><\/div>\n                    <div class=\"item-card-title\">Both<\/div>\n                    <div class=\"item-card-desc\">Roof + Land<\/div>\n                <\/div>\n                <div class=\"item-card\" onclick=\"seleccionarUbicacionMini('no_se')\" data-value=\"no_se\">\n                    <div class=\"item-card-icon\"><i class=\"fas fa-question-circle\"><\/i><\/div>\n                    <div class=\"item-card-title\">I don\\&#039;t know<\/div>\n                    <div class=\"item-card-desc\">I haven\\&#039;t decided yet<\/div>\n                <\/div>\n            <\/div>\n            <div id=\"btn-continuar-minieolica\" class=\"item-btn-group\" style=\"display: none; justify-content: center; margin-top: 20px;\">\n                <button type=\"button\" class=\"item-btn item-btn-primary\" onclick=\"finalizarMinieolicaNoSe(); return false;\">\n                    <i class=\"fas fa-check\"><\/i> Confirm                <\/button>\n            <\/div>\n        <\/div>\n        <script>\n        window.minieolicaTipoUbicacion = '';\n        var txtStatusCompleto = 'Completed';\n        function seleccionarUbicacionMini(tipo) {\n            document.querySelectorAll('#tab-ubicacion-content .item-card').forEach(card => {\n                card.classList.remove('selected');\n            });\n            const card = document.querySelector(`#tab-ubicacion-content .item-card[data-value=\"${tipo}\"]`);\n            if (card) card.classList.add('selected');\n            window.minieolicaTipoUbicacion = tipo;\n            if (window.itemData) {\n                window.itemData.ubicacion_mini = tipo;\n            }\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('ubicacion_mini', tipo);\n                \/\/ Debug: mostrar combinaci\u00f3n actual y campos v\u00e1lidos\n                if (typeof window.RoseoStateV2.debugCurrentCombination === 'function') {\n                    window.RoseoStateV2.debugCurrentCombination();\n                }\n            }\n            if (window.RoseoRouter && typeof window.RoseoRouter.saveField === 'function') {\n                window.RoseoRouter.saveField('minieolica_tipo_ubicacion', tipo);\n            }\n            \n            \/\/ CRITICAL: Limpiar pol\u00edgonos que ya no aplican seg\u00fan el nuevo tipo seleccionado\n            limpiarPoligonosMiniNoAplicables(tipo);\n            \n            const tab = document.getElementById('tab-ubicacion');\n            if (tab) {\n                tab.classList.add('completed');\n                tab.querySelector('.item-tab-status').textContent = txtStatusCompleto;\n            }\n            const btnContinuar = document.getElementById('btn-continuar-minieolica');\n            if (tipo === 'no_se') {\n                 if (btnContinuar) btnContinuar.style.display = 'none';\n            } else {\n                 if (btnContinuar) btnContinuar.style.display = 'none';\n            }\n            setTimeout(() => {\n                generarTabsMiniEolica(tipo);\n                if (tipo === 'terreno' || tipo === 'ambas' || tipo === 'no_se') {\n                    if (typeof habilitarTab === 'function') habilitarTab('terreno');\n                    if (typeof toggleTab === 'function') toggleTab('terreno');\n                } else if (tipo === 'cubierta') {\n                    if (typeof habilitarTab === 'function') habilitarTab('cubierta');\n                    if (typeof toggleTab === 'function') toggleTab('cubierta');\n                }\n            }, 300);\n        }\n        \n        \/**\n         * Limpia los pol\u00edgonos Mini que ya no aplican seg\u00fan el tipo de ubicaci\u00f3n seleccionado\n         * Ej: Si cambia de \"ambas\" a \"terreno\", elimina pol\u00edgonos de cubierta\n         *\/\n        function limpiarPoligonosMiniNoAplicables(nuevoTipo) {\n            \/\/ Si es \"terreno\" => limpiar cubierta\n            if (nuevoTipo === 'terreno') {\n                if (window.itemData) {\n                    window.itemData.poligonos_mini_cubierta = [];\n                    window.itemData.geojson_mini_cubierta = null;\n                    \/\/ Limpiar campos de cubierta mini (con prefijo _mini_)\n                    window.itemData.cubierta_mini_tipologia = null;\n                    window.itemData.cubierta_mini_acceso = null;\n                    window.itemData.cubierta_mini_futuras_obras = null;\n                    window.itemData.cubierta_mini_obras_descripcion = null;\n                    window.itemData.cubierta_mini_comentarios = null;\n                }\n                if (window.RoseoStateV2) {\n                    window.RoseoStateV2.setPolygons('mini_cubierta', []);\n                    window.RoseoStateV2.setLocationField('geojson_mini_cubierta', null);\n                    window.RoseoStateV2.setLocationField('cubierta_mini_tipologia', null);\n                    window.RoseoStateV2.setLocationField('cubierta_mini_acceso', null);\n                }\n                \/\/ Reset visual del tab cubierta\n                const tabCubierta = document.getElementById('tab-cubierta');\n                if (tabCubierta) {\n                    tabCubierta.classList.remove('completed');\n                    const status = tabCubierta.querySelector('.item-tab-status');\n                    if (status) status.textContent = '';\n                }\n            }\n            \/\/ Si es \"cubierta\" => limpiar terreno\n            else if (nuevoTipo === 'cubierta') {\n                if (window.itemData) {\n                    window.itemData.poligonos_mini_terreno = [];\n                    window.itemData.geojson_mini_terreno = null;\n                    \/\/ Limpiar campos de terreno mini (con prefijo _mini_)\n                    window.itemData.terreno_mini_acceso = null;\n                    window.itemData.terreno_mini_futuras_obras = null;\n                    window.itemData.terreno_mini_obras_descripcion = null;\n                    window.itemData.terreno_mini_comentarios = null;\n                }\n                if (window.RoseoStateV2) {\n                    window.RoseoStateV2.setPolygons('mini_terreno', []);\n                    window.RoseoStateV2.setLocationField('geojson_mini_terreno', null);\n                    window.RoseoStateV2.setLocationField('terreno_mini_acceso', null);\n                    window.RoseoStateV2.setLocationField('terreno_mini_futuras_obras', null);\n                }\n                \/\/ Reset visual del tab terreno\n                const tabTerreno = document.getElementById('tab-terreno');\n                if (tabTerreno) {\n                    tabTerreno.classList.remove('completed');\n                    const status = tabTerreno.querySelector('.item-tab-status');\n                    if (status) status.textContent = '';\n                }\n            }\n            \/\/ Si es \"ambas\" o \"no_se\" => no limpiar nada, permite ambos tipos\n        }\n        \n        function finalizarMinieolicaNoSe() {\n             if (typeof irAlHubOSiguiente === 'function') {\n                 irAlHubOSiguiente();\n             }\n        }\n        function finalizarMinieolica() {\n            \/\/ Evitar llamadas m\u00faltiples\n            if (window._finalizandoMinieolica) return;\n            window._finalizandoMinieolica = true;\n            \n            let tipoInstalacion = window.itemData?.tipo_instalacion || '';\n            if (!tipoInstalacion && window.RoseoStateV2) {\n                const state = window.RoseoStateV2.getState();\n                tipoInstalacion = (state.current_location && state.current_location.tipo_instalacion) ||\n                                  (state.form && state.form.tipo_instalacion) || '';\n            }\n            if (!tipoInstalacion) {\n                tipoInstalacion = window.roseoTipoInstalacion || '';\n            }\n            \n            \/\/ \u2705 FIX: Sincronizar pol\u00edgonos Mini a StateV2 UNA SOLA VEZ antes de transici\u00f3n\n            if (window.RoseoStateV2) {\n                \n                \/\/ Sync terreno polygons (solo si hay datos)\n                if (window.itemData.poligonos_mini_terreno && window.itemData.poligonos_mini_terreno.length > 0) {\n                    window.RoseoStateV2.setPolygons('mini_terreno', window.itemData.poligonos_mini_terreno);\n                } else if (window.itemData.geojson_mini_terreno) {\n                    try {\n                        const geo = typeof window.itemData.geojson_mini_terreno === 'string' \n                            ? JSON.parse(window.itemData.geojson_mini_terreno) \n                            : window.itemData.geojson_mini_terreno;\n                        const features = geo.features || [geo];\n                        window.RoseoStateV2.setPolygons('mini_terreno', features);\n                    } catch(e) { \/* parse error *\/ }\n                }\n                \n                \/\/ Sync cubierta polygons (solo si hay datos)\n                if (window.itemData.poligonos_mini_cubierta && window.itemData.poligonos_mini_cubierta.length > 0) {\n                    window.RoseoStateV2.setPolygons('mini_cubierta', window.itemData.poligonos_mini_cubierta);\n                } else if (window.itemData.geojson_mini_cubierta) {\n                    try {\n                        const geo = typeof window.itemData.geojson_mini_cubierta === 'string' \n                            ? JSON.parse(window.itemData.geojson_mini_cubierta) \n                            : window.itemData.geojson_mini_cubierta;\n                        const features = geo.features || [geo];\n                        window.RoseoStateV2.setPolygons('mini_cubierta', features);\n                    } catch(e) { \/* parse error *\/ }\n                }\n                \n                \/\/ \u2705 FIX: Sincronizar TAMBI\u00c9N los campos de texto (comentarios y obras)\n                \/\/ que pueden haberse guardado en itemData pero no en StateV2\n                if (window.itemData.terreno_mini_comentarios)\n                    window.RoseoStateV2.setLocationField('terreno_mini_comentarios', window.itemData.terreno_mini_comentarios);\n                if (window.itemData.terreno_mini_obras_descripcion)\n                    window.RoseoStateV2.setLocationField('terreno_mini_obras_descripcion', window.itemData.terreno_mini_obras_descripcion);\n                if (window.itemData.terreno_mini_acceso)\n                    window.RoseoStateV2.setLocationField('terreno_mini_acceso', window.itemData.terreno_mini_acceso);\n                if (window.itemData.terreno_mini_futuras_obras)\n                    window.RoseoStateV2.setLocationField('terreno_mini_futuras_obras', window.itemData.terreno_mini_futuras_obras);\n                if (window.itemData.cubierta_mini_comentarios)\n                    window.RoseoStateV2.setLocationField('cubierta_mini_comentarios', window.itemData.cubierta_mini_comentarios);\n                if (window.itemData.cubierta_mini_obras_descripcion)\n                    window.RoseoStateV2.setLocationField('cubierta_mini_obras_descripcion', window.itemData.cubierta_mini_obras_descripcion);\n                if (window.itemData.cubierta_mini_tipologia)\n                    window.RoseoStateV2.setLocationField('cubierta_mini_tipologia', window.itemData.cubierta_mini_tipologia);\n                if (window.itemData.cubierta_mini_acceso)\n                    window.RoseoStateV2.setLocationField('cubierta_mini_acceso', window.itemData.cubierta_mini_acceso);\n                if (window.itemData.cubierta_mini_futuras_obras)\n                    window.RoseoStateV2.setLocationField('cubierta_mini_futuras_obras', window.itemData.cubierta_mini_futuras_obras);\n\n                \/\/ \u2705 FIX: Tambi\u00e9n sincronizar campos FV si es tipo mini_fv\n                if (window.itemData.terreno_fv_acceso) window.RoseoStateV2.setLocationField('terreno_fv_acceso', window.itemData.terreno_fv_acceso);\n                if (window.itemData.terreno_fv_futuras_obras) window.RoseoStateV2.setLocationField('terreno_fv_futuras_obras', window.itemData.terreno_fv_futuras_obras);\n                if (window.itemData.terreno_fv_obras_descripcion) window.RoseoStateV2.setLocationField('terreno_fv_obras_descripcion', window.itemData.terreno_fv_obras_descripcion);\n                if (window.itemData.terreno_fv_comentarios) window.RoseoStateV2.setLocationField('terreno_fv_comentarios', window.itemData.terreno_fv_comentarios);\n                if (window.itemData.cubierta_fv_tipologia) window.RoseoStateV2.setLocationField('cubierta_fv_tipologia', window.itemData.cubierta_fv_tipologia);\n                if (window.itemData.cubierta_fv_acceso) window.RoseoStateV2.setLocationField('cubierta_fv_acceso', window.itemData.cubierta_fv_acceso);\n                if (window.itemData.cubierta_fv_futuras_obras) window.RoseoStateV2.setLocationField('cubierta_fv_futuras_obras', window.itemData.cubierta_fv_futuras_obras);\n                if (window.itemData.cubierta_fv_obras_descripcion) window.RoseoStateV2.setLocationField('cubierta_fv_obras_descripcion', window.itemData.cubierta_fv_obras_descripcion);\n                if (window.itemData.cubierta_fv_comentarios) window.RoseoStateV2.setLocationField('cubierta_fv_comentarios', window.itemData.cubierta_fv_comentarios);\n\n                \/\/ Save to localStorage immediately (sin re-logging cada campo)\n                window.RoseoStateV2.saveToStorage();\n            }\n            \n            \/\/ Reset flag despu\u00e9s de procesar\n            setTimeout(() => { window._finalizandoMinieolica = false; }, 500);\n            \n            \/\/ Si es 'mini_fv', verificar si falta FV y cambiar de componente\n            if (tipoInstalacion === 'mini_fv' || tipoInstalacion === 'fv_ampliar_mini') {\n                const tieneDatosFV = (window.itemData.geojson_fv || (window.itemData.poligonos_fv && window.itemData.poligonos_fv.length > 0) || window.itemData.ubicacion_fv);\n                \n                if (!tieneDatosFV) {\n                    \/\/ Cambiar a componente FV\n                     if (typeof activarNuevoComponente === 'function') {\n                        \/\/ Intentar activar componente FV\n                        const compMini = document.getElementById('componente-minieolica');\n                        const tabActivo = compMini ? compMini.querySelector('.item-tab.active') : null;\n                        const tabId = tabActivo ? tabActivo.id : null;\n                        if (tabId) {\n                            activarNuevoComponente(tabId, 'componente-fv-instalacion');\n                        } else {\n                            \/\/ Fallback manual\n                            window.activarFVInstalacion();\n                        }\n                    } else {\n                        window.activarFVInstalacion();\n                    }\n                    return;\n                }\n            }\n            \/\/ Si no es combinado o ya tiene todo, finalizar normal\n            if (typeof finalizarItem === 'function') {\n                finalizarItem();\n            } else if (typeof irAlHubOSiguiente === 'function') {\n                irAlHubOSiguiente();\n            }\n        }\n        function generarTabsMiniEolica(tipo) {\n            const tabTerreno = document.getElementById('tab-terreno');\n            const tabCubierta = document.getElementById('tab-cubierta');\n            if (tabTerreno) tabTerreno.style.display = 'none';\n            if (tabCubierta) tabCubierta.style.display = 'none';\n            if (tipo === 'ambas' || tipo === 'no_se') {\n                if (tabTerreno) tabTerreno.style.display = '';\n                if (tabCubierta) tabCubierta.style.display = '';\n            } else if (tipo === 'terreno') {\n                if (tabTerreno) tabTerreno.style.display = '';\n            } else if (tipo === 'cubierta') {\n                if (tabCubierta) tabCubierta.style.display = '';\n            }\n        }\n        <\/script>\n                        <\/div>\n            <\/div>\n        <\/div>\n                                                    <div class=\"item-tab mini-tab-static\" id=\"tab-terreno\" data-tab=\"terreno\" style=\"display:none;\">\n            <div class=\"item-tab-header\" onclick=\"toggleTab('terreno')\">\n                <div class=\"item-tab-left\">\n                    <div class=\"item-tab-number\">2<\/div>\n                    <div class=\"item-tab-title\">\n                        <h3><i class=\"fas fa-mountain\"><\/i> Land\/Plot<\/h3>\n                        <p>Delimit and describe the land<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"item-tab-right\">\n                    <span class=\"item-tab-status\">Action required<\/span>\n                    <i class=\"fas fa-chevron-down item-tab-icon\"><\/i>\n                <\/div>\n            <\/div>\n            <div class=\"item-tab-body\">\n                <div class=\"item-tab-content\">\n                            <div id=\"tab-terreno-content\">\n            <div class=\"item-field show\">\n                <label><i class=\"fas fa-road\"><\/i> Land access type<\/label>\n                <select id=\"input-mini-terreno-acceso\" onchange=\"seleccionarAccesoTerreno(this.value)\">\n                    <option value=\"\">Select access type...<\/option>\n                    <option value=\"carretera_asfaltada\">By paved road<\/option>\n                    <option value=\"camino_tierra\">By dirt or gravel road<\/option>\n                    <option value=\"servidumbre_paso\">Through right of way<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"item-field show\" style=\"margin-top: 20px;\">\n                <label><i class=\"fas fa-hard-hat\"><\/i> Are future works planned?<\/label>\n                <div style=\"display: flex; gap: 20px; margin-top: 10px;\">\n                    <label style=\"display: flex; align-items: center; gap: 8px; cursor: pointer;\">\n                        <input type=\"radio\" name=\"mini_terreno_futuras_obras\" value=\"no\" onchange=\"toggleFuturasObrasTerreno(false)\" checked>\n                        <span>No<\/span>\n                    <\/label>\n                    <label style=\"display: flex; align-items: center; gap: 8px; cursor: pointer;\">\n                        <input type=\"radio\" name=\"mini_terreno_futuras_obras\" value=\"si\" onchange=\"toggleFuturasObrasTerreno(true)\">\n                        <span>Yes<\/span>\n                    <\/label>\n                <\/div>\n            <\/div>\n            <div id=\"mini-terreno-futuras-obras-detalle\" class=\"item-field\" style=\"margin-top: 15px; display: none;\">\n                <label><i class=\"fas fa-edit\"><\/i> Describe planned work\/s<\/label>\n                <textarea id=\"input-mini-terreno-obras-descripcion\" \n                          placeholder=\"Describe future works planned on the land...\"\n                          rows=\"3\"\n                          style=\"width: 100%; padding: 12px; border: 2px solid var(--mfm-border); border-radius: 8px; font-size: 14px; font-family: inherit; resize: vertical;\"><\/textarea>\n            <\/div>\n            <div class=\"item-field show\" style=\"margin-top: 20px;\">\n                <label><i class=\"fas fa-comment-alt\"><\/i> Land comments<\/label>\n                <textarea id=\"input-mini-terreno-comentarios\" \n                          placeholder=\"Describe land characteristics: topography, orientation, etc...\"\n                          rows=\"4\"\n                          style=\"width: 100%; padding: 12px; border: 2px solid var(--mfm-border); border-radius: 8px; font-size: 14px; font-family: inherit; resize: vertical;\"><\/textarea>\n            <\/div>\n            <div class=\"item-field show\" style=\"margin-top: 20px;\">\n                <label><i class=\"fas fa-map-marked-alt\"><\/i> Land area<\/label>\n                <input type=\"hidden\" id=\"input-mapaMinieolicaTerreno\" name=\"geojson_mini_terreno\">\n<div class=\"mapa-button-container\" style=\"display: block !important; margin-top: 10px;\">\n    <button type=\"button\" class=\"btn-abrir-mapa\" onclick=\"abrirMapa_mapaMinieolicaTerreno(); return false;\" style=\"display: inline-flex !important;\">\n        <i class=\"fas fa-map-marked-alt\"><\/i> Draw land polygon    <\/button>\n<\/div>\n<div id=\"resumen-mapaMinieolicaTerreno\" class=\"mapa-resumen\" style=\"display:none;\">\n    <div class=\"mapa-resumen-preview\" id=\"preview-mapaMinieolicaTerreno\">\n        <!-- Mini-mapa est\u00e1tico se insertar\u00e1 aqu\u00ed -->\n    <\/div>\n    <div class=\"mapa-resumen-info\">\n        <i class=\"fas fa-check-circle\"><\/i> \n        <span>Polygon drawn - Area: <strong id=\"area-texto-mapaMinieolicaTerreno\">0<\/strong> ha<\/span>\n        <button type=\"button\" class=\"btn-reabrir\" onclick=\"abrirMapa_mapaMinieolicaTerreno(); return false;\">\n            <i class=\"fas fa-edit\"><\/i> Edit        <\/button>\n    <\/div>\n<\/div>\n<style>\n.mapa-resumen {\n    display: flex !important;\n    flex-direction: column;\n    gap: 10px;\n    margin-top: 10px;\n    padding: 12px;\n    background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);\n    border-radius: 12px;\n    border: 1px solid var(--mfm-border, #ddd);\n}\n.mapa-resumen-preview {\n    width: 100%;\n    height: 120px;\n    border-radius: 8px;\n    overflow: hidden;\n    background: #eee;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n.mapa-resumen-preview img {\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n}\n.mapa-resumen-preview .preview-placeholder {\n    color: #999;\n    font-size: 12px;\n}\n.mapa-resumen-info {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    flex-wrap: wrap;\n}\n.mapa-resumen-info i.fa-check-circle {\n    color: var(--mfm-secondary, #009239);\n    font-size: 18px;\n}\n.mapa-resumen-info span {\n    flex: 1;\n    font-size: 14px;\n}\n.btn-reabrir {\n    padding: 6px 12px;\n    font-size: 12px;\n    background: var(--mfm-primary, #015328);\n    color: white;\n    border: none;\n    border-radius: 6px;\n    cursor: pointer;\n    transition: background 0.2s;\n}\n.btn-reabrir:hover {\n    background: var(--mfm-secondary, #009239);\n}\n@media (min-width: 480px) {\n    .mapa-resumen {\n        flex-direction: row;\n        align-items: stretch;\n    }\n    .mapa-resumen-preview {\n        width: 160px;\n        height: auto;\n        min-height: 100px;\n        flex-shrink: 0;\n    }\n    .mapa-resumen-info {\n        flex: 1;\n    }\n}\n<\/style>\n<div id=\"modal-mapaMinieolicaTerreno\" class=\"mapa-modal-fullscreen\">\n    <div class=\"mapa-modal-header\">\n        <div class=\"header-top\">\n            <h3><i class=\"fas fa-map-marked-alt\"><\/i> Delimit the land area for mini-wind installation<\/h3>\n            <button type=\"button\" class=\"modal-close\" onclick=\"cerrarMapa_mapaMinieolicaTerreno(); return false;\">&times;<\/button>\n        <\/div>\n        <div class=\"header-instrucciones\">\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-search-location\"><\/i>\n                <span><strong>1.<\/strong> Search for your location<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-draw-polygon\"><\/i>\n                <span><strong>2.<\/strong> Click on the polygon button (top left)<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-mouse-pointer\"><\/i>\n                <span><strong>3.<\/strong> Click on the map to create each vertex<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-check-circle\"><\/i>\n                <span><strong>4.<\/strong> Double click to close the polygon<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-trash\"><\/i>\n                <span><strong>5.<\/strong> Use the trash icon to delete and redraw<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div class=\"mapa-modal-body\">\n        <div id=\"mapaMinieolicaTerreno\" class=\"mapa-container-full\"><\/div>\n        <div id=\"status-mapaMinieolicaTerreno\" class=\"mapa-status\">\n            <i class=\"fas fa-info-circle\"><\/i> Draw your installation polygon        <\/div>\n    <\/div>\n    <div class=\"mapa-modal-footer\">\n        <div class=\"footer-stats\">\n            <span id=\"stats-mapaMinieolicaTerreno\">Area: <strong>0<\/strong> ha<\/span>\n        <\/div>\n        <div class=\"footer-actions\">\n            <button type=\"button\" class=\"btn-cancelar\" onclick=\"cerrarMapa_mapaMinieolicaTerreno(); return false;\">\n                <i class=\"fas fa-times\"><\/i> Cancel            <\/button>\n            <button type=\"button\" id=\"btn-guardar-mapaMinieolicaTerreno\" class=\"btn-guardar\" onclick=\"guardarMapa_mapaMinieolicaTerreno(); return false;\" disabled>\n                <i class=\"fas fa-save\"><\/i> Save polygon            <\/button>\n        <\/div>\n    <\/div>\n<\/div>\n<script>\nif (!window.RoseoMapManager) {\n    window.RoseoMapManager = {\n        map: null,\n        draw: null,\n        currentPolygon: null,\n        lastAddress: null,\n        lastMapPosition: null, \/\/ \u2705 FIX: Guardar \u00faltima posici\u00f3n del mapa\n        \n        \/\/ \u2705 FIX: Funci\u00f3n para obtener la \u00faltima posici\u00f3n guardada\n        getLastPosition: function() {\n            \/\/ 1. Primero intentar desde memoria\n            if (this.lastMapPosition) {\n                return this.lastMapPosition;\n            }\n            \/\/ 2. Luego desde sessionStorage\n            try {\n                const saved = sessionStorage.getItem('roseo_last_map_position');\n                if (saved) {\n                    return JSON.parse(saved);\n                }\n            } catch (e) {}\n            \/\/ 3. Default: Portugalete\n            return null;\n        },\n        \n        \/\/ \u2705 FIX: Funci\u00f3n para guardar la posici\u00f3n actual\n        saveCurrentPosition: function() {\n            if (!this.map) return;\n            const center = this.map.getCenter();\n            const zoom = this.map.getZoom();\n            this.lastMapPosition = {\n                center: [center.lng, center.lat],\n                zoom: zoom\n            };\n            try {\n                sessionStorage.setItem('roseo_last_map_position', JSON.stringify(this.lastMapPosition));\n            } catch (e) {}\n            console.log('[MAP] Posici\u00f3n guardada:', this.lastMapPosition);\n        },\n        \n        init: function(containerId, options = {}) {\n            \/\/ \u2705 FIX: Usar \u00faltima posici\u00f3n guardada si existe\n            const lastPos = this.getLastPosition();\n            const defaults = {\n                center: lastPos ? lastPos.center : [-3.022731543334405, 43.327417650863055],\n                zoom: lastPos ? lastPos.zoom : 14,\n                fieldId: 'item-geojson'\n            };\n            const config = { ...defaults, ...options };\n            const MAPBOX_TOKEN = 'pk.eyJ1IjoiY2J1c3RhbWEiLCJhIjoiY21tdzM2ajkwMmdvMDJwc2I4cXgxeDhqcCJ9.WNQRvG6BOPVp6ucyQXLkAA';\n            mapboxgl.accessToken = MAPBOX_TOKEN;\n            this.map = new mapboxgl.Map({\n                container: containerId,\n                style: 'mapbox:\/\/styles\/mapbox\/satellite-v9',\n                center: config.center,\n                zoom: config.zoom\n            });\n            \n            \/\/ \u2705 FIX: Guardar posici\u00f3n cuando el usuario mueve el mapa\n            this.map.on('moveend', () => {\n                this.saveCurrentPosition();\n            });\n            \n            const geocoder = new MapboxGeocoder({\n                accessToken: mapboxgl.accessToken,\n                mapboxgl: mapboxgl,\n                placeholder: 'Search address...',\n                countries: 'es',\n                language: 'es',\n                marker: { color: '#009239' },\n                flyTo: { speed: 1.2, zoom: 18, essential: true }\n            });\n            geocoder.on('result', (e) => {\n                if (e && e.result) {\n                    this.lastAddress = e.result.place_name || e.result.text;\n                    \/\/ \u2705 FIX: Guardar posici\u00f3n despu\u00e9s de b\u00fasqueda\n                    setTimeout(() => this.saveCurrentPosition(), 1500);\n                }\n            });\n            this.map.addControl(geocoder, 'top-right');\n            this.draw = new MapboxDraw({\n                displayControlsDefault: false,\n                controls: { polygon: true, trash: true },\n                styles: [\n                    {\n                        'id': 'gl-draw-polygon-fill-active',\n                        'type': 'fill',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'true']],\n                        'paint': { 'fill-color': '#B3C8BB', 'fill-opacity': 0.4 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-stroke-active',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'true']],\n                        'paint': { 'line-color': '#009239', 'line-width': 3 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-fill-inactive',\n                        'type': 'fill',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'false']],\n                        'paint': { 'fill-color': '#B3C8BB', 'fill-opacity': 0.4 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-stroke-inactive',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'false']],\n                        'paint': { 'line-color': '#009239', 'line-width': 3 }\n                    },\n                    {\n                        'id': 'gl-draw-line-active',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'LineString'], ['==', 'active', 'true']],\n                        'paint': { 'line-color': '#009239', 'line-width': 2 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-and-line-vertex-active',\n                        'type': 'circle',\n                        'filter': ['all', ['==', 'meta', 'vertex'], ['==', '$type', 'Point']],\n                        'paint': { 'circle-radius': 5, 'circle-color': '#009239' }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-midpoint',\n                        'type': 'circle',\n                        'filter': ['all', ['==', 'meta', 'midpoint'], ['==', '$type', 'Point']],\n                        'paint': { 'circle-radius': 3, 'circle-color': '#54595F' }\n                    }\n                ]\n            });\n            this.map.addControl(this.draw, 'top-left');\n            this.map.on('draw.create', (e) => {\n                if (this.currentPolygon) this.draw.delete(this.currentPolygon);\n                this.currentPolygon = e.features[0].id;\n            });\n            this.map.on('draw.delete', () => {\n                this.currentPolygon = null;\n            });\n            this.fieldId = config.fieldId;\n            return this;\n        },\n        getGeoJSON: function() {\n            const allFeatures = this.draw.getAll();\n            if (allFeatures.features.length === 0) {\n                return {\n                    type: \"FeatureCollection\",\n                    features: [],\n                    metadata: {\n                        total_polygons: 0,\n                        center_location: null,\n                        total_area_ha: 0\n                    }\n                };\n            }\n            const feature = allFeatures.features[0];\n            const coords = feature.geometry.coordinates[0];\n            let sumLng = 0, sumLat = 0;\n            coords.forEach(coord => {\n                sumLng += coord[0];\n                sumLat += coord[1];\n            });\n            const centerLng = sumLng \/ coords.length;\n            const centerLat = sumLat \/ coords.length;\n            let area = 0;\n            for (let i = 0; i < coords.length - 1; i++) {\n                const j = (i + 1);\n                area += coords[i][0] * coords[j][1];\n                area -= coords[j][0] * coords[i][1];\n            }\n            area = Math.abs(area \/ 2.0);\n            const areaM2 = area * 111000 * 111000;\n            feature.properties = {\n                created_at: new Date().toISOString(),\n                center_lat: centerLat,\n                center_lng: centerLng,\n                area_m2: Math.round(areaM2),\n                area_ha: (areaM2 \/ 10000).toFixed(2),\n                address: this.lastAddress || ''\n            };\n            return {\n                type: \"FeatureCollection\",\n                features: [feature],\n                metadata: {\n                    total_polygons: 1,\n                    center_location: [centerLat, centerLng],\n                    total_area_ha: (areaM2 \/ 10000).toFixed(2)\n                }\n            };\n        },\n        getPolygonCount: function() {\n            return this.currentPolygon ? 1 : 0;\n        },\n        clearAll: function() {\n            if (this.draw) {\n                this.draw.deleteAll();\n            }\n            this.currentPolygon = null;\n        },\n        resize: function() {\n            if (this.map) {\n                setTimeout(() => this.map.resize(), 100);\n            }\n        },\n        destroy: function() {\n            if (this.draw) {\n                this.map.removeControl(this.draw);\n                this.draw = null;\n            }\n            if (this.map) {\n                this.map.remove();\n                this.map = null;\n            }\n            this.currentPolygon = null;\n        }\n    };\n}\n(function(){\nconst mapId='mapaMinieolicaTerreno';\nconst callbackFn='onMapaMiniTerrenoGuardado';\nif (!window.RoseoMapInstances) {\n    window.RoseoMapInstances = {};\n}\nwindow['abrirMapa_'+mapId]=function(){\n    document.getElementById('modal-'+mapId).classList.add('show');\n    setTimeout(function(){\n        if(!window.RoseoMapManager){\n            return;\n        }\n        \n        if(!window.RoseoMapInstances[mapId]){\n            window.RoseoMapInstances[mapId] = Object.create(window.RoseoMapManager);\n            \/\/ \u2705 FIX: Usar \u00faltima posici\u00f3n guardada del mapa\n            const lastPos = window.RoseoMapManager.getLastPosition();\n            window.RoseoMapInstances[mapId].init(mapId,{\n                center: lastPos ? lastPos.center : [-3.022731543334405, 43.327417650863055],\n                zoom: lastPos ? lastPos.zoom : 14,\n                fieldId:'input-'+mapId\n            });\n            if (window.RoseoMapInstances[mapId].map) {\n                window.RoseoMapInstances[mapId].map.on('load', function() {\n                    setTimeout(function() {\n                        window.RoseoMapInstances[mapId].map.resize();\n                    }, 100);\n                });\n            }\n        }else{\n            \/\/ \u2705 FIX: NO borrar pol\u00edgono existente al reabrir - solo redimensionar\n            window.RoseoMapInstances[mapId].resize();\n            setTimeout(function() {\n                window.RoseoMapInstances[mapId].resize();\n            }, 300);\n        }\n        actualizarEstado(null);\n    },200);\n};\nwindow['cerrarMapa_'+mapId]=function(){\n    const poligonos=window.RoseoMapInstances[mapId]?window.RoseoMapInstances[mapId].getPolygonCount():0;\n    if(poligonos>0&&!document.getElementById('input-'+mapId).value){\n        if(!confirm('Warning! You are going to leave without saving the polygon'))return;\n    }\n    if(window.RoseoMapInstances[mapId]){\n        window.RoseoMapInstances[mapId].clearAll();\n    }\n    document.getElementById('modal-'+mapId).classList.remove('show');\n};\nwindow['guardarMapa_'+mapId]=function(){\n    const mapInstance = window.RoseoMapInstances[mapId];\n    if(!mapInstance || mapInstance.getPolygonCount()===0){\n        alert('Please draw the polygon on the map.');\n        return;\n    }\n    const featureCollection=mapInstance.getGeoJSON();\n    const f=featureCollection.features[0];\n    const areaHa=f.properties.area_ha;\n    const geojsonStr=JSON.stringify(f);\n    \n    document.getElementById('input-'+mapId).value=geojsonStr;\n    document.getElementById('area-texto-'+mapId).textContent=areaHa;\n    document.getElementById('resumen-'+mapId).style.display='flex';\n    \n    \/\/ \u2705 Generar mini-mapa est\u00e1tico con Mapbox Static Images API\n    generarMiniMapa(mapId, f);\n    \n    document.getElementById('modal-'+mapId).classList.remove('show');\n    const fieldName = 'geojson_mini_terreno';\n    if (window.itemData && fieldName) {\n        window.itemData[fieldName] = geojsonStr;\n    }\n    document.dispatchEvent(new CustomEvent('mapa-poligono-completado',{\n        detail:{\n            mapId:mapId,\n            area_ha:areaHa,\n            geojson:featureCollection,\n            feature:f\n        }\n    }));\n    if(callbackFn&&typeof window[callbackFn]==='function'){\n        window[callbackFn](featureCollection,f,areaHa);\n    }\n};\n\n\/\/ \u2705 FIX: Funci\u00f3n para generar mini-mapa est\u00e1tico\nfunction generarMiniMapa(mapId, feature) {\n    const previewEl = document.getElementById('preview-' + mapId);\n    if (!previewEl) return;\n    \n    try {\n        const coords = feature.geometry.coordinates[0];\n        const center = [feature.properties.center_lng, feature.properties.center_lat];\n        \n        \/\/ Calcular el bounding box para zoom apropiado\n        let minLng = coords[0][0], maxLng = coords[0][0];\n        let minLat = coords[0][1], maxLat = coords[0][1];\n        coords.forEach(c => {\n            minLng = Math.min(minLng, c[0]);\n            maxLng = Math.max(maxLng, c[0]);\n            minLat = Math.min(minLat, c[1]);\n            maxLat = Math.max(maxLat, c[1]);\n        });\n        \n        \/\/ Calcular zoom basado en el tama\u00f1o del pol\u00edgono\n        const diffLng = maxLng - minLng;\n        const diffLat = maxLat - minLat;\n        const maxDiff = Math.max(diffLng, diffLat);\n        let zoom = 15;\n        if (maxDiff > 0.1) zoom = 10;\n        else if (maxDiff > 0.05) zoom = 11;\n        else if (maxDiff > 0.02) zoom = 12;\n        else if (maxDiff > 0.01) zoom = 13;\n        else if (maxDiff > 0.005) zoom = 14;\n        else zoom = 15;\n        \n        \/\/ Crear overlay GeoJSON para el pol\u00edgono\n        const geoJsonOverlay = encodeURIComponent(JSON.stringify({\n            type: 'Feature',\n            properties: {\n                'stroke': '#009239',\n                'stroke-width': 3,\n                'stroke-opacity': 1,\n                'fill': '#B3C8BB',\n                'fill-opacity': 0.4\n            },\n            geometry: feature.geometry\n        }));\n        \n        \/\/ Construir URL de Mapbox Static Images\n        const mapboxToken = 'pk.eyJ1IjoiY2J1c3RhbWEiLCJhIjoiY21tdzM2ajkwMmdvMDJwc2I4cXgxeDhqcCJ9.WNQRvG6BOPVp6ucyQXLkAA';\n        const staticUrl = `https:\/\/api.mapbox.com\/styles\/v1\/mapbox\/satellite-v9\/static\/geojson(${geoJsonOverlay})\/${center[0]},${center[1]},${zoom},0\/300x150@2x?access_token=${mapboxToken}`;\n        \n        \/\/ Crear elemento imagen\n        const img = document.createElement('img');\n        img.src = staticUrl;\n        img.alt = 'Vista previa del pol\u00edgono';\n        img.loading = 'lazy';\n        img.onerror = function() {\n            \/\/ Fallback: mostrar placeholder si falla\n            previewEl.innerHTML = '<div class=\"preview-placeholder\"><i class=\"fas fa-map\"><\/i> Pol\u00edgono guardado<\/div>';\n        };\n        \n        previewEl.innerHTML = '';\n        previewEl.appendChild(img);\n        \n    } catch (e) {\n        console.warn('[MiniMapa] Error generando preview:', e);\n        previewEl.innerHTML = '<div class=\"preview-placeholder\"><i class=\"fas fa-check-circle\"><\/i> Pol\u00edgono guardado<\/div>';\n    }\n}\nfunction actualizarEstado(feature){\n    const statusEl=document.getElementById('status-'+mapId);\n    const statsEl=document.getElementById('stats-'+mapId);\n    const btnGuardar=document.getElementById('btn-guardar-'+mapId);\n    const rootStyles = getComputedStyle(document.documentElement);\n    const primaryColor = rootStyles.getPropertyValue('--mfm-primary').trim() || '#015328';\n    const secondaryColor = rootStyles.getPropertyValue('--mfm-secondary').trim() || '#009239';\n    const textColor = rootStyles.getPropertyValue('--mfm-text').trim() || '#54595F';\n    const txtPoligonoDibujado = 'Polygon drawn';\n    const txtPuedesEditarlo = 'You can edit it';\n    const txtStatusInicial = 'Draw your installation polygon';\n    const txtAreaLabel = 'Area';\n    const txtHectareas = 'ha';\n    if(feature){\n        const areaHa=feature.properties.area_ha||'0.00';\n        statusEl.innerHTML='<i class=\"fas fa-check-circle\" style=\"color:'+secondaryColor+';\"><\/i> <strong>'+txtPoligonoDibujado+'<\/strong> - '+txtPuedesEditarlo;\n        statusEl.style.color=primaryColor;\n        statsEl.innerHTML=txtAreaLabel+': <strong>'+areaHa+'<\/strong> '+txtHectareas;\n        btnGuardar.disabled=false;\n    }else{\n        statusEl.innerHTML='<i class=\"fas fa-info-circle\"><\/i> '+txtStatusInicial;\n        statusEl.style.color=textColor;\n        statsEl.innerHTML=txtAreaLabel+': <strong>0<\/strong> '+txtHectareas;\n        btnGuardar.disabled=true;\n    }\n}\nsetInterval(function(){\n    const mapInstance=window.RoseoMapInstances[mapId];\n    if(mapInstance&&mapInstance.currentPolygon){\n        const geojson=mapInstance.getGeoJSON();\n        if(geojson.features.length>0){\n            actualizarEstado(geojson.features[0]);\n        }\n    }\n},500);\n})();\n<\/script>\n            <\/div>\n            <div class=\"item-btn-group\">\n                <button type=\"button\" class=\"item-btn item-btn-primary\" onclick=\"guardarTabTerreno(); return false;\">\n                    <i class=\"fas fa-check\"><\/i> Save land                <\/button>\n            <\/div>\n        <\/div>\n        <script>\n        \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n        \/\/ FUNCIONES TERRENO MINI - USANDO PREFIJO terreno_mini_\n        \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n        function seleccionarAccesoTerreno(valor) {\n            window.itemData.terreno_mini_acceso = valor;\n            \/\/ \u2705 GUARDAR INMEDIATAMENTE en StateV2\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('terreno_mini_acceso', valor);\n            }\n        }\n        function toggleFuturasObrasTerreno(mostrar) {\n            const detalle = document.getElementById('mini-terreno-futuras-obras-detalle');\n            if (detalle) {\n                \/\/ Only clear obras description if switching from visible to hidden (not on initial load)\n                if (!mostrar && detalle.style.display !== 'none' && detalle.style.display !== '') {\n                    const obrasField = document.getElementById('input-mini-terreno-obras-descripcion');\n                    if (obrasField) obrasField.value = '';\n                }\n                detalle.style.display = mostrar ? 'block' : 'none';\n            }\n            window.itemData.terreno_mini_futuras_obras = mostrar ? 'si' : 'no';\n            \/\/ \u2705 GUARDAR INMEDIATAMENTE en StateV2\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('terreno_mini_futuras_obras', mostrar ? 'si' : 'no');\n            }\n        }\n        function guardarTabTerreno(event) {\n            if (event) event.preventDefault();\n            \n            console.log('[guardarTabTerreno] Iniciando, flag actual:', window._guardandoTerreno);\n            \n            \/\/ Evitar llamadas m\u00faltiples (doble-click, etc.)\n            if (window._guardandoTerreno) {\n                console.warn('[guardarTabTerreno] BLOQUEADO - ya se est\u00e1 ejecutando');\n                return;\n            }\n            window._guardandoTerreno = true;\n            \n            try {\n                const accesoEl = document.getElementById('input-mini-terreno-acceso');\n                const comentariosEl = document.getElementById('input-mini-terreno-comentarios');\n                const obrasDescEl = document.getElementById('input-mini-terreno-obras-descripcion');\n                \n                console.log('[guardarTabTerreno] Elementos:', { accesoEl, comentariosEl, obrasDescEl });\n                \n                if (!accesoEl) {\n                    window._guardandoTerreno = false;\n                    alert('Error: No se encontr\u00f3 el campo de acceso');\n                    return;\n                }\n                \n                const acceso = accesoEl.value;\n                const futurasObras = document.querySelector('input[name=\"mini_terreno_futuras_obras\"]:checked')?.value || 'no';\n                const obrasDescripcion = obrasDescEl?.value || '';\n                const comentarios = comentariosEl?.value || '';\n                \n                console.log('[guardarTabTerreno] Valores:', { acceso, futurasObras, obrasDescripcion, comentarios });\n                \n                const msgAcceso = typeof mfmValidation === 'function' ? mfmValidation('acceso_requerido') : 'Please select the access type';\n                if (!acceso) {\n                    window._guardandoTerreno = false;\n                    alert(msgAcceso);\n                    return;\n                }\n                \n                \/\/ \u2705 Usar prefijo terreno_mini_\n                window.itemData.terreno_mini_acceso = acceso;\n                window.itemData.terreno_mini_futuras_obras = futurasObras;\n                window.itemData.terreno_mini_obras_descripcion = obrasDescripcion;\n                window.itemData.terreno_mini_comentarios = comentarios;\n                \n                if (!window.itemData.ubicacion_mini) {\n                    if (window.itemData.geojson_mini_cubierta) {\n                        window.itemData.ubicacion_mini = 'ambas';\n                    } else {\n                        window.itemData.ubicacion_mini = 'terreno';\n                    }\n                }\n                \n                console.log('[guardarTabTerreno] ubicacion_mini:', window.itemData.ubicacion_mini);\n                \n                if (window.RoseoStateV2) {\n                    window.RoseoStateV2.setLocationField('ubicacion_mini', window.itemData.ubicacion_mini);\n                    \/\/ \u2705 Usar prefijo terreno_mini_\n                    window.RoseoStateV2.setLocationField('terreno_mini_acceso', acceso);\n                    window.RoseoStateV2.setLocationField('terreno_mini_futuras_obras', futurasObras);\n                    window.RoseoStateV2.setLocationField('terreno_mini_obras_descripcion', obrasDescripcion);\n                    window.RoseoStateV2.setLocationField('terreno_mini_comentarios', comentarios);\n                    if (window.itemData.geojson_mini_terreno) {\n                        window.RoseoStateV2.setPolygons('mini_terreno', window.itemData.geojson_mini_terreno);\n                    }\n                }\n                \n                console.log('[guardarTabTerreno] Datos guardados en state, llamando a marcarTabCompleto');\n                marcarTabCompleto('terreno');\n                \n                \/\/ Mostrar feedback visual\n                if (typeof mostrarToast === 'function') {\n                    mostrarToast('Terreno guardado correctamente', 'success');\n                }\n                \n                const ubicacionMini = window.itemData.ubicacion_mini || window.minieolicaTipoUbicacion;\n                console.log('[guardarTabTerreno] ubicacionMini final:', ubicacionMini);\n                \n                if (ubicacionMini === 'ambas' || ubicacionMini === 'no_se') {\n                    console.log('[guardarTabTerreno] Habilitando y abriendo tab cubierta');\n                    if (typeof habilitarTab === 'function') habilitarTab('cubierta');\n                    setTimeout(() => {\n                        if (typeof toggleTab === 'function') toggleTab('cubierta');\n                    }, 300);\n                } else {\n                    console.log('[guardarTabTerreno] Finalizando minieolica (solo terreno)');\n                    setTimeout(() => {\n                        if (typeof finalizarMinieolica === 'function') {\n                            finalizarMinieolica();\n                        } else if (typeof finalizarItem === 'function') {\n                            finalizarItem();\n                        }\n                    }, 300);\n                }\n            } catch (err) {\n                console.error('[guardarTabTerreno] ERROR:', err);\n                alert('Error al guardar terreno: ' + err.message);\n            } finally {\n                \/\/ Siempre resetear el flag despu\u00e9s de 500ms\n                setTimeout(() => { \n                    window._guardandoTerreno = false; \n                    console.log('[guardarTabTerreno] Flag reseteado');\n                }, 500);\n            }\n        }\n        <\/script>\n                        <\/div>\n            <\/div>\n        <\/div>\n                                                    <div class=\"item-tab mini-tab-static\" id=\"tab-cubierta\" data-tab=\"cubierta\" style=\"display:none;\">\n            <div class=\"item-tab-header\" onclick=\"toggleTab('cubierta')\">\n                <div class=\"item-tab-left\">\n                    <div class=\"item-tab-number\">3<\/div>\n                    <div class=\"item-tab-title\">\n                        <h3><i class=\"fas fa-home\"><\/i> Roof<\/h3>\n                        <p>Delimit and describe the roof<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"item-tab-right\">\n                    <span class=\"item-tab-status\">Action required<\/span>\n                    <i class=\"fas fa-chevron-down item-tab-icon\"><\/i>\n                <\/div>\n            <\/div>\n            <div class=\"item-tab-body\">\n                <div class=\"item-tab-content\">\n                            <div id=\"tab-cubierta-content\">\n            <div class=\"item-field show\">\n                <label><i class=\"fas fa-layer-group\"><\/i> Roof typology<\/label>\n                <select id=\"input-mini-cubierta-tipologia\" onchange=\"seleccionarTipologiaCubierta(this.value)\">\n                    <option value=\"\">Select typology...<\/option>\n                    <option value=\"tejado_plano_hormigon\">Flat concrete roof<\/option>\n                    <option value=\"tejado_plano_chapa\">Flat metal sheet roof<\/option>\n                    <option value=\"tejado_inclinado_teja\">Sloped tile roof<\/option>\n                    <option value=\"tejado_inclinado_chapa\">Sloped metal sheet roof<\/option>\n                    <option value=\"cubierta_ligera\">Light roof<\/option>\n                    <option value=\"cubierta_ligera_deck\">Light roof Deck type<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"item-field show\" style=\"margin-top: 20px;\">\n                <label><i class=\"fas fa-door-open\"><\/i> Tipo de acceso a la cubierta<\/label>\n                <select id=\"input-mini-cubierta-acceso\" onchange=\"seleccionarAccesoCubierta(this.value)\">\n                    <option value=\"\">Selecciona tipo de acceso...<\/option>\n                    <option value=\"escalera_interior\">Escalera interior<\/option>\n                    <option value=\"escalera_exterior\">Escalera exterior<\/option>\n                    <option value=\"trampilla\">Trampilla en cubierta<\/option>\n                    <option value=\"grua_necesaria\">Necesita gr\u00faa\/elevador<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"item-field show\" style=\"margin-top: 20px;\">\n                <label><i class=\"fas fa-hard-hat\"><\/i> Are future works planned?<\/label>\n                <div style=\"display: flex; gap: 20px; margin-top: 10px;\">\n                    <label style=\"display: flex; align-items: center; gap: 8px; cursor: pointer;\">\n                        <input type=\"radio\" name=\"mini_cubierta_futuras_obras\" value=\"no\" onchange=\"toggleFuturasObrasCubierta(false)\" checked>\n                        <span>No<\/span>\n                    <\/label>\n                    <label style=\"display: flex; align-items: center; gap: 8px; cursor: pointer;\">\n                        <input type=\"radio\" name=\"mini_cubierta_futuras_obras\" value=\"si\" onchange=\"toggleFuturasObrasCubierta(true)\">\n                        <span>Yes<\/span>\n                    <\/label>\n                <\/div>\n            <\/div>\n            <div id=\"mini-cubierta-futuras-obras-detalle\" class=\"item-field\" style=\"margin-top: 15px; display: none;\">\n                <label><i class=\"fas fa-edit\"><\/i> Describa las obras previstas<\/label>\n                <textarea id=\"input-mini-cubierta-obras-descripcion\" \n                          placeholder=\"Describe future works planned on the roof...\"\n                          rows=\"3\"\n                          style=\"width: 100%; padding: 12px; border: 2px solid var(--mfm-border); border-radius: 8px; font-size: 14px; font-family: inherit; resize: vertical;\"><\/textarea>\n            <\/div>\n            <div class=\"item-field show\" style=\"margin-top: 20px;\">\n                <label><i class=\"fas fa-comment-alt\"><\/i> Additional comments<\/label>\n                <textarea id=\"input-mini-cubierta-comentarios\" \n                          placeholder=\"Any additional details about the roof...\"\n                          rows=\"3\"\n                          style=\"width: 100%; padding: 12px; border: 2px solid var(--mfm-border); border-radius: 8px; font-size: 14px; font-family: inherit; resize: vertical;\"><\/textarea>\n            <\/div>\n            <div class=\"item-field show\" style=\"margin-top: 20px;\">\n                <label><i class=\"fas fa-map-marked-alt\"><\/i> Roof area<\/label>\n                <input type=\"hidden\" id=\"input-mapaMinieolicaCubierta\" name=\"geojson_mini_cubierta\">\n<div class=\"mapa-button-container\" style=\"display: block !important; margin-top: 10px;\">\n    <button type=\"button\" class=\"btn-abrir-mapa\" onclick=\"abrirMapa_mapaMinieolicaCubierta(); return false;\" style=\"display: inline-flex !important;\">\n        <i class=\"fas fa-map-marked-alt\"><\/i> Draw roof polygon    <\/button>\n<\/div>\n<div id=\"resumen-mapaMinieolicaCubierta\" class=\"mapa-resumen\" style=\"display:none;\">\n    <div class=\"mapa-resumen-preview\" id=\"preview-mapaMinieolicaCubierta\">\n        <!-- Mini-mapa est\u00e1tico se insertar\u00e1 aqu\u00ed -->\n    <\/div>\n    <div class=\"mapa-resumen-info\">\n        <i class=\"fas fa-check-circle\"><\/i> \n        <span>Polygon drawn - Area: <strong id=\"area-texto-mapaMinieolicaCubierta\">0<\/strong> ha<\/span>\n        <button type=\"button\" class=\"btn-reabrir\" onclick=\"abrirMapa_mapaMinieolicaCubierta(); return false;\">\n            <i class=\"fas fa-edit\"><\/i> Edit        <\/button>\n    <\/div>\n<\/div>\n<style>\n.mapa-resumen {\n    display: flex !important;\n    flex-direction: column;\n    gap: 10px;\n    margin-top: 10px;\n    padding: 12px;\n    background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);\n    border-radius: 12px;\n    border: 1px solid var(--mfm-border, #ddd);\n}\n.mapa-resumen-preview {\n    width: 100%;\n    height: 120px;\n    border-radius: 8px;\n    overflow: hidden;\n    background: #eee;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n.mapa-resumen-preview img {\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n}\n.mapa-resumen-preview .preview-placeholder {\n    color: #999;\n    font-size: 12px;\n}\n.mapa-resumen-info {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    flex-wrap: wrap;\n}\n.mapa-resumen-info i.fa-check-circle {\n    color: var(--mfm-secondary, #009239);\n    font-size: 18px;\n}\n.mapa-resumen-info span {\n    flex: 1;\n    font-size: 14px;\n}\n.btn-reabrir {\n    padding: 6px 12px;\n    font-size: 12px;\n    background: var(--mfm-primary, #015328);\n    color: white;\n    border: none;\n    border-radius: 6px;\n    cursor: pointer;\n    transition: background 0.2s;\n}\n.btn-reabrir:hover {\n    background: var(--mfm-secondary, #009239);\n}\n@media (min-width: 480px) {\n    .mapa-resumen {\n        flex-direction: row;\n        align-items: stretch;\n    }\n    .mapa-resumen-preview {\n        width: 160px;\n        height: auto;\n        min-height: 100px;\n        flex-shrink: 0;\n    }\n    .mapa-resumen-info {\n        flex: 1;\n    }\n}\n<\/style>\n<div id=\"modal-mapaMinieolicaCubierta\" class=\"mapa-modal-fullscreen\">\n    <div class=\"mapa-modal-header\">\n        <div class=\"header-top\">\n            <h3><i class=\"fas fa-map-marked-alt\"><\/i> Delimit the roof area for mini-wind installation<\/h3>\n            <button type=\"button\" class=\"modal-close\" onclick=\"cerrarMapa_mapaMinieolicaCubierta(); return false;\">&times;<\/button>\n        <\/div>\n        <div class=\"header-instrucciones\">\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-search-location\"><\/i>\n                <span><strong>1.<\/strong> Search for your location<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-draw-polygon\"><\/i>\n                <span><strong>2.<\/strong> Click on the polygon button (top left)<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-mouse-pointer\"><\/i>\n                <span><strong>3.<\/strong> Click on the map to create each vertex<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-check-circle\"><\/i>\n                <span><strong>4.<\/strong> Double click to close the polygon<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-trash\"><\/i>\n                <span><strong>5.<\/strong> Use the trash icon to delete and redraw<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div class=\"mapa-modal-body\">\n        <div id=\"mapaMinieolicaCubierta\" class=\"mapa-container-full\"><\/div>\n        <div id=\"status-mapaMinieolicaCubierta\" class=\"mapa-status\">\n            <i class=\"fas fa-info-circle\"><\/i> Draw your installation polygon        <\/div>\n    <\/div>\n    <div class=\"mapa-modal-footer\">\n        <div class=\"footer-stats\">\n            <span id=\"stats-mapaMinieolicaCubierta\">Area: <strong>0<\/strong> ha<\/span>\n        <\/div>\n        <div class=\"footer-actions\">\n            <button type=\"button\" class=\"btn-cancelar\" onclick=\"cerrarMapa_mapaMinieolicaCubierta(); return false;\">\n                <i class=\"fas fa-times\"><\/i> Cancel            <\/button>\n            <button type=\"button\" id=\"btn-guardar-mapaMinieolicaCubierta\" class=\"btn-guardar\" onclick=\"guardarMapa_mapaMinieolicaCubierta(); return false;\" disabled>\n                <i class=\"fas fa-save\"><\/i> Save polygon            <\/button>\n        <\/div>\n    <\/div>\n<\/div>\n<script>\nif (!window.RoseoMapManager) {\n    window.RoseoMapManager = {\n        map: null,\n        draw: null,\n        currentPolygon: null,\n        lastAddress: null,\n        lastMapPosition: null, \/\/ \u2705 FIX: Guardar \u00faltima posici\u00f3n del mapa\n        \n        \/\/ \u2705 FIX: Funci\u00f3n para obtener la \u00faltima posici\u00f3n guardada\n        getLastPosition: function() {\n            \/\/ 1. Primero intentar desde memoria\n            if (this.lastMapPosition) {\n                return this.lastMapPosition;\n            }\n            \/\/ 2. Luego desde sessionStorage\n            try {\n                const saved = sessionStorage.getItem('roseo_last_map_position');\n                if (saved) {\n                    return JSON.parse(saved);\n                }\n            } catch (e) {}\n            \/\/ 3. Default: Portugalete\n            return null;\n        },\n        \n        \/\/ \u2705 FIX: Funci\u00f3n para guardar la posici\u00f3n actual\n        saveCurrentPosition: function() {\n            if (!this.map) return;\n            const center = this.map.getCenter();\n            const zoom = this.map.getZoom();\n            this.lastMapPosition = {\n                center: [center.lng, center.lat],\n                zoom: zoom\n            };\n            try {\n                sessionStorage.setItem('roseo_last_map_position', JSON.stringify(this.lastMapPosition));\n            } catch (e) {}\n            console.log('[MAP] Posici\u00f3n guardada:', this.lastMapPosition);\n        },\n        \n        init: function(containerId, options = {}) {\n            \/\/ \u2705 FIX: Usar \u00faltima posici\u00f3n guardada si existe\n            const lastPos = this.getLastPosition();\n            const defaults = {\n                center: lastPos ? lastPos.center : [-3.022731543334405, 43.327417650863055],\n                zoom: lastPos ? lastPos.zoom : 14,\n                fieldId: 'item-geojson'\n            };\n            const config = { ...defaults, ...options };\n            const MAPBOX_TOKEN = 'pk.eyJ1IjoiY2J1c3RhbWEiLCJhIjoiY21tdzM2ajkwMmdvMDJwc2I4cXgxeDhqcCJ9.WNQRvG6BOPVp6ucyQXLkAA';\n            mapboxgl.accessToken = MAPBOX_TOKEN;\n            this.map = new mapboxgl.Map({\n                container: containerId,\n                style: 'mapbox:\/\/styles\/mapbox\/satellite-v9',\n                center: config.center,\n                zoom: config.zoom\n            });\n            \n            \/\/ \u2705 FIX: Guardar posici\u00f3n cuando el usuario mueve el mapa\n            this.map.on('moveend', () => {\n                this.saveCurrentPosition();\n            });\n            \n            const geocoder = new MapboxGeocoder({\n                accessToken: mapboxgl.accessToken,\n                mapboxgl: mapboxgl,\n                placeholder: 'Search address...',\n                countries: 'es',\n                language: 'es',\n                marker: { color: '#009239' },\n                flyTo: { speed: 1.2, zoom: 18, essential: true }\n            });\n            geocoder.on('result', (e) => {\n                if (e && e.result) {\n                    this.lastAddress = e.result.place_name || e.result.text;\n                    \/\/ \u2705 FIX: Guardar posici\u00f3n despu\u00e9s de b\u00fasqueda\n                    setTimeout(() => this.saveCurrentPosition(), 1500);\n                }\n            });\n            this.map.addControl(geocoder, 'top-right');\n            this.draw = new MapboxDraw({\n                displayControlsDefault: false,\n                controls: { polygon: true, trash: true },\n                styles: [\n                    {\n                        'id': 'gl-draw-polygon-fill-active',\n                        'type': 'fill',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'true']],\n                        'paint': { 'fill-color': '#B3C8BB', 'fill-opacity': 0.4 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-stroke-active',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'true']],\n                        'paint': { 'line-color': '#009239', 'line-width': 3 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-fill-inactive',\n                        'type': 'fill',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'false']],\n                        'paint': { 'fill-color': '#B3C8BB', 'fill-opacity': 0.4 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-stroke-inactive',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'Polygon'], ['==', 'active', 'false']],\n                        'paint': { 'line-color': '#009239', 'line-width': 3 }\n                    },\n                    {\n                        'id': 'gl-draw-line-active',\n                        'type': 'line',\n                        'filter': ['all', ['==', '$type', 'LineString'], ['==', 'active', 'true']],\n                        'paint': { 'line-color': '#009239', 'line-width': 2 }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-and-line-vertex-active',\n                        'type': 'circle',\n                        'filter': ['all', ['==', 'meta', 'vertex'], ['==', '$type', 'Point']],\n                        'paint': { 'circle-radius': 5, 'circle-color': '#009239' }\n                    },\n                    {\n                        'id': 'gl-draw-polygon-midpoint',\n                        'type': 'circle',\n                        'filter': ['all', ['==', 'meta', 'midpoint'], ['==', '$type', 'Point']],\n                        'paint': { 'circle-radius': 3, 'circle-color': '#54595F' }\n                    }\n                ]\n            });\n            this.map.addControl(this.draw, 'top-left');\n            this.map.on('draw.create', (e) => {\n                if (this.currentPolygon) this.draw.delete(this.currentPolygon);\n                this.currentPolygon = e.features[0].id;\n            });\n            this.map.on('draw.delete', () => {\n                this.currentPolygon = null;\n            });\n            this.fieldId = config.fieldId;\n            return this;\n        },\n        getGeoJSON: function() {\n            const allFeatures = this.draw.getAll();\n            if (allFeatures.features.length === 0) {\n                return {\n                    type: \"FeatureCollection\",\n                    features: [],\n                    metadata: {\n                        total_polygons: 0,\n                        center_location: null,\n                        total_area_ha: 0\n                    }\n                };\n            }\n            const feature = allFeatures.features[0];\n            const coords = feature.geometry.coordinates[0];\n            let sumLng = 0, sumLat = 0;\n            coords.forEach(coord => {\n                sumLng += coord[0];\n                sumLat += coord[1];\n            });\n            const centerLng = sumLng \/ coords.length;\n            const centerLat = sumLat \/ coords.length;\n            let area = 0;\n            for (let i = 0; i < coords.length - 1; i++) {\n                const j = (i + 1);\n                area += coords[i][0] * coords[j][1];\n                area -= coords[j][0] * coords[i][1];\n            }\n            area = Math.abs(area \/ 2.0);\n            const areaM2 = area * 111000 * 111000;\n            feature.properties = {\n                created_at: new Date().toISOString(),\n                center_lat: centerLat,\n                center_lng: centerLng,\n                area_m2: Math.round(areaM2),\n                area_ha: (areaM2 \/ 10000).toFixed(2),\n                address: this.lastAddress || ''\n            };\n            return {\n                type: \"FeatureCollection\",\n                features: [feature],\n                metadata: {\n                    total_polygons: 1,\n                    center_location: [centerLat, centerLng],\n                    total_area_ha: (areaM2 \/ 10000).toFixed(2)\n                }\n            };\n        },\n        getPolygonCount: function() {\n            return this.currentPolygon ? 1 : 0;\n        },\n        clearAll: function() {\n            if (this.draw) {\n                this.draw.deleteAll();\n            }\n            this.currentPolygon = null;\n        },\n        resize: function() {\n            if (this.map) {\n                setTimeout(() => this.map.resize(), 100);\n            }\n        },\n        destroy: function() {\n            if (this.draw) {\n                this.map.removeControl(this.draw);\n                this.draw = null;\n            }\n            if (this.map) {\n                this.map.remove();\n                this.map = null;\n            }\n            this.currentPolygon = null;\n        }\n    };\n}\n(function(){\nconst mapId='mapaMinieolicaCubierta';\nconst callbackFn='onMapaMiniCubiertaGuardado';\nif (!window.RoseoMapInstances) {\n    window.RoseoMapInstances = {};\n}\nwindow['abrirMapa_'+mapId]=function(){\n    document.getElementById('modal-'+mapId).classList.add('show');\n    setTimeout(function(){\n        if(!window.RoseoMapManager){\n            return;\n        }\n        \n        if(!window.RoseoMapInstances[mapId]){\n            window.RoseoMapInstances[mapId] = Object.create(window.RoseoMapManager);\n            \/\/ \u2705 FIX: Usar \u00faltima posici\u00f3n guardada del mapa\n            const lastPos = window.RoseoMapManager.getLastPosition();\n            window.RoseoMapInstances[mapId].init(mapId,{\n                center: lastPos ? lastPos.center : [-3.022731543334405, 43.327417650863055],\n                zoom: lastPos ? lastPos.zoom : 14,\n                fieldId:'input-'+mapId\n            });\n            if (window.RoseoMapInstances[mapId].map) {\n                window.RoseoMapInstances[mapId].map.on('load', function() {\n                    setTimeout(function() {\n                        window.RoseoMapInstances[mapId].map.resize();\n                    }, 100);\n                });\n            }\n        }else{\n            \/\/ \u2705 FIX: NO borrar pol\u00edgono existente al reabrir - solo redimensionar\n            window.RoseoMapInstances[mapId].resize();\n            setTimeout(function() {\n                window.RoseoMapInstances[mapId].resize();\n            }, 300);\n        }\n        actualizarEstado(null);\n    },200);\n};\nwindow['cerrarMapa_'+mapId]=function(){\n    const poligonos=window.RoseoMapInstances[mapId]?window.RoseoMapInstances[mapId].getPolygonCount():0;\n    if(poligonos>0&&!document.getElementById('input-'+mapId).value){\n        if(!confirm('Warning! You are going to leave without saving the polygon'))return;\n    }\n    if(window.RoseoMapInstances[mapId]){\n        window.RoseoMapInstances[mapId].clearAll();\n    }\n    document.getElementById('modal-'+mapId).classList.remove('show');\n};\nwindow['guardarMapa_'+mapId]=function(){\n    const mapInstance = window.RoseoMapInstances[mapId];\n    if(!mapInstance || mapInstance.getPolygonCount()===0){\n        alert('Please draw the polygon on the map.');\n        return;\n    }\n    const featureCollection=mapInstance.getGeoJSON();\n    const f=featureCollection.features[0];\n    const areaHa=f.properties.area_ha;\n    const geojsonStr=JSON.stringify(f);\n    \n    document.getElementById('input-'+mapId).value=geojsonStr;\n    document.getElementById('area-texto-'+mapId).textContent=areaHa;\n    document.getElementById('resumen-'+mapId).style.display='flex';\n    \n    \/\/ \u2705 Generar mini-mapa est\u00e1tico con Mapbox Static Images API\n    generarMiniMapa(mapId, f);\n    \n    document.getElementById('modal-'+mapId).classList.remove('show');\n    const fieldName = 'geojson_mini_cubierta';\n    if (window.itemData && fieldName) {\n        window.itemData[fieldName] = geojsonStr;\n    }\n    document.dispatchEvent(new CustomEvent('mapa-poligono-completado',{\n        detail:{\n            mapId:mapId,\n            area_ha:areaHa,\n            geojson:featureCollection,\n            feature:f\n        }\n    }));\n    if(callbackFn&&typeof window[callbackFn]==='function'){\n        window[callbackFn](featureCollection,f,areaHa);\n    }\n};\n\n\/\/ \u2705 FIX: Funci\u00f3n para generar mini-mapa est\u00e1tico\nfunction generarMiniMapa(mapId, feature) {\n    const previewEl = document.getElementById('preview-' + mapId);\n    if (!previewEl) return;\n    \n    try {\n        const coords = feature.geometry.coordinates[0];\n        const center = [feature.properties.center_lng, feature.properties.center_lat];\n        \n        \/\/ Calcular el bounding box para zoom apropiado\n        let minLng = coords[0][0], maxLng = coords[0][0];\n        let minLat = coords[0][1], maxLat = coords[0][1];\n        coords.forEach(c => {\n            minLng = Math.min(minLng, c[0]);\n            maxLng = Math.max(maxLng, c[0]);\n            minLat = Math.min(minLat, c[1]);\n            maxLat = Math.max(maxLat, c[1]);\n        });\n        \n        \/\/ Calcular zoom basado en el tama\u00f1o del pol\u00edgono\n        const diffLng = maxLng - minLng;\n        const diffLat = maxLat - minLat;\n        const maxDiff = Math.max(diffLng, diffLat);\n        let zoom = 15;\n        if (maxDiff > 0.1) zoom = 10;\n        else if (maxDiff > 0.05) zoom = 11;\n        else if (maxDiff > 0.02) zoom = 12;\n        else if (maxDiff > 0.01) zoom = 13;\n        else if (maxDiff > 0.005) zoom = 14;\n        else zoom = 15;\n        \n        \/\/ Crear overlay GeoJSON para el pol\u00edgono\n        const geoJsonOverlay = encodeURIComponent(JSON.stringify({\n            type: 'Feature',\n            properties: {\n                'stroke': '#009239',\n                'stroke-width': 3,\n                'stroke-opacity': 1,\n                'fill': '#B3C8BB',\n                'fill-opacity': 0.4\n            },\n            geometry: feature.geometry\n        }));\n        \n        \/\/ Construir URL de Mapbox Static Images\n        const mapboxToken = 'pk.eyJ1IjoiY2J1c3RhbWEiLCJhIjoiY21tdzM2ajkwMmdvMDJwc2I4cXgxeDhqcCJ9.WNQRvG6BOPVp6ucyQXLkAA';\n        const staticUrl = `https:\/\/api.mapbox.com\/styles\/v1\/mapbox\/satellite-v9\/static\/geojson(${geoJsonOverlay})\/${center[0]},${center[1]},${zoom},0\/300x150@2x?access_token=${mapboxToken}`;\n        \n        \/\/ Crear elemento imagen\n        const img = document.createElement('img');\n        img.src = staticUrl;\n        img.alt = 'Vista previa del pol\u00edgono';\n        img.loading = 'lazy';\n        img.onerror = function() {\n            \/\/ Fallback: mostrar placeholder si falla\n            previewEl.innerHTML = '<div class=\"preview-placeholder\"><i class=\"fas fa-map\"><\/i> Pol\u00edgono guardado<\/div>';\n        };\n        \n        previewEl.innerHTML = '';\n        previewEl.appendChild(img);\n        \n    } catch (e) {\n        console.warn('[MiniMapa] Error generando preview:', e);\n        previewEl.innerHTML = '<div class=\"preview-placeholder\"><i class=\"fas fa-check-circle\"><\/i> Pol\u00edgono guardado<\/div>';\n    }\n}\nfunction actualizarEstado(feature){\n    const statusEl=document.getElementById('status-'+mapId);\n    const statsEl=document.getElementById('stats-'+mapId);\n    const btnGuardar=document.getElementById('btn-guardar-'+mapId);\n    const rootStyles = getComputedStyle(document.documentElement);\n    const primaryColor = rootStyles.getPropertyValue('--mfm-primary').trim() || '#015328';\n    const secondaryColor = rootStyles.getPropertyValue('--mfm-secondary').trim() || '#009239';\n    const textColor = rootStyles.getPropertyValue('--mfm-text').trim() || '#54595F';\n    const txtPoligonoDibujado = 'Polygon drawn';\n    const txtPuedesEditarlo = 'You can edit it';\n    const txtStatusInicial = 'Draw your installation polygon';\n    const txtAreaLabel = 'Area';\n    const txtHectareas = 'ha';\n    if(feature){\n        const areaHa=feature.properties.area_ha||'0.00';\n        statusEl.innerHTML='<i class=\"fas fa-check-circle\" style=\"color:'+secondaryColor+';\"><\/i> <strong>'+txtPoligonoDibujado+'<\/strong> - '+txtPuedesEditarlo;\n        statusEl.style.color=primaryColor;\n        statsEl.innerHTML=txtAreaLabel+': <strong>'+areaHa+'<\/strong> '+txtHectareas;\n        btnGuardar.disabled=false;\n    }else{\n        statusEl.innerHTML='<i class=\"fas fa-info-circle\"><\/i> '+txtStatusInicial;\n        statusEl.style.color=textColor;\n        statsEl.innerHTML=txtAreaLabel+': <strong>0<\/strong> '+txtHectareas;\n        btnGuardar.disabled=true;\n    }\n}\nsetInterval(function(){\n    const mapInstance=window.RoseoMapInstances[mapId];\n    if(mapInstance&&mapInstance.currentPolygon){\n        const geojson=mapInstance.getGeoJSON();\n        if(geojson.features.length>0){\n            actualizarEstado(geojson.features[0]);\n        }\n    }\n},500);\n})();\n<\/script>\n            <\/div>\n            <div class=\"item-btn-group\">\n                <button type=\"button\" class=\"item-btn item-btn-primary\" onclick=\"guardarTabCubierta(); return false;\">\n                    <i class=\"fas fa-check\"><\/i> Save roof                <\/button>\n            <\/div>\n        <\/div>\n        <script>\n        \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n        \/\/ FUNCIONES CUBIERTA MINI - USANDO PREFIJO cubierta_mini_\n        \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n        function seleccionarTipologiaCubierta(valor) {\n            window.itemData.cubierta_mini_tipologia = valor;\n            \/\/ \u2705 GUARDAR INMEDIATAMENTE en StateV2\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('cubierta_mini_tipologia', valor);\n            }\n        }\n        function seleccionarAccesoCubierta(valor) {\n            window.itemData.cubierta_mini_acceso = valor;\n            \/\/ \u2705 GUARDAR INMEDIATAMENTE en StateV2\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('cubierta_mini_acceso', valor);\n            }\n        }\n        function toggleFuturasObrasCubierta(mostrar) {\n            const detalle = document.getElementById('mini-cubierta-futuras-obras-detalle');\n            if (detalle) {\n                \/\/ Only clear obras description if switching from visible to hidden (not on initial load)\n                if (!mostrar && detalle.style.display !== 'none' && detalle.style.display !== '') {\n                    const obrasField = document.getElementById('input-mini-cubierta-obras-descripcion');\n                    if (obrasField) obrasField.value = '';\n                }\n                detalle.style.display = mostrar ? 'block' : 'none';\n            }\n            window.itemData.cubierta_mini_futuras_obras = mostrar ? 'si' : 'no';\n            \/\/ \u2705 GUARDAR INMEDIATAMENTE en StateV2\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('cubierta_mini_futuras_obras', mostrar ? 'si' : 'no');\n            }\n        }\n        function guardarTabCubierta(event) {\n            if (event) event.preventDefault();\n            \n            \/\/ Evitar llamadas m\u00faltiples (doble-click, etc.)\n            if (window._guardandoCubierta) return;\n            window._guardandoCubierta = true;\n            setTimeout(() => { window._guardandoCubierta = false; }, 1000);\n            \n            const tipologia = document.getElementById('input-mini-cubierta-tipologia').value;\n            const acceso = document.getElementById('input-mini-cubierta-acceso').value;\n            const futurasObras = document.querySelector('input[name=\"mini_cubierta_futuras_obras\"]:checked')?.value || 'no';\n            const obrasDescripcion = document.getElementById('input-mini-cubierta-obras-descripcion')?.value || '';\n            const comentarios = document.getElementById('input-mini-cubierta-comentarios')?.value || '';\n            const msgTipologia = typeof mfmValidation === 'function' ? mfmValidation('tipologia_cubierta_requerida') : 'Please select a roof typology';\n            const msgAcceso = typeof mfmValidation === 'function' ? mfmValidation('acceso_requerido') : 'Please select the access type';\n            if (!tipologia) {\n                window._guardandoCubierta = false;\n                alert(msgTipologia);\n                return;\n            }\n            if (!acceso) {\n                window._guardandoCubierta = false;\n                alert(msgAcceso);\n                return;\n            }\n            \/\/ \u2705 Usar prefijo cubierta_mini_\n            window.itemData.cubierta_mini_tipologia = tipologia;\n            window.itemData.cubierta_mini_acceso = acceso;\n            window.itemData.cubierta_mini_futuras_obras = futurasObras;\n            window.itemData.cubierta_mini_obras_descripcion = obrasDescripcion;\n            window.itemData.cubierta_mini_comentarios = comentarios;\n            if (!window.itemData.ubicacion_mini) {\n                if (window.itemData.geojson_mini_terreno) {\n                    window.itemData.ubicacion_mini = 'ambas';\n                } else {\n                    window.itemData.ubicacion_mini = 'cubierta';\n                }\n            }\n            if (window.RoseoStateV2) {\n                window.RoseoStateV2.setLocationField('ubicacion_mini', window.itemData.ubicacion_mini);\n                \/\/ \u2705 Usar prefijo cubierta_mini_\n                window.RoseoStateV2.setLocationField('cubierta_mini_tipologia', tipologia);\n                window.RoseoStateV2.setLocationField('cubierta_mini_acceso', acceso);\n                window.RoseoStateV2.setLocationField('cubierta_mini_futuras_obras', futurasObras);\n                window.RoseoStateV2.setLocationField('cubierta_mini_obras_descripcion', obrasDescripcion);\n                window.RoseoStateV2.setLocationField('cubierta_mini_comentarios', comentarios);\n                if (window.itemData.geojson_mini_cubierta) {\n                    window.RoseoStateV2.setPolygons('mini_cubierta', window.itemData.geojson_mini_cubierta);\n                }\n            }\n            marcarTabCompleto('cubierta');\n            setTimeout(() => {\n                if (typeof finalizarMinieolica === 'function') {\n                    finalizarMinieolica();\n                } else if (typeof finalizarItem === 'function') {\n                    finalizarItem();\n                }\n            }, 300);\n        }\n        <\/script>\n                        <\/div>\n            <\/div>\n        <\/div>\n                                    <\/div>\n        <\/div>\n        <script>\n        window.minieolicaManager = null;\n        window.activarFVInstalacion = function() {\n            if (typeof activarNuevoComponente === 'function') {\n                const compMini = document.getElementById('componente-minieolica');\n                const tabActivo = compMini ? compMini.querySelector('.item-tab.active') : null;\n                const tabId = tabActivo ? tabActivo.id : null;\n                if (tabId) {\n                    activarNuevoComponente(tabId, 'componente-fv-instalacion');\n                } else {\n                    const compFVInstalacion = document.getElementById('componente-fv-instalacion');\n                    if (compFVInstalacion) {\n                        compFVInstalacion.style.display = 'block';\n                        const primerTab = compFVInstalacion.querySelector('.item-tab');\n                        if (primerTab) {\n                            primerTab.classList.remove('disabled');\n                            setTimeout(() => {\n                                primerTab.classList.add('active');\n                                const header = primerTab.querySelector('.item-tab-header') || primerTab;\n                                header.scrollIntoView({ behavior: 'smooth', block: 'start' });\n                            }, 50);\n                        }\n                    }\n                }\n                return;\n            }\n            const compFVInstalacion = document.getElementById('componente-fv-instalacion');\n            if (compFVInstalacion) {\n                compFVInstalacion.style.display = 'block';\n                const primerTab = compFVInstalacion.querySelector('.item-tab');\n                if (primerTab) {\n                    primerTab.classList.remove('disabled');\n                    setTimeout(() => {\n                        primerTab.classList.add('active');\n                        const header = primerTab.querySelector('.item-tab-header') || primerTab;\n                        header.scrollIntoView({ behavior: 'smooth', block: 'start' });\n                    }, 100);\n                }\n            } else {\n            }\n        };\n        document.addEventListener('DOMContentLoaded', function() {\n            \/* \n            \/\/ DISABLED: StateManager V2 handles location data natively. UbicacionManager is legacy and causes conflicts.\n            if (typeof UbicacionManager !== 'undefined' && window.RoseoStateManager) {\n                window.minieolicaManager = new UbicacionManager({\n                    storageKey: 'ubicaciones_minieolica',\n                    editIndexKey: 'editando_minieolica',\n                    tipoProyecto: 'minieolica',\n                    debug: true\n                });\n                window.minieolicaManager.init(window.RoseoStateManager);\n                window.minieolicaManager.loadCurrentIndexFromState();\n            }\n            *\/\n        });\n        <\/script>\n            <\/div>\n<script>\n(function() {\n    var _componentesActualizados = false;\n    var _ultimoTipo = null;\n    function actualizarComponentes() {\n        var tipo = '';\n        \n        \/\/ CRITICAL FIX: RoseoStateV2 is the AUTHORITATIVE source of truth\n        \/\/ Force-sync legacy globals to prevent PHP-contaminated values from being used\n        if (window.RoseoStateV2) {\n            var state = window.RoseoStateV2.getState();\n            tipo = (state.current_location && state.current_location.tipo_instalacion) || \n                   (state.form && state.form.tipo_instalacion) || '';\n            \n            \/\/ FORCE SYNC: Update ALL legacy globals with the authoritative value\n            if (tipo) {\n                window.roseoTipoInstalacion = tipo;\n                if (window.itemData) {\n                    window.itemData.tipo_instalacion = tipo;\n                }\n            }\n        }\n        \n        \/\/ Fallbacks only if RoseoStateV2 didn't have the value\n        if (!tipo) {\n            tipo = window.roseoTipoInstalacion || '';\n        }\n        if (!tipo && window.itemData && window.itemData.tipo_instalacion) {\n            tipo = window.itemData.tipo_instalacion;\n        }\n        if (tipo && window.itemData && !window.itemData.tipo_instalacion) {\n            window.itemData.tipo_instalacion = tipo;\n        }\n        if (_componentesActualizados && _ultimoTipo === tipo) {\n            return;\n        }\n        if (!tipo) {\n            setTimeout(actualizarComponentes, 300);\n            return;\n        }\n        var tabConsumoGeneral = document.getElementById('tab-consumo-general-container');\n        var compFV = document.getElementById('componente-fotovoltaica');\n        var compFVInstalacion = document.getElementById('componente-fv-instalacion');\n        var compMini = document.getElementById('componente-minieolica');\n        \/\/ solo_fv y solo_mini: consumo general\n        \/\/ mini_fv: consumo general (ambas instalaciones nuevas)\n        \/\/ fv_ampliar_mini: NO consumo general (usa el del componente FV existente)\n        var mostrarConsumoGeneral = tipo === 'solo_fv' || tipo === 'solo_mini' || tipo === 'mini_fv';\n        \/\/ fv_ampliar_mini: FV existente (con bater\u00eda)\n        var mostrarFV = tipo === 'fv_ampliar_mini';\n        \/\/ solo_fv y mini_fv: FV nueva (instalaci\u00f3n)\n        var mostrarFVInstalacion = tipo === 'solo_fv' || tipo === 'mini_fv';\n        \/\/ Todos los que incluyen mini\n        var mostrarMini = tipo === 'fv_ampliar_mini' || tipo === 'solo_mini' || tipo === 'mini_fv';\n        if (tabConsumoGeneral) tabConsumoGeneral.style.display = mostrarConsumoGeneral ? 'block' : 'none';\n        if (compFV) compFV.style.display = mostrarFV ? 'block' : 'none';\n        if (compFVInstalacion) compFVInstalacion.style.display = mostrarFVInstalacion ? 'block' : 'none';\n        if (compMini) compMini.style.display = mostrarMini ? 'block' : 'none';\n        setTimeout(function() {\n            var tabConsumoGeneral = document.getElementById('tab-consumo-general');\n            var primerTabActivo = null; \/\/ Para hacer scroll despu\u00e9s\n            if (tipo === 'fv_ampliar_mini') {\n                configurarTabs(compFV, true);\n                configurarTabs(compMini, false);\n                if (compFVInstalacion) configurarTabs(compFVInstalacion, false);\n                primerTabActivo = compFV ? compFV.querySelector('.item-tab') : null;\n            }\n            else if (tipo === 'solo_mini') {\n                if (tabConsumoGeneral) {\n                    tabConsumoGeneral.classList.remove('disabled', 'completed');\n                    tabConsumoGeneral.classList.add('active');\n                    primerTabActivo = tabConsumoGeneral;\n                }\n                configurarTabs(compMini, false);\n                if (compFV) configurarTabs(compFV, false);\n                if (compFVInstalacion) configurarTabs(compFVInstalacion, false);\n            }\n            else if (tipo === 'mini_fv') {\n                \/\/ Ambas nuevas: consumo general \u2192 FV instalaci\u00f3n \u2192 Mini\n                if (tabConsumoGeneral) {\n                    tabConsumoGeneral.classList.remove('disabled', 'completed');\n                    tabConsumoGeneral.classList.add('active');\n                    primerTabActivo = tabConsumoGeneral;\n                }\n                configurarTabs(compMini, false);\n                if (compFVInstalacion) configurarTabs(compFVInstalacion, false);\n                if (compFV) configurarTabs(compFV, false);\n            }\n            else if (tipo === 'solo_fv') {\n                if (tabConsumoGeneral) {\n                    tabConsumoGeneral.classList.remove('disabled', 'completed');\n                    tabConsumoGeneral.classList.add('active');\n                    primerTabActivo = tabConsumoGeneral;\n                }\n                configurarTabs(compFVInstalacion, false);\n                if (compFV) configurarTabs(compFV, false);\n                if (compMini) configurarTabs(compMini, false);\n            }\n            if (primerTabActivo && window._forzarScrollAlPrimerTab) {\n                setTimeout(function() {\n                    var header = primerTabActivo.querySelector('.item-tab-header');\n                    var target = header || primerTabActivo;\n                    scrollSuaveConOffset(target, 80);\n                    window._forzarScrollAlPrimerTab = false;\n                }, 250);\n            }\n            _componentesActualizados = true;\n            _ultimoTipo = tipo;\n        }, 50);\n    }\n    function configurarTabs(componente, activarPrimero) {\n        if (!componente) return;\n        var tabs = componente.querySelectorAll('.item-tab');\n        tabs.forEach(function(tab, index) {\n            tab.classList.remove('active', 'disabled');\n            if (activarPrimero && index === 0) {\n                tab.classList.add('active');\n            } else {\n                tab.classList.add('disabled');\n            }\n        });\n    }\n    function iniciarActualizacion() {\n        if (window.RoseoStateV2 && window.RoseoStateV2.onReady) {\n            window.RoseoStateV2.onReady(function() {\n                actualizarComponentes();\n                \/\/ \u2705 FIX: Hidratar campos de texto desde el estado\n                setTimeout(hidratarCamposTextoDesdeEstado, 300);\n            });\n        } else {\n            setTimeout(actualizarComponentes, 100);\n        }\n    }\n    \n    \/**\n     * \u2705 FIX: Funci\u00f3n que hidrata los campos de texto (textareas e inputs) \n     * desde RoseoStateV2 cuando se carga la p\u00e1gina.\n     * Esto es necesario porque los componentes de minie\u00f3lica y FV no \n     * restauran autom\u00e1ticamente los valores de comentarios\/descripci\u00f3n de obras.\n     *\/\n    function hidratarCamposTextoDesdeEstado() {\n        if (!window.RoseoStateV2) return;\n        \n        const loc = window.RoseoStateV2.getCurrentLocation();\n        if (!loc) return;\n        \n        console.log('[HYDRATE] Hidratando campos de texto desde estado:', loc);\n        \n        \/\/ Tambi\u00e9n actualizar itemData para consistencia\n        function setField(inputId, stateField) {\n            const input = document.getElementById(inputId);\n            const value = loc[stateField] || '';\n            if (input && value) {\n                input.value = value;\n                \/\/ Tambi\u00e9n actualizar itemData\n                if (window.itemData) {\n                    window.itemData[stateField] = value;\n                }\n                console.log('[HYDRATE] ' + inputId + ' = \"' + value.substring(0, 50) + '...\"');\n            }\n        }\n        \n        \/\/ Tambi\u00e9n establecer valores de select y radios\n        function setSelect(inputId, stateField) {\n            const select = document.getElementById(inputId);\n            const value = loc[stateField] || '';\n            if (select && value) {\n                select.value = value;\n                if (window.itemData) {\n                    window.itemData[stateField] = value;\n                }\n            }\n        }\n        \n        function setRadio(name, stateField) {\n            const value = loc[stateField] || 'no';\n            const radio = document.querySelector('input[name=\"' + name + '\"][value=\"' + value + '\"]');\n            if (radio) {\n                radio.checked = true;\n                if (window.itemData) {\n                    window.itemData[stateField] = value;\n                }\n                \/\/ Si es \"si\", mostrar el campo de descripci\u00f3n\n                if (value === 'si') {\n                    \/\/ Trigger change event para mostrar el detalle\n                    radio.dispatchEvent(new Event('change'));\n                }\n            }\n        }\n        \n        \/\/ === MINIE\u00d3LICA CUBIERTA ===\n        setSelect('input-mini-cubierta-tipologia', 'cubierta_mini_tipologia');\n        setSelect('input-mini-cubierta-acceso', 'cubierta_mini_acceso');\n        setRadio('mini_cubierta_futuras_obras', 'cubierta_mini_futuras_obras');\n        setField('input-mini-cubierta-obras-descripcion', 'cubierta_mini_obras_descripcion');\n        setField('input-mini-cubierta-comentarios', 'cubierta_mini_comentarios');\n        \n        \/\/ === MINIE\u00d3LICA TERRENO ===\n        setSelect('input-mini-terreno-acceso', 'terreno_mini_acceso');\n        setRadio('mini_terreno_futuras_obras', 'terreno_mini_futuras_obras');\n        setField('input-mini-terreno-obras-descripcion', 'terreno_mini_obras_descripcion');\n        setField('input-mini-terreno-comentarios', 'terreno_mini_comentarios');\n        \n        \/\/ === FV INSTALACI\u00d3N CUBIERTA (fotovoltaica-instalacion-component.php) ===\n        setSelect('select-cubierta-fv-tipologia', 'cubierta_fv_tipologia');\n        setSelect('select-cubierta-fv-acceso', 'cubierta_fv_acceso');\n        setRadio('cubierta_fv_futuras_obras', 'cubierta_fv_futuras_obras');\n        setField('textarea-cubierta-fv-obras-descripcion', 'cubierta_fv_obras_descripcion');\n        setField('textarea-cubierta-fv-comentarios', 'cubierta_fv_comentarios');\n        \n        \/\/ === FV INSTALACI\u00d3N TERRENO (fotovoltaica-instalacion-component.php) ===\n        setSelect('select-terreno-fv-acceso', 'terreno_fv_acceso');\n        setRadio('terreno_fv_futuras_obras', 'terreno_fv_futuras_obras');\n        setField('textarea-terreno-fv-obras-descripcion', 'terreno_fv_obras_descripcion');\n        setField('textarea-terreno-fv-comentarios', 'terreno_fv_comentarios');\n        \n        \/\/ === FV EXISTENTE (fotovoltaica-component.php) ===\n        \/\/ Estos tienen IDs diferentes, revisar fotovoltaica-component.php\n        setField('input-terreno-comentarios', 'terreno_comentarios');\n        setField('input-terreno-obras-descripcion', 'terreno_obras_descripcion');\n        setField('input-cubierta-comentarios', 'cubierta_comentarios');\n        setField('input-cubierta-obras-descripcion', 'cubierta_obras_descripcion');\n        \n        \/\/ Mostrar los campos de detalle de obras si est\u00e1n marcados como \"si\"\n        if (loc.cubierta_mini_futuras_obras === 'si') {\n            const detalle = document.getElementById('mini-cubierta-futuras-obras-detalle');\n            if (detalle) detalle.style.display = 'block';\n        }\n        if (loc.terreno_mini_futuras_obras === 'si') {\n            const detalle = document.getElementById('mini-terreno-futuras-obras-detalle');\n            if (detalle) detalle.style.display = 'block';\n        }\n        if (loc.cubierta_fv_futuras_obras === 'si') {\n            const detalle = document.getElementById('cubierta-fv-futuras-obras-detalle');\n            if (detalle) detalle.style.display = 'block';\n        }\n        if (loc.terreno_fv_futuras_obras === 'si') {\n            const detalle = document.getElementById('terreno-fv-futuras-obras-detalle');\n            if (detalle) detalle.style.display = 'block';\n        }\n    }\n    \n    \/\/ Exponer globalmente para poder llamarla desde otros componentes\n    window.hidratarCamposTextoDesdeEstado = hidratarCamposTextoDesdeEstado;\n    \n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', iniciarActualizacion);\n    } else {\n        iniciarActualizacion();\n    }\n    if (typeof jQuery !== 'undefined') {\n        jQuery(document).on('roseo:step-changed', function(e, detail) {\n            if (detail && detail.current_state === 'step_3_item') {\n                setTimeout(actualizarComponentes, 100);\n            }\n        });\n    }\n    function scrollSuaveConOffset(elemento, offset) {\n        if (!elemento) return;\n        offset = offset || 80;\n        var targetPosition = elemento.getBoundingClientRect().top + window.pageYOffset - offset;\n        var startPosition = window.pageYOffset;\n        var distance = targetPosition - startPosition;\n        var duration = 600; \/\/ 600ms para scroll m\u00e1s suave\n        var start = null;\n        function step(timestamp) {\n            if (!start) start = timestamp;\n            var progress = timestamp - start;\n            var percent = Math.min(progress \/ duration, 1);\n            var easing = 1 - Math.pow(1 - percent, 3);\n            window.scrollTo(0, startPosition + distance * easing);\n            if (progress < duration) {\n                window.requestAnimationFrame(step);\n            }\n        }\n        window.requestAnimationFrame(step);\n    }\n    window.scrollSuaveConOffset = scrollSuaveConOffset;\n    window.actualizarComponentesItem = function(forzar) {\n        if (forzar) {\n            window._forzarScrollAlPrimerTab = true; \/\/ Activar scroll solo cuando es forzado\n            _componentesActualizados = false;\n            _ultimoTipo = null;\n        }\n        actualizarComponentes();\n    };\n})();\n<\/script>\n<div class=\"modal-mapa-fullscreen\" id=\"modal-mapa\">\n    <div class=\"modal-mapa-header\">\n        <div class=\"modal-mapa-header-top\">\n            <h3><i class=\"fas fa-map-marked-alt\"><\/i> Delimit your Installation Polygon<\/h3>\n            <button type=\"button\" class=\"modal-mapa-close\" onclick=\"cerrarMapaDirecto()\">&times;<\/button>\n        <\/div>\n        <div class=\"mapa-instrucciones-inline\">\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-search\"><\/i>\n                <span><strong>1. Search location:<\/strong> Use the search bar at the top right<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-hand-paper\"><\/i>\n                <span><strong>2. Position:<\/strong> Drag the map and use scroll to zoom<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" style=\"flex-shrink:0;\">\n                    <path d=\"M3 3 L21 3 L21 21 L3 21 Z\" fill=\"var(--mfm-accent)\" stroke=\"var(--mfm-primary)\" stroke-width=\"2\"\/>\n                <\/svg>\n                <span><strong>3. Draw:<\/strong> Click on the draw icon (left) and mark vertices<\/span>\n            <\/div>\n            <div class=\"instruccion-item\">\n                <i class=\"fas fa-edit\" style=\"color:var(--mfm-secondary);\"><\/i>\n                <span><strong>4. Edit:<\/strong> Use pencil to move points or select trash icon to delete the geometry<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div class=\"modal-mapa-body\">\n        <div id=\"mapa-container\"><\/div>\n    <\/div>\n    <div class=\"modal-mapa-footer\">\n        <div class=\"mapa-stats\">\n            <span id=\"mapa-status-msg\">Draw the polygon of your installation<\/span>\n        <\/div>\n        <div>\n            <button type=\"button\" class=\"item-btn item-btn-secondary mapa-btn-cancelar\" onclick=\"cerrarMapaModal()\">\n                <i class=\"fas fa-times\"><\/i> Cancel            <\/button>\n            <button type=\"button\" class=\"item-btn item-btn-primary\" onclick=\"guardarMapa()\">\n                <i class=\"fas fa-save\"><\/i> Save Polygon            <\/button>\n        <\/div>\n    <\/div>\n<\/div>\n<script>\n\/**\n * \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n * ESTRUCTURA DE DATOS PARA UBICACIONES\n * \n * CONVENCI\u00d3N DE NOMBRES:\n * - Campos FV Cubierta:  cubierta_fv_*\n * - Campos FV Terreno:   terreno_fv_*\n * - Campos Mini Cubierta: cubierta_mini_*\n * - Campos Mini Terreno:  terreno_mini_*\n * \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\/\nwindow.itemData = {\n    \/\/ === IDENTIFICACI\u00d3N ===\n    tipo_instalacion: '', \/\/ solo_fv | solo_mini | fv_ampliar_mini | mini_fv\n    \n    \/\/ === CONSUMO (com\u00fan) ===\n    tipo_consumo: '',     \/\/ euros_mes | euros_anio | kwh_mes | kwh_anio | factura | no_se\n    valor_consumo: '',\n    factura_pdf: '',\n    \n    \/\/ === FV: Tipo de ubicaci\u00f3n ===\n    ubicacion_fv: '',     \/\/ cubierta | terreno\n    \n    \/\/ === FV: Cubierta (prefijo: cubierta_fv_) ===\n    cubierta_fv_tipologia: '',\n    cubierta_fv_acceso: '',\n    cubierta_fv_futuras_obras: 'no',\n    cubierta_fv_obras_descripcion: '',\n    cubierta_fv_comentarios: '',\n    geojson_fv_cubierta: null,\n    poligonos_fv_cubierta: [],\n    \n    \/\/ === FV: Terreno (prefijo: terreno_fv_) ===\n    terreno_fv_acceso: '',\n    terreno_fv_futuras_obras: 'no',\n    terreno_fv_obras_descripcion: '',\n    terreno_fv_comentarios: '',\n    geojson_fv_terreno: null,\n    poligonos_fv_terreno: [],\n    \n    \/\/ === FV: Instalaci\u00f3n existente (para fv_ampliar_mini) ===\n    potencia_fv: '',\n    bateria: '',\n    capacidad: '',\n    \n    \/\/ === MINI: Tipo de ubicaci\u00f3n ===\n    ubicacion_mini: '',   \/\/ cubierta | terreno | ambas | no_se\n    \n    \/\/ === MINI: Cubierta (prefijo: cubierta_mini_) ===\n    cubierta_mini_tipologia: '',\n    cubierta_mini_acceso: '',\n    cubierta_mini_futuras_obras: 'no',\n    cubierta_mini_obras_descripcion: '',\n    cubierta_mini_comentarios: '',\n    geojson_mini_cubierta: null,\n    poligonos_mini_cubierta: [],\n    \n    \/\/ === MINI: Terreno (prefijo: terreno_mini_) ===\n    terreno_mini_acceso: '',\n    terreno_mini_futuras_obras: 'no',\n    terreno_mini_obras_descripcion: '',\n    terreno_mini_comentarios: '',\n    geojson_mini_terreno: null,\n    poligonos_mini_terreno: [],\n    \n    \/\/ === LEGACY (compatibilidad) - NO USAR EN C\u00d3DIGO NUEVO ===\n    geojson: '',          \/\/ -> usar geojson_fv_cubierta\n    geojson_fv: '',       \/\/ -> usar geojson_fv_cubierta o geojson_fv_terreno\n    poligonos: [],        \/\/ -> usar poligonos_fv_cubierta\n    poligonos_fv: [],     \/\/ -> usar poligonos_fv_cubierta o poligonos_fv_terreno\n    \n    \/\/ === UI ===\n    completedTabs: []\n};\n(function() {\n    function sincronizarTipoInstalacion() {\n        if (!window.itemData.tipo_instalacion && window.RoseoStateV2) {\n            const state = window.RoseoStateV2.getState();\n            const tipoFromState = (state.current_location && state.current_location.tipo_instalacion) ||\n                                  (state.form && state.form.tipo_instalacion) || '';\n            if (tipoFromState) {\n                window.itemData.tipo_instalacion = tipoFromState;\n                if (typeof window.actualizarComponentesItem === 'function') {\n                    window.actualizarComponentesItem(true);\n                }\n            }\n        }\n        if (!window.itemData.tipo_instalacion && window.roseoTipoInstalacion) {\n            window.itemData.tipo_instalacion = window.roseoTipoInstalacion;\n            if (typeof window.actualizarComponentesItem === 'function') {\n                window.actualizarComponentesItem(true);\n            }\n        }\n    }\n    sincronizarTipoInstalacion();\n    if (window.RoseoStateV2 && window.RoseoStateV2.onReady) {\n        window.RoseoStateV2.onReady(function() {\n            sincronizarTipoInstalacion();\n        });\n    }\n    setTimeout(sincronizarTipoInstalacion, 200);\n})();\nwindow.mapaLeaflet = null;\nwindow.drawnItems = null;\nfunction actualizarContadorUbicaciones() {\n    let ubicacionesGuardadas = [];\n    if (window.RoseoStateManager) {\n        const ubicacionesStr = window.RoseoStateManager.state.form_data.ubicaciones_guardadas;\n        if (ubicacionesStr) {\n            try {\n                ubicacionesGuardadas = JSON.parse(ubicacionesStr);\n            } catch(e) {}\n        }\n    }\n    const contador = document.getElementById('contador-ubicaciones');\n    const total = document.getElementById('total-ubicaciones');\n    if (ubicacionesGuardadas.length > 0) {\n        total.textContent = ubicacionesGuardadas.length;\n        contador.style.display = 'block';\n    } else {\n        contador.style.display = 'none';\n    }\n}\nfunction irAlHubOSiguiente() {\n    const nextState = 'step_3_hub';\n    if (window.RoseoStateV2) {\n        window.RoseoStateV2.setStep(nextState);\n    }\n    document.cookie = 'roseo_current_step=' + nextState + '; path=\/; max-age=86400';\n    if (typeof jQuery !== 'undefined' && typeof roseo_ajax !== 'undefined') {\n        let formData = {};\n        let ubicacionesData = [];\n        if (window.RoseoStateV2) {\n            const state = window.RoseoStateV2.getState();\n            formData = state.form || {};\n            ubicacionesData = state.ubicaciones || [];\n        } else if (window.RoseoStateManager?.state?.form_data) {\n            formData = window.RoseoStateManager.state.form_data;\n            const ubicacionesStr = formData.ubicaciones_guardadas;\n            if (typeof ubicacionesStr === 'string') {\n                try { ubicacionesData = JSON.parse(ubicacionesStr); } catch(e) {}\n            } else {\n                ubicacionesData = ubicacionesStr || [];\n            }\n        }\n        const dataToSend = { ...formData, ubicaciones_guardadas: ubicacionesData };\n        jQuery.ajax({\n            url: roseo_ajax.ajax_url,\n            type: 'POST',\n            data: {\n                action: 'roseo_navigate',\n                nonce: roseo_ajax.nonce,\n                current_state: nextState,\n                form_data: dataToSend\n            },\n            success: function(response) {\n                location.reload();\n            },\n            error: function(xhr, status, error) {\n                location.reload();\n            }\n        });\n    } else {\n        location.reload();\n    }\n}\nif (typeof window.toggleTab !== 'function') {\n    window.toggleTab = function(tabId) {\n        const id = typeof tabId === 'string' && !tabId.startsWith('tab-') ? 'tab-' + tabId : tabId;\n        const tab = document.getElementById(id);\n        if (!tab) return;\n        if (tab.classList.contains('disabled')) return;\n        const isActive = tab.classList.contains('active');\n        document.querySelectorAll('.item-tab').forEach(t => t.classList.remove('active'));\n        if (!isActive) tab.classList.add('active');\n    };\n}\nif (typeof window.habilitarTab !== 'function') {\n    window.habilitarTab = function(tabId) {\n        const id = typeof tabId === 'string' && !tabId.startsWith('tab-') ? 'tab-' + tabId : tabId;\n        const tab = document.getElementById(id);\n        if (!tab) return;\n        tab.classList.remove('disabled');\n    };\n}\nif (typeof window.marcarCompletado !== 'function') {\n    window.marcarCompletado = function(tabId) {\n        const id = typeof tabId === 'string' && !tabId.startsWith('tab-') ? 'tab-' + tabId : tabId;\n        const tab = document.getElementById(id);\n        if (!tab) return;\n        tab.classList.add('completed');\n        const statusEl = tab.querySelector('.item-tab-status');\n        if (statusEl) {\n            statusEl.textContent = window.itemTexts?.completado || 'Completado';\n        }\n        if (window.itemData && window.itemData.completedTabs && !window.itemData.completedTabs.includes(tabId)) {\n            window.itemData.completedTabs.push(tabId);\n        }\n    };\n}\nvar toggleTab = window.toggleTab;\nvar habilitarTab = window.habilitarTab;\nvar marcarCompletado = window.marcarCompletado;\nfunction marcarTabCompleto(tabId) {\n    marcarCompletado(tabId);\n}\n\/**\n * Funci\u00f3n helper para transici\u00f3n suave entre componentes\n * Cierra el tab actual, espera a la animaci\u00f3n, luego abre el siguiente\n * y hace scroll al t\u00edtulo del nuevo tab\n *\/\nfunction activarNuevoComponente(tabActualId, componenteNuevoId, callback) {\n    const tabActual = document.getElementById(tabActualId);\n    if (tabActual) {\n        tabActual.classList.add('completed');\n        tabActual.classList.remove('active');\n        const status = tabActual.querySelector('.item-tab-status');\n        if (status) status.textContent = window.itemTexts?.completado || 'Completado';\n    }\n    setTimeout(() => {\n        const compNuevo = document.getElementById(componenteNuevoId);\n        if (!compNuevo) {\n            if (callback) callback();\n            return;\n        }\n        compNuevo.style.display = 'block';\n        const primerTab = compNuevo.querySelector('.item-tab');\n        if (primerTab) {\n            primerTab.classList.remove('disabled');\n            setTimeout(() => {\n                primerTab.classList.add('active');\n                const header = primerTab.querySelector('.item-tab-header');\n                const target = header || primerTab;\n                if (window.scrollSuaveConOffset) {\n                    window.scrollSuaveConOffset(target, 80);\n                } else {\n                    target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n                }\n                if (callback) callback();\n            }, 150); \/\/ M\u00e1s tiempo para que se vea la transici\u00f3n\n        } else {\n            if (callback) callback();\n        }\n    }, 450); \/\/ M\u00e1s tiempo para cierre suave\n}\nfunction abrirSiguienteTab(currentTabId) {\n    let tipoInstalacion = window.itemData?.tipo_instalacion || '';\n    \n    if (!tipoInstalacion && window.RoseoStateV2) {\n        const state = window.RoseoStateV2.getState();\n        if (state.current_location && state.current_location.tipo_instalacion) {\n            tipoInstalacion = state.current_location.tipo_instalacion;\n        } else if (state.form && state.form.tipo_instalacion) {\n            tipoInstalacion = state.form.tipo_instalacion;\n        } else if (window.roseoTipoInstalacion) {\n            tipoInstalacion = window.roseoTipoInstalacion;\n        }\n        \n        if (tipoInstalacion && window.itemData) {\n            window.itemData.tipo_instalacion = tipoInstalacion;\n        }\n    }\n    if (!tipoInstalacion && window.roseoTipoInstalacion) {\n        tipoInstalacion = window.roseoTipoInstalacion;\n        if (window.itemData) {\n            window.itemData.tipo_instalacion = tipoInstalacion;\n        }\n    }\n    \n    const esSoloMini = tipoInstalacion === 'solo_mini';\n    const esSoloFV = tipoInstalacion === 'solo_fv';\n    const esFVAmpliarMini = tipoInstalacion === 'fv_ampliar_mini';\n    const esMiniFV = tipoInstalacion === 'mini_fv';\n\n    \/\/ FV tab (potencia) -> Bater\u00eda tab (for fv_ampliar_mini - FV existente)\n    if (currentTabId === 'fv' && esFVAmpliarMini) {\n        habilitarTab('bateria');\n        toggleTab('bateria');\n        return;\n    }\n\n    \/\/ Bater\u00eda tab -> Consumo tab (for fv_ampliar_mini)\n    if (currentTabId === 'bateria' && esFVAmpliarMini) {\n        habilitarTab('consumo');\n        toggleTab('consumo');\n        return;\n    }\n\n    \/\/ Consumo tab inside FV component -> Minie\u00f3lica (for fv_ampliar_mini)\n    if (currentTabId === 'consumo' && esFVAmpliarMini) {\n        activarNuevoComponente('tab-consumo', 'componente-minieolica');\n        return;\n    }\n\n    \/\/ General consumo tab transitions for other installation types\n    if (currentTabId === 'consumo' && esSoloFV) {\n        activarNuevoComponente('tab-consumo-general', 'componente-fv-instalacion');\n        return;\n    }\n    if (currentTabId === 'consumo' && esMiniFV) {\n        \/\/ mini_fv: Ambas nuevas - despu\u00e9s de consumo general va FV instalaci\u00f3n\n        activarNuevoComponente('tab-consumo-general', 'componente-fv-instalacion');\n        return;\n    }\n    if (currentTabId === 'consumo' && esSoloMini) {\n        activarNuevoComponente('tab-consumo-general', 'componente-minieolica');\n        return;\n    }\n}\nfunction guardarTab(num) {\n    if (num === 1) {\n        const potencia = document.getElementById('input-potencia-fv')?.value;\n        if (!potencia || potencia <= 0) {\n            mostrarToast(window.itemTexts?.potencia_requerida || 'Por favor, indica la potencia fotovoltaica instalada.', 'danger');\n            return;\n        }\n        window.itemData.potencia_fv = potencia;\n        marcarCompletado(1);\n        habilitarTab(2);\n        toggleTab(2);\n    }\n    if (num === 3) {\n        if (!window.itemData.bateria) {\n            mostrarToast(window.itemTexts?.bateria_requerida || 'Selecciona una opci\u00f3n de bater\u00eda.', 'danger');\n            return;\n        }\n        if (window.itemData.bateria === 'si') {\n            const cap = document.getElementById('input-capacidad-bateria')?.value;\n            if (!cap || cap <= 0) {\n                mostrarToast(window.itemTexts?.capacidad_requerida || 'Indica la capacidad de la bater\u00eda.', 'danger');\n                return;\n            }\n            window.itemData.capacidad = cap;\n            window.itemData.capacidad_bateria = cap;\n        }\n        marcarCompletado(3);\n        habilitarTab(4);\n        toggleTab(4);\n    }\n    if (num === 4) {\n        if (!window.itemData.tipo_consumo) {\n            mostrarToast(window.itemTexts?.consumo_requerido || 'Selecciona un tipo de consumo.', 'danger');\n            return;\n        }\n        if (window.itemData.tipo_consumo === 'factura') {\n            const file = document.getElementById('item-factura').files[0];\n            if (!file) {\n                mostrarToast(window.itemTexts?.factura_requerida || 'Por favor, adjunta la factura.', 'danger');\n                return;\n            }\n            const reader = new FileReader();\n            reader.onload = function(e) {\n                window.itemData.factura_pdf = e.target.result;\n                marcarCompletado(4);\n                habilitarTab(5);\n                toggleTab(5);\n            };\n            reader.readAsDataURL(file);\n        } else if (window.itemData.tipo_consumo !== 'no_se') {\n            const valor = document.getElementById('item-valor-consumo').value;\n            if (!valor || valor <= 0) {\n                mostrarToast(window.itemTexts?.valor_consumo_requerido || 'Indica el valor del consumo.', 'danger');\n                return;\n            }\n            window.itemData.valor_consumo = valor;\n            marcarCompletado(4);\n            habilitarTab(5);\n            toggleTab(5);\n        } else {\n            marcarCompletado(4);\n            habilitarTab(5);\n            toggleTab(5);\n        }\n    }\n    if (num === 5) {\n        if (!window.itemData.ubicacion_mini) {\n            mostrarToast(window.itemTexts?.ubicacion_mini_requerida || 'Selecciona d\u00f3nde instalar\u00e1s la minie\u00f3lica.', 'warning');\n            return;\n        }\n        marcarCompletado(5);\n        habilitarTab(6);\n        cargarMapasMinieolica(window.itemData.ubicacion_mini);\n        toggleTab(6);\n    }\n    if (num === 6) {\n        const ubicacion = window.itemData.ubicacion_mini;\n        if (ubicacion === 'no_se') {\n            marcarCompletado(6);\n            finalizarItem();\n            return;\n        }\n        if (ubicacion === 'cubierta' || ubicacion === 'ambas') {\n            const tipologia = document.getElementById('cubierta-tipologia');\n            if (tipologia && !tipologia.value) {\n                mostrarToast(window.itemTexts?.tipologia_cubierta_requerida || 'Selecciona la tipolog\u00eda de la cubierta.', 'warning');\n                return;\n            }\n        }\n        if (ubicacion === 'cubierta') {\n            if (!window.itemData.geojson_mini_cubierta) {\n                mostrarToast(window.itemTexts?.poligono_cubierta_requerido || 'Debes dibujar el pol\u00edgono de la cubierta.', 'warning');\n                return;\n            }\n        } else if (ubicacion === 'terreno') {\n            if (!window.itemData.geojson_mini_terreno) {\n                mostrarToast(window.itemTexts?.poligono_terreno_requerido || 'Debes dibujar el pol\u00edgono del terreno.', 'warning');\n                return;\n            }\n        } else if (ubicacion === 'ambas') {\n            if (!window.itemData.geojson_mini_cubierta || !window.itemData.geojson_mini_terreno) {\n                mostrarToast(window.itemTexts?.poligonos_ambos_requeridos || 'Debes dibujar ambos pol\u00edgonos (cubierta y terreno).', 'warning');\n                return;\n            }\n        }\n        marcarCompletado(6);\n        finalizarItem();\n    }\n}\nfunction cargarMapasMinieolica(ubicacion) {\n    const instrucciones = document.getElementById('mapa-mini-instrucciones');\n    const cubiertaWrapper = document.getElementById('mapa-cubierta-wrapper');\n    const terrenoWrapper = document.getElementById('mapa-terreno-wrapper');\n    const noseWrapper = document.getElementById('mapa-nose-wrapper');\n    if (cubiertaWrapper) cubiertaWrapper.style.display = 'none';\n    if (terrenoWrapper) terrenoWrapper.style.display = 'none';\n    if (noseWrapper) noseWrapper.style.display = 'none';\n    if (ubicacion === 'no_se') {\n        instrucciones.innerHTML = '';\n        noseWrapper.style.display = 'block';\n        return;\n    }\n    instrucciones.innerHTML = '<p style=\"color:var(--mfm-primary); font-weight:600; margin-bottom:20px;\"><i class=\"fas fa-info-circle\"><\/i> ' + (window.itemTexts?.mapa_instrucciones_dibujar || 'Dibuja el\/los pol\u00edgono(s) de instalaci\u00f3n minie\u00f3lica:') + '<\/p>';\n    if (ubicacion === 'cubierta') {\n        cubiertaWrapper.style.display = 'block';\n        setTimeout(() => {\n            const btnMapa = cubiertaWrapper.querySelector('.btn-abrir-mapa');\n            if (btnMapa && btnMapa.onclick) {\n            }\n        }, 300);\n    } else if (ubicacion === 'terreno') {\n        terrenoWrapper.style.display = 'block';\n        setTimeout(() => {\n            const btnMapa = terrenoWrapper.querySelector('.btn-abrir-mapa');\n            if (btnMapa && btnMapa.onclick) {\n            }\n        }, 300);\n    } else if (ubicacion === 'ambas') {\n        cubiertaWrapper.style.display = 'block';\n        terrenoWrapper.style.display = 'block';\n        setTimeout(() => {\n            const btnMapaCubierta = cubiertaWrapper.querySelector('.btn-abrir-mapa');\n            const btnMapaTerreno = terrenoWrapper.querySelector('.btn-abrir-mapa');\n            if (btnMapaCubierta && btnMapaCubierta.onclick) {\n            }\n            if (btnMapaTerreno && btnMapaTerreno.onclick) {\n            }\n        }, 300);\n    }\n}\nfunction onMapaMiniCubiertaGuardado(featureCollection, feature, areaHa) {\n    const geojsonStr = JSON.stringify(featureCollection);\n    window.itemData.geojson_mini_cubierta = geojsonStr;\n    window.itemData.poligonos_mini_cubierta = featureCollection.features || [feature];\n    \n    \/\/ \u2705 FIX: Sync to RoseoStateV2 (current state manager)\n    if (window.RoseoStateV2) {\n        window.RoseoStateV2.setPolygons('mini_cubierta', featureCollection.features || [feature]);\n        window.RoseoStateV2.setLocationField('geojson_mini_cubierta', geojsonStr);\n    }\n    \n    \/\/ Legacy support\n    if (window.RoseoStateManager && typeof window.RoseoStateManager.saveField === 'function') {\n        window.RoseoStateManager.saveField('mini_cubierta_geojson', geojsonStr);\n        window.RoseoStateManager.saveField('mini_cubierta_lat', feature.properties.center_lat);\n        window.RoseoStateManager.saveField('mini_cubierta_lng', feature.properties.center_lng);\n        window.RoseoStateManager.saveField('mini_cubierta_area_ha', areaHa);\n    }\n    const camposCubierta = document.getElementById('campos-cubierta');\n    if (camposCubierta) {\n        camposCubierta.style.display = 'block';\n    }\n    mostrarToast((window.itemTexts?.poligono_cubierta_guardado || 'Pol\u00edgono cubierta guardado.') + ' ' + (window.itemTexts?.completa_datos || 'Completa los datos adicionales.'), 'success');\n}\nfunction onMapaMiniTerrenoGuardado(featureCollection, feature, areaHa) {\n    const geojsonStr = JSON.stringify(featureCollection);\n    window.itemData.geojson_mini_terreno = geojsonStr;\n    window.itemData.poligonos_mini_terreno = featureCollection.features || [feature];\n    \n    \/\/ \u2705 FIX: Sync to RoseoStateV2 (current state manager)\n    if (window.RoseoStateV2) {\n        window.RoseoStateV2.setPolygons('mini_terreno', featureCollection.features || [feature]);\n        window.RoseoStateV2.setLocationField('geojson_mini_terreno', geojsonStr);\n    }\n    \n    \/\/ Legacy support\n    if (window.RoseoStateManager && typeof window.RoseoStateManager.saveField === 'function') {\n        window.RoseoStateManager.saveField('mini_terreno_geojson', geojsonStr);\n        window.RoseoStateManager.saveField('mini_terreno_lat', feature.properties.center_lat);\n        window.RoseoStateManager.saveField('mini_terreno_lng', feature.properties.center_lng);\n        window.RoseoStateManager.saveField('mini_terreno_area_ha', areaHa);\n    }\n    const camposTerreno = document.getElementById('campos-terreno');\n    if (camposTerreno) {\n        camposTerreno.style.display = 'block';\n    }\n    mostrarToast((window.itemTexts?.poligono_terreno_guardado || 'Pol\u00edgono terreno guardado.') + ' ' + (window.itemTexts?.completa_datos || 'Completa los datos adicionales.'), 'success');\n}\nfunction onMapaGuardado(featureCollection, feature, areaHa) {\n    window.itemData.geojson = JSON.stringify(featureCollection);\n    window.itemData.poligonos = [feature];\n    if (window.RoseoStateManager) {\n        window.RoseoStateManager.saveField('ubicacion_geojson', window.itemData.geojson);\n        window.RoseoStateManager.saveField('ubicacion_lat', feature.properties.center_lat);\n        window.RoseoStateManager.saveField('ubicacion_lng', feature.properties.center_lng);\n        window.RoseoStateManager.saveField('ubicacion_area_ha', areaHa);\n    }\n    marcarCompletado(2);\n    habilitarTab(3);\n    toggleTab(3);\n    mostrarToast(window.itemTexts?.poligono_guardado || 'Pol\u00edgono guardado correctamente.', 'success');\n}\nfunction onMapaFVGuardado(featureCollection, feature, areaHa) {\n    const geojsonStr = JSON.stringify(featureCollection);\n    window.itemData.geojson_fv = geojsonStr;\n    window.itemData.geojson = geojsonStr; \/\/ Compatibilidad\n    window.itemData.poligonos_fv = [feature];\n    window.itemData.poligonos = [feature]; \/\/ Compatibilidad\n    \n    if (window.RoseoStateV2) {\n        const tipo = window.itemData.tipo_instalacion || '';\n        \/\/ Para solo_fv y mini_fv: el pol\u00edgono FV va a poligonos_fv_cubierta o _terreno seg\u00fan ubicacion_fv\n        if (['solo_fv', 'mini_fv'].includes(tipo)) {\n            const ubiFV = window.itemData.ubicacion_fv || '';\n            if (ubiFV === 'cubierta') {\n                window.RoseoStateV2.setLocationField('geojson_fv_cubierta', geojsonStr);\n                window.RoseoStateV2.setPolygons('fv_cubierta', [feature]);\n            } else if (ubiFV === 'terreno') {\n                window.RoseoStateV2.setLocationField('geojson_fv_terreno', geojsonStr);\n                window.RoseoStateV2.setPolygons('fv_terreno', [feature]);\n            } else {\n                \/\/ ambas\/no_se o a\u00fan no seleccionado: guardar en gen\u00e9rico, se redistribuir\u00e1 en finalizarItem\n                window.RoseoStateV2.setLocationField('geojson_fv', geojsonStr);\n                window.RoseoStateV2.setPolygons('fv', [feature]);\n            }\n        } else {\n            \/\/ fv_ampliar_mini: FV existente usa poligonos_fv (gen\u00e9rico)\n            window.RoseoStateV2.setLocationField('geojson_fv', geojsonStr);\n            window.RoseoStateV2.setPolygons('fv', [feature]);\n        }\n    }\n    \n    \/\/ Legacy support\n    if (window.RoseoStateManager && typeof window.RoseoStateManager.saveField === 'function') {\n        window.RoseoStateManager.saveField('fv_geojson', JSON.stringify(featureCollection));\n        window.RoseoStateManager.saveField('fv_lat', feature.properties.center_lat);\n        window.RoseoStateManager.saveField('fv_lng', feature.properties.center_lng);\n        window.RoseoStateManager.saveField('fv_area_ha', areaHa);\n    }\n    marcarCompletado(2);\n    habilitarTab(3);\n    toggleTab(3);\n    mostrarToast(window.itemTexts?.poligono_fv_guardado || 'Pol\u00edgono fotovoltaico guardado correctamente.', 'success');\n}\nfunction seleccionarConsumo(valor) {\n    document.querySelectorAll('#tab-4 .item-card').forEach(c => c.classList.remove('selected'));\n    document.querySelector('#tab-4 .item-card[data-value=\"' + valor + '\"]').classList.add('selected');\n    window.itemData.tipo_consumo = valor;\n    if (window.RoseoStateManager && typeof window.RoseoStateManager.saveField === 'function') {\n        window.RoseoStateManager.saveField('item_tipo_consumo', valor);\n    }\n    const campoValor = document.getElementById('campo-valor-consumo');\n    const campoFactura = document.getElementById('campo-factura');\n    const label = document.getElementById('label-consumo');\n    campoValor.classList.remove('show');\n    campoFactura.classList.remove('show');\n    if (valor === 'factura') {\n        campoFactura.classList.add('show');\n    } else if (valor !== 'no_se') {\n        campoValor.classList.add('show');\n        const labels = {\n            'euros_mes': window.itemTexts?.consumo_label_euros_mes || 'Consumo en \u20ac\/mes',\n            'euros_anio': window.itemTexts?.consumo_label_euros_anio || 'Consumo en \u20ac\/a\u00f1o',\n            'kwh_mes': window.itemTexts?.consumo_label_kwh_mes || 'Consumo en kWh\/mes',\n            'kwh_anio': window.itemTexts?.consumo_label_kwh_anio || 'Consumo en kWh\/a\u00f1o'\n        };\n        label.textContent = labels[valor] || (window.itemTexts?.consumo_label_valor || 'Valor');\n    }\n    document.getElementById('btns-consumo').style.display = 'flex';\n}\nfunction mostrarToast(mensaje, tipo) {\n    const colores = {\n        'success': 'bg-success',\n        'danger': 'bg-danger',\n        'warning': 'bg-warning',\n        'info': 'bg-info'\n    };\n    const iconos = {\n        'success': '<i class=\"fas fa-check-circle me-2\"><\/i>',\n        'danger': '<i class=\"fas fa-times-circle me-2\"><\/i>',\n        'warning': '<i class=\"fas fa-exclamation-triangle me-2\"><\/i>',\n        'info': '<i class=\"fas fa-info-circle me-2\"><\/i>'\n    };\n    const icono = iconos[tipo] || '';\n    const toastHtml = `\n        <div class=\"toast align-items-center text-white ${colores[tipo]} border-0\" role=\"alert\" id=\"toastMensaje\">\n            <div class=\"d-flex\">\n                <div class=\"toast-body\">\n                    ${icono}${mensaje}\n                <\/div>\n                <button type=\"button\" class=\"btn-close btn-close-white me-2 m-auto\" data-bs-dismiss=\"toast\"><\/button>\n            <\/div>\n        <\/div>\n    `;\n    let container = document.getElementById('toast-container');\n    if (!container) {\n        container = document.createElement('div');\n        container.id = 'toast-container';\n        container.className = 'toast-container position-fixed top-0 end-0 p-3';\n        container.style.zIndex = '9999999';\n        document.body.appendChild(container);\n    }\n    container.innerHTML = toastHtml;\n    const toast = new bootstrap.Toast(document.getElementById('toastMensaje'), { delay: 3000 });\n    toast.show();\n}\nfunction itemVolver() {\n    const esHub = false;\n    if (esHub) {\n        if (window.RoseoStateManager && typeof window.RoseoStateManager.gotoStep === 'function') {\n            window.RoseoStateManager.gotoStep('step_3');\n        } else {\n        }\n    } else {\n        if (window.RoseoStateManager) {\n            window.RoseoStateManager.saveField('tipo_instalacion', '');\n            window.RoseoStateManager.gotoStep('step_3');\n        }\n    }\n}\nfunction volverAlHub() {\n    const currentLocation = window.RoseoStateV2?.getCurrentLocation();\n    const hayDatos = currentLocation && (\n        currentLocation.potencia_fv ||\n        currentLocation.bateria ||\n        currentLocation.tipo_consumo ||\n        currentLocation.ubicacion_mini ||\n        (currentLocation.poligonos_fv && currentLocation.poligonos_fv.length > 0) ||\n        (currentLocation.poligonos_mini_terreno && currentLocation.poligonos_mini_terreno.length > 0) ||\n        (currentLocation.poligonos_mini_cubierta && currentLocation.poligonos_mini_cubierta.length > 0)\n    );\n    if (hayDatos) {\n        if (!confirm(window.itemTexts?.confirmar_salir || '\u00bfEst\u00e1s seguro? Los datos de esta ubicaci\u00f3n no guardada se perder\u00e1n.')) {\n            return;\n        }\n    }\n    if (window.RoseoStateV2) {\n        window.RoseoStateV2.startNewLocation('');\n        window.RoseoStateV2.gotoStep('step_3_hub');\n    }\n}\nfunction finalizarItem() {\n    if (!validarCamposObligatorios()) {\n        return;\n    }\n    function ensurePolygonArray(val) {\n        if (!val) {\n            return [];\n        }\n        if (Array.isArray(val)) {\n            return val;\n        }\n        if (typeof val === 'object' && val.features) {\n            return val.features || [];\n        }\n        if (typeof val === 'object') {\n            return [val];\n        }\n        if (typeof val === 'string') {\n            try { \n                const parsed = JSON.parse(val);\n                if (Array.isArray(parsed)) return parsed;\n                if (parsed.features) return parsed.features;\n                return [parsed];\n            } catch(e) { \n                return []; \n            }\n        }\n        return [];\n    }\n    \/\/ Sincronizar datos de fvInstalacionManager si existe (para mini_fv y h\u00edbridos)\n    if (window.fvInstalacionManager) {\n        \/\/ Forzar guardado interno del manager para asegurar que tenga los \u00faltimos datos\n        try { window.fvInstalacionManager.saveToState(); } catch(e) {}\n        \n        \/\/ CORRECCI\u00d3N: Usar getCurrent().toJSON() o acceder a propiedades\n        const fvInstance = window.fvInstalacionManager.getCurrent();\n        const fvData = fvInstance ? (fvInstance.toJSON ? fvInstance.toJSON() : fvInstance) : null;\n        \n        if (fvData) {\n            \/\/ INTENTAR RECUPERAR DATOS ESPEC\u00cdFICOS SI EXISTEN EN fvData (depende de c\u00f3mo guarde el componente)\n            \/\/ Si el componente guarda en fv_terreno\/fv_cubierta, el manager MFM est\u00e1ndar puede no tenerlo en las propiedades est\u00e1ndar.\n            \/\/ PERO, vamos a intentar fusionar lo que tengamos.\n            \n            \/\/ Recuperar pol\u00edgonos espec\u00edficos si est\u00e1n en itemData (que es donde el componente escribe directamente)\n            const fvTerreno = window.itemData.poligonos_fv_terreno || (fvData.poligonos_fv_terreno) || [];\n            const fvCubierta = window.itemData.poligonos_fv_cubierta || (fvData.poligonos_fv_cubierta) || [];\n            \n            \/\/ FUSIONAR pol\u00edgonos FV\n            let mergedFVPolygons = [];\n            \n            \/\/ 1. Pol\u00edgonos gen\u00e9ricos FV\n            if (fvData.poligonos_fv && Array.isArray(fvData.poligonos_fv)) {\n                mergedFVPolygons = mergedFVPolygons.concat(fvData.poligonos_fv);\n            } else if (fvData.poligonos && Array.isArray(fvData.poligonos)) {\n                mergedFVPolygons = mergedFVPolygons.concat(fvData.poligonos);\n            }\n            \n            \/\/ 2. Pol\u00edgonos Terreno parseados\n            if (Array.isArray(fvTerreno) && fvTerreno.length > 0) {\n                 \/\/ Evitar duplicados si ya est\u00e1n\n                 \/\/ (Simplificaci\u00f3n: si ya hay pol\u00edgonos, asumimos que pueden ser los mismos, pero mejor unir todo por si acaso filtraremos ids despu\u00e9s)\n                 const existingIds = new Set(mergedFVPolygons.map(p => p.id));\n                 fvTerreno.forEach(p => {\n                     if (!existingIds.has(p.id)) mergedFVPolygons.push(p);\n                 });\n            } else if (window.itemData.geojson_fv_terreno) {\n                 try {\n                     const geoT = typeof window.itemData.geojson_fv_terreno === 'string' ? JSON.parse(window.itemData.geojson_fv_terreno) : window.itemData.geojson_fv_terreno;\n                     const feats = geoT.features || (Array.isArray(geoT) ? geoT : [geoT]);\n                     feats.forEach(p => mergedFVPolygons.push(p));\n                 } catch(e) {}\n            }\n            \n            \/\/ 3. Pol\u00edgonos Cubierta parseados\n            if (Array.isArray(fvCubierta) && fvCubierta.length > 0) {\n                 const existingIds = new Set(mergedFVPolygons.map(p => p.id));\n                 fvCubierta.forEach(p => {\n                     if (!existingIds.has(p.id)) mergedFVPolygons.push(p);\n                 });\n            } else if (window.itemData.geojson_fv_cubierta) {\n                 try {\n                     const geoC = typeof window.itemData.geojson_fv_cubierta === 'string' ? JSON.parse(window.itemData.geojson_fv_cubierta) : window.itemData.geojson_fv_cubierta;\n                     const feats = geoC.features || (Array.isArray(geoC) ? geoC : [geoC]);\n                     feats.forEach(p => mergedFVPolygons.push(p));\n                 } catch(e) {}\n            }\n            \n            if (mergedFVPolygons.length > 0) {\n                window.itemData.poligonos_fv = mergedFVPolygons;\n                const geojsonFV = JSON.stringify({\n                    type: 'FeatureCollection',\n                    features: mergedFVPolygons\n                });\n                window.itemData.geojson_fv = geojsonFV;\n                \n                \/\/ CR\u00cdTICO: Actualizar tambi\u00e9n el estado global (RoseoStateV2), ya que itemData es una copia\n                if (stateV2) {\n                    stateV2.setPolygons('fv', mergedFVPolygons);\n                    stateV2.setLocationField('geojson_fv', geojsonFV);\n                    \n                    \/\/ Asegurar campos de texto de FV\n                    if (window.itemData.ubicacion_fv) stateV2.setLocationField('ubicacion_fv', window.itemData.ubicacion_fv);\n                    if (window.itemData.terreno_fv_acceso) stateV2.setLocationField('terreno_fv_acceso', window.itemData.terreno_fv_acceso);\n                    if (window.itemData.terreno_fv_futuras_obras) stateV2.setLocationField('terreno_fv_futuras_obras', window.itemData.terreno_fv_futuras_obras);\n                    if (window.itemData.terreno_fv_obras_descripcion) stateV2.setLocationField('terreno_fv_obras_descripcion', window.itemData.terreno_fv_obras_descripcion);\n                    if (window.itemData.terreno_fv_comentarios) stateV2.setLocationField('terreno_fv_comentarios', window.itemData.terreno_fv_comentarios);\n                    \n                    if (window.itemData.cubierta_fv_tipologia) stateV2.setLocationField('cubierta_fv_tipologia', window.itemData.cubierta_fv_tipologia);\n                    if (window.itemData.cubierta_fv_acceso) stateV2.setLocationField('cubierta_fv_acceso', window.itemData.cubierta_fv_acceso);\n                    if (window.itemData.cubierta_fv_futuras_obras) stateV2.setLocationField('cubierta_fv_futuras_obras', window.itemData.cubierta_fv_futuras_obras);\n                    if (window.itemData.cubierta_fv_obras_descripcion) stateV2.setLocationField('cubierta_fv_obras_descripcion', window.itemData.cubierta_fv_obras_descripcion);\n                    if (window.itemData.cubierta_fv_comentarios) stateV2.setLocationField('cubierta_fv_comentarios', window.itemData.cubierta_fv_comentarios);\n                }\n            } else {\n                 \/\/ Fallback: Si no hay pol\u00edgonos fusionados, mirar si el estado V2 ya tiene algo (quiz\u00e1s se guard\u00f3 antes)\n                 if (stateV2) {\n                     const stateData = stateV2.getCurrentLocation();\n                     if (stateData && stateData.poligonos_fv && stateData.poligonos_fv.length > 0) {\n                         window.itemData.poligonos_fv = stateData.poligonos_fv;\n                         \/\/ Reimponer para asegurar consistencia\n                         stateV2.setPolygons('fv', stateData.poligonos_fv);\n                     }\n                 }\n            }\n\n            \/\/ --- HYDRATION FIX: Recuperar datos parciales de FV desde StateV2 si faltan en itemData ---\n    if (!window.itemData.poligonos_fv_terreno || window.itemData.poligonos_fv_terreno.length === 0) {\n        if (stateV2) {\n             const state = stateV2.getState();\n             if (state.current_location && state.current_location.poligonos_fv_terreno) {\n                 window.itemData.poligonos_fv_terreno = state.current_location.poligonos_fv_terreno;\n             }\n        }\n    }\n    if (!window.itemData.poligonos_fv_cubierta || window.itemData.poligonos_fv_cubierta.length === 0) {\n        if (stateV2) {\n             const state = stateV2.getState();\n             if (state.current_location && state.current_location.poligonos_fv_cubierta) {\n                 window.itemData.poligonos_fv_cubierta = state.current_location.poligonos_fv_cubierta;\n             }\n        }\n    }\n    \/\/ ------------------------------------------------------------------------------------------\n\n    \/\/ 1. Obtener todos los pol\u00edgonos de FV disponibles en itemData\n            \/\/ Sincronizar campos de texto espec\u00edficos de FV si faltan en itemData\n            \/\/ Mapeamos los campos del manager FV a itemData Y a StateV2\n            if (fvData.ubicacion) {\n                if (!window.itemData.ubicacion_fv) window.itemData.ubicacion_fv = fvData.ubicacion;\n                if (stateV2) stateV2.setLocationField('ubicacion_fv', fvData.ubicacion);\n            }\n            \n            \/\/ \u2705 FIX: El componente fv-instalacion guarda con prefijo terreno_fv_*, cubierta_fv_*\n            \/\/ Leer ambas formas (con y sin prefijo) para compatibilidad\n            const fvTerrAcceso = fvData.terreno_fv_acceso || fvData.terreno_acceso;\n            const fvTerrObras = fvData.terreno_fv_futuras_obras || fvData.terreno_futuras_obras;\n            const fvTerrObrasDesc = fvData.terreno_fv_obras_descripcion || fvData.terreno_obras_descripcion;\n            const fvTerrComentarios = fvData.terreno_fv_comentarios || fvData.terreno_comentarios;\n            const fvCubTipologia = fvData.cubierta_fv_tipologia || fvData.cubierta_tipologia;\n            const fvCubAcceso = fvData.cubierta_fv_acceso || fvData.cubierta_acceso;\n            const fvCubObras = fvData.cubierta_fv_futuras_obras || fvData.cubierta_futuras_obras;\n            const fvCubObrasDesc = fvData.cubierta_fv_obras_descripcion || fvData.cubierta_obras_descripcion;\n            const fvCubComentarios = fvData.cubierta_fv_comentarios || fvData.cubierta_comentarios;\n\n            if (fvTerrAcceso) {\n                window.itemData.terreno_fv_acceso = fvTerrAcceso;\n                if (stateV2) stateV2.setLocationField('terreno_fv_acceso', fvTerrAcceso);\n            }\n            if (fvTerrObras) {\n                window.itemData.terreno_fv_futuras_obras = fvTerrObras;\n                if (stateV2) stateV2.setLocationField('terreno_fv_futuras_obras', fvTerrObras);\n            }\n            if (fvTerrObrasDesc) {\n                window.itemData.terreno_fv_obras_descripcion = fvTerrObrasDesc;\n                if (stateV2) stateV2.setLocationField('terreno_fv_obras_descripcion', fvTerrObrasDesc);\n            }\n            if (fvTerrComentarios) {\n                window.itemData.terreno_fv_comentarios = fvTerrComentarios;\n                if (stateV2) stateV2.setLocationField('terreno_fv_comentarios', fvTerrComentarios);\n            }\n            if (fvCubTipologia) {\n                window.itemData.cubierta_fv_tipologia = fvCubTipologia;\n                if (stateV2) stateV2.setLocationField('cubierta_fv_tipologia', fvCubTipologia);\n            }\n            if (fvCubAcceso) {\n                window.itemData.cubierta_fv_acceso = fvCubAcceso;\n                if (stateV2) stateV2.setLocationField('cubierta_fv_acceso', fvCubAcceso);\n            }\n            if (fvCubObras) {\n                window.itemData.cubierta_fv_futuras_obras = fvCubObras;\n                if (stateV2) stateV2.setLocationField('cubierta_fv_futuras_obras', fvCubObras);\n            }\n            if (fvCubObrasDesc) {\n                window.itemData.cubierta_fv_obras_descripcion = fvCubObrasDesc;\n                if (stateV2) stateV2.setLocationField('cubierta_fv_obras_descripcion', fvCubObrasDesc);\n            }\n            if (fvCubComentarios) {\n                window.itemData.cubierta_fv_comentarios = fvCubComentarios;\n                if (stateV2) stateV2.setLocationField('cubierta_fv_comentarios', fvCubComentarios);\n            }\n        }\n    }\n\n    const stateV2 = window.RoseoStateV2;\n    if (!stateV2) {\n        alert('Error: Sistema de estado no disponible');\n        return;\n    }\n    let tipoInstalacionActual = window.itemData.tipo_instalacion || window.roseoTipoInstalacion || '' || '';\n    \n    \/\/ Auto-correcci\u00f3n: Si tenemos datos de AMBAS tecnolog\u00edas Y el tipo actual es solo_fv o solo_mini,\n    \/\/ entonces forzar mini_fv. PERO NO cambiar si ya es fv_ampliar_mini (ese tipo S\u00cd tiene ambas tecnolog\u00edas intencionalmente)\n    const tieneDatosMini = (window.itemData.geojson_mini_terreno || window.itemData.geojson_mini_cubierta || (window.itemData.poligonos_mini && window.itemData.poligonos_mini.length > 0));\n    \n    \/\/ \u2705 FIX: Verificar que geojson_fv tenga contenido v\u00e1lido, no solo que exista\n    let tieneDatosFV = false;\n    if (window.itemData.poligonos_fv && window.itemData.poligonos_fv.length > 0) {\n        tieneDatosFV = true;\n    } else if (window.itemData.geojson_fv) {\n        \/\/ Verificar que el GeoJSON tenga features reales\n        try {\n            const geoFV = typeof window.itemData.geojson_fv === 'string' ? JSON.parse(window.itemData.geojson_fv) : window.itemData.geojson_fv;\n            if (geoFV && geoFV.features && geoFV.features.length > 0) {\n                tieneDatosFV = true;\n            }\n        } catch(e) {\n            \/\/ Si no se puede parsear, no hay datos v\u00e1lidos\n            tieneDatosFV = false;\n        }\n    }\n    \n    console.log('[finalizarItem] Evaluaci\u00f3n auto-correcci\u00f3n:', {\n        tipoActual: tipoInstalacionActual,\n        tieneDatosMini,\n        tieneDatosFV,\n        geojson_fv: !!window.itemData.geojson_fv,\n        poligonos_fv: window.itemData.poligonos_fv ? window.itemData.poligonos_fv.length : 0\n    });\n\n    \/\/ Solo auto-corregir si el tipo actual es solo_fv o solo_mini (inconsistente con los datos)\n    \/\/ NUNCA cambiar fv_ampliar_mini porque ese tipo ES correcto cuando tiene ambos\n    if (tieneDatosMini && tieneDatosFV && (tipoInstalacionActual === 'solo_fv' || tipoInstalacionActual === 'solo_mini')) {\n        console.log('[finalizarItem] Auto-correcci\u00f3n: cambiando', tipoInstalacionActual, 'a mini_fv porque tiene datos de ambas tecnolog\u00edas');\n        tipoInstalacionActual = 'mini_fv';\n        window.itemData.tipo_instalacion = 'mini_fv';\n    }\n    stateV2.setFormData('tipo_instalacion', tipoInstalacionActual);\n    stateV2.setLocationField('tipo_instalacion', tipoInstalacionActual);\n\n    \/\/ \u2550\u2550\u2550 Determinar qu\u00e9 dominios aplican seg\u00fan tipo_instalacion \u2550\u2550\u2550\n    \/\/ needsNewFV: el usuario configura ubicaci\u00f3n FV nueva (cubierta\/terreno FV)\n    \/\/ needsFVExistente: el usuario marca FV existente (pol\u00edgono de referencia + potencia\/bater\u00eda)\n    \/\/ needsMini: el usuario configura ubicaci\u00f3n mini (cubierta\/terreno mini)\n    const needsNewFV = ['solo_fv', 'mini_fv'].includes(tipoInstalacionActual);\n    const needsFVExistente = ['fv_ampliar_mini'].includes(tipoInstalacionActual);\n    const needsMini = ['solo_mini', 'fv_ampliar_mini', 'mini_fv'].includes(tipoInstalacionActual);\n\n    \/\/ === Campos comunes de consumo (aplican a todos) ===\n    stateV2.setLocationField('tipo_consumo', window.itemData.tipo_consumo || '');\n    stateV2.setLocationField('valor_consumo', window.itemData.valor_consumo || '');\n    stateV2.setLocationField('factura_pdf', window.itemData.factura_pdf || '');\n\n    \/\/ === FV existente: potencia, bater\u00eda y pol\u00edgono de referencia ===\n    if (needsFVExistente) {\n        stateV2.setLocationField('potencia_fv', window.itemData.potencia_fv || '');\n        stateV2.setLocationField('bateria', window.itemData.bateria || '');\n        stateV2.setLocationField('capacidad_bateria', window.itemData.capacidad_bateria || window.itemData.capacidad || '');\n    }\n\n    \/\/ === FV nueva: ubicacion_fv + campos cubierta_fv_* \/ terreno_fv_* ===\n    if (needsNewFV) {\n        stateV2.setLocationField('ubicacion_fv', window.itemData.ubicacion_fv || '');\n        stateV2.setLocationField('terreno_fv_acceso', window.itemData.terreno_fv_acceso || '');\n        stateV2.setLocationField('terreno_fv_futuras_obras', window.itemData.terreno_fv_futuras_obras || 'no');\n        stateV2.setLocationField('terreno_fv_obras_descripcion', window.itemData.terreno_fv_obras_descripcion || '');\n        stateV2.setLocationField('terreno_fv_comentarios', window.itemData.terreno_fv_comentarios || '');\n        stateV2.setLocationField('cubierta_fv_tipologia', window.itemData.cubierta_fv_tipologia || '');\n        stateV2.setLocationField('cubierta_fv_acceso', window.itemData.cubierta_fv_acceso || '');\n        stateV2.setLocationField('cubierta_fv_futuras_obras', window.itemData.cubierta_fv_futuras_obras || 'no');\n        stateV2.setLocationField('cubierta_fv_obras_descripcion', window.itemData.cubierta_fv_obras_descripcion || '');\n        stateV2.setLocationField('cubierta_fv_comentarios', window.itemData.cubierta_fv_comentarios || '');\n    }\n\n    \/\/ === Mini: ubicacion_mini + campos cubierta_mini_* \/ terreno_mini_* ===\n    if (needsMini) {\n        stateV2.setLocationField('ubicacion_mini', window.itemData.ubicacion_mini || '');\n        stateV2.setLocationField('terreno_mini_acceso', window.itemData.terreno_mini_acceso || '');\n        stateV2.setLocationField('terreno_mini_futuras_obras', window.itemData.terreno_mini_futuras_obras || 'no');\n        stateV2.setLocationField('terreno_mini_obras_descripcion', window.itemData.terreno_mini_obras_descripcion || '');\n        stateV2.setLocationField('terreno_mini_comentarios', window.itemData.terreno_mini_comentarios || '');\n        stateV2.setLocationField('cubierta_mini_tipologia', window.itemData.cubierta_mini_tipologia || '');\n        stateV2.setLocationField('cubierta_mini_acceso', window.itemData.cubierta_mini_acceso || '');\n        stateV2.setLocationField('cubierta_mini_futuras_obras', window.itemData.cubierta_mini_futuras_obras || 'no');\n        stateV2.setLocationField('cubierta_mini_obras_descripcion', window.itemData.cubierta_mini_obras_descripcion || '');\n        stateV2.setLocationField('cubierta_mini_comentarios', window.itemData.cubierta_mini_comentarios || '');\n    }\n\n    \/\/ === Legacy fields (compatibilidad) \u2014 solo en fv_ampliar_mini (\u00fanico tipo que los incluye en whitelist) ===\n    if (needsFVExistente) {\n        stateV2.setLocationField('terreno_uso', window.itemData.terreno_uso || '');\n        stateV2.setLocationField('terreno_acceso', window.itemData.terreno_acceso || '');\n        stateV2.setLocationField('terreno_futuras_obras', window.itemData.terreno_futuras_obras || 'no');\n        stateV2.setLocationField('terreno_obras_descripcion', window.itemData.terreno_obras_descripcion || '');\n        stateV2.setLocationField('terreno_comentarios', window.itemData.terreno_comentarios || '');\n        stateV2.setLocationField('cubierta_tipologia', window.itemData.cubierta_tipologia || '');\n        stateV2.setLocationField('cubierta_uso', window.itemData.cubierta_uso || '');\n        stateV2.setLocationField('cubierta_acceso', window.itemData.cubierta_acceso || '');\n        stateV2.setLocationField('cubierta_futuras_obras', window.itemData.cubierta_futuras_obras || 'no');\n        stateV2.setLocationField('cubierta_obras_descripcion', window.itemData.cubierta_obras_descripcion || '');\n        stateV2.setLocationField('cubierta_comentarios', window.itemData.cubierta_comentarios || '');\n    }\n\n    stateV2.setLocationField('completed_tabs', window.itemData.completedTabs || []);\n\n    \/\/ === GeoJSON: sync seg\u00fan dominio ===\n    \/\/ geojson_fv gen\u00e9rico: solo para fv_ampliar_mini (FV existente) \u2014 es el \u00fanico tipo que lo whitelist\n    if (needsFVExistente && window.itemData.geojson_fv) {\n        stateV2.setLocationField('geojson_fv', window.itemData.geojson_fv);\n    }\n    if (needsMini) {\n        if (window.itemData.geojson_mini_terreno) {\n            stateV2.setLocationField('geojson_mini_terreno', window.itemData.geojson_mini_terreno);\n        }\n        if (window.itemData.geojson_mini_cubierta) {\n            stateV2.setLocationField('geojson_mini_cubierta', window.itemData.geojson_mini_cubierta);\n        }\n    }\n    if (needsNewFV) {\n        if (window.itemData.geojson_fv_terreno) {\n            stateV2.setLocationField('geojson_fv_terreno', window.itemData.geojson_fv_terreno);\n        }\n        if (window.itemData.geojson_fv_cubierta) {\n            stateV2.setLocationField('geojson_fv_cubierta', window.itemData.geojson_fv_cubierta);\n        }\n    }\n\n    \/\/ === Pol\u00edgonos: sync seg\u00fan dominio ===\n    \/\/ poligonos_fv gen\u00e9rico: solo para fv_ampliar_mini (FV existente)\n    if (needsFVExistente) {\n        const polyFV = ensurePolygonArray(window.itemData.poligonos_fv || window.itemData.poligonos || window.itemData.geojson_fv || window.itemData.geojson);\n        stateV2.setPolygons('fv', polyFV);\n    }\n\n    if (needsNewFV) {\n        const polyFVTerreno = ensurePolygonArray(window.itemData.poligonos_fv_terreno || window.itemData.geojson_fv_terreno);\n        const polyFVCubierta = ensurePolygonArray(window.itemData.poligonos_fv_cubierta || window.itemData.geojson_fv_cubierta);\n        stateV2.setPolygons('fv_terreno', polyFVTerreno);\n        stateV2.setPolygons('fv_cubierta', polyFVCubierta);\n    }\n    if (needsMini) {\n        const polyTerr = ensurePolygonArray(window.itemData.poligonos_mini_terreno || window.itemData.geojson_mini_terreno);\n        const polyCub = ensurePolygonArray(window.itemData.poligonos_mini_cubierta || window.itemData.geojson_mini_cubierta);\n        stateV2.setPolygons('mini_terreno', polyTerr);\n        stateV2.setPolygons('mini_cubierta', polyCub);\n    }\n    \n    stateV2.saveCurrentLocation();\n    mostrarToast('\u2705 ' + (window.itemTexts?.ubicacion_guardada || 'Ubicaci\u00f3n guardada correctamente!'), 'success');\n    const numeroUbicaciones = stateV2.getFormData('numero_ubicaciones') || window.roseoNumeroUbicaciones || 'unica';\n    const isMultiple = numeroUbicaciones === 'multiples';\n    const nextStep = isMultiple ? 'step_3_hub' : 'step_4';\n    setTimeout(() => {\n        stateV2.syncToServer(function(response) {\n            stateV2.gotoStep(nextStep);\n        });\n    }, 500);\n}\nfunction validarCamposObligatorios() {\n    const tipo = window.itemData?.tipo_instalacion || window.roseoTipoInstalacion || '';\n    \n    \/\/ Detectar visibilidad real de componentes para evitar validar campos ocultos\n    const compFV = document.getElementById('componente-fotovoltaica');\n    const compFVVisible = compFV && compFV.style.display !== 'none' && !compFV.classList.contains('hidden');\n    \n    const compBateria = document.getElementById('tab-bateria-content'); \/\/ O el contenedor espec\u00edfico\n    \/\/ Validar potencia y pol\u00edgono FV solo si el componente FV (existente) es visible\n    if (compFVVisible) {\n        if (!window.itemData.potencia_fv) {\n            mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.potencia_obligatoria || 'La potencia fotovoltaica es obligatoria'), 'warning');\n            toggleTab('fv');\n            return false;\n        }\n        \/\/ \u2705 FIX: Validar que se haya marcado la ubicaci\u00f3n de la FV existente\n        if (!window.itemData.geojson_fv && (!window.itemData.poligonos_fv || window.itemData.poligonos_fv.length === 0)) {\n            mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.poligono_fv_requerido || 'Debes marcar la ubicaci\u00f3n de tu instalaci\u00f3n fotovoltaica existente'), 'warning');\n            toggleTab('fv');\n            return false;\n        }\n        if (!window.itemData.bateria) {\n            mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.baterias_requeridas || 'Debes indicar si tienes bater\u00edas'), 'warning');\n            toggleTab('bateria');\n            return false;\n        }\n        if (window.itemData.bateria === 'si' && !window.itemData.capacidad && !window.itemData.capacidad_bateria) {\n            mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.capacidad_obligatoria || 'La capacidad de bater\u00eda es obligatoria'), 'warning');\n            toggleTab('bateria');\n            return false;\n        }\n    }\n\n    \/\/ Validaciones comunes para FV (Consumo y Pol\u00edgonos de instalaci\u00f3n)\n    \/\/ Se aplican si estamos en cualquier flujo que requiera consumo\n    if (tipo === 'solo_fv' || tipo === 'fv_ampliar_mini' || tipo === 'mini_fv') {\n        const itemData = window.itemData || {};\n        \n        \/\/ Consumo es obligatorio para todos\n        if (!itemData.tipo_consumo) {\n            mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.consumo_obligatorio || 'Debes indicar tu tipo de consumo'), 'warning');\n            \/\/ Intentar abrir tab consumo si es posible\n            if (typeof abrirTabConsumo === 'function') abrirTabConsumo();\n            else if (typeof toggleTab === 'function') toggleTab('consumo');\n            return false;\n        }\n\n        if (window.itemData.tipo_consumo === 'valor' && !window.itemData.valor_consumo) {\n            mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.valor_obligatorio || 'El valor de consumo es obligatorio'), 'warning');\n            toggleTab('consumo');\n            return false;\n        }\n        if (window.itemData.tipo_consumo === 'factura' && !window.itemData.factura_pdf) {\n            mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.factura_obligatoria || 'Debes subir la factura'), 'warning');\n            toggleTab('consumo');\n            return false;\n        }\n    }\n    if (tipo === 'solo_mini' || tipo === 'mini_fv' || tipo === 'fv_ampliar_mini') {\n        if (!window.itemData.ubicacion_mini) {\n            mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.ubicacion_mini_obligatoria || 'Debes seleccionar d\u00f3nde instalar\u00e1s la minie\u00f3lica'), 'warning');\n            toggleTab('ubicacion');\n            return false;\n        }\n        if (window.itemData.ubicacion_mini !== 'no_se') {\n            if (window.itemData.ubicacion_mini === 'cubierta') {\n                if (!window.itemData.geojson_mini_cubierta) {\n                    mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.poligono_cubierta_requerido || 'Debes dibujar el pol\u00edgono de la cubierta'), 'warning');\n                    toggleTab('cubierta');\n                    return false;\n                }\n                if (!window.itemData.cubierta_mini_tipologia) {\n                    mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.tipologia_obligatoria || 'La tipolog\u00eda de cubierta es obligatoria'), 'warning');\n                    toggleTab('cubierta');\n                    return false;\n                }\n            } else if (window.itemData.ubicacion_mini === 'terreno') {\n                if (!window.itemData.geojson_mini_terreno) {\n                    mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.poligono_terreno_requerido || 'Debes dibujar el pol\u00edgono del terreno'), 'warning');\n                    toggleTab('terreno');\n                    return false;\n                }\n            } else if (window.itemData.ubicacion_mini === 'ambas') {\n                if (!window.itemData.geojson_mini_cubierta || !window.itemData.geojson_mini_terreno) {\n                    mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.poligonos_requeridos || 'Debes dibujar ambos pol\u00edgonos'), 'warning');\n                    if (!window.itemData.geojson_mini_terreno) toggleTab('terreno');\n                    else toggleTab('cubierta');\n                    return false;\n                }\n                if (!window.itemData.cubierta_mini_tipologia) {\n                    mostrarToast('\u26a0\ufe0f ' + (window.itemTexts?.tipologia_obligatoria || 'La tipolog\u00eda de cubierta es obligatoria'), 'warning');\n                    toggleTab('cubierta');\n                    return false;\n                }\n            }\n        }\n    }\n    \n    \/\/ Validaci\u00f3n de Instalaci\u00f3n FV (Nueva FV) - para solo_fv y mini_fv\n    if (tipo === 'solo_fv' || tipo === 'mini_fv') {\n        const itemData = window.itemData || {};\n        \n        \/\/ Si no se ha definido ubicaci\u00f3n FV, pedirla (aunque por defecto suele ser visible el selector)\n        if (!itemData.ubicacion_fv && !itemData.geojson_fv_cubierta && !itemData.geojson_fv_terreno) {\n             mostrarToast('\u26a0\ufe0f ' + (window.FV_TEXTS?.validacion?.poligono_requerido || 'Debes configurar la instalaci\u00f3n fotovoltaica'), 'warning');\n             if (typeof activarFVInstalacion === 'function') activarFVInstalacion();\n             else if (typeof toggleTab === 'function') toggleTab('ubicacion_fv');\n             return false;\n        }\n\n        \/\/ Validaci\u00f3n para ubicaci\u00f3n FV AMBAS\n        if (itemData.ubicacion_fv === 'ambas') {\n            if (!itemData.geojson_fv_cubierta || !itemData.geojson_fv_terreno) {\n                mostrarToast('\u26a0\ufe0f ' + (window.FV_TEXTS?.validacion?.poligono_requerido || 'Debes dibujar ambos pol\u00edgonos FV (cubierta y terreno)'), 'warning');\n                if (!itemData.geojson_fv_terreno) toggleTab('terreno_fv');\n                else toggleTab('cubierta_fv');\n                return false;\n            }\n            if (!itemData.cubierta_fv_tipologia) {\n                mostrarToast('\u26a0\ufe0f ' + (window.FV_TEXTS?.validacion?.tipologia_requerida || 'Tipolog\u00eda de cubierta FV requerida'), 'warning');\n                toggleTab('cubierta_fv');\n                return false;\n            }\n        }\n        \/\/ Validaci\u00f3n para ubicaci\u00f3n FV solo CUBIERTA\n        else if (itemData.ubicacion_fv === 'cubierta' || (!itemData.ubicacion_fv && itemData.geojson_fv_cubierta)) {\n             if (!itemData.geojson_fv_cubierta) {\n                 mostrarToast('\u26a0\ufe0f ' + (window.FV_TEXTS?.validacion?.poligono_requerido || 'Debes dibujar el pol\u00edgono FV de cubierta'), 'warning');\n                 if (typeof activarFVInstalacion === 'function') activarFVInstalacion();\n                 toggleTab('cubierta_fv'); \/\/ Asumiendo ID del tab\n                 return false;\n             }\n             if (!itemData.cubierta_fv_tipologia) {\n                 mostrarToast('\u26a0\ufe0f ' + (window.FV_TEXTS?.validacion?.tipologia_requerida || 'Tipolog\u00eda de cubierta FV requerida'), 'warning');\n                 if (typeof activarFVInstalacion === 'function') activarFVInstalacion();\n                 toggleTab('cubierta_fv');\n                 return false;\n             }\n        }\n        \/\/ Validaci\u00f3n para ubicaci\u00f3n FV solo TERRENO\n        else if (itemData.ubicacion_fv === 'terreno' || (!itemData.ubicacion_fv && itemData.geojson_fv_terreno)) {\n             if (!itemData.geojson_fv_terreno) {\n                 mostrarToast('\u26a0\ufe0f ' + (window.FV_TEXTS?.validacion?.poligono_requerido || 'Debes dibujar el pol\u00edgono FV de terreno'), 'warning');\n                 if (typeof activarFVInstalacion === 'function') activarFVInstalacion();\n                 toggleTab('terreno_fv');\n                 return false;\n             }\n        }\n        \/\/ Validaci\u00f3n para ubicaci\u00f3n FV \"no_se\" - no se requiere pol\u00edgono\n        \/\/ (usuario no sabe d\u00f3nde instalar\u00e1, solo necesita consumo)\n    }\n\n    return true;\n}\nwindow.limpiarFormularioItem = function() {\n    window.itemData = {\n        tipo_instalacion: window.roseoTipoInstalacion || '',\n        potencia_fv: '',\n        geojson: '',\n        geojson_fv: '',\n        poligonos: [],\n        poligonos_fv: [],\n        bateria: '',\n        capacidad: '',\n        tipo_consumo: '',\n        valor_consumo: '',\n        factura_pdf: '',\n        ubicacion_mini: '',\n        geojson_mini_cubierta: '',\n        geojson_mini_terreno: '',\n        cubierta_mini_tipologia: '',\n        cubierta_mini_acceso: '',\n        cubierta_mini_futuras_obras: 'no',\n        cubierta_mini_obras_descripcion: '',\n        cubierta_mini_comentarios: '',\n        terreno_mini_acceso: '',\n        terreno_mini_futuras_obras: 'no',\n        terreno_mini_obras_descripcion: '',\n        terreno_mini_comentarios: '',\n        completedTabs: []\n    };\n    const inputsToClean = [\n        'input-potencia-fv',\n        'input-capacidad-bateria',\n        'input-valor-consumo',\n        'input-mini-cubierta-tipologia',\n        'input-mini-cubierta-acceso',\n        'input-mini-cubierta-obras-descripcion',\n        'input-mini-cubierta-comentarios',\n        'input-mini-terreno-acceso',\n        'input-mini-terreno-obras-descripcion',\n        'input-mini-terreno-comentarios'\n    ];\n    inputsToClean.forEach(id => {\n        const el = document.getElementById(id);\n        if (el) {\n            el.value = '';\n        }\n    });\n    document.querySelectorAll('.item-card.selected').forEach(card => {\n        card.classList.remove('selected');\n    });\n    const camposAOcultar = [\n        'field-capacidad-bateria',\n        'field-valor-consumo', \n        'field-factura'\n    ];\n    camposAOcultar.forEach(id => {\n        const el = document.getElementById(id);\n        if (el) {\n            el.classList.remove('show');\n            el.classList.add('hidden');\n        }\n    });\n    const btnsToHide = ['btns-bateria', 'btns-consumo', 'btns-ubicacion-mini'];\n    btnsToHide.forEach(id => {\n        const el = document.getElementById(id);\n        if (el) el.style.display = 'none';\n    });\n    const tipoIns = window.itemData?.tipo_instalacion || '';\n    const esSoloMini = tipoIns === 'solo_mini';\n    const esSoloFV = tipoIns === 'solo_fv';\n    const esFVAmpliarMini = tipoIns === 'fv_ampliar_mini';\n    const esMiniFV = tipoIns === 'mini_fv';\n    document.querySelectorAll('.item-tab').forEach(tab => {\n        tab.classList.remove('completed', 'active', 'disabled');\n        const status = tab.querySelector('.item-tab-status');\n        if (status) status.textContent = window.itemTexts?.pendiente || 'Pendiente';\n    });\n    const compFV = document.getElementById('componente-fotovoltaica');\n    const compFVInstalacion = document.getElementById('componente-fv-instalacion');\n    const compMini = document.getElementById('componente-minieolica');\n    function configurarTabsLimpiar(comp, activarPrimero) {\n        if (!comp) return;\n        comp.querySelectorAll('.item-tab').forEach((tab, index) => {\n            if (activarPrimero && index === 0) {\n                tab.classList.add('active');\n            } else {\n                tab.classList.add('disabled');\n            }\n        });\n    }\n    const tabConsumoGeneral = document.getElementById('tab-consumo-general');\n    if (esSoloMini) {\n        if (tabConsumoGeneral) {\n            tabConsumoGeneral.classList.remove('disabled');\n            tabConsumoGeneral.classList.add('active');\n        }\n        configurarTabsLimpiar(compMini, false); \/\/ Disabled\n        configurarTabsLimpiar(compFV, false);\n        configurarTabsLimpiar(compFVInstalacion, false);\n    } else if (esSoloFV) {\n        if (tabConsumoGeneral) {\n            tabConsumoGeneral.classList.remove('disabled');\n            tabConsumoGeneral.classList.add('active');\n        }\n        configurarTabsLimpiar(compFVInstalacion, false); \/\/ Disabled\n        configurarTabsLimpiar(compMini, false);\n        configurarTabsLimpiar(compFV, false);\n    } else if (esFVAmpliarMini) {\n        configurarTabsLimpiar(compFV, true); \/\/ Primer tab activo\n        configurarTabsLimpiar(compMini, false);\n        configurarTabsLimpiar(compFVInstalacion, false);\n    } else if (esMiniFV) {\n        if (tabConsumoGeneral) {\n            tabConsumoGeneral.classList.remove('disabled');\n            tabConsumoGeneral.classList.add('active');\n        }\n        configurarTabsLimpiar(compFVInstalacion, false); \/\/ Disabled\n        configurarTabsLimpiar(compMini, false);\n        configurarTabsLimpiar(compFV, false);\n    }\n    document.querySelectorAll('.mapa-resumen-box').forEach(box => {\n        box.classList.remove('success');\n        box.style.display = 'none'; \/\/ Ocultar completamente\n        const lista = box.querySelector('.poligono-lista');\n        if (lista) lista.innerHTML = '';\n        const texto = box.querySelector('p');\n        if (texto) texto.textContent = window.itemTexts.sin_poligonos || 'No hay pol\u00edgonos dibujados';\n    });\n    document.querySelectorAll('[id^=\"resumen-\"]').forEach(resumen => {\n        resumen.style.display = 'none';\n        const areaTexto = resumen.querySelector('[id^=\"area-texto-\"]');\n        if (areaTexto) areaTexto.textContent = '0';\n    });\n    document.querySelectorAll('input[id^=\"input-mapa-\"]').forEach(input => {\n        input.value = '';\n    });\n    if (window.RoseoMapInstances) {\n        Object.keys(window.RoseoMapInstances).forEach(mapId => {\n            const mapInstance = window.RoseoMapInstances[mapId];\n            if (mapInstance && typeof mapInstance.clearAll === 'function') {\n                mapInstance.clearAll();\n            }\n        });\n    }\n    if (window.RoseoStateV2) {\n        const tipoActual = window.RoseoStateV2.getFormData('tipo_instalacion') || '';\n        window.RoseoStateV2.startNewLocation(tipoActual);\n    }\n};\nwindow.restaurarDatosEnFormulario = function() {\n    if (window.RoseoStateV2) {\n        const state = window.RoseoStateV2.getState();\n        const editingIndex = state.editing_index;\n        const currentLocation = state.current_location;\n        const esNuevaUbicacion = editingIndex === null;\n        const tieneDatosReales = currentLocation && (\n            currentLocation.potencia_fv ||\n            currentLocation.bateria ||\n            currentLocation.tipo_consumo ||\n            currentLocation.ubicacion_mini ||\n            (currentLocation.poligonos_fv && currentLocation.poligonos_fv.length > 0) ||\n            (currentLocation.poligonos_fv_terreno && currentLocation.poligonos_fv_terreno.length > 0) ||\n            (currentLocation.poligonos_fv_cubierta && currentLocation.poligonos_fv_cubierta.length > 0) ||\n            (currentLocation.poligonos_mini_terreno && currentLocation.poligonos_mini_terreno.length > 0) ||\n            (currentLocation.poligonos_mini_cubierta && currentLocation.poligonos_mini_cubierta.length > 0)\n        );\n        if (esNuevaUbicacion && !tieneDatosReales) {\n            window.limpiarFormularioItem();\n            return;\n        }\n        if (currentLocation) {\n            if (currentLocation.potencia_fv) {\n                const input = document.getElementById('input-potencia-fv');\n                if (input) {\n                    input.value = currentLocation.potencia_fv;\n                    window.itemData.potencia_fv = currentLocation.potencia_fv;\n                }\n            }\n            if (currentLocation.bateria) {\n                window.itemData.bateria = currentLocation.bateria;\n                const card = document.querySelector('#tab-bateria-content .item-card[data-value=\"' + currentLocation.bateria + '\"]');\n                if (card) {\n                    card.classList.add('selected');\n                    if (currentLocation.bateria === 'si') {\n                        const fieldCap = document.getElementById('field-capacidad-bateria');\n                        if (fieldCap) fieldCap.classList.add('show');\n                        if (currentLocation.capacidad_bateria) {\n                            const inputCap = document.getElementById('input-capacidad-bateria');\n                            if (inputCap) {\n                                inputCap.value = currentLocation.capacidad_bateria;\n                                window.itemData.capacidad = currentLocation.capacidad_bateria;\n                                window.itemData.capacidad_bateria = currentLocation.capacidad_bateria;\n                            }\n                        }\n                    }\n                    const btns = document.getElementById('btns-bateria');\n                    if (btns) btns.style.display = 'flex';\n                }\n            }\n            if (currentLocation.tipo_consumo) {\n                window.itemData.tipo_consumo = currentLocation.tipo_consumo;\n                const card = document.querySelector('#tab-consumo-content .item-card[data-value=\"' + currentLocation.tipo_consumo + '\"]');\n                if (card) {\n                    card.classList.add('selected');\n                    if (currentLocation.tipo_consumo === 'factura') {\n                        const fieldFactura = document.getElementById('field-factura');\n                        if (fieldFactura) fieldFactura.classList.add('show');\n                    } else if (currentLocation.tipo_consumo !== 'no_se') {\n                        const fieldValor = document.getElementById('field-valor-consumo');\n                        if (fieldValor) fieldValor.classList.add('show');\n                        if (currentLocation.valor_consumo) {\n                            const inputValor = document.getElementById('input-valor-consumo');\n                            if (inputValor) {\n                                inputValor.value = currentLocation.valor_consumo;\n                                window.itemData.valor_consumo = currentLocation.valor_consumo;\n                            }\n                        }\n                    }\n                    const btns = document.getElementById('btns-consumo');\n                    if (btns) btns.style.display = 'flex';\n                }\n            }\n            if (currentLocation.ubicacion_mini) {\n                window.itemData.ubicacion_mini = currentLocation.ubicacion_mini;\n            }\n            if (currentLocation.cubierta_mini_tipologia) {\n                const select = document.getElementById('input-mini-cubierta-tipologia');\n                if (select) select.value = currentLocation.cubierta_mini_tipologia;\n                window.itemData.cubierta_mini_tipologia = currentLocation.cubierta_mini_tipologia;\n            }\n            if (currentLocation.cubierta_mini_acceso) {\n                const select = document.getElementById('input-mini-cubierta-acceso');\n                if (select) select.value = currentLocation.cubierta_mini_acceso;\n                window.itemData.cubierta_mini_acceso = currentLocation.cubierta_mini_acceso;\n            }\n            if (currentLocation.cubierta_mini_futuras_obras) {\n                const radio = document.querySelector(`input[name=\"mini_cubierta_futuras_obras\"][value=\"${currentLocation.cubierta_mini_futuras_obras}\"]`);\n                if (radio) { \n                    radio.checked = true;\n                    \/\/ Trigger change event to show\/hide details\n                    if (typeof toggleFuturasObrasCubierta === 'function') toggleFuturasObrasCubierta(currentLocation.cubierta_mini_futuras_obras === 'si');\n                }\n                window.itemData.cubierta_mini_futuras_obras = currentLocation.cubierta_mini_futuras_obras;\n            }\n            if (currentLocation.cubierta_mini_obras_descripcion) {\n                const textarea = document.getElementById('input-mini-cubierta-obras-descripcion');\n                if (textarea) textarea.value = currentLocation.cubierta_mini_obras_descripcion;\n                window.itemData.cubierta_mini_obras_descripcion = currentLocation.cubierta_mini_obras_descripcion;\n            }\n            if (currentLocation.cubierta_mini_comentarios) {\n                const textarea = document.getElementById('input-mini-cubierta-comentarios');\n                if (textarea) textarea.value = currentLocation.cubierta_mini_comentarios;\n                window.itemData.cubierta_mini_comentarios = currentLocation.cubierta_mini_comentarios;\n            }\n            if (currentLocation.terreno_mini_acceso) {\n                const select = document.getElementById('input-mini-terreno-acceso');\n                if (select) select.value = currentLocation.terreno_mini_acceso;\n                window.itemData.terreno_mini_acceso = currentLocation.terreno_mini_acceso;\n            }\n            if (currentLocation.terreno_mini_futuras_obras) {\n                 const radio = document.querySelector(`input[name=\"mini_terreno_futuras_obras\"][value=\"${currentLocation.terreno_mini_futuras_obras}\"]`);\n                if (radio) { \n                    radio.checked = true;\n                    if (typeof toggleFuturasObrasTerreno === 'function') toggleFuturasObrasTerreno(currentLocation.terreno_mini_futuras_obras === 'si');\n                }\n                window.itemData.terreno_mini_futuras_obras = currentLocation.terreno_mini_futuras_obras;\n            }\n            if (currentLocation.terreno_mini_obras_descripcion) {\n                const textarea = document.getElementById('input-mini-terreno-obras-descripcion');\n                if (textarea) textarea.value = currentLocation.terreno_mini_obras_descripcion;\n                window.itemData.terreno_mini_obras_descripcion = currentLocation.terreno_mini_obras_descripcion;\n            }\n            if (currentLocation.terreno_mini_comentarios) {\n                const textarea = document.getElementById('input-mini-terreno-comentarios');\n                if (textarea) textarea.value = currentLocation.terreno_mini_comentarios;\n                window.itemData.terreno_mini_comentarios = currentLocation.terreno_mini_comentarios;\n            }\n            \/\/ \u2705 FIX: Restaurar campos FV espec\u00edficos (terreno_fv_* y cubierta_fv_*)\n            if (currentLocation.terreno_fv_acceso) {\n                const sel = document.getElementById('select-terreno-fv-acceso');\n                if (sel) sel.value = currentLocation.terreno_fv_acceso;\n                window.itemData.terreno_fv_acceso = currentLocation.terreno_fv_acceso;\n            }\n            if (currentLocation.terreno_fv_futuras_obras) {\n                window.itemData.terreno_fv_futuras_obras = currentLocation.terreno_fv_futuras_obras;\n            }\n            if (currentLocation.terreno_fv_obras_descripcion) {\n                const textarea = document.getElementById('textarea-terreno-fv-obras-descripcion');\n                if (textarea) textarea.value = currentLocation.terreno_fv_obras_descripcion;\n                window.itemData.terreno_fv_obras_descripcion = currentLocation.terreno_fv_obras_descripcion;\n            }\n            if (currentLocation.terreno_fv_comentarios) {\n                const textarea = document.getElementById('textarea-terreno-fv-comentarios');\n                if (textarea) textarea.value = currentLocation.terreno_fv_comentarios;\n                window.itemData.terreno_fv_comentarios = currentLocation.terreno_fv_comentarios;\n            }\n            if (currentLocation.cubierta_fv_tipologia) {\n                const sel = document.getElementById('select-cubierta-fv-tipologia');\n                if (sel) sel.value = currentLocation.cubierta_fv_tipologia;\n                window.itemData.cubierta_fv_tipologia = currentLocation.cubierta_fv_tipologia;\n            }\n            if (currentLocation.cubierta_fv_acceso) {\n                const sel = document.getElementById('select-cubierta-fv-acceso');\n                if (sel) sel.value = currentLocation.cubierta_fv_acceso;\n                window.itemData.cubierta_fv_acceso = currentLocation.cubierta_fv_acceso;\n            }\n            if (currentLocation.cubierta_fv_futuras_obras) {\n                window.itemData.cubierta_fv_futuras_obras = currentLocation.cubierta_fv_futuras_obras;\n            }\n            if (currentLocation.cubierta_fv_obras_descripcion) {\n                const textarea = document.getElementById('textarea-cubierta-fv-obras-descripcion');\n                if (textarea) textarea.value = currentLocation.cubierta_fv_obras_descripcion;\n                window.itemData.cubierta_fv_obras_descripcion = currentLocation.cubierta_fv_obras_descripcion;\n            }\n            if (currentLocation.cubierta_fv_comentarios) {\n                const textarea = document.getElementById('textarea-cubierta-fv-comentarios');\n                if (textarea) textarea.value = currentLocation.cubierta_fv_comentarios;\n                window.itemData.cubierta_fv_comentarios = currentLocation.cubierta_fv_comentarios;\n            }\n            if (currentLocation.poligonos_fv && currentLocation.poligonos_fv.length > 0) {\n                window.itemData.poligonos_fv = currentLocation.poligonos_fv;\n                const firstPoly = currentLocation.poligonos_fv[0];\n                if (firstPoly) {\n                    window.itemData.geojson_fv = typeof firstPoly === 'string' ? firstPoly : JSON.stringify(firstPoly);\n                }\n            }\n            if (currentLocation.poligonos_mini_terreno && currentLocation.poligonos_mini_terreno.length > 0) {\n                window.itemData.poligonos_mini_terreno = currentLocation.poligonos_mini_terreno;\n                const firstPoly = currentLocation.poligonos_mini_terreno[0];\n                if (firstPoly) {\n                    window.itemData.geojson_mini_terreno = typeof firstPoly === 'string' ? firstPoly : JSON.stringify(firstPoly);\n                }\n            }\n            if (currentLocation.poligonos_mini_cubierta && currentLocation.poligonos_mini_cubierta.length > 0) {\n                window.itemData.poligonos_mini_cubierta = currentLocation.poligonos_mini_cubierta;\n                const firstPoly = currentLocation.poligonos_mini_cubierta[0];\n                if (firstPoly) {\n                    window.itemData.geojson_mini_cubierta = typeof firstPoly === 'string' ? firstPoly : JSON.stringify(firstPoly);\n                }\n            }\n            if (currentLocation.geojson_fv && !window.itemData.geojson_fv) {\n                window.itemData.geojson_fv = currentLocation.geojson_fv;\n            }\n            if (currentLocation.geojson_mini_terreno && !window.itemData.geojson_mini_terreno) {\n                window.itemData.geojson_mini_terreno = currentLocation.geojson_mini_terreno;\n            }\n            if (currentLocation.geojson_mini_cubierta && !window.itemData.geojson_mini_cubierta) {\n                window.itemData.geojson_mini_cubierta = currentLocation.geojson_mini_cubierta;\n            }\n            if (currentLocation.completed_tabs && currentLocation.completed_tabs.length > 0) {\n                currentLocation.completed_tabs.forEach(tabId => {\n                    habilitarTab(tabId);\n                    marcarCompletado(tabId);\n                });\n                var ordenTabs = ['tab-consumo-general', 'tab-fv', 'tab-bateria', 'tab-consumo', 'tab-autoconsumo', \n                                 'tab-instalacion-fv', 'tab-ubicacion-mini', 'tab-cubierta', 'tab-terreno'];\n                var siguienteTabActivo = null;\n                var ultimoTabCompletado = null;\n                for (var i = 0; i < ordenTabs.length; i++) {\n                    var tabId = ordenTabs[i];\n                    var tabElement = document.getElementById(tabId);\n                    if (tabElement && tabElement.offsetParent !== null) { \/\/ Visible\n                        if (tabElement.classList.contains('completed')) {\n                            ultimoTabCompletado = tabElement;\n                        }\n                        if (!tabElement.classList.contains('completed') && !tabElement.classList.contains('disabled')) {\n                            siguienteTabActivo = tabElement;\n                            break;\n                        }\n                    }\n                }\n                var tabParaActivar = siguienteTabActivo || ultimoTabCompletado;\n                if (tabParaActivar) {\n                    document.querySelectorAll('.item-tab.active').forEach(t => t.classList.remove('active'));\n                    document.querySelectorAll('.item-tab-content.active').forEach(c => c.classList.remove('active'));\n                    tabParaActivar.classList.add('active');\n                    var contentId = tabParaActivar.id + '-content';\n                    var contentEl = document.getElementById(contentId);\n                    if (contentEl) {\n                        contentEl.classList.add('active');\n                    }\n                }\n            }\n        }\n        return;\n    }\n    if (window.RoseoStateManager && window.RoseoStateManager.state.form_data) {\n        const savedData = window.RoseoStateManager.state.form_data;\n        const hayDatosGuardados = savedData.item_potencia_fv || savedData.item_bateria || savedData.item_tipo_consumo;\n        if (hayDatosGuardados) {\n            ['fv', 'bateria', 'consumo', 'autoconsumo'].forEach(tabId => {\n                const tab = document.getElementById('tab-' + tabId);\n                if (tab) {\n                    habilitarTab(tabId);\n                    marcarCompletado(tabId);\n                }\n            });\n            ['cubierta', 'terreno'].forEach(tabId => {\n                const tab = document.getElementById('tab-' + tabId);\n                if (tab) {\n                    habilitarTab(tabId);\n                    marcarCompletado(tabId);\n                }\n            });\n        }\n        if (savedData.item_potencia_fv) {\n            const input = document.getElementById('input-potencia-fv');\n            if (input) {\n                input.value = savedData.item_potencia_fv;\n                window.itemData.potencia_fv = savedData.item_potencia_fv;\n            }\n        }\n    if (savedData.item_bateria) {\n        window.itemData.bateria = savedData.item_bateria;\n        const card = document.querySelector('#tab-bateria-content .item-card[data-value=\"' + savedData.item_bateria + '\"]');\n        if (card) {\n            card.classList.add('selected');\n            if (savedData.item_bateria === 'si') {\n                const fieldCap = document.getElementById('field-capacidad-bateria');\n                if (fieldCap) fieldCap.classList.add('show');\n                document.getElementById('btns-bateria').style.display = 'flex';\n                if (savedData.item_capacidad_bateria) {\n                    const inputCap = document.getElementById('input-capacidad-bateria');\n                    if (inputCap) {\n                        inputCap.value = savedData.item_capacidad_bateria;\n                        window.itemData.capacidad = savedData.item_capacidad_bateria;\n                        window.itemData.capacidad_bateria = savedData.item_capacidad_bateria;\n                    }\n                }\n            } else {\n                document.getElementById('btns-bateria').style.display = 'flex';\n            }\n        }\n    }\n    if (savedData.item_tipo_consumo) {\n        window.itemData.tipo_consumo = savedData.item_tipo_consumo;\n        const card = document.querySelector('#tab-consumo-content .item-card[data-value=\"' + savedData.item_tipo_consumo + '\"]');\n        if (card) {\n            card.classList.add('selected');\n            if (savedData.item_tipo_consumo === 'factura') {\n                const fieldFactura = document.getElementById('field-factura');\n                if (fieldFactura) fieldFactura.classList.add('show');\n                document.getElementById('btns-consumo').style.display = 'flex';\n            } else if (savedData.item_tipo_consumo !== 'no_se') {\n                const fieldValor = document.getElementById('field-valor-consumo');\n                if (fieldValor) fieldValor.classList.add('show');\n                document.getElementById('btns-consumo').style.display = 'flex';\n                if (savedData.item_valor_consumo) {\n                    const inputValor = document.getElementById('input-valor-consumo');\n                    if (inputValor) {\n                        inputValor.value = savedData.item_valor_consumo;\n                        window.itemData.valor_consumo = savedData.item_valor_consumo;\n                    }\n                }\n            } else {\n                document.getElementById('btns-consumo').style.display = 'flex';\n            }\n        }\n    }\n    if (savedData.item_ubicacion_mini) {\n        window.itemData.ubicacion_mini = savedData.item_ubicacion_mini;\n        const card = document.querySelector('#tab-5 .item-card[data-value=\"' + savedData.item_ubicacion_mini + '\"]');\n        if (card) {\n            card.classList.add('selected');\n            document.getElementById('btns-ubicacion-mini').style.display = 'flex';\n        }\n    }\n    if (savedData.ubicacion_geojson) {\n        window.itemData.geojson = savedData.ubicacion_geojson;\n        \/\/ \u2705 FIX: Solo asignar a geojson_fv si el tipo de instalaci\u00f3n incluye FV\n        \/\/ (no asignar para solo_mini porque eso causa auto-correcci\u00f3n incorrecta a mini_fv)\n        const tipoActual = window.itemData.tipo_instalacion || window.roseoTipoInstalacion || '';\n        if (tipoActual !== 'solo_mini') {\n            window.itemData.geojson_fv = savedData.ubicacion_geojson;\n        }\n    }\n    if (savedData.mini_cubierta_geojson) {\n        window.itemData.geojson_mini_cubierta = savedData.mini_cubierta_geojson;\n    }\n    if (savedData.mini_terreno_geojson) {\n        window.itemData.geojson_mini_terreno = savedData.mini_terreno_geojson;\n    }\n    if (savedData.cubierta_tipologia) {\n        const select = document.getElementById('input-cubierta-tipologia');\n        if (select) {\n            select.value = savedData.cubierta_tipologia;\n            window.itemData.cubierta_tipologia = savedData.cubierta_tipologia;\n        }\n    }\n    if (savedData.cubierta_acceso) {\n        const select = document.getElementById('input-cubierta-acceso');\n        if (select) {\n            select.value = savedData.cubierta_acceso;\n            window.itemData.cubierta_acceso = savedData.cubierta_acceso;\n        }\n    }\n    if (savedData.cubierta_futuras_obras === 'si') {\n        const radio = document.querySelector('input[name=\"cubierta_futuras_obras\"][value=\"si\"]');\n        if (radio) radio.checked = true;\n        const detalle = document.getElementById('cubierta-futuras-obras-detalle');\n        if (detalle) detalle.style.display = 'block';\n        window.itemData.cubierta_futuras_obras = 'si';\n    }\n    if (savedData.cubierta_obras_descripcion) {\n        const textarea = document.getElementById('input-cubierta-obras-descripcion');\n        if (textarea) {\n            textarea.value = savedData.cubierta_obras_descripcion;\n            window.itemData.cubierta_obras_descripcion = savedData.cubierta_obras_descripcion;\n        }\n    }\n    if (savedData.cubierta_comentarios) {\n        const textarea = document.getElementById('input-cubierta-comentarios');\n        if (textarea) {\n            textarea.value = savedData.cubierta_comentarios;\n            window.itemData.cubierta_comentarios = savedData.cubierta_comentarios;\n        }\n    }\n    if (savedData.terreno_acceso) {\n        const select = document.getElementById('input-terreno-acceso');\n        if (select) {\n            select.value = savedData.terreno_acceso;\n            window.itemData.terreno_acceso = savedData.terreno_acceso;\n        }\n    }\n    if (savedData.terreno_futuras_obras === 'si') {\n        const radio = document.querySelector('input[name=\"terreno_futuras_obras\"][value=\"si\"]');\n        if (radio) radio.checked = true;\n        const detalle = document.getElementById('terreno-futuras-obras-detalle');\n        if (detalle) detalle.style.display = 'block';\n        window.itemData.terreno_futuras_obras = 'si';\n    }\n    if (savedData.terreno_obras_descripcion) {\n        const textarea = document.getElementById('input-terreno-obras-descripcion');\n        if (textarea) {\n            textarea.value = savedData.terreno_obras_descripcion;\n            window.itemData.terreno_obras_descripcion = savedData.terreno_obras_descripcion;\n        }\n    }\n    if (savedData.terreno_comentarios) {\n        const textarea = document.getElementById('input-terreno-comentarios');\n        if (textarea) {\n            textarea.value = savedData.terreno_comentarios;\n            window.itemData.terreno_comentarios = savedData.terreno_comentarios;\n        }\n    }\n    } \/\/ Cerrar if (window.RoseoStateManager && window.RoseoStateManager.state.form_data)\n};\nsetTimeout(window.restaurarDatosEnFormulario, 1500);\nif (typeof jQuery !== 'undefined') {\n    jQuery(document).on('roseo:step-changed', function(e, detail) {\n        if (detail && detail.current_state === 'step_3_item') {\n            const stepElement = document.getElementById('step-3-item');\n            if (stepElement && (stepElement.style.display !== 'none' || stepElement.classList.contains('active'))) {\n                if (typeof window.restaurarDatosEnFormulario === 'function') {\n                    setTimeout(window.restaurarDatosEnFormulario, 200);\n                }\n            }\n        }\n    });\n}\n(function() {\n    function checkTipoInstalacion() {\n        if (!window.RoseoStateV2) {\n            setTimeout(checkTipoInstalacion, 200);\n            return;\n        }\n        if (window.RoseoStateV2.onReady) {\n            window.RoseoStateV2.onReady(verificarYRedirigir);\n        } else {\n            verificarYRedirigir();\n        }\n    }\n    function verificarYRedirigir() {\n        const currentStep = window.RoseoStateV2.getState().current_step;\n        if (currentStep !== 'step_3_item') return;\n        const currentLocation = window.RoseoStateV2.getCurrentLocation();\n        const tipoInstalacion = currentLocation?.tipo_instalacion || window.RoseoStateV2.getFormData('tipo_instalacion');\n        if (!tipoInstalacion) {\n            window.RoseoStateV2.gotoStep('step_3');\n        } else {\n            if (!currentLocation?.tipo_instalacion) {\n                window.RoseoStateV2.startNewLocation(tipoInstalacion);\n            }\n        }\n    }\n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', function() {\n            setTimeout(checkTipoInstalacion, 500);\n        });\n    } else {\n        setTimeout(checkTipoInstalacion, 500);\n    }\n})();\n<\/script>\n    <\/div>\n    \n    <!-- STEP 3 MUNICIPAL: Buscador de municipio (solo Ayuntamiento) -->\n    <div id=\"step-3-municipal\" class=\"roseo-step\" data-state=\"step_3_municipal\" style=\"display:none !important;\">\n        <div class=\"roseo-step-content\" id=\"step-3-municipal-content\">\n    <div class=\"roseo-step-header\">\n        <h2 class=\"roseo-step-title\">\n            <i class=\"fas fa-city\"><\/i>\n            Select your municipality        <\/h2>\n        <p class=\"roseo-step-subtitle\">\n            Municipal-level Renewable Energy study        <\/p>\n        <p class=\"roseo-step-description\">\n            Find your municipality in the search bar to start the energy analysis        <\/p>\n    <\/div>\n    <div class=\"municipal-search-container\">\n        <div class=\"municipal-search-wrapper\">\n            <input type=\"text\" \n                   id=\"municipal-search-input\" \n                   class=\"municipal-search-input\" \n                   placeholder=\"Type the municipality name...\"\n                   autocomplete=\"off\">\n            <i class=\"fas fa-search municipal-search-icon\"><\/i>\n            <button type=\"button\" id=\"municipal-clear-btn\" class=\"municipal-clear-btn\" style=\"display: none;\">\n                <i class=\"fas fa-times\"><\/i>\n            <\/button>\n        <\/div>\n        <div id=\"municipal-results-dropdown\" class=\"municipal-results-dropdown\" style=\"display: none;\"><\/div>\n    <\/div>\n    <div id=\"municipal-selected-container\" class=\"municipal-selected-container\" style=\"display: none;\">\n        <div class=\"municipal-selected-header\">\n            <i class=\"fas fa-check-circle\"><\/i>\n            <span>Selected municipality:<\/span>\n        <\/div>\n        <div id=\"municipal-selected-card\" class=\"municipal-selected-card\"><\/div>\n    <\/div>\n<\/div>\n<script>\n(function() {\n    'use strict';\n    const MUNICIPAL_NO_RESULTS = 'No municipalities found';\n    let municipiosData = [];\n    let selectedMunicipio = null;\n    async function loadMunicipios() {\n        try {\n            const jsonUrl = 'https:\/\/roseo.es\/wp-content\/plugins\/roseo-form-plugin\/json\/NAMEUNITS_MUNICIPAL.json';\n            const response = await fetch(jsonUrl);\n            municipiosData = await response.json();\n        } catch (error) {\n        }\n    }\n    function searchMunicipios(query) {\n        if (!query || query.length < 2) return [];\n        const normalizedQuery = query.toLowerCase().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\");\n        return municipiosData.filter(m => {\n            const normalizedName = m.nameunit.toLowerCase().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\");\n            return normalizedName.includes(normalizedQuery);\n        }).slice(0, 15);\n    }\n    function showResults(results) {\n        const dropdown = document.getElementById('municipal-results-dropdown');\n        if (results.length === 0) {\n            dropdown.innerHTML = '<div class=\"municipal-no-results\"><i class=\"fas fa-search\"><\/i>' + MUNICIPAL_NO_RESULTS + '<\/div>';\n            dropdown.style.display = 'block';\n            return;\n        }\n        dropdown.innerHTML = results.map(m => \n            '<div class=\"municipal-result-item\" data-id=\"' + m.inspire_id + '\" data-name=\"' + m.nameunit + '\">' +\n            '<i class=\"fas fa-map-marker-alt\"><\/i>' +\n            '<span class=\"name\">' + m.nameunit + '<\/span>' +\n            '<\/div>'\n        ).join('');\n        dropdown.style.display = 'block';\n        dropdown.querySelectorAll('.municipal-result-item').forEach(item => {\n            item.addEventListener('click', function() {\n                selectMunicipio(this.dataset.id, this.dataset.name);\n            });\n        });\n    }\n    function selectMunicipio(id, name) {\n        selectedMunicipio = { id: id, nombre: name };\n        document.getElementById('municipal-results-dropdown').style.display = 'none';\n        document.getElementById('municipal-search-input').value = '';\n        document.getElementById('municipal-clear-btn').style.display = 'none';\n        const container = document.getElementById('municipal-selected-container');\n        const card = document.getElementById('municipal-selected-card');\n        card.innerHTML = \n            '<div class=\"municipal-selected-info\">' +\n            '<div class=\"municipal-selected-icon\"><i class=\"fas fa-city\"><\/i><\/div>' +\n            '<div class=\"municipal-selected-details\"><h4>' + name + '<\/h4><\/div>' +\n            '<\/div>' +\n            '<button type=\"button\" class=\"municipal-remove-btn\" onclick=\"window.removeMunicipio()\">' +\n            '<i class=\"fas fa-trash-alt\"><\/i><\/button>';\n        container.style.display = 'block';\n        if (window.RoseoStateV2) {\n            window.RoseoStateV2.setFormData('municipio_id', id);\n            window.RoseoStateV2.setFormData('municipio_nombre', name);\n            window.RoseoStateV2.setFormData('municipio', { id: id, nombre: name });\n            if (window.RoseoAnalytics && typeof window.RoseoAnalytics.trackFormField === 'function') {\n                window.RoseoAnalytics.trackFormField('municipio_id', id);\n                window.RoseoAnalytics.trackFormField('municipio_nombre', name);\n            } else if (window.RoseoAnalytics && typeof window.RoseoAnalytics.trackEvent === 'function') {\n                window.RoseoAnalytics.trackEvent('form_data', {\n                    field_name: 'municipio_id',\n                    field_value: id,\n                    step: 'step_3_municipal'\n                });\n                window.RoseoAnalytics.trackEvent('form_data', {\n                    field_name: 'municipio_nombre',\n                    field_value: name,\n                    step: 'step_3_municipal'\n                });\n            }\n        }\n        updateNextButton();\n    }\n    window.removeMunicipio = function() {\n        selectedMunicipio = null;\n        document.getElementById('municipal-selected-container').style.display = 'none';\n        if (window.RoseoStateV2) {\n            window.RoseoStateV2.setFormData('municipio_id', '');\n            window.RoseoStateV2.setFormData('municipio_nombre', '');\n            window.RoseoStateV2.setFormData('municipio', null);\n        }\n        document.getElementById('municipal-search-input').focus();\n        updateNextButton();\n    };\n    function updateNextButton() {\n        const btnNext = document.getElementById('btn-next-step');\n        if (btnNext) {\n            if (selectedMunicipio) {\n                btnNext.disabled = false;\n                btnNext.classList.remove('disabled');\n            } else {\n                btnNext.disabled = true;\n                btnNext.classList.add('disabled');\n            }\n        }\n    }\n    document.addEventListener('DOMContentLoaded', function() {\n        loadMunicipios();\n        const searchInput = document.getElementById('municipal-search-input');\n        const clearBtn = document.getElementById('municipal-clear-btn');\n        const dropdown = document.getElementById('municipal-results-dropdown');\n        if (!searchInput) return;\n        let debounceTimer;\n        searchInput.addEventListener('input', function() {\n            const value = this.value.trim();\n            clearBtn.style.display = value ? 'block' : 'none';\n            clearTimeout(debounceTimer);\n            debounceTimer = setTimeout(function() {\n                if (value.length >= 2) {\n                    const results = searchMunicipios(value);\n                    showResults(results);\n                } else {\n                    dropdown.style.display = 'none';\n                }\n            }, 200);\n        });\n        clearBtn.addEventListener('click', function() {\n            searchInput.value = '';\n            clearBtn.style.display = 'none';\n            dropdown.style.display = 'none';\n            searchInput.focus();\n        });\n        document.addEventListener('click', function(e) {\n            if (!e.target.closest('.municipal-search-container')) {\n                dropdown.style.display = 'none';\n            }\n        });\n        function restoreMunicipio() {\n            if (window.RoseoStateV2 && window.RoseoStateV2.isReady()) {\n                const state = window.RoseoStateV2.getState();\n                const municipio = state.form && state.form.municipio;\n                if (municipio && municipio.id && municipio.nombre) {\n                    selectMunicipio(municipio.id, municipio.nombre);\n                }\n            } else if (window.RoseoStateV2) {\n                window.RoseoStateV2.onReady(function() {\n                    const state = window.RoseoStateV2.getState();\n                    const municipio = state.form && state.form.municipio;\n                    if (municipio && municipio.id && municipio.nombre) {\n                        selectMunicipio(municipio.id, municipio.nombre);\n                    }\n                });\n            }\n        }\n        restoreMunicipio();\n        setTimeout(restoreMunicipio, 500);\n        updateNextButton();\n    });\n})();\n<\/script>\n    <\/div>\n    \n    <!-- STEP 3 SUPRAMUNICIPAL: Buscador m\u00faltiple de municipios (Mancomunidad\/Otro) -->\n    <div id=\"step-3-supramunicipal\" class=\"roseo-step\" data-state=\"step_3_supramunicipal\" style=\"display:none !important;\">\n        <div class=\"roseo-step-content\" id=\"step-3-supramunicipal\">\n    <div class=\"roseo-step-header\">\n        <h2 class=\"roseo-step-title\">\n            <i class=\"fas fa-layer-group\"><\/i>\n            Select your municipalities        <\/h2>\n        <p class=\"roseo-step-subtitle\">\n            Supra-municipal study - Renewable Energy        <\/p>\n    <\/div>\n    <div class=\"supramunicipal-intro\">\n        <p class=\"supramunicipal-description\">Add municipalities to the commonwealth study using the search bar<\/p>\n        <div class=\"supramunicipal-hint\">\n            <i class=\"fas fa-info-circle\"><\/i>\n            <span>Select at least 2 municipalities<\/span>\n        <\/div>\n    <\/div>\n    <div class=\"supramunicipal-search-container\">\n        <div class=\"supramunicipal-search-wrapper\">\n            <input type=\"text\" \n                   id=\"supramunicipal-search-input\" \n                   class=\"supramunicipal-search-input\"\n                   placeholder=\"Type the municipality name...\"\n                   autocomplete=\"off\">\n            <i class=\"fas fa-search supramunicipal-search-icon\"><\/i>\n            <button type=\"button\" id=\"supramunicipal-clear-btn\" class=\"supramunicipal-clear-btn\" style=\"display:none;\">\n                <i class=\"fas fa-times\"><\/i>\n            <\/button>\n        <\/div>\n        <div id=\"supramunicipal-results-dropdown\" class=\"supramunicipal-results-dropdown\" style=\"display:none;\"><\/div>\n    <\/div>\n    <div id=\"supramunicipal-selected-container\" class=\"supramunicipal-selected-container\" style=\"display:none;\">\n        <div class=\"supramunicipal-selected-header\">\n            <i class=\"fas fa-check-circle\"><\/i>\n            <span>Selected municipalities:<\/span>\n            <span id=\"supramunicipal-count\" class=\"supramunicipal-count\">0<\/span>\n        <\/div>\n        <div id=\"supramunicipal-tags\" class=\"supramunicipal-tags\">\n        <\/div>\n    <\/div>\n<\/div>\n<script>\n(function() {\n    'use strict';\n    const SUPRAMUNICIPAL_NO_RESULTS = 'No municipalities found';\n    const SUPRAMUNICIPAL_YA_AGREGADO = 'This municipality is already selected';\n    const SUPRAMUNICIPAL_MINIMO = 'Select at least 2 municipalities';\n    let municipiosData = [];\n    let selectedMunicipios = []; \/\/ Array de {id, nombre}\n    async function loadMunicipios() {\n        try {\n            const jsonUrl = 'https:\/\/roseo.es\/wp-content\/plugins\/roseo-form-plugin\/json\/NAMEUNITS_MUNICIPAL.json';\n            const response = await fetch(jsonUrl);\n            municipiosData = await response.json();\n        } catch (error) {\n        }\n    }\n    function searchMunicipios(query) {\n        if (!query || query.length < 2) return [];\n        const normalizedQuery = query.toLowerCase().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\");\n        return municipiosData.filter(m => {\n            const normalizedName = m.nameunit.toLowerCase().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\");\n            return normalizedName.includes(normalizedQuery);\n        }).slice(0, 15);\n    }\n    function isAlreadySelected(id) {\n        return selectedMunicipios.some(m => m.id === id);\n    }\n    function showResults(results) {\n        const dropdown = document.getElementById('supramunicipal-results-dropdown');\n        if (results.length === 0) {\n            dropdown.innerHTML = '<div class=\"supramunicipal-no-results\"><i class=\"fas fa-search\"><\/i>' + SUPRAMUNICIPAL_NO_RESULTS + '<\/div>';\n            dropdown.style.display = 'block';\n            return;\n        }\n        dropdown.innerHTML = results.map(m => {\n            const alreadySelected = isAlreadySelected(m.inspire_id);\n            return '<div class=\"supramunicipal-result-item ' + (alreadySelected ? 'disabled' : '') + '\" ' +\n                'data-id=\"' + m.inspire_id + '\" data-name=\"' + m.nameunit + '\">' +\n                '<i class=\"fas fa-map-marker-alt\"><\/i>' +\n                '<span class=\"name\">' + m.nameunit + '<\/span>' +\n                (alreadySelected ? '<span class=\"already-added\"><i class=\"fas fa-check\"><\/i><\/span>' : '') +\n                '<\/div>';\n        }).join('');\n        dropdown.style.display = 'block';\n        dropdown.querySelectorAll('.supramunicipal-result-item:not(.disabled)').forEach(item => {\n            item.addEventListener('click', function() {\n                addMunicipio(this.dataset.id, this.dataset.name);\n            });\n        });\n    }\n    function addMunicipio(id, name) {\n        if (isAlreadySelected(id)) {\n            showToast(SUPRAMUNICIPAL_YA_AGREGADO, 'warning');\n            return;\n        }\n        selectedMunicipios.push({ id: id, nombre: name });\n        document.getElementById('supramunicipal-results-dropdown').style.display = 'none';\n        document.getElementById('supramunicipal-search-input').value = '';\n        document.getElementById('supramunicipal-clear-btn').style.display = 'none';\n        renderSelectedTags();\n        saveToState();\n        updateNextButton();\n    }\n    function removeMunicipio(id) {\n        selectedMunicipios = selectedMunicipios.filter(m => m.id !== id);\n        renderSelectedTags();\n        saveToState();\n        updateNextButton();\n    }\n    function renderSelectedTags() {\n        const container = document.getElementById('supramunicipal-selected-container');\n        const tagsContainer = document.getElementById('supramunicipal-tags');\n        const countEl = document.getElementById('supramunicipal-count');\n        if (selectedMunicipios.length === 0) {\n            container.style.display = 'none';\n            return;\n        }\n        container.style.display = 'block';\n        countEl.textContent = selectedMunicipios.length;\n        tagsContainer.innerHTML = selectedMunicipios.map(m => \n            '<div class=\"supramunicipal-tag\" data-id=\"' + m.id + '\">' +\n            '<i class=\"fas fa-city supramunicipal-tag-icon\"><\/i>' +\n            '<span class=\"supramunicipal-tag-name\">' + m.nombre + '<\/span>' +\n            '<button type=\"button\" class=\"supramunicipal-tag-remove\" title=\"Eliminar\">' +\n            '<i class=\"fas fa-times\"><\/i>' +\n            '<\/button>' +\n            '<\/div>'\n        ).join('');\n        tagsContainer.querySelectorAll('.supramunicipal-tag-remove').forEach(btn => {\n            btn.addEventListener('click', function(e) {\n                e.stopPropagation();\n                const tag = this.closest('.supramunicipal-tag');\n                removeMunicipio(tag.dataset.id);\n            });\n        });\n    }\n    function saveToState() {\n        if (window.RoseoStateV2) {\n            window.RoseoStateV2.setFormData('municipios_supramunicipal', selectedMunicipios);\n            if (window.RoseoAnalytics) {\n                const municipioNames = selectedMunicipios.map(m => m.nombre).join(', ');\n                if (typeof window.RoseoAnalytics.trackFormField === 'function') {\n                    window.RoseoAnalytics.trackFormField('municipios_supramunicipal_count', selectedMunicipios.length);\n                    window.RoseoAnalytics.trackFormField('municipios_supramunicipal_nombres', municipioNames);\n                } else if (typeof window.RoseoAnalytics.trackEvent === 'function') {\n                    window.RoseoAnalytics.trackEvent('form_data', {\n                        field_name: 'municipios_supramunicipal_count',\n                        field_value: selectedMunicipios.length,\n                        step: 'step_3_supramunicipal'\n                    });\n                    window.RoseoAnalytics.trackEvent('form_data', {\n                        field_name: 'municipios_supramunicipal_nombres',\n                        field_value: municipioNames,\n                        step: 'step_3_supramunicipal'\n                    });\n                }\n            }\n        }\n    }\n    function updateNextButton() {\n        const btnNext = document.getElementById('btn-next-step');\n        if (btnNext) {\n            if (selectedMunicipios.length >= 2) {\n                btnNext.disabled = false;\n                btnNext.classList.remove('disabled');\n            } else {\n                btnNext.disabled = true;\n                btnNext.classList.add('disabled');\n            }\n        }\n    }\n    function showToast(message, type) {\n        if (window.FooterNavigation && window.FooterNavigation.showToast) {\n            window.FooterNavigation.showToast(message, type);\n        } else {\n        }\n    }\n    document.addEventListener('DOMContentLoaded', function() {\n        loadMunicipios();\n        const searchInput = document.getElementById('supramunicipal-search-input');\n        const clearBtn = document.getElementById('supramunicipal-clear-btn');\n        const dropdown = document.getElementById('supramunicipal-results-dropdown');\n        if (!searchInput) return;\n        let debounceTimer;\n        searchInput.addEventListener('input', function() {\n            const value = this.value.trim();\n            clearBtn.style.display = value ? 'block' : 'none';\n            clearTimeout(debounceTimer);\n            debounceTimer = setTimeout(function() {\n                if (value.length >= 2) {\n                    const results = searchMunicipios(value);\n                    showResults(results);\n                } else {\n                    dropdown.style.display = 'none';\n                }\n            }, 200);\n        });\n        clearBtn.addEventListener('click', function() {\n            searchInput.value = '';\n            clearBtn.style.display = 'none';\n            dropdown.style.display = 'none';\n            searchInput.focus();\n        });\n        document.addEventListener('click', function(e) {\n            if (!e.target.closest('.supramunicipal-search-container')) {\n                dropdown.style.display = 'none';\n            }\n        });\n        function restoreMunicipios() {\n            if (window.RoseoStateV2 && window.RoseoStateV2.isReady()) {\n                const state = window.RoseoStateV2.getState();\n                const saved = state.form && state.form.municipios_supramunicipal;\n                if (saved && Array.isArray(saved) && saved.length > 0) {\n                    selectedMunicipios = saved;\n                    renderSelectedTags();\n                }\n            } else if (window.RoseoStateV2) {\n                window.RoseoStateV2.onReady(function() {\n                    const state = window.RoseoStateV2.getState();\n                    const saved = state.form && state.form.municipios_supramunicipal;\n                    if (saved && Array.isArray(saved) && saved.length > 0) {\n                        selectedMunicipios = saved;\n                        renderSelectedTags();\n                    }\n                });\n            }\n        }\n        restoreMunicipios();\n        setTimeout(restoreMunicipios, 500);\n        updateNextButton();\n    });\n})();\n<\/script>\n    <\/div>\n\n    <!-- STEP 4: Datos T\u00e9cnicos -->\n    <div id=\"step-4\" class=\"roseo-step\" data-state=\"step_4\" style=\"display:none !important;\">\n        <div class=\"roseo-step-header\">\n    <h2 class=\"roseo-step-title\">\n        <i class=\"fas fa-clipboard-list\"><\/i>\n        Let\\&#039;s get to know each other better    <\/h2>\n    <p class=\"roseo-step-subtitle\">\n        Help us understand your case to assign you the right specialist engineer.    <\/p>\n<\/div>\n<div class=\"roseo-step-content\" id=\"step-4-content\">\n    <h4 class=\"kpi-section-title\">How did you hear about us?<\/h4>\n    <div class=\"kpi-grid\">\n        <div class=\"kpi-card-option\">\n            <input type=\"radio\" name=\"fuente\" id=\"fuente_google\" value=\"google\" \n                   >\n            <label for=\"fuente_google\">\n                <span class=\"kpi-card-icon\">\ud83d\udd0d<\/span>\n                <span class=\"kpi-card-title\">Google \/ Web<\/span>\n            <\/label>\n        <\/div>\n        <div class=\"kpi-card-option\">\n            <input type=\"radio\" name=\"fuente\" id=\"fuente_social\" value=\"social\"\n                   >\n            <label for=\"fuente_social\">\n                <span class=\"kpi-card-icon\">\ud83d\udcf1<\/span>\n                <span class=\"kpi-card-title\">Social Media<\/span>\n            <\/label>\n        <\/div>\n        <div class=\"kpi-card-option\">\n            <input type=\"radio\" name=\"fuente\" id=\"fuente_recomendacion\" value=\"recomendacion\"\n                   >\n            <label for=\"fuente_recomendacion\">\n                <span class=\"kpi-card-icon\">\ud83e\udd1d<\/span>\n                <span class=\"kpi-card-title\">Recommendation<\/span>\n            <\/label>\n        <\/div>\n        <div class=\"kpi-card-option\">\n            <input type=\"radio\" name=\"fuente\" id=\"fuente_prensa\" value=\"prensa\"\n                   >\n            <label for=\"fuente_prensa\">\n                <span class=\"kpi-card-icon\">\ud83d\udcf0<\/span>\n                <span class=\"kpi-card-title\">Press \/ Radio<\/span>\n            <\/label>\n        <\/div>\n    <\/div>\n    <h4 class=\"kpi-section-title\">When would you like to do the installation?<\/h4>\n    <div class=\"kpi-grid three-cols\">\n        <div class=\"kpi-card-option\">\n            <input type=\"radio\" name=\"urgencia\" id=\"urgencia_inmediato\" value=\"inmediato\"\n                   >\n            <label for=\"urgencia_inmediato\">\n                <span class=\"kpi-card-icon\">\ud83d\udd25<\/span>\n                <span class=\"kpi-card-title\">As soon as possible<\/span>\n                <span class=\"kpi-card-desc\">I have an urgent need<\/span>\n            <\/label>\n        <\/div>\n        <div class=\"kpi-card-option\">\n            <input type=\"radio\" name=\"urgencia\" id=\"urgencia_3meses\" value=\"3_meses\"\n                   >\n            <label for=\"urgencia_3meses\">\n                <span class=\"kpi-card-icon\">\ud83d\udcc5<\/span>\n                <span class=\"kpi-card-title\">In 1 - 3 months<\/span>\n                <span class=\"kpi-card-desc\">I\\&#039;m already planning the project<\/span>\n            <\/label>\n        <\/div>\n        <div class=\"kpi-card-option\">\n            <input type=\"radio\" name=\"urgencia\" id=\"urgencia_info\" value=\"informacion\"\n                   >\n            <label for=\"urgencia_info\">\n                <span class=\"kpi-card-icon\">\ud83c\udf31<\/span>\n                <span class=\"kpi-card-title\">Just information<\/span>\n                <span class=\"kpi-card-desc\">I\\&#039;m exploring options<\/span>\n            <\/label>\n        <\/div>\n    <\/div>\n    <h4 class=\"kpi-section-title\">What is your main goal?<\/h4>\n    <div class=\"kpi-grid three-cols\">\n        <div class=\"kpi-card-option\">\n            <input type=\"radio\" name=\"objetivo\" id=\"objetivo_ahorro\" value=\"ahorro\"\n                   >\n            <label for=\"objetivo_ahorro\">\n                <span class=\"kpi-card-icon\">\ud83d\udcb6<\/span>\n                <span class=\"kpi-card-title\">Economic savings<\/span>\n                <span class=\"kpi-card-desc\">Reduce electricity bill<\/span>\n            <\/label>\n        <\/div>\n        <div class=\"kpi-card-option\">\n            <input type=\"radio\" name=\"objetivo\" id=\"objetivo_eco\" value=\"eco\"\n                   >\n            <label for=\"objetivo_eco\">\n                <span class=\"kpi-card-icon\">\ud83c\udf3f<\/span>\n                <span class=\"kpi-card-title\">Promoting sustainability<\/span>\n                <span class=\"kpi-card-desc\">Reduce carbon footprint<\/span>\n            <\/label>\n        <\/div>\n        <div class=\"kpi-card-option\">\n            <input type=\"radio\" name=\"objetivo\" id=\"objetivo_independencia\" value=\"independencia\"\n                   >\n            <label for=\"objetivo_independencia\">\n                <span class=\"kpi-card-icon\">\u26a1<\/span>\n                <span class=\"kpi-card-title\">Becoming self-sufficiency<\/span>\n                <span class=\"kpi-card-desc\">Achieve energy independence<\/span>\n            <\/label>\n        <\/div>\n    <\/div>\n<\/div>\n<script>\n(function() {\n    'use strict';\n    function saveKPISelection(fieldName, value) {\n        if (window.RoseoStateV2) {\n            window.RoseoStateV2.setFormData(fieldName, value);\n        }\n        if (window.RoseoRouter && typeof window.RoseoRouter.saveField === 'function') {\n            window.RoseoRouter.saveField(fieldName, value);\n        }\n        checkAllSectionsComplete();\n    }\n    function checkAllSectionsComplete() {\n        const fuente = document.querySelector('input[name=\"fuente\"]:checked');\n        const urgencia = document.querySelector('input[name=\"urgencia\"]:checked');\n        const objetivo = document.querySelector('input[name=\"objetivo\"]:checked');\n        const allComplete = fuente && urgencia && objetivo;\n        const btnNext = document.getElementById('btn-next-step');\n        if (btnNext) {\n            if (allComplete) {\n                btnNext.disabled = false;\n                btnNext.classList.remove('disabled');\n            } else {\n            }\n        }\n        return allComplete;\n    }\n    document.addEventListener('DOMContentLoaded', function() {\n        document.querySelectorAll('input[name=\"fuente\"]').forEach(function(radio) {\n            radio.addEventListener('change', function() {\n                saveKPISelection('fuente', this.value);\n            });\n        });\n        document.querySelectorAll('input[name=\"urgencia\"]').forEach(function(radio) {\n            radio.addEventListener('change', function() {\n                saveKPISelection('urgencia', this.value);\n            });\n        });\n        document.querySelectorAll('input[name=\"objetivo\"]').forEach(function(radio) {\n            radio.addEventListener('change', function() {\n                saveKPISelection('objetivo', this.value);\n            });\n        });\n        if (window.RoseoStateV2) {\n            const state = window.RoseoStateV2.getState();\n            if (state.form) {\n                if (state.form.fuente) {\n                    const radio = document.querySelector(`input[name=\"fuente\"][value=\"${state.form.fuente}\"]`);\n                    if (radio) radio.checked = true;\n                }\n                if (state.form.urgencia) {\n                    const radio = document.querySelector(`input[name=\"urgencia\"][value=\"${state.form.urgencia}\"]`);\n                    if (radio) radio.checked = true;\n                }\n                if (state.form.objetivo) {\n                    const radio = document.querySelector(`input[name=\"objetivo\"][value=\"${state.form.objetivo}\"]`);\n                    if (radio) radio.checked = true;\n                }\n            }\n        }\n        checkAllSectionsComplete();\n    });\n})();\n<\/script>\n    <\/div>\n    \n    <!-- STEP 5: Resumen y Confirmaci\u00f3n -->\n    <div id=\"step-5\" class=\"roseo-step\" data-state=\"step_5\" style=\"display:none !important;\">\n        <div class=\"roseo-step-content roseo-step-5-resumen\" id=\"step-5-content\">\n    <style>\n        \/* FORZAR color y visibilidad - M\u00c1XIMA ESPECIFICIDAD *\/\n        #step-5-content .resumen-card-body .resumen-item .resumen-value,\n        #step-5-content .resumen-value,\n        #step-5-content span.resumen-value,\n        .roseo-step-5-resumen .resumen-value,\n        #resumen-tipo-cliente,\n        #resumen-nombre,\n        #resumen-email,\n        #resumen-telefono,\n        #resumen-ubicaciones,\n        #resumen-instalacion,\n        #resumen-fuente,\n        #resumen-urgencia,\n        #resumen-objetivo,\n        #resumen-municipio,\n        #resumen-municipios {\n            color: #015328 !important;\n            font-weight: 600 !important;\n            display: inline !important;\n            visibility: visible !important;\n            opacity: 1 !important;\n            font-size: 15px !important;\n        }\n        \/* Contenedores de filas - visibles por defecto *\/\n        #step-5-content .resumen-item {\n            display: flex !important;\n            visibility: visible !important;\n            opacity: 1 !important;\n        }\n        \/* Labels *\/\n        #step-5-content .resumen-label {\n            color: #6b7280 !important;\n            display: inline !important;\n            visibility: visible !important;\n        }\n        \/* Cards visibles *\/\n        #step-5-content .resumen-card {\n            display: block !important;\n            visibility: visible !important;\n            opacity: 1 !important;\n        }\n        #step-5-content .resumen-card-body {\n            display: block !important;\n            visibility: visible !important;\n            opacity: 1 !important;\n        }\n        \/* Municipios - controlados por JS *\/\n        #resumen-municipio-container,\n        #resumen-municipios-container {\n            display: none !important;\n        }\n        #resumen-municipio-container.visible,\n        #resumen-municipios-container.visible {\n            display: flex !important;\n        }\n        \/* ============================================= *\/\n        \/* UBICACIONES - Tarjetas individuales *\/\n        \/* ============================================= *\/\n        \/* Wrapper de ubicaciones *\/\n        #resumen-ubicaciones-wrapper {\n            display: block !important;\n            visibility: visible !important;\n            opacity: 1 !important;\n        }\n        \/* Header resumen (cuando hay muchas ubicaciones) *\/\n        \/* ==========================================\n           TARJETA SIMPLIFICADA DE UBICACIONES\n           ========================================== *\/\n        #step-5-content .tarjeta-ubicaciones-simple {\n            display: block !important;\n            visibility: visible !important;\n            opacity: 1 !important;\n            background: #fff !important;\n        }\n        #step-5-content .tarjeta-ubicaciones-simple .resumen-card-header {\n            display: flex !important;\n            visibility: visible !important;\n        }\n        #step-5-content .tarjeta-ubicaciones-simple .resumen-card-body {\n            display: block !important;\n            visibility: visible !important;\n        }\n        \/* Bot\u00f3n \"Ir a ubicaciones\" - efecto hover *\/\n        #step-5-content .btn-ir-ubicaciones {\n            transition: all 0.2s ease !important;\n        }\n        #step-5-content .btn-ir-ubicaciones:hover {\n            filter: brightness(1.1) !important;\n            transform: translateY(-2px) !important;\n            box-shadow: 0 4px 12px rgba(0,0,0,0.15) !important;\n        }\n    <\/style>\n    <div class=\"roseo-step-header\" style=\"text-align:center !important; margin-bottom:32px !important;\">\n        <div style=\"width:80px !important; height:80px !important; background:linear-gradient(135deg, #009239 0%, #015328 100%) !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important; margin:0 auto 20px !important;\">\n            <i class=\"fas fa-clipboard-check\" style=\"font-size:36px !important; color:#fff !important;\"><\/i>\n        <\/div>\n        <h2 class=\"roseo-step-title\" style=\"font-size:28px !important; font-weight:700 !important; color:#015328 !important; margin:0 0 12px 0 !important; text-align:center !important; width:100% !important;\">\n            Summary and confirmation        <\/h2>\n        <p class=\"roseo-step-description\" style=\"font-size:16px !important; color:#54595F !important; margin:0 auto !important; text-align:center !important; display:block !important; width:100% !important;\">\n            Let\u2019s check that everything is in order        <\/p>\n    <\/div>\n    <div class=\"resumen-aviso\" style=\"background:linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%) !important; border:none !important; border-radius:12px !important; padding:16px 24px !important; margin-bottom:28px !important; display:flex !important; align-items:center !important; justify-content:center !important; gap:14px !important; text-align:center !important; width:100% !important; box-sizing:border-box !important;\">\n        <i class=\"fas fa-info-circle\" style=\"font-size:24px !important; color:#009239 !important; flex-shrink:0 !important;\"><\/i>\n        <span style=\"font-size:15px !important; color:#015328 !important; font-weight:500 !important; text-align:center !important;\">Take one last look! Make sure everything is in order<\/span>\n    <\/div>\n    <div class=\"resumen-grid\" style=\"display:grid !important; grid-template-columns:repeat(auto-fit, minmax(320px, 1fr)) !important; gap:24px !important; margin-bottom:32px !important;\">\n        <div class=\"resumen-card\" data-section=\"contacto\" style=\"background:#fff !important; border:2px solid #e5e7eb !important; border-radius:16px !important; overflow:visible !important; box-shadow:0 4px 12px rgba(0,0,0,0.05) !important;\">\n            <div class=\"resumen-card-header\" style=\"background:linear-gradient(135deg, #009239 0%, #015328 100%) !important; padding:18px 20px !important; display:flex !important; align-items:center !important; gap:14px !important;\">\n                <div style=\"width:44px !important; height:44px !important; background:rgba(255,255,255,0.2) !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important;\">\n                    <i class=\"fas fa-user-circle\" style=\"font-size:22px !important; color:#fff !important;\"><\/i>\n                <\/div>\n                <h3 style=\"margin:0 !important; flex:1 !important; font-size:18px !important; font-weight:600 !important; color:#fff !important;\">Contact details<\/h3>\n                <button type=\"button\" class=\"btn-editar-seccion\" data-goto=\"step_1_1\" title=\"Edit data\" style=\"width:36px !important; height:36px !important; background:rgba(255,255,255,0.2) !important; border:none !important; border-radius:50% !important; cursor:pointer !important; display:flex !important; align-items:center !important; justify-content:center !important; transition:all 0.2s ease !important;\">\n                    <i class=\"fas fa-pencil-alt\" style=\"font-size:14px !important; color:#fff !important;\"><\/i>\n                <\/button>\n            <\/div>\n            <div class=\"resumen-card-body\" style=\"padding:20px !important;\">\n                <div class=\"resumen-item\" id=\"resumen-tipo-container\" style=\"display:flex !important; justify-content:space-between !important; align-items:center !important; padding:12px 0 !important; border-bottom:1px solid #f0f0f0 !important;\">\n                    <span class=\"resumen-label\" style=\"font-size:14px !important; color:#6b7280 !important; font-weight:500 !important;\">Client type<\/span>\n                    <span class=\"resumen-value\" id=\"resumen-tipo-cliente\" style=\"font-size:15px !important; color:#015328 !important; font-weight:600 !important;\"><\/span>\n                <\/div>\n                <div class=\"resumen-item\" id=\"resumen-nombre-container\" style=\"display:flex !important; justify-content:space-between !important; align-items:center !important; padding:12px 0 !important; border-bottom:1px solid #f0f0f0 !important;\">\n                    <span class=\"resumen-label\" style=\"font-size:14px !important; color:#6b7280 !important; font-weight:500 !important;\">Full name<\/span>\n                    <span class=\"resumen-value\" id=\"resumen-nombre\" style=\"font-size:15px !important; color:#015328 !important; font-weight:600 !important;\"><\/span>\n                <\/div>\n                <div class=\"resumen-item\" id=\"resumen-email-container\" style=\"display:flex !important; justify-content:space-between !important; align-items:center !important; padding:12px 0 !important; border-bottom:1px solid #f0f0f0 !important;\">\n                    <span class=\"resumen-label\" style=\"font-size:14px !important; color:#6b7280 !important; font-weight:500 !important;\">Email<\/span>\n                    <span class=\"resumen-value\" id=\"resumen-email\" style=\"font-size:15px !important; color:#015328 !important; font-weight:600 !important;\"><\/span>\n                <\/div>\n                <div class=\"resumen-item\" id=\"resumen-telefono-container\" style=\"display:none; justify-content:space-between !important; align-items:center !important; padding:12px 0 !important;\">\n                    <span class=\"resumen-label\" style=\"font-size:14px !important; color:#6b7280 !important; font-weight:500 !important;\">Phone<\/span>\n                    <span class=\"resumen-value\" id=\"resumen-telefono\" style=\"font-size:15px !important; color:#015328 !important; font-weight:600 !important;\"><\/span>\n                <\/div>\n            <\/div>\n        <\/div>\n        <div class=\"resumen-card\" data-section=\"proyecto\" style=\"background:#fff !important; border:2px solid #e5e7eb !important; border-radius:16px !important; overflow:visible !important; box-shadow:0 4px 12px rgba(0,0,0,0.05) !important;\">\n            <div class=\"resumen-card-header\" style=\"background:linear-gradient(135deg, #009239 0%, #015328 100%) !important; padding:18px 20px !important; display:flex !important; align-items:center !important; gap:14px !important;\">\n                <div style=\"width:44px !important; height:44px !important; background:rgba(255,255,255,0.2) !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important;\">\n                    <i class=\"fas fa-project-diagram\" style=\"font-size:22px !important; color:#fff !important;\"><\/i>\n                <\/div>\n                <h3 style=\"margin:0 !important; flex:1 !important; font-size:18px !important; font-weight:600 !important; color:#fff !important;\">Project details<\/h3>\n                <button type=\"button\" class=\"btn-editar-seccion\" data-goto=\"step_2\" title=\"Edit data\" style=\"width:36px !important; height:36px !important; background:rgba(255,255,255,0.2) !important; border:none !important; border-radius:50% !important; cursor:pointer !important; display:flex !important; align-items:center !important; justify-content:center !important; transition:all 0.2s ease !important;\">\n                    <i class=\"fas fa-pencil-alt\" style=\"font-size:14px !important; color:#fff !important;\"><\/i>\n                <\/button>\n            <\/div>\n            <div class=\"resumen-card-body\" style=\"padding:20px !important;\">\n                <div class=\"resumen-item\" id=\"resumen-ubicaciones-container\" style=\"display:flex !important; justify-content:space-between !important; align-items:center !important; padding:12px 0 !important; border-bottom:1px solid #f0f0f0 !important;\">\n                    <span class=\"resumen-label\" style=\"font-size:14px !important; color:#6b7280 !important; font-weight:500 !important;\">Project scope<\/span>\n                    <span class=\"resumen-value\" id=\"resumen-ubicaciones\" style=\"font-size:15px !important; color:#015328 !important; font-weight:600 !important;\"><\/span>\n                <\/div>\n                <div class=\"resumen-item\" id=\"resumen-municipio-container\" style=\"display:none; justify-content:space-between; align-items:center; padding:12px 0; border-bottom:1px solid #f0f0f0;\">\n                    <span class=\"resumen-label\" style=\"font-size:14px !important; color:#6b7280 !important; font-weight:500 !important;\">Municipality<\/span>\n                    <span class=\"resumen-value\" id=\"resumen-municipio\" style=\"font-size:15px !important; color:#015328 !important; font-weight:600 !important;\"><\/span>\n                <\/div>\n                <div class=\"resumen-item\" id=\"resumen-municipios-container\" style=\"display:none; justify-content:space-between; align-items:flex-start; padding:12px 0;\">\n                    <span class=\"resumen-label\" style=\"font-size:14px !important; color:#6b7280 !important; font-weight:500 !important;\">Selected municipalities<\/span>\n                    <span class=\"resumen-value\" id=\"resumen-municipios\" style=\"font-size:15px !important; color:#015328 !important; font-weight:600 !important; text-align:right !important; max-width:60% !important;\"><\/span>\n                <\/div>\n            <\/div>\n        <\/div>\n        <div class=\"resumen-card\" id=\"resumen-kpis-card\" data-section=\"kpis\" style=\"display:none; background:#fff !important; border:2px solid #e5e7eb !important; border-radius:16px !important; overflow:visible !important; box-shadow:0 4px 12px rgba(0,0,0,0.05) !important; margin-top:16px !important;\">\n            <div class=\"resumen-card-header\" style=\"background:linear-gradient(135deg, #009239 0%, #015328 100%) !important; padding:18px 20px !important; display:flex !important; align-items:center !important; gap:14px !important;\">\n                <div style=\"width:44px !important; height:44px !important; background:rgba(255,255,255,0.2) !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important;\">\n                    <i class=\"fas fa-clipboard-list\" style=\"font-size:22px !important; color:#fff !important;\"><\/i>\n                <\/div>\n                <h3 style=\"margin:0 !important; flex:1 !important; font-size:18px !important; font-weight:600 !important; color:#fff !important;\">Tell us your preferences<\/h3>\n                <button type=\"button\" class=\"btn-editar-seccion\" data-goto=\"step_4\" title=\"Editar\" style=\"width:36px !important; height:36px !important; background:rgba(255,255,255,0.2) !important; border:none !important; border-radius:50% !important; cursor:pointer !important; display:flex !important; align-items:center !important; justify-content:center !important; transition:all 0.2s ease !important;\">\n                    <i class=\"fas fa-pencil-alt\" style=\"font-size:14px !important; color:#fff !important;\"><\/i>\n                <\/button>\n            <\/div>\n            <div class=\"resumen-card-body\" style=\"padding:20px !important;\">\n                <div class=\"resumen-item\" id=\"resumen-fuente-container\" style=\"display:none; justify-content:space-between !important; align-items:center !important; padding:12px 0 !important; border-bottom:1px solid #f0f0f0 !important;\">\n                    <span class=\"resumen-label\" style=\"font-size:14px !important; color:#6b7280 !important; font-weight:500 !important;\">How did you hear about us?<\/span>\n                    <span class=\"resumen-value\" id=\"resumen-fuente\" style=\"font-size:15px !important; color:#015328 !important; font-weight:600 !important;\"><\/span>\n                <\/div>\n                <div class=\"resumen-item\" id=\"resumen-urgencia-container\" style=\"display:none; justify-content:space-between !important; align-items:center !important; padding:12px 0 !important; border-bottom:1px solid #f0f0f0 !important;\">\n                    <span class=\"resumen-label\" style=\"font-size:14px !important; color:#6b7280 !important; font-weight:500 !important;\">When would you like to start?<\/span>\n                    <span class=\"resumen-value\" id=\"resumen-urgencia\" style=\"font-size:15px !important; color:#015328 !important; font-weight:600 !important;\"><\/span>\n                <\/div>\n                <div class=\"resumen-item\" id=\"resumen-objetivo-container\" style=\"display:none; justify-content:space-between !important; align-items:center !important; padding:12px 0 !important;\">\n                    <span class=\"resumen-label\" style=\"font-size:14px !important; color:#6b7280 !important; font-weight:500 !important;\">Tell us, what is your main goal?<\/span>\n                    <span class=\"resumen-value\" id=\"resumen-objetivo\" style=\"font-size:15px !important; color:#015328 !important; font-weight:600 !important;\"><\/span>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div id=\"resumen-ubicaciones-wrapper\"><\/div>\n    <!-- \n    \u2705 FIX: Secci\u00f3n legal simplificada - La privacidad ya se acepta en step-1-1\n    Solo mostramos el checkbox opcional de marketing\/newsletter\n    -->\n    <div class=\"resumen-legal-section\" style=\"background:#f8fafc !important; border:2px solid #e5e7eb !important; border-radius:16px !important; padding:24px !important; margin-top:24px !important; display:block !important; visibility:visible !important; opacity:1 !important; height:auto !important; overflow:visible !important;\">\n        <h3 style=\"margin:0 0 20px 0 !important; font-size:18px !important; font-weight:600 !important; color:#015328 !important; display:flex !important; align-items:center !important; gap:12px !important;\">\n            <i class=\"fas fa-bell\" style=\"font-size:22px !important; color:#009239 !important;\"><\/i>\n            Communications        <\/h3>\n        <div class=\"legal-checkboxes\" style=\"display:flex !important; flex-direction:column !important; gap:16px !important; visibility:visible !important; opacity:1 !important; height:auto !important; overflow:visible !important;\">\n            <!-- Checkbox Marketing\/Newsletter (opcional) -->\n            <label class=\"legal-checkbox\" style=\"display:flex !important; align-items:flex-start !important; gap:14px !important; padding:14px 18px !important; background:#fff !important; border:2px solid #e5e7eb !important; border-radius:12px !important; cursor:pointer !important; transition:all 0.2s ease !important;\">\n                <input type=\"checkbox\" \n                       name=\"acepta_marketing\" \n                       id=\"acepta_marketing\" \n                       style=\"width:22px !important; height:22px !important; accent-color:#009239 !important; margin-top:2px !important; flex-shrink:0 !important;\">\n                <span class=\"legal-text\" style=\"font-size:15px !important; color:#374151 !important; line-height:1.5 !important;\">\n                    I agree to receive commercial communications                    <span style=\"color:#9ca3af !important; font-size:13px !important; display:block !important; margin-top:4px !important;\">(optional)<\/span>\n                <\/span>\n            <\/label>\n        <\/div>\n    <\/div>\n    <div id=\"modal-editar-contacto\" class=\"roseo-modal-overlay\" style=\"display:none; position:fixed; top:0; left:0; right:0; bottom:0; background:rgba(0,0,0,0.6); z-index:99999; justify-content:center; align-items:center; padding:20px;\"\n    <div class=\"roseo-modal-content\" style=\"background:#fff !important; border-radius:20px !important; max-width:500px !important; width:100% !important; max-height:90vh !important; overflow-y:auto !important; box-shadow:0 25px 50px rgba(0,0,0,0.25) !important; animation:modalFadeIn 0.3s ease !important;\">\n        <div style=\"background:linear-gradient(135deg, #009239 0%, #015328 100%) !important; padding:24px !important; border-radius:20px 20px 0 0 !important; display:flex !important; align-items:center !important; justify-content:space-between !important;\">\n            <div style=\"display:flex !important; align-items:center !important; gap:14px !important;\">\n                <div style=\"width:48px !important; height:48px !important; background:rgba(255,255,255,0.2) !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important;\">\n                    <i class=\"fas fa-user-edit\" style=\"font-size:22px !important; color:#fff !important;\"><\/i>\n                <\/div>\n                <h3 style=\"margin:0 !important; font-size:20px !important; font-weight:600 !important; color:#fff !important;\">Edit contact details<\/h3>\n            <\/div>\n            <button type=\"button\" id=\"modal-close-btn\" style=\"width:36px !important; height:36px !important; background:rgba(255,255,255,0.2) !important; border:none !important; border-radius:50% !important; cursor:pointer !important; display:flex !important; align-items:center !important; justify-content:center !important; transition:all 0.2s ease !important;\">\n                <i class=\"fas fa-times\" style=\"font-size:16px !important; color:#fff !important;\"><\/i>\n            <\/button>\n        <\/div>\n        <div style=\"padding:24px !important;\">\n            <form id=\"form-editar-contacto\">\n                <div style=\"margin-bottom:20px !important;\">\n                    <label for=\"modal-nombre\" style=\"display:block !important; font-size:14px !important; font-weight:600 !important; color:#374151 !important; margin-bottom:8px !important;\">\n                        <i class=\"fas fa-user\" style=\"margin-right:8px !important; color:#009239 !important;\"><\/i>\n                        First Name *\n                    <\/label>\n                    <input type=\"text\" id=\"modal-nombre\" name=\"nombre\" required\n                           autocomplete=\"given-name\"\n                           style=\"width:100% !important; padding:14px 16px !important; border:2px solid #e5e7eb !important; border-radius:12px !important; font-size:15px !important; color:#1f2937 !important; transition:all 0.2s ease !important; box-sizing:border-box !important;\"\n                           placeholder=\"Your first name\">\n                <\/div>\n                <div style=\"margin-bottom:20px !important;\">\n                    <label for=\"modal-apellido\" style=\"display:block !important; font-size:14px !important; font-weight:600 !important; color:#374151 !important; margin-bottom:8px !important;\">\n                        <i class=\"fas fa-user\" style=\"margin-right:8px !important; color:#009239 !important;\"><\/i>\n                        Last Name *\n                    <\/label>\n                    <input type=\"text\" id=\"modal-apellido\" name=\"apellido\" required\n                           autocomplete=\"family-name\"\n                           style=\"width:100% !important; padding:14px 16px !important; border:2px solid #e5e7eb !important; border-radius:12px !important; font-size:15px !important; color:#1f2937 !important; transition:all 0.2s ease !important; box-sizing:border-box !important;\"\n                           placeholder=\"Your last name\">\n                <\/div>\n                <div style=\"margin-bottom:20px !important;\">\n                    <label for=\"modal-email\" style=\"display:block !important; font-size:14px !important; font-weight:600 !important; color:#374151 !important; margin-bottom:8px !important;\">\n                        <i class=\"fas fa-envelope\" style=\"margin-right:8px !important; color:#009239 !important;\"><\/i>\n                        Email *\n                    <\/label>\n                    <input type=\"email\" id=\"modal-email\" name=\"email\" required\n                           autocomplete=\"email\"\n                           style=\"width:100% !important; padding:14px 16px !important; border:2px solid #e5e7eb !important; border-radius:12px !important; font-size:15px !important; color:#1f2937 !important; transition:all 0.2s ease !important; box-sizing:border-box !important;\"\n                           placeholder=\"your@email.com\">\n                <\/div>\n                <div style=\"margin-bottom:24px !important;\">\n                    <label for=\"modal-telefono\" style=\"display:block !important; font-size:14px !important; font-weight:600 !important; color:#374151 !important; margin-bottom:8px !important;\">\n                        <i class=\"fas fa-phone\" style=\"margin-right:8px !important; color:#009239 !important;\"><\/i>\n                        Phone                        <span style=\"color:#9ca3af !important; font-weight:400 !important;\">(optional)<\/span>\n                    <\/label>\n                    <input type=\"tel\" id=\"modal-telefono\" name=\"telefono\"\n                           autocomplete=\"tel\"\n                           style=\"width:100% !important; padding:14px 16px !important; border:2px solid #e5e7eb !important; border-radius:12px !important; font-size:15px !important; color:#1f2937 !important; transition:all 0.2s ease !important; box-sizing:border-box !important;\"\n                           placeholder=\"600 000 000\">\n                <\/div>\n                <div style=\"display:flex !important; gap:12px !important; justify-content:flex-end !important;\">\n                    <button type=\"button\" id=\"modal-cancel-btn\" style=\"padding:12px 24px !important; background:#f3f4f6 !important; color:#374151 !important; border:none !important; border-radius:10px !important; font-size:15px !important; font-weight:600 !important; cursor:pointer !important; transition:all 0.2s ease !important;\">\n                        Cancel                    <\/button>\n                    <button type=\"submit\" id=\"modal-save-btn\" style=\"padding:12px 24px !important; background:linear-gradient(135deg, #009239 0%, #015328 100%) !important; color:#fff !important; border:none !important; border-radius:10px !important; font-size:15px !important; font-weight:600 !important; cursor:pointer !important; transition:all 0.2s ease !important; display:flex !important; align-items:center !important; gap:8px !important;\">\n                        <i class=\"fas fa-check\"><\/i>\n                        Save Changes                    <\/button>\n                <\/div>\n            <\/form>\n        <\/div>\n    <\/div>\n<\/div>\n<style>\n@keyframes modalFadeIn {\n    from { opacity: 0; transform: scale(0.95) translateY(-20px); }\n    to { opacity: 1; transform: scale(1) translateY(0); }\n}\n#modal-editar-contacto input:focus {\n    border-color: #009239 !important;\n    outline: none !important;\n    box-shadow: 0 0 0 3px rgba(0, 146, 57, 0.15) !important;\n}\n#modal-editar-contacto button:hover {\n    transform: translateY(-1px) !important;\n}\n#modal-close-btn:hover, #modal-cancel-btn:hover {\n    background: rgba(255,255,255,0.3) !important;\n}\n<\/style>\n<\/div>\n<script>\n\/**\n * Step 5 - Resumen Logic (LIMPIO)\n *\/\n(function() {\n    'use strict';\n    function debugLog(msg) {\n        let panel = document.getElementById('step5-debug-panel');\n        if (!panel) {\n            panel = document.createElement('div');\n            panel.id = 'step5-debug-panel';\n            panel.style.cssText = 'display:none;'; \/\/ OCULTO\n            document.body.appendChild(panel);\n        }\n    }\n    const valoresTraducidos = {\"particular\":\"Individual\",\"empresa\":\"Company\",\"entidad_publica\":\"Public entity\",\"ayuntamiento\":\"City Council\",\"comunidad_energetica\":\"Energy community\",\"mancomunidad\":\"Association of Municipalities\",\"otro\":\"Other case\",\"unica\":\"Single location\",\"multiples\":\"Multiple locations\",\"municipal\":\"Municipal level\",\"supramunicipal\":\"Supramunicipal level\",\"solo_fv\":\"Photovoltaic\",\"solo_mini\":\"Mini Wind\",\"mini_fv\":\"MIni Wind + Photovoltaic\",\"fv_ampliar_mini\":\"Expand photovoltaic with Mini Wind\",\"fotovoltaica\":\"Photovoltaic\",\"minieolica\":\"Mini Wind\",\"hibrida\":\"Hybrid (PV + Mini Wind)\",\"cubierta\":\"Roof\",\"terreno\":\"Ground\",\"ambas\":\"Roof + Ground\",\"no_se\":\"I\\\\'m not sure\",\"tejado_inclinado_teja\":\"Tejado inclinado (teja)\",\"tejado_inclinado_pizarra\":\"Tejado inclinado (pizarra)\",\"tejado_inclinado_metal\":\"Tejado inclinado (chapa)\",\"tejado_plano_hormigon\":\"Tejado plano (hormig\u00f3n)\",\"tejado_plano_grava\":\"Tejado plano (grava)\",\"cubierta_industrial\":\"Cubierta industrial\",\"nave_industrial\":\"Nave industrial\",\"parking\":\"Parking \\\/ Marquesina\",\"otro_cubierta\":\"Otro tipo de cubierta\",\"agricola\":\"Agr\u00edcola\",\"ganadero\":\"Ganadero\",\"forestal\":\"Forestal\",\"industrial_terreno\":\"Industrial\",\"urbano\":\"Urbano\",\"sin_uso\":\"Sin uso espec\u00edfico\",\"otro_terreno\":\"Otro uso\",\"no_especificado\":\"Not specified\",\"si\":\"Yes\",\"no\":\"No\",\"google\":\"Google \\\/ Web\",\"social\":\"Redes Sociales\",\"recomendacion\":\"Recomendaci\u00f3n\",\"prensa\":\"Prensa \\\/ Radio\",\"inmediato\":\"Lo antes posible\",\"3_meses\":\"En 1 - 3 meses\",\"informacion\":\"Solo informaci\u00f3n\",\"ahorro\":\"Ahorro Econ\u00f3mico\",\"eco\":\"Sostenibilidad\",\"independencia\":\"Autosuficiencia\"};\n    const modalTextos = {\"titulo\":\"Edit contact details\",\"nombre\":\"First Name\",\"nombre_placeholder\":\"Your first name\",\"apellido\":\"Last Name\",\"apellido_placeholder\":\"Your last name\",\"email\":\"Email\",\"email_placeholder\":\"your@email.com\",\"telefono\":\"Phone\",\"telefono_placeholder\":\"600 000 000\",\"opcional\":\"optional\",\"btn_guardar\":\"Save Changes\",\"btn_cancelar\":\"Cancel\"};\n    const txtUbicaciones = {\"tarjeta_ubicaciones_titulo\":\"My Locations\",\"tarjeta_ubicaciones_descripcion\":\"Great! You have {n} locations ready in your project\",\"tarjeta_ubicaciones_vacia\":\"You haven\\\\'t added any locations yet! Select a spot on the map to get started\",\"btn_ir_ubicaciones\":\"Manage your study points\",\"btn_agregar_ubicacion\":\"Add a new study point\",\"tarjeta_municipal_titulo\":\"Estudio Municipal\",\"tarjeta_municipal_descripcion\":\"Estudio a nivel de municipio\",\"tarjeta_supramunicipal_titulo\":\"Estudio Supramunicipal\",\"tarjeta_supramunicipal_descripcion\":\"Estudio que abarca varios municipios\",\"btn_modificar_municipio\":\"Modificar selecci\u00f3n\",\"municipio_seleccionado\":\"Municipio seleccionado\",\"municipios_seleccionados\":\"Municipios seleccionados\",\"tarjeta_preferencias_titulo\":\"Tell us your preferences\",\"campo_fuente\":\"How did you hear about us?\",\"campo_urgencia\":\"When would you like to start?\",\"campo_objetivo\":\"Tell us, what is your main goal?\",\"ubicacion_label\":\"Location\",\"ubicacion_guardada\":\"Saved\",\"ubicacion_completa\":\"Complete\",\"sin_tipo\":\"No type\",\"mostrar_mas\":\"Show {n} more\",\"mostrar_menos\":\"Show less\"};\n    function fillStep5FromStorage() {\n        let state = null;\n        try {\n            const raw = localStorage.getItem('roseo_state_v2');\n            if (raw) {\n                state = JSON.parse(raw);\n            } else {\n                return false;\n            }\n        } catch(e) {\n            return false;\n        }\n        const form = state.form || {};\n        const ubicaciones = state.ubicaciones || [];\n        const currentLocation = state.current_location || {};\n        function setText(id, value, containerId) {\n            const el = document.getElementById(id);\n            const container = containerId ? document.getElementById(containerId) : null;\n            const strValue = (value !== null && value !== undefined) ? String(value).trim() : '';\n            if (el && strValue !== '') {\n                el.textContent = strValue;\n                el.style.display = 'inline';\n                el.style.visibility = 'visible';\n                el.style.opacity = '1';\n                if (container) {\n                    container.style.display = 'flex';\n                }\n                return true;\n            } else {\n                if (container) {\n                    container.style.display = 'none';\n                }\n                return false;\n            }\n        }\n        function traducir(key) {\n            return valoresTraducidos[key] || key || '';\n        }\n        setText('resumen-tipo-cliente', traducir(form.tipo_cliente), 'resumen-tipo-container');\n        const nombreCompleto = [form.nombre, form.apellido].filter(Boolean).join(' ');\n        setText('resumen-nombre', nombreCompleto, 'resumen-nombre-container');\n        setText('resumen-email', form.email, 'resumen-email-container');\n        setText('resumen-telefono', form.telefono, 'resumen-telefono-container');\n        \n        setText('resumen-ubicaciones', traducir(form.numero_ubicaciones), 'resumen-ubicaciones-container');\n        const municipioContainer = document.getElementById('resumen-municipio-container');\n        const municipiosContainer = document.getElementById('resumen-municipios-container');\n        if (municipioContainer) municipioContainer.classList.remove('visible');\n        if (municipiosContainer) municipiosContainer.classList.remove('visible');\n        if (form.numero_ubicaciones === 'municipal' || form.numero_ubicaciones === 'supramunicipal') {\n            if (form.municipio_nombre && municipioContainer) {\n                setText('resumen-municipio', form.municipio_nombre);\n                municipioContainer.classList.add('visible');\n            }\n            if (form.municipios_seleccionados && form.municipios_seleccionados.length > 0 && municipiosContainer) {\n                const nombres = form.municipios_seleccionados.map(m => m.nombre || m.nameunit).join(', ');\n                setText('resumen-municipios', nombres);\n                municipiosContainer.classList.add('visible');\n            }\n        }\n        const kpisCard = document.getElementById('resumen-kpis-card');\n        let hasKpis = false;\n        if (setText('resumen-fuente', traducir(form.fuente), 'resumen-fuente-container')) {\n            hasKpis = true;\n        }\n        if (setText('resumen-urgencia', traducir(form.urgencia), 'resumen-urgencia-container')) {\n            hasKpis = true;\n        }\n        if (setText('resumen-objetivo', traducir(form.objetivo), 'resumen-objetivo-container')) {\n            hasKpis = true;\n        }\n        if (kpisCard) {\n            kpisCard.style.display = hasKpis ? 'block' : 'none';\n        }\n        \n        \/\/ \u2705 FIX: Restore checkbox states\n        if (form.acepta_marketing) {\n            const marketingCheckbox = document.getElementById('acepta_marketing');\n            if (marketingCheckbox) marketingCheckbox.checked = true;\n        }\n\n        renderUbicacionesCard(ubicaciones, currentLocation, form);\n        return true;\n    }\n    function getCentroidFromGeoJSON(json) {\n        if (!json) return null;\n        try {\n            const data = typeof json === 'string' ? JSON.parse(json) : json;\n            if (!data || !data.geometry || !data.geometry.coordinates) return null;\n            const coords = data.geometry.coordinates;\n            \/\/ Handle Polygon (nested arrays)\n            let points = [];\n            if (data.geometry.type === 'Polygon') {\n                points = coords[0];\n            } else if (data.geometry.type === 'MultiPolygon') {\n                points = coords[0][0];\n            } else {\n                return null;\n            }\n            if (!points || points.length === 0) return null;\n            let latSum = 0, lngSum = 0, count = 0;\n            points.forEach(p => {\n                lngSum += p[0];\n                latSum += p[1];\n                count++;\n            });\n            if (count === 0) return null;\n            return {\n                lat: latSum \/ count,\n                lng: lngSum \/ count\n            };\n        } catch (e) {\n            return null;\n        }\n    }\n\n    function renderUbicacionesCard(ubicaciones, currentLocation, form) {\n        const wrapper = document.getElementById('resumen-ubicaciones-wrapper');\n        if (!wrapper) return;\n        const numeroUbicaciones = form.numero_ubicaciones || 'unica';\n        let html = '';\n        if (numeroUbicaciones === 'municipal') {\n            const municipioNombre = form.municipio_nombre || form.municipio || '';\n            html = `\n            <div class=\"resumen-card tarjeta-ubicaciones-simple\" style=\"background:#fff !important; border:2px solid #e5e7eb !important; border-radius:16px !important; overflow:hidden !important; box-shadow:0 4px 12px rgba(0,0,0,0.05) !important; margin-top:12px !important;\">\n                <div class=\"resumen-card-header\" style=\"background:linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%) !important; padding:18px 20px !important; display:flex !important; align-items:center !important; gap:14px !important;\">\n                    <div style=\"width:44px !important; height:44px !important; background:rgba(255,255,255,0.2) !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important;\">\n                        <i class=\"fas fa-map-marker-alt\" style=\"font-size:20px !important; color:#fff !important;\"><\/i>\n                    <\/div>\n                    <div style=\"flex:1 !important;\">\n                        <h3 style=\"margin:0 !important; font-size:17px !important; font-weight:600 !important; color:#fff !important;\">${txtUbicaciones.tarjeta_municipal_titulo}<\/h3>\n                        <p style=\"margin:4px 0 0 !important; font-size:13px !important; color:rgba(255,255,255,0.8) !important;\">${txtUbicaciones.tarjeta_municipal_descripcion}<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"resumen-card-body\" style=\"padding:20px !important;\">\n                    ${municipioNombre ? `\n                    <div style=\"display:flex !important; align-items:center !important; gap:12px !important; margin-bottom:16px !important; padding:12px 16px !important; background:#f0f9ff !important; border-radius:10px !important; border:1px solid #bfdbfe !important;\">\n                        <i class=\"fas fa-building\" style=\"font-size:18px !important; color:#3b82f6 !important;\"><\/i>\n                        <div>\n                            <div style=\"font-size:12px !important; color:#6b7280 !important; font-weight:500 !important;\">${txtUbicaciones.municipio_seleccionado}<\/div>\n                            <div style=\"font-size:15px !important; color:#1e40af !important; font-weight:600 !important;\">${municipioNombre}<\/div>\n                        <\/div>\n                    <\/div>\n                    ` : ''}\n                    <button type=\"button\" class=\"btn-editar-seccion btn-ir-ubicaciones\" data-goto=\"step_3_municipal\" style=\"width:100% !important; display:flex !important; align-items:center !important; justify-content:center !important; gap:10px !important; padding:14px 20px !important; background:#3b82f6 !important; color:#fff !important; border:none !important; border-radius:10px !important; font-size:15px !important; font-weight:600 !important; cursor:pointer !important; transition:all 0.2s ease !important;\">\n                        <i class=\"fas fa-edit\"><\/i>\n                        <span>${txtUbicaciones.btn_modificar_municipio}<\/span>\n                    <\/button>\n                <\/div>\n            <\/div>\n            `;\n            wrapper.innerHTML = html;\n            return;\n        }\n        if (numeroUbicaciones === 'supramunicipal') {\n            const municipiosArray = form.municipios_supramunicipal || [];\n            const totalMunicipios = municipiosArray.length;\n            let municipiosHtml = '';\n            if (totalMunicipios > 0) {\n                const nombresMunicipios = municipiosArray.map(m => m.nombre || m.nameunit || m).join(', ');\n                municipiosHtml = `\n                    <div style=\"display:flex !important; align-items:flex-start !important; gap:12px !important; margin-bottom:16px !important; padding:12px 16px !important; background:#f5f3ff !important; border-radius:10px !important; border:1px solid #c4b5fd !important;\">\n                        <i class=\"fas fa-layer-group\" style=\"font-size:18px !important; color:#8b5cf6 !important; margin-top:2px !important;\"><\/i>\n                        <div style=\"flex:1 !important;\">\n                            <div style=\"font-size:12px !important; color:#6b7280 !important; font-weight:500 !important; margin-bottom:4px !important;\">${txtUbicaciones.municipios_seleccionados} (${totalMunicipios})<\/div>\n                            <div style=\"font-size:14px !important; color:#5b21b6 !important; font-weight:600 !important; line-height:1.4 !important;\">${nombresMunicipios}<\/div>\n                        <\/div>\n                    <\/div>\n                `;\n            }\n            html = `\n            <div class=\"resumen-card tarjeta-ubicaciones-simple\" style=\"background:#fff !important; border:2px solid #e5e7eb !important; border-radius:16px !important; overflow:hidden !important; box-shadow:0 4px 12px rgba(0,0,0,0.05) !important; margin-top:12px !important;\">\n                <div class=\"resumen-card-header\" style=\"background:linear-gradient(135deg, #8b5cf6 0%, #6d28d9 100%) !important; padding:18px 20px !important; display:flex !important; align-items:center !important; gap:14px !important;\">\n                    <div style=\"width:44px !important; height:44px !important; background:rgba(255,255,255,0.2) !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important;\">\n                        <i class=\"fas fa-globe-americas\" style=\"font-size:20px !important; color:#fff !important;\"><\/i>\n                    <\/div>\n                    <div style=\"flex:1 !important;\">\n                        <h3 style=\"margin:0 !important; font-size:17px !important; font-weight:600 !important; color:#fff !important;\">${txtUbicaciones.tarjeta_supramunicipal_titulo}<\/h3>\n                        <p style=\"margin:4px 0 0 !important; font-size:13px !important; color:rgba(255,255,255,0.8) !important;\">${txtUbicaciones.tarjeta_supramunicipal_descripcion}<\/p>\n                    <\/div>\n                    <div style=\"width:36px !important; height:36px !important; background:rgba(255,255,255,0.3) !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important; font-size:16px !important; font-weight:700 !important; color:#fff !important;\">\n                        ${totalMunicipios}\n                    <\/div>\n                <\/div>\n                <div class=\"resumen-card-body\" style=\"padding:20px !important;\">\n                    ${municipiosHtml}\n                    <button type=\"button\" class=\"btn-editar-seccion btn-ir-ubicaciones\" data-goto=\"step_3_supramunicipal\" style=\"width:100% !important; display:flex !important; align-items:center !important; justify-content:center !important; gap:10px !important; padding:14px 20px !important; background:#8b5cf6 !important; color:#fff !important; border:none !important; border-radius:10px !important; font-size:15px !important; font-weight:600 !important; cursor:pointer !important; transition:all 0.2s ease !important;\">\n                        <i class=\"fas fa-edit\"><\/i>\n                        <span>${txtUbicaciones.btn_modificar_municipio}<\/span>\n                    <\/button>\n                <\/div>\n            <\/div>\n            `;\n            wrapper.innerHTML = html;\n            return;\n        }\n        \/\/ FILTER: Remove corrupt\/empty locations (Ghost Data Fix)\n        if (ubicaciones && Array.isArray(ubicaciones)) {\n            ubicaciones = ubicaciones.filter(u => {\n                const hasType = !!u.tipo_instalacion;\n                const hasPolys = (u.poligonos_fv && u.poligonos_fv.length > 0) ||\n                               (u.poligonos_fv_terreno && u.poligonos_fv_terreno.length > 0) ||\n                               (u.poligonos_fv_cubierta && u.poligonos_fv_cubierta.length > 0) ||\n                               (u.poligonos_mini_terreno && u.poligonos_mini_terreno.length > 0) ||\n                               (u.poligonos_mini_cubierta && u.poligonos_mini_cubierta.length > 0);\n                return hasType || hasPolys;\n            });\n        }\n\n        let totalUbicaciones = 0;\n        if (ubicaciones && ubicaciones.length > 0) {\n            totalUbicaciones = ubicaciones.length;\n        } else if (currentLocation && currentLocation.tipo_instalacion) {\n            totalUbicaciones = 1;\n        }\n        const descripcion = totalUbicaciones > 0 \n            ? txtUbicaciones.tarjeta_ubicaciones_descripcion.replace('{n}', totalUbicaciones)\n            : txtUbicaciones.tarjeta_ubicaciones_vacia;\n        const btnTexto = totalUbicaciones > 0 \n            ? txtUbicaciones.btn_ir_ubicaciones \n            : txtUbicaciones.btn_agregar_ubicacion;\n        const btnIcono = totalUbicaciones > 0 ? 'fa-list-ul' : 'fa-plus';\n        const badgeBg = totalUbicaciones > 0 ? '#009239' : '#f59e0b';\n        const badgeText = totalUbicaciones > 0 ? totalUbicaciones : '0';\n\n        \/\/ Pagination Logic\n        const LIMIT = 3;\n        const visibleUbicaciones = ubicaciones.slice(0, LIMIT);\n        const remaining = ubicaciones.length - LIMIT;\n\n        html = `\n        <div class=\"resumen-card tarjeta-ubicaciones-simple\" style=\"background:#fff !important; border:2px solid #e5e7eb !important; border-radius:16px !important; overflow:hidden !important; box-shadow:0 4px 12px rgba(0,0,0,0.05) !important; margin-top:12px !important;\">\n            <div class=\"resumen-card-header\" style=\"background:linear-gradient(135deg, #009239 0%, #015328 100%) !important; padding:18px 20px !important; display:flex !important; align-items:center !important; gap:14px !important; flex-wrap:wrap !important;\">\n                <div style=\"width:44px !important; height:44px !important; background:rgba(255,255,255,0.2) !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important;\">\n                    <i class=\"fas fa-map-marked-alt\" style=\"font-size:20px !important; color:#fff !important;\"><\/i>\n                <\/div>\n                <div style=\"flex:1 !important; min-width: 200px !important;\">\n                    <h3 style=\"margin:0 !important; font-size:17px !important; font-weight:600 !important; color:#fff !important;\">${txtUbicaciones.tarjeta_ubicaciones_titulo}<\/h3>\n                    <p style=\"margin:4px 0 0 !important; font-size:13px !important; color:rgba(255,255,255,0.8) !important;\">${descripcion}<\/p>\n                <\/div>\n                <div style=\"width:36px !important; height:36px !important; background:${badgeBg} !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important; font-size:16px !important; font-weight:700 !important; color:#fff !important; border:2px solid rgba(255,255,255,0.3) !important;\">\n                    ${badgeText}\n                <\/div>\n            <\/div>\n            <div class=\"resumen-card-body\" style=\"padding:20px !important;\">\n                <div class=\"ubicaciones-preview-list\" style=\"margin-bottom:20px !important; display:flex !important; flex-direction:column !important; gap:10px !important;\">\n                    ${visibleUbicaciones.map((u, i) => {\n                        let coordsText = '';\n                        let addressText = u.address || '';\n                        \n                        \/\/ Try to find address in GeoJSONs if not at top level\n                        if (!addressText) {\n                            const geoArr = [u.geojson_fv, u.geojson_mini_terreno, u.geojson_mini_cubierta, u.geojson];\n                            for (const g of geoArr) {\n                                if (g) {\n                                    try {\n                                        const parsed = typeof g === 'string' ? JSON.parse(g) : g;\n                                        if (parsed.features && parsed.features[0] && parsed.features[0].properties && parsed.features[0].properties.address) {\n                                            addressText = parsed.features[0].properties.address;\n                                            break;\n                                        } else if (parsed.properties && parsed.properties.address) {\n                                            addressText = parsed.properties.address;\n                                            break;\n                                        }\n                                    } catch(e) {}\n                                }\n                            }\n                        }\n\n                        const center = getCentroidFromGeoJSON(u.geojson_fv || u.geojson_mini_terreno || u.geojson_mini_cubierta || u.geojson);\n                        if (center) {\n                            coordsText = `Lat: ${center.lat.toFixed(4)}, Lng: ${center.lng.toFixed(4)}`;\n                        }\n                        \n                        const name = addressText ? addressText : (coordsText ? `${txtUbicaciones.ubicacion_label} ${i + 1}` : `${txtUbicaciones.ubicacion_label} ${i + 1}`);\n                        \n                        return `\n                        <div class=\"ubicacion-preview-item\" style=\"display:flex !important; align-items:center !important; justify-content:space-between !important; padding:12px !important; background:#f8fafc !important; border:1px solid #e2e8f0 !important; border-radius:10px !important;\">\n                            <div style=\"display:flex !important; align-items:center !important; gap:10px !important;\">\n                                <div style=\"width:32px !important; height:32px !important; background:#dcfce7 !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important;\">\n                                    <i class=\"fas ${u.tipo_instalacion && u.tipo_instalacion.includes('mini') ? 'fa-wind' : 'fa-solar-panel'}\" style=\"color:#166534 !important; font-size:14px !important;\"><\/i>\n                                <\/div>\n                                <div>\n                                    <div style=\"font-weight:600 !important; color:#1e293b !important; font-size:14px !important;\">${name}<\/div>\n                                    <div style=\"font-size:12px !important; color:#64748b !important;\">\n                                        ${(() => {\n                                            \/\/ Enhanced Subtype Display Logic\n                                            let parts = [];\n                                            const subtypes = {\n                                                'cubierta': valoresTraducidos.cubierta,\n                                                'terreno': valoresTraducidos.terreno,\n                                                'ambas': valoresTraducidos.ambas,\n                                                'no_se': valoresTraducidos.no_se\n                                            };\n\n                                            \/\/ SPECIAL CASE: fv_ampliar_mini - FV existente + Mini nueva\n                                            if (u.tipo_instalacion === 'fv_ampliar_mini') {\n                                                parts.push(valoresTraducidos.fv_ampliar_mini?.split('+')[0]?.trim() || 'FV');\n                                                if (u.ubicacion_mini) {\n                                                    parts.push(`${valoresTraducidos.minieolica}: ${subtypes[u.ubicacion_mini] || u.ubicacion_mini}`);\n                                                } else {\n                                                    parts.push(valoresTraducidos.minieolica);\n                                                }\n                                            } else {\n                                                if (u.ubicacion_mini && (u.tipo_instalacion.includes('mini') || u.tipo_instalacion === 'solo_mini')) {\n                                                    parts.push(`${valoresTraducidos.minieolica}: ${subtypes[u.ubicacion_mini] || u.ubicacion_mini}`);\n                                                }\n                                                \n                                                \/\/ CHECK FOR FV SUBTYPES (New Logic)\n                                                if (u.ubicacion_fv && (u.tipo_instalacion.includes('fv') || u.tipo_instalacion === 'solo_fv')) {\n                                                    parts.push(`${valoresTraducidos.fotovoltaica}: ${subtypes[u.ubicacion_fv] || u.ubicacion_fv}`);\n                                                } else if (u.tipo_instalacion === 'solo_fv' && !u.ubicacion_fv) {\n                                                    parts.push(valoresTraducidos.fotovoltaica);\n                                                }\n                                            }\n\n                                            \/\/ Fallback if parts empty but we have a type\n                                            if (parts.length === 0 && u.tipo_instalacion) {\n                                                const simpleMap = {\n                                                    'solo_fv': valoresTraducidos.solo_fv,\n                                                    'solo_mini': valoresTraducidos.solo_mini, \n                                                    'mini_fv': valoresTraducidos.mini_fv,\n                                                    'fv_ampliar_mini': valoresTraducidos.fv_ampliar_mini\n                                                };\n                                                parts.push(simpleMap[u.tipo_instalacion] || u.tipo_instalacion);\n                                            }\n                                            \n                                            return parts.length > 0 ? parts.join(' + ') : txtUbicaciones.sin_tipo;\n                                        })()}\n                                    <\/div>\n                                <\/div>\n                            <\/div>\n                            <span style=\"font-size:12px !important; color:#059669 !important; font-weight:600 !important; background:#ecfdf5 !important; padding:4px 8px !important; border-radius:20px !important;\">${u.completed ? txtUbicaciones.ubicacion_completa : txtUbicaciones.ubicacion_guardada}<\/span>\n                        <\/div>\n                        `;\n                    }).join('')}\n                    \n                    ${\/* Hidden items container for pagination *\/ ''}\n                    ${remaining > 0 ? `\n                        <div id=\"more-locations-container\" style=\"display:none; flex-direction:column; gap:10px;\">\n                            ${ubicaciones.slice(LIMIT).map((u, i) => {\n                                let coordsText = '';\n                                let addressText = u.address || '';\n                                \n                                \/\/ Try to find address in GeoJSONs if not at top level\n                                if (!addressText) {\n                                    const geoArr = [u.geojson_fv, u.geojson_mini_terreno, u.geojson_mini_cubierta, u.geojson];\n                                    for (const g of geoArr) {\n                                        if (g) {\n                                            try {\n                                                const parsed = typeof g === 'string' ? JSON.parse(g) : g;\n                                                if (parsed.features && parsed.features[0] && parsed.features[0].properties && parsed.features[0].properties.address) {\n                                                    addressText = parsed.features[0].properties.address;\n                                                    break;\n                                                } else if (parsed.properties && parsed.properties.address) {\n                                                    addressText = parsed.properties.address;\n                                                    break;\n                                                }\n                                            } catch(e) {}\n                                        }\n                                    }\n                                }\n\n                                const center = getCentroidFromGeoJSON(u.geojson_fv || u.geojson_mini_terreno || u.geojson_mini_cubierta || u.geojson);\n                                if (center) {\n                                    coordsText = `Lat: ${center.lat.toFixed(4)}, Lng: ${center.lng.toFixed(4)}`;\n                                }\n                                const name = addressText ? addressText : (coordsText ? `${txtUbicaciones.ubicacion_label} ${LIMIT + i + 1}` : `${txtUbicaciones.ubicacion_label} ${LIMIT + i + 1}`);\n                                return `\n                                <div class=\"ubicacion-preview-item\" style=\"display:flex !important; align-items:center !important; justify-content:space-between !important; padding:12px !important; background:#f8fafc !important; border:1px solid #e2e8f0 !important; border-radius:10px !important;\">\n                                    <div style=\"display:flex !important; align-items:center !important; gap:10px !important;\">\n                                        <div style=\"width:32px !important; height:32px !important; background:#dcfce7 !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important;\">\n                                            <i class=\"fas ${u.tipo_instalacion && u.tipo_instalacion.includes('mini') ? 'fa-wind' : 'fa-solar-panel'}\" style=\"color:#166534 !important; font-size:14px !important;\"><\/i>\n                                        <\/div>\n                                        <div>\n                                            <div style=\"font-weight:600 !important; color:#1e293b !important; font-size:14px !important;\">${name}<\/div>\n                                            <div style=\"font-size:12px !important; color:#64748b !important;\">\n                                                ${(() => {\n                                                    const tipoLabels = {\n                                                        'solo_fv': valoresTraducidos.solo_fv,\n                                                        'solo_mini': valoresTraducidos.solo_mini,\n                                                        'mini_fv': valoresTraducidos.mini_fv,\n                                                        'fv_ampliar_mini': valoresTraducidos.fv_ampliar_mini\n                                                    };\n                                                    return tipoLabels[u.tipo_instalacion] || u.tipo_instalacion || txtUbicaciones.sin_tipo;\n                                                })()}\n                                            <\/div>\n                                        <\/div>\n                                    <\/div>\n                                    <span style=\"font-size:12px !important; color:#059669 !important; font-weight:600 !important; background:#ecfdf5 !important; padding:4px 8px !important; border-radius:20px !important;\">${u.completed ? txtUbicaciones.ubicacion_completa : txtUbicaciones.ubicacion_guardada}<\/span>\n                                <\/div>\n                                `;\n                            }).join('')}\n                        <\/div>\n                        <button type=\"button\" id=\"btn-show-more-locs\" onclick=\"document.getElementById('more-locations-container').style.display='flex'; this.style.display='none';\" style=\"width:100% !important; padding:10px !important; background:#f1f5f9 !important; color:#64748b !important; border:1px dashed #cbd5e1 !important; border-radius:10px !important; font-size:13px !important; font-weight:600 !important; cursor:pointer !important; transition:all 0.2s ease !important; margin-bottom:10px !important;\">\n                            ${txtUbicaciones.mostrar_mas.replace('{n}', remaining)}\n                        <\/button>\n                    ` : ''}\n\n                    ${ubicaciones.length === 0 && currentLocation.tipo_instalacion ? `\n                        <div class=\"ubicacion-preview-item\" style=\"display:flex !important; align-items:center !important; justify-content:space-between !important; padding:12px !important; background:#f8fafc !important; border:1px solid #e2e8f0 !important; border-radius:10px !important;\">\n                            <div style=\"display:flex !important; align-items:center !important; gap:10px !important;\">\n                                <div style=\"width:32px !important; height:32px !important; background:#fff7ed !important; border-radius:50% !important; display:flex !important; align-items:center !important; justify-content:center !important;\">\n                                    <i class=\"fas fa-edit\" style=\"color:#c2410c !important; font-size:14px !important;\"><\/i>\n                                <\/div>\n                                <div>\n                                    <div style=\"font-weight:600 !important; color:#1e293b !important; font-size:14px !important;\">Ubicaci\u00f3n actual<\/div>\n                                    <div style=\"font-size:12px !important; color:#64748b !important;\">En proceso de edici\u00f3n...<\/div>\n                                <\/div>\n                            <\/div>\n                            <span style=\"font-size:12px !important; color:#d97706 !important; font-weight:600 !important; background:#fffbeb !important; padding:4px 8px !important; border-radius:20px !important;\">Pendiente<\/span>\n                        <\/div>\n                    ` : ''}\n                <\/div>\n                <button type=\"button\" class=\"btn-editar-seccion btn-ir-ubicaciones\" data-goto=\"step_3_hub\" style=\"width:100% !important; display:flex !important; align-items:center !important; justify-content:center !important; gap:10px !important; padding:14px 20px !important; background:#009239 !important; color:#fff !important; border:none !important; border-radius:10px !important; font-size:15px !important; font-weight:600 !important; cursor:pointer !important; transition:all 0.2s ease !important;\">\n                    <i class=\"fas ${btnIcono}\"><\/i>\n                    <span>${btnTexto}<\/span>\n                <\/button>\n            <\/div>\n        <\/div>\n        `;\n        wrapper.innerHTML = html;\n    }\n    function createModalIfNeeded() {\n        let modal = document.getElementById('modal-editar-contacto');\n        if (modal) {\n            setupModalEvents(modal);\n            return;\n        }\n        const t = modalTextos || {};\n        const modalHTML = `\n            <div id=\"modal-editar-contacto\" style=\"display:none; position:fixed; top:0; left:0; right:0; bottom:0; background:rgba(0,0,0,0.6); z-index:99999; justify-content:center; align-items:center; padding:20px;\">\n                <div style=\"background:#fff; border-radius:20px; max-width:500px; width:100%; max-height:90vh; overflow-y:auto; box-shadow:0 25px 50px rgba(0,0,0,0.25);\">\n                    <div style=\"background:linear-gradient(135deg, #009239 0%, #015328 100%); padding:24px; border-radius:20px 20px 0 0; display:flex; align-items:center; justify-content:space-between;\">\n                        <div style=\"display:flex; align-items:center; gap:14px;\">\n                            <div style=\"width:48px; height:48px; background:rgba(255,255,255,0.2); border-radius:50%; display:flex; align-items:center; justify-content:center;\">\n                                <i class=\"fas fa-user-edit\" style=\"font-size:22px; color:#fff;\"><\/i>\n                            <\/div>\n                            <h3 style=\"margin:0; font-size:20px; font-weight:600; color:#fff;\">${t.titulo || 'Editar datos'}<\/h3>\n                        <\/div>\n                        <button type=\"button\" id=\"modal-close-x\" style=\"width:36px; height:36px; background:rgba(255,255,255,0.2); border:none; border-radius:50%; cursor:pointer; display:flex; align-items:center; justify-content:center;\">\n                            <i class=\"fas fa-times\" style=\"font-size:16px; color:#fff;\"><\/i>\n                        <\/button>\n                    <\/div>\n                    <div style=\"padding:24px;\">\n                        <form id=\"form-editar-contacto\">\n                            <div style=\"margin-bottom:20px;\">\n                                <label style=\"display:block; font-size:14px; font-weight:600; color:#374151; margin-bottom:8px;\">\n                                    <i class=\"fas fa-user\" style=\"margin-right:8px; color:#009239;\"><\/i>${t.nombre || 'Nombre'} *\n                                <\/label>\n                                <input type=\"text\" id=\"modal-nombre\" required style=\"width:100%; padding:14px 16px; border:2px solid #e5e7eb; border-radius:12px; font-size:15px; box-sizing:border-box;\" placeholder=\"${t.nombre_placeholder || 'Tu nombre'}\">\n                            <\/div>\n                            <div style=\"margin-bottom:20px;\">\n                                <label style=\"display:block; font-size:14px; font-weight:600; color:#374151; margin-bottom:8px;\">\n                                    <i class=\"fas fa-user\" style=\"margin-right:8px; color:#009239;\"><\/i>${t.apellido || 'Apellidos'} *\n                                <\/label>\n                                <input type=\"text\" id=\"modal-apellido\" required style=\"width:100%; padding:14px 16px; border:2px solid #e5e7eb; border-radius:12px; font-size:15px; box-sizing:border-box;\" placeholder=\"${t.apellido_placeholder || 'Tus apellidos'}\">\n                            <\/div>\n                            <div style=\"margin-bottom:20px;\">\n                                <label style=\"display:block; font-size:14px; font-weight:600; color:#374151; margin-bottom:8px;\">\n                                    <i class=\"fas fa-envelope\" style=\"margin-right:8px; color:#009239;\"><\/i>${t.email || 'Email'} *\n                                <\/label>\n                                <input type=\"email\" id=\"modal-email\" required style=\"width:100%; padding:14px 16px; border:2px solid #e5e7eb; border-radius:12px; font-size:15px; box-sizing:border-box;\" placeholder=\"${t.email_placeholder || 'tu@email.com'}\">\n                            <\/div>\n                            <div style=\"margin-bottom:24px;\">\n                                <label style=\"display:block; font-size:14px; font-weight:600; color:#374151; margin-bottom:8px;\">\n                                    <i class=\"fas fa-phone\" style=\"margin-right:8px; color:#009239;\"><\/i>${t.telefono || 'Tel\u00e9fono'} <span style=\"color:#9ca3af; font-weight:400;\">(${t.opcional || 'opcional'})<\/span>\n                                <\/label>\n                                <input type=\"tel\" id=\"modal-telefono\" style=\"width:100%; padding:14px 16px; border:2px solid #e5e7eb; border-radius:12px; font-size:15px; box-sizing:border-box;\" placeholder=\"${t.telefono_placeholder || '600 000 000'}\">\n                            <\/div>\n                            <div style=\"display:flex; gap:12px; justify-content:flex-end;\">\n                                <button type=\"button\" id=\"modal-cancel-btn\" style=\"padding:12px 24px; background:#f3f4f6; color:#374151; border:none; border-radius:10px; font-size:15px; font-weight:600; cursor:pointer;\">\n                                    ${t.btn_cancelar || 'Cancelar'}\n                                <\/button>\n                                <button type=\"submit\" id=\"modal-save-btn\" style=\"padding:12px 24px; background:linear-gradient(135deg, #009239 0%, #015328 100%); color:#fff; border:none; border-radius:10px; font-size:15px; font-weight:600; cursor:pointer;\">\n                                    <i class=\"fas fa-check\" style=\"margin-right:8px;\"><\/i>${t.btn_guardar || 'Guardar'}\n                                <\/button>\n                            <\/div>\n                        <\/form>\n                    <\/div>\n                <\/div>\n            <\/div>\n        `;\n        document.body.insertAdjacentHTML('beforeend', modalHTML);\n        modal = document.getElementById('modal-editar-contacto');\n        if (modal) {\n            setupModalEvents(modal);\n        }\n    }\n    function setupModalEvents(modal) {\n        const form = document.getElementById('form-editar-contacto');\n        const closeX = document.getElementById('modal-close-x') || document.getElementById('modal-close-btn');\n        const cancelBtn = document.getElementById('modal-cancel-btn');\n        const saveBtn = document.getElementById('modal-save-btn');\n        if (closeX) closeX.onclick = closeModal;\n        if (cancelBtn) cancelBtn.onclick = closeModal;\n        modal.onclick = function(e) {\n            if (e.target === modal) closeModal();\n        };\n        if (form) {\n            form.onsubmit = function(e) {\n                e.preventDefault();\n                saveContactData();\n            };\n        }\n        if (saveBtn) {\n            saveBtn.onclick = function(e) {\n                e.preventDefault();\n                saveContactData();\n            };\n        }\n        document.addEventListener('keydown', function(e) {\n            if (e.key === 'Escape' && modal.style.display === 'flex') {\n                closeModal();\n            }\n        });\n    }\n    function openModal() {\n        const modal = document.getElementById('modal-editar-contacto');\n        if (!modal) {\n            createModalIfNeeded();\n        }\n        try {\n            const raw = localStorage.getItem('roseo_state_v2');\n            if (raw) {\n                const state = JSON.parse(raw);\n                const form = state.form || {};\n                const nombreInput = document.getElementById('modal-nombre');\n                const apellidoInput = document.getElementById('modal-apellido');\n                const emailInput = document.getElementById('modal-email');\n                const telefonoInput = document.getElementById('modal-telefono');\n                if (nombreInput) nombreInput.value = form.nombre || '';\n                if (apellidoInput) apellidoInput.value = form.apellido || '';\n                if (emailInput) emailInput.value = form.email || '';\n                if (telefonoInput) telefonoInput.value = form.telefono || '';\n            }\n        } catch(e) {\n        }\n        const modalEl = document.getElementById('modal-editar-contacto');\n        if (modalEl) {\n            modalEl.style.display = 'flex';\n            const nombreInput = document.getElementById('modal-nombre');\n            if (nombreInput) setTimeout(() => nombreInput.focus(), 100);\n        }\n    }\n    function closeModal() {\n        const modal = document.getElementById('modal-editar-contacto');\n        if (modal) modal.style.display = 'none';\n    }\n    function saveContactData() {\n        const nombre = document.getElementById('modal-nombre')?.value?.trim() || '';\n        const apellido = document.getElementById('modal-apellido')?.value?.trim() || '';\n        const email = document.getElementById('modal-email')?.value?.trim() || '';\n        const telefono = document.getElementById('modal-telefono')?.value?.trim() || '';\n        if (!nombre || !apellido || !email) {\n            alert('Por favor, completa todos los campos obligatorios');\n            return;\n        }\n        if (!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(email)) {\n            alert('Por favor, introduce un email v\u00e1lido');\n            return;\n        }\n        try {\n            const raw = localStorage.getItem('roseo_state_v2');\n            if (raw) {\n                const state = JSON.parse(raw);\n                state.form = state.form || {};\n                state.form.nombre = nombre;\n                state.form.apellido = apellido;\n                state.form.email = email;\n                state.form.telefono = telefono;\n                localStorage.setItem('roseo_state_v2', JSON.stringify(state));\n            }\n        } catch(e) {\n        }\n        if (window.RoseoStateV2) {\n            window.RoseoStateV2.setFormData('nombre', nombre);\n            window.RoseoStateV2.setFormData('apellido', apellido);\n            window.RoseoStateV2.setFormData('email', email);\n            window.RoseoStateV2.setFormData('telefono', telefono);\n        }\n        closeModal();\n        fillStep5FromStorage();\n        showToast('Datos actualizados correctamente', 'success');\n    }\n    function setupEditButtons() {\n        document.querySelectorAll('.btn-editar-seccion').forEach(btn => {\n            btn.addEventListener('click', function() {\n                let targetStep = this.getAttribute('data-goto');\n                if (targetStep === 'step_1_1') {\n                    openModal();\n                    return;\n                }\n                if (targetStep === 'step_2') {\n                    try {\n                        const raw = localStorage.getItem('roseo_state_v2');\n                        if (raw) {\n                            const state = JSON.parse(raw);\n                            const numUbicaciones = state.form?.numero_ubicaciones || 'unica';\n                            if (numUbicaciones === 'varias') {\n                                targetStep = 'step_3_hub';\n                            } else if (numUbicaciones === 'unica') {\n                                targetStep = 'step_3_item';\n                                if (window.RoseoStateV2?.editLocation) {\n                                    window.RoseoStateV2.editLocation(0);\n                                }\n                            }\n                        }\n                    } catch(e) {}\n                }\n                if (targetStep && window.RoseoStateV2) {\n                    window.RoseoStateV2.gotoStep(targetStep);\n                }\n            });\n        });\n    }\n    function setupCheckboxes() {\n        document.querySelectorAll('.legal-checkbox input').forEach(checkbox => {\n            \/\/ Evitar a\u00f1adir listeners duplicados\n            if (checkbox.dataset.listenerAttached) return;\n            checkbox.dataset.listenerAttached = 'true';\n            \n            checkbox.addEventListener('change', function() {\n                const label = this.closest('.legal-checkbox');\n                if (this.checked) {\n                    label.classList.remove('error');\n                }\n                \/\/ Save checkbox state to RoseoStateV2\n                if (window.RoseoStateV2 && this.id) {\n                    window.RoseoStateV2.setFormData(this.id, this.checked);\n                }\n            });\n        });\n    }\n    function showToast(message, type) {\n        const existingToast = document.querySelector('.roseo-toast');\n        if (existingToast) existingToast.remove();\n        const toast = document.createElement('div');\n        toast.className = 'roseo-toast';\n        toast.innerHTML = `<i class=\"fas fa-${type === 'success' ? 'check-circle' : 'exclamation-circle'}\" style=\"margin-right:10px;\"><\/i>${message}`;\n        toast.style.cssText = `\n            position:fixed; bottom:30px; right:30px; \n            background:${type === 'success' ? 'linear-gradient(135deg, #009239 0%, #015328 100%)' : '#ef4444'}; \n            color:white; padding:16px 24px; border-radius:12px; \n            box-shadow:0 4px 20px rgba(0,0,0,0.2); z-index:100000;\n            font-size:14px; font-weight:500; max-width:400px;\n        `;\n        document.body.appendChild(toast);\n        setTimeout(() => toast.remove(), 3000);\n    }\n    function initStep5() {\n        debugLog('initStep5() ejecutando...');\n        const tipoClienteEl = document.getElementById('resumen-tipo-cliente');\n        const nombreEl = document.getElementById('resumen-nombre');\n        debugLog('resumen-tipo-cliente: ' + (tipoClienteEl ? 'EXISTE' : 'NO'));\n        debugLog('resumen-nombre: ' + (nombreEl ? 'EXISTE' : 'NO'));\n        if (!tipoClienteEl) {\n            debugLog('\u274c Elementos no encontrados!');\n            return;\n        }\n        fillStep5FromStorage();\n        createModalIfNeeded();\n        setupEditButtons();\n        setupCheckboxes();\n        setTimeout(() => {\n            document.querySelectorAll('.resumen-card-body .resumen-value').forEach(el => {\n                el.style.display = 'inline';\n                el.style.visibility = 'visible';\n                el.style.opacity = '1';\n            });\n            debugLog('Forzada visibilidad .resumen-value');\n        }, 100);\n    }\n    window.openContactModal = openModal;\n    window.closeContactModal = closeModal;\n    window.Step5Init = initStep5;\n    window.Step5Refresh = fillStep5FromStorage;\n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', initStep5);\n    } else {\n        initStep5();\n    }\n    setTimeout(initStep5, 500);\n    if (typeof jQuery !== 'undefined') {\n        jQuery(document).on('roseo:step-changed', function(e, detail) {\n            if (detail && (detail.current_state === 'step_5' || detail.step_number === 5)) {\n                setTimeout(initStep5, 100);\n            }\n        });\n    }\n    const step5Container = document.getElementById('step-5');\n    if (step5Container) {\n        const observer = new MutationObserver(function(mutations) {\n            mutations.forEach(function(mutation) {\n                if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n                    if (step5Container.classList.contains('active')) {\n                        setTimeout(initStep5, 100);\n                    }\n                }\n            });\n        });\n        observer.observe(step5Container, { attributes: true });\n    }\n    window.Step5Validate = function() {\n        let valid = true;\n        document.querySelectorAll('.legal-checkbox input[data-required=\"true\"]').forEach(checkbox => {\n            const label = checkbox.closest('.legal-checkbox');\n            if (!checkbox.checked) {\n                label.classList.add('error');\n                valid = false;\n            } else {\n                label.classList.remove('error');\n            }\n        });\n        return valid;\n    };\n})();\n<\/script>\n    <\/div>\n    \n    <!-- COMPLETED: Confirmaci\u00f3n -->\n    <div id=\"step-completed\" class=\"roseo-step\" data-state=\"completed\" style=\"display:none !important;\">\n        <div class=\"roseo-step-completed\">\n    <div class=\"success-animation\">\n        <div class=\"success-icon\">\n            <i class=\"fas fa-check-circle\"><\/i>\n        <\/div>\n    <\/div>\n    <div class=\"success-content\">\n        <h2 class=\"success-title\">Request Submitted!<\/h2>\n        <p class=\"success-subtitle\">We have received your request successfully<\/p>\n        <p class=\"success-message\">\n            Our team of engineers will review your project and contact you within 24-48 hours.        <\/p>\n        <div class=\"success-que-sigue\">\n            <h3>What happens now?<\/h3>\n            <ul class=\"success-pasos\">\n                                <li>\n                    <span class=\"paso-numero\">1<\/span>\n                    <span class=\"paso-texto\">You will receive a confirmation email with your request details.<\/span>\n                <\/li>\n                                <li>\n                    <span class=\"paso-numero\">2<\/span>\n                    <span class=\"paso-texto\">A specialist engineer will analyze your project.<\/span>\n                <\/li>\n                                <li>\n                    <span class=\"paso-numero\">3<\/span>\n                    <span class=\"paso-texto\">We will contact you for an initial consultation with no obligation.<\/span>\n                <\/li>\n                                <li>\n                    <span class=\"paso-numero\">4<\/span>\n                    <span class=\"paso-texto\">You will receive a personalized quote.<\/span>\n                <\/li>\n                            <\/ul>\n        <\/div>\n        <p class=\"success-gracias\">Thank you for trusting us!<\/p>\n        <div class=\"success-actions\">\n            <a href=\"\/\" class=\"btn-success-home\" onclick=\"clearFormState()\">\n                <i class=\"fas fa-home\"><\/i>\n                <span>Back to home<\/span>\n            <\/a>\n        <\/div>\n    <\/div>\n<\/div>\n<script>\n\/**\n * Limpiar estado del formulario al volver al inicio\n *\/\nif (typeof window.clearFormState === 'undefined') {\n    window.clearFormState = function() {\n        if (window.RoseoStateV2 && typeof window.RoseoStateV2.resetState === 'function') {\n            window.RoseoStateV2.resetState(false);\n        }\n        localStorage.removeItem('roseo_state_v2');\n        localStorage.removeItem('roseo_state');\n        localStorage.removeItem('roseo_form_data');\n        document.cookie = 'roseo_current_step=; path=\/; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n        document.cookie = 'roseo_form_started=; path=\/; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n        return true; \/\/ Permitir que el enlace navegue\n    };\n}\n\n\/**\n * Ocultar footer en step completed - se ejecuta inmediatamente y de forma agresiva\n *\/\n(function() {\n    function hideFooterOnCompleted() {\n        \/\/ Ocultar footer de m\u00faltiples formas para garantizar que funcione\n        const footer = document.getElementById('roseo-footer-nav');\n        const footerContainer = document.getElementById('roseo-footer-container');\n        \n        if (footer) {\n            footer.style.display = 'none';\n            footer.style.visibility = 'hidden';\n            footer.classList.add('roseo-footer-hidden');\n        }\n        if (footerContainer) {\n            footerContainer.style.display = 'none';\n            footerContainer.style.visibility = 'hidden';\n        }\n        \n        \/\/ Tambi\u00e9n a\u00f1adir clase al body para CSS\n        document.body.classList.add('roseo-completed');\n        \n        \/\/ Usar jQuery si est\u00e1 disponible\n        if (typeof jQuery !== 'undefined') {\n            jQuery('#roseo-footer-nav, #roseo-footer-container').hide();\n        }\n    }\n    \n    \/\/ Ejecutar inmediatamente\n    hideFooterOnCompleted();\n    \n    \/\/ Tambi\u00e9n ejecutar en DOMContentLoaded\n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', hideFooterOnCompleted);\n    } else {\n        \/\/ DOM ya est\u00e1 listo, ejecutar de nuevo por si acaso\n        setTimeout(hideFooterOnCompleted, 50);\n        setTimeout(hideFooterOnCompleted, 200);\n    }\n    \n    \/\/ Watchdog: verificar cada 500ms por 3 segundos\n    let watchdogCount = 0;\n    const watchdog = setInterval(function() {\n        hideFooterOnCompleted();\n        watchdogCount++;\n        if (watchdogCount >= 6) {\n            clearInterval(watchdog);\n        }\n    }, 500);\n    \n    \/\/ Actualizar t\u00edtulo del header\n    const headerTitle = document.querySelector('.roseo-header-title');\n    if (headerTitle) {\n        headerTitle.textContent = 'Request Submitted!';\n    }\n})();\n<\/script>\n    <\/div>\n    \n<\/div>\n\n                <\/div>\n                \n                <div id=\"roseo-footer-container\" class=\"roseo-form-hidden\">\n                    \n<div class=\"roseo-footer-navigation\" id=\"roseo-footer-nav\">\n    <button type=\"button\" class=\"roseo-btn roseo-btn-back\" id=\"btn-prev-step\">\n        <i class=\"fa-solid fa-arrow-left\"><\/i>\n        <span>Previous<\/span>\n    <\/button>\n    <button type=\"button\" class=\"roseo-btn roseo-btn-next\" id=\"btn-next-step\"\n            data-text-next=\"Continue\"\n            data-text-submit=\"Submit Request\"\n            data-icon-next=\"fa-solid fa-arrow-right\"\n            data-icon-submit=\"fa-solid fa-paper-plane\">\n        <span>Continue<\/span>\n        <i class=\"fa-solid fa-arrow-right\"><\/i>\n    <\/button>\n<\/div>\n                <\/div>\n            <\/form>\n            \n                    <script>\n        \/**\n         * Configuraci\u00f3n del Router de Roseo Form\n         * Generado autom\u00e1ticamente por el State Machine PHP\n         *\/\n        window.RoseoRouterConfig = {\n    \"routes\": [\n        \"step_1\",\n        \"step_1_1\",\n        \"step_2\",\n        \"step_3\",\n        \"step_3_item\",\n        \"step_3_hub\",\n        \"step_3_municipal\",\n        \"step_3_supramunicipal\",\n        \"step_4\",\n        \"step_5\",\n        \"completed\"\n    ],\n    \"currentState\": \"step_1\",\n    \"currentIndex\": 0,\n    \"formData\": [],\n    \"completedSteps\": []\n};\n        \n        <\/script>\n                    \n            <!-- Font Awesome loader fallback -->\n            <script>\n            (function() {\n                \/\/ Check if Font Awesome is loaded by testing a known icon\n                function checkFA() {\n                    var testI = document.createElement('i');\n                    testI.className = 'fas fa-check';\n                    testI.style.cssText = 'position:absolute;left:-9999px;';\n                    document.body.appendChild(testI);\n                    var computed = window.getComputedStyle(testI, ':before');\n                    var content = computed.getPropertyValue('content');\n                    document.body.removeChild(testI);\n                    \/\/ Font Awesome sets content to a unicode character\n                    return content && content !== 'none' && content !== '';\n                }\n                \n                function loadFA() {\n                    if (checkFA()) {\n                        return;\n                    }\n                    \/\/ Font Awesome not detected, loading fallback\n                    var link = document.createElement('link');\n                    link.rel = 'stylesheet';\n                    link.href = 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.5.1\/css\/all.min.css';\n                    link.crossOrigin = 'anonymous';\n                    document.head.appendChild(link);\n                }\n                \n                \/\/ Check after DOM ready and after a delay\n                if (document.readyState === 'complete') {\n                    setTimeout(loadFA, 100);\n                } else {\n                    window.addEventListener('load', function() {\n                        setTimeout(loadFA, 100);\n                    });\n                }\n            })();\n            <\/script>\n            \n        <\/div>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>INFORME Descubre m\u00e1s Cu\u00e9ntanos tu Proyecto Completa el siguiente formulario para que podamos analizar tu consulta detalladamente. Nuestro equipo t\u00e9cnico se pondr\u00e1 en contacto contigo a la mayor brevedad para ofrecerte la mejor soluci\u00f3n.<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-6661","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Pide tu informe | Roseo E\u00f3lica Urbana<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/roseo.es\/en\/informe\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pide tu informe | Roseo E\u00f3lica Urbana\" \/>\n<meta property=\"og:description\" content=\"INFORME Descubre m\u00e1s Cu\u00e9ntanos tu Proyecto Completa el siguiente formulario para que podamos analizar tu consulta detalladamente. Nuestro equipo t\u00e9cnico se pondr\u00e1 en contacto contigo a la mayor brevedad para ofrecerte la mejor soluci\u00f3n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/roseo.es\/en\/informe\/\" \/>\n<meta property=\"og:site_name\" content=\"Roseo\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-21T12:04:52+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/roseo.es\\\/informe\\\/\",\"url\":\"https:\\\/\\\/roseo.es\\\/informe\\\/\",\"name\":\"Pide tu informe | Roseo E\u00f3lica Urbana\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/roseo.es\\\/#website\"},\"datePublished\":\"2026-01-07T16:01:10+00:00\",\"dateModified\":\"2026-01-21T12:04:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/roseo.es\\\/informe\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/roseo.es\\\/informe\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/roseo.es\\\/informe\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/roseo.es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Informe\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/roseo.es\\\/#website\",\"url\":\"https:\\\/\\\/roseo.es\\\/\",\"name\":\"Roseo E\u00f3lica Urbana\",\"description\":\"Expertos en an\u00e1lisis de datos e\u00f3licos y autoconsumo\",\"publisher\":{\"@id\":\"https:\\\/\\\/roseo.es\\\/#organization\"},\"alternateName\":\"Roseo\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/roseo.es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/roseo.es\\\/#organization\",\"name\":\"Roseo E\u00f3lica Urbana S.L.\",\"alternateName\":\"Roseo E\u00f3lica Urbana\",\"url\":\"https:\\\/\\\/roseo.es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/roseo.es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/roseo.es\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/Logo-Roseo-Green.webp\",\"contentUrl\":\"https:\\\/\\\/roseo.es\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/Logo-Roseo-Green.webp\",\"width\":800,\"height\":215,\"caption\":\"Roseo E\u00f3lica Urbana S.L.\"},\"image\":{\"@id\":\"https:\\\/\\\/roseo.es\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Pide tu informe | Roseo E\u00f3lica Urbana","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/roseo.es\/en\/informe\/","og_locale":"en_US","og_type":"article","og_title":"Pide tu informe | Roseo E\u00f3lica Urbana","og_description":"INFORME Descubre m\u00e1s Cu\u00e9ntanos tu Proyecto Completa el siguiente formulario para que podamos analizar tu consulta detalladamente. Nuestro equipo t\u00e9cnico se pondr\u00e1 en contacto contigo a la mayor brevedad para ofrecerte la mejor soluci\u00f3n.","og_url":"https:\/\/roseo.es\/en\/informe\/","og_site_name":"Roseo","article_modified_time":"2026-01-21T12:04:52+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/roseo.es\/informe\/","url":"https:\/\/roseo.es\/informe\/","name":"Pide tu informe | Roseo E\u00f3lica Urbana","isPartOf":{"@id":"https:\/\/roseo.es\/#website"},"datePublished":"2026-01-07T16:01:10+00:00","dateModified":"2026-01-21T12:04:52+00:00","breadcrumb":{"@id":"https:\/\/roseo.es\/informe\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/roseo.es\/informe\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/roseo.es\/informe\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/roseo.es\/"},{"@type":"ListItem","position":2,"name":"Informe"}]},{"@type":"WebSite","@id":"https:\/\/roseo.es\/#website","url":"https:\/\/roseo.es\/","name":"Roseo E\u00f3lica Urbana","description":"Expertos en an\u00e1lisis de datos e\u00f3licos y autoconsumo","publisher":{"@id":"https:\/\/roseo.es\/#organization"},"alternateName":"Roseo","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/roseo.es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/roseo.es\/#organization","name":"Roseo E\u00f3lica Urbana S.L.","alternateName":"Roseo E\u00f3lica Urbana","url":"https:\/\/roseo.es\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/roseo.es\/#\/schema\/logo\/image\/","url":"https:\/\/roseo.es\/wp-content\/uploads\/2025\/12\/Logo-Roseo-Green.webp","contentUrl":"https:\/\/roseo.es\/wp-content\/uploads\/2025\/12\/Logo-Roseo-Green.webp","width":800,"height":215,"caption":"Roseo E\u00f3lica Urbana S.L."},"image":{"@id":"https:\/\/roseo.es\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/roseo.es\/en\/wp-json\/wp\/v2\/pages\/6661","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/roseo.es\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/roseo.es\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/roseo.es\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/roseo.es\/en\/wp-json\/wp\/v2\/comments?post=6661"}],"version-history":[{"count":55,"href":"https:\/\/roseo.es\/en\/wp-json\/wp\/v2\/pages\/6661\/revisions"}],"predecessor-version":[{"id":7001,"href":"https:\/\/roseo.es\/en\/wp-json\/wp\/v2\/pages\/6661\/revisions\/7001"}],"wp:attachment":[{"href":"https:\/\/roseo.es\/en\/wp-json\/wp\/v2\/media?parent=6661"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}