{"id":16013,"date":"2026-04-02T07:41:24","date_gmt":"2026-04-02T02:41:24","guid":{"rendered":"http:\/\/hobbi.st\/?page_id=16013"},"modified":"2026-04-05T11:30:29","modified_gmt":"2026-04-05T06:30:29","slug":"ozgeris","status":"publish","type":"page","link":"https:\/\/emirat.hobbi.st\/ru\/","title":{"rendered":"ozgeris"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"16013\" class=\"elementor elementor-16013\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-305e1c6 e-flex e-con-boxed e-con e-parent\" data-id=\"305e1c6\" 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-61e861d elementor-widget elementor-widget-shortcode\" data-id=\"61e861d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">    <script>\n        \/\/ If the dashboard was loaded inside another dashboard iframe (e.g. after standard login redirect), break out.\n        (function() {\n            try {\n                if (window.self !== window.top && !\/[?&]ozg_iframe=1\/.test(window.location.search)) {\n                    window.top.location.replace(window.location.href);\n                }\n            } catch (e) {}\n        })();\n    <\/script>\n    <script src=\"https:\/\/telegram.org\/js\/telegram-web-app.js\"><\/script>\n    <script>\n        \/\/ Immediate TMA initialization to prevent stuck loading screen\n        (function() {\n            var tg = window.Telegram ? window.Telegram.WebApp : null;\n            if (tg) {\n                tg.ready();\n                tg.expand();\n                try { if (tg.disableVerticalSwipes) tg.disableVerticalSwipes(); } catch(e) {}\n            }\n        })();\n    <\/script>\n    <script>\n        \/\/ High priority Mini App startup (Executed before style\/HTML parsing completes)\n        (function() {\n            window.ozgOpenHappyOverlay = function() {\n                var overlay = document.getElementById('ozgHappyOverlay');\n                if (overlay) {\n                    overlay.classList.add('show');\n                    return true;\n                }\n                return false;\n            };\n        })();\n\n        function ozgOpenTrophyManually(e) {\n            if (e) {\n                e.preventDefault();\n                e.stopPropagation();\n            }\n            const popupId = e.currentTarget ? e.currentTarget.getAttribute('data-elementor-popup-id') : '15938';\n            if (popupId && typeof elementorFrontend !== 'undefined' && elementorFrontend.documentsManager) {\n                const popup = elementorFrontend.documentsManager.documents[popupId];\n                if (popup) popup.showModal();\n            }\n        }\n    <\/script>\n    <style>\n        \/* Base Reset & Variables *\/\n        header#masthead, footer#colophon, .site-header, .site-footer, .entry-header { display: none !important; }\n        .site-content, .site-inner, .entry-content, .ast-container, .container, #page, .site, #wrapper, .elementor, .elementor-page { padding: 0 !important; margin: 0 !important; max-width: 100% !important; width: 100% !important; border: none !important; overflow-x: clip !important; overflow-y: visible !important; box-sizing: border-box !important; }\n        html, body { overflow-x: clip !important; margin: 0 !important; padding: 0 !important; width: 100% !important; max-width: 100% !important; box-sizing: border-box !important; }\n        body { background-color: #05070f !important; }\n        .ozgeris-dashboard-wrapper { --bg-color: #05070f; --glass-bg: rgba(255, 255, 255, 0.03); --glass-border: rgba(255, 255, 255, 0.08); --accent-cyan: #00f0ff; --accent-purple: #8a2be2; --warning-color: #ff3366; --success-color: #00e676; --text-main: #ffffff; --text-muted: #8b9bb4; --tg-color: #2AABEE; background-color: var(--bg-color); color: var(--text-main); font-family: 'Inter', sans-serif; position: relative; min-height: 100vh; width: 100% !important; max-width: 100% !important; overflow-x: clip !important; box-sizing: border-box !important; }\n        .ozgeris-dashboard-wrapper * { box-sizing: border-box !important; max-width: 100%; }\n        .ozg-bg-glow-1 { position: fixed; top: -10%; left: -10%; width: 300px; height: 300px; background: radial-gradient(circle, rgba(0, 240, 255, 0.15) 0%, rgba(0,0,0,0) 70%); filter: blur(60px); z-index: 0; pointer-events: none; }\n        .ozg-bg-glow-2 { position: fixed; bottom: -10%; right: -10%; width: 300px; height: 300px; background: radial-gradient(circle, rgba(138, 43, 226, 0.15) 0%, rgba(0,0,0,0) 70%); filter: blur(60px); z-index: 0; pointer-events: none; }\n\n        \/* Game Header Styles *\/\n        .ozg-header-panel { position: fixed; top: 0; left: 0; right: 0; width: 100%; z-index: 1000; background: rgba(5, 7, 15, 0.85); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border-bottom: 1px solid var(--glass-border); padding: 12px 20px; display: flex; flex-direction: column; gap: 10px; pointer-events: none; transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); will-change: transform; }\n        .ozg-header-hidden { transform: translateY(-100%) !important; }\n        .ozg-header-panel * { pointer-events: auto; }\n        .ozg-header-main { display: flex; justify-content: space-between; align-items: center; width: 100%; max-width: 1440px; margin: 0 auto; gap: 10px; }\n        .ozg-profile-header { display: flex; align-items: center; gap: 12px; text-decoration: none !important; color: #fff; transition: 0.2s; }\n        .ozg-profile-header:hover { opacity: 0.8; }\n        .ozg-profile-header img { width: 40px; height: 40px; border-radius: 50%; border: 2px solid var(--accent-purple); object-fit: cover; }\n        .ozg-profile-header-info { display: flex; flex-direction: column; justify-content: center; }\n        .ozg-profile-name { font-weight: 700; font-size: 0.95rem; color: var(--success-color); line-height: 1.2; }\n        .ozg-profile-trophy { font-size: 0.8rem; color: #fbbf24; display: flex; align-items: center; gap: 4px; margin-top: 2px; font-weight: 600; }\n        .ozg-trophy-button { background: transparent; padding: 0; margin: 0; border: none; text-decoration: none; color: #fbbf24; font-weight: 600; cursor: pointer; display: inline-flex; align-items: center; gap: 2px; }\n        .ozg-trophy-button:hover { text-decoration: underline; }\n        .ozg-trophy-button:active { transform: scale(0.95); opacity: 0.8; }\n        .ozg-header-resources { display: flex; gap: 12px; align-items: center; justify-content: center; flex-wrap: wrap; }\n        .ozg-resource-item { display: flex; align-items: center; gap: 6px; background: rgba(255,255,255,0.05); padding: 6px 12px; border-radius: 12px; color: #fff !important; font-size: 0.9rem; font-weight: 600; text-decoration: none !important; border: 1px solid rgba(255,255,255,0.05); transition: 0.2s; }\n        .ozg-resource-item:hover { background: rgba(255,255,255,0.1); border-color: var(--glass-border); transform: translateY(-1px); }\n        .ozg-header-menu-btn { background: none; border: none; color: #fff; cursor: pointer; padding: 8px; border-radius: 8px; display: flex; align-items: center; justify-content: center; transition: 0.2s; }\n        .ozg-header-menu-btn:hover { background: rgba(255,255,255,0.1); color: var(--accent-cyan); }\n        .ozg-header-expanded { display: flex; justify-content: space-between; align-items: flex-start; padding-top: 12px; border-top: 1px solid var(--glass-border); max-width: 1440px; margin: 0 auto; width: 100%; animation: ozgFadeDown 0.3s ease forwards; }\n        .ozg-rank-badge { background: #fbbf24; color: #000 !important; padding: 6px 16px; border-radius: 20px; font-weight: 800; font-size: 0.9rem; text-decoration: none !important; box-shadow: 0 4px 15px rgba(251, 191, 36, 0.3); height: fit-content; transition: 0.2s; }\n        .ozg-rank-badge:hover { transform: scale(1.05); }\n        .ozg-header-actions { display: flex; flex-direction: column; gap: 8px; align-items: flex-end; }\n        .ozg-action-btn { display: flex; align-items: center; gap: 8px; background: rgba(255,255,255,0.05); border: 1px solid var(--glass-border); padding: 8px 16px; border-radius: 12px; color: #fff !important; font-size: 0.85rem; font-weight: 500; text-decoration: none !important; width: 140px; transition: 0.2s; }\n        .ozg-action-btn:hover { background: rgba(255,255,255,0.1); border-color: var(--accent-cyan); color: var(--accent-cyan) !important; }\n        .ozg-icon-action-btn { display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 50%; background: var(--glass-bg); color: #fff !important; text-decoration: none !important; border: 1px solid var(--glass-border); transition: 0.2s; }\n        .ozg-icon-action-btn:hover { background: var(--accent-purple); border-color: var(--accent-purple); transform: translateY(-2px); }\n        .ozg-toast { position: fixed; top: 80px; left: 50%; transform: translateX(-50%); background: rgba(0, 240, 255, 0.1); border: 1px solid var(--accent-cyan); color: #fff; padding: 12px 24px; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.5); font-size: 0.9rem; z-index: 2147483647; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; backdrop-filter: blur(10px); }\n        @keyframes ozgFadeDown { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } }\n\n        \/* Layout *\/\n        .ozg-layout { display: grid; grid-template-columns: 280px 1fr; gap: 30px; max-width: 1440px; margin: 0 auto; padding: 80px 20px 120px 20px; position: relative; z-index: 1; width: 100%; box-sizing: border-box; transition: all 0.3s ease; --header-h: 70px; }\n        @media (max-width: 900px) {\n            .ozg-layout { padding-top: 70px !important; padding-left: 10px !important; padding-right: 10px !important; gap: 15px; }\n            .ozg-section { padding-top: 0 !important; }\n        }\n        .ozg-main { min-width: 0; width: 100%; }\n        .ozg-glass { background: var(--glass-bg); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border: 1px solid var(--glass-border); border-radius: 24px; padding: 24px; }\n        .ozg-section { display: none; animation: fadeIn 0.4s ease; width: 100%; padding-top: 8px; } .ozg-section.active { display: block; }\n        @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }\n\n        \/* Sidebar Navigation *\/\n        .ozg-sidebar { display: flex; flex-direction: column; gap: 32px; position: sticky; top: 100px; height: max-content; z-index: 10; }\n        .ozg-nav-link { display: flex; align-items: center; gap: 12px; padding: 14px 20px; color: var(--text-muted); text-decoration: none; border-radius: 14px; font-weight: 500; transition: all 0.3s; border: 1px solid transparent; background: transparent; cursor: pointer; text-align: left; width: 100%; font-size: 1rem; }\n        .ozg-nav-link:hover { color: #fff; background: rgba(255,255,255,0.02); border-color: rgba(255,255,255,0.05); }\n        .ozg-nav-link.active { color: #fff; background: rgba(0, 240, 255, 0.05); border-color: rgba(0, 240, 255, 0.2); box-shadow: 0 0 20px rgba(0, 240, 255, 0.1); }\n\n        \/* Buttons & Inputs *\/\n        .ozg-btn { background: linear-gradient(135deg, #00f0ff, #0080ff); border: none; padding: 12px 24px; border-radius: 12px; color: #000; font-weight: 700; cursor: pointer; display: inline-flex; align-items: center; gap: 8px; transition: 0.3s; box-shadow: 0 4px 15px rgba(0,240,255,0.3); text-decoration: none; }\n        .ozg-btn:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(0,240,255,0.4); }\n        .ozg-btn-sec { background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); padding: 12px 24px; border-radius: 12px; color: #fff; font-weight: 600; cursor: pointer; display: inline-flex; align-items: center; gap: 8px; transition: 0.3s; }\n        .ozg-btn-sec:hover { background: rgba(255,255,255,0.1); border-color: var(--accent-cyan); }\n        .ozg-icon-btn { background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); color: #fff; width: 36px; height: 36px; border-radius: 10px; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; transition: 0.2s; }\n        .ozg-icon-btn:hover { background: rgba(255,255,255,0.1); border-color: var(--accent-cyan); color: var(--accent-cyan); }\n        .ozg-icon-btn.danger:hover { border-color: var(--warning-color); color: var(--warning-color); }\n        .ozg-btn-tg { background: var(--tg-color); color: #fff; border: none; padding: 8px 16px; border-radius: 12px; font-weight: 600; text-decoration: none; display: inline-flex; align-items: center; gap: 6px; transition: 0.3s; }\n        .ozg-btn-tg:hover { background: #1b9de0; transform: translateY(-2px); color: #fff; }\n               .ozg-input { width: 100%; background: rgba(0,0,0,0.2); border: 1px solid var(--glass-border); color: #fff; padding: 12px 16px; border-radius: 12px; outline: none; transition: 0.3s; font-family: inherit; margin-bottom: 16px; }\n        .ozg-input:focus { border-color: var(--accent-cyan); box-shadow: 0 0 10px rgba(0,240,255,0.1); }\n\n        \/* Quiz & Cards *\/\n        .q-view { display: none; flex-direction: column; opacity: 0; transition: opacity 0.4s; }\n        .q-view.active { display: flex; opacity: 1; }\n        .rating-btn { background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); width: 50px; height: 50px; border-radius: 14px; color: #fff; font-size: 1.2rem; font-weight: 700; cursor: pointer; transition: 0.2s; }\n        .rating-btn:hover { background: rgba(255,255,255,0.1); transform: scale(1.05); }\n        .rating-btn.selected { background: var(--active-color); border-color: var(--active-color); color: #000; box-shadow: 0 0 15px var(--active-color); transform: scale(1.1); }\n        .sphere-chip { background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); border-radius: 12px; padding: 16px; cursor: pointer; position: relative; overflow: hidden; transition: 0.3s; }\n        .sphere-chip:hover:not(.locked) { border-color: var(--glass-border); background: rgba(255,255,255,0.08); transform: translateY(-2px); }\n        .sphere-chip.selected { border-color: var(--accent-cyan); box-shadow: 0 0 15px rgba(0,240,255,0.2); }\n        .sphere-chip.locked { opacity: 0.6; cursor: not-allowed; border-color: rgba(255,255,255,0.05); }\n        .sphere-fill { position: absolute; top: 0; left: 0; bottom: 0; opacity: 0; transition: opacity 0.5s ease-in-out, width 1s ease-in-out; z-index: 0; }\n        .sphere-content { position: relative; z-index: 1; display: flex; justify-content: space-between; align-items: center; }\n\n        \/* Track & Nodes *\/\n        .ozg-skill-node { display: flex; align-items: center; gap: 16px; background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.1); padding: 16px; border-radius: 16px; transition: 0.3s; position: relative; z-index: 2; }\n        .ozg-skill-node:hover:not(.ozg-skill-locked) { border-color: var(--accent-purple); transform: translateY(-2px); background: rgba(255,255,255,0.05); }\n        .ozg-skill-node.completed { border-color: var(--success-color); background: rgba(0,230,118,0.05); }\n        .ozg-skill-node.completed .ozg-node-icon { background: var(--success-color); color: #000; }\n        .ozg-node-icon { width: 48px; height: 48px; border-radius: 12px; background: rgba(255,255,255,0.05); display: flex; align-items: center; justify-content: center; color: var(--text-muted); transition: 0.3s; }\n        .ozg-tree-connector { width: 2px; height: 30px; background: rgba(255,255,255,0.1); margin: 0 auto; transition: 0.3s; }\n        .ozg-tree-connector.unlocked { background: var(--accent-cyan); box-shadow: 0 0 10px var(--accent-cyan); }\n        .ozg-skill-locked { opacity: 0.5; filter: grayscale(1); }\n        .ozg-lock-overlay { position: absolute; inset: 0; background: rgba(0,0,0,0.6); backdrop-filter: blur(2px); border-radius: 16px; display: flex; flex-direction: column; align-items: center; justify-content: center; color: #fff; font-size: 0.8rem; font-weight: 600; z-index: 10; gap: 4px; }\n\n        .ozg-habit-card { display: flex; align-items: center; gap: 12px; background: rgba(255,255,255,0.02); padding: 12px 16px; border-radius: 12px; margin-bottom: 8px; cursor: pointer; transition: 0.2s; border: 1px solid transparent; }\n        .ozg-habit-card:hover { background: rgba(255,255,255,0.04); border-color: rgba(255,255,255,0.05); }\n        .ozg-habit-card.completed { background: rgba(0,230,118,0.05); border-color: rgba(0,230,118,0.2); }\n        .ozg-habit-check { width: 20px; height: 20px; border-radius: 6px; border: 2px solid var(--text-muted); display: flex; align-items: center; justify-content: center; transition: 0.2s; }\n        .ozg-habit-card.completed .ozg-habit-check { background: var(--success-color); border-color: var(--success-color); }\n        .ozg-habit-card.completed .ozg-habit-check::after { content: '\u2713'; color: #000; font-size: 14px; font-weight: bold; }\n        .ozg-habit-card.completed .ozg-habit-title { color: var(--success-color) !important; text-decoration: line-through; opacity: 0.8; }\n\n        .ozg-milestone { display: flex; gap: 16px; position: relative; margin-bottom: 16px; }\n        .ozg-milestone::before { content: ''; position: absolute; left: 7px; top: 20px; bottom: -16px; width: 2px; background: rgba(255,255,255,0.1); }\n        .ozg-milestone:last-child::before { display: none; }\n        .ozg-m-dot { width: 16px; height: 16px; border-radius: 50%; background: var(--bg-color); border: 2px solid var(--accent-purple); position: relative; z-index: 1; margin-top: 4px; flex-shrink: 0; }\n        .ozg-m-content { flex: 1; background: rgba(255,255,255,0.02); border-radius: 12px; padding: 16px; border: 1px solid rgba(255,255,255,0.05); transition: 0.3s; }\n\n        \/* Filters - Original hidden bar *\/\n        .filter-bar-original { display: none; }\n\n        \/* FIXED: Filters - Sticky Wrapper with proper hide\/show *\/\n        .ozg-filter-sticky {\n            position: fixed;\n            top: 65px;\n            left: 0;\n            right: 0;\n            width: 100%;\n            z-index: 99;\n            background: rgba(5, 7, 15, 0.98);\n            backdrop-filter: blur(12px);\n            -webkit-backdrop-filter: blur(12px);\n            border-bottom: 1px solid var(--glass-border);\n            border-top: 1px solid rgba(255,255,255,0.05);\n            transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n            will-change: transform;\n            padding: 0;\n            display: none;\n            transform: translateY(0);\n        }\n        .ozg-filter-sticky.visible {\n            display: block;\n        }\n        .ozg-filter-sticky.sticky-hidden {\n            transform: translateY(-100%);\n            display: block;\n        }\n        .ozg-filter-sticky .filter-bar {\n            margin: 0 !important;\n            padding: 15px 20px !important;\n            border: none !important;\n            background: transparent !important;\n            position: relative;\n            top: auto;\n        }\n        @media (max-width: 900px) {\n            .ozg-filter-sticky .filter-bar {\n                padding: 15px 10px !important;\n            }\n            .ozg-filter-sticky {\n                top: 65px;\n            }\n        }\n        @media (max-width: 768px) {\n            .ozg-filter-sticky {\n                top: 52px;\n            }\n        }\n\n        \/* Regular filter bar (non-sticky) *\/\n        .filter-bar {\n            display: flex;\n            gap: 10px;\n            flex-wrap: wrap;\n            margin-bottom: 24px;\n        }\n        .filter-select {\n            background: rgba(255,255,255,0.05);\n            border: 1px solid rgba(255,255,255,0.1);\n            color: #fff;\n            padding: 10px 16px;\n            border-radius: 12px;\n            outline: none;\n            font-size: 0.9rem;\n            cursor: pointer;\n        }\n        .filter-select option {\n            background: #0f121e;\n            color: #fff;\n        }\n\n        \/* Feed Styles *\/\n        .ozg-sticky-feed-header { position: fixed; top: 60px; left: 0; right: 0; width: 100%; z-index: 199; background: rgba(5,7,15,0.98); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border-bottom: 1px solid var(--glass-border); border-top: 1px solid rgba(255,255,255,0.05); padding: 15px 20px; transform: translateY(0); transition: transform 0.3s ease, top 0.3s ease; }\n        .ozg-sticky-feed-header.feed-hidden { transform: translateY(-100%); }\n        @media (max-width: 900px) {\n            .ozg-sticky-feed-header { padding: 12px 10px; top: 56px; position: fixed !important; }\n        }\n        #view-result { padding-top: 0; }\n        @media (max-width: 768px) { .ozg-sticky-feed-header { top: 52px; } }\n\n        \/* TikTok \/ Instagram Feed Styles *\/\n        .ozg-feed-tags-scroll::-webkit-scrollbar { display: none; }\n        .ozg-feed-tag-btn { background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); color: var(--text-muted); padding: 8px 16px; border-radius: 20px; font-size: 0.85rem; font-weight: 600; cursor: pointer; white-space: nowrap; transition: 0.2s; }\n        .ozg-feed-tag-btn:hover { background: rgba(255,255,255,0.1); color: #fff; }\n        .ozg-feed-tag-btn.active { background: var(--accent-purple); border-color: var(--accent-purple); color: #fff; box-shadow: 0 0 15px rgba(138, 43, 226, 0.4); }\n        #ozg-feed-loader { text-align: center; padding: 20px; grid-column: 1\/-1; display: none; }\n        .ozg-feed-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px; margin-top: 20px; }\n        .ozg-feed-card { position: relative; border-radius: 16px; overflow: hidden; aspect-ratio: 9 \/ 16; transition: all 0.3s; box-shadow: 0 4px 20px rgba(0,0,0,0.3); text-decoration: none !important; display: block; border: 1px solid transparent; cursor: pointer; }\n        .ozg-feed-card:hover { transform: translateY(-5px); border-color: var(--card-color, var(--accent-cyan)); box-shadow: 0 10px 30px rgba(0,0,0,0.5), 0 0 15px var(--card-color, transparent); }\n        .ozg-feed-card:active { transform: scale(0.96) !important; border-color: var(--card-color) !important; box-shadow: 0 0 25px var(--card-color), inset 0 0 15px var(--card-color) !important; transition: all 0.1s !important; }\n        .ozg-feed-card-bg { position: absolute; inset: 0; background-size: cover; background-position: center; transition: transform 0.5s; z-index: 1; }\n        .ozg-feed-card:hover .ozg-feed-card-bg { transform: scale(1.05); }\n        .ozg-feed-card::after { content: ''; position: absolute; inset: 0; background: linear-gradient(to top, rgba(0,0,0,0.9) 0%, rgba(0,0,0,0.1) 40%, rgba(0,0,0,0.7) 100%); z-index: 2; pointer-events: none; transition: opacity 0.3s; }\n        .ozg-feed-card.is-playing:not(.is-audio-playing) .ozg-feed-card-bg { display: none; }\n        .ozg-feed-card.is-audio-playing .ozg-feed-card-bg { display: block !important; opacity: 1 !important; transform: none !important; z-index: 1 !important; }\n        .ozg-feed-card.is-playing::after { opacity: 0.3; }\n        .ozg-feed-card.is-playing .ozg-feed-media-container { z-index: 20 !important; }\n        .ozg-feed-card.is-playing .ozg-feed-content { opacity: 0; pointer-events: none !important; }\n        .ozg-feed-card.is-playing .ozg-feed-pause-btn { z-index: 25 !important; }\n        .ozg-feed-play-btn { background: rgba(0,0,0,0.6); border: 2px solid rgba(255,255,255,0.8); border-radius: 50%; width: 50px; height: 50px; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: 0.3s; backdrop-filter: blur(4px); position: absolute; z-index: 4; top: 50%; left: 50%; transform: translate(-50%, -50%); }\n        .ozg-feed-play-btn:hover { transform: translate(-50%, -50%) scale(1.1); background: var(--accent-cyan); border-color: var(--accent-cyan); }\n        .ozg-feed-media-container iframe, .ozg-feed-media-container video, .ozg-feed-media-container audio { position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover; z-index: 10; border: none; }\n        .ozg-feed-media-container audio { object-fit: contain; background: transparent !important; }\n        .ozg-feed-media-container .ozg-audio-embed audio { position: static !important; width: 90% !important; height: 44px !important; }\n        .ozg-feed-card.is-audio-playing::after { opacity: 0.35; }\n\n        \/* Book reader (PDF \/ PowerPoint lessons) - continuous scroll, like an embedded document *\/\n        .ozg-book-reader { position: relative; width: 100%; background: #14162a; border-radius: 12px; overflow: hidden; margin-bottom: 20px; }\n        .ozg-book-scroll { position: relative; width: 100%; max-height: 65vh; overflow-y: auto; -webkit-overflow-scrolling: touch; background: #0c0d1a; scroll-behavior: smooth; padding: 12px 0; }\n        .ozg-book-scroll canvas { display: block; max-width: 100%; height: auto !important; margin: 0 auto 12px auto; box-shadow: 0 4px 24px rgba(0,0,0,0.4); }\n        .ozg-book-loading { color: var(--text-muted); font-size: 0.9rem; padding: 40px; text-align: center; }\n        .ozg-book-progress-wrap { padding: 10px 16px; background: rgba(255,255,255,0.03); border-top: 1px solid var(--glass-border); display: flex; align-items: center; gap: 10px; }\n        .ozg-book-progress-track { flex: 1; height: 4px; border-radius: 2px; background: rgba(255,255,255,0.1); overflow: hidden; }\n        .ozg-book-progress-fill { height: 100%; width: 0%; background: var(--accent-cyan); border-radius: 2px; transition: width 0.15s linear; }\n        .ozg-book-progress-label { font-size: 0.75rem; color: var(--text-muted); font-weight: 600; min-width: 34px; text-align: right; }\n\n        \/* Book reader: click-to-zoom + lightbox *\/\n        .ozg-book-scroll canvas { cursor: zoom-in; }\n        .ozg-book-expand { background: transparent; border: 1px solid var(--glass-border); color: var(--text-main); border-radius: 8px; padding: 4px 8px; cursor: pointer; display: inline-flex; align-items: center; gap: 4px; font-size: 0.75rem; font-weight: 600; }\n        .ozg-book-expand:hover { border-color: var(--accent-cyan); color: var(--accent-cyan); }\n        .ozg-lb { position: fixed; inset: 0; z-index: 45000; background: rgba(3,4,10,0.97); display: none; flex-direction: column; user-select: none; -webkit-user-select: none; }\n        .ozg-lb.show { display: flex; }\n        .ozg-lb-bar { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: calc(10px + env(safe-area-inset-top, 0px)) 14px 10px 14px; background: rgba(15,18,30,0.9); border-bottom: 1px solid var(--glass-border); color: #fff; flex-shrink: 0; }\n        .ozg-lb-group { display: flex; align-items: center; gap: 6px; }\n        .ozg-lb-btn { background: rgba(255,255,255,0.08); border: 1px solid var(--glass-border); color: #fff; width: 38px; height: 38px; border-radius: 10px; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; padding: 0; }\n        .ozg-lb-btn:hover { border-color: var(--accent-cyan); color: var(--accent-cyan); }\n        .ozg-lb-btn:disabled { opacity: 0.3; cursor: default; }\n        .ozg-lb-count { font-size: 0.85rem; font-weight: 700; min-width: 64px; text-align: center; color: #fff; }\n        .ozg-lb-stage { position: relative; flex: 1; overflow: hidden; touch-action: none; cursor: grab; }\n        .ozg-lb-stage.grabbing { cursor: grabbing; }\n        .ozg-lb-canvas { position: absolute; top: 0; left: 0; transform-origin: 0 0; will-change: transform; background: #fff; box-shadow: 0 8px 40px rgba(0,0,0,0.6); max-width: none !important; }\n        .ozg-lb-loading { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; color: var(--text-muted); pointer-events: none; }\n        .ozg-lb-nav { position: absolute; top: 50%; transform: translateY(-50%); z-index: 2; width: 44px; height: 64px; border-radius: 12px; background: rgba(0,0,0,0.5); border: 1px solid var(--glass-border); color: #fff; display: flex; align-items: center; justify-content: center; cursor: pointer; padding: 0; }\n        .ozg-lb-nav:disabled { opacity: 0.2; cursor: default; }\n        .ozg-lb-prev { left: 8px; } .ozg-lb-next { right: 8px; }\n        @media (max-width: 600px) { .ozg-lb-nav { width: 36px; height: 52px; } }\n        .elementor-popup-modal { z-index: 60000 !important; }\n        .ozg-ppt-frame-wrap { position: relative; width: 100%; aspect-ratio: 16\/10; background: #0c0d1a; border-radius: 12px; overflow: hidden; margin-bottom: 12px; }\n        .ozg-ppt-frame-wrap iframe { width: 100%; height: 100%; border: 0; }\n        .ozg-ppt-hint { font-size: 0.8rem; color: var(--text-muted); text-align: center; margin: -4px 0 20px; }\n        .ozg-fullscreen-active { position: fixed !important; top: 0 !important; left: 0 !important; width: 100vw !important; height: 100vh !important; z-index: 999999 !important; background: #000 !important; margin: 0 !important; border-radius: 0 !important; }\n        .ozg-fullscreen-active iframe, .ozg-fullscreen-active video { width: 100vw !important; height: 100vh !important; max-width: 100vw !important; max-height: 100vh !important; object-fit: contain !important; }\n        .ozg-fullscreen-active { height: 100vh !important; height: 100dvh !important; aspect-ratio: auto !important; }\n        .ozg-fullscreen-active .ozg-media-fs-btn { top: calc(12px + env(safe-area-inset-top, 0px) + var(--tg-safe-area-inset-top, 0px) + var(--tg-content-safe-area-inset-top, 0px)) !important; }\n        .ozg-fs-ancestor { transform: none !important; filter: none !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; contain: none !important; perspective: none !important; will-change: auto !important; overflow: visible !important; }\n        body.ozg-fs-lock { overflow: hidden !important; }\n\n        \/* Fullscreen media: keep footers\/header out of the way and keep audio controls above the bottom edge *\/\n        body.ozg-fs-lock .ozg-mob-nav, body.ozg-fs-lock #draggableFooter, body.ozg-fs-lock #ozgCreationBar, body.ozg-fs-lock .ozg-header-panel { display: none !important; }\n        .ozg-fullscreen-active .ozg-feed-media-container { position: absolute !important; inset: 0 !important; width: 100% !important; height: 100% !important; }\n        .ozg-fullscreen-active .ozg-audio-embed { padding-bottom: calc(24px + env(safe-area-inset-bottom, 0px) + var(--tg-safe-area-inset-bottom, 0px) + var(--tg-content-safe-area-inset-bottom, 0px)) !important; }\n        .ozg-raw-embed iframe { width: 100% !important; height: 100% !important; position: absolute; top: 0; left: 0; border: none; }\n        .ozg-feed-content { position: relative; z-index: 5; height: 100%; display: flex; flex-direction: column; justify-content: space-between; padding: 16px; }\n        .ozg-feed-tags span { display: inline-block; padding: 6px 10px; border-radius: 8px; font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; box-shadow: 0 4px 10px rgba(0,0,0,0.4); }\n        .ozg-feed-title { margin: 0 0 12px 0; font-size: 1.15rem; line-height: 1.3; text-shadow: 0 2px 4px rgba(0,0,0,0.8); }\n        .ozg-feed-title a { color: #fff; text-decoration: none; }\n        .ozg-feed-title a::after { content: ''; position: absolute; inset: 0; }\n        .ozg-feed-author-row { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }\n        .ozg-feed-author-avatar { width: 24px; height: 24px; border-radius: 50%; border: 1px solid rgba(255,255,255,0.5); object-fit: cover; }\n        .ozg-feed-author-name { font-size: 0.85rem; color: #ddd; font-weight: 500; text-shadow: 0 1px 2px rgba(0,0,0,0.8); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n        .ozg-feed-stats { display: flex; align-items: center; gap: 12px; font-size: 0.8rem; color: #fff; font-weight: 600; text-shadow: 0 1px 2px rgba(0,0,0,0.8); }\n        .ozg-feed-actions { position: relative; z-index: 4; display: flex; gap: 8px; justify-content: flex-end; }\n\n        @media (max-width: 600px) {\n            .ozg-feed-grid {\n                grid-template-columns: repeat(2, 1fr) !important;\n                gap: 8px !important;\n                margin-top: 10px !important;\n            }\n            .ozg-feed-card { border-radius: 12px !important; border: 1px solid rgba(255,255,255,0.05) !important; }\n            .ozg-feed-content { padding: 10px !important; }\n            .ozg-feed-tags span { font-size: 0.6rem !important; padding: 4px 6px !important; }\n            .ozg-feed-title { font-size: 0.85rem !important; margin-bottom: 6px !important; line-height: 1.2 !important; }\n            .ozg-feed-author-avatar { width: 16px !important; height: 16px !important; }\n            .ozg-feed-author-name { font-size: 0.7rem !important; }\n            .ozg-feed-stats { font-size: 0.7rem !important; }\n            .ozg-feed-actions .ozg-icon-btn { width: 28px !important; height: 28px !important; }\n            .ozg-feed-actions .ozg-icon-btn i { width: 12px !important; height: 12px !important; }\n        }\n\n        \/* P2P Campaign Modal Enhancements *\/\n        .ozg-modal#ozgP2PModal .ozg-modal {\n            max-width: 700px;\n            background: #ffffff;\n            border-radius: 24px;\n            overflow: hidden;\n            animation: ozgModalFadeIn 0.3s ease;\n        }\n\n        @keyframes ozgModalFadeIn {\n            from { opacity: 0; transform: scale(0.95); }\n            to { opacity: 1; transform: scale(1); }\n        }\n\n        .ozg-p2p-campaign-header .ozg-p2p-author img {\n            border: 2px solid #e5e7eb;\n        }\n\n        .ozg-p2p-actions button {\n            transition: all 0.2s ease;\n        }\n\n        .ozg-p2p-actions button:hover {\n            transform: translateY(-2px);\n        }\n\n        .ozg-p2p-actions button.liked {\n            background: #fee2e2 !important;\n            color: #dc2626 !important;\n        }\n\n        .ozg-p2p-actions button.liked i {\n            fill: currentColor;\n        }\n\n        .ozg-p2p-campaign-body {\n            font-family: inherit;\n            line-height: 1.5;\n        }\n\n        .ozg-p2p-campaign-body .give-form,\n        .ozg-p2p-campaign-body .give-embed-form {\n            margin: 0;\n        }\n\n        @media (max-width: 640px) {\n            .ozg-modal#ozgP2PModal .ozg-modal {\n                width: 95%;\n                max-width: 95%;\n                margin: 10px;\n                border-radius: 20px;\n            }\n\n            .ozg-p2p-campaign-header > div {\n                flex-direction: column;\n                align-items: flex-start;\n            }\n\n            .ozg-p2p-stats {\n                margin-top: 8px;\n            }\n        }\n\n        \/* Enhanced P2P Campaign Modal Styles *\/\n        .ozg-modal#ozgP2PModal {\n            z-index: 100000;\n        }\n\n        .ozg-modal#ozgP2PModal .ozg-modal {\n            max-width: 800px;\n            width: 90%;\n            background: #ffffff;\n            border-radius: 28px;\n            overflow-y: auto;\n            max-height: 85vh;\n            animation: ozgModalSlideUp 0.35s ease-out;\n            box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);\n        }\n\n        @keyframes ozgModalSlideUp {\n            from {\n                opacity: 0;\n                transform: translateY(30px) scale(0.95);\n            }\n            to {\n                opacity: 1;\n                transform: translateY(0) scale(1);\n            }\n        }\n\n        .ozg-modal#ozgP2PModal .ozg-modal::-webkit-scrollbar {\n            width: 6px;\n        }\n\n        .ozg-modal#ozgP2PModal .ozg-modal::-webkit-scrollbar-track {\n            background: #f1f1f1;\n            border-radius: 10px;\n        }\n\n        .ozg-modal#ozgP2PModal .ozg-modal::-webkit-scrollbar-thumb {\n            background: #22c55e;\n            border-radius: 10px;\n        }\n\n        \/* P2P Campaign Content Styling *\/\n        .ozg-p2p-campaign-body {\n            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\n            line-height: 1.6;\n            color: #374151;\n        }\n\n        .ozg-p2p-campaign-body h1,\n        .ozg-p2p-campaign-body h2,\n        .ozg-p2p-campaign-body h3 {\n            color: #111827;\n            margin-top: 1.5em;\n            margin-bottom: 0.5em;\n        }\n\n        .ozg-p2p-campaign-body p {\n            margin-bottom: 1em;\n        }\n\n        .ozg-p2p-campaign-body img {\n            max-width: 100%;\n            height: auto;\n            border-radius: 12px;\n        }\n\n        \/* GiveWP Form Styling inside Modal *\/\n        .ozg-p2p-campaign-body .give-form,\n        .ozg-p2p-campaign-body .give-embed-form {\n            background: #f9fafb;\n            border-radius: 16px;\n            padding: 20px;\n            margin: 20px 0;\n            border: 1px solid #e5e7eb;\n        }\n\n        .ozg-p2p-campaign-body .give-btn,\n        .ozg-p2p-campaign-body .give-submit {\n            background: linear-gradient(135deg, #22c55e, #16a34a);\n            border: none;\n            padding: 12px 28px;\n            border-radius: 40px;\n            color: white;\n            font-weight: 700;\n            cursor: pointer;\n            transition: all 0.2s;\n        }\n\n        .ozg-p2p-campaign-body .give-btn:hover,\n        .ozg-p2p-campaign-body .give-submit:hover {\n            transform: translateY(-2px);\n            box-shadow: 0 4px 15px rgba(34, 197, 94, 0.3);\n        }\n\n        \/* Goal Progress Bar Styling *\/\n        .ozg-p2p-campaign-body .give-progress-bar,\n        .ozg-p2p-campaign-body .campaign-progress {\n            background: #e5e7eb;\n            border-radius: 20px;\n            height: 12px;\n            overflow: hidden;\n        }\n\n        .ozg-p2p-campaign-body .give-progress-bar > span,\n        .ozg-p2p-campaign-body .progress-fill {\n            background: linear-gradient(90deg, #22c55e, #16a34a);\n            height: 100%;\n            display: block;\n            border-radius: 20px;\n        }\n\n        \/* Campaign Stats Display *\/\n        .ozg-p2p-campaign-body .campaign-stats {\n            display: flex;\n            gap: 24px;\n            justify-content: space-around;\n            background: #f0fdf4;\n            padding: 16px;\n            border-radius: 16px;\n            margin: 20px 0;\n        }\n\n        .ozg-p2p-campaign-body .stat-item {\n            text-align: center;\n        }\n\n        \/* Course & Lesson Modal Styles *\/\n        #ozgCourseModal .ozg-modal, #ozgLessonModal .ozg-modal, #ozgFundraisingModal .ozg-modal { max-width: 800px; width: 95%; background: #0f121e; border: 1px solid var(--glass-border); padding: 0; overflow-y: auto; max-height: 90vh; display: block; }\n        .ozg-course-modal-header, .ozg-lesson-modal-header, .ozg-fundraising-modal-header { height: 200px; background-size: cover; background-position: center; position: relative; width: 100%; }\n        .ozg-course-modal-header::after, .ozg-lesson-modal-header::after, .ozg-fundraising-modal-header::after { content: ''; position: absolute; inset: 0; background: linear-gradient(to top, #0f121e, transparent); }\n        .ozg-course-modal-content, .ozg-lesson-modal-content, .ozg-fundraising-modal-content { padding: 24px; color: #fff; width: 100%; box-sizing: border-box; }\n        .ozg-course-modal-title, .ozg-lesson-modal-title, .ozg-fundraising-modal-title { font-size: 1.8rem; font-weight: 700; margin-bottom: 16px; font-family: 'Playfair Display', serif; }\n        .ozg-course-description, .ozg-lesson-description, .ozg-fundraising-description { color: var(--text-muted); line-height: 1.6; margin-bottom: 24px; font-size: 0.95rem; }\n        .ozg-course-stats, .ozg-lesson-stats { display: flex; gap: 20px; margin-bottom: 24px; flex-wrap: wrap; }\n        .ozg-course-stat-item, .ozg-lesson-stat-item { display: flex; align-items: center; gap: 8px; font-size: 0.85rem; color: var(--text-muted); }\n        .ozg-course-sections, .ozg-lesson-sections { display: flex; flex-direction: column; gap: 16px; }\n        .ozg-course-section-title, .ozg-lesson-section-title { font-size: 1.1rem; font-weight: 600; color: var(--accent-cyan); margin-bottom: 12px; display: flex; align-items: center; gap: 8px; border-bottom: 1px solid var(--glass-border); padding-bottom: 8px; }\n        .ozg-video-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; border-radius: 12px; background: #000; margin-bottom: 20px; }\n        .ozg-video-container iframe, .ozg-video-container video { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none; }\n        .ozg-lesson-nav { display: flex; justify-content: space-between; margin-top: 30px; padding-top: 20px; border-top: 1px solid var(--glass-border); }\n\n        .ozg-p2p-campaign-body .stat-value {\n            font-size: 1.5rem;\n            font-weight: 800;\n            color: #22c55e;\n        }\n\n        .ozg-p2p-campaign-body .stat-label {\n            font-size: 0.75rem;\n            color: #6b7280;\n            text-transform: uppercase;\n        }\n\n        \/* Action Buttons *\/\n        .ozg-p2p-share-btn:hover,\n        .ozg-p2p-like-btn:hover {\n            transform: translateY(-2px);\n            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n        }\n\n\n\n        .ozg-p2p-like-btn.liked {\n            background: #fecaca !important;\n            color: #dc2626 !important;\n            border: 1px solid #dc2626 !important;\n        }\n\n        .ozg-p2p-like-btn.liked i {\n            fill: currentColor;\n        }\n\n\n        \/* Responsive *\/\n        @media (max-width: 640px) {\n            .ozg-modal#ozgP2PModal .ozg-modal {\n                width: 95%;\n                max-height: 90vh;\n                border-radius: 20px;\n            }\n\n            .ozg-p2p-campaign-header > div {\n                flex-direction: column;\n                align-items: flex-start;\n            }\n\n            .ozg-p2p-stats {\n                width: 100%;\n                justify-content: space-between;\n            }\n\n            .ozg-p2p-actions {\n                flex-direction: column;\n            }\n\n            .ozg-p2p-actions button {\n                width: 100%;\n                justify-content: center;\n            }\n        }\n\n        \/* ===== MOBILE-FRIENDLY HABIT TRACKER ===== *\/\n        .tracker-wrapper { background: rgba(0,0,0,.2); border-radius: 16px; border: 1px solid var(--glass-border); padding: 12px 8px; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: thin; margin-bottom: 24px; }\n        .tracker-table { width: 100%; min-width: 0; border-collapse: collapse; table-layout: fixed; }\n        .tracker-table th {\n            color: var(--text-muted); font-weight: 600; font-size: 0.52rem;\n            padding: 0 1px 5px; text-align: center; width: 30px;\n            white-space: nowrap; overflow: hidden;\n        }\n        .tracker-table th:first-child {\n            text-align: left; padding-left: 6px;\n            width: 96px; min-width: 0;\n        }\n        .tracker-table td { padding: 3px 1px; text-align: center; }\n        .tracker-table td:first-child { text-align: left; padding-left: 4px; }\n        .tracker-table th .day-label { font-size: 0.46rem; text-transform: uppercase; letter-spacing: 0; }\n        .tracker-table th .day-number { font-size: 0.62rem; font-weight: 700; }\n        .habit-name-cell { display: flex; align-items: center; gap: 3px; min-width: 0; overflow: hidden; }\n        .habit-alias { font-size: 0.72rem; font-weight: 500; color: #fff; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; min-width: 0; }\n        .edit-alias-btn { background: none; border: none; color: var(--text-muted); cursor: pointer; padding: 1px; border-radius: 3px; display: inline-flex; align-items: center; flex-shrink: 0; opacity: 0.6; }\n        .edit-alias-btn:hover { color: var(--accent-cyan); opacity: 1; }\n        .tracker-cell {\n            width: 22px; height: 22px; margin: 0 auto;\n            border-radius: 5px; background: rgba(255,255,255,.05);\n            border: 1px solid rgba(255,255,255,.1); cursor: pointer;\n            transition: all .15s; display: flex; align-items: center; justify-content: center;\n        }\n        .tracker-cell.completed { background: var(--success-color); border-color: var(--success-color); box-shadow: 0 0 4px rgba(0,230,118,.3); }\n        .tracker-cell.completed::after { content: '\u2713'; font-size: 0.62rem; font-weight: bold; color: #000; }\n        .tracker-cell:hover { border-color: var(--accent-cyan); transform: scale(1.08); }\n        .tracker-view-tabs { display: flex; gap: 6px; margin-bottom: 12px; flex-wrap: wrap; }\n        .tracker-view-btn { background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.1); padding: 5px 12px; border-radius: 20px; color: var(--text-muted); font-size: 0.78rem; cursor: pointer; transition: .2s; }\n        .tracker-view-btn.active { background: var(--accent-cyan); color: #000; border-color: var(--accent-cyan); font-weight: 700; }\n\n        @media (max-width: 640px) {\n            .tracker-wrapper { padding: 6px 2px; }\n            .tracker-cell { width: 20px; height: 20px; }\n            .tracker-table th { width: 28px; }\n            .tracker-table th:first-child { width: 88px; }\n        }\n\n        \/* \u2500\u2500 CREATION BAR \u2500\u2500 *\/\n        .ozg-creation-bar { position: fixed; bottom: 8px; left: 50%; transform: translateX(-50%); width: calc(100% - 24px); max-width: 560px; z-index: 20000; background: rgba(10,13,28,.92); backdrop-filter: blur(16px); padding: 10px 0; border: 1px solid var(--accent-cyan); border-radius: 20px; display: none; box-shadow: 0 0 20px rgba(0,240,255,.15); }\n        .ozg-creation-bar.visible { display: block !important; }\n        .ozg-creation-scroll { display: flex; overflow-x: auto; gap: 10px; padding: 0 14px; -webkit-overflow-scrolling: touch; scrollbar-width: none; }\n        .ozg-creation-scroll::-webkit-scrollbar { display: none; }\n        .ozg-create-btn { flex-shrink: 0; background: rgba(0,240,245,.08); border: 1px solid rgba(0,240,245,.25); padding: 8px 16px; border-radius: 16px; color: #fff; font-size: 0.78rem; font-weight: 700; display: flex; align-items: center; gap: 7px; cursor: pointer; transition: .2s; white-space: nowrap; text-transform: uppercase; letter-spacing: .4px; }\n        .ozg-create-btn:hover { background: rgba(0,240,255,.18); border-color: var(--accent-cyan); box-shadow: 0 0 12px rgba(0,240,255,.2); }\n\n        \/* \u2500\u2500 FLOATING CREATION MODAL \u2500\u2500 *\/\n        .ozg-fs-modal { position: fixed; left: 260px; top: 64px; right: 0; bottom: 0; z-index: 2147483647; background: #0d1020; display: none; flex-direction: column; overflow: hidden; border-left: 1px solid var(--glass-border); box-shadow: -6px 0 30px rgba(0,0,0,.5); }\n        .ozg-fs-modal.show { display: flex; }\n        .ozg-fs-header { padding: 11px 18px; display: flex; justify-content: space-between; align-items: center; background: rgba(255,255,255,.04); border-bottom: 1px solid var(--glass-border); flex-shrink: 0; gap: 8px; }\n        .ozg-fs-body { flex: 1; overflow: hidden; }\n        .ozg-fs-body iframe { width: 100%; height: 100%; border: none; display: block; }\n        .ozg-fs-modal.ozg-fs-minimised .ozg-fs-body { display: none; }\n        .ozg-fs-modal.ozg-fs-minimised { top: auto; bottom: calc(62px + 4px); height: 46px; border-radius: 12px 0 0 12px; box-shadow: -4px 0 16px rgba(0,240,255,.2); }\n\n        @media (max-width: 900px) {\n            .ozg-creation-bar { bottom: calc(62px + env(safe-area-inset-bottom, 0px)); width: calc(100% - 16px); border-radius: 16px; }\n            .ozg-fs-modal { left: 0; bottom: 62px; border-left: none; border-top: 1px solid var(--glass-border); }\n            .ozg-fs-modal.ozg-fs-minimised { left: 0; border-radius: 12px 12px 0 0; }\n            .ozg-creation-actions button { flex: 1; min-width: 120px; justify-content: center; }\n            .ozg-creation-actions .flex-spacer { display: none; }\n        }\n        .flex-spacer { flex: 1; }\n\n        \/* Profile Connection & Notification Sub-tabs *\/\n        .ozg-profile-tab.active { border-bottom: 2px solid var(--accent-cyan) !important; color: #fff !important; }\n        .ozg-profile-subtab-content { animation: fadeIn 0.3s ease; }\n\n        \/* Share Sheet *\/\n        #ozgShareSheet { animation: ozgSlideUp 0.3s cubic-bezier(0.32, 0.72, 0, 1); }\n        @keyframes ozgSlideUp { from { transform: translateY(100%); } to { transform: translateY(0); } }\n\n        \/* ===== END MOBILE HABIT TRACKER ===== *\/\n\n        \/* Quiz Modal Styles *\/\n        .ozg-quiz-modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.9); z-index: 10000; display: none; align-items: center; justify-content: center; backdrop-filter: blur(8px); }\n        .ozg-quiz-modal-overlay.show { display: flex; }\n        .ozg-quiz-modal { background: #0f121e; border: 1px solid var(--glass-border); border-radius: 24px; width: 90%; max-width: 600px; max-height: 85vh; overflow-y: auto; padding: 0; box-shadow: 0 20px 40px rgba(0,0,0,0.5); }\n        .ozg-quiz-header { padding: 20px 24px; border-bottom: 1px solid var(--glass-border); display: flex; justify-content: space-between; align-items: center; background: rgba(0,0,0,0.3); border-radius: 24px 24px 0 0; }\n        .ozg-quiz-body { padding: 24px; }\n        .ozg-quiz-close { background: rgba(255,255,255,0.1); border: none; color: #fff; width: 32px; height: 32px; border-radius: 50%; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: 0.2s; }\n        .ozg-quiz-close:hover { background: var(--warning-color); }\n\n        \/* Profile Grid Styling *\/\n        .ozg-profile-tab { border-radius: 0 !important; font-family: inherit; font-size: 0.9rem; letter-spacing: 0.5px; text-transform: uppercase; }\n        .ozg-profile-tab:hover { color: #fff !important; }\n        .ozg-profile-post-item { position: relative; border-radius: 4px; overflow: hidden; background: #1a1d2e; }\n        .ozg-profile-post-item img { transition: transform 0.5s ease; }\n        .ozg-profile-post-item:hover img { transform: scale(1.1); }\n        .ozg-profile-post-item .item-overlay { position: absolute; inset: 0; background: rgba(0,0,0,0.4); opacity: 0; transition: opacity 0.3s ease; display: flex; align-items: center; justify-content: center; z-index: 2; }\n        .ozg-profile-post-item:hover .item-overlay { opacity: 1; }\n\n        @media (max-width: 600px) {\n            #ozgUserProfileHeader { padding: 20px !important; }\n            #ozgProfileAvatar { width: 80px !important; height: 80px !important; }\n            #ozgProfileName { font-size: 1.4rem !important; }\n        }\n        .ozg-modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.8); z-index: 9999; display: none; align-items: center; justify-content: center; backdrop-filter: blur(5px); }\n        .ozg-modal-overlay.active, .ozg-modal-overlay.show { display: flex; }\n        .ozg-modal { background: #0f121e; border: 1px solid var(--glass-border); border-radius: 20px; width: 90%; max-width: 400px; padding: 24px; box-shadow: 0 10px 40px rgba(0,0,0,0.5); position: relative; max-height: 90vh; overflow-y: auto;}\n        .user-search-input { width: 100%; background: rgba(255,255,255,0.05); border: 1px solid var(--glass-border); color: #fff; padding: 12px; border-radius: 10px; margin-bottom: 16px; outline: none; }\n        .user-search-results { max-height: 200px; overflow-y: auto; margin-bottom: 16px; }\n        .user-search-item { display: flex; align-items: center; gap: 12px; padding: 10px; cursor: pointer; border-radius: 8px; transition: 0.2s; color: #fff; }\n        .user-search-item:hover { background: rgba(255,255,255,0.1); }\n        .user-search-item.selected { background: rgba(0,240,255,0.2); border: 1px solid var(--accent-cyan); color: #fff; }\n\n        \/* Gamer Panel CSS *\/\n        .mr-1 { margin-right: 0.25rem; }\n        .footer-content-wrapper { display: flex; align-items: flex-end; justify-content: space-between; max-width: 1100px; box-sizing: border-box; padding: 0.8rem; gap: 0.8rem; pointer-events: none; position: fixed; bottom: 0; cursor: grab; z-index: 10000; touch-action: none; left: 50%; transform: translateX(-50%); width: 95%; right: auto; transition: opacity 0.3s; }\n        .left-column-footer { display: none; flex-direction: column; gap: 0.8rem; flex-shrink: 0; width: 160px; pointer-events: auto; transition: opacity 0.3s ease-in-out; opacity: 0; }\n        .left-column-footer.is-active { display: flex; opacity: 1; }\n        .left-side-footer-buttons-group { display: flex; flex-direction: column; gap: 0.5rem; padding: 0.5rem; background-color: #615dfa; border-radius: 0.75rem; box-shadow: 0 2px 4px rgba(0,0,0,0.2); width: 100%; }\n        .left-side-footer-buttons-group .footer-button { background-color: #4e4ac8; border-radius: 0.75rem; padding: 0.5rem 0.8rem; color: white !important; font-size: 0.8rem; font-weight: 500; display: flex; align-items: center; justify-content: flex-start; gap: 0.125rem; cursor: pointer; transition: background-color 0.2s; text-decoration: none; box-sizing: border-box; width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n        .left-side-footer-buttons-group .footer-button:hover { background-color: #3a3788; }\n        .config-skin-row { display: flex; flex-direction: row; gap: 0.5rem; justify-content: center; padding: 0.5rem; background-color: #615dfa; border-radius: 0.75rem; box-shadow: 0 2px 4px rgba(0,0,0,0.2); width: 100%; box-sizing: border-box; }\n        .config-skin-row .action-button-round { background-color: #4e4ac8; border-radius: 9999px; width: 2.5rem; height: 2.5rem; display: flex; align-items: center; justify-content: center; color: white; font-size: 1.25rem; cursor: pointer; transition: background-color 0.2s, transform 0.2s; box-shadow: 0 2px 4px rgba(0,0,0,0.2); text-decoration: none; flex-shrink: 0; pointer-events: auto; }\n        .config-skin-row .action-button-round:hover { background-color: #3a3788; transform: translateY(-2px); }\n        .bottom-info-bar { background-color: #615dfa; padding: 1rem; display: flex; flex-direction: row; align-items: center; justify-content: space-between; border-radius: 1.5rem; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); box-sizing: border-box; gap: 1rem; flex-grow: 1; pointer-events: auto; }\n        .bottom-bar-top-row { display: flex; align-items: center; width: auto; gap: 0.5rem; justify-content: flex-start; flex-grow: 1; }\n        .xp-progress-group { display: flex; align-items: center; width: auto; max-width: none; gap: 0.5rem; cursor: pointer; flex-grow: 1; }\n        .progress-bar { background-color: #4e4ac8; border-radius: 9999px; height: 0.75rem; overflow: hidden; flex-grow: 1; }\n        .progress-fill { background-color: #FBBF24; height: 100%; width: 75%; border-radius: 9999px; }\n        .xp-text { color: white; font-size: 0.875rem; font-weight: 600; white-space: nowrap; }\n        .event-info { background-color: #4e4ac8; border-radius: 0.75rem; padding: 0.75rem 1rem; color: white; font-size: 0.875rem; display: flex; align-items: center; justify-content: center; gap: 0.5rem; box-sizing: border-box; width: auto; max-width: none; text-align: center; white-space: nowrap; cursor: pointer; flex-grow: 1; }\n        .event-info-icon { color: #FBBF24; font-size: 1.25rem; }\n        .event-time { color: #9CA3AF; font-size: 0.75rem; white-space: nowrap; }\n        .footer-menu-toggle { color: white !important; font-size: 1.5rem; cursor: pointer; text-decoration: none; flex-shrink: 0; position: relative; transform: translateY(0); display: flex; }\n        @media (max-width: 767px) {\n            .footer-content-wrapper { padding: 1.5vw; flex-direction: row; align-items: flex-end; justify-content: space-between; gap: 0.5rem; left: 2.5vw; right: 2.5vw; width: auto; transform: none; }\n            .left-column-footer { width: 140px; gap: 0.5rem; }\n            .left-side-footer-buttons-group { padding: 0.3rem; gap: 0.3rem; }\n            .left-side-footer-buttons-group .footer-button { padding: 0.3rem 0.5rem; font-size: 0.75rem; border-radius: 0.5rem; justify-content: flex-start; }\n            .config-skin-row { padding: 0.3rem; gap: 0.3rem; }\n            .config-skin-row .action-button-round { width: 2.2rem; height: 2.2rem; font-size: 1rem; }\n            .bottom-info-bar { flex-direction: column; gap: 0.4rem; padding: 0.4rem; width: 100%; max-width: none; margin-left: 0; margin-right: 0; }\n            .bottom-bar-top-row { flex-direction: row; justify-content: space-between; gap: 0.5rem; width: 100%; }\n            .xp-progress-group { max-width: none; width: auto; }\n            .event-info { max-width: 100%; width: 100%; font-size: 0.75rem; padding: 0.3rem 0.75rem; }\n            .event-info-icon { font-size: 1rem; }\n            .xp-text { font-size: 0.75rem; }\n            .progress-bar { height: 0.6rem; }\n            .footer-menu-toggle { font-size: 1.2rem; transform: translateY(-2px); }\n        }\n\n        \/* Responsive *\/\n        @media (max-width: 900px) {\n            .ozg-layout { grid-template-columns: minmax(0, 1fr); padding: 90px 10px 160px 10px; }\n            .ozg-sidebar { display: none; }\n            .ozg-mob-nav { display: flex; position: fixed; bottom: 0; left: 0; right: 0; background: rgba(5,7,15,0.9); border-top: 1px solid var(--glass-border); padding: 10px 4px; justify-content: space-around; overflow: hidden; box-sizing: border-box; z-index: 10000; backdrop-filter: blur(10px); transition: all 0.3s; }\n            .ozg-mob-item { display: flex; flex-direction: column; align-items: center; color: #8b9bb4 !important; font-size: 0.7rem; gap: 4px; text-decoration: none; cursor: pointer; flex: 1 1 0; min-width: 0; }\n            .ozg-mob-item.active { color: #00f0ff !important; }\n            .ozg-mob-item i, .ozg-mob-item svg, .ozg-mob-item svg path { stroke: #8b9bb4 !important; fill: none !important; color: #8b9bb4 !important; }\n            .ozg-mob-item.active i, .ozg-mob-item.active svg, .ozg-mob-item.active svg path { stroke: #00f0ff !important; color: #00f0ff !important; }\n        }\n        @media (max-width: 768px) {\n            .ozg-header-panel { padding: 10px; }\n            .ozg-header-main { gap: 6px; }\n            .ozg-profile-header img { width: 32px; height: 32px; }\n            .ozg-profile-name { font-size: 0.8rem; }\n            .ozg-profile-trophy { font-size: 0.7rem; }\n            .ozg-header-resources { flex-grow: 1; justify-content: flex-end; gap: 6px; }\n            .ozg-resource-item { padding: 4px 8px; font-size: 0.8rem; border-radius: 8px; }\n            .ozg-resource-item i { width: 14px; }\n            .ozg-header-menu-btn { padding: 4px; }\n        }\n\n        \/* Footer Scrollable Buttons - Horizontal Scroll *\/\n        .footer-content-wrapper {\n            overflow-x: auto;\n            overflow-y: visible;\n            white-space: nowrap;\n            -webkit-overflow-scrolling: touch;\n            scrollbar-width: thin;\n            display: flex;\n            align-items: flex-end;\n            justify-content: flex-start;\n            gap: 8px;\n            padding: 8px 12px;\n            background: rgba(5, 7, 15, 0.95);\n            backdrop-filter: blur(12px);\n            border-top: 1px solid rgba(255,255,255,0.1);\n            border-radius: 0;\n            left: 0;\n            transform: none;\n            width: 100%;\n            max-width: 100%;\n        }\n        .footer-content-wrapper::-webkit-scrollbar {\n            height: 3px;\n        }\n        .footer-content-wrapper::-webkit-scrollbar-track {\n            background: rgba(255,255,255,0.05);\n            border-radius: 10px;\n        }\n        .footer-content-wrapper::-webkit-scrollbar-thumb {\n            background: var(--accent-cyan);\n            border-radius: 10px;\n        }\n        .left-column-footer {\n            display: flex !important;\n            flex-direction: row !important;\n            gap: 8px;\n            width: auto;\n            opacity: 1;\n            background: transparent;\n        }\n        .left-side-footer-buttons-group {\n            display: flex;\n            flex-direction: row;\n            gap: 6px;\n            background: transparent;\n            padding: 0;\n            width: auto;\n            box-shadow: none;\n        }\n        .left-side-footer-buttons-group .footer-button {\n            background: rgba(255,255,255,0.08);\n            border-radius: 30px;\n            padding: 6px 14px;\n            font-size: 0.75rem;\n            white-space: nowrap;\n            width: auto;\n            backdrop-filter: blur(4px);\n            border: 1px solid rgba(255,255,255,0.1);\n        }\n        .left-side-footer-buttons-group .footer-button:hover {\n            background: var(--accent-purple);\n            border-color: var(--accent-purple);\n        }\n        .config-skin-row {\n            background: transparent;\n            padding: 0;\n            gap: 6px;\n            width: auto;\n            margin-left: auto;\n            flex-shrink: 0;\n        }\n        .bottom-info-bar {\n            background: rgba(97, 93, 250, 0.8);\n            padding: 6px 12px;\n            border-radius: 30px;\n            gap: 8px;\n            flex-shrink: 0;\n        }\n        .event-info {\n            padding: 4px 10px;\n            font-size: 0.7rem;\n            background: rgba(78, 74, 200, 0.8);\n        }\n        .event-time {\n            font-size: 0.65rem;\n        }\n        .xp-text {\n            font-size: 0.7rem;\n        }\n        .progress-bar {\n            height: 0.5rem;\n        }\n        .footer-menu-toggle {\n            display: none;\n        }\n        @media (max-width: 768px) {\n            .footer-content-wrapper {\n                padding: 6px 10px;\n            }\n            .left-side-footer-buttons-group .footer-button {\n                padding: 4px 10px;\n                font-size: 0.7rem;\n            }\n            .bottom-info-bar {\n                padding: 4px 8px;\n            }\n        }\n\n        \/* Social Buttons - appear only after scrolling *\/\n        .ozg-fab-wrapper {\n            opacity: 0;\n            visibility: hidden;\n            transition: opacity 0.3s ease, visibility 0.3s ease;\n        }\n        .ozg-fab-wrapper.visible {\n            opacity: 1;\n            visibility: visible;\n        }\n        .ozg-floating-bar {\n            transition: all 0.3s ease;\n        }\n    <\/style>\n\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n\n    <!-- Cache buster meta tags for additional protection -->\n    <meta http-equiv=\"Cache-Control\" content=\"no-cache, no-store, must-revalidate\">\n    <meta http-equiv=\"Pragma\" content=\"no-cache\">\n    <meta http-equiv=\"Expires\" content=\"0\">\n    <meta name=\"ozg-user-id\" content=\"0\">\n    <meta name=\"ozg-cache-timestamp\" content=\"1791701077\">\n\n    <div class=\"ozgeris-dashboard-wrapper\">\n        <div class=\"ozg-modal-overlay\" id=\"ozgHappyOverlay\" style=\"z-index: 30000; background: #05070f; padding: 0;\">\n            <div class=\"ozg-modal\" style=\"max-width: 100%; width: 100%; height: 100%; border-radius: 0; padding: 0; background: #05070f; display: flex; flex-direction: column;\">\n                <button class=\"ozg-icon-btn\" style=\"position: absolute; right: 15px; top: 15px; z-index: 30010; background: rgba(255,255,255,0.1); width: 36px; height: 36px; border-radius: 50%;\" onclick=\"document.getElementById('ozgHappyOverlay').classList.remove('show')\">\n                    <i data-lucide=\"x\" style=\"width: 18px;\"><\/i>\n                <\/button>\n                <iframe src=\"\" style=\"flex: 1; width: 100%; height: 100%; border: none; display: block;\" id=\"ozgHappyIframe\"><\/iframe>\n            <\/div>\n        <\/div>\n        <div class=\"ozg-bg-glow-1\"><\/div>\n        <div class=\"ozg-bg-glow-2\"><\/div>\n\n        <!-- HEADER PANEL -->\n        <div class=\"ozg-header-panel\" id=\"ozgHeaderPanel\">\n            <div class=\"ozg-header-main\">\n                <a href=\"#\" class=\"ozg-profile-header\" data-elementor-popup-id=\"11000\" onclick=\"ozgOpenTrophyManually(event)\">\n                    <img alt='' src='https:\/\/secure.gravatar.com\/avatar\/?s=40&#038;d=mm&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo avatar-default' height='40' width='40' \/>                    <div class=\"ozg-profile-header-info\">\n                        <span class=\"ozg-profile-name\" id=\"ozgHeaderUserName\"><\/span>\n                        <span class=\"ozg-profile-trophy\">\n                            <a href=\"#\" class=\"ozg-trophy-button\" data-elementor-popup-id=\"15938\" onclick=\"ozgOpenTrophyManually(event)\">\n                                $<span id=\"ozgTrophyValue\">1,000,000<\/span>\n                            <\/a>\n                        <\/span>\n                    <\/div>\n                <\/a>\n                <div class=\"ozg-header-resources\">\n                    <a href=\"#\" class=\"ozg-resource-item\" data-elementor-popup-id=\"13801\">\n                        <i data-lucide=\"gem\" style=\"color:#93c5fd; width:16px;\"><\/i>\n                        <span id=\"ozgAchievementsValue\">0<\/span>\n                    <\/a>\n                    <a href=\"#\" class=\"ozg-resource-item\" data-elementor-popup-id=\"11319\">\n                        <i data-lucide=\"coins\" style=\"color:#facc15; width:16px;\"><\/i>\n                        <span id=\"ozgCoinsValue\">0<\/span>\n                    <\/a>\n                    <a href=\"#\" class=\"ozg-resource-item\" data-elementor-popup-id=\"11323\">\n                        <i data-lucide=\"zap\" style=\"color:#4ade80; width:16px;\"><\/i>\n                        <span id=\"ozgEnergyValue\"><\/span>\n                    <\/a>\n                <\/div>\n                <button class=\"ozg-header-menu-btn\" id=\"ozgHeaderMenuToggle\"><i data-lucide=\"menu\"><\/i><\/button>\n            <\/div>\n            <div class=\"ozg-header-expanded\" id=\"ozgHeaderExpanded\" style=\"display:none;\">\n                <a href=\"#\" class=\"ozg-rank-badge\" data-elementor-popup-id=\"11342\">RANK <span id=\"ozgRankValue\">0<\/span><\/a>\n                <div class=\"ozg-header-actions\">\n                                        <a href=\"https:\/\/hobbi.st\/activity\" class=\"ozg-action-btn\" id=\"ozgNewsButton\"><i data-lucide=\"newspaper\" style=\"width:16px;\"><\/i> News<\/a>\n                    <a href=\"#\" class=\"ozg-action-btn\" data-elementor-popup-id=\"11348\"><i data-lucide=\"users\" style=\"width:16px;\"><\/i> Friends<\/a>\n                    <a href=\"#\" class=\"ozg-action-btn\" data-elementor-popup-id=\"11006\"><i data-lucide=\"tent\" style=\"width:16px;\"><\/i> Club<\/a>\n                    <a href=\"#\" class=\"ozg-action-btn\" data-elementor-popup-id=\"11007\"><i data-lucide=\"swords\" style=\"width:16px;\"><\/i> Team Up<\/a>\n                    <div style=\"display:flex; gap:8px; margin-top:4px;\">\n                        <a href=\"#\" class=\"ozg-icon-action-btn\" data-elementor-popup-id=\"11459\"><i data-lucide=\"arrow-left-right\" style=\"width:18px;\"><\/i><\/a>\n                        <a href=\"#\" class=\"ozg-icon-action-btn\" data-elementor-popup-id=\"13821\"><i data-lucide=\"crown\" style=\"width:18px;\"><\/i><\/a>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        <div class=\"ozg-toast\" id=\"ozgHeaderToast\"><\/div>\n\n        <div class=\"ozg-layout\">\n            <aside class=\"ozg-sidebar ozg-glass\" id=\"ozgDesktopSidebar\">\n                <div class=\"ozg-user\">\n                    <img alt='' src='https:\/\/secure.gravatar.com\/avatar\/?s=180&#038;d=mm&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/?s=360&#038;d=mm&#038;r=g 2x' class='avatar avatar-180 photo avatar-default ozg-avatar' height='180' width='180' \/>                    <h3 style=\"margin:0; color:#fff; text-align:center;\" id=\"ozgSidebarUserName\"><\/h3>\n                    <div style=\"text-align:center;\"><span class=\"ozg-badge\" style=\"background:rgba(0,240,255,0.1); color:var(--accent-cyan); padding:4px 10px; border-radius:12px; font-size:0.75rem; margin-top:8px; display:inline-block;\">Student<\/span><\/div>\n                <\/div>\n                <nav style=\"display: flex; flex-direction: column; gap: 12px; margin-top: 10px;\">\n                    <a class=\"ozg-nav-link active\" id=\"tab-btn-kingdom\" onclick=\"ozgSwitchTab('kingdom')\"><i data-lucide=\"crown\"><\/i> Kingdom<\/a>\n                                            <a class=\"ozg-nav-link ozg-auth-link\" href=\"https:\/\/emirat.hobbi.st\/wp-login.php\" onclick=\"return ozgOpenLoginModal(event)\"><i data-lucide=\"log-in\"><\/i> Sign In<\/a>\n                                        <a class=\"ozg-nav-link\" id=\"tab-btn-bookmarks\" onclick=\"ozgSwitchTab('bookmarks')\"><i data-lucide=\"bookmark\"><\/i> Bookmarks<\/a>\n                    <a class=\"ozg-nav-link\" id=\"tab-btn-my-track\" onclick=\"ozgSwitchTab('my-track')\"><i data-lucide=\"map\"><\/i> Active Track<\/a>\n                    <a class=\"ozg-nav-link\" id=\"tab-btn-coach\" onclick=\"ozgSwitchTab('coach')\"><i data-lucide=\"plus-circle\"><\/i> Addition<\/a>\n                    <a class=\"ozg-nav-link\" id=\"tab-btn-profile\" onclick=\"ozgSwitchTab('profile')\" style=\"position:relative;display:flex;align-items:center;gap:6px;\"><i data-lucide=\"user\"><\/i> Profile                                            <\/a>\n                    <a class=\"ozg-nav-link\" id=\"tab-btn-challenges\" onclick=\"ozgSwitchTab('challenges')\"><i data-lucide=\"swords\"><\/i> Arena<\/a>\n                    <a class=\"ozg-nav-link\" id=\"tab-btn-journal\" onclick=\"ozgSwitchTab('journal')\"><i data-lucide=\"book-open\"><\/i> Chronicles<\/a>\n                                    <\/nav>\n            <\/aside>\n\n            <main class=\"ozg-main\">\n                <!-- KINGDOM SECTION \u2014 renovation marketplace (inDrive-style ordering) -->\n                <section id=\"kingdom\" class=\"ozg-section active\">\n                                <style>\n                    #reno-app { --r-bg: rgba(10,14,26,.96); --r-line: rgba(255,255,255,.09); --r-acc: var(--accent-cyan); max-width: 1120px; margin: 0 auto; padding: 0 0 90px; }\n                    #reno-app * { box-sizing: border-box; }\n                    #reno-app [hidden] { display: none !important; }\n                    .reno-modebar { display: flex; gap: 6px; padding: 4px; margin: 0 12px 12px; background: rgba(255,255,255,.05); border: 1px solid var(--r-line); border-radius: 14px; width: fit-content; }\n                    .reno-modebar button { border: 0; background: transparent; color: var(--text-muted); font-weight: 700; padding: 8px 18px; border-radius: 10px; cursor: pointer; font-family: inherit; font-size: .9rem; }\n                    .reno-modebar button.active { background: var(--r-acc); color: #000; }\n                    .reno-grid { display: grid; grid-template-columns: 1fr; gap: 0; }\n                    .reno-mapwrap { position: relative; height: 42vh; min-height: 300px; border-radius: 0 0 28px 28px; overflow: hidden; background: #0b1020; z-index: 1; }\n                    #reno-map { position: absolute; inset: 0; z-index: 1; }\n                    #reno-map .leaflet-container { background: #0b1020; font-family: inherit; }\n                    .reno-tip { background: rgba(8,12,24,.85) !important; border: 1px solid rgba(255,255,255,.15) !important; color: #fff !important; font-weight: 700; font-size: 11px; box-shadow: none !important; padding: 2px 7px !important; border-radius: 8px !important; }\n                    .reno-tip:before { display: none !important; }\n                    .reno-map-hint { position: absolute; left: 50%; top: 12px; transform: translateX(-50%); z-index: 500; background: rgba(8,12,24,.88); border: 1px solid var(--r-line); color: #fff; font-size: .82rem; font-weight: 600; padding: 8px 14px; border-radius: 999px; pointer-events: none; white-space: nowrap; }\n                    .reno-map-fail { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; text-align: center; padding: 20px; color: var(--text-muted); font-size: .9rem; }\n                    .reno-sheet { position: relative; z-index: 2; background: var(--r-bg); border: 1px solid var(--r-line); border-radius: 26px 26px 0 0; margin-top: -24px; padding: 14px 18px 22px; backdrop-filter: blur(14px); }\n                    .reno-handle { width: 42px; height: 4px; border-radius: 4px; background: rgba(255,255,255,.2); margin: 0 auto 14px; }\n                    .reno-sheet h2 { margin: 0 0 4px; font-size: 1.35rem; color: #fff; }\n                    .reno-sub { color: var(--text-muted); font-size: .85rem; margin: 0 0 14px; line-height: 1.45; }\n                    .reno-field { display: flex; align-items: center; gap: 12px; background: rgba(255,255,255,.05); border: 1px solid var(--r-line); border-radius: 14px; padding: 12px 14px; margin-bottom: 10px; }\n                    .reno-field i, .reno-field svg { width: 20px; height: 20px; color: var(--r-acc); flex-shrink: 0; }\n                    .reno-field .lbl { font-size: .68rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: .05em; }\n                    .reno-field .val { font-size: 1rem; font-weight: 700; color: #fff; }\n                    .reno-field .val.ph { color: var(--text-muted); font-weight: 500; }\n                    .reno-field input { background: transparent; border: 0; outline: 0; color: #fff; font-size: 1.1rem; font-weight: 700; width: 100%; padding: 0; margin: 0; font-family: inherit; }\n                    .reno-field > div { flex: 1; min-width: 0; }\n                    .reno-chips { display: flex; gap: 8px; overflow-x: auto; padding: 2px 0 10px; scrollbar-width: none; }\n                    .reno-chips::-webkit-scrollbar { display: none; }\n                    .reno-chip { flex-shrink: 0; border: 1px solid var(--r-line); background: rgba(255,255,255,.04); color: #cfd8e8; padding: 7px 13px; border-radius: 999px; font-size: .82rem; font-weight: 600; cursor: pointer; font-family: inherit; }\n                    .reno-chip.on { background: var(--r-acc); color: #000; border-color: var(--r-acc); }\n                    .reno-h3 { font-size: .8rem; text-transform: uppercase; letter-spacing: .06em; color: var(--text-muted); margin: 14px 0 8px; font-weight: 700; }\n                    .reno-plan { display: flex; align-items: center; gap: 12px; width: 100%; text-align: left; background: rgba(255,255,255,.04); border: 1.5px solid var(--r-line); border-radius: 16px; padding: 13px 14px; margin-bottom: 8px; cursor: pointer; color: #fff; font-family: inherit; transition: .15s; }\n                    .reno-plan.on { border-color: var(--r-acc); background: rgba(0,240,255,.08); box-shadow: 0 0 0 3px rgba(0,240,255,.12); }\n                    .reno-plan .radio { width: 20px; height: 20px; border-radius: 50%; border: 2px solid rgba(255,255,255,.3); flex-shrink: 0; position: relative; }\n                    .reno-plan.on .radio { border-color: var(--r-acc); }\n                    .reno-plan.on .radio:after { content: ''; position: absolute; inset: 3px; border-radius: 50%; background: var(--r-acc); }\n                    .reno-plan .pn { font-weight: 800; font-size: 1rem; }\n                    .reno-plan .pd { font-size: .74rem; color: var(--text-muted); margin-top: 2px; line-height: 1.35; }\n                    .reno-plan .pr { font-size: .74rem; color: var(--r-acc); margin-top: 3px; font-weight: 600; }\n                    .reno-plan .pt { text-align: right; font-weight: 800; font-size: 1rem; white-space: nowrap; }\n                    .reno-plan .pt small { display: block; font-weight: 500; font-size: .68rem; color: var(--text-muted); }\n                    .reno-cta { width: 100%; justify-content: center; font-size: 1.05rem; padding: 16px; margin-top: 10px; border-radius: 16px; }\n                    .reno-cta[disabled] { opacity: .45; cursor: not-allowed; box-shadow: none; }\n                    .reno-note { font-size: .74rem; color: var(--text-muted); text-align: center; margin-top: 8px; }\n                    .reno-summary { display: flex; align-items: center; justify-content: space-between; gap: 10px; background: rgba(255,255,255,.05); border: 1px solid var(--r-line); border-radius: 16px; padding: 12px 14px; margin-bottom: 12px; }\n                    .reno-summary b { color: #fff; }\n                    .reno-summary .meta { color: var(--text-muted); font-size: .8rem; }\n                    .reno-radar { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }\n                    .reno-pulse { width: 14px; height: 14px; border-radius: 50%; background: var(--success-color); position: relative; flex-shrink: 0; }\n                    .reno-pulse:after { content: ''; position: absolute; inset: -6px; border-radius: 50%; border: 2px solid var(--success-color); animation: renoPulse 1.6s infinite; }\n                    @keyframes renoPulse { 0% { transform: scale(.6); opacity: 1; } 100% { transform: scale(1.8); opacity: 0; } }\n                    .reno-sortbar { display: flex; align-items: center; justify-content: space-between; margin: 6px 0 10px; }\n                    .reno-sortbar .seg { display: flex; gap: 4px; }\n                    .reno-empty { text-align: center; padding: 28px 10px; color: var(--text-muted); }\n                    .reno-empty b { display: block; color: #fff; margin-bottom: 4px; font-size: 1rem; }\n                    .reno-offer { background: rgba(255,255,255,.045); border: 1px solid var(--r-line); border-radius: 18px; padding: 14px; margin-bottom: 10px; animation: fadeIn .35s ease; }\n                    .reno-offer.new { border-color: var(--success-color); }\n                    .reno-off-top { display: flex; align-items: center; gap: 12px; }\n                    .reno-avatar { width: 46px; height: 46px; border-radius: 14px; background: linear-gradient(135deg, #8a2be2, #00f0ff); display: flex; align-items: center; justify-content: center; font-weight: 800; color: #fff; flex-shrink: 0; }\n                    .reno-off-info { flex: 1; min-width: 0; }\n                    .reno-off-name { font-weight: 800; color: #fff; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n                    .reno-off-meta { font-size: .78rem; color: var(--text-muted); margin-top: 2px; }\n                    .reno-star { color: #fbbf24; font-weight: 700; }\n                    .reno-off-price { text-align: right; font-weight: 800; font-size: 1.15rem; color: #fff; white-space: nowrap; }\n                    .reno-delta { display: block; font-size: .7rem; font-weight: 700; }\n                    .reno-delta.neg { color: var(--success-color); } .reno-delta.pos { color: #ffb347; }\n                    .reno-off-detail { font-size: .82rem; color: #cfd8e8; margin: 10px 0 0; line-height: 1.45; }\n                    .reno-off-foot { display: flex; align-items: center; gap: 8px; margin-top: 12px; }\n                    .reno-timer { font-variant-numeric: tabular-nums; font-size: .8rem; color: var(--text-muted); flex: 1; }\n                    .reno-mini { padding: 9px 16px; font-size: .88rem; border-radius: 12px; }\n                    .reno-badge { display: inline-block; background: rgba(0,230,118,.14); color: var(--success-color); font-size: .66rem; font-weight: 800; padding: 2px 7px; border-radius: 999px; margin-left: 6px; vertical-align: middle; }\n                    .reno-link-danger { background: none; border: 0; color: var(--warning-color); font-weight: 600; cursor: pointer; margin: 14px auto 0; display: block; font-family: inherit; }\n                    .reno-card { background: rgba(255,255,255,.045); border: 1px solid var(--r-line); border-radius: 18px; padding: 16px; margin: 0 12px 12px; }\n                    .reno-card label { display: block; font-size: .72rem; text-transform: uppercase; letter-spacing: .05em; color: var(--text-muted); margin: 0 0 6px; }\n                    .reno-card .ozg-input { margin-bottom: 12px; }\n                    .reno-bidrow { display: grid; grid-template-columns: 1.4fr 1fr; gap: 10px; }\n                    .reno-modal { position: fixed; inset: 0; background: rgba(0,0,0,.7); z-index: 10000; display: flex; align-items: flex-end; justify-content: center; backdrop-filter: blur(4px); }\n                    .reno-modal[hidden] { display: none !important; }\n                    .reno-modal-box { background: #0d1224; border: 1px solid var(--r-line); border-radius: 26px 26px 0 0; width: 100%; max-width: 560px; max-height: 88vh; overflow-y: auto; padding: 20px 20px 28px; }\n                    @media (min-width: 700px) { .reno-modal { align-items: center; } .reno-modal-box { border-radius: 26px; } }\n                    .reno-stars { display: flex; gap: 8px; justify-content: center; margin: 14px 0; }\n                    .reno-stars button { background: none; border: 0; font-size: 2.2rem; color: rgba(255,255,255,.2); cursor: pointer; padding: 0; line-height: 1; }\n                    .reno-stars button.on { color: #fbbf24; }\n                    .reno-review { border-top: 1px solid var(--r-line); padding: 10px 0; font-size: .85rem; color: #cfd8e8; }\n                    .reno-toast { position: fixed; left: 50%; bottom: 96px; transform: translateX(-50%); background: #111a33; border: 1px solid var(--r-line); color: #fff; padding: 11px 18px; border-radius: 12px; z-index: 10001; font-size: .88rem; max-width: 90vw; box-shadow: 0 10px 30px rgba(0,0,0,.5); }\n                    \/* ---- mobile fit ---- *\/\n                    #kingdom, #kingdom .ozg-main, .ozg-main { min-width: 0; max-width: 100%; }\n                    #reno-app { width: 100%; max-width: 100%; overflow-x: hidden; }\n                    .reno-grid { grid-template-columns: minmax(0, 1fr); }\n                    .reno-grid > * { min-width: 0; max-width: 100%; }\n                    .reno-modebar { width: auto; margin: 0 0 12px; }\n                    .reno-modebar button { flex: 1; padding: 8px 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }\n                    .reno-card { margin: 0 0 12px; }\n                    .reno-summary, .reno-off-top, .reno-plan { flex-wrap: wrap; }\n                    .reno-summary > div, .reno-plan > div { min-width: 0; }\n                    .reno-off-price { white-space: normal; }\n                    .reno-off-foot { flex-wrap: wrap; }\n                    .reno-bidrow { grid-template-columns: 1fr 1fr; }\n                    .reno-field .val { overflow-wrap: anywhere; }\n                    .reno-sheet { padding-left: 14px; padding-right: 14px; }\n                    .reno-modal-box { max-width: 100%; }\n                    @media (max-width: 480px) {\n                        .reno-sheet h2 { font-size: 1.15rem; }\n                        .reno-plan { padding: 11px; gap: 8px; }\n                        .reno-plan .pt { flex-basis: 100%; text-align: left; }\n                        .reno-map-hint { max-width: calc(100% - 24px); white-space: normal; text-align: center; }\n                        .reno-toast { max-width: calc(100vw - 24px); white-space: normal; text-align: center; }\n                    }\n                    @media (min-width: 960px) {\n                        .reno-grid { grid-template-columns: 1.15fr 480px; gap: 20px; align-items: start; padding: 0 12px; }\n                        .reno-mapwrap { height: 680px; border-radius: 24px; position: sticky; top: 76px; }\n                        .reno-sheet { margin-top: 0; border-radius: 24px; }\n                        .reno-handle { display: none; }\n                    }\n                <\/style>\n\n                <div id=\"reno-app\">\n                    <div class=\"reno-modebar\">\n                        <button id=\"reno-mode-client\" class=\"active\" onclick=\"renoSetMode('client')\"><\/button>\n                        <button id=\"reno-mode-pro\" onclick=\"renoSetMode('pro')\"><\/button>\n                    <\/div>\n\n                    <!-- CLIENT MODE -->\n                    <div id=\"reno-client\" class=\"reno-grid\">\n                        <div class=\"reno-mapwrap\">\n                            <div id=\"reno-map\"><\/div>\n                            <div class=\"reno-map-hint\" id=\"reno-map-hint\"><\/div>\n                        <\/div>\n                        <div class=\"reno-sheet\">\n                            <div class=\"reno-handle\"><\/div>\n\n                            <!-- Stage 1: order form -->\n                            <div id=\"reno-s-order\">\n                                <h2 id=\"reno-t-title\"><\/h2>\n                                <p class=\"reno-sub\" id=\"reno-t-sub\"><\/p>\n                                <div id=\"reno-expired-note\" class=\"reno-sub\" style=\"color:#ffb347;\" hidden><\/div>\n\n                                <div class=\"reno-field\"><i data-lucide=\"map-pin\"><\/i>\n                                    <div><div class=\"lbl\" id=\"reno-l-district\"><\/div><div class=\"val ph\" id=\"reno-district-val\"><\/div><\/div>\n                                <\/div>\n                                <div class=\"reno-chips\" id=\"reno-district-chips\"><\/div>\n\n                                <div class=\"reno-field\"><i data-lucide=\"ruler\"><\/i>\n                                    <div><div class=\"lbl\" id=\"reno-l-area\"><\/div><input type=\"number\" inputmode=\"numeric\" id=\"reno-sqm\" min=\"10\" max=\"2000\" oninput=\"renoOnSqm()\"><\/div>\n                                <\/div>\n                                <div class=\"reno-chips\" id=\"reno-sqm-chips\"><\/div>\n\n                                <div class=\"reno-h3\" id=\"reno-t-plans\"><\/div>\n                                <div id=\"reno-plans\"><\/div>\n                                <button class=\"ozg-btn reno-cta\" id=\"reno-cta\" onclick=\"renoSubmitOrder()\" disabled><\/button>\n                                <div class=\"reno-note\" id=\"reno-t-note\"><\/div>\n                            <\/div>\n\n                            <!-- Stage 2: offers -->\n                            <div id=\"reno-s-offers\" hidden>\n                                <div class=\"reno-summary\">\n                                    <div><b id=\"reno-sum-title\"><\/b><div class=\"meta\" id=\"reno-sum-meta\"><\/div><\/div>\n                                    <div style=\"text-align:right;\"><div class=\"meta\" id=\"reno-sum-lbl\"><\/div><b id=\"reno-sum-total\"><\/b><\/div>\n                                <\/div>\n                                <div class=\"reno-radar\"><div class=\"reno-pulse\"><\/div>\n                                    <div><b style=\"color:#fff;\" id=\"reno-radar-title\"><\/b><div class=\"reno-sub\" style=\"margin:2px 0 0;\" id=\"reno-radar-sub\"><\/div><\/div>\n                                <\/div>\n                                <div class=\"reno-sortbar\">\n                                    <div class=\"reno-h3\" style=\"margin:0;\" id=\"reno-t-offers\"><\/div>\n                                    <div class=\"seg\"><button class=\"reno-chip on\" id=\"reno-sort-price\" onclick=\"renoSort('price')\"><\/button><button class=\"reno-chip\" id=\"reno-sort-rating\" onclick=\"renoSort('rating')\"><\/button><\/div>\n                                <\/div>\n                                <div id=\"reno-offers\"><\/div>\n                                <button class=\"reno-link-danger\" id=\"reno-cancel\" onclick=\"renoCancelOrder()\"><\/button>\n                            <\/div>\n\n                            <!-- Stage 3: awarded -->\n                            <div id=\"reno-s-awarded\" hidden>\n                                <div style=\"text-align:center; padding:6px 0 14px;\">\n                                    <div style=\"width:64px;height:64px;border-radius:50%;background:rgba(0,230,118,.14);display:flex;align-items:center;justify-content:center;margin:0 auto 10px;\"><i data-lucide=\"check\" style=\"color:var(--success-color);width:32px;height:32px;\"><\/i><\/div>\n                                    <h2 id=\"reno-aw-title\"><\/h2><p class=\"reno-sub\" id=\"reno-aw-sub\"><\/p>\n                                <\/div>\n                                <div id=\"reno-aw-card\"><\/div>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <!-- CONTRACTOR MODE -->\n                    <div id=\"reno-pro\" hidden><\/div>\n                <\/div>\n\n                <div id=\"reno-modal\" class=\"reno-modal\" hidden onclick=\"if(event.target===this)renoCloseModal()\"><div class=\"reno-modal-box\" id=\"reno-modal-box\"><\/div><\/div>\n\n                <script>\n                (function () {\n                    const cfg = {\"api\":\"https:\\\/\\\/emirat.hobbi.st\\\/ru\\\/wp-json\\\/ozgeris\\\/v1\\\/reno\",\"nonce\":\"ccee4439e6\",\"currency\":\"\\u20b8\",\"minSqm\":10,\"maxSqm\":2000,\"bidMin\":0.7,\"bidMax\":1.4,\"map\":{\"lat\":43.25,\"lng\":76.93,\"zoom\":11},\"districts\":[{\"key\":\"alatau\",\"name\":\"Alatau\",\"lat\":43.32,\"lng\":76.865,\"r\":3200},{\"key\":\"almaly\",\"name\":\"Almaly\",\"lat\":43.262,\"lng\":76.925,\"r\":2200},{\"key\":\"auezov\",\"name\":\"Auezov\",\"lat\":43.228,\"lng\":76.855,\"r\":2800},{\"key\":\"bostandyk\",\"name\":\"Bostandyk\",\"lat\":43.215,\"lng\":76.925,\"r\":2800},{\"key\":\"jetysu\",\"name\":\"Jetysu\",\"lat\":43.297,\"lng\":76.935,\"r\":2400},{\"key\":\"medeu\",\"name\":\"Medeu\",\"lat\":43.24,\"lng\":76.985,\"r\":2800},{\"key\":\"nauryzbay\",\"name\":\"Nauryzbay\",\"lat\":43.19,\"lng\":76.8,\"r\":3400},{\"key\":\"turksib\",\"name\":\"Turksib\",\"lat\":43.34,\"lng\":76.995,\"r\":3000}],\"plans\":[{\"key\":\"comfort\",\"name\":\"Comfort\",\"rate\":100000,\"desc\":\"Cosmetic renovation: wall & ceiling finishing, flooring, basic electrics\"},{\"key\":\"business\",\"name\":\"Business\",\"rate\":130000,\"desc\":\"Full renovation: new plumbing & electrics, quality materials, custom lighting\"},{\"key\":\"premium\",\"name\":\"Premium\",\"rate\":170000,\"desc\":\"Turnkey premium: design project, premium materials, smart home, site supervision\"}],\"t\":{\"order_title\":\"Renovate your property\",\"order_sub\":\"Pick district, area and package. Contractors will bid for your project.\",\"district\":\"District\",\"district_ph\":\"Tap a district on the map\",\"area\":\"Property area\",\"area_ph\":\"Area, m\\u00b2\",\"plans_title\":\"Choose a renovation package\",\"per_m2\":\"{0} per m\\u00b2\",\"plan_note\":\"Average market price. The final price is set by contractor offers.\",\"find_cta\":\"Find contractors\",\"need_district\":\"Choose a district\",\"need_area\":\"Enter property area\",\"need_plan\":\"Choose a package\",\"map_hint\":\"Tap your district on the map\",\"map_fail\":\"Map unavailable. Choose a district from the list.\",\"searching\":\"Contractors are reviewing your request\",\"notified\":\"{0} free companies in {1} were notified\",\"notified_none\":\"No free companies in {0} yet. Your request stays open for 12 hours.\",\"budget\":\"Average budget\",\"offers\":\"Offers\",\"sort_price\":\"Cheapest\",\"sort_rating\":\"Top rated\",\"no_offers\":\"Waiting for offers\\u2026\",\"no_offers_sub\":\"Offers usually start arriving within minutes. Each offer stays valid for 12 hours.\",\"cancel_order\":\"Cancel request\",\"cancel_confirm\":\"Cancel this request? All offers will be discarded.\",\"works\":\"{0} works\",\"reviews\":\"{0} reviews\",\"new_co\":\"New\",\"days\":\"{0} days\",\"profile\":\"Profile\",\"accept\":\"Accept\",\"accept_confirm\":\"Accept the offer from {0} for {1}?\",\"awarded_title\":\"Contractor chosen\",\"awarded_sub\":\"Call the company to agree on details and the start date.\",\"call\":\"Call\",\"complete\":\"Mark as completed\",\"rate_title\":\"Rate the work\",\"rate_ph\":\"Leave a comment (optional)\",\"send\":\"Send\",\"expired_notice\":\"Your previous request expired without a chosen offer.\",\"mode_client\":\"Renovation\",\"mode_pro\":\"Contractor\",\"pro_profile\":\"Company profile\",\"pro_setup\":\"Fill in your company profile to start receiving requests.\",\"pro_name\":\"Company name\",\"pro_phone\":\"Phone\",\"pro_about\":\"About the company\",\"pro_years\":\"Years on the market\",\"pro_prior\":\"Projects completed before joining\",\"pro_districts\":\"Districts you work in\",\"free\":\"Free\",\"busy\":\"Busy\",\"save\":\"Save\",\"saved\":\"Saved\",\"inbox\":\"Open requests\",\"inbox_empty\":\"No open requests in your districts right now.\",\"bid_price\":\"Your price, \\u20b8\",\"bid_days\":\"Days\",\"bid_comment\":\"Comment for the client\",\"place_bid\":\"Send offer\",\"update_bid\":\"Update offer\",\"your_bid\":\"Your offer is active\",\"bid_range\":\"Allowed: {0} \\u2013 {1}\",\"closes_in\":\"Bidding closes in\",\"won\":\"Won projects\",\"verified\":\"Verified\",\"about\":\"About\",\"works_in\":\"Works in\",\"years_exp\":\"{0} years on the market\",\"recent_reviews\":\"Recent reviews\",\"via_platform\":\"{0} via Ozgeris\",\"login_needed\":\"Sign in to send your request\",\"error\":\"Something went wrong. Please try again.\"}};\n                    const T = (k, ...a) => { let s = cfg.t[k] || k; a.forEach((v, i) => { s = s.split('{' + i + '}').join(v); }); return s; };\n                    const $ = id => document.getElementById(id);\n                    const esc = s => String(s == null ? '' : s).replace(\/[&<>\"']\/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\n                    const money = n => Math.round(n).toString().replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, '\\u00a0') + '\\u00a0' + cfg.currency;\n                    const hms = s => { s = Math.max(0, s); const h = Math.floor(s \/ 3600), m = Math.floor(s % 3600 \/ 60), x = s % 60; return [h, m, x].map(v => String(v).padStart(2, '0')).join(':'); };\n                    const isGuest = () => (typeof ozgI18n !== 'undefined' && ozgI18n.isGuest);\n                    const distName = k => (cfg.districts.find(d => d.key === k) || {}).name || k;\n                    const planOf = k => cfg.plans.find(p => p.key === k);\n                    const icons = () => { if (window.lucide) lucide.createIcons(); };\n\n                    const st = { mode: 'client', district: null, sqm: '', plan: null, order: null, company: null, timeOff: 0, sort: 'price', seen: null, inited: false, map: null, layers: {}, busy: false, rating: 0, inbox: null };\n\n                    async function api(path, method, body) {\n                        const res = await fetch(cfg.api + path, { method: method || 'GET', credentials: 'same-origin', headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': cfg.nonce }, body: body ? JSON.stringify(body) : undefined });\n                        let data = null; try { data = await res.json(); } catch (e) {}\n                        if (!res.ok) throw new Error((data && data.message) || T('error'));\n                        if (data && data.now) st.timeOff = data.now - Date.now() \/ 1000;\n                        return data;\n                    }\n                    function toast(msg) { const t = document.createElement('div'); t.className = 'reno-toast'; t.textContent = msg; document.body.appendChild(t); setTimeout(() => t.remove(), 3200); }\n                    const nowTs = () => Date.now() \/ 1000 + st.timeOff;\n\n                    \/\/ ---------- static texts \/ lists ----------\n                    function buildStatic() {\n                        $('reno-mode-client').textContent = T('mode_client');\n                        $('reno-mode-pro').textContent = T('mode_pro');\n                        $('reno-t-title').textContent = T('order_title');\n                        $('reno-t-sub').textContent = T('order_sub');\n                        $('reno-l-district').textContent = T('district');\n                        $('reno-district-val').textContent = T('district_ph');\n                        $('reno-l-area').textContent = T('area');\n                        $('reno-sqm').placeholder = T('area_ph');\n                        $('reno-t-plans').textContent = T('plans_title');\n                        $('reno-t-note').textContent = T('plan_note');\n                        $('reno-map-hint').textContent = T('map_hint');\n                        $('reno-t-offers').textContent = T('offers');\n                        $('reno-sort-price').textContent = T('sort_price');\n                        $('reno-sort-rating').textContent = T('sort_rating');\n                        $('reno-cancel').textContent = T('cancel_order');\n                        $('reno-sum-lbl').textContent = T('budget');\n                        $('reno-aw-title').textContent = T('awarded_title');\n                        $('reno-aw-sub').textContent = T('awarded_sub');\n\n                        $('reno-district-chips').innerHTML = cfg.districts.map(d => `<button class=\"reno-chip\" data-d=\"${esc(d.key)}\" onclick=\"renoPickDistrict('${esc(d.key)}',true)\">${esc(d.name)}<\/button>`).join('');\n                        $('reno-sqm-chips').innerHTML = [40, 60, 80, 100, 150].map(v => `<button class=\"reno-chip\" onclick=\"renoSetSqm(${v})\">${v} m\u00b2<\/button>`).join('');\n                        $('reno-plans').innerHTML = cfg.plans.map(p => `\n                            <button class=\"reno-plan\" data-p=\"${esc(p.key)}\" onclick=\"renoPickPlan('${esc(p.key)}')\">\n                                <span class=\"radio\"><\/span>\n                                <span style=\"flex:1;min-width:0;\"><div class=\"pn\">${esc(p.name)}<\/div><div class=\"pd\">${esc(p.desc)}<\/div><div class=\"pr\">${esc(T('per_m2', money(p.rate)))}<\/div><\/span>\n                                <span class=\"pt\" data-total=\"${esc(p.key)}\">\u2014<\/span>\n                            <\/button>`).join('');\n                    }\n\n                    \/\/ ---------- map ----------\n                    function loadLeaflet() {\n                        return new Promise((res, rej) => {\n                            if (window.L) return res();\n                            const css = document.createElement('link'); css.rel = 'stylesheet'; css.href = 'https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css'; document.head.appendChild(css);\n                            const s = document.createElement('script'); s.src = 'https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js'; s.onload = res; s.onerror = rej; document.head.appendChild(s);\n                        });\n                    }\n                    async function initMap() {\n                        try { await loadLeaflet(); } catch (e) {\n                            $('reno-map').innerHTML = '<div class=\"reno-map-fail\">' + esc(T('map_fail')) + '<\/div>'; $('reno-map-hint').hidden = true; return;\n                        }\n                        const c = cfg.map;\n                        st.map = L.map('reno-map', { zoomControl: false, attributionControl: true }).setView([c.lat, c.lng], c.zoom);\n                        L.tileLayer('https:\/\/{s}.basemaps.cartocdn.com\/dark_all\/{z}\/{x}\/{y}{r}.png', { maxZoom: 18, attribution: '&copy; OpenStreetMap &copy; CARTO' }).addTo(st.map);\n                        cfg.districts.forEach(d => {\n                            const circle = L.circle([d.lat, d.lng], { radius: d.r || 2500, color: '#00f0ff', weight: 1.2, fillColor: '#00f0ff', fillOpacity: 0.08 }).addTo(st.map);\n                            circle.bindTooltip(d.name, { permanent: true, direction: 'center', className: 'reno-tip' });\n                            circle.on('click', e => { L.DomEvent.stopPropagation(e); pickDistrict(d.key, false); });\n                            st.layers[d.key] = circle;\n                        });\n                        st.map.on('click', e => {\n                            let best = null, bd = Infinity;\n                            cfg.districts.forEach(d => { const m = st.map.distance(e.latlng, [d.lat, d.lng]); if (m < bd) { bd = m; best = d; } });\n                            if (best && bd < 7000) pickDistrict(best.key, false);\n                        });\n                        if (st.district) paintDistrict();\n                    }\n                    function paintDistrict() {\n                        Object.keys(st.layers).forEach(k => st.layers[k].setStyle(k === st.district ? { fillOpacity: 0.38, weight: 2.5, color: '#00e676', fillColor: '#00e676' } : { fillOpacity: 0.08, weight: 1.2, color: '#00f0ff', fillColor: '#00f0ff' }));\n                    }\n                    function pickDistrict(key, fly) {\n                        if (st.order) return; \/\/ locked while a request is live\n                        st.district = key;\n                        const v = $('reno-district-val'); v.textContent = distName(key); v.classList.remove('ph');\n                        document.querySelectorAll('#reno-district-chips .reno-chip').forEach(b => b.classList.toggle('on', b.dataset.d === key));\n                        const chip = document.querySelector('#reno-district-chips .reno-chip.on'); if (chip) chip.scrollIntoView({ block: 'nearest', inline: 'center', behavior: 'smooth' });\n                        if (st.map) { paintDistrict(); if (fly) { const d = cfg.districts.find(x => x.key === key); st.map.flyTo([d.lat, d.lng], 12, { duration: .6 }); } }\n                        $('reno-map-hint').hidden = true;\n                        refreshOrderUI();\n                    }\n                    window.renoPickDistrict = pickDistrict;\n\n                    \/\/ ---------- order form ----------\n                    window.renoSetSqm = v => { $('reno-sqm').value = v; renoOnSqm(); };\n                    window.renoOnSqm = () => { st.sqm = parseInt($('reno-sqm').value, 10) || ''; refreshOrderUI(); };\n                    window.renoPickPlan = k => { st.plan = k; refreshOrderUI(); };\n                    function refreshOrderUI() {\n                        const sqm = +st.sqm || 0;\n                        cfg.plans.forEach(p => { const el = document.querySelector(`[data-total=\"${p.key}\"]`); if (el) el.innerHTML = sqm ? esc(money(sqm * p.rate)) + '<small>\u2248 ' + esc(T('budget').toLowerCase()) + '<\/small>' : '\u2014'; });\n                        document.querySelectorAll('.reno-plan').forEach(b => b.classList.toggle('on', b.dataset.p === st.plan));\n                        const btn = $('reno-cta'); const okSqm = sqm >= cfg.minSqm && sqm <= cfg.maxSqm;\n                        let label = T('find_cta'), ok = false;\n                        if (!st.district) label = T('need_district');\n                        else if (!okSqm) label = T('need_area');\n                        else if (!st.plan) label = T('need_plan');\n                        else { ok = true; label = T('find_cta') + ' \u00b7 ' + money(sqm * planOf(st.plan).rate); }\n                        btn.textContent = label; btn.disabled = !ok || st.busy;\n                    }\n                    window.renoSubmitOrder = async () => {\n                        if (isGuest()) { if (typeof ozgShowSignUpPrompt === 'function') ozgShowSignUpPrompt(); else toast(T('login_needed')); return; }\n                        st.busy = true; refreshOrderUI();\n                        try {\n                            const r = await api('\/order', 'POST', { district: st.district, sqm: st.sqm, plan: st.plan });\n                            st.seen = new Set(); applyOrder(r.order);\n                        } catch (e) { toast(e.message); }\n                        st.busy = false; refreshOrderUI();\n                    };\n\n                    \/\/ ---------- stages ----------\n                    function showStage(name) {\n                        ['order', 'offers', 'awarded'].forEach(s => { $('reno-s-' + s).hidden = s !== name; });\n                        setTimeout(() => { if (st.map) st.map.invalidateSize(); }, 50);\n                        icons();\n                    }\n                    function applyOrder(o) {\n                        st.order = o;\n                        if (!o) {\n                            const v = $('reno-district-val');\n                            if (st.district) { v.textContent = distName(st.district); v.classList.remove('ph'); } else { v.textContent = T('district_ph'); v.classList.add('ph'); $('reno-map-hint').hidden = false; }\n                            document.querySelectorAll('#reno-district-chips .reno-chip').forEach(b => b.classList.toggle('on', b.dataset.d === st.district));\n                            if (st.map) paintDistrict();\n                            showStage('order'); refreshOrderUI(); return;\n                        }\n                        st.district = o.district; st.plan = o.plan;\n                        if (st.map) { paintDistrict(); const d = cfg.districts.find(x => x.key === o.district); if (d) st.map.flyTo([d.lat, d.lng], 12, { duration: .6 }); }\n                        $('reno-map-hint').hidden = true;\n                        if (o.status === 'awarded') { renderAwarded(); showStage('awarded'); }\n                        else { renderOffersHeader(); renderOffers(); showStage('offers'); }\n                    }\n                    function renderOffersHeader() {\n                        const o = st.order;\n                        $('reno-sum-title').textContent = o.plan_name + ' \u00b7 ' + o.sqm + ' m\u00b2';\n                        $('reno-sum-meta').textContent = o.district_name;\n                        $('reno-sum-total').textContent = money(o.total);\n                        $('reno-radar-title').textContent = T('searching');\n                        $('reno-radar-sub').textContent = o.notified > 0 ? T('notified', o.notified, o.district_name) : T('notified_none', o.district_name);\n                    }\n                    window.renoSort = k => {\n                        st.sort = k;\n                        $('reno-sort-price').classList.toggle('on', k === 'price');\n                        $('reno-sort-rating').classList.toggle('on', k === 'rating');\n                        renoRenderOffers();\n                    };\n                    function initials(n) { return String(n || '?').trim().split(\/\\s+\/).slice(0, 2).map(w => w[0]).join('').toUpperCase(); }\n                    function companyMeta(c) {\n                        const r = c.reviews_count ? `<span class=\"reno-star\">\u2605 ${c.rating.toFixed(1)}<\/span> (${c.reviews_count})` : `<span class=\"reno-star\">\u2605<\/span> ${esc(T('new_co'))}`;\n                        return r + ' \u00b7 ' + esc(T('works', c.works_total));\n                    }\n                    function renderOffers() {\n                        const o = st.order; if (!o) return;\n                        const list = (o.bids || []).slice();\n                        if (st.sort === 'rating') list.sort((a, b) => (b.company.rating - a.company.rating) || (b.company.works_total - a.company.works_total) || (a.price - b.price));\n                        else list.sort((a, b) => a.price - b.price);\n                        const box = $('reno-offers');\n                        if (!list.length) { box.innerHTML = `<div class=\"reno-empty\"><b>${esc(T('no_offers'))}<\/b>${esc(T('no_offers_sub'))}<\/div>`; return; }\n                        box.innerHTML = list.map(b => {\n                            const c = b.company || {};\n                            const isNew = st.seen && !st.seen.has(b.id);\n                            const d = b.delta_pct;\n                            return `<div class=\"reno-offer ${isNew ? 'new' : ''}\" data-bid=\"${b.id}\">\n                                <div class=\"reno-off-top\">\n                                    <div class=\"reno-avatar\">${esc(initials(c.name))}<\/div>\n                                    <div class=\"reno-off-info\"><div class=\"reno-off-name\">${esc(c.name)}${c.verified ? `<span class=\"reno-badge\">${esc(T('verified'))}<\/span>` : ''}<\/div><div class=\"reno-off-meta\">${companyMeta(c)}<\/div><\/div>\n                                    <div class=\"reno-off-price\">${esc(money(b.price))}<span class=\"reno-delta ${d <= 0 ? 'neg' : 'pos'}\">${d > 0 ? '+' : ''}${d}%<\/span><\/div>\n                                <\/div>\n                                <div class=\"reno-off-detail\">\u23f1 ${esc(T('days', b.days))}${b.comment ? ' \u00b7 ' + esc(b.comment) : ''}<\/div>\n                                <div class=\"reno-off-foot\">\n                                    <span class=\"reno-timer\" data-exp=\"${b.expires_ts}\" data-kill=\"1\">${hms(Math.floor(b.expires_ts - nowTs()))}<\/span>\n                                    <button class=\"ozg-btn-sec reno-mini\" onclick=\"renoOpenProfile(${c.id},${b.id})\">${esc(T('profile'))}<\/button>\n                                    <button class=\"ozg-btn reno-mini\" onclick=\"renoAccept(${b.id})\">${esc(T('accept'))}<\/button>\n                                <\/div>\n                            <\/div>`;\n                        }).join('');\n                    }\n                    window.renoRenderOffers = renderOffers;\n                    function markSeen() { if (st.order && st.seen) (st.order.bids || []).forEach(b => st.seen.add(b.id)); }\n\n                    window.renoAccept = async bidId => {\n                        const b = (st.order.bids || []).find(x => x.id === bidId); if (!b) return;\n                        if (!confirm(T('accept_confirm', b.company.name, money(b.price)))) return;\n                        try { const r = await api('\/bid\/accept', 'POST', { bid_id: bidId }); renoCloseModal(); applyOrder(r.order); }\n                        catch (e) { toast(e.message); pollOrder(); }\n                    };\n                    window.renoCancelOrder = async () => {\n                        if (!confirm(T('cancel_confirm'))) return;\n                        try { await api('\/order\/cancel', 'POST', { order_id: st.order.id }); st.order = null; applyOrder(null); }\n                        catch (e) { toast(e.message); }\n                    };\n                    function renderAwarded() {\n                        const o = st.order, w = o.winner; if (!w) { $('reno-aw-card').innerHTML = ''; return; }\n                        const c = w.bid.company || {};\n                        $('reno-aw-card').innerHTML = `\n                            <div class=\"reno-offer\"><div class=\"reno-off-top\"><div class=\"reno-avatar\">${esc(initials(c.name))}<\/div>\n                                <div class=\"reno-off-info\"><div class=\"reno-off-name\">${esc(c.name)}<\/div><div class=\"reno-off-meta\">${companyMeta(c)}<\/div><\/div>\n                                <div class=\"reno-off-price\">${esc(money(w.bid.price))}<\/div><\/div>\n                                <div class=\"reno-off-detail\">\u23f1 ${esc(T('days', w.bid.days))} \u00b7 ${esc(o.plan_name)} \u00b7 ${o.sqm} m\u00b2 \u00b7 ${esc(o.district_name)}<\/div><\/div>\n                            ${w.phone ? `<a class=\"ozg-btn reno-cta\" style=\"display:flex;text-decoration:none;\" href=\"tel:${esc(w.phone)}\">\ud83d\udcde ${esc(T('call'))} ${esc(w.phone)}<\/a>` : ''}\n                            <button class=\"ozg-btn-sec reno-cta\" style=\"display:flex;\" onclick=\"renoOpenRate()\">${esc(T('complete'))}<\/button>`;\n                    }\n                    window.renoOpenRate = () => {\n                        st.rating = 0;\n                        openModal(`<h2 style=\"margin:0;color:#fff;text-align:center;\">${esc(T('rate_title'))}<\/h2>\n                            <div class=\"reno-stars\" id=\"reno-stars\">${[1, 2, 3, 4, 5].map(n => `<button onclick=\"renoStar(${n})\">\u2605<\/button>`).join('')}<\/div>\n                            <textarea id=\"reno-rate-text\" class=\"ozg-input\" rows=\"3\" maxlength=\"300\" placeholder=\"${esc(T('rate_ph'))}\"><\/textarea>\n                            <button class=\"ozg-btn reno-cta\" onclick=\"renoSendRate()\">${esc(T('send'))}<\/button>`);\n                    };\n                    window.renoStar = n => { st.rating = n; document.querySelectorAll('#reno-stars button').forEach((b, i) => b.classList.toggle('on', i < n)); };\n                    window.renoSendRate = async () => {\n                        if (!st.rating) return;\n                        try { await api('\/order\/complete', 'POST', { order_id: st.order.id, rating: st.rating, comment: $('reno-rate-text').value }); renoCloseModal(); st.order = null; st.district = null; st.plan = null; applyOrder(null); }\n                        catch (e) { toast(e.message); }\n                    };\n\n                    \/\/ ---------- modal \/ company profile ----------\n                    function openModal(html) { if ($('reno-modal').parentNode !== document.body) document.body.appendChild($('reno-modal')); $('reno-modal-box').innerHTML = html; $('reno-modal').hidden = false; icons(); }\n                    window.renoCloseModal = () => { $('reno-modal').hidden = true; };\n                    window.renoOpenProfile = async (cid, bidId) => {\n                        openModal('<div class=\"reno-empty\">\u2026<\/div>');\n                        try {\n                            const c = await api('\/company\/' + cid);\n                            const bid = bidId && st.order ? (st.order.bids || []).find(x => x.id === bidId) : null;\n                            openModal(`\n                                <div class=\"reno-off-top\" style=\"margin-bottom:14px;\"><div class=\"reno-avatar\" style=\"width:56px;height:56px;\">${esc(initials(c.name))}<\/div>\n                                    <div class=\"reno-off-info\"><div class=\"reno-off-name\" style=\"font-size:1.15rem;white-space:normal;\">${esc(c.name)}${c.verified ? `<span class=\"reno-badge\">${esc(T('verified'))}<\/span>` : ''}<\/div><div class=\"reno-off-meta\">${companyMeta(c)}<\/div><\/div><\/div>\n                                <div class=\"reno-summary\" style=\"flex-wrap:wrap;\">\n                                    <span class=\"meta\">${esc(T('years_exp', c.years))}<\/span>\n                                    <span class=\"meta\">${esc(T('via_platform', c.works_platform))}<\/span><\/div>\n                                ${c.about ? `<div class=\"reno-h3\">${esc(T('about'))}<\/div><div style=\"color:#cfd8e8;font-size:.9rem;line-height:1.5;\">${esc(c.about)}<\/div>` : ''}\n                                <div class=\"reno-h3\">${esc(T('works_in'))}<\/div><div style=\"color:#cfd8e8;font-size:.9rem;\">${esc((c.districts || []).map(distName).join(', '))}<\/div>\n                                ${(c.reviews || []).length ? `<div class=\"reno-h3\">${esc(T('recent_reviews'))}<\/div>` + c.reviews.map(r => `<div class=\"reno-review\"><span class=\"reno-star\">${'\u2605'.repeat(r.rating)}<\/span> <span style=\"color:var(--text-muted);\">${esc(r.author)} \u00b7 ${esc(r.date)} \u00b7 ${r.sqm} m\u00b2<\/span>${r.text ? `<div style=\"margin-top:4px;\">${esc(r.text)}<\/div>` : ''}<\/div>`).join('') : ''}\n                                ${bid ? `<button class=\"ozg-btn reno-cta\" onclick=\"renoAccept(${bid.id})\">${esc(T('accept'))} \u00b7 ${esc(money(bid.price))}<\/button>` : ''}`);\n                        } catch (e) { renoCloseModal(); toast(e.message); }\n                    };\n\n                    \/\/ ---------- polling \/ timers ----------\n                    async function pollOrder() {\n                        if (isGuest() || st.mode !== 'client') return;\n                        try {\n                            const s = await api('\/state');\n                            st.company = s.company;\n                            if (s.order && st.order && s.order.id === st.order.id && s.order.status === 'open') {\n                                const fresh = (s.order.bids || []).filter(b => st.seen && !st.seen.has(b.id));\n                                st.order = s.order; renderOffersHeader(); renderOffers();\n                                if (fresh.length) { toast('\ud83d\udd14 ' + T('offers') + ': +' + fresh.length); if (navigator.vibrate) navigator.vibrate(60); setTimeout(() => { markSeen(); }, 4000); }\n                            } else if (!!s.order !== !!st.order || (s.order && st.order && (s.order.id !== st.order.id || s.order.status !== st.order.status))) {\n                                if (!s.order && s.expired) { const n = $('reno-expired-note'); n.textContent = T('expired_notice'); n.hidden = false; }\n                                st.seen = st.seen || new Set(); applyOrder(s.order); markSeen();\n                            }\n                        } catch (e) {}\n                    }\n                    function tick() {\n                        const now = nowTs(); let killed = false;\n                        document.querySelectorAll('[data-exp]').forEach(el => {\n                            const left = Math.floor(+el.dataset.exp - now);\n                            el.textContent = hms(left);\n                            if (left <= 0 && el.dataset.kill) {\n                                const card = el.closest('.reno-offer');\n                                if (card && st.order) { st.order.bids = (st.order.bids || []).filter(b => String(b.id) !== card.dataset.bid); killed = true; }\n                            }\n                        });\n                        if (killed) renderOffers();\n                    }\n                    function active() { const k = $('kingdom'); return k && k.classList.contains('active') && !document.hidden; }\n\n                    \/\/ ---------- contractor mode ----------\n                    window.renoSetMode = m => {\n                        st.mode = m;\n                        $('reno-mode-client').classList.toggle('active', m === 'client');\n                        $('reno-mode-pro').classList.toggle('active', m === 'pro');\n                        $('reno-client').hidden = m !== 'client'; $('reno-pro').hidden = m !== 'pro';\n                        if (m === 'pro') { if (isGuest()) { renoSetMode('client'); if (typeof ozgShowSignUpPrompt === 'function') ozgShowSignUpPrompt(); return; } loadPro(); }\n                        else setTimeout(() => { if (st.map) st.map.invalidateSize(); }, 60);\n                    };\n                    async function loadPro() {\n                        try {\n                            const s = await api('\/state'); st.company = s.company;\n                            if (st.company) { const i = await api('\/inbox'); st.inbox = i; } else st.inbox = null;\n                        } catch (e) { toast(e.message); }\n                        renderPro();\n                    }\n                    function renderPro() {\n                        const c = st.company || { name: '', phone: '', about: '', years: '', prior_works: '', districts: [], status: 'free' };\n                        const stats = st.company ? `<div class=\"reno-summary\"><span class=\"reno-off-meta\">${companyMeta(c)}<\/span><span class=\"reno-off-meta\">${esc(T('via_platform', c.works_platform))}<\/span><\/div>` : `<div class=\"reno-sub\">${esc(T('pro_setup'))}<\/div>`;\n                        let html = `<div class=\"reno-card\"><div class=\"reno-h3\" style=\"margin-top:0;\">${esc(T('pro_profile'))}<\/div>${stats}\n                            <label>${esc(T('pro_name'))}<\/label><input class=\"ozg-input\" id=\"rp-name\" maxlength=\"60\" value=\"${esc(c.name)}\">\n                            <label>${esc(T('pro_phone'))}<\/label><input class=\"ozg-input\" id=\"rp-phone\" inputmode=\"tel\" value=\"${esc(c.phone)}\" placeholder=\"+7 ...\">\n                            <label>${esc(T('pro_about'))}<\/label><textarea class=\"ozg-input\" id=\"rp-about\" rows=\"3\" maxlength=\"600\">${esc(c.about)}<\/textarea>\n                            <div class=\"reno-bidrow\"><div><label>${esc(T('pro_years'))}<\/label><input class=\"ozg-input\" id=\"rp-years\" type=\"number\" min=\"0\" value=\"${esc(c.years)}\"><\/div>\n                            <div><label>${esc(T('pro_prior'))}<\/label><input class=\"ozg-input\" id=\"rp-prior\" type=\"number\" min=\"0\" value=\"${esc(c.prior_works)}\"><\/div><\/div>\n                            <label>${esc(T('pro_districts'))}<\/label>\n                            <div class=\"reno-chips\" style=\"flex-wrap:wrap;\" id=\"rp-districts\">${cfg.districts.map(d => `<button class=\"reno-chip ${(c.districts || []).includes(d.key) ? 'on' : ''}\" data-d=\"${esc(d.key)}\" onclick=\"this.classList.toggle('on')\">${esc(d.name)}<\/button>`).join('')}<\/div>\n                            <div class=\"reno-chips\"><button class=\"reno-chip ${c.status !== 'busy' ? 'on' : ''}\" id=\"rp-free\" onclick=\"renoStatus('free')\">\ud83d\udfe2 ${esc(T('free'))}<\/button><button class=\"reno-chip ${c.status === 'busy' ? 'on' : ''}\" id=\"rp-busy\" onclick=\"renoStatus('busy')\">\u26d4 ${esc(T('busy'))}<\/button><\/div>\n                            <button class=\"ozg-btn reno-cta\" onclick=\"renoSaveCompany()\">${esc(T('save'))}<\/button><\/div>`;\n                        if (st.company && st.inbox) {\n                            const won = st.inbox.won || [];\n                            if (won.length) html += `<div class=\"reno-card\"><div class=\"reno-h3\" style=\"margin-top:0;\">${esc(T('won'))}<\/div>` + won.map(w => `<div class=\"reno-review\"><b style=\"color:#fff;\">${esc(w.title)}<\/b><div>${esc(money(w.price))} \u00b7 ${esc(w.client)} \u00b7 ${esc(w.client_email)}<\/div><\/div>`).join('') + '<\/div>';\n                            html += `<div class=\"reno-h3\" style=\"margin:14px 12px 8px;\">${esc(T('inbox'))}<\/div>`;\n                            const items = st.inbox.items || [];\n                            if (!items.length) html += `<div class=\"reno-empty\">${esc(T('inbox_empty'))}<\/div>`;\n                            items.forEach(it => {\n                                const mb = it.my_bid;\n                                html += `<div class=\"reno-card\" data-order=\"${it.id}\">\n                                    <div class=\"reno-summary\" style=\"margin-bottom:10px;\"><div><b>${esc(it.plan_name)} \u00b7 ${it.sqm} m\u00b2<\/b><div class=\"meta\">${esc(it.district_name)}<\/div><\/div>\n                                    <div style=\"text-align:right;\"><div class=\"meta\">${esc(T('budget'))}<\/div><b>${esc(money(it.total))}<\/b><\/div><\/div>\n                                    <div class=\"reno-off-meta\" style=\"margin-bottom:10px;\">${esc(T('closes_in'))} <span class=\"reno-timer\" data-exp=\"${it.window_end}\">${hms(Math.floor(it.window_end - nowTs()))}<\/span> \u00b7 ${esc(T('bid_range', money(it.min_price), money(it.max_price)))}<\/div>\n                                    ${mb && mb.status === 'active' ? `<div class=\"reno-off-meta\" style=\"color:var(--success-color);margin-bottom:10px;\">\u2714 ${esc(T('your_bid'))}: ${esc(money(mb.price))} \u00b7 <span class=\"reno-timer\" data-exp=\"${mb.expires_ts}\">${hms(Math.floor(mb.expires_ts - nowTs()))}<\/span><\/div>` : ''}\n                                    <div class=\"reno-bidrow\"><div><label>${esc(T('bid_price'))}<\/label><input class=\"ozg-input\" id=\"bp-${it.id}\" type=\"number\" inputmode=\"numeric\" value=\"${mb ? mb.price : it.total}\"><\/div>\n                                    <div><label>${esc(T('bid_days'))}<\/label><input class=\"ozg-input\" id=\"bd-${it.id}\" type=\"number\" inputmode=\"numeric\" value=\"${mb ? mb.days : ''}\"><\/div><\/div>\n                                    <label>${esc(T('bid_comment'))}<\/label><input class=\"ozg-input\" id=\"bc-${it.id}\" maxlength=\"300\" value=\"${mb ? esc(mb.comment) : ''}\">\n                                    <button class=\"ozg-btn reno-cta\" style=\"margin-top:0;\" onclick=\"renoPlaceBid(${it.id})\">${esc(mb && mb.status === 'active' ? T('update_bid') : T('place_bid'))}<\/button><\/div>`;\n                            });\n                        }\n                        $('reno-pro').innerHTML = html; icons();\n                    }\n                    window.renoStatus = s => { $('rp-free').classList.toggle('on', s === 'free'); $('rp-busy').classList.toggle('on', s === 'busy'); };\n                    window.renoSaveCompany = async () => {\n                        try {\n                            const r = await api('\/company\/save', 'POST', {\n                                name: $('rp-name').value, phone: $('rp-phone').value, about: $('rp-about').value, years: $('rp-years').value, prior_works: $('rp-prior').value,\n                                districts: [...document.querySelectorAll('#rp-districts .reno-chip.on')].map(b => b.dataset.d), status: $('rp-busy').classList.contains('on') ? 'busy' : 'free',\n                            });\n                            st.company = r.company; toast(T('saved')); loadPro();\n                        } catch (e) { toast(e.message); }\n                    };\n                    window.renoPlaceBid = async id => {\n                        try {\n                            await api('\/bid', 'POST', { order_id: id, price: $('bp-' + id).value, days: $('bd-' + id).value, comment: $('bc-' + id).value });\n                            toast(T('saved')); loadPro();\n                        } catch (e) { toast(e.message); }\n                    };\n\n                    \/\/ ---------- lifecycle ----------\n                    async function init() {\n                        st.inited = true;\n                        buildStatic(); refreshOrderUI(); icons();\n                        initMap();\n                        if (!isGuest()) {\n                            try {\n                                const s = await api('\/state'); st.company = s.company; st.seen = new Set();\n                                if (s.order) { applyOrder(s.order); markSeen(); }\n                                else if (s.expired) { const n = $('reno-expired-note'); n.textContent = T('expired_notice'); n.hidden = false; }\n                            } catch (e) {}\n                        }\n                        setInterval(tick, 1000);\n                        setInterval(() => {\n                            if (!active()) return;\n                            if (st.mode === 'client' && st.order && st.order.status === 'open') pollOrder();\n                            else if (st.mode === 'client' && !st.order) { \/* idle *\/ }\n                            else if (st.mode === 'pro' && !(document.activeElement && document.activeElement.closest && document.activeElement.closest('#reno-pro'))) loadPro();\n                        }, 8000);\n                    }\n                    \/\/ called by ozgSwitchTab('kingdom')\n                    window.renoOnShow = () => {\n                        if (!st.inited) init();\n                        else { if (st.map) setTimeout(() => st.map.invalidateSize(), 80); if (st.mode === 'client' && !isGuest()) pollOrder(); }\n                    };\n                    if (document.getElementById('kingdom') && document.getElementById('kingdom').classList.contains('active')) {\n                        if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', () => window.renoOnShow()); else window.renoOnShow();\n                    }\n                })();\n                <\/script>\n\n                <!-- Legacy Kingdom audit views (kept hidden so existing audit\/quiz JS keeps working) -->\n                <div id=\"ozg-legacy-kingdom\" style=\"display:none !important;\" aria-hidden=\"true\">\n                    <div id=\"view-intro\" class=\"q-view active ozg-glass text-center items-center py-12\">\n                        <div style=\"width:80px; height:80px; background:rgba(255,255,255,0.05); border-radius:50%; display:flex; align-items:center; justify-content:center; border:1px solid rgba(255,255,255,0.1); margin-bottom:24px; margin-left:auto; margin-right:auto;\"><i data-lucide=\"compass\" style=\"width:40px; height:40px; color:var(--accent-cyan);\"><\/i><\/div>\n                        <h1 style=\"font-family:'Playfair Display', serif; font-size:2.5rem; background:linear-gradient(45deg, #fef08a, #fbbf24); -webkit-background-clip:text; -webkit-text-fill-color:transparent; margin-bottom:16px;\">In-depth Audit<\/h1>\n                        <p style=\"color:var(--text-muted); font-size:1.1rem; max-width:500px; margin:0 auto 30px auto; line-height:1.6;\">Evaluate 24 spheres of your life so Ozgeris AI can map your Kingdom and help you choose the right focus.<\/p>\n                        <button class=\"ozg-btn\" style=\"font-size:1.1rem; padding:16px 32px;\" onclick=\"startQuiz()\">Start Audit <i data-lucide=\"arrow-right\"><\/i><\/button>\n                    <\/div>\n                    <div id=\"view-age\" class=\"q-view ozg-glass py-12 px-6 text-center\">\n                        <div style=\"width:64px; height:64px; background:rgba(255,255,255,0.05); border-radius:50%; display:flex; align-items:center; justify-content:center; border:1px solid rgba(255,255,255,0.1); margin-bottom:24px; margin-left:auto; margin-right:auto;\"><i data-lucide=\"user-square-2\" style=\"width:32px; height:32px; color:var(--accent-purple);\"><\/i><\/div>\n                        <h2 style=\"font-size:2rem; font-family:'Playfair Display', serif; margin-bottom:30px;\">How old are you?<\/h2>\n                        <div style=\"display:flex; justify-content:center; gap:16px; flex-wrap:wrap;\">\n                            <button class=\"ozg-btn-sec\" style=\"padding:16px 32px; font-size:1.1rem; width: 180px; justify-content: center;\" onclick=\"selectAgeGroup('youth')\">Under 22<\/button>\n                            <button class=\"ozg-btn\" style=\"padding:16px 32px; font-size:1.1rem; width: 180px; justify-content: center;\" onclick=\"selectAgeGroup('adult')\">22 and older<\/button>\n                        <\/div>\n                    <\/div>\n                    <div id=\"view-quiz\" class=\"q-view ozg-glass py-8 px-6\"><div style=\"display:flex; justify-content:space-between; align-items:center; margin-bottom:20px;\"><button class=\"ozg-btn-sec\" style=\"padding:6px 12px; font-size:0.85rem;\" onclick=\"prevQuestion()\"><i data-lucide=\"arrow-left\" style=\"width:16px;\"><\/i> Back<\/button><span id=\"quiz-progress-text\" style=\"color:var(--text-muted); font-weight:600; font-size:0.9rem;\">1 \/ 48<\/span><\/div><div style=\"height:6px; background:rgba(255,255,255,0.1); border-radius:10px; overflow:hidden; margin-bottom:12px;\"><div id=\"quiz-progress-bar\" style=\"height:100%; background:var(--accent-cyan); width:2%; transition:width 0.3s ease;\"><\/div><\/div><div style=\"text-align:center; margin-bottom:40px;\"><span id=\"quiz-cat-text\" style=\"font-size:0.85rem; font-weight:600; text-transform:uppercase; letter-spacing:1px; display:inline-flex; align-items:center; gap:6px;\"><\/span><div id=\"quiz-sphere-text\" style=\"color:var(--text-muted); font-size:0.9rem; margin-top:6px;\">Sphere: Name<\/div><\/div><div style=\"flex-grow:1; display:flex; align-items:center; justify-content:center; min-height:120px; margin-bottom:40px;\"><h2 id=\"quiz-question\" style=\"font-size:1.5rem; font-weight:500; text-align:center; line-height:1.4;\">Loading question...<\/h2><\/div><div style=\"max-width:400px; margin:0 auto; width:100%;\"><div style=\"display:flex; justify-content:space-between; font-size:0.75rem; color:var(--text-muted); text-transform:uppercase; margin-bottom:12px;\"><span>No \/ Never<\/span><span>Yes \/ Always<\/span><\/div><div id=\"quiz-rating-container\" style=\"display:flex; justify-content:space-between; align-items:center;\"><\/div><\/div><\/div>\n                    <div id=\"view-select\" class=\"q-view ozg-glass py-8 px-6\"><div style=\"text-align:center; margin-bottom:30px;\"><h2 style=\"font-size:2rem; font-family:'Playfair Display', serif; margin-bottom:12px;\">Kingdom Map<\/h2><p style=\"color:var(--text-muted); font-size:1rem; max-width:600px; margin:0 auto;\"><span style=\"color:rgba(255,255,255,0.5);\"><i data-lucide=\"lock\" style=\"width:14px; display:inline;\"><\/i> Already highly developed spheres are locked.<\/span><br><b style=\"color:#fff;\">Choose 8 areas for development from the remaining ones.<\/b><\/p><\/div><div id=\"kingdom-grid\" style=\"display:grid; grid-template-columns:repeat(auto-fit, minmax(280px, 1fr)); gap:24px; margin-bottom:30px;\"><\/div><div id=\"web-save-focus-container\" style=\"display:none; text-align:center; position:sticky; bottom:20px; z-index:100;\"><button id=\"ozgSaveFocusBtn\" class=\"ozg-btn\" disabled onclick=\"confirmFocusSelection()\" style=\"padding:16px 32px; font-size:1.1rem; box-shadow: 0 10px 30px rgba(0,0,0,0.8); opacity: 0.5; cursor: not-allowed;\">Save selection (<span id=\"ozgFocusCount\">0<\/span>\/8)<\/button><\/div><\/div>\n                    <div id=\"view-result\" class=\"q-view px-0\" style=\"background:transparent; border:none;\">\n                        <div style=\"display:flex; justify-content:space-between; align-items:center; margin-bottom: 24px; flex-wrap: wrap; gap: 16px; padding: 0 10px;\">\n                            <h2 style=\"font-size:2.2rem; font-family:'Playfair Display', serif; margin:0; color:#fff;\">Your Kingdom<\/h2>\n                            <button class=\"ozg-btn-sec\" onclick=\"const w = document.getElementById('kingdom-analysis-wrap'); w.style.display = w.style.display === 'none' ? 'block' : 'none';\"><i data-lucide=\"bar-chart-2\" style=\"width:18px;\"><\/i> Toggle Analysis<\/button>\n                        <\/div>\n\n                        <div id=\"kingdom-analysis-wrap\" class=\"ozg-glass\" style=\"display: none; margin-bottom: 0;\">\n                            <div id=\"ai-verdict-container\" style=\"background: rgba(0, 240, 255, 0.05); border: 1px solid rgba(0, 240, 255, 0.2); border-radius: 16px; padding: 24px; margin-bottom: 30px; text-align: left; display: flex; gap: 16px; align-items: flex-start; box-shadow: 0 4px 20px rgba(0, 240, 255, 0.1);\"><div style=\"background: var(--accent-cyan); color: #000; width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; flex-shrink: 0;\"><i data-lucide=\"bot\" style=\"width: 28px; height: 28px;\"><\/i><\/div><div><h3 style=\"color: var(--accent-cyan); margin: 0 0 8px 0; font-size: 1.1rem; display:flex; align-items:center; gap:6px;\">Ozgeris AI Verdict <i data-lucide=\"sparkles\" style=\"width:16px;\"><\/i><\/h3><p id=\"ai-verdict-text\" style=\"color: #fff; line-height: 1.6; margin: 0; font-size: 0.95rem; min-height: 44px;\">Analyzing your Kingdom map...<\/p><\/div><\/div>\n                            <div id=\"kingdomChartContainer\" style=\"margin-bottom:40px;\"><canvas id=\"kingdomChart\"><\/canvas><\/div>\n                            <div style=\"background:rgba(0,0,0,0.3); border-radius:16px; padding:24px; border:1px solid rgba(255,255,255,0.05); text-align:left; margin-bottom:40px;\">\n                                <h3 style=\"color:#fff; font-size:1.1rem; margin-bottom:16px; display:flex; align-items:center; gap:8px;\"><i data-lucide=\"target\" style=\"width:20px; color:var(--text-muted);\"><\/i> Your Development Focus (8 spheres)<\/h3>\n                                <div id=\"final-focus-list\" style=\"display:grid; grid-template-columns:repeat(auto-fit, minmax(200px, 1fr)); gap:12px;\"><\/div>\n                            <\/div>\n\n                            <!-- DEVELOPMENT TREE - MOVED FROM TRACK PAD TO KINGDOM PAD -->\n                            <div style=\"background:rgba(0,0,0,0.3); border-radius:16px; padding:24px; border:1px solid rgba(255,255,255,0.05); text-align:left; margin-bottom:40px;\">\n                                <h3 style=\"color: var(--accent-cyan); margin-bottom: 20px; display: flex; align-items: center; gap: 10px; border-bottom: 1px solid var(--glass-border); padding-bottom: 10px;\"><i data-lucide=\"crown\"><\/i> Development Tree: Finding your Calling<\/h3>\n                                <p style=\"color: var(--text-muted); font-size: 0.85rem; margin-bottom: 20px;\">Complete these tests to unlock your personalized career path and job shadowing opportunities.<\/p>\n                                <div style=\"display: flex; flex-direction: column; gap: 20px;\">\n                                    <!-- Kingdom Test Button -->\n                                    <div class=\"ozg-skill-node \" style=\"cursor: pointer;\" onclick=\"ozgOpenKingdomTest()\">\n                                        <div class=\"ozg-node-icon\"><i data-lucide=\"crown\"><\/i><\/div>\n                                        <div style=\"flex:1;\">\n                                            <div style=\"font-size:0.95rem; font-weight:600; color:#fff;\">Kingdom Test<\/div>\n                                            <div style=\"font-size:0.75rem; color:var(--text-muted); margin-top:4px;\">Discover your Kingdom personality<\/div>\n                                        <\/div>\n                                                                                    <i data-lucide=\"arrow-right\" style=\"color: var(--accent-cyan);\"><\/i>\n                                                                            <\/div>\n\n                                    <!-- Industry Quiz Button -->\n                                    <div class=\"ozg-skill-node \" style=\"cursor: pointer;\" onclick=\"ozgOpenIndustryQuiz()\">\n                                        <div class=\"ozg-node-icon\"><i data-lucide=\"building-2\"><\/i><\/div>\n                                        <div style=\"flex:1;\">\n                                            <div style=\"font-size:0.95rem; font-weight:600; color:#fff;\">Industry Quiz<\/div>\n                                            <div style=\"font-size:0.75rem; color:var(--text-muted); margin-top:4px;\">Find your ideal industry<\/div>\n                                        <\/div>\n                                                                                    <i data-lucide=\"arrow-right\" style=\"color: var(--accent-cyan);\"><\/i>\n                                                                            <\/div>\n                                <\/div>\n\n                                <div style=\"display:flex; justify-content:space-around; padding: 20px 50px;\">\n                                    <div class=\"ozg-tree-connector \"><\/div>\n                                    <div class=\"ozg-tree-connector \"><\/div>\n                                <\/div>\n\n                                <div class=\"ozg-skill-node ozg-skill-locked\" style=\"margin-top:-5px; background: rgba(0, 240, 255, 0.05); border-color: rgba(0, 240, 255, 0.3);\">\n                                                                            <div class=\"ozg-lock-overlay\"><i data-lucide=\"lock\" style=\"width:24px; height:24px;\"><\/i><span>Secret Base<\/span><\/div>\n                                                                        <div class=\"ozg-node-icon\" style=\"background:var(--accent-cyan); color:#000;\"><i data-lucide=\"briefcase\"><\/i><\/div>\n                                    <div style=\"flex:1;\"><div style=\"font-size:1.1rem; font-weight:600; color:#fff;\">Job Shadowing<\/div><\/div>\n                                <\/div>\n\n                                                            <\/div>\n\n                            <div style=\"display:flex; justify-content:center; gap:16px; flex-wrap:wrap;\"><button class=\"ozg-btn\" onclick=\"goToTrackAndReload()\">Go to Track <i data-lucide=\"map\"><\/i><\/button><button class=\"ozg-btn-sec\" onclick=\"changeFocusAreas()\"><i data-lucide=\"edit-3\"><\/i> Change spheres<\/button><button class=\"ozg-btn-sec\" onclick=\"resetQuizAndRetake()\" style=\"color: var(--warning-color); border-color: rgba(255, 51, 102, 0.3); background: rgba(255, 51, 102, 0.05);\"><i data-lucide=\"rotate-ccw\"><\/i> Retake<\/button><\/div>\n                        <\/div>\n\n                        <\/div>\n                <\/div>\n                <\/section>\n                                <!-- BOOKMARKS SECTION -->\n                <section id=\"bookmarks\" class=\"ozg-section\">\n                    <div class=\"ozg-glass\" style=\"margin-bottom: 30px; display:flex; justify-content:space-between; align-items:center;\">\n                        <div>\n                            <h2 style=\"color:#fff; margin:0 0 4px 0; font-size:1.8rem;\">My Bookmarks<\/h2>\n                            <p style=\"color:var(--text-muted); margin:0;\">Your personal collection of saved pages and posts.<\/p>\n                        <\/div>\n                    <\/div>\n\n                    \n                    <div style=\"display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px;\">\n                                                    <div style=\"grid-column: 1 \/ -1; background: rgba(255,255,255,0.02); padding: 40px 20px; text-align: center; border-radius: 16px; border: 1px dashed rgba(255,255,255,0.1); color: var(--text-muted);\">\n                                <i data-lucide=\"bookmark\" style=\"width: 48px; height: 48px; opacity: 0.5; margin-bottom: 16px;\"><\/i>\n                                <p>You haven&#039;t bookmarked anything yet. Use the  shortcode on any page to save it here.<\/p>\n                            <\/div>\n                                            <\/div>\n                <\/section>\n\n                <!-- MY TRACK SECTION (Active Track - without Development Tree) -->\n                <section id=\"my-track\" class=\"ozg-section\">\n                    <div class=\"ozg-glass\" style=\"margin-bottom: 20px; display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:10px; margin-top:56px;\">\n                        <div>\n                            <h2 style=\"color:#fff; margin:0 0 4px 0; font-size:1.4rem;\">My development ecosystem<\/h2>\n                            <p style=\"color:var(--text-muted); font-size:0.9rem; margin:0;\">Your active path based on the 8 chosen focus areas.<\/p>\n                        <\/div>\n                        <div>\n                                                            <button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgBuddyModal').classList.add('show')\"><i data-lucide=\"user-plus\" style=\"width:16px; margin-right:6px;\"><\/i> Choose Buddy<\/button>\n                                                    <\/div>\n                    <\/div>\n\n                    <!-- Sticky Filter Bar for Track Tab -->\n                    <div class=\"ozg-filter-sticky\" id=\"ozgTrackFilterSticky\">\n                        <div class=\"filter-bar\">\n                            <select id=\"filterPillarSticky\" class=\"filter-select\" onchange=\"filterByPillarSticky()\">\n                                <option value=\"\">All Pillars<\/option>\n                                                                    <option value=\"wisdom\">Tower of Enlightenment<\/option>\n                                                                    <option value=\"strength\">The Citadel<\/option>\n                                                                    <option value=\"wealth\">The Treasury<\/option>\n                                                                    <option value=\"balance\">Gardens of Harmony<\/option>\n                                                            <\/select>\n                            <select id=\"filterAreaSticky\" class=\"filter-select\" onchange=\"filterByAreaSticky()\">\n                                <option value=\"\">All Spheres<\/option>\n                            <\/select>\n                            <button class=\"ozg-btn-sec\" onclick=\"clearFiltersSticky()\"><i data-lucide=\"x\"><\/i> Reset<\/button>\n                        <\/div>\n                    <\/div>\n\n\n\n                    \n                                            <div class=\"ozg-glass\" style=\"text-align:center; padding: 40px;\">\n                            <i data-lucide=\"map\" style=\"width: 48px; height: 48px; color: var(--text-muted); margin-bottom: 16px;\"><\/i>\n                            <p style=\"color: var(--text-muted);\">Complete the Kingdom Audit to unlock your personalized development path.<\/p>\n                            <button class=\"ozg-btn\" onclick=\"ozgSwitchTab('kingdom')\">Go to Audit<\/button>\n                        <\/div>\n                    \n                    <!-- My Cohort Section -->\n                    <div style=\"margin-top: 60px;\">\n                        <h2 style=\"color: var(--accent-cyan); margin-bottom: 20px; display: flex; align-items: center; gap: 10px; border-bottom: 1px solid var(--glass-border); padding-bottom: 10px;\"><i data-lucide=\"users\"><\/i> My Cohort<\/h2>\n                        <div id=\"cohort-activities\" class=\"ozg-glass\" style=\"padding: 20px;\"><div style=\"text-align:center; padding: 20px;\">Loading activities...<\/div><\/div>\n                    <\/div>\n                <\/section>\n\n                <!-- PROFILE SECTION -->\n                <section id=\"profile\" class=\"ozg-section\">\n                    <div id=\"ozgUserProfileHeader\" class=\"ozg-glass\" style=\"margin-bottom: 24px; padding: 30px;\">\n                        <div style=\"display: flex; align-items: center; gap: 30px; flex-wrap: wrap;\">\n                            <div style=\"position: relative;\">\n                                <img decoding=\"async\" id=\"ozgProfileAvatar\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=128&d=mm&r=g\" style=\"width: 100px; height: 100px; border-radius: 50%; border: 3px solid var(--accent-purple); object-fit: cover;\">\n                                <div id=\"ozgProfileIsMeBadge\" style=\"position: absolute; bottom: 0; right: 0; background: var(--accent-cyan); color: #000; width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center; border: 2px solid #0f121e;\"><i data-lucide=\"check\" style=\"width: 14px;\"><\/i><\/div>\n                            <\/div>\n                            <div style=\"flex: 1; min-width: 200px;\">\n                                <h2 id=\"ozgProfileName\" style=\"margin: 0; font-size: 1.8rem; color: #fff; font-family: 'Playfair Display', serif;\"><\/h2>\n                                <p id=\"ozgProfileBadge\" style=\"color: var(--accent-cyan); margin: 4px 0 16px 0; font-size: 0.9rem; font-weight: 600;\">Student Practitioner<\/p>\n                                <div style=\"display: flex; gap: 24px; flex-wrap: wrap;\">\n                                    <div style=\"text-align: center;\">\n                                        <div id=\"ozgStatPosts\" style=\"font-size: 1.2rem; font-weight: 800; color: #fff;\">0<\/div>\n                                        <div style=\"font-size: 0.75rem; color: var(--text-muted); text-transform: uppercase;\">Posts<\/div>\n                                    <\/div>\n                                    <div style=\"text-align: center;\">\n                                        <div id=\"ozgStatAchievements\" style=\"font-size: 1.2rem; font-weight: 800; color: #fff;\">0<\/div>\n                                        <div style=\"font-size: 0.75rem; color: var(--text-muted); text-transform: uppercase;\">Badges<\/div>\n                                    <\/div>\n                                    <div style=\"text-align: center;\">\n                                        <div id=\"ozgStatCoins\" style=\"font-size: 1.2rem; font-weight: 800; color: #fff;\">0<\/div>\n                                        <div style=\"font-size: 0.75rem; color: var(--text-muted); text-transform: uppercase;\">Coins<\/div>\n                                    <\/div>\n                                <\/div>\n                                                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                        <div style=\"display: flex; border-bottom: 1px solid var(--glass-border); margin-bottom: 24px;\">\n                            <button class=\"ozg-profile-tab active\" onclick=\"ozgSwitchProfileSubTab('feed', this)\" style=\"flex: 1; background: none; border: none; padding: 12px; color: #fff; font-weight: 600; cursor: pointer; border-bottom: 2px solid var(--accent-cyan); transition: 0.2s;\"><i data-lucide=\"layout-grid\" style=\"width: 18px; vertical-align: middle; margin-right: 8px;\"><\/i> Feed<\/button>\n                            <button class=\"ozg-profile-tab\" onclick=\"ozgSwitchProfileSubTab('connections', this)\" style=\"flex: 1; background: none; border: none; padding: 12px; color: var(--text-muted); font-weight: 600; cursor: pointer; border-bottom: 2px solid transparent; transition: 0.2s;\"><i data-lucide=\"users\" style=\"width: 18px; vertical-align: middle; margin-right: 8px;\"><\/i> Connections<\/button>\n                            <button class=\"ozg-profile-tab\" onclick=\"ozgSwitchProfileSubTab('notifications', this)\" style=\"flex: 1; background: none; border: none; padding: 12px; color: var(--text-muted); font-weight: 600; cursor: pointer; border-bottom: 2px solid transparent; transition: 0.2s;\"><i data-lucide=\"bell\" style=\"width: 18px; vertical-align: middle; margin-right: 8px;\"><\/i> Notifications<\/button>\n                        <\/div>\n\n                    <!-- Profile Feed (3 column grid) -->\n                    <div id=\"ozgProfileSubTab-feed\" class=\"ozg-profile-subtab-content active\">\n                        <div style=\"position:relative;margin-bottom:8px;\"><input type=\"search\" id=\"ozgProfileFeedSearch\" class=\"ozg-input\" placeholder=\"Search...\" oninput=\"ozgFilterProfileFeed()\" style=\"padding-left:38px;margin-bottom:0;\"><i data-lucide=\"search\" style=\"position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--text-muted);width:16px;pointer-events:none;\"><\/i><\/div>\n                        <div id=\"ozgProfileFeedTags\" style=\"display:flex;gap:8px;overflow-x:auto;padding-bottom:6px;scrollbar-width:none;margin-bottom:10px;\"><button class=\"ozg-feed-tag-btn active\" onclick=\"ozgSetProfileFeedTag('',this)\">All<\/button><button class=\"ozg-feed-tag-btn\" onclick=\"ozgSetProfileFeedTag('courses',this)\">Courses<\/button><button class=\"ozg-feed-tag-btn\" onclick=\"ozgSetProfileFeedTag('jobs',this)\">Jobs<\/button><button class=\"ozg-feed-tag-btn\" onclick=\"ozgSetProfileFeedTag('challenges',this)\">Challenges<\/button><button class=\"ozg-feed-tag-btn\" onclick=\"ozgSetProfileFeedTag('finance',this)\">Finance<\/button><button class=\"ozg-feed-tag-btn\" onclick=\"ozgSetProfileFeedTag('video',this)\">Video<\/button><button class=\"ozg-feed-tag-btn\" onclick=\"ozgSetProfileFeedTag('photo',this)\">Photo<\/button><\/div>\n                        <div id=\"ozgProfileFeedGrid\" style=\"display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px;\">\n                            <!-- Posts loaded via JS -->\n                        <\/div>\n                        <div id=\"ozgProfileNoPosts\" style=\"display: none; text-align: center; padding: 60px 20px; color: var(--text-muted);\">\n                            <i data-lucide=\"camera\" style=\"width: 48px; height: 48px; opacity: 0.3; margin-bottom: 16px;\"><\/i>\n                            <p>No content shared yet.<\/p>\n                        <\/div>\n                    <\/div>\n\n                    <div id=\"ozgProfileSubTab-connections\" class=\"ozg-profile-subtab-content\" style=\"display: none;\">\n                        <div id=\"ozgMeProfileConnections\">\n                            <!-- Incoming Requests -->\n                            <h3 style=\"color: var(--warning-color); margin-bottom: 16px; display:flex; align-items:center; gap:8px;\"><i data-lucide=\"bell\" style=\"width:20px;\"><\/i> Incoming requests<\/h3>\n                            <div style=\"margin-bottom: 40px;\">\n                                                                    <div style=\"background: rgba(255,255,255,0.02); padding: 20px; border-radius: 12px; text-align: center; color: var(--text-muted);\">No new requests.<\/div>\n                                                            <\/div>\n                            <!-- My Mentees -->\n                            <h3 style=\"color: var(--accent-cyan); margin-bottom: 16px; display:flex; align-items:center; gap:8px;\"><i data-lucide=\"network\" style=\"width:20px;\"><\/i> My Mentees<\/h3>\n                            <div style=\"display: grid; grid-template-columns: 1fr; gap: 20px;\">\n                                                                    <div style=\"background: rgba(255,255,255,0.02); padding: 20px; border-radius: 12px; text-align: center; color: var(--text-muted);\">You have no mentees yet.<\/div>\n                                                            <\/div>\n                        <\/div>\n                        <div id=\"ozgOtherProfileConnections\" style=\"display: none; text-align: center; padding: 40px; color: var(--text-muted);\">\n                            Connections are private.\n                        <\/div>\n                    <\/div>\n\n                    <div id=\"ozgProfileSubTab-notifications\" class=\"ozg-profile-subtab-content\" style=\"display: none;\">\n                        <div id=\"ozgNotificationsList\">\n                            <div style=\"text-align:center; padding: 40px; color: var(--text-muted);\">\n                                <i data-lucide=\"bell\" style=\"width: 48px; height: 48px; opacity: 0.3; margin-bottom: 16px;\"><\/i>\n                                <p>No new notifications.<\/p>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/section>\n\n                <!-- CHALLENGES SECTION -->\n                <section id=\"challenges\" class=\"ozg-section\">\n                    <div style=\"display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:10px; margin-bottom:30px;\">\n                        <div>\n                            <h2 style=\"color:#fff; margin:0 0 4px 0; font-size:1.8rem;\">Challenges Arena<\/h2>\n                            <p style=\"color:var(--text-muted); font-size:0.9rem; margin:0;\">Turn your habits into a competition with other students.<\/p>\n                        <\/div>\n                        <button class=\"ozg-btn\" onclick=\"document.getElementById('ozgCreateChallengeModal').classList.add('show')\"><i data-lucide=\"plus\" style=\"width:18px;\"><\/i> Create challenge<\/button>\n                    <\/div>\n                    <div style=\"display:grid; grid-template-columns:repeat(auto-fill, minmax(300px, 1fr)); gap:20px;\">\n                                            <\/div>\n                                            <h3 style=\"color:#fff; margin: 40px 0 20px 0; border-bottom: 1px solid var(--glass-border); padding-bottom: 10px;\">Available challenges<\/h3>\n                        <div style=\"display:grid; grid-template-columns:repeat(auto-fill, minmax(300px, 1fr)); gap:20px;\">\n                                                            <div class=\"ozg-glass\" style=\"padding:20px; border-top: 4px solid var(--glass-border); display: flex; flex-direction: column;\">\n                                    <h4 style=\"margin-top:0; color:#fff; font-size:1.1rem;\">\u0412\u043e\u0434\u0430 \u0436\u0438\u0437\u043d\u044c 2<\/h4>\n                                    <div style=\"display:flex; align-items:center; gap:8px; color:var(--text-muted); font-size:0.85rem; margin-bottom:20px;\"><i data-lucide=\"users\" style=\"width:14px;\"><\/i> 5 participants<\/div>\n                                    <button class=\"ozg-btn\" style=\"width: 100%; justify-content: center; margin-top: auto;\" onclick=\"ozgJoinChallenge(16319)\"><i data-lucide=\"user-plus\" style=\"width:16px;\"><\/i> Join<\/button>\n                                <\/div>\n                                                            <div class=\"ozg-glass\" style=\"padding:20px; border-top: 4px solid var(--glass-border); display: flex; flex-direction: column;\">\n                                    <h4 style=\"margin-top:0; color:#fff; font-size:1.1rem;\">\u0412\u043e\u0434\u0430 - \u0436\u0438\u0437\u043d\u044c<\/h4>\n                                    <div style=\"display:flex; align-items:center; gap:8px; color:var(--text-muted); font-size:0.85rem; margin-bottom:20px;\"><i data-lucide=\"users\" style=\"width:14px;\"><\/i> 2 participants<\/div>\n                                    <button class=\"ozg-btn\" style=\"width: 100%; justify-content: center; margin-top: auto;\" onclick=\"ozgJoinChallenge(16318)\"><i data-lucide=\"user-plus\" style=\"width:16px;\"><\/i> Join<\/button>\n                                <\/div>\n                                                    <\/div>\n                                    <\/section>\n\n                <!-- JOURNAL SECTION -->\n                <section id=\"journal\" class=\"ozg-section\">\n                    <div class=\"tracker-wrapper\" id=\"habit-tracker-container\" style=\"margin-bottom: 30px;\">\n                        <div style=\"display:flex; justify-content:space-between; align-items:center; margin-bottom:16px; flex-wrap:wrap; gap:8px;\">\n                            <h3 style=\"color:#fff; margin:0; font-size:1.2rem; display:flex; align-items:center; gap:8px;\"><i data-lucide=\"calendar-days\" style=\"width:18px;\"><\/i> Habit Tracker<\/h3>\n                            <div class=\"tracker-view-tabs\">\n                                <button class=\"tracker-view-btn active\" data-view=\"daily\" onclick=\"loadHabitTracker('daily', this)\">Daily<\/button>\n                                <button class=\"tracker-view-btn\" data-view=\"weekly\" onclick=\"loadHabitTracker('weekly', this)\">Weekly<\/button>\n                                <button class=\"tracker-view-btn\" data-view=\"monthly\" onclick=\"loadHabitTracker('monthly', this)\">Monthly<\/button>\n                            <\/div>\n                        <\/div>\n                        <div id=\"habit-tracker-table-wrap\" style=\"overflow-x: auto; -webkit-overflow-scrolling: touch;\"><\/div>\n                    <\/div>\n\n                    <div class=\"ozg-glass\" style=\"margin-bottom: 30px;\">\n                        <div style=\"display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 16px;\">\n                            <div>\n                                <h2 style=\"color: #fff; margin: 0 0 8px 0; font-size: 1.5rem;\">Chronicles Journal<\/h2>\n                                <p style=\"color: var(--text-muted); margin: 0; font-size:0.85rem;\">Write down your insights, reflections, and progress on your development path.<\/p>\n                            <\/div>\n                            <button class=\"ozg-btn\" style=\"padding:8px 16px;\" onclick=\"ozgShowJournalModal(null, '')\"><i data-lucide=\"pen-line\" style=\"width:16px;\"><\/i> New entry<\/button>\n                        <\/div>\n                    <\/div>\n                    <div id=\"journal-entries\" class=\"ozg-glass\" style=\"padding: 20px;\">Loading...<\/div>\n                <\/section>\n\n                            <\/main>\n        <\/div>\n\n        <nav class=\"ozg-mob-nav\" id=\"ozgMobileNav\">\n            <a class=\"ozg-mob-item active\" id=\"mtab-btn-kingdom\" onclick=\"ozgSwitchTab('kingdom')\"><i data-lucide=\"crown\"><\/i><\/a>\n                            <a class=\"ozg-mob-item ozg-auth-link\" href=\"https:\/\/emirat.hobbi.st\/wp-login.php\" onclick=\"return ozgOpenLoginModal(event)\"><i data-lucide=\"log-in\"><\/i><\/a>\n                        <a class=\"ozg-mob-item\" id=\"mtab-btn-bookmarks\" onclick=\"ozgSwitchTab('bookmarks')\"><i data-lucide=\"flame\"><\/i><\/a>\n            <a class=\"ozg-mob-item\" id=\"mtab-btn-my-track\" onclick=\"ozgSwitchTab('my-track')\"><i data-lucide=\"map\"><\/i><\/a>\n            <a class=\"ozg-mob-item\" id=\"mtab-btn-coach\" onclick=\"ozgSwitchTab('coach')\"><i data-lucide=\"plus-circle\"><\/i><\/a>\n            <a class=\"ozg-mob-item\" id=\"mtab-btn-challenges\" onclick=\"ozgSwitchTab('challenges')\"><i data-lucide=\"swords\"><\/i><\/a>\n            <a class=\"ozg-mob-item\" id=\"mtab-btn-journal\" onclick=\"ozgSwitchTab('journal')\"><i data-lucide=\"book-open\"><\/i><\/a>\n            <a class=\"ozg-mob-item\" id=\"mtab-btn-profile\" onclick=\"ozgSwitchTab('profile')\" style=\"position:relative;\">\n                <i data-lucide=\"user\"><\/i>\n                            <\/a>\n        <\/nav>\n\n        <!-- Gamer Panel Footer (Horizontally Scrollable) -->\n        <div class=\"footer-content-wrapper\" id=\"draggableFooter\" style=\"display:none;\">\n            <div class=\"left-column-footer\" id=\"leftFooterArea\">\n                <div class=\"left-side-footer-buttons-group\">\n                    <a href=\"#\" class=\"footer-button\" onclick=\"ozgSwitchTab('kingdom'); return false;\"><span class=\"mr-1\">\ud83d\ude80<\/span> Kingdom<\/a>\n                    <a href=\"#\" class=\"footer-button\" onclick=\"ozgSwitchTab('bookmarks'); return false;\"><span class=\"mr-1\">\ud83d\udd16<\/span> Bookmarks<\/a>\n                    <a href=\"#\" class=\"footer-button\" onclick=\"ozgSwitchTab('my-track'); return false;\"><span class=\"mr-1\">\ud83d\udcdc<\/span> Track<\/a>\n                    <a href=\"#\" class=\"footer-button\" onclick=\"ozgSwitchTab('profile'); return false;\"><span class=\"mr-1\">\ud83d\udc64<\/span> Profile<\/a>\n                    <a href=\"#\" class=\"footer-button\" onclick=\"ozgSwitchTab('challenges'); return false;\"><span class=\"mr-1\">\u2694\ufe0f<\/span> Arena<\/a>\n                    <a href=\"#\" class=\"footer-button\" onclick=\"ozgSwitchTab('journal'); return false;\"><span class=\"mr-1\">\ud83d\udcd6<\/span> Chronicles<\/a>\n                                    <\/div>\n                <div class=\"config-skin-row\">\n                    <a href=\"#\" class=\"action-button-round\" onclick=\"ozgChangeTheme('classic'); return false;\" title=\"Return to Classic\">\ud83d\udd19<\/a>\n                    <a href=\"#\" class=\"action-button-round\" onclick=\"alert('It is your Castle'); return false;\">\ud83c\udff0<\/a>\n                <\/div>\n            <\/div>\n            <div class=\"bottom-info-bar\">\n                <div class=\"bottom-bar-top-row\">\n                    <a href=\"#\" id=\"footerMenuToggle\" class=\"footer-menu-toggle\">\u2630<\/a>\n                    <div class=\"xp-progress-group\">\n                        <span class=\"xp-text\">XP<\/span>\n                        <div class=\"progress-bar\"><div class=\"progress-fill\"><\/div><\/div>\n                        <span class=\"xp-text\">779\/950<\/span>\n                    <\/div>\n                <\/div>\n                <div class=\"event-info\">\n                    <span class=\"event-info-icon\">\u2728<\/span>\n                    <span>New Event: Spirit Wars<\/span>\n                    <span class=\"event-time\">5h 51m<\/span>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- SIGN UP PROMPT MODAL -->\n    <div class=\"ozg-modal-overlay\" id=\"ozgSignUpPrompt\" style=\"z-index: 40000; background: rgba(5,7,15,0.95);\">\n        <div class=\"ozg-modal\" style=\"max-width: 400px; text-align: center; padding: 40px 24px; background: #0f121e; border: 1px solid var(--glass-border); border-radius: 24px;\">\n            <div style=\"width: 70px; height: 70px; background: rgba(0,240,255,0.1); border-radius: 20px; display: flex; align-items: center; justify-content: center; margin: 0 auto 24px auto;\">\n                <i data-lucide=\"rocket\" style=\"width: 32px; height: 32px; color: var(--accent-cyan);\"><\/i>\n            <\/div>\n            <h3 style=\"color: #fff; font-size: 1.5rem; margin: 0 0 12px 0; font-family: 'Playfair Display', serif;\">Get the full app experience<\/h3>\n            <p style=\"color: var(--text-muted); font-size: 1rem; line-height: 1.5; margin: 0 0 32px 0;\">Enjoy more courses, videos and great features on the mini app<\/p>\n            <div style=\"display: flex; flex-direction: column; gap: 12px;\">\n                <button onclick=\"if(window.ozgJoinViaTelegram) ozgJoinViaTelegram(); else window.open('https:\/\/t.me\/Hobbistbot\/miniapp?startapp', '_blank');\" class=\"ozg-btn\" style=\"justify-content: center; padding: 14px; font-size: 1.1rem;\">Open Emirat<\/button>\n                <a href=\"https:\/\/emirat.hobbi.st\/wp-login.php\" class=\"ozg-btn-sec ozg-auth-link\" onclick=\"return ozgOpenLoginModal(event)\" style=\"justify-content: center; padding: 14px; font-size: 1.1rem; border-color: var(--accent-cyan); color: var(--accent-cyan);\">Browser login<\/a>\n                <button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgSignUpPrompt').classList.remove('show')\" style=\"justify-content: center; border: none; background: transparent; color: var(--text-muted);\">Not now<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n\n    <!-- GUEST: lesson completed -> earn HEC prompt -->\n    <div class=\"ozg-modal-overlay\" id=\"ozgGuestHecPrompt\" style=\"z-index: 50000; background: rgba(5,7,15,0.95);\">\n        <div class=\"ozg-modal\" style=\"max-width: 420px; text-align: center; padding: 36px 24px; background: #0f121e; border: 1px solid var(--glass-border); border-radius: 24px;\">\n            <div style=\"width: 70px; height: 70px; background: rgba(251,191,36,0.12); border-radius: 20px; display: flex; align-items: center; justify-content: center; margin: 0 auto 20px auto;\">\n                <i data-lucide=\"zap\" style=\"width: 32px; height: 32px; color: #fbbf24;\"><\/i>\n            <\/div>\n            <div style=\"display:inline-block; background:rgba(0,230,118,0.1); border:1px solid var(--success-color); color:var(--success-color); border-radius:20px; padding:4px 12px; font-size:0.8rem; font-weight:700; margin-bottom:14px;\">\u2705 Lesson completed<\/div>\n            <h3 style=\"color: #fff; font-size: 1.4rem; margin: 0 0 12px 0; font-family: 'Playfair Display', serif;\">Sign in to earn Emirat Energy Coins<\/h3>\n            <p style=\"color: var(--text-muted); font-size: 1rem; line-height: 1.5; margin: 0 0 20px 0;\">Complete media while signed in and your progress and coins are saved.<\/p>\n            <button type=\"button\" onclick=\"ozgOpenTrophyFromPrompt()\" style=\"display:flex; align-items:center; justify-content:center; gap:8px; width:100%; margin: 0 0 20px 0; padding: 12px; border-radius: 14px; background: rgba(251,191,36,0.1); border: 1px solid rgba(251,191,36,0.4); color: #fbbf24; font-weight: 700; font-size: 1rem; cursor: pointer;\">\n                <i data-lucide=\"trophy\" style=\"width:18px; height:18px;\"><\/i> Win the $1,000,000 trophy\n            <\/button>\n            <div style=\"display: flex; flex-direction: column; gap: 12px;\">\n                <button onclick=\"if(window.ozgJoinViaTelegram) ozgJoinViaTelegram(); else window.open('https:\/\/t.me\/Hobbistbot\/miniapp?startapp', '_blank');\" class=\"ozg-btn\" style=\"justify-content: center; padding: 14px; font-size: 1.1rem;\">Sign in with Emirat<\/button>\n                <a href=\"https:\/\/emirat.hobbi.st\/wp-login.php\" class=\"ozg-btn-sec ozg-auth-link\" onclick=\"if(window.ozgOpenLoginModal){ document.getElementById('ozgGuestHecPrompt').classList.remove('show'); return ozgOpenLoginModal(event); } return true;\" style=\"justify-content: center; padding: 14px; font-size: 1.1rem; border-color: var(--accent-cyan); color: var(--accent-cyan);\">Browser login<\/a>\n                <button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgGuestHecPrompt').classList.remove('show')\" style=\"justify-content: center; border: none; background: transparent; color: var(--text-muted);\">Not now<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- BOOK READER LIGHTBOX (zoom \/ pinch \/ pan \/ page navigation) -->\n    <div class=\"ozg-lb\" id=\"ozgBookLightbox\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Document viewer\">\n        <div class=\"ozg-lb-bar\">\n            <div class=\"ozg-lb-group\">\n                <button type=\"button\" class=\"ozg-lb-btn\" id=\"ozgLbPrev\" title=\"Previous page\" onclick=\"ozgLbGo(-1)\"><i data-lucide=\"chevron-left\"><\/i><\/button>\n                <span class=\"ozg-lb-count\" id=\"ozgLbCount\">1 \/ 1<\/span>\n                <button type=\"button\" class=\"ozg-lb-btn\" id=\"ozgLbNext\" title=\"Next page\" onclick=\"ozgLbGo(1)\"><i data-lucide=\"chevron-right\"><\/i><\/button>\n            <\/div>\n            <div class=\"ozg-lb-group\">\n                <button type=\"button\" class=\"ozg-lb-btn\" title=\"Zoom out\" onclick=\"ozgLbZoomBy(1\/1.4)\"><i data-lucide=\"zoom-out\"><\/i><\/button>\n                <button type=\"button\" class=\"ozg-lb-btn\" title=\"Zoom in\" onclick=\"ozgLbZoomBy(1.4)\"><i data-lucide=\"zoom-in\"><\/i><\/button>\n                <button type=\"button\" class=\"ozg-lb-btn\" title=\"Fit to screen\" onclick=\"ozgLbReset()\"><i data-lucide=\"maximize\"><\/i><\/button>\n                <button type=\"button\" class=\"ozg-lb-btn\" title=\"Close\" onclick=\"ozgCloseBookLightbox()\"><i data-lucide=\"x\"><\/i><\/button>\n            <\/div>\n        <\/div>\n        <div class=\"ozg-lb-stage\" id=\"ozgLbStage\">\n            <canvas class=\"ozg-lb-canvas\" id=\"ozgLbCanvas\"><\/canvas>\n            <div class=\"ozg-lb-loading\" id=\"ozgLbLoading\">Loading\u2026<\/div>\n            <button type=\"button\" class=\"ozg-lb-nav ozg-lb-prev\" id=\"ozgLbPrevSide\" title=\"Previous page\" onclick=\"ozgLbGo(-1)\"><i data-lucide=\"chevron-left\"><\/i><\/button>\n            <button type=\"button\" class=\"ozg-lb-nav ozg-lb-next\" id=\"ozgLbNextSide\" title=\"Next page\" onclick=\"ozgLbGo(1)\"><i data-lucide=\"chevron-right\"><\/i><\/button>\n        <\/div>\n    <\/div>\n\n    <!-- Industry Quiz Modal -->\n    <div class=\"ozg-quiz-modal-overlay\" id=\"ozgIndustryQuizModal\">\n        <div class=\"ozg-quiz-modal\">\n            <div class=\"ozg-quiz-header\">\n                <h3 style=\"color:#fff; margin:0;\">Industry Quiz<\/h3>\n                <button class=\"ozg-quiz-close\" onclick=\"document.getElementById('ozgIndustryQuizModal').classList.remove('show')\"><i data-lucide=\"x\"><\/i><\/button>\n            <\/div>\n            <div class=\"ozg-quiz-body\">\n                <form id=\"forminator-module-9633\" class=\"forminator-quiz forminator-quiz-9633\" method=\"post\" data-forminator-render=\"0\" data-uid=\"6acb30554c30d\"><div class=\"forminator-quiz-intro\">\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t<button class=\"forminator-button forminator-quiz-start\" style=\"margin: 0 auto; display: block;\">Start Quiz<\/button><\/div><\/form>            <\/div>\n        <\/div>\n    <\/div>\n        <!-- MODALS -->\n    <div class=\"ozg-modal-overlay\" id=\"ozgSubscribeModal\"><div class=\"ozg-modal\"><h3 style=\"color:#fff; margin-top:0; font-size:1.4rem;\"><i data-lucide=\"play-circle\" style=\"display:inline-block; vertical-align:middle; margin-right:8px;\"><\/i>Start Course<\/h3><input type=\"hidden\" id=\"ozgSubProgId\"><input type=\"search\" enterkeyhint=\"search\" id=\"subCoachSearch\" class=\"user-search-input\" placeholder=\"Search coach (min 2 chars)...\" onkeydown=\"if(event.key === 'Enter') this.blur();\"><div id=\"subCoachResults\" class=\"user-search-results\"><\/div><input type=\"hidden\" id=\"selectedSubCoachId\" value=\"0\"><div style=\"display:flex; justify-content:flex-end; gap:10px; margin-top:20px;\"><button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgSubscribeModal').classList.remove('show')\">Cancel<\/button><button class=\"ozg-btn\" onclick=\"ozgConfirmSubscribe()\">Start Learning<\/button><\/div><\/div><\/div>\n    <div class=\"ozg-modal-overlay\" id=\"ozgBuddyModal\"><div class=\"ozg-modal\"><h3 style=\"color:#fff; margin-top:0; font-size:1.4rem;\"><i data-lucide=\"users\" style=\"display:inline-block; vertical-align:middle; margin-right:8px;\"><\/i>Choose Buddy<\/h3><input type=\"search\" enterkeyhint=\"search\" id=\"buddySearchInput\" class=\"user-search-input\" placeholder=\"Search (min 2 chars)...\" onkeydown=\"if(event.key === 'Enter') this.blur();\"><div id=\"buddySearchResults\" class=\"user-search-results\"><\/div><input type=\"hidden\" id=\"selectedBuddyId\" value=\"0\"><div style=\"display:flex; justify-content:flex-end; gap:10px; margin-top:20px;\"><button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgBuddyModal').classList.remove('show')\">Cancel<\/button><button class=\"ozg-btn\" onclick=\"ozgSetBuddy()\">Invite<\/button><\/div><\/div><\/div>\n    <div class=\"ozg-modal-overlay\" id=\"ozgModal\"><div class=\"ozg-modal\"><h3 id=\"ozgModalTitle\" style=\"color:#fff; margin-top:0; margin-bottom:20px;\">Creation<\/h3><input type=\"hidden\" id=\"ozgType\"><input type=\"hidden\" id=\"ozgProgId\"><input type=\"hidden\" id=\"ozgEntityId\" value=\"0\"><input type=\"text\" id=\"ozgTitle\" class=\"ozg-input\" placeholder=\"Title...\" onkeydown=\"if(event.key === 'Enter') this.blur();\"><div id=\"ozgProgramFields\" style=\"display:none;\"><select id=\"ozgPillar\" class=\"ozg-input\" onchange=\"ozgUpdateAreas()\"><option value='wisdom'>Tower of Enlightenment<\/option><option value='strength'>The Citadel<\/option><option value='wealth'>The Treasury<\/option><option value='balance'>Gardens of Harmony<\/option><\/select><select id=\"ozgArea\" class=\"ozg-input\"><\/select><\/div><select id=\"ozgFreq\" class=\"ozg-input\" style=\"display:none;\"><option value=\"daily\">Daily<\/option><option value=\"weekly\">Weekly<\/option><\/select><select id=\"ozgLink\" class=\"ozg-input\" style=\"display:none;\"><option value=\"0\">Regular milestone<\/option><option value='16943'>Link: Novark<\/option><option value='16939'>Link: \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u0435\u043a\u0440\u0435\u0442 \u0436\u0438\u0437\u043d\u0438<\/option><option value='16933'>Link: neo nomads<\/option><option value='16898'>Link: \u041a\u0430\u043a_\u0441\u0442\u0430\u0442\u044c_\u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c_\u0434\u043e_25_\u043b\u0435\u0442<\/option><option value='16890'>Link: \u0412\u0441\u0435\u0433\u0434\u0430_\u0421\u0442\u0440\u0435\u043c\u0438\u0441\u044c_\u0420\u0410\u0417\u0412\u0418\u0412\u0410\u0422\u042c\u0421\u042f_\u0423\u043e\u0440\u0440\u0435\u043d_\u0411\u0430\u0444\u0444\u0435\u0442<\/option><option value='16885'>Link: 5\u043c\u0438\u043d\u0443\u0442_\u043d\u0430_\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435_50\u043b\u0435\u0442_\u0442\u0432\u043e\u0435\u0439_\u0436\u0438\u0437\u043d\u0438<\/option><option value='16314'>Link: Ozgeris Uztazy: \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e \u041a\u043e\u0443\u0447\u0438\u043d\u0433\u0430<\/option><option value='16876'>Link: hobbist digital nomad way<\/option><option value='16871'>Link: hobbist_ \u041f\u0443\u0442\u044c \u0426\u0438\u0444\u0440\u043e\u0432\u043e\u0433\u043e \u041a\u043e\u0447\u0435\u0432\u043d\u0438\u043a\u0430<\/option><option value='16868'>Link: \u0413\u0435\u043d\u0440\u0438_\u0424\u043e\u0440\u0434 \u2013 \u0417\u043e\u043b\u043e\u0442\u044b\u0435_\u0443\u0440\u043e\u043a\u0438_\u0431\u043e\u0433\u0430\u0442\u0441\u0442\u0432\u0430<\/option><option value='16844'>Link: Super motivation<\/option><option value='15257'>Link: The Holy Quran (Arabic)<\/option><option value='16685'>Link: \u041c\u0430\u0441\u0442\u0435\u0440\u043c\u0430\u0439\u043d\u0434: \u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043c\u043e\u0449\u044c \u0441\u0442\u0430\u044e<\/option><option value='16310'>Link: \u0413\u0440\u0430\u043d\u0434-\u0410\u0443\u0434\u0438\u0442 \u041a\u043e\u0440\u043e\u043b\u0435\u0432\u0441\u0442\u0432\u0430: \u041f\u0435\u0440\u0435\u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430<\/option><option value='16305'>Link: \u0424\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f \u0421\u0442\u043e\u0438\u0446\u0438\u0437\u043c\u0430 \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0431\u044b\u0442\u0443<\/option><option value='16301'>Link: \u0421\u043c\u044b\u0441\u043b \u0438 \u0426\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (\u041b\u043e\u0433\u043e\u0442\u0435\u0440\u0430\u043f\u0438\u044f \u0424\u0440\u0430\u043d\u043a\u043b\u0430)<\/option><option value='16297'>Link: \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e \u042d\u043c\u043f\u0430\u0442\u0438\u0438: \u041a\u0430\u043a \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043b\u044e\u0434\u0435\u0439<\/option><option value='16292'>Link: EQ: \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0432\u043e\u0433\u043e\u0439 \u0438 \u0433\u043d\u0435\u0432\u043e\u043c<\/option><option value='16287'>Link: \u0413\u0435\u0439\u043c\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0440\u0443\u0442\u0438\u043d\u044b: \u0416\u0438\u0437\u043d\u044c \u043a\u0430\u043a \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/option><option value='16282'>Link: \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u0434\u044b\u0445\u0430<\/option><\/select><div style=\"display:flex; justify-content:flex-end; gap:10px; margin-top:20px;\"><button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgModal').classList.remove('show')\">Cancel<\/button><button class=\"ozg-btn\" onclick=\"ozgSave()\">Save<\/button><\/div><\/div><\/div>\n    <div class=\"ozg-modal-overlay\" id=\"ozgCreateChallengeModal\"><div class=\"ozg-modal\"><h3 style=\"color:#fff; margin-top:0; font-size:1.4rem;\"><i data-lucide=\"swords\" style=\"display:inline-block; vertical-align:middle; margin-right:8px;\"><\/i>Create Challenge<\/h3><input type=\"text\" id=\"ozgChallengeTitle\" class=\"ozg-input\" placeholder=\"E.g.: A month without sugar\" style=\"margin-top:20px;\" onkeydown=\"if(event.key === 'Enter') this.blur();\"><select id=\"ozgChallengeHabit\" class=\"ozg-input\" style=\"margin-bottom:16px;\"><option value=\"0\">You have no active habits<\/option><\/select><select id=\"ozgChallengeType\" class=\"ozg-input\" style=\"margin-bottom:24px;\"><option value=\"open\">Open<\/option><option value=\"invite\">Private<\/option><\/select><div style=\"display:flex; justify-content:flex-end; gap:10px;\"><button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgCreateChallengeModal').classList.remove('show')\">Cancel<\/button><button class=\"ozg-btn\" onclick=\"ozgCreateChallenge()\">Create<\/button><\/div><\/div><\/div>\n    <div class=\"ozg-modal-overlay\" id=\"ozgJournalModal\"><div class=\"ozg-modal\" style=\"max-width: 500px;\"><h3 id=\"ozgJournalModalTitle\" style=\"color:#fff; margin-top:0; font-size:1.4rem;\"><i data-lucide=\"book-open\" style=\"display:inline-block; vertical-align:middle; margin-right:8px;\"><\/i>New entry in journal<\/h3><input type=\"hidden\" id=\"ozgJournalMilestoneId\" value=\"\"><textarea id=\"ozgJournalEntry\" class=\"ozg-input\" placeholder=\"Describe your progress, insights or reflection...\" rows=\"6\" style=\"resize:vertical;\"><\/textarea><div style=\"display:flex; justify-content:flex-end; gap:10px; margin-top:20px;\"><button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgJournalModal').classList.remove('show')\">Cancel<\/button><button class=\"ozg-btn\" onclick=\"ozgSaveJournalEntry()\">Save<\/button><\/div><\/div><\/div>\n    <div class=\"ozg-modal-overlay\" id=\"ozgAddQuestModal\"><div class=\"ozg-modal\" style=\"max-width: 500px;\"><h3 style=\"color:#fff; margin-top:0; font-size:1.4rem;\"><i data-lucide=\"plus-circle\" style=\"display:inline-block; vertical-align:middle; margin-right:8px;\"><\/i>Add Quest<\/h3><p style=\"color:var(--text-muted); font-size:0.9rem; margin-bottom:16px;\" id=\"addQuestSphereName\"><\/p><input type=\"hidden\" id=\"addQuestPillar\"><input type=\"hidden\" id=\"addQuestArea\"><select id=\"addQuestProgramId\" class=\"ozg-input\" style=\"margin-bottom: 16px;\"><\/select><input type=\"search\" enterkeyhint=\"search\" id=\"addQuestCoachSearch\" class=\"user-search-input\" placeholder=\"Search coach (min 2 chars)...\" onkeydown=\"if(event.key === 'Enter') this.blur();\"><div id=\"addQuestCoachResults\" class=\"user-search-results\"><\/div><input type=\"hidden\" id=\"selectedAddQuestCoachId\" value=\"0\"><div style=\"display:flex; justify-content:flex-end; gap:10px; margin-top:20px;\"><button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgAddQuestModal').classList.remove('show')\">Cancel<\/button><button class=\"ozg-btn\" onclick=\"ozgConfirmAddQuest()\">Add<\/button><\/div><\/div><\/div>\n    <div class=\"ozg-modal-overlay\" id=\"ozgChangeCoachModal\"><div class=\"ozg-modal\"><h3 style=\"color:#fff; margin-top:0; font-size:1.4rem;\"><i data-lucide=\"user-plus\" style=\"display:inline-block; vertical-align:middle; margin-right:8px;\"><\/i>Change Coach<\/h3><input type=\"hidden\" id=\"changeCoachProgramId\"><input type=\"search\" enterkeyhint=\"search\" id=\"changeCoachSearch\" class=\"user-search-input\" placeholder=\"Search coach (min 2 chars)...\" onkeydown=\"if(event.key === 'Enter') this.blur();\"><div id=\"changeCoachResults\" class=\"user-search-results\"><\/div><input type=\"hidden\" id=\"selectedCoachId\" value=\"0\"><div style=\"display:flex; justify-content:flex-end; gap:10px; margin-top:20px;\"><button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgChangeCoachModal').classList.remove('show')\">Cancel<\/button><button class=\"ozg-btn\" onclick=\"ozgConfirmChangeCoach()\">Save<\/button><\/div><\/div><\/div>\n    <div class=\"ozg-modal-overlay\" id=\"ozgChangeBossModal\"><div class=\"ozg-modal\"><h3 style=\"color:#fff; margin-top:0; font-size:1.4rem;\"><i data-lucide=\"briefcase\" style=\"display:inline-block; vertical-align:middle; margin-right:8px;\"><\/i>Change Boss<\/h3><input type=\"hidden\" id=\"changeBossProgramId\"><input type=\"search\" enterkeyhint=\"search\" id=\"changeBossSearch\" class=\"user-search-input\" placeholder=\"Search boss (min 2 chars)...\" onkeydown=\"if(event.key === 'Enter') this.blur();\"><div id=\"changeBossResults\" class=\"user-search-results\"><\/div><input type=\"hidden\" id=\"selectedBossId\" value=\"0\"><div style=\"display:flex; justify-content:flex-end; gap:10px; margin-top:20px;\"><button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgChangeBossModal').classList.remove('show')\">Cancel<\/button><button class=\"ozg-btn\" onclick=\"ozgConfirmChangeBoss()\">Save<\/button><\/div><\/div><\/div>\n    <div class=\"ozg-modal-overlay\" id=\"ozgChangeProgramBuddyModal\"><div class=\"ozg-modal\"><h3 style=\"color:#fff; margin-top:0; font-size:1.4rem;\"><i data-lucide=\"user-check\" style=\"display:inline-block; vertical-align:middle; margin-right:8px;\"><\/i>Choose quest buddy<\/h3><input type=\"hidden\" id=\"changeBuddyProgramId\"><input type=\"search\" enterkeyhint=\"search\" id=\"changeBuddySearch\" class=\"user-search-input\" placeholder=\"Search buddy (min 2 chars)...\" onkeydown=\"if(event.key === 'Enter') this.blur();\"><div id=\"changeBuddyResults\" class=\"user-search-results\"><\/div><input type=\"hidden\" id=\"selectedProgBuddyId\" value=\"0\"><div style=\"display:flex; justify-content:flex-end; gap:10px; margin-top:20px;\"><button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgChangeProgramBuddyModal').classList.remove('show')\">Cancel<\/button><button class=\"ozg-btn\" onclick=\"ozgConfirmChangeProgramBuddy()\">Save<\/button><\/div><\/div><\/div>\n\n    <!-- P2P CAMPAIGN INTEGRATION MODAL -->\n    <div class=\"ozg-modal-overlay\" id=\"ozgP2PModal\">\n        <div class=\"ozg-modal\" style=\"max-width: 600px; padding: 0; overflow: hidden; background: #fff;\">\n            <div style=\"display:flex; justify-content:space-between; align-items:center; padding: 16px 24px; background: #f8f9fa; border-bottom: 1px solid #e5e7eb;\">\n                <h3 style=\"color:#111827; margin:0; font-size:1.2rem; display: flex; align-items: center; gap: 8px;\"><i data-lucide=\"heart-handshake\" style=\"color: var(--success-color);\"><\/i> Support Campaign<\/h3>\n                <button class=\"ozg-icon-btn\" style=\"background: transparent; border: none; color: #6b7280; width: auto; height: auto; padding: 4px;\" onclick=\"document.getElementById('ozgP2PModal').classList.remove('show')\"><i data-lucide=\"x\"><\/i><\/button>\n            <\/div>\n            <div id=\"ozgP2PContent\" style=\"padding: 24px; max-height: 70vh; overflow-y: auto; color: #374151;\"><\/div>\n        <\/div>\n    <\/div>\n\n    <!-- COURSE DETAILS \/ LEARNING MODAL -->\n    <div class=\"ozg-modal-overlay\" id=\"ozgCourseModal\">\n        <div class=\"ozg-modal\" id=\"ozgCourseModalContent\"><\/div>\n    <\/div>\n\n    <!-- LESSON DETAILS \/ LEARNING MODAL -->\n    <div class=\"ozg-modal-overlay\" id=\"ozgLessonModal\">\n        <div class=\"ozg-modal\" id=\"ozgLessonModalContent\"><\/div>\n    <\/div>\n\n    <!-- FUNDRAISING DETAILS MODAL -->\n    <div class=\"ozg-modal-overlay\" id=\"ozgFundraisingModal\">\n        <div class=\"ozg-modal\" id=\"ozgFundraisingModalContent\"><\/div>\n    <\/div>\n\n    <!-- FLOATING CREATION MODAL -->\n    <div class=\"ozg-fs-modal\" id=\"ozgFsModal\">\n        <div class=\"ozg-fs-header\">\n            <div style=\"display:flex; align-items:center; gap:10px; min-width:0; overflow:hidden;\">\n                <i data-lucide=\"pencil-ruler\" style=\"color:var(--accent-cyan); flex-shrink:0; width:18px;\"><\/i>\n                <h3 id=\"ozgFsModalTitle\" style=\"color:#fff; margin:0; font-family:'Playfair Display',serif; font-size:1rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;\">Creation<\/h3>\n            <\/div>\n            <div style=\"display:flex; gap:8px; align-items:center; flex-shrink:0;\">\n                <button class=\"ozg-icon-btn\" title=\"Minimise\" onclick=\"ozgToggleFsMinimise()\" id=\"ozgFsMinBtn\"><i data-lucide=\"minus\"><\/i><\/button>\n                <button class=\"ozg-icon-btn\" title=\"Close creation panel\" onclick=\"ozgCloseFsModal()\"><i data-lucide=\"x\"><\/i><\/button>\n            <\/div>\n        <\/div>\n        <div class=\"ozg-fs-body\" id=\"ozgFsModalBody\">\n            <iframe src=\"about:blank\" id=\"ozgFsIframe\"><\/iframe>\n        <\/div>\n    <\/div>\n\n    <div class=\"ozg-modal-overlay\" id=\"ozgUserProfileModal\">\n        <div class=\"ozg-modal\" style=\"max-width: 600px; width: 95%;\">\n            <button class=\"ozg-quiz-close\" style=\"position: absolute; right: 16px; top: 16px; z-index: 10;\" onclick=\"document.getElementById('ozgUserProfileModal').classList.remove('show')\"><i data-lucide=\"x\"><\/i><\/button>\n            <div id=\"ozgUserProfileModalContent\"><\/div>\n        <\/div>\n    <\/div>\n\n    <!-- FLOATING CREATION BAR -->\n    <div class=\"ozg-creation-bar\" id=\"ozgCreationBar\">\n        <div class=\"ozg-creation-scroll\">\n            <div class=\"ozg-create-btn\" onclick=\"ozgShowCreationPanel('course')\"><i data-lucide=\"graduation-cap\"><\/i> Course<\/div>\n            <div class=\"ozg-create-btn\" onclick=\"ozgShowCreationPanel('campaign')\"><i data-lucide=\"heart-handshake\"><\/i> Finance<\/div>\n            <div class=\"ozg-create-btn\" onclick=\"ozgShowCreationPanel('product')\"><i data-lucide=\"shopping-bag\"><\/i> Product<\/div>\n            <div class=\"ozg-create-btn\" onclick=\"ozgShowCreationPanel('service')\"><i data-lucide=\"briefcase\"><\/i> Service<\/div>\n            <div class=\"ozg-create-btn\" onclick=\"ozgShowCreationPanel('lesson')\"><i data-lucide=\"play-circle\"><\/i> Lesson<\/div>\n            <div class=\"ozg-create-btn\" onclick=\"ozgShowCreationPanel('post')\"><i data-lucide=\"pen-tool\"><\/i> Post<\/div>\n            <div class=\"ozg-create-btn\" onclick=\"ozgShowCreationPanel('page')\"><i data-lucide=\"file-text\"><\/i> Page<\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Creation panel modal -->\n    <div class=\"ozg-modal-overlay\" id=\"ozgCreationPanelModal\" style=\"z-index:2147483647;\">\n        <div class=\"ozg-modal\" style=\"max-width:800px; width: 95%; max-height:92svh; overflow-y:auto; background:#0f121e; color:#fff; border:1px solid rgba(255,255,255,0.1); padding: 0;\">\n            <div style=\"display:flex; justify-content:space-between; align-items:center; padding: 20px; border-bottom: 1px solid rgba(255,255,255,0.05); gap:10px;\">\n                <h3 id=\"ozgCreationPanelTitle\" style=\"margin:0; color:#fff; font-family:'Playfair Display',serif; font-size:1.2rem;\"><\/h3>\n                <button class=\"ozg-icon-btn\" id=\"ozgCreationCloseBtn\" onclick=\"ozgCreationGuardedClose()\"><i data-lucide=\"x\"><\/i><\/button>\n            <\/div>\n            <div id=\"ozgCreationPanelBody\" style=\"padding: 20px;\"><\/div>\n            <div id=\"ozgEditorIframeWrap\" style=\"display:none; width: 100%; border-radius:0; overflow:hidden; border-top:1px solid rgba(255,255,255,0.15); height:85svh;\">\n                <iframe id=\"ozgEditorIframe\" src=\"about:blank\" style=\"width:100%; height:100%; border:none; display:block;\" loading=\"lazy\"><\/iframe>\n            <\/div>\n            <div id=\"ozgCreationActionBar\" style=\"display:none; gap:10px; justify-content:flex-end; padding:14px 20px; border-top:1px solid rgba(255,255,255,0.08);\">\n                <button class=\"ozg-btn\" style=\"background:var(--success-color);border-color:var(--success-color);\" onclick=\"ozgPublishCreationDraft()\"><i data-lucide=\"send\"><\/i> Publish<\/button>\n                <button class=\"ozg-btn-sec\" onclick=\"ozgOpenCreationEditor()\"><i data-lucide=\"pencil-ruler\"><\/i> Full Editor<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n    <div class=\"ozg-modal-overlay\" id=\"ozgUnsavedWarnModal\" style=\"z-index:2147483647;display:none;\">\n        <div class=\"ozg-modal\" style=\"max-width:360px;background:#0f121e;color:#fff;border:1px solid rgba(255,255,255,0.1);text-align:center;padding:28px 24px;\">\n            <i data-lucide=\"alert-triangle\" style=\"width:36px;height:36px;color:#f59e0b;margin-bottom:12px;\"><\/i>\n            <h3 style=\"margin:0 0 8px;font-family:'Playfair Display',serif;font-size:1.1rem;\">Unsaved changes<\/h3>\n            <p style=\"color:rgba(255,255,255,0.55);font-size:0.88rem;margin-bottom:22px;\">Your draft has not been saved. Closing will discard it.<\/p>\n            <div style=\"display:flex;gap:10px;justify-content:center;\">\n                <button class=\"ozg-btn-sec\" onclick=\"ozgForceCloseCreation()\">Close anyway<\/button>\n                <button class=\"ozg-btn\" onclick=\"document.getElementById('ozgUnsavedWarnModal').style.display='none';\">Continue editing<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <script>\n        lucide.createIcons();\n\n        \/\/ ==========================================\n        \/\/ GLOBAL CONSTANTS (Defined early for functions)\n        \/\/ ==========================================\n        const dbQuizScores = [];\n        const dbFocusAreas = [];\n        const kingdomStruct = {\"wisdom\":{\"name\":\"Tower of Enlightenment\",\"desc\":\"Wisdom, mind and knowledge\",\"icon\":\"scroll\",\"color\":\"#3b82f6\",\"areas\":{\"mindfulness\":\"Mindfulness\",\"intellect\":\"Intellect\",\"skills\":\"Hard Skills\",\"leadership\":\"Leadership\",\"creativity\":\"Creativity & Art\",\"vision\":\"Strategy & Goals\"}},\"strength\":{\"name\":\"The Citadel\",\"desc\":\"Body strength, energy and spirit\",\"icon\":\"shield\",\"color\":\"#ef4444\",\"areas\":{\"health\":\"Health & Immunity\",\"energy\":\"Energy level\",\"appearance\":\"Appearance & Style\",\"discipline\":\"Discipline & Will\",\"fitness\":\"Fitness & Endurance\",\"nutrition\":\"Nutrition & Sleep\"}},\"wealth\":{\"name\":\"The Treasury\",\"desc\":\"Wealth, assets and abundance\",\"icon\":\"gem\",\"color\":\"#eab308\",\"areas\":{\"income\":\"Active income\",\"investments\":\"Investments\",\"assets\":\"Asset creation\",\"savings\":\"Savings\",\"business\":\"Business & Projects\",\"career\":\"Career growth\"}},\"balance\":{\"name\":\"Gardens of Harmony\",\"desc\":\"Balance, emotions and connections\",\"icon\":\"flower-2\",\"color\":\"#22c55e\",\"areas\":{\"family\":\"Family & Lineage\",\"love\":\"Relationships & Love\",\"friends\":\"Environment (Networking)\",\"rest\":\"Rest & Lifestyle\",\"emotions\":\"Emotional Intelligence\",\"spirituality\":\"Spirituality & Peace\"}}};\n        const nonce = 'ccee4439e6';\n        const apiBase = 'https:\/\/emirat.hobbi.st\/ru\/wp-json\/ozgeris\/v1';\n        const ozgDashboardUrl = 'https:\/\/emirat.hobbi.st\/ru\/';\n        const EXPECTED_USER_ID = 0;\n        const EXPECTED_USER_NAME = '';\n\n        \/\/ ==========================================\n        \/\/ CACHE COLLISION VERIFICATION\n        \/\/ ==========================================\n        async function verifySessionAndFixCache() {\n            try {\n                const resp = await fetch(apiBase + '\/me\/verify', {\n                    headers: { 'X-WP-Nonce': nonce }\n                });\n\n                if (!resp.ok) return; \/\/ Silent fail on API error\n\n                const data = await resp.json();\n                const actualUserId = data.logged_in ? data.user_id : 0;\n\n                if (actualUserId !== EXPECTED_USER_ID) {\n                    console.warn('Session sync: Expected ID:', EXPECTED_USER_ID, 'Actual ID:', actualUserId);\n                    if (actualUserId > 0) {\n                        ozgI18n.isGuest = false;\n                        if (typeof loadUserProfile === 'function') loadUserProfile(actualUserId);\n                    } else {\n                        ozgI18n.isGuest = true;\n                    }\n                } else if (sessionStorage.getItem('ozg_login_token')) {\n                    \/\/ Fresh login via Telegram, offer browser sync\n                    const isMiniApp = (window.Telegram && window.Telegram.WebApp && window.Telegram.WebApp.platform && window.Telegram.WebApp.platform !== 'unknown');\n                    if (isMiniApp) {\n                        const token = sessionStorage.getItem('ozg_login_token');\n                        sessionStorage.removeItem('ozg_login_token');\n                        ozgShowBrowserSyncPrompt(token);\n                    }\n                }\n            } catch (e) {\n                console.error('Session verification failed:', e);\n            }\n        }\n\n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', verifySessionAndFixCache);\n        } else {\n            verifySessionAndFixCache();\n        }\n        \/\/ ==========================================\n        \/\/ END CACHE COLLISION VERIFICATION\n        \/\/ ==========================================\n\n        const ozgCreationConfigs = {\n            course: {\n                title: 'Create Emirat Course',\n                icon: 'graduation-cap',\n                endpoint: `${apiBase}\/create\/course`,\n                fields: [\n                    { id:'title',         label:'Course Title',       type:'text',     required:true,  placeholder:'e.g. Watercolour for Beginners' },\n                    { id:'description',   label:'Short Description',  type:'textarea', required:false, placeholder:'What will students learn?' },\n                    { id:'course_format', label:'Course Format',      type:'select',   required:false, options: [\n                        {id:'general', title:'\ud83c\udf93 General Course'},\n                        {id:'video',   title:'\ud83c\udfac Video Course'},\n                        {id:'audio',   title:'\ud83c\udfa7 Audio \/ Podcast'},\n                        {id:'book',    title:'\ud83d\udcd6 Book \/ Text'},\n                        {id:'game',    title:'\ud83c\udfae Game \/ Interactive'}\n                    ] },\n                    { id:'price',         label:'Price (0 = free)',   type:'number',   required:false, placeholder:'0' },\n                    { id:'category_id',   label:'Category',           type:'select',   required:false, optionsApi:`${apiBase}\/tutor\/categories` },\n                    { id:'thumbnail_url', label:'Course Thumbnail',   type:'file_upload', required:false, placeholder:'Upload image or paste URL...' },\n                    { id:'media_url',     label:'Course Media File (Video\/Audio\/Doc)', type:'file_upload', required:false, placeholder:'Upload media file or paste link...' },\n                ],\n                successAction: 'open_editor',\n                note: 'A draft course is created. After saving you can add lessons and quizzes in the course builder.'\n            },\n            campaign: {\n                title: 'New Finance',\n                icon: 'heart-handshake',\n                endpoint: `${apiBase}\/create\/campaign`,\n                fields: [\n                    { id:'title',         label:'Campaign Title',     type:'text',     required:true,  placeholder:'e.g. Help build a community studio' },\n                    { id:'description',   label:'Story',              type:'textarea', required:false, placeholder:'Describe your project\u2026' },\n                    { id:'goal',          label:'Funding Goal (\u20b8)',   type:'number',   required:false, placeholder:'e.g. 500000' },\n                    { id:'category_id',   label:'Category',           type:'select',   required:false, optionsApi:`${apiBase}\/fundengine\/categories` },\n                    { id:'thumbnail_url', label:'Campaign Thumbnail', type:'file_upload', required:false, placeholder:'Upload image or paste URL...' },\n                    { id:'media_url',     label:'Media File \/ Video \/ Audio', type:'file_upload', required:false, placeholder:'Upload media or paste link...' },\n                    { id:'transfer_methods', label:'Transfer Methods', type:'checkboxes', required:false, options:[\n                        {id:'kaspi_payment', label:'Kaspi.kz', checked:true},\n                        {id:'halyk_payment', label:'Halyk Bank'},\n                        {id:'bank_payment', label:'Other Bank Transfer'},\n                        {id:'offline_payment', label:'Cash'}\n                    ]},\n                    { id:'kaspi_mobile', label:'Kaspi Mobile Number', type:'text', required:false, placeholder:'e.g. +7 707 ...' },\n                    { id:'kaspi_name',   label:'Kaspi Receiver Name', type:'text', required:false, placeholder:'e.g. IVAN I.' },\n                    { id:'halyk_mobile', label:'Halyk Mobile Number', type:'text', required:false, placeholder:'e.g. +7 701 ...' },\n                    { id:'halyk_name',   label:'Halyk Receiver Name', type:'text', required:false, placeholder:'e.g. IVAN I.' },\n                ],\n                successAction: 'open_editor',\n                note: 'Campaign will be published immediately. Use the Edit (pen) button in Management if you want to add more details or gallery items later.'\n            },\n            lesson: {\n                title: 'Add Lesson',\n                icon: 'play-circle',\n                endpoint: `${apiBase}\/create\/lesson`,\n                fields: [\n                    { id:'title',     label:'Lesson Title',         type:'text',     required:true,  placeholder:'e.g. Module 1 \u2014 Introduction' },\n                    { id:'course_id', label:'Attach to Course',     type:'select',   required:false, optionsApi:`${apiBase}\/tutor\/courses` },\n                    { id:'content',   label:'Lesson Content',       type:'textarea', required:false, placeholder:'Write the lesson text\u2026' },\n                    { id:'video_url', label:'Video\/Audio URL',      type:'url',      required:false, placeholder:'https:\/\/\u2026 (mp4, YouTube, etc)' },\n                ],\n                successAction: 'none',\n                note: 'Lesson is published immediately and attached to the selected course.'\n            },\n            product: {\n                title: 'Add Store Product',\n                icon: 'shopping-bag',\n                endpoint: `${apiBase}\/create\/product`,\n                fields: [\n                    { id:'title',       label:'Product Name',       type:'text',     required:true,  placeholder:'e.g. Premium Brush Set' },\n                    { id:'description', label:'Description',        type:'textarea', required:false, placeholder:'What is included?' },\n                    { id:'price',       label:'Price',              type:'number',   required:true,  placeholder:'e.g. 4990' },\n                    { id:'sku',         label:'SKU (optional)',     type:'text',     required:false, placeholder:'e.g. BRUSH-001' },\n                ],\n                successAction: 'open_editor',\n                note: 'WooCommerce product draft created.'\n            },\n            post: {\n                title: 'New Blog Post',\n                icon: 'pen-tool',\n                endpoint: `${apiBase}\/create\/post`,\n                fields: [\n                    { id:'title',   label:'Title',    type:'text',     required:true,  placeholder:'Post title' },\n                    { id:'content', label:'Content',  type:'textarea', required:false, placeholder:'Write your post\u2026' },\n                ],\n                successAction: 'open_editor'\n            },\n            page: {\n                title: 'New Page',\n                icon: 'file-text',\n                endpoint: `${apiBase}\/create\/page`,\n                fields: [\n                    { id:'title',   label:'Page Title', type:'text',     required:true,  placeholder:'Page title' },\n                    { id:'content', label:'Content',    type:'textarea', required:false, placeholder:'Page content\u2026' },\n                ],\n                successAction: 'open_editor'\n            },\n        };\n\n        const gpAjaxUrl = (typeof gamipressAjax !== 'undefined') ? gamipressAjax.ajaxurl : '';\n        const gpNonce = (typeof gamipressAjax !== 'undefined') ? gamipressAjax.nonce : '';\n        const gpUserId = 0;\n\n        const ozgI18n = {\n            isGuest: true,\n            coursePopupId: 0,\n            campaignPopupId: 0,\n            maxSpheres: 'Maximum 8 areas!',\n            alreadyHigh: 'This area is already highly developed. Choose areas for growth.',\n            saveSelection: 'Save selection',\n            confirmErase: 'Are you sure? This will erase your results.',\n            deleteQuestConfirm: 'Remove this quest from your track? All progress will be saved.',\n            deleteConfirm: 'Are you sure you want to delete this?',\n            enterTitleHabit: 'Enter a title and select a habit.',\n            errorConnection: 'Connection error',\n            selectQuest: 'Select a quest',\n            copyCreated: 'A copy was created since you are editing someone else\\'s material.',\n            leaderboardSoon: 'Leaderboard is forming. Participant rankings will appear here soon!',\n            startTestConfirm: 'Start test',\n            enterJournalText: 'Enter entry text',\n            milestoneCompletedLog: 'Just completed milestone',\n            myImpressions: 'My impressions:',\n            notFound: 'Not found',\n            selected: 'Selected:',\n            noAvailableQuests: 'No available quests',\n            noHabits: 'No habits',\n            noMilestones: 'No milestones',\n            habitTracker: 'Habit Tracker',\n            habitNamePrompt: 'Enter short name for this habit:',\n            noPrograms: 'No programs found. Create a new one!',\n            habits: 'Habits',\n            milestones: 'Milestones',\n            addBtn: 'Add',\n            loading: 'Loading...',\n            activeQuests: 'Active quests:',\n            noActiveQuests: 'No active quests',\n            hideTrack: 'Hide track',\n            viewTrack: 'View track',\n            edit: 'Edit',\n            create: 'Create',\n            v_bal: 'Perfect Balance (Avatar). Your Kingdom is developing absolutely harmoniously in all 4 directions. This is the rarest and most sustainable path.',\n            v_pure_w: 'Absolute Sage. Your focus is entirely on cognition, intellect, and meaning. You are building a grand vision.',\n            v_pure_s: 'Absolute Titan. You made an ultimate bet on physical power, health, and discipline. Your energy is indestructible.',\n            v_pure_c: 'Absolute Magnate. Total focus on capital, business, and career. You are building an unshakable financial empire.',\n            v_pure_b: 'Absolute Healer. Your priority is deep spiritual harmony, family, and emotions. You are the foundation for your environment.',\n            v_dom_w_s: 'Path of the Tactician (Wisdom + Strength). Intellect backed by steel discipline and endurance. You are a strategist who knows how to act.',\n            v_dom_w_c: 'Path of the Architect (Wisdom + Wealth). You monetize your knowledge. Sharp mind and career focus create powerful innovations.',\n            v_dom_w_b: 'Path of the Illuminator (Wisdom + Harmony). Deep knowledge combined with emotional intelligence. You are a mentor and thought leader.',\n            v_dom_s_w: 'Path of the Ascetic (Strength + Wisdom). Physical perfection guides your mind. A healthy body generates brilliant ideas.',\n            v_dom_s_c: 'Path of the Conqueror (Strength + Wealth). Boundless energy aimed at capturing markets and increasing income. The main thing is not to forget to rest.',\n            v_dom_s_b: 'Path of the Protector (Strength + Harmony). You are strong in body but soft in heart. Your power serves as a support for your family and loved ones.',\n            v_dom_c_w: 'Path of the Visionary (Wealth + Wisdom). You build capital through knowledge and strategies. Intellectual business is your superpower.',\n            v_dom_c_s: 'Path of the Industrialist (Wealth + Strength). Tireless work and iron grip. You forge your wealth through extreme discipline.',\n            v_dom_c_b: 'Path of the Patron (Wealth + Harmony). Financial success for you is a tool to create comfort, help your family, and improve the world around you.',\n            v_dom_b_w: 'Path of the Oracle (Harmony + Wisdom). A subtle sense of the world supported by knowledge. You are a deep empath and analyst of human souls.',\n            v_dom_b_s: 'Path of the Paladin (Harmony + Strength). Your inner stability is protected by physical power. You are unwavering in your values.',\n            v_dom_b_c: 'Path of the Diplomat (Harmony + Wealth). You grow through connections, networking, and emotional intelligence. Your social capital equals your financial capital.',\n            v_dual_w_s: 'Battle Mage (Wisdom &amp; Strength). Perfect synthesis of body and mind. You are equally strong in strategy and physical realization.',\n            v_dual_w_c: 'Mastermind (Wisdom &amp; Wealth). You masterfully translate intellectual capital into material wealth. Science and business go hand in hand.',\n            v_dual_w_b: 'The Alchemist (Wisdom &amp; Harmony). You seek the philosopher\\'s stone: a balance between a sharp mind and peace of mind.',\n            v_dual_s_c: 'Warlord (Strength &amp; Wealth). A powerful combination for expansion. Your endurance allows you to build giant assets.',\n            v_dual_s_b: 'The Warden (Strength &amp; Harmony). Physical health and spiritual tranquility. You are like a rock against which any stress breaks.',\n            v_dual_c_b: 'Guildmaster (Wealth &amp; Harmony). You know how to make money without losing the warmth of relationships and the joy of life.',\n            v_mix: 'Path of the Explorer. You have chosen a unique mix from different spheres without giving a clear preference to any single tower. Your path is experimentation and flexibility.',\n            w_wisdom: 'Growth Zone: Tower of Enlightenment. You are a person of action, but now it is important to make time for strategy and thinking. We recommend courses on leadership and strategy.',\n            w_strength: 'Growth Zone: The Citadel. You are ambitious, but your health and energy need strengthening. Without body resources, achieving goals will be difficult. Start with a track on routine.',\n            w_wealth: 'Growth Zone: The Treasury. You are in harmony with yourself, but your assets are lagging. It is time to monetize your skills and build an income system. Focus on assets.',\n            w_balance: 'Growth Zone: Gardens of Harmony. You are powerfully focused on results, but there is a risk of burnout. The Gardens of Harmony need watering. The AI recommends adding rest and networking to your routine.'\n        };\n\n        let allProgramsList = [{\"ID\":16943,\"post_author\":\"2134\",\"post_date\":\"2026-09-29 21:02:35\",\"post_date_gmt\":\"2026-09-29 16:02:35\",\"post_content\":\"\",\"post_title\":\"Novark\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"novark\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-29 21:02:35\",\"post_modified_gmt\":\"2026-09-29 16:02:35\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/novark\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16939,\"post_author\":\"2\",\"post_date\":\"2026-09-29 17:13:53\",\"post_date_gmt\":\"2026-09-29 12:13:53\",\"post_content\":\"\",\"post_title\":\"\\u0413\\u043b\\u0430\\u0432\\u043d\\u044b\\u0439 \\u0441\\u0435\\u043a\\u0440\\u0435\\u0442 \\u0436\\u0438\\u0437\\u043d\\u0438\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"%d0%b3%d0%bb%d0%b0%d0%b2%d0%bd%d1%8b%d0%b9-%d1%81%d0%b5%d0%ba%d1%80%d0%b5%d1%82-%d0%b6%d0%b8%d0%b7%d0%bd%d0%b8\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-29 17:13:53\",\"post_modified_gmt\":\"2026-09-29 12:13:53\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/%d0%b3%d0%bb%d0%b0%d0%b2%d0%bd%d1%8b%d0%b9-%d1%81%d0%b5%d0%ba%d1%80%d0%b5%d1%82-%d0%b6%d0%b8%d0%b7%d0%bd%d0%b8\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16933,\"post_author\":\"2\",\"post_date\":\"2026-09-29 17:04:55\",\"post_date_gmt\":\"2026-09-29 12:04:55\",\"post_content\":\"\",\"post_title\":\"neo nomads\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"neo-nomads\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-29 17:04:55\",\"post_modified_gmt\":\"2026-09-29 12:04:55\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/neo-nomads\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16898,\"post_author\":\"2\",\"post_date\":\"2026-09-28 15:45:10\",\"post_date_gmt\":\"2026-09-28 10:45:10\",\"post_content\":\"\",\"post_title\":\"\\u041a\\u0430\\u043a_\\u0441\\u0442\\u0430\\u0442\\u044c_\\u0441\\u0430\\u043c\\u043e\\u0434\\u043e\\u0441\\u0442\\u0430\\u0442\\u043e\\u0447\\u043d\\u044b\\u043c_\\u0434\\u043e_25_\\u043b\\u0435\\u0442\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"%d0%ba%d0%b0%d0%ba_%d1%81%d1%82%d0%b0%d1%82%d1%8c_%d1%81%d0%b0%d0%bc%d0%be%d0%b4%d0%be%d1%81%d1%82%d0%b0%d1%82%d0%be%d1%87%d0%bd%d1%8b%d0%bc_%d0%b4%d0%be_25_%d0%bb%d0%b5%d1%82\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-28 15:45:10\",\"post_modified_gmt\":\"2026-09-28 10:45:10\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/%d0%ba%d0%b0%d0%ba_%d1%81%d1%82%d0%b0%d1%82%d1%8c_%d1%81%d0%b0%d0%bc%d0%be%d0%b4%d0%be%d1%81%d1%82%d0%b0%d1%82%d0%be%d1%87%d0%bd%d1%8b%d0%bc_%d0%b4%d0%be_25_%d0%bb%d0%b5%d1%82\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16890,\"post_author\":\"3574\",\"post_date\":\"2026-09-28 11:47:35\",\"post_date_gmt\":\"2026-09-28 06:47:35\",\"post_content\":\"\",\"post_title\":\"\\u0412\\u0441\\u0435\\u0433\\u0434\\u0430_\\u0421\\u0442\\u0440\\u0435\\u043c\\u0438\\u0441\\u044c_\\u0420\\u0410\\u0417\\u0412\\u0418\\u0412\\u0410\\u0422\\u042c\\u0421\\u042f_\\u0423\\u043e\\u0440\\u0440\\u0435\\u043d_\\u0411\\u0430\\u0444\\u0444\\u0435\\u0442\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"%d0%b2%d1%81%d0%b5%d0%b3%d0%b4%d0%b0_%d1%81%d1%82%d1%80%d0%b5%d0%bc%d0%b8%d1%81%d1%8c_%d1%80%d0%b0%d0%b7%d0%b2%d0%b8%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f_%d1%83%d0%be%d1%80%d1%80%d0%b5%d0%bd_%d0%b1\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-28 11:47:35\",\"post_modified_gmt\":\"2026-09-28 06:47:35\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/%d0%b2%d1%81%d0%b5%d0%b3%d0%b4%d0%b0_%d1%81%d1%82%d1%80%d0%b5%d0%bc%d0%b8%d1%81%d1%8c_%d1%80%d0%b0%d0%b7%d0%b2%d0%b8%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f_%d1%83%d0%be%d1%80%d1%80%d0%b5%d0%bd_%d0%b1\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16885,\"post_author\":\"2\",\"post_date\":\"2026-09-28 11:14:40\",\"post_date_gmt\":\"2026-09-28 06:14:40\",\"post_content\":\"\",\"post_title\":\"5\\u043c\\u0438\\u043d\\u0443\\u0442_\\u043d\\u0430_\\u0441\\u043b\\u0435\\u0434\\u0443\\u044e\\u0449\\u0438\\u0435_50\\u043b\\u0435\\u0442_\\u0442\\u0432\\u043e\\u0435\\u0439_\\u0436\\u0438\\u0437\\u043d\\u0438\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"5%d0%bc%d0%b8%d0%bd%d1%83%d1%82_%d0%bd%d0%b0_%d1%81%d0%bb%d0%b5%d0%b4%d1%83%d1%8e%d1%89%d0%b8%d0%b5_50%d0%bb%d0%b5%d1%82_%d1%82%d0%b2%d0%be%d0%b5%d0%b9_%d0%b6%d0%b8%d0%b7%d0%bd%d0%b8\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-28 11:14:40\",\"post_modified_gmt\":\"2026-09-28 06:14:40\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/5%d0%bc%d0%b8%d0%bd%d1%83%d1%82_%d0%bd%d0%b0_%d1%81%d0%bb%d0%b5%d0%b4%d1%83%d1%8e%d1%89%d0%b8%d0%b5_50%d0%bb%d0%b5%d1%82_%d1%82%d0%b2%d0%be%d0%b5%d0%b9_%d0%b6%d0%b8%d0%b7%d0%bd%d0%b8\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16314,\"post_author\":\"1\",\"post_date\":\"2026-09-27 18:16:05\",\"post_date_gmt\":\"2026-09-27 13:16:05\",\"post_content\":\"\",\"post_title\":\"Ozgeris Uztazy: \\u0418\\u0441\\u043a\\u0443\\u0441\\u0441\\u0442\\u0432\\u043e \\u041a\\u043e\\u0443\\u0447\\u0438\\u043d\\u0433\\u0430\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"ozgeris-uztazy-%d0%b8%d1%81%d0%ba%d1%83%d1%81%d1%81%d1%82%d0%b2%d0%be-%d0%ba%d0%be%d1%83%d1%87%d0%b8%d0%bd%d0%b3%d0%b0\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-27 18:16:06\",\"post_modified_gmt\":\"2026-09-27 13:16:06\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"http:\\\/\\\/hobbi.st\\\/courses\\\/ozgeris-uztazy-%d0%b8%d1%81%d0%ba%d1%83%d1%81%d1%81%d1%82%d0%b2%d0%be-%d0%ba%d0%be%d1%83%d1%87%d0%b8%d0%bd%d0%b3%d0%b0\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16876,\"post_author\":\"2134\",\"post_date\":\"2026-09-27 17:31:20\",\"post_date_gmt\":\"2026-09-27 12:31:20\",\"post_content\":\"\",\"post_title\":\"hobbist digital nomad way\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"hobbist-digital-nomad-way\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-27 17:31:20\",\"post_modified_gmt\":\"2026-09-27 12:31:20\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/hobbist-digital-nomad-way\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16871,\"post_author\":\"2\",\"post_date\":\"2026-09-27 17:10:04\",\"post_date_gmt\":\"2026-09-27 12:10:04\",\"post_content\":\"\",\"post_title\":\"hobbist_ \\u041f\\u0443\\u0442\\u044c \\u0426\\u0438\\u0444\\u0440\\u043e\\u0432\\u043e\\u0433\\u043e \\u041a\\u043e\\u0447\\u0435\\u0432\\u043d\\u0438\\u043a\\u0430\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"hobbist_-%d0%bf%d1%83%d1%82%d1%8c-%d1%86%d0%b8%d1%84%d1%80%d0%be%d0%b2%d0%be%d0%b3%d0%be-%d0%ba%d0%be%d1%87%d0%b5%d0%b2%d0%bd%d0%b8%d0%ba%d0%b0\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-27 17:10:04\",\"post_modified_gmt\":\"2026-09-27 12:10:04\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/hobbist_-%d0%bf%d1%83%d1%82%d1%8c-%d1%86%d0%b8%d1%84%d1%80%d0%be%d0%b2%d0%be%d0%b3%d0%be-%d0%ba%d0%be%d1%87%d0%b5%d0%b2%d0%bd%d0%b8%d0%ba%d0%b0\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16868,\"post_author\":\"2\",\"post_date\":\"2026-09-27 17:04:41\",\"post_date_gmt\":\"2026-09-27 12:04:41\",\"post_content\":\"\",\"post_title\":\"\\u0413\\u0435\\u043d\\u0440\\u0438_\\u0424\\u043e\\u0440\\u0434 \\u2013 \\u0417\\u043e\\u043b\\u043e\\u0442\\u044b\\u0435_\\u0443\\u0440\\u043e\\u043a\\u0438_\\u0431\\u043e\\u0433\\u0430\\u0442\\u0441\\u0442\\u0432\\u0430\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"%d0%b3%d0%b5%d0%bd%d1%80%d0%b8_%d1%84%d0%be%d1%80%d0%b4-%d0%b7%d0%be%d0%bb%d0%be%d1%82%d1%8b%d0%b5_%d1%83%d1%80%d0%be%d0%ba%d0%b8_%d0%b1%d0%be%d0%b3%d0%b0%d1%82%d1%81%d1%82%d0%b2%d0%b0\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-27 17:04:41\",\"post_modified_gmt\":\"2026-09-27 12:04:41\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/%d0%b3%d0%b5%d0%bd%d1%80%d0%b8_%d1%84%d0%be%d1%80%d0%b4-%d0%b7%d0%be%d0%bb%d0%be%d1%82%d1%8b%d0%b5_%d1%83%d1%80%d0%be%d0%ba%d0%b8_%d0%b1%d0%be%d0%b3%d0%b0%d1%82%d1%81%d1%82%d0%b2%d0%b0\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16844,\"post_author\":\"2134\",\"post_date\":\"2026-09-27 15:19:49\",\"post_date_gmt\":\"2026-09-27 10:19:49\",\"post_content\":\"\",\"post_title\":\"Super motivation\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"super-motivation\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-27 15:19:49\",\"post_modified_gmt\":\"2026-09-27 10:19:49\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/super-motivation\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":15257,\"post_author\":\"1\",\"post_date\":\"2026-09-24 11:48:12\",\"post_date_gmt\":\"2026-09-24 06:48:12\",\"post_content\":\"<blockquote><p><mark class=\\\"HxTRcb\\\" data-sfc-root=\\\"c\\\" data-sfc-cb=\\\"\\\" data-processed=\\\"true\\\"><strong class=\\\"Yjhzub\\\" data-sfc-root=\\\"c\\\" data-sfc-cb=\\\"\\\" data-processed=\\\"true\\\">\\u0627\\u0644\\u0633\\u064e\\u0651\\u0644\\u0627\\u064e\\u0645\\u064f \\u0639\\u064e\\u0644\\u064e\\u064a\\u0652\\u0643\\u064f\\u0645\\u0652 \\u0648\\u064e\\u0631\\u064e\\u062d\\u0652\\u0645\\u064e\\u0629\\u064f \\u0627\\u0644\\u0644\\u0647\\u0650 \\u0648\\u064e\\u0628\\u064e\\u0631\\u064e\\u0643\\u064e\\u0627\\u062a\\u064f\\u0647\\u064f<\\\/strong><\\\/mark><span class=\\\"uJ19be notranslate\\\" data-sfc-root=\\\"c\\\" data-wiz-uids=\\\"AelgM_i,AelgM_j\\\" data-sfc-cb=\\\"\\\" data-processed=\\\"true\\\"><span class=\\\"vKEkVd\\\" data-animation-atomic=\\\"\\\" data-wiz-attrbind=\\\"class=AelgM_h\\\/TKHnVd\\\" data-processed=\\\"true\\\"><span aria-hidden=\\\"true\\\" data-processed=\\\"true\\\">\\u00a0<\\\/span><\\\/span><\\\/span><\\\/p><\\\/blockquote><p>The Holy Qoran for systematic reading as in person and\\\/or in groups. Please use following table\\u00a0<a href=\\\"https:\\\/\\\/t.me\\\/Khatm777_bot?startapp=khatm\\\">The Khatm Table<\\\/a><\\\/p>\",\"post_title\":\"The Holy Quran (Arabic)\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"the-holy-quran-arabic\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-24 11:48:13\",\"post_modified_gmt\":\"2026-09-24 06:48:13\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/the-holy-quran-arabic\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"1\",\"filter\":\"raw\"},{\"ID\":16685,\"post_author\":\"2134\",\"post_date\":\"2026-04-29 11:38:42\",\"post_date_gmt\":\"2026-04-29 06:38:42\",\"post_content\":\"\",\"post_title\":\"\\u041c\\u0430\\u0441\\u0442\\u0435\\u0440\\u043c\\u0430\\u0439\\u043d\\u0434: \\u041a\\u0430\\u043a \\u0441\\u043e\\u0437\\u0434\\u0430\\u0442\\u044c \\u0441\\u0432\\u043e\\u044e \\u043c\\u043e\\u0449\\u044c \\u0441\\u0442\\u0430\\u044e\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"%d0%bc%d0%b0%d1%81%d1%82%d0%b5%d1%80%d0%bc%d0%b0%d0%b9%d0%bd%d0%b4-%d0%ba%d0%b0%d0%ba-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d1%82%d1%8c-%d1%81%d0%b2%d0%be%d1%8e-%d0%bc%d0%be%d1%89%d1%8c-%d1%81%d1%82%d0%b0\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-27 18:09:41\",\"post_modified_gmt\":\"2026-09-27 13:09:41\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/%d0%bc%d0%b0%d1%81%d1%82%d0%b5%d1%80%d0%bc%d0%b0%d0%b9%d0%bd%d0%b4-%d0%ba%d0%b0%d0%ba-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d1%82%d1%8c-%d1%81%d0%b2%d0%be%d1%8e-%d0%bc%d0%be%d1%89%d1%8c-%d1%81%d1%82%d0%b0\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16310,\"post_author\":\"1\",\"post_date\":\"2026-04-08 11:48:32\",\"post_date_gmt\":\"2026-04-08 06:48:32\",\"post_content\":\"\",\"post_title\":\"\\u0413\\u0440\\u0430\\u043d\\u0434-\\u0410\\u0443\\u0434\\u0438\\u0442 \\u041a\\u043e\\u0440\\u043e\\u043b\\u0435\\u0432\\u0441\\u0442\\u0432\\u0430: \\u041f\\u0435\\u0440\\u0435\\u043f\\u0440\\u043e\\u0448\\u0438\\u0432\\u043a\\u0430\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"%d0%b3%d1%80%d0%b0%d0%bd%d0%b4-%d0%b0%d1%83%d0%b4%d0%b8%d1%82-%d0%ba%d0%be%d1%80%d0%be%d0%bb%d0%b5%d0%b2%d1%81%d1%82%d0%b2%d0%b0-%d0%bf%d0%b5%d1%80%d0%b5%d0%bf%d1%80%d0%be%d1%88%d0%b8%d0%b2%d0%ba\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-04-08 11:48:32\",\"post_modified_gmt\":\"2026-04-08 06:48:32\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"http:\\\/\\\/hobbi.st\\\/courses\\\/%d0%b3%d1%80%d0%b0%d0%bd%d0%b4-%d0%b0%d1%83%d0%b4%d0%b8%d1%82-%d0%ba%d0%be%d1%80%d0%be%d0%bb%d0%b5%d0%b2%d1%81%d1%82%d0%b2%d0%b0-%d0%bf%d0%b5%d1%80%d0%b5%d0%bf%d1%80%d0%be%d1%88%d0%b8%d0%b2%d0%ba\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16305,\"post_author\":\"1\",\"post_date\":\"2026-04-08 11:48:31\",\"post_date_gmt\":\"2026-04-08 06:48:31\",\"post_content\":\"\",\"post_title\":\"\\u0424\\u0438\\u043b\\u043e\\u0441\\u043e\\u0444\\u0438\\u044f \\u0421\\u0442\\u043e\\u0438\\u0446\\u0438\\u0437\\u043c\\u0430 \\u0432 \\u0441\\u043e\\u0432\\u0440\\u0435\\u043c\\u0435\\u043d\\u043d\\u043e\\u043c \\u0431\\u044b\\u0442\\u0443\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"%d1%84%d0%b8%d0%bb%d0%be%d1%81%d0%be%d1%84%d0%b8%d1%8f-%d1%81%d1%82%d0%be%d0%b8%d1%86%d0%b8%d0%b7%d0%bc%d0%b0-%d0%b2-%d1%81%d0%be%d0%b2%d1%80%d0%b5%d0%bc%d0%b5%d0%bd%d0%bd%d0%be%d0%bc-%d0%b1%d1%8b\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-04-08 11:48:31\",\"post_modified_gmt\":\"2026-04-08 06:48:31\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"http:\\\/\\\/hobbi.st\\\/courses\\\/%d1%84%d0%b8%d0%bb%d0%be%d1%81%d0%be%d1%84%d0%b8%d1%8f-%d1%81%d1%82%d0%be%d0%b8%d1%86%d0%b8%d0%b7%d0%bc%d0%b0-%d0%b2-%d1%81%d0%be%d0%b2%d1%80%d0%b5%d0%bc%d0%b5%d0%bd%d0%bd%d0%be%d0%bc-%d0%b1%d1%8b\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16301,\"post_author\":\"1\",\"post_date\":\"2026-04-08 11:48:31\",\"post_date_gmt\":\"2026-04-08 06:48:31\",\"post_content\":\"\",\"post_title\":\"\\u0421\\u043c\\u044b\\u0441\\u043b \\u0438 \\u0426\\u0435\\u043d\\u043d\\u043e\\u0441\\u0442\\u0438 (\\u041b\\u043e\\u0433\\u043e\\u0442\\u0435\\u0440\\u0430\\u043f\\u0438\\u044f \\u0424\\u0440\\u0430\\u043d\\u043a\\u043b\\u0430)\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"%d1%81%d0%bc%d1%8b%d1%81%d0%bb-%d0%b8-%d1%86%d0%b5%d0%bd%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%bb%d0%be%d0%b3%d0%be%d1%82%d0%b5%d1%80%d0%b0%d0%bf%d0%b8%d1%8f-%d1%84%d1%80%d0%b0%d0%bd%d0%ba%d0%bb%d0%b0\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-04-08 11:48:31\",\"post_modified_gmt\":\"2026-04-08 06:48:31\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"http:\\\/\\\/hobbi.st\\\/courses\\\/%d1%81%d0%bc%d1%8b%d1%81%d0%bb-%d0%b8-%d1%86%d0%b5%d0%bd%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%bb%d0%be%d0%b3%d0%be%d1%82%d0%b5%d1%80%d0%b0%d0%bf%d0%b8%d1%8f-%d1%84%d1%80%d0%b0%d0%bd%d0%ba%d0%bb%d0%b0\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16297,\"post_author\":\"1\",\"post_date\":\"2026-04-08 11:48:31\",\"post_date_gmt\":\"2026-04-08 06:48:31\",\"post_content\":\"\",\"post_title\":\"\\u0418\\u0441\\u043a\\u0443\\u0441\\u0441\\u0442\\u0432\\u043e \\u042d\\u043c\\u043f\\u0430\\u0442\\u0438\\u0438: \\u041a\\u0430\\u043a \\u043f\\u043e\\u043d\\u0438\\u043c\\u0430\\u0442\\u044c \\u043b\\u044e\\u0434\\u0435\\u0439\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"%d0%b8%d1%81%d0%ba%d1%83%d1%81%d1%81%d1%82%d0%b2%d0%be-%d1%8d%d0%bc%d0%bf%d0%b0%d1%82%d0%b8%d0%b8-%d0%ba%d0%b0%d0%ba-%d0%bf%d0%be%d0%bd%d0%b8%d0%bc%d0%b0%d1%82%d1%8c-%d0%bb%d1%8e%d0%b4%d0%b5%d0%b9\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-04-08 11:48:31\",\"post_modified_gmt\":\"2026-04-08 06:48:31\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"http:\\\/\\\/hobbi.st\\\/courses\\\/%d0%b8%d1%81%d0%ba%d1%83%d1%81%d1%81%d1%82%d0%b2%d0%be-%d1%8d%d0%bc%d0%bf%d0%b0%d1%82%d0%b8%d0%b8-%d0%ba%d0%b0%d0%ba-%d0%bf%d0%be%d0%bd%d0%b8%d0%bc%d0%b0%d1%82%d1%8c-%d0%bb%d1%8e%d0%b4%d0%b5%d0%b9\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16292,\"post_author\":\"1\",\"post_date\":\"2026-04-08 11:48:31\",\"post_date_gmt\":\"2026-04-08 06:48:31\",\"post_content\":\"\",\"post_title\":\"EQ: \\u0423\\u043f\\u0440\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435 \\u0442\\u0440\\u0435\\u0432\\u043e\\u0433\\u043e\\u0439 \\u0438 \\u0433\\u043d\\u0435\\u0432\\u043e\\u043c\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"eq-%d1%83%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d1%82%d1%80%d0%b5%d0%b2%d0%be%d0%b3%d0%be%d0%b9-%d0%b8-%d0%b3%d0%bd%d0%b5%d0%b2%d0%be%d0%bc\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-04-08 11:48:31\",\"post_modified_gmt\":\"2026-04-08 06:48:31\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"http:\\\/\\\/hobbi.st\\\/courses\\\/eq-%d1%83%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d1%82%d1%80%d0%b5%d0%b2%d0%be%d0%b3%d0%be%d0%b9-%d0%b8-%d0%b3%d0%bd%d0%b5%d0%b2%d0%be%d0%bc\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16287,\"post_author\":\"1\",\"post_date\":\"2026-04-08 11:48:31\",\"post_date_gmt\":\"2026-04-08 06:48:31\",\"post_content\":\"\",\"post_title\":\"\\u0413\\u0435\\u0439\\u043c\\u0438\\u0444\\u0438\\u043a\\u0430\\u0446\\u0438\\u044f \\u0440\\u0443\\u0442\\u0438\\u043d\\u044b: \\u0416\\u0438\\u0437\\u043d\\u044c \\u043a\\u0430\\u043a \\u043f\\u0440\\u0438\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u0438\\u0435\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"%d0%b3%d0%b5%d0%b9%d0%bc%d0%b8%d1%84%d0%b8%d0%ba%d0%b0%d1%86%d0%b8%d1%8f-%d1%80%d1%83%d1%82%d0%b8%d0%bd%d1%8b-%d0%b6%d0%b8%d0%b7%d0%bd%d1%8c-%d0%ba%d0%b0%d0%ba-%d0%bf%d1%80%d0%b8%d0%ba%d0%bb%d1%8e\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-04-08 11:48:31\",\"post_modified_gmt\":\"2026-04-08 06:48:31\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"http:\\\/\\\/hobbi.st\\\/courses\\\/%d0%b3%d0%b5%d0%b9%d0%bc%d0%b8%d1%84%d0%b8%d0%ba%d0%b0%d1%86%d0%b8%d1%8f-%d1%80%d1%83%d1%82%d0%b8%d0%bd%d1%8b-%d0%b6%d0%b8%d0%b7%d0%bd%d1%8c-%d0%ba%d0%b0%d0%ba-%d0%bf%d1%80%d0%b8%d0%ba%d0%bb%d1%8e\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16282,\"post_author\":\"1\",\"post_date\":\"2026-04-08 11:48:31\",\"post_date_gmt\":\"2026-04-08 06:48:31\",\"post_content\":\"\",\"post_title\":\"\\u0418\\u0441\\u043a\\u0443\\u0441\\u0441\\u0442\\u0432\\u043e \\u043a\\u0430\\u0447\\u0435\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u043e\\u0433\\u043e \\u043e\\u0442\\u0434\\u044b\\u0445\\u0430\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"%d0%b8%d1%81%d0%ba%d1%83%d1%81%d1%81%d1%82%d0%b2%d0%be-%d0%ba%d0%b0%d1%87%d0%b5%d1%81%d1%82%d0%b2%d0%b5%d0%bd%d0%bd%d0%be%d0%b3%d0%be-%d0%be%d1%82%d0%b4%d1%8b%d1%85%d0%b0\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-04-08 11:48:31\",\"post_modified_gmt\":\"2026-04-08 06:48:31\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"http:\\\/\\\/hobbi.st\\\/courses\\\/%d0%b8%d1%81%d0%ba%d1%83%d1%81%d1%81%d1%82%d0%b2%d0%be-%d0%ba%d0%b0%d1%87%d0%b5%d1%81%d1%82%d0%b2%d0%b5%d0%bd%d0%bd%d0%be%d0%b3%d0%be-%d0%be%d1%82%d0%b4%d1%8b%d1%85%d0%b0\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"}];\n        const programsWithMeta = [{\"ID\":16943,\"post_title\":\"Novark\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16939,\"post_title\":\"\\u0413\\u043b\\u0430\\u0432\\u043d\\u044b\\u0439 \\u0441\\u0435\\u043a\\u0440\\u0435\\u0442 \\u0436\\u0438\\u0437\\u043d\\u0438\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16933,\"post_title\":\"neo nomads\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16898,\"post_title\":\"\\u041a\\u0430\\u043a_\\u0441\\u0442\\u0430\\u0442\\u044c_\\u0441\\u0430\\u043c\\u043e\\u0434\\u043e\\u0441\\u0442\\u0430\\u0442\\u043e\\u0447\\u043d\\u044b\\u043c_\\u0434\\u043e_25_\\u043b\\u0435\\u0442\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16890,\"post_title\":\"\\u0412\\u0441\\u0435\\u0433\\u0434\\u0430_\\u0421\\u0442\\u0440\\u0435\\u043c\\u0438\\u0441\\u044c_\\u0420\\u0410\\u0417\\u0412\\u0418\\u0412\\u0410\\u0422\\u042c\\u0421\\u042f_\\u0423\\u043e\\u0440\\u0440\\u0435\\u043d_\\u0411\\u0430\\u0444\\u0444\\u0435\\u0442\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16885,\"post_title\":\"5\\u043c\\u0438\\u043d\\u0443\\u0442_\\u043d\\u0430_\\u0441\\u043b\\u0435\\u0434\\u0443\\u044e\\u0449\\u0438\\u0435_50\\u043b\\u0435\\u0442_\\u0442\\u0432\\u043e\\u0435\\u0439_\\u0436\\u0438\\u0437\\u043d\\u0438\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16314,\"post_title\":\"Ozgeris Uztazy: \\u0418\\u0441\\u043a\\u0443\\u0441\\u0441\\u0442\\u0432\\u043e \\u041a\\u043e\\u0443\\u0447\\u0438\\u043d\\u0433\\u0430\",\"pillar\":\"wisdom\",\"area\":\"mindfulness\"},{\"ID\":16876,\"post_title\":\"hobbist digital nomad way\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16871,\"post_title\":\"hobbist_ \\u041f\\u0443\\u0442\\u044c \\u0426\\u0438\\u0444\\u0440\\u043e\\u0432\\u043e\\u0433\\u043e \\u041a\\u043e\\u0447\\u0435\\u0432\\u043d\\u0438\\u043a\\u0430\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16868,\"post_title\":\"\\u0413\\u0435\\u043d\\u0440\\u0438_\\u0424\\u043e\\u0440\\u0434 \\u2013 \\u0417\\u043e\\u043b\\u043e\\u0442\\u044b\\u0435_\\u0443\\u0440\\u043e\\u043a\\u0438_\\u0431\\u043e\\u0433\\u0430\\u0442\\u0441\\u0442\\u0432\\u0430\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16844,\"post_title\":\"Super motivation\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":15257,\"post_title\":\"The Holy Quran (Arabic)\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16685,\"post_title\":\"\\u041c\\u0430\\u0441\\u0442\\u0435\\u0440\\u043c\\u0430\\u0439\\u043d\\u0434: \\u041a\\u0430\\u043a \\u0441\\u043e\\u0437\\u0434\\u0430\\u0442\\u044c \\u0441\\u0432\\u043e\\u044e \\u043c\\u043e\\u0449\\u044c \\u0441\\u0442\\u0430\\u044e\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16310,\"post_title\":\"\\u0413\\u0440\\u0430\\u043d\\u0434-\\u0410\\u0443\\u0434\\u0438\\u0442 \\u041a\\u043e\\u0440\\u043e\\u043b\\u0435\\u0432\\u0441\\u0442\\u0432\\u0430: \\u041f\\u0435\\u0440\\u0435\\u043f\\u0440\\u043e\\u0448\\u0438\\u0432\\u043a\\u0430\",\"pillar\":\"wisdom\",\"area\":\"mindfulness\"},{\"ID\":16305,\"post_title\":\"\\u0424\\u0438\\u043b\\u043e\\u0441\\u043e\\u0444\\u0438\\u044f \\u0421\\u0442\\u043e\\u0438\\u0446\\u0438\\u0437\\u043c\\u0430 \\u0432 \\u0441\\u043e\\u0432\\u0440\\u0435\\u043c\\u0435\\u043d\\u043d\\u043e\\u043c \\u0431\\u044b\\u0442\\u0443\",\"pillar\":\"balance\",\"area\":\"spirituality\"},{\"ID\":16301,\"post_title\":\"\\u0421\\u043c\\u044b\\u0441\\u043b \\u0438 \\u0426\\u0435\\u043d\\u043d\\u043e\\u0441\\u0442\\u0438 (\\u041b\\u043e\\u0433\\u043e\\u0442\\u0435\\u0440\\u0430\\u043f\\u0438\\u044f \\u0424\\u0440\\u0430\\u043d\\u043a\\u043b\\u0430)\",\"pillar\":\"balance\",\"area\":\"spirituality\"},{\"ID\":16297,\"post_title\":\"\\u0418\\u0441\\u043a\\u0443\\u0441\\u0441\\u0442\\u0432\\u043e \\u042d\\u043c\\u043f\\u0430\\u0442\\u0438\\u0438: \\u041a\\u0430\\u043a \\u043f\\u043e\\u043d\\u0438\\u043c\\u0430\\u0442\\u044c \\u043b\\u044e\\u0434\\u0435\\u0439\",\"pillar\":\"balance\",\"area\":\"emotions\"},{\"ID\":16292,\"post_title\":\"EQ: \\u0423\\u043f\\u0440\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435 \\u0442\\u0440\\u0435\\u0432\\u043e\\u0433\\u043e\\u0439 \\u0438 \\u0433\\u043d\\u0435\\u0432\\u043e\\u043c\",\"pillar\":\"balance\",\"area\":\"emotions\"},{\"ID\":16287,\"post_title\":\"\\u0413\\u0435\\u0439\\u043c\\u0438\\u0444\\u0438\\u043a\\u0430\\u0446\\u0438\\u044f \\u0440\\u0443\\u0442\\u0438\\u043d\\u044b: \\u0416\\u0438\\u0437\\u043d\\u044c \\u043a\\u0430\\u043a \\u043f\\u0440\\u0438\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u0438\\u0435\",\"pillar\":\"balance\",\"area\":\"rest\"},{\"ID\":16282,\"post_title\":\"\\u0418\\u0441\\u043a\\u0443\\u0441\\u0441\\u0442\\u0432\\u043e \\u043a\\u0430\\u0447\\u0435\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u043e\\u0433\\u043e \\u043e\\u0442\\u0434\\u044b\\u0445\\u0430\",\"pillar\":\"balance\",\"area\":\"rest\"}];\n\n        let tg = window.Telegram ? window.Telegram.WebApp : null;\n        \/\/ Logic moved to top priority startup script\n\n        const questions = [\n            { pillar: 'wisdom', sphere: 'mindfulness', text: 'I regularly practice meditation or find time for silence and reflection.' },\n            { pillar: 'wisdom', sphere: 'mindfulness', text: 'I easily track my thoughts, emotions and do not panic under stress.' },\n            { pillar: 'wisdom', sphere: 'intellect', text: 'I regularly learn new concepts and read educational literature.' },\n            { pillar: 'wisdom', sphere: 'intellect', text: 'I easily analyze complex information and find non-obvious connections.' },\n            { pillar: 'wisdom', sphere: 'skills', text: 'I systematically improve my professional skills.' },\n            { pillar: 'wisdom', sphere: 'skills', text: 'My current qualifications are highly rated in the job market.', text_youth: 'The skills I am learning now will be highly demanded in the future job market.' },\n            { pillar: 'wisdom', sphere: 'leadership', text: 'I am not afraid to take responsibility for the team and important decisions.' },\n            { pillar: 'wisdom', sphere: 'leadership', text: 'People often come to me for advice and are ready to follow me.' },\n            { pillar: 'wisdom', sphere: 'creativity', text: 'There is a place in my life for creative hobbies and creation.' },\n            { pillar: 'wisdom', sphere: 'creativity', text: 'I know how to think outside the box and find creative solutions.' },\n            { pillar: 'wisdom', sphere: 'vision', text: 'I have clear SMART goals written down for the next 1-3 years.' },\n            { pillar: 'wisdom', sphere: 'vision', text: 'I understand my life purpose and move towards a global vision.' },\n            { pillar: 'strength', sphere: 'health', text: 'I regularly undergo medical check-ups and monitor my health indicators.' },\n            { pillar: 'strength', sphere: 'health', text: 'I have strong immunity, rarely get sick and recover quickly.' },\n            { pillar: 'strength', sphere: 'energy', text: 'I wake up cheerful and full of energy without stimulants.' },\n            { pillar: 'strength', sphere: 'energy', text: 'My energy lasts until the evening, I have no severe slumps.' },\n            { pillar: 'strength', sphere: 'appearance', text: 'I am 100% satisfied with my appearance, wardrobe and personal care.' },\n            { pillar: 'strength', sphere: 'appearance', text: 'My appearance gives me confidence in meetings and in society.' },\n            { pillar: 'strength', sphere: 'discipline', text: 'I easily complete what I planned, even if I have no motivation.' },\n            { pillar: 'strength', sphere: 'discipline', text: 'I know how to deny myself momentary pleasures for the sake of big goals.' },\n            { pillar: 'strength', sphere: 'fitness', text: 'I engage in physical training at least 3 times a week.' },\n            { pillar: 'strength', sphere: 'fitness', text: 'My physical endurance, strength and flexibility completely satisfy me.' },\n            { pillar: 'strength', sphere: 'nutrition', text: 'I monitor the quality of my food (macros) and drink enough clean water.' },\n            { pillar: 'strength', sphere: 'nutrition', text: 'I sleep 7-8 hours every day following a schedule.' },\n            { pillar: 'wealth', sphere: 'income', text: 'My current active income fully covers my needs and desires.', text_youth: 'My pocket money, scholarship, or part-time income covers my basic needs.' },\n            { pillar: 'wealth', sphere: 'income', text: 'I know exactly what actions will increase my income this year.' },\n            { pillar: 'wealth', sphere: 'investments', text: 'I understand how basic financial instruments work (stocks, crypto).' },\n            { pillar: 'wealth', sphere: 'investments', text: 'I regularly invest a portion of my income every month.' },\n            { pillar: 'wealth', sphere: 'assets', text: 'I already have assets (real estate, portfolio) that generate passive income.', text_youth: 'I am actively building my first assets (savings, an audience, small projects) for the future.' },\n            { pillar: 'wealth', sphere: 'assets', text: 'I systematically work on creating new independent income streams.' },\n            { pillar: 'wealth', sphere: 'savings', text: 'I keep strict records of my income and expenses.' },\n            { pillar: 'wealth', sphere: 'savings', text: 'I have an emergency fund for at least 6 months.', text_youth: 'I try to save money and always keep a small financial cushion.' },\n            { pillar: 'wealth', sphere: 'business', text: 'I am successfully developing my own business projects or startups.', text_youth: 'I actively participate in student projects, volunteering, or test my first business ideas.' },\n            { pillar: 'wealth', sphere: 'business', text: 'I understand how to attract clients, scale and delegate.' },\n            { pillar: 'wealth', sphere: 'career', text: 'I am satisfied with the pace of my growth in the company\/industry.', text_youth: 'I am satisfied with my academic progress and first career steps (internships\/freelance).' },\n            { pillar: 'wealth', sphere: 'career', text: 'I have a clear plan for moving up the career ladder.' },\n            { pillar: 'balance', sphere: 'family', text: 'I have warm, trusting relationships with my parents and relatives.' },\n            { pillar: 'balance', sphere: 'family', text: 'I regularly find time for quality communication with my family.' },\n            { pillar: 'balance', sphere: 'love', text: 'Harmony and honesty reign in my romantic relationships.' },\n            { pillar: 'balance', sphere: 'love', text: 'I know how to resolve conflicts ecologically and establish personal boundaries.' },\n            { pillar: 'balance', sphere: 'friends', text: 'I have a strong networking environment that pulls me up.' },\n            { pillar: 'balance', sphere: 'friends', text: 'I regularly meet new people and maintain old connections.' },\n            { pillar: 'balance', sphere: 'rest', text: 'My life is full of bright events, travel and impressions.' },\n            { pillar: 'balance', sphere: 'rest', text: 'I know how to completely disconnect from work during my rest.' },\n            { pillar: 'balance', sphere: 'emotions', text: 'I understand other people\\'s feelings well and know how to show empathy.' },\n            { pillar: 'balance', sphere: 'emotions', text: 'I am hard to provoke into aggression, I keep my emotions under control.' },\n            { pillar: 'balance', sphere: 'spirituality', text: 'I feel an inner meaning and am at peace with myself.' },\n            { pillar: 'balance', sphere: 'spirituality', text: 'I regularly practice spirituality (religion, philosophy, unity with nature).' }\n        ];\n\n        let currentIdx = 0; let userAnswers = new Array(48).fill(null); let finalScores = {}; let selectedFocus = []; let activeViewId = 'view-intro';\n        let isYouth = false;\n\n        async function fetchGamiPressPoints(typeSlug) {\n            if (!gpUserId || !gpAjaxUrl) return null;\n            const formData = new URLSearchParams(); formData.append('action', 'get_gamipress_data'); formData.append('nonce', gpNonce); formData.append('user_id', gpUserId); formData.append('points_type', typeSlug);\n            try { const resp = await fetch(gpAjaxUrl, { method: 'POST', body: formData }); const res = await resp.json(); return res.success ? res.data.points : null; } catch(e) { return null; }\n        }\n\n        async function updateHeaderResources() {\n            const coins = await fetchGamiPressPoints('hobbist_coins');\n            if (coins !== null) {\n                const formattedCoins = formatPointsBalance(coins);\n                document.getElementById('ozgCoinsValue').innerText = formattedCoins;\n            }\n\n            try {\n                const resp = await fetch(`${apiBase}\/gamipress\/points`, {\n                    headers: { 'X-WP-Nonce': nonce }\n                });\n                const data = await resp.json();\n                if (data.success) {\n                    document.getElementById('ozgAchievementsValue').innerText = data.achievements;\n                    if (data.coins_formatted) {\n                        document.getElementById('ozgCoinsValue').innerText = data.coins_formatted;\n                    }\n                }\n            } catch(e) { console.error('Failed to fetch achievements:', e); }\n\n            const rank = await fetchGamiPressPoints('rank_points');\n            if (rank !== null) document.getElementById('ozgRankValue').innerText = rank;\n\n            document.getElementById('ozgTrophyValue').innerText = '1,000,000';\n            document.getElementById('ozgEnergyValue').innerText = '';\n        }\n\n        function formatPointsBalance(points) {\n            if (points >= 1000000) {\n                return (points \/ 1000000).toFixed(1) + 'm';\n            } else if (points >= 1000) {\n                return (points \/ 1000).toFixed(1) + 'k';\n            }\n            return points.toString();\n        }\n\n        function showHeaderToast(msg) { const toast = document.getElementById('ozgHeaderToast'); toast.innerText = msg; toast.style.opacity = '1'; setTimeout(() => { toast.style.opacity = '0'; }, 3000); }\n\n        \/\/ ==========================================\n        \/\/ STICKY FILTER FUNCTIONS\n        \/\/ ==========================================\n\n        let trackFilterSticky = document.getElementById('ozgTrackFilterSticky');\n        let coachFilterSticky = document.getElementById('ozgCoachFilterSticky');\n        let feedHeader = document.getElementById('ozgStickyFeedHeader');\n        let headerPanel = document.getElementById('ozgHeaderPanel');\n        let lastScrollPos = 0;\n        let socialButtonsShown = false;\n\n        function updateStickyFilters() {\n            const activeTab = document.querySelector('.ozg-section.active')?.id || '';\n            const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n            const triggerPoint = 60;\n\n            \/\/ Social buttons\n            const floatingBar = document.querySelector('.ozg-floating-bar');\n            if (floatingBar && !socialButtonsShown && scrollTop > 50) {\n                socialButtonsShown = true;\n                document.querySelectorAll('.ozg-fab-wrapper').forEach(wrapper => {\n                    wrapper.classList.add('visible');\n                });\n            }\n\n            if (activeTab === 'my-track' && trackFilterSticky) {\n                if (scrollTop <= triggerPoint) {\n                    trackFilterSticky.classList.remove('sticky-hidden');\n                    trackFilterSticky.classList.add('visible');\n                } else if (isScrollingDown && scrollTop > triggerPoint) {\n                    trackFilterSticky.classList.add('sticky-hidden');\n                } else if (!isScrollingDown && scrollTop > triggerPoint) {\n                    trackFilterSticky.classList.remove('sticky-hidden');\n                }\n            }\n\n            lastScrollPos = Math.max(0, scrollTop);\n        }\n\n        function syncStickyFilters() {\n            if (trackFilterSticky && trackFilterSticky.classList.contains('visible')) {\n                const originalPillar = document.querySelector('#my-track #filterPillar');\n                const stickyPillar = document.querySelector('#ozgTrackFilterSticky #filterPillarSticky');\n                if (originalPillar && stickyPillar && stickyPillar.value !== originalPillar.value) {\n                    stickyPillar.value = originalPillar.value;\n                    if (typeof filterByPillarSticky === 'function') filterByPillarSticky();\n                }\n            }\n            if (coachFilterSticky && coachFilterSticky.classList.contains('visible')) {\n                const originalPillar = document.querySelector('#coach #coachFilterPillar');\n                const stickyPillar = document.querySelector('#ozgCoachFilterSticky #coachFilterPillarSticky');\n                if (originalPillar && stickyPillar && stickyPillar.value !== originalPillar.value) {\n                    stickyPillar.value = originalPillar.value;\n                    if (typeof coachFilterByPillarSticky === 'function') coachFilterByPillarSticky();\n                }\n            }\n        }\n\n        function initStickyFiltersData() {\n            const pillar = document.querySelector('#my-track #filterPillar')?.value;\n            const areaSelect = document.querySelector('#my-track #filterArea');\n            if (pillar && kingdomStruct[pillar] && areaSelect) {\n                areaSelect.innerHTML = '<option value=\"\">All Spheres<\/option>';\n                for (let a in kingdomStruct[pillar].areas) {\n                    areaSelect.innerHTML += `<option value=\"${a}\">${kingdomStruct[pillar].areas[a]}<\/option>`;\n                }\n            }\n            const coachPillar = document.querySelector('#coach #coachFilterPillar')?.value;\n            const coachAreaSelect = document.querySelector('#coach #coachFilterArea');\n            if (coachPillar && kingdomStruct[coachPillar] && coachAreaSelect) {\n                coachAreaSelect.innerHTML = '<option value=\"\">All Spheres<\/option>';\n                for (let a in kingdomStruct[coachPillar].areas) {\n                    coachAreaSelect.innerHTML += `<option value=\"${a}\">${kingdomStruct[coachPillar].areas[a]}<\/option>`;\n                }\n            }\n            syncStickyFilters();\n        }\n\n        function filterByPillarSticky() {\n            const stickyPillar = document.querySelector('#ozgTrackFilterSticky #filterPillarSticky');\n            const originalPillar = document.querySelector('#my-track #filterPillar');\n            if (originalPillar && stickyPillar) {\n                originalPillar.value = stickyPillar.value;\n                filterByPillar();\n            }\n        }\n\n        function filterByAreaSticky() {\n            const stickyArea = document.querySelector('#ozgTrackFilterSticky #filterAreaSticky');\n            const originalArea = document.querySelector('#my-track #filterArea');\n            if (originalArea && stickyArea) {\n                originalArea.value = stickyArea.value;\n                filterByArea();\n            }\n        }\n\n        function clearFiltersSticky() {\n            const originalBtn = document.querySelector('#my-track .filter-bar .ozg-btn-sec');\n            if (originalBtn && typeof clearFilters === 'function') originalBtn.click();\n        }\n\n        function coachFilterByPillarSticky() {\n            const stickyPillar = document.querySelector('#ozgCoachFilterSticky #coachFilterPillarSticky');\n            const originalPillar = document.querySelector('#coach #coachFilterPillar');\n            if (originalPillar && stickyPillar) {\n                originalPillar.value = stickyPillar.value;\n                coachFilterByPillar();\n            }\n        }\n\n        function coachFilterByAreaSticky() {\n            const stickyArea = document.querySelector('#ozgCoachFilterSticky #coachFilterAreaSticky');\n            const originalArea = document.querySelector('#coach #coachFilterArea');\n            if (originalArea && stickyArea) {\n                originalArea.value = stickyArea.value;\n                coachFilterByArea();\n            }\n        }\n\n        function coachClearFiltersSticky() {\n            const originalBtn = document.querySelector('#coach .filter-bar .ozg-btn-sec');\n            if (originalBtn && typeof coachClearFilters === 'function') originalBtn.click();\n        }\n\n        function initSmartHeaderScroll() {\n            let lastScrollTop = 0;\n            let scrollStopTimeout = null;\n\n            function handleScroll() {\n                const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n                const isScrollingDown = scrollTop > lastScrollTop;\n                const triggerPoint = 80;\n\n                \/\/ Sync and other sticky filters\n                updateStickyFilters();\n                syncStickyFilters();\n\n                \/\/ UNISON HIDE: Hide both headers immediately on any scroll\n                if (headerPanel && scrollTop > triggerPoint) {\n                    headerPanel.classList.add('ozg-header-hidden');\n                }\n                if (feedHeader) {\n                    feedHeader.classList.add('feed-hidden');\n                }\n\n                \/\/ Clear previous timeout\n                if (scrollStopTimeout) clearTimeout(scrollStopTimeout);\n\n                \/\/ UNISON SHOW: Show both headers only after scrolling stops\n                scrollStopTimeout = setTimeout(() => {\n                    const finalTop = window.pageYOffset || document.documentElement.scrollTop || 0;\n\n                    \/\/ Show Main Header\n                    if (headerPanel) {\n                        headerPanel.classList.remove('ozg-header-hidden');\n                    }\n\n                    \/\/ Show Feed Header (only if in Kingdom tab)\n                    const isKingdomActive = document.getElementById('kingdom')?.classList.contains('active');\n                    if (feedHeader && isKingdomActive) {\n                        feedHeader.classList.remove('feed-hidden');\n                        \/\/ Position check\n                        const isMainHeaderHidden = headerPanel.classList.contains('ozg-header-hidden');\n                        feedHeader.style.top = (isMainHeaderHidden || finalTop <= 10) ? '0px' : '65px';\n                        if (finalTop <= 10) feedHeader.style.top = '65px';\n                    }\n                }, 400); \/\/ Wait 400ms after stop\n\n                lastScrollTop = Math.max(0, scrollTop);\n            }\n            let _sRaf = null;\n            window.addEventListener('scroll', () => {\n                if(_sRaf) return;\n                _sRaf = requestAnimationFrame(() => { handleScroll(); _sRaf = null; });\n            }, { passive: true });\n        }\n                document.addEventListener('DOMContentLoaded', () => {\n            if (window.self !== window.top) return;\n            const savedTheme = localStorage.getItem('ozg_theme') || 'classic'; ozgApplyTheme(savedTheme);\n            const savedAgeGroup = localStorage.getItem('ozg_age_group'); if (savedAgeGroup === 'youth') isYouth = true;\n            updateHeaderResources();\n            ozgInitDashboardClickInterceptor();\n            const cachedAnswers = localStorage.getItem('ozg_quiz_answers');\n            if (cachedAnswers) { userAnswers = JSON.parse(cachedAnswers); currentIdx = userAnswers.findIndex(a => a === null); if (currentIdx === -1) currentIdx = 47; }\n            if (dbQuizScores && Object.keys(dbQuizScores).length > 0) {\n                finalScores = dbQuizScores;\n                if (dbFocusAreas && dbFocusAreas.length === 8) { selectedFocus = dbFocusAreas; showView('view-result'); renderFinalResult(); }\n                else { selectedFocus = Array.isArray(dbFocusAreas) ? dbFocusAreas : []; showView('view-select'); renderSelectionGrid(); }\n            } else {\n                if (currentIdx > 0) { showView('view-quiz'); renderQuestion(); } else { showView('view-intro'); }\n            }\n\n            \/\/ Priority: Always open on Kingdom tab for a unified initial experience\n            let savedTab = 'kingdom';\n\n            setTimeout(() => {\n                ozgSwitchTab(savedTab);\n            }, 50);\n            if (document.getElementById('my-track').classList.contains('active')) loadCohortActivities();\n            if (document.getElementById('journal').classList.contains('active')) { loadHabitTracker('daily'); loadJournalEntries(); }\n            if (document.getElementById('coach') && document.getElementById('coach').classList.contains('active')) loadCoachPrograms();\n            initUserSearch('subCoachSearch', 'subCoachResults', 'selectedSubCoachId');\n            initUserSearch('buddySearchInput', 'buddySearchResults', 'selectedBuddyId');\n            initUserSearch('addQuestCoachSearch', 'addQuestCoachResults', 'selectedAddQuestCoachId');\n            initUserSearch('changeCoachSearch', 'changeCoachResults', 'selectedCoachId');\n            initUserSearch('changeBossSearch', 'changeBossResults', 'selectedBossId');\n            initUserSearch('changeBuddySearch', 'changeBuddyResults', 'selectedProgBuddyId');\n\n            initLinkPrefetcher();\n            initStickyFiltersData();\n            initSmartHeaderScroll();\n            if (document.getElementById('kingdom')?.classList.contains('active')) {\n                const _kfh = document.getElementById('ozgStickyFeedHeader');\n                if (_kfh) _kfh.style.display = 'block';\n            }\n\n            const draggableFooter = document.getElementById('draggableFooter');\n            const footerMenuToggle = document.getElementById('footerMenuToggle');\n            const leftFooterArea = document.getElementById('leftFooterArea');\n            let isDragging = false; let initialX; let initialY; let xOffset = 0; let yOffset = 0;\n            if (draggableFooter) {\n                draggableFooter.addEventListener(\"mousedown\", dragStart);\n                draggableFooter.addEventListener(\"mouseup\", dragEnd);\n                draggableFooter.addEventListener(\"mousemove\", drag);\n                draggableFooter.addEventListener(\"touchstart\", dragStart);\n                draggableFooter.addEventListener(\"touchend\", dragEnd);\n                draggableFooter.addEventListener(\"touchmove\", drag);\n            }\n            function dragStart(e) {\n                const target = e.target.closest('a, button');\n                if (target) { isDragging = false; return; }\n                const dragSource = e.target.closest('.bottom-info-bar, .left-column-footer.is-active');\n                if (!dragSource) { isDragging = false; return; }\n                initialX = e.clientX || e.touches[0].clientX;\n                initialY = e.clientY || e.touches[0].clientY;\n                const rect = draggableFooter.getBoundingClientRect();\n                xOffset = initialX - rect.left;\n                yOffset = initialY - rect.top;\n                isDragging = true;\n                draggableFooter.style.cursor = 'grabbing';\n            }\n            function dragEnd(e) { isDragging = false; if(draggableFooter) draggableFooter.style.cursor = 'grab'; }\n            function drag(e) {\n                if (!isDragging) return;\n                e.preventDefault();\n                let currentX = e.clientX || e.touches[0].clientX;\n                let currentY = e.clientY || e.touches[0].clientY;\n                let newX = currentX - xOffset;\n                let newY = currentY - yOffset;\n                newX = Math.max(0, Math.min(newX, window.innerWidth - draggableFooter.offsetWidth));\n                newY = Math.max(0, Math.min(newY, window.innerHeight - draggableFooter.offsetHeight));\n                draggableFooter.style.left = `${newX}px`;\n                draggableFooter.style.top = `${newY}px`;\n                draggableFooter.style.right = 'auto';\n                draggableFooter.style.bottom = 'auto';\n                draggableFooter.style.transform = 'none';\n            }\n            if (footerMenuToggle && leftFooterArea) {\n                footerMenuToggle.addEventListener('click', (event) => {\n                    event.preventDefault();\n                    draggableFooter.style.left = '50%';\n                    draggableFooter.style.top = 'auto';\n                    draggableFooter.style.right = 'auto';\n                    draggableFooter.style.bottom = '0';\n                    draggableFooter.style.transform = 'translateX(-50%)';\n                    leftFooterArea.classList.toggle('is-active');\n                });\n            }\n            const headerToggleBtn = document.getElementById('ozgHeaderMenuToggle');\n            if (headerToggleBtn) {\n                headerToggleBtn.addEventListener('click', (e) => {\n                    if (ozgI18n.isGuest) {\n                        e.preventDefault();\n                        return ozgShowSignUpPrompt();\n                    }\n                    e.preventDefault();\n                    const expanded = document.getElementById('ozgHeaderExpanded');\n                    if (expanded.style.display === 'none') {\n                        expanded.style.display = 'flex';\n                        headerToggleBtn.innerHTML = '<i data-lucide=\"x\"><\/i>';\n                    } else {\n                        expanded.style.display = 'none';\n                        headerToggleBtn.innerHTML = '<i data-lucide=\"menu\"><\/i>';\n                    }\n                    lucide.createIcons();\n                });\n            }\n            const newsBtn = document.getElementById('ozgNewsButton');\n            if (newsBtn) {\n                newsBtn.addEventListener('click', (e) => {\n                    if (ozgI18n.isGuest) {\n                        e.preventDefault();\n                        return ozgShowSignUpPrompt();\n                    }\n                    if (window.location.href.includes('\/activity')) {\n                        e.preventDefault();\n                        showHeaderToast('\u0412\u044b \u0443\u0436\u0435 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u041d\u043e\u0432\u043e\u0441\u0442\u0435\u0439.');\n                    }\n                });\n            }\n            document.querySelectorAll('[data-elementor-popup-id]').forEach(el => {\n                el.addEventListener('click', (e) => {\n                    const popupId = el.getAttribute('data-elementor-popup-id');\n                    \/\/ Exception for Trophy Button\n                    if (ozgI18n.isGuest && popupId !== '15938' && popupId !== '11000') {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        return ozgShowSignUpPrompt();\n                    }\n                    e.preventDefault();\n                    if (typeof elementorFrontend !== 'undefined' && elementorFrontend.documentsManager) {\n                        const popup = elementorFrontend.documentsManager.documents[popupId];\n                        if (popup) popup.showModal();\n                    }\n                });\n            });\n        });\n\n        function ozgChangeTheme(theme) { localStorage.setItem('ozg_theme', theme); ozgApplyTheme(theme); }\n        function ozgApplyTheme(theme) {\n            const sidebar = document.getElementById('ozgDesktopSidebar');\n            const mobNav = document.getElementById('ozgMobileNav');\n            const gamerPanel = document.getElementById('draggableFooter');\n            const mainLayout = document.querySelector('.ozg-layout');\n            const selectEl = document.getElementById('ozgThemeSelect');\n            if (selectEl) selectEl.value = theme;\n            if (theme === 'gamer') {\n                if(sidebar) sidebar.style.display = 'none';\n                if(mobNav) mobNav.style.display = 'none';\n                if(gamerPanel) gamerPanel.style.display = 'flex';\n                if(mainLayout) mainLayout.style.gridTemplateColumns = '1fr';\n            } else {\n                if(sidebar) sidebar.style.display = window.innerWidth > 900 ? 'flex' : 'none';\n                if(mobNav) mobNav.style.display = window.innerWidth > 900 ? 'none' : 'flex';\n                if(gamerPanel) gamerPanel.style.display = 'none';\n                if(mainLayout) mainLayout.style.gridTemplateColumns = window.innerWidth > 900 ? '280px 1fr' : '1fr';\n            }\n        }\n        window.addEventListener('resize', () => { const currentTheme = localStorage.getItem('ozg_theme') || 'classic'; ozgApplyTheme(currentTheme); });\n\n        function initUserSearch(inputId, resultsId, hiddenId) {\n            const input = document.getElementById(inputId); if (!input) return; let timeout;\n            input.addEventListener('input', function() {\n                clearTimeout(timeout);\n                const search = this.value.trim();\n                if (search.length < 2) { document.getElementById(resultsId).innerHTML = ''; return; }\n                timeout = setTimeout(async () => {\n                    try {\n                        const resp = await fetch(`${apiBase}\/users\/search?q=${encodeURIComponent(search)}`, { headers: {'X-WP-Nonce': nonce} });\n                        const users = await resp.json();\n                        const container = document.getElementById(resultsId);\n                        if (users.length === 0) { container.innerHTML = `<div class=\"user-search-item\">${ozgI18n.notFound}<\/div>`; return; }\n                        container.innerHTML = users.map(u => `<div class=\"user-search-item\" onclick=\"selectUser('${u.id}', '${escapeHtml(u.name)}', '${hiddenId}', '${resultsId}')\"><div class=\"user-info\"><div class=\"user-name\">${escapeHtml(u.name)}<\/div><div class=\"user-role\">${escapeHtml(u.email)}<\/div><\/div><\/div>`).join('');\n                    } catch (e) { console.error(ozgI18n.errorConnection, e); }\n                }, 300);\n            });\n        }\n\n        function selectUser(id, name, hiddenId, resultsId) {\n            document.getElementById(hiddenId).value = id;\n            document.getElementById(resultsId).innerHTML = `<div class=\"user-search-item selected\">\u2705 ${ozgI18n.selected} ${name}<\/div>`;\n        }\n\n        function ozgShowSignUpPrompt() {\n            ozgCloseAllModals();\n            document.getElementById('ozgSignUpPrompt').classList.add('show');\n            lucide.createIcons();\n            return false;\n        }\n\n        function ozgSwitchTab(tabId, userId = null) {\n            if (ozgI18n.isGuest && tabId !== 'kingdom') {\n                return ozgShowSignUpPrompt();\n            }\n            document.querySelectorAll('.ozg-section').forEach(s => s.classList.remove('active'));\n            const targetSec = document.getElementById(tabId);\n            if (targetSec) targetSec.classList.add('active');\n            document.querySelectorAll('.ozg-nav-link, .ozg-mob-item').forEach(l => l.classList.remove('active'));\n\n            const btnId = 'tab-btn-' + tabId;\n            const mBtnId = 'mtab-btn-' + tabId;\n            if (document.getElementById(btnId)) document.getElementById(btnId).classList.add('active');\n            if (document.getElementById(mBtnId)) document.getElementById(mBtnId).classList.add('active');\n\n            const leftFooterArea = document.getElementById('leftFooterArea');\n            if(leftFooterArea && leftFooterArea.classList.contains('is-active')) leftFooterArea.classList.remove('is-active');\n\n            toggleGlobalSaveBtn(false); \/\/ legacy audit is hidden now\n\n            \/\/ Show\/Hide Creation Bar\n            const creationBar = document.getElementById('ozgCreationBar');\n            if (creationBar) {\n                if (tabId === 'coach') { creationBar.classList.add('visible'); ozgUpdateCreationBarBottom(); }\n                else creationBar.classList.remove('visible');\n            }\n\n            if (tabId !== 'profile') localStorage.setItem('ozgActiveTab', tabId);\n            window.scrollTo(0, 0);\n\n            if (tabId === 'kingdom') {\n                const _kfh = document.getElementById('ozgStickyFeedHeader');\n                if (_kfh) _kfh.style.display = 'block';\n                if (typeof renoOnShow === 'function') renoOnShow();\n            }\n            if (tabId === 'profile') {\n                loadUserProfile(userId || EXPECTED_USER_ID);\n            }\n            if (tabId === 'my-track') loadCohortActivities();\n            if (tabId === 'journal') { loadHabitTracker('daily'); loadJournalEntries(); }\n            if (tabId === 'coach') loadCoachPrograms();\n\n            setTimeout(() => {\n                updateStickyFilters();\n                syncStickyFilters();\n                initStickyFiltersData();\n            }, 150);\n        }\n\n        async function loadNotifications() {\n            const container = document.getElementById('ozgNotificationsList');\n            if (!container) return;\n\n            container.innerHTML = '<div style=\"text-align:center; padding: 40px;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; color:var(--accent-cyan);\"><\/i><\/div>';\n            lucide.createIcons();\n\n            try {\n                \/\/ Fetch enroll requests (stored on user meta)\n                const resp = await fetch(`${apiBase}\/user\/profile\/${EXPECTED_USER_ID}`, { headers: {'X-WP-Nonce': nonce} });\n                const data = await resp.json();\n\n                \/\/ For now, we consolidate requests as notifications\n                let html = '';\n\n                \/\/ Enrollment requests (from connections logic)\n                const enrollReqs = [];\n                const teamReqs   = [];\n\n                const pendingEnroll = Object.values(enrollReqs).filter(r => r.status === 'pending');\n                const pendingTeam   = teamReqs; \/\/ these are already filtered in PHP for pending\n\n                if (pendingEnroll.length === 0 && pendingTeam.length === 0) {\n                    container.innerHTML = `<div style=\"text-align:center; padding: 40px; color: var(--text-muted);\">\n                        <i data-lucide=\"bell\" style=\"width: 48px; height: 48px; opacity: 0.3; margin-bottom: 16px;\"><\/i>\n                        <p>No new notifications.<\/p>\n                    <\/div>`;\n                    lucide.createIcons();\n                    return;\n                }\n\n                pendingEnroll.forEach(req => {\n                    html += `\n                        <div style=\"background:rgba(234,179,8,0.07); border:1px solid rgba(234,179,8,0.3); border-radius:16px; padding:16px; margin-bottom:12px; display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:12px;\">\n                            <div>\n                                <div style=\"color:#fff; font-weight:600; font-size:1rem;\">${escapeHtml(req.coach_name)}<\/div>\n                                <div style=\"color:var(--text-muted); font-size:0.85rem; margin-top:2px;\">Invites you to course: <strong style=\"color:#fff;\">${escapeHtml(req.program)}<\/strong><\/div>\n                                <div style=\"color:var(--text-muted); font-size:0.7rem; margin-top:4px;\">${req.sent_at}<\/div>\n                            <\/div>\n                            <div style=\"display:flex; gap:8px;\">\n                                <button class=\"ozg-btn\" style=\"padding:8px 16px; font-size:0.85rem;\" onclick=\"ozgRespondEnrollRequest('${req.id}', 'accept', this.closest('div.ozg-profile-subtab-content'))\">Accept<\/button>\n                                <button class=\"ozg-btn-sec\" style=\"padding:8px 16px; font-size:0.85rem;\" onclick=\"ozgRespondEnrollRequest('${req.id}', 'decline', this.closest('div.ozg-profile-subtab-content'))\">Decline<\/button>\n                            <\/div>\n                        <\/div>`;\n                });\n\n                pendingTeam.forEach(req => {\n                    let rLabel = '';\n                    if (req.role === 'coach') rLabel = 'Coach';\n                    else if (req.role === 'boss') rLabel = 'Boss';\n                    else if (req.role === 'program_buddy') rLabel = 'Quest Buddy';\n                    else if (req.role === 'global_buddy') rLabel = 'Global Buddy';\n\n                    html += `\n                        <div style=\"background:rgba(138,43,226,0.07); border:1px solid rgba(138,43,226,0.3); border-radius:16px; padding:16px; margin-bottom:12px; display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:12px;\">\n                            <div>\n                                <div style=\"color:#fff; font-weight:600; font-size:1rem;\">${escapeHtml(req.name)}<\/div>\n                                <div style=\"color:var(--text-muted); font-size:0.85rem; margin-top:2px;\">Wants you to be their <b style=\"color:var(--accent-purple);\">${rLabel}<\/b><\/div>\n                            <\/div>\n                            <div style=\"display:flex; gap:8px;\">\n                                <button class=\"ozg-btn\" style=\"padding:8px 16px; font-size:0.85rem;\" onclick=\"ozgRespondRequest('${req.id}', 'accept')\">Accept<\/button>\n                                <button class=\"ozg-btn-sec\" style=\"padding:8px 16px; font-size:0.85rem;\" onclick=\"ozgRespondRequest('${req.id}', 'decline')\">Decline<\/button>\n                            <\/div>\n                        <\/div>`;\n                });\n\n                container.innerHTML = html;\n                lucide.createIcons();\n\n            } catch (e) {\n                console.error('Notifications error:', e);\n                container.innerHTML = '<div style=\"text-align:center; padding: 40px; color: var(--warning-color);\">Error loading notifications.<\/div>';\n            }\n        }\n\n        async function ozgRespondEnrollRequest(reqId, action, cardEl) {\n            if (cardEl) cardEl.style.opacity = '0.5';\n            try {\n                const resp = await fetch(`${apiBase}\/enroll\/respond`, {\n                    method: 'POST',\n                    headers: {'Content-Type':'application\/json','X-WP-Nonce': nonce},\n                    body: JSON.stringify({ request_id: reqId, action: action })\n                });\n                const result = await resp.json();\n                if (result.success) {\n                    showHeaderToast((action === 'accept' ? '\u2705 Enrolled! ' : '\u274c Declined. ') + (result.message || ''));\n                    if (cardEl) cardEl.remove();\n                } else {\n                    showHeaderToast('\u26a0\ufe0f ' + (result.message || 'Error.'));\n                    if (cardEl) cardEl.style.opacity = '1';\n                }\n            } catch(e) { showHeaderToast(ozgI18n.errorConnection); if (cardEl) cardEl.style.opacity = '1'; }\n        }\n\n        async function ozgHandleSimpleUpload(fileInput, targetInputId) {\n            if (!fileInput.files || !fileInput.files[0]) return;\n            const file = fileInput.files[0];\n            const targetInput = document.getElementById(targetInputId);\n            const statusEl = document.getElementById(targetInputId + '_status');\n\n            if (statusEl) statusEl.innerHTML = '<i data-lucide=\"loader\" class=\"ozg-spin\"><\/i> Uploading file...';\n            if (typeof lucide !== 'undefined') lucide.createIcons();\n\n            const formData = new FormData();\n            formData.append('file', file);\n\n            try {\n                const resp = await fetch(`${apiBase}\/upload\/media`, {\n                    method: 'POST',\n                    headers: { 'X-WP-Nonce': nonce },\n                    body: formData\n                });\n                const data = await resp.json();\n                if (data.success && data.url) {\n                    if (targetInput) targetInput.value = data.url;\n                    if (statusEl) statusEl.innerHTML = `<span style=\"color:var(--success-color); font-weight:600;\"><i data-lucide=\"check-circle\" style=\"width:14px; vertical-align:middle;\"><\/i> Uploaded: ${escapeHtml(file.name)}<\/span>`;\n                } else {\n                    if (statusEl) statusEl.innerHTML = `<span style=\"color:#f87171;\">\u26a0\ufe0f ${data.message || 'Upload failed'}<\/span>`;\n                }\n            } catch(e) {\n                console.error('Upload error:', e);\n                if (statusEl) statusEl.innerHTML = '<span style=\"color:#f87171;\">\u26a0\ufe0f Upload error<\/span>';\n            }\n            if (typeof lucide !== 'undefined') lucide.createIcons();\n        }\n\n        async function ozgShowCreationPanel(type, editId = null) {\n            if (ozgI18n.isGuest) return ozgShowSignUpPrompt();\n            ozgCloseAllModals();\n                    \/\/ Close any open creation modal first\n                    if (document.getElementById('ozgCreationPanelModal').classList.contains('show')) {\n                        ozgForceCloseCreation();\n                    }\n                    window._ozgCreationDraftSaved = false;\n                    window._ozgCreationDraftId = editId;\n                    window._ozgCreationEditUrl = null;\n                    const _ab = document.getElementById('ozgCreationActionBar');\n                    if (_ab) _ab.style.display = 'none';\n                    const creationBar = document.getElementById('ozgCreationBar');\n                    if (creationBar) creationBar.classList.remove('visible');\n\n                    if (type === 'Finance') { type = 'campaign'; }\n                    if (type === '__Finance_original__') {\n                        const modal = document.getElementById('ozgCreationPanelModal');\n                        const title = document.getElementById('ozgCreationPanelTitle');\n                        const body = document.getElementById('ozgCreationPanelBody');\n                        const iframeWrap = document.getElementById('ozgEditorIframeWrap');\n                        const iframe = document.getElementById('ozgEditorIframe');\n\n                        if (title) title.innerHTML = 'Finance Dashboard';\n                        if (body) body.innerHTML = `\n                            <p style=\"color:rgba(255,255,255,0.6);font-size:0.85rem;margin-bottom:12px;\">Opening the Finance management panel...<\/p>\n                            <div style=\"display:flex;gap:8px;margin-bottom:12px;\">\n                                <button class=\"ozg-btn-sec\" style=\"font-size:0.8rem;padding:6px 12px;\" onclick=\"ozgForceCloseCreation();\">\n                                    <i data-lucide=\"x\"><\/i> Close\n                                <\/button>\n                            <\/div>`;\n                        if (iframeWrap && iframe) {\n                            iframeWrap.style.display = 'block';\n                            iframe.src = 'https:\/\/hobbi.st\/wfp-dashboard\/?wfp-page=campaign';\n                        }\n                        modal.classList.add('show');\n                        lucide.createIcons();\n                        return;\n                    }\n\n                    const config = ozgCreationConfigs[type];\n                    if (!config) return;\n\n                    const modal = document.getElementById('ozgCreationPanelModal');\n                    const titleEl = document.getElementById('ozgCreationPanelTitle');\n                    const body  = document.getElementById('ozgCreationPanelBody');\n                    if (!modal || !titleEl || !body) return;\n\n                    const displayTitle = editId ? `Edit: ${config.title.replace('Create ', '').replace('New ', '')}` : config.title;\n                    if (titleEl) titleEl.innerHTML = `<i data-lucide=\"${config.icon}\" style=\"width:20px; color:var(--cyan);\"><\/i> ${displayTitle}`;\n\n                    body.innerHTML = '<div style=\"text-align:center;padding:30px;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite;color:var(--cyan);\"><\/i><\/div>';\n                    modal.classList.add('show');\n                    lucide.createIcons();\n\n                    \/\/ Load any select options and existing data if editing\n                    const selectData = {};\n                    let existingData = null;\n\n                    const promises = config.fields.filter(f => f.optionsApi).map(async (f) => {\n                        try {\n                            const resp = await fetch(f.optionsApi, { headers: {'X-WP-Nonce': nonce} });\n                            selectData[f.id] = await resp.json();\n                        } catch(e) { selectData[f.id] = []; }\n                    });\n\n                    if (editId) {\n                        const detailsUrl = (type === 'course') ? `${apiBase}\/course\/details\/${editId}` : `${apiBase}\/fundraising\/details\/${editId}`;\n                        promises.push((async () => {\n                            try {\n                                const resp = await fetch(detailsUrl, { headers: {'X-WP-Nonce': nonce} });\n                                existingData = await resp.json();\n                            } catch(e) { console.error('Load edit data error:', e); }\n                        })());\n                    }\n\n                    await Promise.all(promises);\n\n                    \/\/ Build form HTML\n                    let formHtml = `<form id=\"ozgCreationForm\" onsubmit=\"ozgSubmitCreationForm(event, '${type}', ${editId})\">`;\n\n                    config.fields.forEach(f => {\n                        const req = f.required ? 'required' : '';\n                        const baseInput = 'width:100%;background:rgba(0,0,0,.35);border:1px solid rgba(255,255,255,.15);color:#fff;padding:10px 12px;border-radius:10px;font-family:inherit;font-size:0.9rem;outline:none;box-sizing:border-box;';\n\n                        let val = '';\n                        if (existingData) {\n                            if (f.id === 'description') val = existingData.raw_content || '';\n                            else if (f.id === 'goal') val = existingData.raw_goal || '';\n                            else val = existingData[f.id] || '';\n                        }\n\n                        formHtml += `<div style=\"margin-bottom:16px;\">\n                            <label style=\"display:block;color:rgba(255,255,255,0.7);font-size:0.78rem;margin-bottom:6px;text-transform:uppercase;letter-spacing:.5px;font-weight:600;\">\n                                ${f.label}${f.required ? ' <span style=\"color:#f87171;\">*<\/span>' : ''}\n                            <\/label>`;\n\n                        if (f.type === 'textarea') {\n                            formHtml += `<textarea id=\"ozgCF_${f.id}\" name=\"${f.id}\" placeholder=\"${f.placeholder||''}\" ${req}\n                                style=\"${baseInput}min-height:90px;resize:vertical;\">${escapeHtml(String(val))}<\/textarea>`;\n                        } else if (f.type === 'select') {\n                            const opts = f.options || selectData[f.id] || [];\n                            formHtml += `<select id=\"ozgCF_${f.id}\" name=\"${f.id}\"\n                                style=\"${baseInput}cursor:pointer;-webkit-appearance:none;\">\n                                <option value=\"\" style=\"background:#0f121e;color:#fff;\">\u2014 Select \u2014<\/option>\n                                ${opts.map(o => `<option value=\"${o.id}\" ${o.id == val ? 'selected' : ''} style=\"background:#0f121e;color:#fff;\">${escapeHtml(o.title||o.name||o.label)}<\/option>`).join('')}\n                            <\/select>`;\n                        } else if (f.type === 'file_upload') {\n                            formHtml += `\n                                <div style=\"display:flex; flex-direction:column; gap:8px;\">\n                                    <div style=\"display:flex; gap:8px; align-items:center;\">\n                                        <input id=\"ozgCF_${f.id}\" name=\"${f.id}\" type=\"text\" value=\"${escapeHtml(String(val))}\" placeholder=\"${f.placeholder||''}\" style=\"${baseInput} flex:1;\">\n                                        <label class=\"ozg-btn-sec\" style=\"padding:10px 14px; font-size:0.8rem; cursor:pointer; flex-shrink:0; display:flex; align-items:center; gap:6px; white-space:nowrap;\">\n                                            <i data-lucide=\"upload\"><\/i> Upload\n                                            <input type=\"file\" style=\"display:none;\" onchange=\"ozgHandleSimpleUpload(this, 'ozgCF_${f.id}')\">\n                                        <\/label>\n                                    <\/div>\n                                    <div id=\"ozgCF_${f.id}_status\" style=\"font-size:0.75rem; color:var(--text-muted);\"><\/div>\n                                <\/div>\n                            `;\n                        } else if (f.type === 'checkboxes') {\n                            formHtml += `<div id=\"ozgCF_${f.id}\" style=\"display:flex; flex-wrap:wrap; gap:12px; margin-top:8px;\">`;\n                            f.options.forEach(opt => {\n                                const isChecked = (existingData && Array.isArray(existingData[f.id]) && existingData[f.id].includes(opt.id)) || opt.checked;\n                                formHtml += `<label style=\"display:flex; align-items:center; gap:6px; color:#fff; font-size:0.85rem; cursor:pointer;\">\n                                    <input type=\"checkbox\" name=\"${f.id}\" value=\"${opt.id}\" ${isChecked ? 'checked' : ''} style=\"accent-color:var(--accent-cyan);\"> ${opt.label}\n                                <\/label>`;\n                            });\n                            formHtml += `<\/div>`;\n                        } else {\n                            formHtml += `<input id=\"ozgCF_${f.id}\" name=\"${f.id}\" type=\"${f.type}\" value=\"${escapeHtml(String(val))}\"\n                                placeholder=\"${f.placeholder||''}\" ${req} style=\"${baseInput}\">`;\n                        }\n                        formHtml += '<\/div>';\n                    });\n\n                    if (config.note && !editId) {\n                        formHtml += `<div style=\"background:rgba(0,240,255,.06);border:1px solid rgba(0,240,255,.15);border-radius:10px;padding:10px 14px;margin-bottom:18px;font-size:0.82rem;color:#a5f3fc;\">\n                            <i data-lucide=\"info\" style=\"width:13px;display:inline;\"><\/i> ${config.note}\n                        <\/div>`;\n                    }\n\n                    formHtml += `<div class=\"ozg-creation-actions\" style=\"display:flex; gap:10px; justify-content:flex-end; align-items:center; flex-wrap:wrap; margin-top:20px; padding-top:15px; border-top:1px solid rgba(255,255,255,0.05);\">\n                        <button type=\"button\" class=\"ozg-btn-sec\" style=\"padding:10px 16px; flex:1; min-width:90px; justify-content:center;\" onclick=\"ozgForceCloseCreation();\">Cancel<\/button>\n                        <button type=\"button\" class=\"ozg-btn-sec\" style=\"padding:10px 16px; flex:1; min-width:120px; justify-content:center;\" onclick=\"ozgSubmitCreationForm(event, '${type}', ${editId}, 'full_editor')\"><i data-lucide=\"external-link\"><\/i> Full Editor<\/button>\n                        <button type=\"button\" class=\"ozg-btn\" id=\"ozgCreationSubmitBtn\" style=\"padding:10px 16px; flex:1; min-width:120px; justify-content:center;\" onclick=\"ozgSubmitCreationForm(event, '${type}', ${editId}, 'publish')\"><i data-lucide=\"send\"><\/i> Publish<\/button>\n                    <\/div><\/form>`;\n\n                    body.innerHTML = formHtml;\n                    lucide.createIcons();\n                }\n\n        async function ozgSubmitCreationForm(event, type, editId = null, submitAction = 'full_editor') {\n            if (event) event.preventDefault();\n            const config = ozgCreationConfigs[type];\n            if (!config) return;\n\n            const submitBtn = document.getElementById('ozgCreationSubmitBtn');\n            if (submitBtn) { submitBtn.disabled = true; submitBtn.innerHTML = '<i data-lucide=\"loader\" class=\"ozg-spin\"><\/i> Saving\u2026'; if (typeof lucide !== 'undefined') lucide.createIcons(); }\n\n            const payload = { id: editId, submit_action: submitAction };\n            config.fields.forEach(f => {\n                const el = document.getElementById('ozgCF_' + f.id);\n                if (el) {\n                    if (f.type === 'checkboxes') {\n                        const checked = Array.from(el.querySelectorAll('input[type=\"checkbox\"]:checked')).map(cb => cb.value);\n                        payload[f.id] = checked;\n                    } else {\n                        payload[f.id] = el.value;\n                    }\n                }\n            });\n\n            try {\n                const resp = await fetch(config.endpoint, {\n                    method: 'POST',\n                    headers: { 'Content-Type':'application\/json', 'X-WP-Nonce': nonce },\n                    body: JSON.stringify(payload)\n                });\n                const result = await resp.json();\n\n                if (result.success) {\n                    window._ozgCreationDraftSaved = true;\n                    window._ozgCreationDraftId = result.id || null;\n                    window._ozgCreationEditUrl = result.edit_url || null;\n\n                    if (submitAction === 'publish') {\n                        showHeaderToast('\ud83d\ude80 Published successfully!');\n                        ozgForceCloseCreation();\n                        if (typeof loadSmartFeed === 'function') loadSmartFeed(true);\n                        if (typeof loadCoachPrograms === 'function') loadCoachPrograms();\n                    } else {\n                        showHeaderToast('\u2705 Saved! Opening Full Editor...');\n                        if (result.edit_url) {\n                            ozgOpenIframeEditor(result.edit_url, 'Full Editor');\n                        } else {\n                            ozgForceCloseCreation();\n                        }\n                    }\n                } else {\n                    showHeaderToast('\u26a0\ufe0f ' + (result.message || 'Error saving.'));\n                    if (submitBtn) { submitBtn.disabled = false; submitBtn.innerHTML = '<i data-lucide=\"send\"><\/i> Publish'; if (typeof lucide !== 'undefined') lucide.createIcons(); }\n                }\n            } catch(e) {\n                showHeaderToast(ozgI18n.errorConnection);\n                if (submitBtn) { submitBtn.disabled = false; submitBtn.innerHTML = '<i data-lucide=\"send\"><\/i> Publish'; if (typeof lucide !== 'undefined') lucide.createIcons(); }\n            }\n        }\n\n        function ozgCloseFsModal() {\n            const modal = document.getElementById('ozgFsModal');\n            const iframe = document.getElementById('ozgFsIframe');\n            if (modal) {\n                modal.classList.remove('show');\n                modal.classList.remove('ozg-fs-minimised');\n            }\n            \/\/ Reset iframe so it doesn't keep running in background\n            if (iframe) setTimeout(() => { iframe.src = 'about:blank'; }, 300);\n        }\n\n        function ozgToggleFsMinimise() {\n            const modal = document.getElementById('ozgFsModal');\n            const btn = document.getElementById('ozgFsMinBtn');\n            if (!modal) return;\n            const isMin = modal.classList.toggle('ozg-fs-minimised');\n            if (btn) btn.innerHTML = isMin\n                ? '<i data-lucide=\"maximize-2\"><\/i>'\n                : '<i data-lucide=\"minus\"><\/i>';\n            lucide.createIcons();\n        }\n\n        function ozgOpenPostTypeFilter(type) {\n            ozgCloseAllModals();\n            if (type === 'courses' || type === 'course') {\n                ozgSwitchTab('coach');\n            } else if (type === 'lesson' || type === 'lessons' || type === 'tutor_quiz' || type === 'tutor_assignments') {\n                ozgSwitchTab('kingdom');\n                const tagBtn = document.querySelector('.ozg-feed-tag-btn[onclick*=\"lesson\"]');\n                if (tagBtn) ozgSetFeedTag('lessons', tagBtn);\n                else { currentFeedTag = 'lessons'; loadSmartFeed(true); }\n            } else if (type === 'finance' || type === 'wp-fundraising' || type === 'campaign' || type === 'give_forms' || type === 'give_p2p') {\n                ozgSwitchTab('kingdom');\n                const tagBtn = document.querySelector('.ozg-feed-tag-btn[onclick*=\"finance\"]');\n                if (tagBtn) ozgSetFeedTag('finance', tagBtn);\n                else { currentFeedTag = 'finance'; loadSmartFeed(true); }\n            } else if (type === 'jobs' || type === 'job_listing') {\n                ozgSwitchTab('kingdom');\n                const tagBtn = document.querySelector('.ozg-feed-tag-btn[onclick*=\"jobs\"]');\n                if (tagBtn) ozgSetFeedTag('jobs', tagBtn);\n                else { currentFeedTag = 'jobs'; loadSmartFeed(true); }\n            } else if (type === 'challenges' || type === 'ozg_challenge') {\n                ozgSwitchTab('challenges');\n            } else {\n                ozgSwitchTab('kingdom');\n            }\n        }\n\n        function ozgOpenTelegramShare(url) {\n            const tgApp = (window.Telegram && window.Telegram.WebApp) ? window.Telegram.WebApp : window.tg;\n            if (tgApp && typeof tgApp.openTelegramLink === 'function') {\n                tgApp.openTelegramLink(url);\n            } else if (tgApp && typeof tgApp.openLink === 'function') {\n                tgApp.openLink(url);\n            } else {\n                window.open(url, '_blank');\n            }\n        }\n\n        function ozgOpenWhatsAppShare(url) {\n            const tgApp = (window.Telegram && window.Telegram.WebApp) ? window.Telegram.WebApp : window.tg;\n            if (tgApp && typeof tgApp.openLink === 'function') {\n                tgApp.openLink(url);\n            } else {\n                window.location.href = url;\n            }\n        }\n\n        function ozgShareFeedCard(postId, title, slug) {\n            const baseUrl = ozgDashboardUrl;\n            const tgBotName = 'Hobbistbot';\n            const tgAppName = 'miniapp';\n\n            const startParam = `post_${postId}`;\n            const tgDeepLink = `https:\/\/t.me\/${tgBotName}\/${tgAppName}?startapp=${startParam}`;\n            const encodedTitle = encodeURIComponent(title || 'Check this out on Emirat!');\n            const encodedTgUrl = encodeURIComponent(tgDeepLink);\n\n            const tgShareUrl = `https:\/\/t.me\/share\/url?url=${encodedTgUrl}&text=${encodedTitle}`;\n            const waShareUrl = `https:\/\/api.whatsapp.com\/send?text=${encodedTitle}%20${encodedTgUrl}`;\n            const twShareUrl = `https:\/\/twitter.com\/intent\/tweet?text=${encodedTitle}&url=${encodedTgUrl}`;\n\n            const existing = document.getElementById('ozgShareSheet');\n            if (existing) existing.remove();\n\n            const sheet = document.createElement('div');\n            sheet.id = 'ozgShareSheet';\n            sheet.style.cssText = 'position:fixed;inset:0;z-index:25000;display:flex;align-items:flex-end;justify-content:center;background:rgba(0,0,0,0.7);backdrop-filter:blur(4px);';\n            sheet.onclick = function(e) { if (e.target === sheet) sheet.remove(); };\n            sheet.innerHTML = `\n                <div style=\"background:#0f121e;border-radius:20px 20px 0 0;padding:20px;width:100%;max-width:480px;border-top:1px solid rgba(255,255,255,0.1);\">\n                    <div style=\"text-align:center;color:rgba(255,255,255,0.5);font-size:0.78rem;text-transform:uppercase;letter-spacing:.5px;margin-bottom:14px;\">Share<\/div>\n                    <div style=\"font-weight:600;color:#fff;margin-bottom:16px;text-align:center;font-size:0.95rem;\">${escapeHtml(title || 'This content')}<\/div>\n                    <div style=\"display:flex;justify-content:space-around;gap:8px;margin-bottom:20px;\">\n                        <button onclick=\"ozgOpenTelegramShare('${tgShareUrl}'); document.getElementById('ozgShareSheet').remove();\" style=\"display:flex;flex-direction:column;align-items:center;gap:6px;color:#2AABEE;background:none;border:none;cursor:pointer;font-size:0.72rem;font-weight:600;padding:0;\">\n                            <div style=\"width:48px;height:48px;border-radius:12px;background:rgba(42,171,238,0.15);border:1px solid rgba(42,171,238,0.3);display:flex;align-items:center;justify-content:center;font-size:1.4rem;\">\u2708\ufe0f<\/div>Telegram\n                        <\/button>\n                        <button onclick=\"ozgOpenWhatsAppShare('${waShareUrl}'); document.getElementById('ozgShareSheet').remove();\" style=\"display:flex;flex-direction:column;align-items:center;gap:6px;color:#25D366;background:none;border:none;cursor:pointer;font-size:0.72rem;font-weight:600;padding:0;\">\n                            <div style=\"width:48px;height:48px;border-radius:12px;background:rgba(37,211,102,0.15);border:1px solid rgba(37,211,102,0.3);display:flex;align-items:center;justify-content:center;font-size:1.4rem;\">\ud83d\udcac<\/div>WhatsApp\n                        <\/button>\n                        <button onclick=\"window.open('${twShareUrl}', '_blank'); document.getElementById('ozgShareSheet').remove();\" style=\"display:flex;flex-direction:column;align-items:center;gap:6px;color:#1DA1F2;background:none;border:none;cursor:pointer;font-size:0.72rem;font-weight:600;padding:0;\">\n                            <div style=\"width:48px;height:48px;border-radius:12px;background:rgba(29,161,242,0.15);border:1px solid rgba(29,161,242,0.3);display:flex;align-items:center;justify-content:center;font-size:1.4rem;\">\ud83d\udc26<\/div>Twitter\n                        <\/button>\n                        <button onclick=\"ozgCopyShareLink('${tgDeepLink}'); document.getElementById('ozgShareSheet').remove();\" style=\"display:flex;flex-direction:column;align-items:center;gap:6px;color:rgba(255,255,255,0.7);background:none;border:none;cursor:pointer;font-size:0.72rem;font-weight:600;padding:0;\">\n                            <div style=\"width:48px;height:48px;border-radius:12px;background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.12);display:flex;align-items:center;justify-content:center;font-size:1.4rem;\">\ud83d\udd17<\/div>Copy Link\n                        <\/button>\n                    <\/div>\n                    <button onclick=\"document.getElementById('ozgShareSheet').remove();\" style=\"width:100%;background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.1);color:#fff;padding:12px;border-radius:12px;font-size:0.9rem;cursor:pointer;\">Cancel<\/button>\n                <\/div>`;\n            document.body.appendChild(sheet);\n        }\n\n        function ozgCopyShareLink(url) {\n            navigator.clipboard.writeText(url).then(() => showHeaderToast('\ud83d\udd17 Link copied!'));\n        }\n\n        function ozgInitDashboardClickInterceptor() {\n            document.addEventListener('click', function(e) {\n                const link = e.target.closest('a');\n                if (!link) return;\n\n                const url = link.href;\n                if (!url || url.includes('javascript:') || url.includes('mailto:') || url.includes('tel:')) return;\n\n                \/\/ Handle anchors on the same page\n                if (url.includes('#')) {\n                    const baseUrl = url.split('#')[0];\n                    if (baseUrl === window.location.href.split('#')[0]) return;\n                }\n\n                const urlObj = new URL(url);\n                const isInternal = (urlObj.origin === window.location.origin) || url.includes('hobbi.st');\n                const isMiniApp = (window.Telegram && window.Telegram.WebApp && window.Telegram.WebApp.platform && window.Telegram.WebApp.platform !== 'unknown');\n\n                if (!isInternal) {\n                    if (isMiniApp) {\n                        e.preventDefault();\n                        window.Telegram.WebApp.openLink(url);\n                    }\n                    return;\n                }\n\n                \/\/ Internal links below\n                if (url.includes('wp-admin') || link.dataset.ozgIntercepted || link.classList.contains('ozg-btn-tg')) return;\n\n                \/\/ Check if it's a dashboard tab link\n                if (link.onclick && link.onclick.toString().includes('ozgSwitchTab')) return;\n\n                e.preventDefault();\n                e.stopPropagation();\n\n                \/\/ Check for special content types with custom modals\n                const card = link.closest('.jet-listing-grid__item, .elementor-loop-item, .ozg-feed-card, .tutor-course-card, .fundengine-campaign-card');\n                let postId = link.getAttribute('data-post-id') || card?.getAttribute('data-post-id');\n                let postType = link.getAttribute('data-post-type') || card?.getAttribute('data-post-type');\n\n                if (!postId && card) {\n                    const match = card.className.match(\/post-(\\d+)\/);\n                    if (match) postId = match[1];\n                }\n\n                const patterns = ['\/courses\/', '\/lesson\/', '\/fundraising\/', '\/nomination\/', '\/product\/', '\/finance\/'];\n                const matchedPattern = patterns.some(p => url.includes(p));\n\n                if (postId || matchedPattern) {\n                    if (postId) {\n                        ozgOpenFeedCardFromId(postId, postType);\n                    } else {\n                        const path = urlObj.pathname;\n                        ozgResolveAndOpen(path);\n                    }\n                } else {\n                    \/\/ General internal link -> open in dashboard iframe modal\n                    ozgOpenPageInDashboard(0, link.innerText.trim() || 'Emirat', url);\n                }\n            }, true);\n        }\n\n        async function ozgResolveAndOpen(path) {\n            \/\/ Instant feedback\n            showHeaderToast('Opening...');\n            try {\n                const resp = await fetch(`${apiBase}\/resolve-slug?slug=${encodeURIComponent(path)}`, { headers: {'X-WP-Nonce': nonce} });\n                const data = await resp.json();\n                if (data.success && data.id) {\n                    ozgOpenFeedCardFromId(data.id);\n                } else {\n                    window.location.href = path; \/\/ Fallback to normal navigation\n                }\n            } catch(e) { window.location.href = path; }\n        }\n\n        async function ozgHandleDeepLink() {\n            const urlParams = new URLSearchParams(window.location.search);\n            \/\/ Telegram mini-app passes start_param in initDataUnsafe\n            const startAppParam = (tg && tg.initDataUnsafe) ? tg.initDataUnsafe.start_param : '';\n            const startApp = startAppParam || urlParams.get('startapp') || '';\n            \/\/ Web share: ?ozg_post=ID or ?ozg_slug=SLUG\n            const ozgPost  = urlParams.get('ozg_post') || '';\n            const ozgSlug  = urlParams.get('ozg_slug') || '';\n            const hash = window.location.hash;\n\n            let postId = null;\n\n            \/\/ 1. Try to match numeric post ID first\n            const m1 = startApp.match(\/^post_(\\d+)$\/);\n            const m2 = ozgPost.match(\/^(\\d+)$\/);\n            const m3 = hash.match(\/^#feed-(\\d+)$\/);\n\n            if (m1) postId = parseInt(m1[1]);\n            else if (m2) postId = parseInt(m2[1]);\n            else if (m3) postId = parseInt(m3[1]);\n\n            if (postId) {\n                console.log('Deep-link: processing post ID', postId);\n                setTimeout(() => { ozgOpenFeedCardFromId(postId); }, 700);\n            } else if (startApp || ozgSlug) {\n                \/\/ If it's a slug (any string not matching post_ID)\n                const slugInput = ozgSlug || startApp;\n                console.log('Deep-link: resolving slug', slugInput);\n\n                \/\/ Decode __ back to \/ for hierarchical slugs\n                const slugToResolve = slugInput.replace(\/__\/g, '\/');\n\n                setTimeout(function() {\n                    fetch(apiBase + '\/resolve-slug?slug=' + encodeURIComponent(slugToResolve), {\n                        headers: { 'X-WP-Nonce': nonce }\n                    })\n                    .then(function(r) { return r.json(); })\n                    .then(function(data) {\n                        if (data.success && data.id) {\n                            console.log('Deep-link: resolved to ID', data.id);\n                            ozgOpenFeedCardFromId(data.id);\n                        } else {\n                            console.warn('Deep-link resolution failed:', data.message);\n                            if (startApp) showHeaderToast('Content not found: ' + slugToResolve);\n                        }\n                    })\n                    .catch(function(e) { console.error('Deep-link error:', e); });\n                }, 700);\n            }\n        }\n        ozgHandleDeepLink();\n\n        async function loadUserProfile(userId) {\n            const grid = document.getElementById('ozgProfileFeedGrid');\n            const noPosts = document.getElementById('ozgProfileNoPosts');\n            const connectionsMe = document.getElementById('ozgMeProfileConnections');\n            const connectionsOther = document.getElementById('ozgOtherProfileConnections');\n\n            grid.innerHTML = '<div style=\"grid-column: 1\/-1; text-align:center; padding: 40px;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; color:var(--accent-cyan);\"><\/i><\/div>';\n            lucide.createIcons();\n\n            try {\n                const resp = await fetch(`${apiBase}\/user\/profile\/${userId}`, { headers: {'X-WP-Nonce': nonce} });\n                const data = await resp.json();\n\n                \/\/ Update Header\n                document.getElementById('ozgProfileName').innerText = data.name;\n                document.getElementById('ozgProfileAvatar').src = data.avatar;\n                document.getElementById('ozgStatPosts').innerText = data.stats.posts_count;\n                document.getElementById('ozgStatAchievements').innerText = data.stats.achievements;\n                document.getElementById('ozgStatCoins').innerText = formatPointsBalance(data.stats.coins);\n\n                document.getElementById('ozgProfileIsMeBadge').style.display = data.is_me ? 'flex' : 'none';\n\n                \/\/ Toggle connections visibility\n                if (data.is_me) {\n                    connectionsMe.style.display = 'block';\n                    connectionsOther.style.display = 'none';\n                } else {\n                    connectionsMe.style.display = 'none';\n                    connectionsOther.style.display = 'block';\n                }\n\n                \/\/ Render Feed (3 column)\n                if (data.posts.length === 0) {\n                    grid.innerHTML = '';\n                    noPosts.style.display = 'block';\n                } else {\n                    noPosts.style.display = 'none';\n                    grid.innerHTML = data.posts.map(p => buildProfileCard(p)).join('');\n                }\n                lucide.createIcons();\n\n            } catch (e) {\n                console.error('Profile load error:', e);\n                grid.innerHTML = '<div style=\"grid-column: 1\/-1; text-align:center; padding: 40px; color: var(--warning-color);\">Error loading profile.<\/div>';\n            }\n        }\n\n        function ozgSwitchProfileSubTab(tab, btn) {\n            document.querySelectorAll('.ozg-profile-tab').forEach(b => {\n                b.classList.remove('active');\n                b.style.color = 'var(--text-muted)';\n                b.style.borderBottomColor = 'transparent';\n            });\n            btn.classList.add('active');\n            btn.style.color = '#fff';\n            btn.style.borderBottomColor = 'var(--accent-cyan)';\n\n            document.querySelectorAll('.ozg-profile-subtab-content').forEach(c => c.style.display = 'none');\n            document.getElementById('ozgProfileSubTab-' + tab).style.display = 'block';\n        }\n\n        function ozgOpenPostFromProfile(type, id, title, url) {\n            if (type === 'courses') ozgOpenCourseModal(id);\n            else if (['lesson', 'tutor_quiz', 'tutor_assignments', 'sfwd-lessons', 'topics'].includes(type)) ozgOpenLessonModal(id);\n            else if (['wp-fundraising', 'campaign', 'give_forms', 'give_p2p', 'p2p_campaign'].includes(type)) ozgOpenFundraisingModal(id);\n            else if (title && url) ozgOpenPageInDashboard(id, title, url);\n            else window.location.href = `\/?p=${id}`;\n        }\n\n        function filterByPillar() {\n            const pillar = document.getElementById('filterPillar').value;\n            const areaSelect = document.getElementById('filterArea');\n            areaSelect.innerHTML = `<option value=\"\">All Spheres<\/option>`;\n            if (pillar && kingdomStruct[pillar]) {\n                for (let a in kingdomStruct[pillar].areas) areaSelect.innerHTML += `<option value=\"${a}\">${kingdomStruct[pillar].areas[a]}<\/option>`;\n            }\n            filterByArea();\n        }\n\n        function filterByArea() {\n            const pillar = document.getElementById('filterPillar').value;\n            const area = document.getElementById('filterArea').value;\n            document.querySelectorAll('.kingdom-pillar').forEach(p => {\n                const showPillar = !pillar || p.dataset.pillar === pillar;\n                p.style.display = showPillar ? 'block' : 'none';\n                if (showPillar) {\n                    p.querySelectorAll('.kingdom-area').forEach(a => {\n                        const showArea = !area || a.dataset.area === area;\n                        a.style.display = showArea ? 'block' : 'none';\n                    });\n                }\n            });\n        }\n\n        function clearFilters() {\n            document.getElementById('filterPillar').value = '';\n            document.getElementById('filterArea').innerHTML = `<option value=\"\">All Spheres<\/option>`;\n            filterByArea();\n        }\n\n        function coachFilterByPillar() {\n            const pillar = document.getElementById('coachFilterPillar').value;\n            const areaSelect = document.getElementById('coachFilterArea');\n            areaSelect.innerHTML = `<option value=\"\">All Spheres<\/option>`;\n            if (pillar && kingdomStruct[pillar]) {\n                for (let a in kingdomStruct[pillar].areas) areaSelect.innerHTML += `<option value=\"${a}\">${kingdomStruct[pillar].areas[a]}<\/option>`;\n            }\n            loadCoachPrograms();\n        }\n\n        function coachFilterByArea() { loadCoachPrograms(); }\n\n        function coachClearFilters() {\n            document.getElementById('coachFilterPillar').value = '';\n            document.getElementById('coachFilterArea').innerHTML = `<option value=\"\">All Spheres<\/option>`;\n            loadCoachPrograms();\n        }\n\n        async function loadCoachPrograms() {\n            const container = document.getElementById('coach-programs-container');\n            if (!container) return;\n\n            container.innerHTML = '<div style=\"text-align:center; padding: 40px;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; color:var(--accent-cyan);\"><\/i><\/div>';\n            lucide.createIcons();\n\n            try {\n                const res = await fetch(`${apiBase}\/coach\/get_programs`, { headers: {'X-WP-Nonce': nonce} });\n                const programs = await res.json();\n\n                if (programs.length === 0) {\n                    container.innerHTML = `<div style=\"text-align:center; padding: 40px; color:var(--text-muted); background:rgba(255,255,255,0.02); border-radius:16px;\">You haven't created any content yet.<\/div>`;\n                } else {\n                    container.innerHTML = programs.map(p => `\n                        <div class=\"ozg-coach-item\" data-type=\"${p.type || 'courses'}\" data-title=\"${escapeHtml(p.title)}\" style=\"margin-bottom:16px; padding:18px; border-left:4px solid ${p.pillar_color}; background:rgba(255,255,255,0.03); border-radius:16px; border:1px solid rgba(255,255,255,0.07);\">\n                            <div style=\"display:flex; justify-content:space-between; align-items:flex-start; margin-bottom:14px; gap:8px;\">\n                                <div style=\"min-width:0;\">\n                                    <div style=\"font-size:0.68rem; color:var(--text-muted); text-transform:uppercase; letter-spacing:.6px; margin-bottom:4px;\">${escapeHtml(p.area_name || '')}<\/div>\n                                    <h4 style=\"margin:0; color:#fff; font-size:1rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;\">${escapeHtml(p.title)}<\/h4>\n                                <\/div>\n                                <div style=\"display:flex; gap:6px; flex-shrink:0;\">\n                                    <button class=\"ozg-icon-btn\" title=\"Edit\" onclick=\"ozgOpenEditorModal(${p.id})\"><i data-lucide=\"edit-2\"><\/i><\/button>\n                                    <button class=\"ozg-icon-btn danger\" title=\"Delete\" onclick=\"ozgDelete(${p.id})\"><i data-lucide=\"trash-2\"><\/i><\/button>\n                                <\/div>\n                            <\/div>\n                            <div style=\"display:flex; gap:6px; flex-wrap:wrap;\">\n                                ${p.type === 'courses' ? `<button class=\"ozg-btn-sec\" style=\"font-size:0.72rem; padding:5px 10px;\" onclick=\"ozgOpenModal('habit', ${p.id}, 0, '')\"><i data-lucide=\"plus\"><\/i> Habit<\/button>\n                                <button class=\"ozg-btn-sec\" style=\"font-size:0.72rem; padding:5px 10px;\" onclick=\"ozgOpenModal('milestone', ${p.id}, 0, '')\"><i data-lucide=\"plus\"><\/i> Milestone<\/button>\n                                <button class=\"ozg-btn-sec\" style=\"font-size:0.72rem; padding:5px 10px; border-color:rgba(0,240,255,0.25); color:var(--accent-cyan);\" onclick=\"ozgShowEnrollRequestModal(${p.id}, '${escapeHtml(p.title).replace(\/'\/g,\"\\\\'\")}')\"><i data-lucide=\"user-plus\"><\/i> Enroll<\/button>` : ''}\n                            <\/div>\n                        <\/div>\n                    `).join('');\n                }\n                lucide.createIcons();\n            } catch(e) { container.innerHTML = '<div style=\"color:var(--warning-color);\">Error loading programs.<\/div>'; }\n        }\n\n        async function toggleHabits(programId) {\n            const container = document.getElementById(`habits-${programId}`);\n            const icon = document.getElementById(`habits-icon-${programId}`);\n            if (!container) return;\n            if (container.style.display === 'none') {\n                container.style.display = 'block';\n                if (icon) icon.style.transform = 'rotate(180deg)';\n                if (container.innerHTML === '') {\n                    container.innerHTML = '<div style=\"text-align:center; padding:10px;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; width:16px; color:var(--accent-cyan);\"><\/i><\/div>';\n                    lucide.createIcons();\n                    await fetchHabits(programId);\n                }\n            } else {\n                container.style.display = 'none';\n                if (icon) icon.style.transform = 'rotate(0deg)';\n            }\n        }\n\n        async function toggleMilestones(programId) {\n            const container = document.getElementById(`milestones-${programId}`);\n            const icon = document.getElementById(`milestones-icon-${programId}`);\n            if (!container) return;\n            if (container.style.display === 'none') {\n                container.style.display = 'block';\n                if (icon) icon.style.transform = 'rotate(180deg)';\n                if (container.innerHTML === '') {\n                    container.innerHTML = '<div style=\"text-align:center; padding:10px;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; width:16px; color:var(--accent-purple);\"><\/i><\/div>';\n                    lucide.createIcons();\n                    await fetchMilestones(programId);\n                }\n            } else {\n                container.style.display = 'none';\n                if (icon) icon.style.transform = 'rotate(0deg)';\n            }\n        }\n\n        async function fetchHabits(programId) {\n            const container = document.getElementById(`habits-${programId}`);\n            if (!container) return;\n            try {\n                const resp = await fetch(`${apiBase}\/coach\/get_habits?program_id=${programId}`, { headers: {'X-WP-Nonce': nonce} });\n                const habits = await resp.json();\n                if (habits.length === 0) {\n                    container.innerHTML = `<p style=\"color: var(--text-muted); font-size: 0.85rem;\">${ozgI18n.noHabits}<\/p>`;\n                } else {\n                    container.innerHTML = habits.map(h => `<div style=\"display: flex; justify-content: space-between; align-items: center; background: rgba(255,255,255,0.03); padding: 12px; border-radius: 12px; margin-bottom: 8px;\"><span>${escapeHtml(h.post_title)}<\/span><button class=\"ozg-icon-btn danger\" onclick=\"ozgDelete(${h.ID})\"><i data-lucide=\"trash-2\" style=\"width: 14px;\"><\/i><\/button><\/div>`).join('');\n                }\n                lucide.createIcons();\n            } catch (e) { container.innerHTML = `<p>${ozgI18n.errorConnection}<\/p>`; }\n        }\n\n        async function fetchMilestones(programId) {\n            const container = document.getElementById(`milestones-${programId}`);\n            if (!container) return;\n            try {\n                const resp = await fetch(`${apiBase}\/coach\/get_milestones?program_id=${programId}`, { headers: {'X-WP-Nonce': nonce} });\n                const milestones = await resp.json();\n                if (milestones.length === 0) {\n                    container.innerHTML = `<p style=\"color: var(--text-muted); font-size: 0.85rem;\">${ozgI18n.noMilestones}<\/p>`;\n                } else {\n                    container.innerHTML = milestones.map(m => `<div style=\"display: flex; justify-content: space-between; align-items: center; background: rgba(255,255,255,0.03); padding: 12px; border-radius: 12px; margin-bottom: 8px;\"><span>${escapeHtml(m.post_title)}<\/span><button class=\"ozg-icon-btn danger\" onclick=\"ozgDelete(${m.ID})\"><i data-lucide=\"trash-2\" style=\"width: 14px;\"><\/i><\/button><\/div>`).join('');\n                }\n                lucide.createIcons();\n            } catch (e) { container.innerHTML = `<p>${ozgI18n.errorConnection}<\/p>`; }\n        }\n\n        function showView(viewId) {\n            document.querySelectorAll('.q-view').forEach(v => { v.classList.remove('active'); v.style.display = 'none'; });\n            const v = document.getElementById(viewId);\n            v.style.display = 'flex';\n            setTimeout(() => v.classList.add('active'), 50);\n            activeViewId = viewId;\n            toggleGlobalSaveBtn(viewId === 'view-select');\n        }\n\n        function toggleGlobalSaveBtn(show) {\n            const isTgApp = tg && tg.platform && tg.platform !== 'unknown';\n            const webBtnContainer = document.getElementById('web-save-focus-container');\n            if (show) {\n                if (isTgApp && tg.MainButton) {\n                    tg.MainButton.setText(`${ozgI18n.saveSelection} (${selectedFocus.length}\/8)`);\n                    tg.MainButton.show();\n                    tg.MainButton.offClick(confirmFocusSelection);\n                    tg.MainButton.onClick(confirmFocusSelection);\n                } else if (webBtnContainer) {\n                    webBtnContainer.style.display = 'block';\n                }\n            } else {\n                if (isTgApp && tg.MainButton) {\n                    tg.MainButton.hide();\n                } else if (webBtnContainer) {\n                    webBtnContainer.style.display = 'none';\n                }\n            }\n        }\n\n        function startQuiz() {\n            if (ozgI18n.isGuest) return ozgShowSignUpPrompt();\n            showView('view-age');\n        }\n\n        function selectAgeGroup(group) {\n            isYouth = (group === 'youth');\n            localStorage.setItem('ozg_age_group', group);\n            showView('view-quiz');\n            renderQuestion();\n        }\n\n        function renderQuestion() {\n            const q = questions[currentIdx];\n            const pInfo = kingdomStruct[q.pillar];\n            const sphereName = pInfo.areas[q.sphere] || q.sphere;\n            const qText = (isYouth && q.text_youth) ? q.text_youth : q.text;\n            document.getElementById('quiz-question').innerText = qText;\n            document.getElementById('quiz-cat-text').innerHTML = `<i data-lucide=\"${pInfo.icon}\" style=\"width:14px;\"><\/i> <span>${pInfo.name}<\/span>`;\n            document.getElementById('quiz-cat-text').style.color = pInfo.color;\n            document.getElementById('quiz-sphere-text').innerText = `Sphere: ${sphereName}`;\n            document.getElementById('quiz-progress-text').innerText = `${currentIdx + 1} \/ ${questions.length}`;\n            document.getElementById('quiz-progress-bar').style.width = `${((currentIdx + 1) \/ questions.length) * 100}%`;\n            const cont = document.getElementById('quiz-rating-container');\n            cont.innerHTML = '';\n            for (let i = 1; i <= 5; i++) {\n                const btn = document.createElement('button');\n                btn.className = 'rating-btn';\n                if (userAnswers[currentIdx] === i) btn.classList.add('selected');\n                btn.style.setProperty('--active-color', pInfo.color);\n                btn.innerText = i;\n                btn.onclick = () => handleAnswer(i, btn);\n                cont.appendChild(btn);\n            }\n            lucide.createIcons();\n        }\n\n        function handleAnswer(score, btnEl) {\n            const cont = document.getElementById('quiz-rating-container');\n            Array.from(cont.children).forEach(b => b.classList.remove('selected'));\n            btnEl.classList.add('selected');\n            userAnswers[currentIdx] = score;\n            localStorage.setItem('ozg_quiz_answers', JSON.stringify(userAnswers));\n            setTimeout(() => {\n                if (currentIdx < questions.length - 1) {\n                    currentIdx++;\n                    const view = document.getElementById('view-quiz');\n                    view.style.opacity = '0';\n                    setTimeout(() => { renderQuestion(); view.style.opacity = '1'; }, 200);\n                } else {\n                    finishQuizPhase();\n                }\n            }, 250);\n        }\n\n        function prevQuestion() {\n            if (currentIdx > 0) {\n                currentIdx--;\n                const view = document.getElementById('view-quiz');\n                view.style.opacity = '0';\n                setTimeout(() => { renderQuestion(); view.style.opacity = '1'; }, 200);\n            } else {\n                showView('view-intro');\n            }\n        }\n\n        async function finishQuizPhase() {\n            finalScores = {};\n            questions.forEach((q, idx) => {\n                const key = `${q.pillar}_${q.sphere}`;\n                if (!finalScores[key]) finalScores[key] = 0;\n                finalScores[key] += userAnswers[idx] || 0;\n            });\n            document.getElementById('view-quiz').innerHTML = `<div style=\"text-align:center; padding:100px 0;\"><i data-lucide=\"loader\" style=\"width:40px; height:40px; animation:spin 1s linear infinite; color:var(--accent-cyan);\"><\/i><br><p style=\"margin-top:20px;\">${ozgI18n.loading}<\/p><\/div>`;\n            lucide.createIcons();\n            try {\n                await fetch(`${apiBase}\/kingdom\/save_quiz`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ scores: finalScores }) });\n                localStorage.removeItem('ozg_quiz_answers');\n                showView('view-select');\n                renderSelectionGrid();\n            } catch (e) { alert(ozgI18n.errorConnection); location.reload(); }\n        }\n\n        function renderSelectionGrid() {\n            let allArr = [];\n            for (let key in finalScores) {\n                let parts = key.split('_');\n                allArr.push({ key: key, pillar: parts[0], sphere: parts[1], score: finalScores[key] });\n            }\n            allArr.sort((a, b) => b.score - a.score);\n            const lockedKeys = allArr.slice(0, 8).map(s => s.key);\n            const grid = document.getElementById('kingdom-grid');\n            grid.innerHTML = '';\n            for (let pKey in kingdomStruct) {\n                const p = kingdomStruct[pKey];\n                let html = `<div style=\"background:rgba(0,0,0,0.3); border-radius:16px; padding:20px; border:1px solid rgba(255,255,255,0.05); height:100%;\"><h3 style=\"color:${p.color}; font-size:1.2rem; margin-bottom:16px; display:flex; align-items:center; gap:8px;\"><i data-lucide=\"${p.icon}\"><\/i> ${p.name}<\/h3><div style=\"display:flex; flex-direction:column; gap:12px;\">`;\n                const sInP = allArr.filter(s => s.pillar === pKey);\n                sInP.forEach(s => {\n                    const isLocked = lockedKeys.includes(s.key);\n                    const percent = (s.score \/ 10) * 100;\n                    const sphereName = kingdomStruct[pKey].areas[s.sphere] || s.sphere;\n                    const isSelected = selectedFocus.includes(s.key);\n                    let iconHtml = isLocked ? `<i data-lucide=\"lock\" style=\"width:14px; color:#888;\"><\/i>` : (isSelected ? `<i data-lucide=\"check-circle-2\" style=\"width:16px; color:var(--accent-cyan);\"><\/i>` : `<i data-lucide=\"circle\" style=\"width:14px; color:#888;\"><\/i>`);\n                    html += `<div class=\"sphere-chip ${isLocked ? 'locked' : ''} ${isSelected ? 'selected' : ''}\" id=\"chip-${s.key}\" onclick=\"toggleSelectFocus('${s.key}', ${isLocked})\"><div class=\"sphere-fill\" style=\"background-color:${p.color}; width:${percent}%;\"><\/div><div class=\"sphere-content\"><span style=\"font-size:0.9rem; font-weight:500; color:${isLocked ? '#888' : '#fff'};\">${sphereName}<\/span><div style=\"display:flex; align-items:center; gap:8px;\"><span style=\"font-size:0.75rem; font-weight:700; color:${isLocked ? '#666' : '#fff'};\">${s.score}\/10<\/span><div id=\"icon-${s.key}\">${iconHtml}<\/div><\/div><\/div><\/div>`;\n                });\n                html += `<\/div><\/div>`;\n                grid.innerHTML += html;\n            }\n            lucide.createIcons();\n            setTimeout(() => { document.querySelectorAll('.sphere-fill').forEach(el => el.style.opacity = '0.35'); }, 500);\n            updateSelectionUI();\n        }\n\n        function toggleSelectFocus(key, isLocked) {\n            if (isLocked) { alert(ozgI18n.alreadyHigh); return; }\n            const chip = document.getElementById(`chip-${key}`);\n            const iconCont = document.getElementById(`icon-${key}`);\n            if (selectedFocus.includes(key)) {\n                selectedFocus = selectedFocus.filter(k => k !== key);\n                chip.classList.remove('selected');\n                iconCont.innerHTML = `<i data-lucide=\"circle\" style=\"width:14px; color:#888;\"><\/i>`;\n            } else {\n                if (selectedFocus.length >= 8) { alert(ozgI18n.maxSpheres); return; }\n                selectedFocus.push(key);\n                chip.classList.add('selected');\n                iconCont.innerHTML = `<i data-lucide=\"check-circle-2\" style=\"width:16px; color:var(--accent-cyan);\"><\/i>`;\n            }\n            lucide.createIcons();\n            updateSelectionUI();\n        }\n\n        function updateSelectionUI() {\n            const countEl = document.getElementById('ozgFocusCount');\n            if (countEl) countEl.innerText = selectedFocus.length;\n            const btn = document.getElementById('ozgSaveFocusBtn');\n            if (btn) {\n                btn.disabled = selectedFocus.length !== 8;\n                if (selectedFocus.length === 8) { btn.style.opacity = '1'; btn.style.cursor = 'pointer'; }\n                else { btn.style.opacity = '0.5'; btn.style.cursor = 'not-allowed'; }\n            }\n            const isTgApp = tg && tg.platform && tg.platform !== 'unknown';\n            if (isTgApp && tg.MainButton && activeViewId === 'view-select') {\n                tg.MainButton.setText(`${ozgI18n.saveSelection} (${selectedFocus.length}\/8)`);\n                if (selectedFocus.length === 8) { tg.MainButton.enable(); tg.MainButton.setParams({color: '#00f0ff', text_color: '#000000'}); }\n                else { tg.MainButton.disable(); tg.MainButton.setParams({color: '#2a2a2a', text_color: '#888888'}); }\n            }\n        }\n\n        async function confirmFocusSelection() {\n            if (selectedFocus.length !== 8) return;\n            const isTgApp = tg && tg.platform && tg.platform !== 'unknown';\n            if (isTgApp && tg.MainButton) tg.MainButton.showProgress();\n            try {\n                await fetch(`${apiBase}\/kingdom\/save_focus`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ areas: selectedFocus }) });\n                if (isTgApp && tg.MainButton) tg.MainButton.hideProgress();\n                showView('view-result');\n                renderFinalResult();\n            } catch (e) { alert(ozgI18n.errorConnection); updateSelectionUI(); }\n        }\n\n        \/\/ ==========================================\n        \/\/ FEED FUNCTIONS\n        \/\/ ==========================================\n\n        let _feedAbortCtrl = null;\n        let isFeedLoading = false;\n        let currentFeedPage = 1;\n        let currentFeedSearch = '';\n        let currentFeedTag = '';\n        let hasMoreFeed = true;\n        let feedSearchTimeout = null;\n\n        let prefetchObserver;\n        const prefetchedUrls = new Set();\n        function initLinkPrefetcher() {\n            if (!window.IntersectionObserver) return;\n            prefetchObserver = new IntersectionObserver((entries, observer) => {\n                entries.forEach(entry => {\n                    if (entry.isIntersecting) {\n                        const card = entry.target;\n                        const url = card.getAttribute('href');\n                        if (url && url !== 'javascript:void(0);' && !prefetchedUrls.has(url)) {\n                            prefetchedUrls.add(url);\n                            const link = document.createElement('link');\n                            link.rel = 'prefetch';\n                            link.href = url;\n                            document.head.appendChild(link);\n                        }\n                        observer.unobserve(card);\n                    }\n                });\n            }, { rootMargin: '100px' });\n        }\n\n        let feedLoadObserver = new IntersectionObserver((entries) => {\n            entries.forEach(entry => {\n                if (entry.isIntersecting && !isFeedLoading && hasMoreFeed) {\n                    loadSmartFeed(false);\n                }\n            });\n        }, { rootMargin: '600px' });\n\n        function debounceFeedSearch() {\n            clearTimeout(feedSearchTimeout);\n            feedSearchTimeout = setTimeout(() => {\n                currentFeedSearch = document.getElementById('ozgFeedSearch').value;\n                loadSmartFeed(true);\n            }, 500);\n        }\n\n        function setFeedTag(tag, btnElement) {\n            document.querySelectorAll('.ozg-feed-tag-btn').forEach(b => b.classList.remove('active'));\n            btnElement.classList.add('active');\n            currentFeedTag = tag;\n            loadSmartFeed(true);\n        }\n\n        function initStickyFeedHeader() {\n            const stickyHeader = document.getElementById('ozgStickyFeedHeader');\n            const kingdomSection = document.getElementById('kingdom');\n            const resultView = document.getElementById('view-result');\n            const feedWrapper = document.querySelector('.ozg-feed-content-wrapper');\n\n            if (!stickyHeader || !kingdomSection) return;\n\n            const checkVisibility = () => {\n                const isKingdomActive = kingdomSection.classList.contains('active');\n                if (isKingdomActive) {\n                    stickyHeader.style.display = 'block';\n                } else {\n                    stickyHeader.style.display = 'none';\n                }\n            };\n            checkVisibility();\n            const observer = new MutationObserver(checkVisibility);\n            observer.observe(kingdomSection, { attributes: true, attributeFilter: ['class'] });\n            if (resultView) observer.observe(resultView, { attributes: true, attributeFilter: ['class'] });\n        }\n\n        function debounceFeedSearchSticky() {\n            clearTimeout(feedSearchTimeout);\n            feedSearchTimeout = setTimeout(() => {\n                currentFeedSearch = document.getElementById('ozgFeedSearchSticky').value;\n                const orig = document.getElementById('ozgFeedSearch');\n                if (orig) orig.value = currentFeedSearch;\n                loadSmartFeed(true);\n            }, 500);\n        }\n\n        function setFeedTagSticky(tag, btnElement) {\n            document.querySelectorAll('#ozgStickyFeedHeader .ozg-feed-tag-btn').forEach(b => b.classList.remove('active'));\n            btnElement.classList.add('active');\n            currentFeedTag = tag;\n            loadSmartFeed(true);\n        }\n\n        setTimeout(initStickyFeedHeader, 100);\n\n        function ozgBuyCourse(courseId, checkoutUrl) {\n            if (ozgI18n.isGuest) return ozgShowSignUpPrompt();\n            ozgCloseAllModals();\n\n            if (checkoutUrl && checkoutUrl !== '#' && !checkoutUrl.includes('\/courses\/')) {\n                if (typeof ozgOpenPageInDashboard === 'function') {\n                    ozgOpenPageInDashboard(0, 'Checkout', checkoutUrl);\n                } else {\n                    window.location.href = checkoutUrl;\n                }\n            } else {\n                const target = `\/checkout\/?add-to-cart=${courseId}`;\n                if (typeof ozgOpenPageInDashboard === 'function') {\n                    ozgOpenPageInDashboard(0, 'Checkout', target);\n                } else {\n                    window.location.href = target;\n                }\n            }\n        }\n\n        function ozgIsTelegramMiniApp() {\n            const t = window.Telegram && window.Telegram.WebApp;\n            return !!(t && t.platform && t.platform !== 'unknown');\n        }\n\n        \/\/ CSS-based fullscreen: works in Telegram's WebView where the native Fullscreen API is blocked\n        function ozgSetCssFullscreen(card, btn, on) {\n            if (!card) return;\n            card.classList.toggle('ozg-fullscreen-active', on);\n            document.body.classList.toggle('ozg-fs-lock', on);\n            \/\/ position:fixed breaks under ancestors with transform\/filter\/contain, so neutralise them while active\n            for (let el = card.parentElement; el && el !== document.documentElement; el = el.parentElement) {\n                el.classList.toggle('ozg-fs-ancestor', on);\n            }\n            if (btn) {\n                btn.innerHTML = on ? '<i data-lucide=\"minimize\" style=\"width:16px; height:16px;\"><\/i>' : '<i data-lucide=\"maximize\" style=\"width:16px; height:16px;\"><\/i>';\n            }\n            try {\n                const tg = window.Telegram && window.Telegram.WebApp;\n                if (tg && ozgIsTelegramMiniApp()) {\n                    if (on) {\n                        if (tg.requestFullscreen && tg.isVersionAtLeast && tg.isVersionAtLeast('8.0')) tg.requestFullscreen();\n                        if (tg.expand) tg.expand();\n                    } else if (tg.exitFullscreen && tg.isFullscreen) {\n                        tg.exitFullscreen();\n                    }\n                }\n            } catch (err) { console.warn('Telegram fullscreen failed', err); }\n            if (typeof lucide !== 'undefined') lucide.createIcons();\n        }\n\n        function ozgToggleMediaFullscreen(btn) {\n            if (!btn) return;\n            const card = btn.closest('.ozg-feed-card, .ozg-profile-post-item, .ozg-video-container') || btn.parentElement;\n            const isActive = card.classList.contains('ozg-fullscreen-active');\n            const video = card.querySelector('video');\n\n            \/\/ Native fullscreen only outside Telegram; inside the Mini App use CSS fullscreen + Telegram fullscreen\n            if (!isActive && video && !ozgIsTelegramMiniApp()) {\n                try {\n                    if (video.webkitEnterFullscreen) { video.webkitEnterFullscreen(); return; }\n                    if (video.requestFullscreen) {\n                        const pr = video.requestFullscreen();\n                        if (pr && pr.catch) pr.catch(() => ozgSetCssFullscreen(card, btn, true));\n                        return;\n                    }\n                } catch (err) { \/* fall through to CSS fullscreen *\/ }\n            }\n            ozgSetCssFullscreen(card, btn, !isActive);\n        }\n\n        function ozgPlayFeedMedia(e, btn, mediaDataEncoded, postId) {\n            e.preventDefault();\n            e.stopPropagation();\n\n            let mediaData;\n            try {\n                mediaData = JSON.parse(atob(mediaDataEncoded));\n            } catch(ex) {\n                console.error('Failed to parse media data');\n                return;\n            }\n\n            \/\/ A PDF\/PowerPoint lesson reads as a book with pages - that needs the full lesson modal,\n            \/\/ not the small in-card player.\n            if (mediaData.media_type === 'document') {\n                ozgOpenLessonModal(mediaData.lesson_id || postId);\n                return;\n            }\n\n            const card = btn.closest('.ozg-feed-card, .ozg-profile-post-item') || btn.parentElement;\n            const mediaContainer = card.querySelector('.ozg-feed-media-container') || card;\n            const navOverlay = card.querySelector('.ozg-feed-nav-overlay');\n\n            if (navOverlay) navOverlay.style.display = 'none';\n            btn.style.display = 'none';\n            card.classList.add('is-playing');\n\n            if (mediaData.media_type === 'audio') {\n                card.classList.add('is-audio-playing');\n            }\n\n            \/\/ Auto-enroll user in course if not enrolled\n            if (!ozgI18n.isGuest && postId) {\n                fetch(`${apiBase}\/program\/subscribe`, {\n                    method: 'POST',\n                    headers: {'Content-Type':'application\/json','X-WP-Nonce': nonce},\n                    body: JSON.stringify({ program_id: postId, coach_id: 0 })\n                }).catch(err => console.error('Auto-enroll error:', err));\n            }\n\n            \/\/ Create pause button overlay\n            const pauseOverlay = document.createElement('div');\n            pauseOverlay.className = 'ozg-feed-pause-btn';\n            pauseOverlay.style.cssText = 'position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); width:60px; height:60px; background:rgba(0,0,0,0.5); border-radius:50%; display:flex; align-items:center; justify-content:center; z-index:15; cursor:pointer; opacity:0; transition:opacity 0.3s;';\n            pauseOverlay.innerHTML = '<i data-lucide=\"pause\" style=\"width:30px; height:30px; color:#fff; fill:#fff;\"><\/i>';\n            card.appendChild(pauseOverlay);\n\n            \/\/ Add Fullscreen toggle button\n            const fsBtn = document.createElement('button');\n            fsBtn.className = 'ozg-media-fs-btn';\n            fsBtn.title = 'Fullscreen';\n            fsBtn.style.cssText = 'position:absolute; top:12px; right:12px; z-index:25; background:rgba(0,0,0,0.7); border:1px solid rgba(255,255,255,0.3); color:#fff; border-radius:50%; width:34px; height:34px; display:flex; align-items:center; justify-content:center; cursor:pointer; backdrop-filter:blur(4px);';\n            fsBtn.innerHTML = '<i data-lucide=\"maximize\" style=\"width:16px; height:16px; color:#fff;\"><\/i>';\n            fsBtn.onclick = (ex) => {\n                ex.stopPropagation();\n                ozgToggleMediaFullscreen(fsBtn);\n            };\n            card.appendChild(fsBtn);\n\n            if (typeof lucide !== 'undefined') lucide.createIcons();\n\n            card.addEventListener('mouseenter', () => pauseOverlay.style.opacity = '1');\n            card.addEventListener('mouseleave', () => pauseOverlay.style.opacity = '0');\n\n            mediaContainer.insertAdjacentHTML('beforeend', mediaData.embed);\n\n            const video = mediaContainer.querySelector('video');\n            const audio = mediaContainer.querySelector('audio');\n            const media = video || audio;\n\n            if (media) {\n                media.play().catch(ex => console.log('Autoplay prevented:', ex));\n\n                pauseOverlay.onclick = (ex) => {\n                    ex.stopPropagation();\n                    if (media.paused) {\n                        media.play();\n                        pauseOverlay.innerHTML = '<i data-lucide=\"pause\" style=\"width:30px; height:30px; color:#fff; fill:#fff;\"><\/i>';\n                    } else {\n                        media.pause();\n                        pauseOverlay.innerHTML = '<i data-lucide=\"play\" style=\"width:30px; height:30px; color:#fff; fill:#fff; margin-left:4px;\"><\/i>';\n                    }\n                    if (typeof lucide !== 'undefined') lucide.createIcons();\n                };\n\n                media.onended = () => {\n                    const completionId = mediaData.lesson_id || postId;\n                    console.log('Media ended, completing content:', completionId);\n                    if (completionId) ozgMarkLessonComplete(null, completionId);\n                    card.classList.remove('is-playing');\n                    card.classList.remove('is-audio-playing');\n                    pauseOverlay.remove();\n                    if (card.classList.contains('ozg-fullscreen-active')) ozgSetCssFullscreen(card, null, false);\n                    fsBtn.remove();\n                    if (navOverlay) navOverlay.style.display = 'block';\n                    btn.style.display = 'flex';\n                };\n            }\n        }\n                \/\/ ==========================================\n        \/\/ KINGDOM TEST FUNCTION\n        \/\/ ==========================================\n\n        function ozgOpenKingdomTest() {\n            \/\/ Open elementor popup with ID 13818\n            const popupId = '13818';\n            if (typeof elementorFrontend !== 'undefined' && elementorFrontend.documentsManager) {\n                const popup = elementorFrontend.documentsManager.documents[popupId];\n                if (popup) {\n                    popup.showModal();\n                } else {\n                    const popupElement = document.querySelector(`[data-elementor-popup-id=\"${popupId}\"]`);\n                    if (popupElement) {\n                        popupElement.click();\n                    } else {\n                        showHeaderToast('Kingdom Test is loading. Please try again.');\n                    }\n                }\n            } else {\n                showHeaderToast('Please wait for page to fully load.');\n            }\n        }\n\n        \/\/ ==========================================\n        \/\/ INDUSTRY QUIZ FUNCTION\n        \/\/ ==========================================\n\n        function ozgOpenIndustryQuiz() {\n            const modal = document.getElementById('ozgIndustryQuizModal');\n            if (modal) {\n                modal.classList.add('show');\n                \/\/ Re-initialize Forminator quiz if needed\n                if (typeof Forminator !== 'undefined' && Forminator.modules) {\n                    setTimeout(() => {\n                        if (typeof jQuery !== 'undefined') {\n                            jQuery(document).trigger('after.load.forminator');\n                        }\n                    }, 100);\n                }\n            }\n        }\n\n        \/\/ ==========================================\n        \/\/ HABIT TRACKER FUNCTIONS\n        \/\/ ==========================================\n\n        let currentTrackerView = 'daily';\n\n        async function loadHabitTracker(view = 'daily', btnElement = null) {\n                    currentTrackerView = view;\n\n                    \/\/ Update active button state\n                    if (btnElement) {\n                        document.querySelectorAll('.tracker-view-btn').forEach(btn => {\n                            btn.classList.remove('active');\n                        });\n                        btnElement.classList.add('active');\n                    }\n\n                    const container = document.getElementById('habit-tracker-table-wrap');\n                    if (!container) return;\n\n                    container.innerHTML = '<div style=\"text-align:center; padding: 40px;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; color:var(--accent-cyan);\"><\/i><\/div>';\n                    lucide.createIcons();\n\n                    try {\n                        const res = await fetch(`${apiBase}\/journal\/tracker_data`, { headers: {'X-WP-Nonce': nonce} });\n                        const data = await res.json();\n\n                        if (!data.habits || data.habits.length === 0) {\n                            container.innerHTML = `<div style=\"text-align:center; color:var(--text-muted); padding: 40px; background: rgba(255,255,255,0.02); border-radius: 16px;\">${ozgI18n.noHabits}<\/div>`;\n                            return;\n                        }\n\n                        let dates = [];\n                        let dateHeaders = [];\n                        let dateKeys = [];\n\n                        if (view === 'daily') {\n                            \/\/ Get current week dates\n                            const today = new Date();\n                            const dayOfWeek = today.getDay();\n                            const monday = new Date(today);\n                            monday.setDate(today.getDate() - (dayOfWeek === 0 ? 6 : dayOfWeek - 1));\n\n                            for (let i = 0; i < 7; i++) {\n                                const d = new Date(monday);\n                                d.setDate(monday.getDate() + i);\n                                const key = `${d.getFullYear()}_${String(d.getMonth() + 1).padStart(2, '0')}_${String(d.getDate()).padStart(2, '0')}`;\n                                dateKeys.push(key);\n                                dateHeaders.push({\n                                    label: d.toLocaleDateString('en-US', { weekday: 'short' }),\n                                    day: d.getDate(),\n                                    isToday: i === dayOfWeek - 1 || (dayOfWeek === 0 && i === 6)\n                                });\n                            }\n                        } else if (view === 'weekly') {\n                            \/\/ Get last 4 weeks\n                            const today = new Date();\n                            for (let i = 3; i >= 0; i--) {\n                                const d = new Date(today);\n                                d.setDate(today.getDate() - (i * 7));\n                                const weekNum = getWeekNumber(d);\n                                dateKeys.push(`${d.getFullYear()}_W${weekNum}`);\n                                dateHeaders.push({\n                                    label: `Week ${weekNum}`,\n                                    day: `${d.getMonth() + 1}\/${d.getDate()}`,\n                                    isToday: i === 0\n                                });\n                            }\n                        } else if (view === 'monthly') {\n                            \/\/ Get last 3 months\n                            const today = new Date();\n                            for (let i = 2; i >= 0; i--) {\n                                const d = new Date(today);\n                                d.setMonth(today.getMonth() - i);\n                                const monthKey = `${d.getFullYear()}_${String(d.getMonth() + 1).padStart(2, '0')}`;\n                                dateKeys.push(monthKey);\n                                dateHeaders.push({\n                                    label: d.toLocaleDateString('en-US', { month: 'short' }),\n                                    day: d.getFullYear(),\n                                    isToday: i === 0\n                                });\n                            }\n                        }\n\n                        let html = `<table class=\"tracker-table\"><thead><tr><th style=\"text-align:left;\">${ozgI18n.habits}<\/th>`;\n                        dateHeaders.forEach(h => {\n                            html += `<th style=\"text-align:center; min-width:32px;\">\n                                <div class=\"day-label\">${h.label}<\/div>\n                                <div class=\"day-number\" style=\"${h.isToday ? 'color:var(--accent-cyan); font-weight:800;' : ''}\">${h.day}<\/div>\n                            <\/th>`;\n                        });\n                        html += `<\/tr><\/thead><tbody>`;\n\n                        for (const habit of data.habits) {\n                            const freq = habit.freq;\n                            let completionMap = {};\n\n                            if (freq === 'daily') {\n                                completionMap = habit.completion;\n                            } else if (freq === 'weekly') {\n                                \/\/ For weekly habits, check completion for each week\n                                for (const dateKey of dateKeys) {\n                                    const weekMatch = dateKey.match(\/(\\d+)_W(\\d+)\/);\n                                    if (weekMatch) {\n                                        const year = weekMatch[1];\n                                        const week = weekMatch[2];\n                                        const wkKey = `${year}_W${week}`;\n                                        const isDone = habit.completion[wkKey] || false;\n                                        completionMap[dateKey] = isDone;\n                                    } else {\n                                        completionMap[dateKey] = false;\n                                    }\n                                }\n                            } else if (freq === 'monthly') {\n                                \/\/ For monthly habits\n                                for (const dateKey of dateKeys) {\n                                    const monthMatch = dateKey.match(\/(\\d+)_(\\d+)\/);\n                                    if (monthMatch) {\n                                        const monthKey = dateKey;\n                                        const isDone = habit.completion[monthKey] || false;\n                                        completionMap[dateKey] = isDone;\n                                    } else {\n                                        completionMap[dateKey] = false;\n                                    }\n                                }\n                            }\n\n                            const aliasDisplay = habit.alias.length > 22 ? habit.alias.substring(0, 22) + '\u2026' : habit.alias;\n                            const freqColor = freq === 'daily' ? 'var(--accent-cyan)' : freq === 'weekly' ? 'var(--accent-purple)' : '#eab308';\n\n                            html += `<tr><td class=\"habit-name-cell\">\n                                <span class=\"habit-alias\" title=\"${escapeHtml(habit.alias)}\">${escapeHtml(aliasDisplay)}<\/span>\n                                <button class=\"edit-alias-btn\" onclick=\"editHabitAlias(${habit.id}, '${escapeHtml(habit.alias).replace(\/'\/g, \"\\\\\\'\")}')\"><i data-lucide=\"edit-2\" style=\"width:11px;\"><\/i><\/button>\n        <!-- freq badge removed to clean up habit name cell -->\n                            <\/td>`;\n\n                            for (let i = 0; i < dateKeys.length; i++) {\n                                const dateKey = dateKeys[i];\n                                const isDone = completionMap[dateKey] || false;\n                                html += `<td><div class=\"tracker-cell ${isDone ? 'completed' : ''}\" onclick=\"toggleTrackerHabit(${habit.id}, '${dateKey}', this, '${freq}')\"><\/div><\/td>`;\n                            }\n                            html += `<\/tr>`;\n                        }\n\n                        html += `<\/tbody><\/table>`;\n                        container.innerHTML = html;\n                        lucide.createIcons();\n\n                    } catch (e) {\n                        console.error('Tracker error:', e);\n                        container.innerHTML = `<div style=\"text-align:center; color:var(--warning-color); padding: 20px;\">${ozgI18n.errorConnection}<\/div>`;\n                    }\n                }\n\n        ozgHandleDeepLink();\n\n        function getWeekNumber(date) {\n            const d = new Date(date);\n            d.setHours(0, 0, 0, 0);\n            d.setDate(d.getDate() + 3 - (d.getDay() + 6) % 7);\n            const week1 = new Date(d.getFullYear(), 0, 4);\n            return 1 + Math.round(((d - week1) \/ 86400000 - 3 + (week1.getDay() + 6) % 7) \/ 7);\n        }\n\n        async function editHabitAlias(id, currentAlias) {\n            const newAlias = prompt(ozgI18n.habitNamePrompt, currentAlias);\n            if (newAlias !== null && newAlias.trim() !== \"\") {\n                await fetch(`${apiBase}\/habit\/set_alias`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ habit_id: id, alias: newAlias.trim() }) });\n                loadHabitTracker(currentTrackerView);\n            }\n        }\n\n        async function toggleTrackerHabit(id, dateKey, el, freq) {\n            el.classList.toggle('completed');\n            let timeKey = dateKey;\n            await fetch(`${apiBase}\/habit\/toggle`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ habit_id: id, date: timeKey }) });\n        }\n\n        \/\/ ==========================================\n        \/\/ P2P CAMPAIGN FUNCTIONS\n        \/\/ ==========================================\n\n        function ozgOpenP2PModalExpanded(encodedHtml, campaignTitle, authorName, likesCount, campaignId) {\n            ozgCloseAllModals();\n            let campaignContent = atob(encodedHtml);\n\n            const modal = document.getElementById('ozgP2PModal');\n            const contentContainer = document.getElementById('ozgP2PContent');\n\n            window.currentP2PCampaign = {\n                id: campaignId,\n                title: campaignTitle,\n                author: authorName,\n                likes: likesCount\n            };\n\n            const enhancedContent = `\n                <div style=\"position: sticky; top: 0; left: 0; right: 0; z-index: 100; display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; background: rgba(255,255,255,0.95); backdrop-filter: blur(8px); margin-bottom: -52px; pointer-events: none; border-bottom: 1px solid #e5e7eb;\">\n                    <div style=\"display: flex; gap: 8px; pointer-events: auto;\">\n                        <button class=\"ozg-icon-btn\" title=\"Open list\" style=\"background: #f3f4f6; color:#374151;\" onclick=\"ozgOpenPostTypeFilter('finance')\"><i data-lucide=\"list\"><\/i><\/button>\n                        <button class=\"ozg-icon-btn\" title=\"Share\" style=\"background: #f3f4f6; color:#374151;\" onclick=\"ozgShareFeedCard(${campaignId}, '${campaignTitle.replace(\/'\/g, \"\\\\'\").replace(\/\"\/g, '&quot;')}')\"><i data-lucide=\"share-2\"><\/i><\/button>\n                        <button class=\"ozg-icon-btn\" title=\"Send as gift\" style=\"background: #f3f4f6; color:#374151;\" onclick=\"alert('Gifting functionality coming soon!')\"><i data-lucide=\"gift\"><\/i><\/button>\n                    <\/div>\n                    <button class=\"ozg-quiz-close\" style=\"pointer-events: auto; position: relative; right: 0; top: 0; background: #f3f4f6; color:#374151;\" onclick=\"document.getElementById('ozgP2PModal').classList.remove('show')\"><i data-lucide=\"x\"><\/i><\/button>\n                <\/div>\n                <div class=\"ozg-p2p-campaign-wrapper\" style=\"padding-top: 52px;\">\n                    <div class=\"ozg-p2p-campaign-header\" style=\"margin-bottom: 24px; padding-bottom: 16px; border-bottom: 1px solid #e5e7eb;\">\n                        <div style=\"display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 16px;\">\n                            <div class=\"ozg-p2p-author\" style=\"display: flex; align-items: center; gap: 12px;\">\n                                <img decoding=\"async\" src=\"https:\/\/www.gravatar.com\/avatar\/${campaignId}?s=48&d=mp\" style=\"width: 48px; height: 48px; border-radius: 50%; object-fit: cover; border: 2px solid #22c55e;\">\n                                <div>\n                                    <div style=\"font-weight: 700; color: #111827; font-size: 1rem;\">${escapeHtml(authorName)}<\/div>\n                                    <div style=\"font-size: 0.75rem; color: #6b7280;\">Campaign Organizer<\/div>\n                                <\/div>\n                            <\/div>\n                            <div class=\"ozg-p2p-stats\" style=\"display: flex; gap: 20px;\">\n                                <div style=\"display: flex; align-items: center; gap: 6px; color: #ef4444; background: #fef2f2; padding: 6px 12px; border-radius: 20px;\">\n                                    <i data-lucide=\"heart\" style=\"width: 16px; fill: currentColor;\"><\/i>\n                                    <span id=\"ozg-p2p-likes-${campaignId}\" style=\"font-weight: 600;\">${likesCount || 0}<\/span>\n                                <\/div>\n                                <div style=\"display: flex; align-items: center; gap: 6px; color: #8b5cf6; background: #f5f3ff; padding: 6px 12px; border-radius: 20px;\">\n                                    <i data-lucide=\"share-2\" style=\"width: 16px;\"><\/i>\n                                    <span id=\"ozg-p2p-shares-${campaignId}\" style=\"font-weight: 600;\">0<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div id=\"ozg-p2p-campaign-body-${campaignId}\" class=\"ozg-p2p-campaign-body\" style=\"margin-bottom: 24px; min-height: 200px;\">\n                        ${campaignContent}\n                    <\/div>\n\n                    <div class=\"ozg-p2p-actions\" style=\"margin-top: 24px; padding-top: 20px; border-top: 1px solid #e5e7eb; display: flex; gap: 12px; justify-content: flex-end;\">\n                        <button class=\"ozg-p2p-share-btn\" onclick=\"ozgShareFeedCard(${campaignId}, '${campaignTitle.replace(\/'\/g, \"\\\\'\").replace(\/\"\/g, '&quot;')}')\" style=\"background: #f3f4f6; border: none; padding: 10px 20px; border-radius: 40px; cursor: pointer; display: flex; align-items: center; gap: 8px; font-weight: 600; color: #374151; transition: all 0.2s;\">\n                            <i data-lucide=\"share-2\" style=\"width: 18px;\"><\/i> Share Campaign\n                        <\/button>\n                        <button class=\"ozg-p2p-like-btn\" onclick=\"ozgLikeP2PCampaign(${campaignId}, this)\" style=\"background: #f3f4f6; border: none; padding: 10px 20px; border-radius: 40px; cursor: pointer; display: flex; align-items: center; gap: 8px; font-weight: 600; color: #ef4444; transition: all 0.2s;\">\n                            <i data-lucide=\"heart\" style=\"width: 18px;\"><\/i> Support This Campaign\n                        <\/button>\n                    <\/div>\n                <\/div>\n            `;\n\n            contentContainer.innerHTML = enhancedContent;\n            modal.classList.add('show');\n\n            if (typeof lucide !== 'undefined') lucide.createIcons();\n\n            setTimeout(() => {\n                const campaignBody = document.getElementById(`ozg-p2p-campaign-body-${campaignId}`);\n                if (campaignBody) {\n                    const scripts = campaignBody.getElementsByTagName('script');\n                    for (let i = 0; i < scripts.length; i++) {\n                        const oldScript = scripts[i];\n                        const newScript = document.createElement('script');\n                        for (let j = 0; j < oldScript.attributes.length; j++) {\n                            newScript.setAttribute(oldScript.attributes[j].name, oldScript.attributes[j].value);\n                        }\n                        newScript.innerHTML = oldScript.innerHTML;\n                        oldScript.parentNode.replaceChild(newScript, oldScript);\n                    }\n                    if (typeof give !== 'undefined' && give.init) give.init();\n                    if (typeof jQuery !== 'undefined') jQuery(document).trigger('ready');\n                    const giveForms = campaignBody.querySelectorAll('.give-form, .give-embed-form');\n                    giveForms.forEach(form => {\n                        if (typeof jQuery !== 'undefined') jQuery(form).trigger('give_init');\n                    });\n                }\n            }, 100);\n\n            if (!campaignContent || campaignContent.trim() === '' || campaignContent.length < 50) {\n                fetchFreshP2PCampaignContent(campaignId);\n            }\n        }\n\n        async function fetchFreshP2PCampaignContent(campaignId) {\n            try {\n                const resp = await fetch(`${apiBase}\/p2p\/campaign\/${campaignId}`, {\n                    headers: { 'X-WP-Nonce': nonce }\n                });\n                const data = await resp.json();\n                if (data.success && data.content) {\n                    const campaignBody = document.getElementById(`ozg-p2p-campaign-body-${campaignId}`);\n                    if (campaignBody) {\n                        campaignBody.innerHTML = data.content;\n                        if (typeof lucide !== 'undefined') lucide.createIcons();\n                    }\n                }\n            } catch (e) {\n                console.error('Failed to fetch fresh campaign content:', e);\n            }\n        }\n\n        function ozgCloseAllModals() {\n            const overlays = document.querySelectorAll('.ozg-modal-overlay, .ozg-quiz-modal-overlay, .ozg-fs-modal');\n            overlays.forEach(overlay => {\n                overlay.classList.remove('show', 'active');\n                if (overlay.id === 'ozgFsModal') {\n                    overlay.classList.remove('ozg-fs-minimised');\n                }\n            });\n            \/\/ Stop any playing media in feed cards if necessary\n            document.querySelectorAll('.ozg-feed-card.is-playing').forEach(card => {\n                card.classList.remove('is-playing');\n                const video = card.querySelector('video');\n                const audio = card.querySelector('audio');\n                if (video) video.pause();\n                if (audio) audio.pause();\n            });\n            \/\/ Re-enable body scroll if it was locked\n            document.body.classList.remove('tutor-modal-open');\n            if (typeof ozgCloseBookLightbox === 'function') ozgCloseBookLightbox();\n        }\n\n        function ozgToggleTopicAccordion(headerEl) {\n            const accordion = headerEl.closest('.ozg-topic-accordion');\n            if (!accordion) return;\n            const body = accordion.querySelector('.ozg-topic-body');\n            const chevron = accordion.querySelector('.ozg-topic-chevron');\n            if (!body) return;\n\n            const isHidden = (body.style.display === 'none');\n            body.style.display = isHidden ? 'flex' : 'none';\n            if (chevron) {\n                chevron.style.transform = isHidden ? 'rotate(0deg)' : 'rotate(-90deg)';\n            }\n        }\n\n        async function ozgOpenCourseModal(courseId) {\n            ozgCloseAllModals();\n            const modal = document.getElementById('ozgCourseModal');\n            const content = document.getElementById('ozgCourseModalContent');\n            modal.classList.add('show');\n            content.innerHTML = '<div style=\"text-align:center; padding: 100px;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; color:var(--accent-cyan); width:40px; height:40px;\"><\/i><\/div>';\n            lucide.createIcons();\n\n            try {\n                const resp = await fetch(`${apiBase}\/course\/details\/${courseId}`, { headers: {'X-WP-Nonce': nonce} });\n                if (!resp.ok) { throw new Error('Network response was not ok'); }\n                const data = await resp.json();\n\n                if (!data.success) {\n                    content.innerHTML = `<div style=\"padding: 40px; text-align: center;\">${data.message || 'Course not found.'}<\/div>`;\n                    showHeaderToast(data.message || 'Error');\n                    return;\n                }\n\n                let html = `\n                    <div style=\"position: sticky; top: 0; left: 0; right: 0; z-index: 100; display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; background: linear-gradient(to bottom, rgba(15,18,30,0.95) 60%, transparent); backdrop-filter: blur(8px); margin-bottom: -52px; pointer-events: none;\">\n                        <div style=\"display: flex; gap: 8px; pointer-events: auto;\">\n                            <button class=\"ozg-icon-btn\" title=\"Open list\" style=\"background: rgba(0,0,0,0.65); backdrop-filter: blur(4px);\" onclick=\"ozgOpenPostTypeFilter('courses')\"><i data-lucide=\"list\"><\/i><\/button>\n                            <button class=\"ozg-icon-btn\" title=\"Share\" style=\"background: rgba(0,0,0,0.65); backdrop-filter: blur(4px);\" onclick=\"ozgShareFeedCard(${courseId}, '${data.title.replace(\/'\/g, \"\\\\'\").replace(\/\"\/g, '&quot;')}', '${data.slug || ''}')\"><i data-lucide=\"share-2\"><\/i><\/button>\n                            <button class=\"ozg-icon-btn\" title=\"Send as gift\" style=\"background: rgba(0,0,0,0.65); backdrop-filter: blur(4px);\" onclick=\"alert('Gifting functionality coming soon!')\"><i data-lucide=\"gift\"><\/i><\/button>\n                        <\/div>\n                        <button class=\"ozg-quiz-close\" style=\"pointer-events: auto; position: relative; right: 0; top: 0;\" onclick=\"document.getElementById('ozgCourseModal').classList.remove('show')\"><i data-lucide=\"x\"><\/i><\/button>\n                    <\/div>\n                    <div class=\"ozg-course-modal-header\" style=\"background-image: url('${data.thumb || ''}')\"><\/div>\n                    <div class=\"ozg-course-modal-content\">\n                        <h2 class=\"ozg-course-modal-title\">${escapeHtml(data.title)}<\/h2>\n                        <div class=\"ozg-course-description\" style=\"max-height: 300px; overflow-y: auto; margin-bottom: 20px;\">${data.content}<\/div>\n                `;\n\n                if (data.is_enrolled && data.habits && data.habits.length > 0) {\n                    html += `\n                        <div style=\"margin-bottom: 24px;\">\n                            <h4 class=\"ozg-course-section-title\"><i data-lucide=\"calendar\"><\/i> ${ozgI18n.habits || 'Habits'}<\/h4>\n                            <div style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px;\">\n                                ${data.habits.map(h => `\n                                    <div class=\"ozg-habit-card ${h.completed ? 'completed' : ''}\" onclick=\"ozgToggleHabit(this, ${h.id})\">\n                                        <div class=\"ozg-habit-check\"><\/div>\n                                        <div style=\"flex:1;\"><div class=\"ozg-habit-title\" style=\"color:#fff; font-size:0.85rem;\">${escapeHtml(h.title)}<\/div><\/div>\n                                    <\/div>\n                                `).join('')}\n                            <\/div>\n                        <\/div>\n                    `;\n                }\n\n                \/\/ Render Curriculum Chapters and Items (Lessons, Quizzes, Assignments)\n                if (data.curriculum && data.curriculum.length > 0) {\n                    let totalItemIdx = 0;\n                    data.curriculum.forEach((ch, chIdx) => {\n                        const isFirst = (chIdx === 0);\n                        html += `<div style=\"margin-top:16px;\" class=\"ozg-topic-accordion\">`;\n                        if (ch.title) {\n                            html += `<div class=\"ozg-topic-header\" onclick=\"ozgToggleTopicAccordion(this)\" style=\"color:#fff; font-size:0.92rem; font-weight:700; padding:12px 16px; background:rgba(255,255,255,0.05); border:1px solid var(--glass-border); border-radius:12px; margin-bottom:8px; display:flex; align-items:center; justify-content:space-between; cursor:pointer; user-select:none; transition:background 0.2s;\">\n                                <div style=\"display:flex; align-items:center; gap:8px;\">\n                                    <i data-lucide=\"folder\" style=\"width:16px; height:16px; color:var(--accent-cyan);\"><\/i>\n                                    <span>${escapeHtml(ch.title)}<\/span>\n                                    <span style=\"font-size:0.7rem; color:var(--text-muted); font-weight:500;\">(${ch.items ? ch.items.length : 0})<\/span>\n                                <\/div>\n                                <i data-lucide=\"chevron-down\" class=\"ozg-topic-chevron\" style=\"width:16px; height:16px; color:var(--accent-cyan); transition:transform 0.3s; transform:${isFirst ? 'rotate(0deg)' : 'rotate(-90deg)'};\"><\/i>\n                            <\/div>`;\n                        }\n                        if (ch.items && ch.items.length > 0) {\n                            html += `<div class=\"ozg-topic-body\" style=\"display:${isFirst ? 'flex' : 'none'}; flex-direction:column; gap:8px;\">`;\n                            ch.items.forEach(item => {\n                                totalItemIdx++;\n                                const isComp = item.is_completed || item.completed;\n                                const typeIcon = item.type === 'tutor_quiz' ? 'help-circle' : (item.type === 'tutor_assignments' ? 'file-text' : 'play-circle');\n                                const typeBadge = item.type === 'tutor_quiz' ? 'QUIZ' : (item.type === 'tutor_assignments' ? 'ASSIGNMENT' : 'LESSON');\n\n                                html += `\n                                    <div class=\"ozg-milestone\" style=\"background:rgba(255,255,255,0.03); border:1px solid var(--glass-border); border-radius:12px; padding:12px 16px; display:flex; align-items:center; justify-content:space-between; gap:12px; cursor:pointer;\" onclick=\"ozgOpenLessonModal(${item.id})\">\n                                        <div style=\"display:flex; align-items:center; gap:12px; flex:1; min-width:0;\">\n                                            <div style=\"width:28px; height:28px; border-radius:50%; background:${isComp ? 'rgba(0,230,118,0.15)' : 'rgba(255,255,255,0.08)'}; display:flex; align-items:center; justify-content:center; flex-shrink:0;\">\n                                                <i data-lucide=\"${isComp ? 'check' : typeIcon}\" style=\"width:16px; height:16px; color:${isComp ? 'var(--success-color)' : 'var(--accent-cyan)'};\"><\/i>\n                                            <\/div>\n                                            <div style=\"flex:1; min-width:0;\">\n                                                <div style=\"color:#fff; font-size:0.88rem; font-weight:500; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;\">${totalItemIdx}. ${escapeHtml(item.title)}<\/div>\n                                                <span style=\"font-size:0.65rem; color:var(--text-muted); text-transform:uppercase; font-weight:600;\">${typeBadge}<\/span>\n                                            <\/div>\n                                        <\/div>\n                                        <div style=\"flex-shrink:0;\">\n                                            ${isComp ?\n                                                `<button class=\"ozg-btn-sec\" style=\"padding:6px 12px; font-size:0.75rem; background:rgba(0,230,118,0.1); border-color:var(--success-color); color:var(--success-color); pointer-events:none;\"><i data-lucide=\"check-circle\" style=\"width:12px;\"><\/i> Completed<\/button>` :\n                                                `<button class=\"ozg-btn\" style=\"padding:6px 12px; font-size:0.75rem; pointer-events:none;\"><i data-lucide=\"play\" style=\"width:12px;\"><\/i> Start<\/button>`\n                                            }\n                                        <\/div>\n                                    <\/div>\n                                `;\n                            });\n                            html += `<\/div>`;\n                        }\n                        html += `<\/div>`;\n                    });\n                } else if (data.milestones && data.milestones.length > 0) {\n                    html += `\n                        <div style=\"margin-top: 20px;\">\n                            <h4 class=\"ozg-course-section-title\" style=\"color:var(--accent-cyan); font-size:0.95rem; margin-bottom:12px; display:flex; align-items:center; gap:6px;\"><i data-lucide=\"book-open\" style=\"width:16px;\"><\/i> ${ozgI18n.milestones || 'Lessons'}<\/h4>\n                            <div style=\"display: flex; flex-direction: column; gap: 8px;\">\n                                ${data.milestones.map((m, idx) => `\n                                    <div class=\"ozg-milestone\" style=\"background:rgba(255,255,255,0.03); border:1px solid var(--glass-border); border-radius:12px; padding:12px 16px; display:flex; align-items:center; justify-content:space-between; gap:12px; cursor:pointer;\" onclick=\"ozgOpenLessonModal(${m.id})\">\n                                        <div style=\"display:flex; align-items:center; gap:12px; flex:1; min-width:0;\">\n                                            <div style=\"width:28px; height:28px; border-radius:50%; background:${m.completed ? 'rgba(0,230,118,0.15)' : 'rgba(255,255,255,0.08)'}; display:flex; align-items:center; justify-content:center; flex-shrink:0;\">\n                                                <i data-lucide=\"${m.completed ? 'check' : 'play-circle'}\" style=\"width:16px; height:16px; color:${m.completed ? 'var(--success-color)' : 'var(--accent-cyan)'};\"><\/i>\n                                            <\/div>\n                                            <div style=\"flex:1; min-width:0;\">\n                                                <div style=\"color:#fff; font-size:0.88rem; font-weight:500; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;\">${idx+1}. ${escapeHtml(m.title)}<\/div>\n                                            <\/div>\n                                        <\/div>\n                                        <div style=\"flex-shrink:0;\">\n                                            ${m.completed ?\n                                                `<button class=\"ozg-btn-sec\" style=\"padding:6px 12px; font-size:0.75rem; background:rgba(0,230,118,0.1); border-color:var(--success-color); color:var(--success-color); pointer-events:none;\"><i data-lucide=\"check-circle\" style=\"width:12px;\"><\/i> Completed<\/button>` :\n                                                `<button class=\"ozg-btn\" style=\"padding:6px 12px; font-size:0.75rem; pointer-events:none;\"><i data-lucide=\"play\" style=\"width:12px;\"><\/i> Start<\/button>`\n                                            }\n                                        <\/div>\n                                    <\/div>\n                                `).join('')}\n                            <\/div>\n                        <\/div>\n                    `;\n                }\n\n                if (!data.is_enrolled) {\n                    html += `\n                        <div style=\"text-align: center; margin-top: 28px; padding: 20px; background: rgba(0,0,0,0.3); border-radius: 16px; border: 1px solid var(--accent-cyan);\">\n                            <h4 style=\"margin:0 0 12px 0; color:#fff;\">Enrol in \"${escapeHtml(data.title)}\" to track your progress<\/h4>\n                            ${data.price_type === 'paid' ?\n                                `<button class=\"ozg-btn\" style=\"padding: 14px 28px; font-size: 1rem;\" onclick=\"ozgBuyCourse(${data.id}, '${data.checkout_url || ''}')\"><i data-lucide=\"shopping-cart\"><\/i> Buy Course ${data.price ? '(' + data.price + '\u20b8)' : ''}<\/button>` :\n                                `<button class=\"ozg-btn\" style=\"padding: 14px 28px; font-size: 1rem;\" onclick=\"ozgConfirmSubscribeFromModal(${data.id})\"><i data-lucide=\"play-circle\"><\/i> Enrol Now<\/button>`\n                            }\n                        <\/div>\n                    `;\n                }\n\n                html += `<\/div>`;\n                content.innerHTML = html;\n                lucide.createIcons();\n            } catch(e) { console.error(e); content.innerHTML = '<div style=\"padding: 40px; text-align: center;\">Error loading course details.<\/div>'; }\n        }\n\n        async function ozgConfirmSubscribeFromModal(progId) {\n            if (ozgI18n.isGuest) return ozgShowSignUpPrompt();\n\n            if (!progId || progId <= 0) {\n                const lessonModal = document.getElementById('ozgLessonModal');\n                if (lessonModal) progId = parseInt(lessonModal.getAttribute('data-course-id') || '0');\n            }\n\n            if (!progId || progId <= 0) {\n                showHeaderToast('Course ID not found. Please enrol from the course page.');\n                return;\n            }\n\n            const btn = document.querySelector('#ozgCourseModal .ozg-btn, #ozgLessonModal .ozg-btn');\n            if (btn && btn.getAttribute('data-loading')) return;\n\n            if (btn) {\n                btn.setAttribute('data-loading', 'true');\n                btn.innerHTML = '<i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; width:16px;\"><\/i> Enrolling...';\n                lucide.createIcons();\n            }\n\n            try {\n                const resp = await fetch(`${apiBase}\/program\/subscribe`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({program_id: progId, coach_id: 0}) });\n                const result = await resp.json();\n                if (result.success) {\n                    \/\/ Small delay to ensure DB sync before refresh\n                    setTimeout(() => {\n                        \/\/ If it's a lesson modal being enrolled from, refresh lesson modal\n                        if (document.getElementById('ozgLessonModal').classList.contains('show')) {\n                             const lessonId = document.getElementById('ozgLessonModal').getAttribute('data-lesson-id');\n                             if(lessonId) ozgOpenLessonModal(lessonId);\n                        } else {\n                             ozgOpenCourseModal(progId);\n                        }\n                    }, 500);\n                    showHeaderToast('Successfully enrolled!');\n                } else {\n                    if (btn) {\n                        btn.removeAttribute('data-loading');\n                        btn.innerHTML = '<i data-lucide=\"play-circle\"><\/i> Enrol Now';\n                        lucide.createIcons();\n                    }\n                    alert(result.message || ozgI18n.errorConnection);\n                }\n            } catch(e) {\n                if (btn) {\n                    btn.removeAttribute('data-loading');\n                    btn.innerHTML = '<i data-lucide=\"play-circle\"><\/i> Enrol Now';\n                    lucide.createIcons();\n                }\n                alert(ozgI18n.errorConnection);\n            }\n        }\n\n        async function ozgOpenLessonModal(lessonId) {\n            ozgCloseAllModals();\n            ozgCloseBookLightbox();\n            ozgBookState = null; \/\/ discard any previous lesson's PDF reader state\n            const modal = document.getElementById('ozgLessonModal');\n            const content = document.getElementById('ozgLessonModalContent');\n            if (modal) {\n                modal.classList.add('show');\n                modal.setAttribute('data-lesson-id', lessonId);\n            }\n            if (content) {\n                content.innerHTML = '<div style=\"text-align:center; padding: 100px;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; color:var(--accent-cyan); width:40px; height:40px;\"><\/i><\/div>';\n            }\n            if (typeof lucide !== 'undefined') lucide.createIcons();\n\n            function renderLessonErrorView(message, courseId) {\n                if (!content) return;\n                content.innerHTML = `\n                    <div style=\"position: sticky; top: 0; left: 0; right: 0; z-index: 100; display: flex; justify-content: flex-end; padding: 12px 16px; background: rgba(15,18,30,0.95); backdrop-filter: blur(8px);\">\n                        <button class=\"ozg-quiz-close\" style=\"pointer-events: auto; position: relative; right: 0; top: 0;\" onclick=\"document.getElementById('ozgLessonModal').classList.remove('show')\"><i data-lucide=\"x\"><\/i><\/button>\n                    <\/div>\n                    <div style=\"padding: 60px 24px; text-align: center; color: #fff;\">\n                        <div style=\"width: 60px; height: 60px; border-radius: 50%; background: rgba(255,170,0,0.1); border: 1px solid rgba(255,170,0,0.3); display: flex; align-items: center; justify-content: center; margin: 0 auto 20px auto; color: #ffaa00;\">\n                            <i data-lucide=\"alert-circle\" style=\"width: 30px; height: 30px;\"><\/i>\n                        <\/div>\n                        <h3 style=\"margin: 0 0 10px 0; color: #fff;\">Content Not Found<\/h3>\n                        <p style=\"color: var(--text-muted); font-size: 0.9rem; margin-bottom: 24px;\">${escapeHtml(message || 'The content for this lesson is currently unavailable.')}<\/p>\n                        <div style=\"display: flex; gap: 12px; justify-content: center; flex-wrap: wrap;\">\n                            ${courseId ? `<button class=\"ozg-btn\" onclick=\"ozgOpenCourseModal(${courseId})\"><i data-lucide=\"arrow-left\"><\/i> Back to Course<\/button>` : ''}\n                            <button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgLessonModal').classList.remove('show')\"><i data-lucide=\"x\"><\/i> Close<\/button>\n                        <\/div>\n                    <\/div>\n                `;\n                if (typeof lucide !== 'undefined') lucide.createIcons();\n            }\n\n            try {\n                const resp = await fetch(`${apiBase}\/lesson\/details\/${lessonId}?_=${Date.now()}`, { headers: {'X-WP-Nonce': nonce} });\n                const data = await resp.json();\n\n                if (!data.success) {\n                    if (data.next_id) {\n                        showHeaderToast('Lesson content not found. Opening next lesson...');\n                        setTimeout(() => ozgOpenLessonModal(data.next_id), 600);\n                        return;\n                    } else {\n                        renderLessonErrorView(data.message || 'Content not found', data.course_id || 0);\n                        return;\n                    }\n                }\n\n                if (modal) modal.setAttribute('data-course-id', data.course_id || 0);\n                if (ozgI18n.isGuest && ozgGuestCompleted.has(parseInt(data.id, 10))) data.is_completed = true;\n\n                \/\/ Check if enrolled lesson content is empty and has next_id\n                const isContentEmpty = (!data.content || !data.content.replace(\/<[^>]*>\/g, '').trim()) && !data.video_html && !data.video && !data.audio && !data.document;\n                if (data.is_enrolled && isContentEmpty) {\n                    if (data.next_id) {\n                        showHeaderToast('Lesson empty. Opening next lesson...');\n                        setTimeout(() => ozgOpenLessonModal(data.next_id), 600);\n                        return;\n                    } else {\n                        renderLessonErrorView('Lesson content is empty.', data.course_id || 0);\n                        return;\n                    }\n                }\n\n                const typeLabel = data.type === 'tutor_quiz' ? 'QUIZ' : (data.type === 'tutor_assignments' ? 'ASSIGNMENT' : 'LESSON');\n\n                let html = `\n                    <div style=\"position: sticky; top: 0; left: 0; right: 0; z-index: 100; display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; background: linear-gradient(to bottom, rgba(15,18,30,0.95) 60%, transparent); backdrop-filter: blur(8px); margin-bottom: -52px; pointer-events: none;\">\n                        <div style=\"display: flex; gap: 8px; pointer-events: auto;\">\n                            <button class=\"ozg-icon-btn\" title=\"Open list\" style=\"background: rgba(0,0,0,0.65); backdrop-filter: blur(4px);\" onclick=\"ozgOpenPostTypeFilter('lessons')\"><i data-lucide=\"list\"><\/i><\/button>\n                            <button class=\"ozg-icon-btn\" title=\"Share\" style=\"background: rgba(0,0,0,0.65); backdrop-filter: blur(4px);\" onclick=\"ozgShareFeedCard(${lessonId}, '${data.title.replace(\/'\/g, \"\\\\'\").replace(\/\"\/g, '&quot;')}', '${data.slug || ''}')\"><i data-lucide=\"share-2\"><\/i><\/button>\n                            <button class=\"ozg-icon-btn\" title=\"Send as gift\" style=\"background: rgba(0,0,0,0.65); backdrop-filter: blur(4px);\" onclick=\"alert('Gifting functionality coming soon!')\"><i data-lucide=\"gift\"><\/i><\/button>\n                        <\/div>\n                        <button class=\"ozg-quiz-close\" style=\"pointer-events: auto; position: relative; right: 0; top: 0;\" onclick=\"document.getElementById('ozgLessonModal').classList.remove('show')\"><i data-lucide=\"x\"><\/i><\/button>\n                    <\/div>\n                    <div class=\"ozg-lesson-modal-header\" style=\"background-image: url('${data.thumb || ''}')\"><\/div>\n                    <div class=\"ozg-lesson-modal-content\">\n                        <div style=\"display:flex; justify-content:space-between; align-items:flex-start; margin-bottom:12px; flex-wrap:wrap; gap:10px;\">\n                            <h2 class=\"ozg-lesson-modal-title\" style=\"margin:0;\">${escapeHtml(data.title)}<\/h2>\n                            <div id=\"ozgLessonCompleteBadge\">${data.is_completed ? `<div style=\"background:rgba(0,230,118,0.1); color:var(--success-color); padding:4px 12px; border-radius:20px; font-size:0.8rem; font-weight:700; border:1px solid var(--success-color);\">COMPLETED<\/div>` : `<div style=\"background:rgba(0,240,255,0.1); color:var(--accent-cyan); padding:4px 12px; border-radius:20px; font-size:0.8rem; font-weight:700; border:1px solid var(--accent-cyan);\">${typeLabel}<\/div>`}<\/div>\n                        <\/div>\n                        <div style=\"color:var(--accent-cyan); font-size:0.85rem; font-weight:600; margin-bottom:20px; display:flex; align-items:center; gap:6px; cursor:pointer;\" onclick=\"ozgOpenCourseModal(${data.course_id})\">\n                            <i data-lucide=\"book\" style=\"width:14px;\"><\/i> Course: ${escapeHtml(data.course_title)}\n                        <\/div>\n                `;\n\n                if (data.is_enrolled) {\n                    if (data.document && data.document.type === 'pdf') {\n                        html += `<div class=\"ozg-book-reader\" id=\"ozgBookReader\" data-url=\"${escapeHtml(data.document.url)}\">\n                            <div class=\"ozg-book-scroll\" id=\"ozgBookScroll\"><div class=\"ozg-book-loading\">Loading document\u2026<\/div><\/div>\n                            <div class=\"ozg-book-progress-wrap\">\n                                <div class=\"ozg-book-progress-track\"><div class=\"ozg-book-progress-fill\" id=\"ozgBookProgressFill\"><\/div><\/div>\n                                <span class=\"ozg-book-progress-label\" id=\"ozgBookProgressLabel\">0%<\/span>\n                                <button type=\"button\" class=\"ozg-book-expand\" title=\"Full screen\" onclick=\"ozgOpenBookLightbox()\"><i data-lucide=\"maximize-2\" style=\"width:14px; height:14px;\"><\/i> Zoom<\/button>\n                            <\/div>\n                        <\/div>`;\n                    } else if (data.document && data.document.type === 'ppt') {\n                        html += `<div class=\"ozg-ppt-frame-wrap\"><iframe src=\"https:\/\/docs.google.com\/gview?url=${encodeURIComponent(data.document.url)}&embedded=true\" loading=\"lazy\"><\/iframe><\/div>\n                            <div class=\"ozg-ppt-hint\">Once you've gone through the slides, tap \"Mark as Completed\" below.<\/div>`;\n                    } else if (data.video_html) {\n                        html += `<div class=\"ozg-video-container\">${data.video_html}<\/div>`;\n                    } else if (data.audio && data.audio.url) {\n                        const thumbStyle = data.thumb ? `background-image:url('${String(data.thumb).replace(\/'\/g, '%27')}'); background-size:cover; background-position:center;` : 'background:linear-gradient(135deg,#1b1f3a,#3a1b5e);';\n                        html += `<div class=\"ozg-audio-lesson\" style=\"position:relative; width:100%; aspect-ratio:16\/9; border-radius:12px; overflow:hidden; margin-bottom:20px; ${thumbStyle}\">\n                            <div style=\"position:absolute; left:0; right:0; bottom:0; padding:28px 0 14px; display:flex; justify-content:center; background:linear-gradient(to top, rgba(0,0,0,0.85), rgba(0,0,0,0));\">\n                                <audio controls autoplay preload=\"metadata\" style=\"width:92%;\" src=\"${data.audio.url}\"><\/audio>\n                            <\/div>\n                        <\/div>`;\n                    } else if (data.video) {\n                        let videoHtml = '';\n                        const src = data.video.source;\n                        if (src === 'youtube') {\n                            videoHtml = `<iframe src=\"https:\/\/www.youtube.com\/embed\/${data.video.source_video_id}?autoplay=1&mute=0&controls=1&rel=0&modestbranding=1\" allow=\"autoplay; encrypted-media; picture-in-picture\" allowfullscreen loading=\"lazy\"><\/iframe>`;\n                        } else if (src === 'vimeo') {\n                            videoHtml = `<iframe src=\"https:\/\/player.vimeo.com\/video\/${data.video.source_video_id}?autoplay=1&muted=0&badge=0&autopause=0\" width=\"100%\" height=\"100%\" frameborder=\"0\" allow=\"autoplay; fullscreen; picture-in-picture\" allowfullscreen loading=\"lazy\"><\/iframe>`;\n                        } else if (src === 'html5' || src === 'external_url') {\n                             videoHtml = `<video controls autoplay preload=\"metadata\" style=\"width:100%; height:100%; object-fit:cover;\" src=\"${data.video.source_video_id || data.video.source_external_url}\"><\/video>`;\n                        } else if (src === 'embedded') {\n                             videoHtml = data.video.source_embedded;\n                        }\n\n                        if (videoHtml) {\n                            html += `<div class=\"ozg-video-container\">${videoHtml}<\/div>`;\n                        }\n                    }\n\n                    html += `<div class=\"ozg-lesson-description\" style=\"margin-bottom: 24px;\">${data.content}<\/div>`;\n\n                    html += `\n                        <div style=\"display:flex; justify-content:space-between; align-items:center; margin-top:30px; padding-top:20px; border-top:1px solid var(--glass-border); flex-wrap:wrap; gap:16px;\">\n                            <div style=\"flex:1;\">\n                                ${data.prev_id ? `<button class=\"ozg-btn-sec\" style=\"padding:10px 16px; font-size:0.85rem;\" onclick=\"ozgOpenLessonModal(${data.prev_id})\"><i data-lucide=\"arrow-left\"><\/i> Previous<\/button>` : ''}\n                            <\/div>\n\n                            <div id=\"ozgLessonCompleteBtnWrap\" style=\"text-align: center; flex: 2;\" data-lesson-id=\"${data.id}\" data-next-id=\"${data.next_id || 0}\">\n                                ${data.is_completed ?\n                                    `<button class=\"ozg-btn-sec\" disabled style=\"background:rgba(0,230,118,0.1); border-color:var(--success-color); color:var(--success-color);\"><i data-lucide=\"check-circle\"><\/i> Completed<\/button>` :\n                                    `<button class=\"ozg-btn\" onclick=\"ozgMarkLessonComplete(event, ${data.id}, ${data.next_id || 0})\"><i data-lucide=\"check\"><\/i> Mark as Completed<\/button>`\n                                }\n                            <\/div>\n\n                            <div style=\"flex:1; text-align:right;\">\n                                ${data.next_id ? `<button class=\"ozg-btn-sec\" style=\"padding:10px 16px; font-size:0.85rem;\" onclick=\"ozgOpenLessonModal(${data.next_id})\">Next <i data-lucide=\"arrow-right\"><\/i><\/button>` : ''}\n                            <\/div>\n                        <\/div>\n                    `;\n                } else {\n                    html += `\n                        <div class=\"ozg-lesson-description\" style=\"margin-bottom: 24px;\">\n                            ${data.excerpt}...\n                            <div style=\"margin-top:16px; padding:12px; background:rgba(255,170,0,0.1); border:1px solid rgba(255,170,0,0.3); border-radius:8px; color:#ffaa00; font-size:0.85rem;\">\n                                <i data-lucide=\"lock\" style=\"width:14px; vertical-align:middle;\"><\/i> Enrol in the parent course to unlock full lesson content and videos.\n                            <\/div>\n                        <\/div>\n                        <div style=\"text-align: center; margin-top: 32px; background:rgba(0,0,0,0.3); padding:24px; border-radius:20px; border:1px solid var(--accent-cyan);\">\n                            <h4 style=\"margin:0 0 16px 0; color:#fff;\">Enrol in \"${escapeHtml(data.course_title)}\"<\/h4>\n                            ${data.course_price_type === 'paid' ?\n                                `<button class=\"ozg-btn\" style=\"padding: 16px 32px; font-size: 1.1rem;\" onclick=\"ozgBuyCourse(${data.course_id}, '${data.checkout_url || data.course_url || ''}')\"><i data-lucide=\"shopping-cart\"><\/i> Buy Course<\/button>` :\n                                `<button class=\"ozg-btn\" style=\"padding: 16px 32px; font-size: 1.1rem;\" onclick=\"ozgConfirmSubscribeFromModal(${data.course_id})\"><i data-lucide=\"play-circle\"><\/i> Enrol Now<\/button>`\n                            }\n                        <\/div>\n                    `;\n                }\n\n                html += `<\/div>`;\n                content.innerHTML = html;\n                lucide.createIcons();\n\n                \/\/ Try to re-initialize Tutor LMS components if they exist in the new content\n                setTimeout(() => {\n                    if (typeof jQuery !== 'undefined') {\n                        jQuery(document).trigger('tutor_lesson_load');\n                        jQuery('.tutor-quiz-wrap').trigger('tutor_quiz_init');\n                        if (window.tutor_lesson_sidebar_toggle) window.tutor_lesson_sidebar_toggle();\n                    }\n\n                    \/\/ Auto-complete if video\/audio ends\n                    const modalMedia = content.querySelector('video, audio');\n                    if (modalMedia) {\n                        modalMedia.onended = () => {\n                            console.log('Modal media ended, completing content:', data.id);\n                            ozgMarkLessonComplete(null, data.id, data.next_id || 0);\n                        };\n                    }\n\n                    \/\/ Book-reader (PDF): render pages, auto-complete once the last page is reached\n                    if (data.document && data.document.type === 'pdf') {\n                        ozgInitBookReader(data.document.url, data.id, data.next_id || 0);\n                    }\n                }, 100);\n            } catch(e) {\n                console.error(e);\n                renderLessonErrorView('Error loading lesson details.', 0);\n            }\n        }\n\n        \/\/ ==========================================\n        \/\/ BOOK READER (PDF lessons) - renders every page into one continuously\n        \/\/ scrolling column, like an embedded document viewer. Completion fires\n        \/\/ once the scroll position reaches (effectively) the bottom.\n        \/\/ ==========================================\n        let ozgBookState = null;\n        let ozgPdfJsLoadingPromise = null;\n\n        function ozgLoadPdfJs() {\n            if (window.pdfjsLib) return Promise.resolve(window.pdfjsLib);\n            if (ozgPdfJsLoadingPromise) return ozgPdfJsLoadingPromise;\n            ozgPdfJsLoadingPromise = new Promise((resolve, reject) => {\n                const script = document.createElement('script');\n                script.src = 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.min.js';\n                script.onload = () => {\n                    window.pdfjsLib.GlobalWorkerOptions.workerSrc = 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.worker.min.js';\n                    resolve(window.pdfjsLib);\n                };\n                script.onerror = () => reject(new Error('Could not load PDF viewer'));\n                document.head.appendChild(script);\n            });\n            return ozgPdfJsLoadingPromise;\n        }\n\n        async function ozgInitBookReader(url, lessonId, nextLessonId) {\n            const scrollEl = document.getElementById('ozgBookScroll');\n            if (!scrollEl) return;\n\n            try {\n                const pdfjsLib = await ozgLoadPdfJs();\n                const pdf = await pdfjsLib.getDocument(url).promise;\n                ozgBookState = { pdf, numPages: pdf.numPages, lessonId, nextLessonId, completed: false };\n\n                scrollEl.innerHTML = '';\n                scrollEl.removeEventListener('scroll', ozgHandleBookScroll);\n                scrollEl.addEventListener('scroll', ozgHandleBookScroll, { passive: true });\n\n                \/\/ Render pages one after another so they appear progressively as a continuous document\n                const containerWidth = scrollEl.clientWidth || 600;\n                const outputScale = window.devicePixelRatio || 1; \/\/ render at device resolution so text stays sharp\n                for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {\n                    if (!ozgBookState || ozgBookState.pdf !== pdf) return; \/\/ modal closed \/ lesson changed mid-render\n                    const page = await pdf.getPage(pageNum);\n                    const baseViewport = page.getViewport({ scale: 1 });\n                    \/\/ displayScale sets the on-screen (CSS) size; outputScale multiplies the actual\n                    \/\/ pixel buffer so text renders crisp instead of being upscaled and blurred.\n                    const displayScale = Math.min(2.2, (containerWidth - 16) \/ baseViewport.width);\n                    const viewport = page.getViewport({ scale: displayScale });\n\n                    const canvas = document.createElement('canvas');\n                    canvas.width = Math.floor(viewport.width * outputScale);\n                    canvas.height = Math.floor(viewport.height * outputScale);\n                    canvas.dataset.page = pageNum;\n                    canvas.title = 'Click to zoom';\n                    canvas.addEventListener('click', () => ozgOpenBookLightbox(pageNum));\n                    scrollEl.appendChild(canvas);\n\n                    const renderContext = { canvasContext: canvas.getContext('2d'), viewport };\n                    if (outputScale !== 1) renderContext.transform = [outputScale, 0, 0, outputScale, 0, 0];\n                    await page.render(renderContext).promise;\n                }\n\n                ozgHandleBookScroll(); \/\/ in case the whole document already fits without scrolling\n            } catch (err) {\n                console.error('Book reader failed to load:', err);\n                scrollEl.innerHTML = '<div class=\"ozg-book-loading\">Could not display this document. Please try again.<\/div>';\n            }\n        }\n\n\n        \/\/ ==========================================\n        \/\/ GUEST COMPLETION -> \"earn HEC\" prompt\n        \/\/ ==========================================\n        const ozgGuestCompleted = new Set();\n\n        function ozgGuestLessonCompleted(lessonId) {\n            ozgGuestCompleted.add(lessonId);\n            ozgCloseBookLightbox();\n            ozgMarkLessonCompletedInPlace(lessonId);\n            showHeaderToast('\u2705 Lesson completed!');\n            setTimeout(ozgShowGuestHecPrompt, 900);\n        }\n\n        function ozgShowGuestHecPrompt() {\n            const el = document.getElementById('ozgGuestHecPrompt');\n            if (!el) return;\n            el.classList.add('show');\n            if (typeof lucide !== 'undefined') lucide.createIcons();\n        }\n\n        function ozgOpenTrophyFromPrompt() {\n            const el = document.getElementById('ozgGuestHecPrompt');\n            if (el) el.classList.remove('show');\n            const popupId = 15938;\n            try {\n                if (typeof elementorFrontend !== 'undefined' && elementorFrontend.documentsManager) {\n                    const popup = elementorFrontend.documentsManager.documents[popupId];\n                    if (popup) { popup.showModal(); return; }\n                }\n                if (typeof elementorProFrontend !== 'undefined' && elementorProFrontend.modules && elementorProFrontend.modules.popup) {\n                    elementorProFrontend.modules.popup.showPopup({ id: popupId });\n                }\n            } catch (err) { console.warn('Trophy popup failed', err); }\n        }\n\n        \/\/ ==========================================\n        \/\/ BOOK READER LIGHTBOX - full-screen page viewer with pinch\/pan\/wheel zoom,\n        \/\/ double-tap zoom, swipe + arrow\/keyboard page navigation.\n        \/\/ ==========================================\n        const ozgLb = {\n            open: false, page: 1, scale: 1, tx: 0, ty: 0, w: 0, h: 0,\n            pointers: new Map(), pinch: null, drag: null, token: 0, lastTap: 0, wired: false, swipe: null\n        };\n        const OZG_LB_MAX = 6;\n\n        function ozgLbEls() {\n            return {\n                root: document.getElementById('ozgBookLightbox'),\n                stage: document.getElementById('ozgLbStage'),\n                canvas: document.getElementById('ozgLbCanvas'),\n                loading: document.getElementById('ozgLbLoading'),\n                count: document.getElementById('ozgLbCount')\n            };\n        }\n\n        function ozgCurrentBookPage() {\n            const scrollEl = document.getElementById('ozgBookScroll');\n            if (!scrollEl) return 1;\n            const canvases = scrollEl.querySelectorAll('canvas[data-page]');\n            const top = scrollEl.scrollTop + scrollEl.clientHeight \/ 3;\n            let page = 1;\n            canvases.forEach(c => { if (c.offsetTop <= top) page = parseInt(c.dataset.page, 10) || page; });\n            return page;\n        }\n\n        function ozgOpenBookLightbox(pageNum) {\n            const st = ozgBookState;\n            if (!st || !st.pdf) return;\n            const { root } = ozgLbEls();\n            if (!root) return;\n            ozgLbWire();\n            ozgLb.open = true;\n            root.classList.add('show');\n            document.body.style.overflow = 'hidden';\n            if (typeof lucide !== 'undefined') lucide.createIcons();\n            ozgLbShowPage(Math.min(st.numPages, Math.max(1, parseInt(pageNum, 10) || ozgCurrentBookPage())));\n        }\n\n        function ozgCloseBookLightbox() {\n            const { root } = ozgLbEls();\n            if (!root || !ozgLb.open) return;\n            ozgLb.open = false;\n            ozgLb.token++;\n            ozgLb.pointers.clear(); ozgLb.pinch = null; ozgLb.drag = null;\n            root.classList.remove('show');\n            document.body.style.overflow = '';\n            \/\/ keep the inline reader on the page the user was viewing\n            const scrollEl = document.getElementById('ozgBookScroll');\n            const target = scrollEl && scrollEl.querySelector('canvas[data-page=\"' + ozgLb.page + '\"]');\n            if (target) scrollEl.scrollTop = Math.max(0, target.offsetTop - 12);\n        }\n\n        async function ozgLbShowPage(n) {\n            const st = ozgBookState;\n            if (!st || !st.pdf) return;\n            n = Math.min(st.numPages, Math.max(1, n));\n            ozgLb.page = n;\n            const token = ++ozgLb.token;\n            const { stage, canvas, loading, count } = ozgLbEls();\n            count.textContent = n + ' \/ ' + st.numPages;\n            document.getElementById('ozgLbPrev').disabled = document.getElementById('ozgLbPrevSide').disabled = (n <= 1);\n            document.getElementById('ozgLbNext').disabled = document.getElementById('ozgLbNextSide').disabled = (n >= st.numPages);\n            loading.style.display = 'flex';\n            canvas.style.visibility = 'hidden';\n\n            try {\n                const page = await st.pdf.getPage(n);\n                if (token !== ozgLb.token) return;\n                const sw = stage.clientWidth, sh = stage.clientHeight;\n                const base = page.getViewport({ scale: 1 });\n                const fit = Math.min((sw - 16) \/ base.width, (sh - 16) \/ base.height);\n                ozgLb.w = base.width * fit;\n                ozgLb.h = base.height * fit;\n\n                \/\/ Render sharper than the fitted size so zooming in stays readable, within canvas memory limits\n                const dpr = window.devicePixelRatio || 1;\n                let mult = Math.max(2, dpr * 2);\n                const maxPixels = 16e6;\n                const px = (ozgLb.w * mult) * (ozgLb.h * mult);\n                if (px > maxPixels) mult *= Math.sqrt(maxPixels \/ px);\n                const viewport = page.getViewport({ scale: fit * mult });\n                const buf = document.createElement('canvas');\n                buf.width = Math.floor(viewport.width);\n                buf.height = Math.floor(viewport.height);\n                await page.render({ canvasContext: buf.getContext('2d'), viewport }).promise;\n                if (token !== ozgLb.token) return;\n\n                canvas.width = buf.width; canvas.height = buf.height;\n                canvas.getContext('2d').drawImage(buf, 0, 0);\n                canvas.style.width = ozgLb.w + 'px';\n                canvas.style.height = ozgLb.h + 'px';\n                loading.style.display = 'none';\n                canvas.style.visibility = 'visible';\n                ozgLbReset();\n            } catch (err) {\n                if (token !== ozgLb.token) return;\n                console.error('Lightbox render failed', err);\n                loading.textContent = 'Could not display this page.';\n            }\n\n            \/\/ Reaching the last page counts as having read the document\n            if (n >= st.numPages && !st.completed) {\n                st.completed = true;\n                setTimeout(() => ozgMarkLessonComplete(null, st.lessonId, st.nextLessonId || 0), 600);\n            }\n        }\n\n        function ozgLbGo(delta) {\n            const st = ozgBookState;\n            if (!st) return;\n            const n = ozgLb.page + delta;\n            if (n < 1 || n > st.numPages) return;\n            ozgLbShowPage(n);\n        }\n\n        function ozgLbApply() {\n            const { stage, canvas } = ozgLbEls();\n            const sw = stage.clientWidth, sh = stage.clientHeight;\n            const cw = ozgLb.w * ozgLb.scale, ch = ozgLb.h * ozgLb.scale;\n            ozgLb.tx = cw <= sw ? (sw - cw) \/ 2 : Math.min(0, Math.max(sw - cw, ozgLb.tx));\n            ozgLb.ty = ch <= sh ? (sh - ch) \/ 2 : Math.min(0, Math.max(sh - ch, ozgLb.ty));\n            canvas.style.transform = 'translate(' + ozgLb.tx + 'px,' + ozgLb.ty + 'px) scale(' + ozgLb.scale + ')';\n        }\n\n        function ozgLbReset() {\n            ozgLb.scale = 1;\n            ozgLbApply();\n        }\n\n        \/\/ Zoom keeping the point (cx, cy) - in stage coordinates - fixed under the finger\/cursor\n        function ozgLbZoomAt(newScale, cx, cy) {\n            newScale = Math.min(OZG_LB_MAX, Math.max(1, newScale));\n            const ratio = newScale \/ ozgLb.scale;\n            ozgLb.tx = cx - (cx - ozgLb.tx) * ratio;\n            ozgLb.ty = cy - (cy - ozgLb.ty) * ratio;\n            ozgLb.scale = newScale;\n            ozgLbApply();\n        }\n\n        function ozgLbZoomBy(factor) {\n            const { stage } = ozgLbEls();\n            ozgLbZoomAt(ozgLb.scale * factor, stage.clientWidth \/ 2, stage.clientHeight \/ 2);\n        }\n\n        function ozgLbWire() {\n            if (ozgLb.wired) return;\n            ozgLb.wired = true;\n            const { stage } = ozgLbEls();\n            const pos = (e) => { const r = stage.getBoundingClientRect(); return { x: e.clientX - r.left, y: e.clientY - r.top }; };\n            const dist = () => { const p = [...ozgLb.pointers.values()]; return Math.hypot(p[0].x - p[1].x, p[0].y - p[1].y); };\n            const mid = () => { const p = [...ozgLb.pointers.values()]; return { x: (p[0].x + p[1].x) \/ 2, y: (p[0].y + p[1].y) \/ 2 }; };\n\n            stage.addEventListener('pointerdown', (e) => {\n                if (e.target.closest('.ozg-lb-nav')) return;\n                ozgLb.lastType = e.pointerType;\n                stage.setPointerCapture(e.pointerId);\n                ozgLb.pointers.set(e.pointerId, pos(e));\n                if (ozgLb.pointers.size === 2) {\n                    ozgLb.pinch = { d: dist(), scale: ozgLb.scale };\n                    ozgLb.drag = null; ozgLb.swipe = null;\n                } else if (ozgLb.pointers.size === 1) {\n                    const p = pos(e);\n                    ozgLb.drag = { x: p.x, y: p.y, tx: ozgLb.tx, ty: ozgLb.ty, moved: false };\n                    ozgLb.swipe = { x: p.x, y: p.y, t: Date.now() };\n                    stage.classList.add('grabbing');\n                }\n            });\n\n            stage.addEventListener('pointermove', (e) => {\n                if (!ozgLb.pointers.has(e.pointerId)) return;\n                ozgLb.pointers.set(e.pointerId, pos(e));\n                if (ozgLb.pointers.size === 2 && ozgLb.pinch) {\n                    const m = mid();\n                    ozgLbZoomAt(ozgLb.pinch.scale * (dist() \/ ozgLb.pinch.d), m.x, m.y);\n                } else if (ozgLb.drag && ozgLb.pointers.size === 1) {\n                    const p = pos(e);\n                    const dx = p.x - ozgLb.drag.x, dy = p.y - ozgLb.drag.y;\n                    if (Math.abs(dx) + Math.abs(dy) > 4) ozgLb.drag.moved = true;\n                    if (ozgLb.scale > 1) {\n                        ozgLb.tx = ozgLb.drag.tx + dx;\n                        ozgLb.ty = ozgLb.drag.ty + dy;\n                        ozgLbApply();\n                    }\n                }\n            });\n\n            const end = (e) => {\n                if (!ozgLb.pointers.has(e.pointerId)) return;\n                const p = pos(e);\n                const wasSingle = ozgLb.pointers.size === 1;\n                ozgLb.pointers.delete(e.pointerId);\n                if (ozgLb.pointers.size < 2) ozgLb.pinch = null;\n                if (ozgLb.pointers.size === 0) stage.classList.remove('grabbing');\n\n                if (wasSingle && ozgLb.swipe && ozgLb.drag) {\n                    const dx = p.x - ozgLb.swipe.x, dy = p.y - ozgLb.swipe.y;\n                    \/\/ Swipe to change page (only when not zoomed in, so panning never flips pages)\n                    if (ozgLb.scale <= 1.02 && Math.abs(dx) > 60 && Math.abs(dx) > Math.abs(dy) * 1.5) {\n                        ozgLbGo(dx < 0 ? 1 : -1);\n                    } else if (!ozgLb.drag.moved) {\n                        \/\/ Tap: double-tap toggles zoom\n                        const now = Date.now();\n                        if (now - ozgLb.lastTap < 320) {\n                            ozgLb.lastTap = 0;\n                            ozgLbZoomAt(ozgLb.scale > 1.05 ? 1 : 2.5, p.x, p.y);\n                        } else {\n                            ozgLb.lastTap = now;\n                        }\n                    }\n                }\n                ozgLb.drag = null; ozgLb.swipe = null;\n                if (ozgLb.pointers.size === 1) {\n                    \/\/ continue panning with the remaining finger after a pinch\n                    const [id, q] = [...ozgLb.pointers.entries()][0];\n                    ozgLb.drag = { x: q.x, y: q.y, tx: ozgLb.tx, ty: ozgLb.ty, moved: true };\n                }\n            };\n            stage.addEventListener('pointerup', end);\n            stage.addEventListener('pointercancel', end);\n\n            stage.addEventListener('wheel', (e) => {\n                e.preventDefault();\n                const p = pos(e);\n                if (e.ctrlKey || e.metaKey || ozgLb.scale > 1) {\n                    if (e.ctrlKey || e.metaKey) {\n                        ozgLbZoomAt(ozgLb.scale * Math.exp(-e.deltaY * 0.01), p.x, p.y);\n                    } else {\n                        ozgLb.tx -= e.deltaX; ozgLb.ty -= e.deltaY; ozgLbApply();\n                    }\n                } else {\n                    ozgLbZoomAt(ozgLb.scale * Math.exp(-e.deltaY * 0.0025), p.x, p.y);\n                }\n            }, { passive: false });\n\n            stage.addEventListener('dblclick', (e) => {\n                if (ozgLb.lastType === 'touch' || ozgLb.lastType === 'pen') return; \/\/ touch double-tap is handled above\n                const p = pos(e);\n                ozgLbZoomAt(ozgLb.scale > 1.05 ? 1 : 2.5, p.x, p.y);\n            });\n\n            document.addEventListener('keydown', (e) => {\n                if (!ozgLb.open) return;\n                if (e.key === 'Escape') ozgCloseBookLightbox();\n                else if (e.key === 'ArrowRight' || e.key === 'PageDown') { e.preventDefault(); ozgLbGo(1); }\n                else if (e.key === 'ArrowLeft' || e.key === 'PageUp') { e.preventDefault(); ozgLbGo(-1); }\n                else if (e.key === '+' || e.key === '=') ozgLbZoomBy(1.4);\n                else if (e.key === '-') ozgLbZoomBy(1 \/ 1.4);\n                else if (e.key === '0') ozgLbReset();\n            });\n\n            window.addEventListener('resize', () => { if (ozgLb.open) ozgLbShowPage(ozgLb.page); });\n        }\n\n        function ozgHandleBookScroll() {\n            const st = ozgBookState;\n            const scrollEl = document.getElementById('ozgBookScroll');\n            const fill = document.getElementById('ozgBookProgressFill');\n            const label = document.getElementById('ozgBookProgressLabel');\n            if (!st || !scrollEl) return;\n\n            const scrollable = scrollEl.scrollHeight - scrollEl.clientHeight;\n            const percent = scrollable <= 0 ? 100 : Math.min(100, Math.max(0, (scrollEl.scrollTop \/ scrollable) * 100));\n\n            if (fill) fill.style.width = percent.toFixed(0) + '%';\n            if (label) label.textContent = percent.toFixed(0) + '%';\n\n            \/\/ Treat 100% (with a small tolerance for rounding) as \"finished reading\"\n            if (percent >= 99 && !st.completed) {\n                st.completed = true;\n                ozgMarkLessonComplete(null, st.lessonId, st.nextLessonId || 0);\n            }\n        }\n\n        function ozgMarkLessonCompletedInPlace(lessonId) {\n            const wrap = document.getElementById('ozgLessonCompleteBtnWrap');\n            if (!wrap || parseInt(wrap.getAttribute('data-lesson-id'), 10) !== parseInt(lessonId, 10)) return false;\n            wrap.innerHTML = '<button class=\"ozg-btn-sec\" disabled style=\"background:rgba(0,230,118,0.1); border-color:var(--success-color); color:var(--success-color);\"><i data-lucide=\"check-circle\"><\/i> Completed<\/button>';\n            const badge = document.getElementById('ozgLessonCompleteBadge');\n            if (badge) badge.innerHTML = '<div style=\"background:rgba(0,230,118,0.1); color:var(--success-color); padding:4px 12px; border-radius:20px; font-size:0.8rem; font-weight:700; border:1px solid var(--success-color);\">COMPLETED<\/div>';\n            if (typeof lucide !== 'undefined') lucide.createIcons();\n            return true;\n        }\n\n        async function ozgMarkLessonComplete(e, lessonId, nextLessonId = 0) {\n            \/\/ Backward compat: called as (lessonId, nextId) without an event\n            if (e !== null && e !== undefined && typeof e !== 'object') {\n                nextLessonId = lessonId || 0;\n                lessonId = e;\n                e = null;\n            }\n            lessonId = parseInt(lessonId, 10) || 0;\n            if (!lessonId) return;\n            if (ozgI18n.isGuest) return ozgGuestLessonCompleted(lessonId);\n\n            const btn = e?.currentTarget;\n            if (btn && btn.classList.contains('ozg-btn')) {\n                btn.disabled = true;\n                btn.innerHTML = '<i data-lucide=\"loader\" class=\"ozg-spin\"><\/i> Completing...';\n                if (typeof lucide !== \"undefined\") lucide.createIcons();\n            }\n\n            try {\n                const resp = await fetch(`${apiBase}\/milestone\/complete`, {\n                    method: 'POST',\n                    headers: {'Content-Type':'application\/json','X-WP-Nonce': nonce},\n                    body: JSON.stringify({ milestone_id: lessonId })\n                });\n\n                const text = await resp.text();\n                let result = { success: false };\n                try {\n                    result = JSON.parse(text);\n                } catch(parseErr) {\n                    \/\/ PHP notices may precede the JSON body; extract it\n                    const m = text.match(\/\\{\"success\":.*\\}\\s*$\/);\n                    if (m) { try { result = JSON.parse(m[0]); } catch(_) {} }\n                    if (!result.success && text.indexOf('\"success\":true') !== -1) {\n                        result = { success: true };\n                    }\n                    if (!result.success) console.error('Completion raw response:', resp.status, text.slice(0, 500));\n                }\n\n                if (result.success) {\n                    showHeaderToast('\u2705 Lesson completed!');\n                    if (typeof loadSmartFeed === 'function') loadSmartFeed(true);\n\n                    if (nextLessonId && nextLessonId !== lessonId) {\n                        setTimeout(() => {\n                            showHeaderToast('\ud83d\ude80 Opening next lesson...');\n                            ozgOpenLessonModal(nextLessonId);\n                        }, 500);\n                    } else {\n                        \/\/ Only (or last) lesson: never look for a next lesson, and never re-render the\n                        \/\/ modal (that would restart the media). Just flip the button\/badge to \"Completed\".\n                        ozgMarkLessonCompletedInPlace(lessonId);\n                    }\n                } else {\n                    \/\/ The server may have completed the lesson before a later step failed. Check the real state first.\n                    let actuallyDone = false;\n                    try {\n                        const chk = await fetch(`${apiBase}\/lesson\/details\/${lessonId}?_=${Date.now()}`, { headers: {'X-WP-Nonce': nonce} });\n                        const cd = await chk.json();\n                        actuallyDone = !!(cd && cd.is_completed);\n                    } catch(_) {}\n\n                    if (actuallyDone) {\n                        showHeaderToast('\u2705 Lesson completed!');\n                        if (typeof loadSmartFeed === 'function') loadSmartFeed(true);\n                        ozgMarkLessonCompletedInPlace(lessonId);\n                    } else if (btn) {\n                        alert(result.message || 'Error completing lesson.');\n                        btn.disabled = false; btn.innerHTML = '<i data-lucide=\"check\"><\/i> Mark as Completed';\n                    } else {\n                        \/\/ Auto-completion after media ended: don't interrupt with a blocking alert\n                        console.warn('Auto-completion failed:', result);\n                        showHeaderToast('\u26a0\ufe0f Could not save progress');\n                    }\n                }\n            } catch(e) {\n                console.error('Completion error:', e);\n                showHeaderToast('\u26a0\ufe0f Refreshing state...');\n                if (!ozgMarkLessonCompletedInPlace(lessonId) && btn) {\n                    btn.disabled = false; btn.innerHTML = '<i data-lucide=\"check\"><\/i> Mark as Completed';\n                }\n            }\n        }\n\n        async function ozgOpenFundraisingModal(campaignId) {\n                    ozgCloseAllModals();\n                    const modal = document.getElementById('ozgFundraisingModal');\n                    const content = document.getElementById('ozgFundraisingModalContent');\n                    modal.classList.add('show');\n                    content.innerHTML = '<div style=\"text-align:center; padding: 100px;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; color:var(--accent-cyan); width:40px; height:40px;\"><\/i><\/div>';\n                    lucide.createIcons();\n\n                    try {\n                        const resp = await fetch(`${apiBase}\/fundraising\/details\/${campaignId}?_=${Date.now()}`, { headers: {'X-WP-Nonce': nonce} });\n                        const data = await resp.json();\n                        if (!data.success) { showHeaderToast(data.message || 'Campaign not found'); return; }\n\n                        const raisedDisplay = data.raised_fmt || (data.raised > 0 ? String(Math.round(data.raised)) : '0');\n                        const goalDisplay   = data.goal_fmt   || (data.goal   > 0 ? String(Math.round(data.goal))   : '\u2014');\n                        const pct = Math.min(100, data.percent || 0);\n\n                        const html = `\n                            <div style=\"position: sticky; top: 0; left: 0; right: 0; z-index: 100; display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; background: linear-gradient(to bottom, rgba(15,18,30,0.95) 60%, transparent); backdrop-filter: blur(8px); margin-bottom: -52px; pointer-events: none;\">\n                                <div style=\"display: flex; gap: 8px; pointer-events: auto;\">\n                                    <button class=\"ozg-icon-btn\" title=\"Open list\" style=\"background: rgba(0,0,0,0.65); backdrop-filter: blur(4px);\" onclick=\"ozgOpenPostTypeFilter('finance')\"><i data-lucide=\"list\"><\/i><\/button>\n                                    <button class=\"ozg-icon-btn\" title=\"Share\" style=\"background: rgba(0,0,0,0.65); backdrop-filter: blur(4px);\" onclick=\"ozgShareFeedCard(${campaignId}, '${data.title.replace(\/'\/g, \"\\\\'\").replace(\/\"\/g, '&quot;')}', '${data.slug || ''}')\"><i data-lucide=\"share-2\"><\/i><\/button>\n                                    <button class=\"ozg-icon-btn\" title=\"Send as gift\" style=\"background: rgba(0,0,0,0.65); backdrop-filter: blur(4px);\" onclick=\"alert('Gifting functionality coming soon!')\"><i data-lucide=\"gift\"><\/i><\/button>\n                                <\/div>\n                                <button class=\"ozg-quiz-close\" style=\"pointer-events: auto; position: relative; right: 0; top: 0;\" onclick=\"document.getElementById('ozgFundraisingModal').classList.remove('show')\"><i data-lucide=\"x\"><\/i><\/button>\n                            <\/div>\n                            <div class=\"ozg-fundraising-modal-header\" style=\"background-image: url('${data.thumb || ''}')\"><\/div>\n                            <div class=\"ozg-fundraising-modal-content\">\n                                <h2 class=\"ozg-fundraising-modal-title\">${escapeHtml(data.title)}<\/h2>\n                                <div style=\"color:var(--text-muted); font-size:0.9rem; margin-bottom:18px; line-height:1.5; font-style:italic;\">${data.excerpt}<\/div>\n\n                                <div style=\"margin-bottom:20px; background:rgba(255,255,255,0.05); padding:18px; border-radius:16px; border:1px solid var(--glass-border);\">\n                                    <div style=\"display:flex; justify-content:space-between; align-items:flex-end; margin-bottom:10px;\">\n                                        <div>\n                                            <div style=\"font-size:0.68rem; color:var(--text-muted); text-transform:uppercase; letter-spacing:0.5px; margin-bottom:2px;\">Raised<\/div>\n                                            <div style=\"font-size:1.5rem; font-weight:800; color:#eab308; line-height:1;\">${raisedDisplay}<\/div>\n                                        <\/div>\n                                        <div style=\"text-align:right;\">\n                                            <div style=\"font-size:0.68rem; color:var(--text-muted); text-transform:uppercase; letter-spacing:0.5px; margin-bottom:2px;\">Goal<\/div>\n                                            <div style=\"font-size:1.1rem; font-weight:700; color:#fff;\">${goalDisplay}<\/div>\n                                        <\/div>\n                                    <\/div>\n                                    <div style=\"height:10px; background:rgba(255,255,255,0.08); border-radius:10px; overflow:hidden; margin-bottom:6px;\">\n                                        <div style=\"height:100%; background:linear-gradient(90deg,#eab308,#fbbf24); width:${pct}%; transition:width 1.2s ease; border-radius:10px;\"><\/div>\n                                    <\/div>\n                                    <div style=\"font-size:0.82rem; font-weight:700; color:#eab308; text-align:center;\">${pct}% funded<\/div>\n                                <\/div>\n\n                                <div class=\"ozg-fundraising-description\" style=\"max-height:260px; overflow-y:auto; margin-bottom:18px;\">${data.content}<\/div>\n\n                                <div style=\"text-align:center; background:rgba(0,0,0,0.3); padding:18px; border-radius:20px; border:1px solid #eab308;\">\n                                    <h4 style=\"margin:0 0 12px 0; color:#fff; font-size:0.95rem;\">Support this mission<\/h4>\n                                    <button class=\"ozg-btn\" id=\"ozgInvestBtn_${campaignId}\"\n                                        style=\"background:linear-gradient(135deg,#eab308,#fbbf24); color:#000; padding:14px 28px; font-size:1rem;\"\n                                        onclick=\"ozgShowDonationPanel(${campaignId},'${data.url}',this,'${data.kaspi_mobile}')\">\n                                        <i data-lucide=\"heart\"><\/i> Invest now\n                                    <\/button>\n                                <\/div>\n\n                                <div id=\"ozgDonationPanel_${campaignId}\"\n                                    style=\"display:none; margin-top:18px; border-radius:16px; overflow:hidden; border:1px solid #eab308; min-height:100px;\">\n                                <\/div>\n\n                                <div style=\"margin-top:20px; text-align:center;\">\n                                    <button class=\"ozg-btn-sec\" style=\"width:100%; justify-content:center; background:rgba(255,255,255,0.05); color:var(--text-muted); font-size:0.85rem; border:1px solid var(--glass-border); padding:10px;\"\n                                        onclick=\"ozgToggleInvestors(${campaignId}, this)\">\n                                        <span>Showing investors<\/span> <i data-lucide=\"chevron-down\" style=\"width:16px; height:16px; margin-left:6px; transition:transform 0.3s;\"><\/i>\n                                    <\/button>\n                                    <div id=\"ozgInvestorsList_${campaignId}\" style=\"display:none; margin-top:12px; text-align:left; background:rgba(0,0,0,0.2); border-radius:12px; padding:12px; border:1px solid var(--glass-border);\">\n                                        <div class=\"investors-items\" style=\"max-height:200px; overflow-y:auto; font-size:0.9rem;\"><\/div>\n                                    <\/div>\n                                <\/div>\n                            <\/div>`;\n\n                        content.innerHTML = html;\n                        lucide.createIcons();\n                        setTimeout(() => {\n                            if (typeof jQuery !== 'undefined') { jQuery(content).find('form').trigger('ready'); if (typeof give !== 'undefined' && give.init) give.init(); }\n                        }, 200);\n                    } catch(e) { console.error(e); content.innerHTML = '<div style=\"padding:40px; text-align:center; color:var(--warning-color);\">Error loading campaign.<\/div>'; }\n                }\n\n        async function ozgToggleInvestors(campaignId, btn) {\n            const listWrap = document.getElementById(`ozgInvestorsList_${campaignId}`);\n            if (!listWrap) return;\n            const itemsCont = listWrap.querySelector('.investors-items');\n            const icon = btn.querySelector('i');\n\n            const isHidden = listWrap.style.display === 'none' || listWrap.style.display === '';\n\n            if (isHidden) {\n                listWrap.style.display = 'block';\n                if (icon) icon.style.transform = 'rotate(180deg)';\n                setTimeout(() => listWrap.scrollIntoView({ behavior: 'smooth', block: 'start' }), 50);\n\n                if (itemsCont && itemsCont.innerHTML === '') {\n                    itemsCont.innerHTML = '<div style=\"text-align:center; padding:20px;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; width:20px; height:20px;\"><\/i><\/div>';\n                    if (typeof lucide !== 'undefined') lucide.createIcons();\n\n                    try {\n                        const resp = await fetch(`${apiBase}\/fundraising\/investors\/${campaignId}?_=${Date.now()}`, { headers: {'X-WP-Nonce': nonce} });\n                        const data = await resp.json();\n                        if (data.success && data.investors && data.investors.length > 0) {\n                            itemsCont.innerHTML = data.investors.map(inv => `\n                                <div style=\"display:flex; justify-content:space-between; padding:8px 0; border-bottom:1px solid rgba(255,255,255,0.05);\">\n                                    <span style=\"color:#fff; font-weight:500;\">${escapeHtml(inv.name)}<\/span>\n                                    <span style=\"color:#eab308; font-weight:700;\">${inv.amount_fmt}<\/span>\n                                <\/div>\n                            `).join('');\n                        } else {\n                            itemsCont.innerHTML = '<div style=\"color:var(--text-muted); padding:10px; text-align:center;\">No investors yet. Be the first!<\/div>';\n                        }\n                        if (typeof lucide !== 'undefined') lucide.createIcons();\n                    } catch(e) {\n                        itemsCont.innerHTML = '<div style=\"color:var(--warning-color); padding:10px;\">Error loading investors.<\/div>';\n                    }\n                }\n            } else {\n                listWrap.style.display = 'none';\n                if (icon) icon.style.transform = 'rotate(0deg)';\n            }\n        }\n\n        function ozgScrollToDonation(btn) {\n            const modal = document.getElementById('ozgFundraisingModal');\n            \/\/ Look for any form or specific FundEngine containers\n            const target = modal.querySelector('form, .wf-donation-form, .wf-fundraising-single-bottom, .wdp-donation-form-wrapper');\n\n            if (target) {\n                target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n                target.style.transition = 'outline 0.5s ease';\n                target.style.outline = '2px solid #fbbf24';\n                setTimeout(() => target.style.outline = 'none', 2000);\n            } else if (btn && btn.getAttribute('data-url')) {\n                \/\/ If no form found in modal content, redirect to full page\n                window.location.href = btn.getAttribute('data-url');\n            } else {\n                showHeaderToast('Scroll down to see the donation options');\n            }\n        }\n\n        async function ozgLikeP2PCampaign(campaignId, btnElement) {\n            try {\n                const resp = await fetch(`${apiBase}\/like\/toggle`, {\n                    method: 'POST',\n                    headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': nonce },\n                    body: JSON.stringify({ post_id: campaignId })\n                });\n                const data = await resp.json();\n                if (data.success) {\n                    const likesSpan = document.getElementById(`ozg-p2p-likes-${campaignId}`);\n                    if (likesSpan) likesSpan.innerText = data.new_count;\n                    btnElement.classList.toggle('liked');\n                    if (btnElement.classList.contains('liked')) {\n                        btnElement.style.backgroundColor = '#fecaca';\n                        btnElement.style.color = '#dc2626';\n                        btnElement.style.border = '1px solid #dc2626';\n                    } else {\n                        btnElement.style.backgroundColor = '#f3f4f6';\n                        btnElement.style.color = '#ef4444';\n                        btnElement.style.border = 'none';\n                    }\n                }\n            } catch (e) {\n                console.error('Like error:', e);\n                showHeaderToast('Error liking campaign');\n            }\n        }\n\n        async function loadSmartFeed(reset = false) {\n            const container = document.getElementById('ozg-smart-feed');\n            if (!container) return; \/\/ JetList engine is active or feed is hidden\n\n            if (reset && _feedAbortCtrl) { try{_feedAbortCtrl.abort();}catch(e){} }\n            _feedAbortCtrl = new AbortController();\n            if (isFeedLoading && !reset) return;\n            if (reset) isFeedLoading = false;\n            const loader = document.getElementById('ozg-feed-loader');\n            if (!container) return;\n\n            if (reset) {\n                currentFeedPage = 1;\n                hasMoreFeed = true;\n                container.innerHTML = '<div style=\"grid-column: 1\/-1; display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px;\">' + Array(4).fill('<div style=\"aspect-ratio:9\/16; background:rgba(255,255,255,0.03); border-radius:16px; border:1px solid rgba(255,255,255,0.05); animation:pulse 1.5s infinite;\"><\/div>').join('') + '<\/div>';\n            }\n            if (!hasMoreFeed) return;\n\n            isFeedLoading = true;\n            if (loader) loader.style.display = 'block';\n\n            try {\n                const params = new URLSearchParams({\n                    page: currentFeedPage,\n                    limit: 12,\n                    search: currentFeedSearch,\n                    tag: currentFeedTag\n                });\n                const resp = await fetch(`${apiBase}\/feed?${params.toString()}`, { headers: {'X-WP-Nonce': nonce}, signal: _feedAbortCtrl.signal });\n                const data = await resp.json();\n\n                if (data.items.length === 0 && reset) {\n                    container.innerHTML = `<div style=\"text-align:center; color:var(--text-muted); grid-column: 1\/-1; background:rgba(255,255,255,0.02); padding: 40px; border-radius:16px; border:1px dashed rgba(255,255,255,0.1);\">No content found.<\/div>`;\n                } else {\n                    let html = '';\n\n                    if (reset && data.missing_spheres) {\n                        html += `<div style=\"grid-column: 1\/-1; background: rgba(255, 170, 0, 0.1); border: 1px solid rgba(255, 170, 0, 0.3); color: #ffaa00; padding: 16px; border-radius: 12px; text-align: center; font-size: 0.95rem; margin-bottom: 8px;\"><i data-lucide=\"alert-triangle\" style=\"width: 18px; margin-right: 8px; vertical-align: middle; display: inline-block;\"><\/i> Audit not completed! Choose your focus spheres to unlock highly personalized recommendations. Currently showing trending content.<\/div>`;\n                    }\n\n                    for (const item of data.items) {\n                        const bg = item.thumb ? 'background-image: url(' + item.thumb + ');' : 'background: linear-gradient(135deg, ' + item.pillar_color + '40, #05070f);';\n                        let onclickAction = '';\n                        const safeTitle = item.title.replace(\/'\/g, \"\\\\'\").replace(\/\"\/g, '\\\\\"');\n\n                        if (item.is_challenge) {\n                            onclickAction = \"ozgSwitchTab('challenges'); return false;\";\n                        } else if (item.is_course) {\n                            onclickAction = \"ozgOpenCourseModal(\" + item.id + \"); return false;\";\n                        } else if (item.is_lesson) {\n                            onclickAction = \"ozgOpenLessonModal(\" + item.id + \"); return false;\";\n                        } else if (item.is_fundraising) {\n                            onclickAction = \"ozgOpenFundraisingModal(\" + item.id + \"); return false;\";\n                        } else if (item.is_givewp) {\n                            onclickAction = \"ozgOpenP2PModalExpanded('\" + item.p2p_html + \"', '\" + safeTitle + \"', '\" + item.author_name + \"', \" + item.likes + \", \" + item.id + \"); return false;\";\n                        } else {\n                            onclickAction = \"ozgOpenPageInDashboard(\" + item.id + \", '\" + safeTitle + \"', '\" + item.url + \"'); return false;\";\n                        }\n\n                        let centerActionHtml = '';\n                        let progressHtml = '';\n\n                        if (item.is_fundraising) {\n                            const _gf = item.fund_goal_fmt;\n                            const _rf = item.fund_raised_fmt;\n                            progressHtml = `\n                                <div style=\"position:absolute;top:0;left:0;right:0;height:4px;background:rgba(255,255,255,0.1);z-index:10;\">\n                                    <div style=\"height:100%;background:#eab308;width:${Math.min(100,item.fund_percent)}%;transition:width 0.5s;\"><\/div>\n                                <\/div>\n                                <div style=\"position:absolute;top:8px;right:8px;z-index:10;text-align:right;\">\n                                    <div style=\"background:rgba(234,179,8,0.9);color:#000;padding:2px 6px;border-radius:4px;font-size:0.65rem;font-weight:800;display:inline-block;\">${item.fund_percent}%<\/div>\n                                    ${_rf ? `<br><span style=\"background:rgba(0,0,0,0.65);color:#fff;padding:1px 5px;border-radius:4px;font-size:0.6rem;font-weight:600;margin-top:1px;display:inline-block;\">\u2191${_rf}<\/span>` : ''}\n                                    ${_gf ? `<br><span style=\"background:rgba(0,0,0,0.65);color:#eab308;padding:1px 5px;border-radius:4px;font-size:0.6rem;font-weight:700;margin-top:1px;display:inline-block;\">\u2299${_gf}<\/span>` : ''}\n                                <\/div>`;\n                        } else if (item.is_enrolled && (item.is_course || item.is_lesson)) {\n                            const pct = item.completion_pct || 0;\n                            progressHtml = '<div style=\"position: absolute; top: 0; left: 0; right: 0; height: 4px; background: rgba(255,255,255,0.1); z-index: 10;\">' +\n                                '<div style=\"height: 100%; background: var(--success-color); width: ' + pct + '%; transition: width 0.5s ease;\"><\/div>' +\n                                '<\/div>' +\n                                (item.is_course ? '<div style=\"position: absolute; top: 8px; right: 8px; background: rgba(0,230,118,0.9); color: #000; padding: 2px 6px; border-radius: 4px; font-size: 0.65rem; font-weight: 800; z-index: 10; display: flex; align-items: center; gap: 3px;\">' +\n                                '<i data-lucide=\"check-circle\" style=\"width: 10px; height: 10px;\"><\/i> ' + pct + '%' +\n                                '<\/div>' : '');\n                        }\n\n                        let formatBadgeHtml = '';\n                        if (item.is_course) {\n                            const fmtIcon = item.format_icon || 'graduation-cap';\n                            const fmtLabel = item.format_label || 'Course';\n                            formatBadgeHtml = `<div style=\"position:absolute; top:8px; right:8px; z-index:10; background:rgba(0,0,0,0.75); color:#fff; border:1px solid var(--accent-cyan); padding:3px 8px; border-radius:12px; font-size:0.65rem; font-weight:700; display:flex; align-items:center; gap:4px; backdrop-filter:blur(4px);\">\n                                <i data-lucide=\"${fmtIcon}\" style=\"width:12px; height:12px; color:var(--accent-cyan);\"><\/i> ${escapeHtml(fmtLabel)}\n                            <\/div>`;\n                        }\n\n                        if (item.has_media) {\n                            const playIcon = item.media_type === 'audio' ? 'headphones' : (item.media_type === 'document' ? 'book-open' : 'play');\n                            centerActionHtml = '<button class=\"ozg-feed-play-btn\" onclick=\"event.stopPropagation(); ozgPlayFeedMedia(event, this, \\'' + item.media_data + '\\', ' + item.id + ')\">' +\n                                '<i data-lucide=\"' + playIcon + '\" style=\"width: 24px; height: 24px; fill: white; ' + (item.media_type === 'audio' || item.media_type === 'document' ? '' : 'margin-left: 3px;') + '\"><\/i>' +\n                                '<\/button>';\n                        } else if (item.is_givewp) {\n                            centerActionHtml = '<button class=\"ozg-feed-play-btn\" style=\"width: auto; height: auto; padding: 12px 24px; border-radius: 24px; background: linear-gradient(135deg, #22c55e, #16a34a); border: none; color: #fff; font-weight: 700; gap: 8px; display: flex; align-items: center; box-shadow: 0 4px 15px rgba(34, 197, 94, 0.4);\" onclick=\"event.stopPropagation(); ozgOpenP2PModalExpanded(\\'' + item.p2p_html + '\\', \\'' + safeTitle + '\\', \\'' + item.author_name + '\\', ' + item.likes + ', ' + item.id + ')\">' +\n                                '<i data-lucide=\"heart-handshake\" style=\"width: 20px; height: 20px;\"><\/i> View Campaign' +\n                                '<\/button>';\n                        }\n\n                        html += '<div class=\"ozg-feed-card\" data-post-id=\"' + item.id + '\" data-post-type=\"' + item.type + '\" style=\"--card-color: ' + item.pillar_color + ';\">' +\n                            progressHtml + formatBadgeHtml +\n                            '<div class=\"ozg-feed-media-container\" style=\"position: absolute; inset: 0; z-index: 1;\">' +\n                                '<div class=\"ozg-feed-card-bg\" style=\"' + bg + '\"><\/div>' +\n                            '<\/div>' +\n                            '<div class=\"ozg-feed-nav-overlay\" style=\"position: absolute; inset: 0; z-index: 3; cursor: pointer;\" onclick=\"' + onclickAction + '\"><\/div>' +\n                            centerActionHtml +\n                            '<div class=\"ozg-feed-content\" style=\"position: relative; z-index: 5; pointer-events: none;\">' +\n                                '<div class=\"ozg-feed-tags\" style=\"pointer-events: auto; cursor: pointer; display: inline-block;\" onclick=\"' + onclickAction + '\">' +\n                                    '<span style=\"background: ' + item.pillar_color + '; color: #000;\">' + item.area_name + '<\/span>' +\n                                '<\/div>' +\n                                '<div style=\"margin-top: auto;\">';\n                            const authorOnClick = \"event.stopPropagation(); ozgOpenUserProfileModal(\" + item.author_id + \"); return false;\";\n                            html += '<div class=\"ozg-feed-author-row\" style=\"pointer-events: auto; cursor: pointer; display: inline-flex;\" onclick=\"' + authorOnClick + '\">' +\n                                        '<img decoding=\"async\" src=\"' + item.author_avatar + '\" class=\"ozg-feed-author-avatar\" alt=\"\">' +\n                                        '<span class=\"ozg-feed-author-name\">@' + item.author_name + '<\/span>' +\n                                    '<\/div>' +\n                                    '<h4 class=\"ozg-feed-title\" style=\"pointer-events: auto; cursor: pointer;\" onclick=\"' + onclickAction + '\">' + item.title + '<\/h4>' +\n                                    '<div style=\"display:flex; justify-content:space-between; align-items:flex-end;\">' +\n                                        '<div class=\"ozg-feed-stats\" style=\"pointer-events: auto; cursor: pointer;\" onclick=\"' + onclickAction + '\">' +\n                                            '<span style=\"display:flex; align-items:center; gap:4px;\"><i data-lucide=\"heart\" style=\"width:14px; fill:currentColor;\"><\/i> ' + item.likes + '<\/span>' +\n                                        '<\/div>' +\n                                        '<div class=\"ozg-feed-actions\" style=\"pointer-events: auto;\">' +\n                                            '<button class=\"ozg-icon-btn\" title=\"Open list\" style=\"background: rgba(0,0,0,0.5); backdrop-filter: blur(5px);\" onclick=\"event.stopPropagation(); ozgOpenPostTypeFilter(\\'' + item.type + '\\')\"><i data-lucide=\"list\"><\/i><\/button>' +\n                                            '<button class=\"ozg-icon-btn\" title=\"Share\" style=\"background: rgba(0,0,0,0.5); backdrop-filter: blur(5px);\" onclick=\"event.stopPropagation(); ozgShareFeedCard(' + item.id + ', \\'' + safeTitle + '\\', \\'' + (item.slug || '') + '\\')\"><i data-lucide=\"share-2\"><\/i><\/button>' +\n                                            '<button class=\"ozg-icon-btn\" title=\"Bookmark\" style=\"background: rgba(0,0,0,0.5); backdrop-filter: blur(5px);\" onclick=\"event.stopPropagation(); ozgToggleGlobalBookmark(this, ' + item.id + ')\"><i data-lucide=\"bookmark-plus\"><\/i><\/button>' +\n                                        '<\/div>' +\n                                    '<\/div>' +\n                                '<\/div>' +\n                            '<\/div>' +\n                        '<\/div>';\n                    }\n\n                    if (reset) container.innerHTML = '';\n                    container.insertAdjacentHTML('beforeend', html);\n\n                    container.querySelectorAll('.ozg-feed-card:not(.prefetched)').forEach(card => {\n                        card.classList.add('prefetched');\n                        if (prefetchObserver) prefetchObserver.observe(card);\n                    });\n\n                    lucide.createIcons();\n\n                    if (reset && loader) {\n                        feedLoadObserver.unobserve(loader);\n                        feedLoadObserver.observe(loader);\n                    }\n                }\n\n                hasMoreFeed = data.has_more;\n                if (hasMoreFeed) currentFeedPage++;\n\n            } catch(e) {\n                if (e.name === 'AbortError') return;\n                console.error('Feed error:', e);\n                if (reset) container.innerHTML = '<div style=\"text-align:center; color:var(--warning-color); grid-column: 1\/-1;\">Error loading feed.<\/div>';\n            } finally {\n                isFeedLoading = false;\n                if (loader) loader.style.display = hasMoreFeed ? 'block' : 'none';\n            }\n        }\n\n        function goToTrackAndReload() { localStorage.setItem('ozgActiveTab', 'my-track'); window.location.reload(); }\n\n        function changeFocusAreas() { showView('view-select'); renderSelectionGrid(); window.scrollTo(0, 0); }\n\n        function renderFinalResult() {\n            let pScores = { wisdom: 0, strength: 0, wealth: 0, balance: 0 };\n            for (let key in finalScores) { let p = key.split('_')[0]; if (pScores[p] !== undefined) pScores[p] += finalScores[key]; }\n            let maxP = Math.max(pScores.wisdom, pScores.strength, pScores.wealth, pScores.balance);\n            let minP = Math.min(pScores.wisdom, pScores.strength, pScores.wealth, pScores.balance);\n            let diff = maxP - minP;\n            let archText = ''; let warnText = '';\n\n            let dominant = [];\n            if (maxP - pScores.wisdom <= 10) dominant.push('wisdom');\n            if (maxP - pScores.strength <= 10) dominant.push('strength');\n            if (maxP - pScores.wealth <= 10) dominant.push('wealth');\n            if (maxP - pScores.balance <= 10) dominant.push('balance');\n\n            if (diff <= 15) { archText = ozgI18n.v_bal; }\n            else if (dominant.length === 1) {\n                if (dominant[0] === 'wisdom') archText = ozgI18n.v_pure_w;\n                else if (dominant[0] === 'strength') archText = ozgI18n.v_pure_s;\n                else if (dominant[0] === 'wealth') archText = ozgI18n.v_pure_c;\n                else archText = ozgI18n.v_pure_b;\n            } else if (dominant.length === 2) {\n                if (dominant.includes('wisdom') && dominant.includes('strength')) archText = pScores.wisdom > pScores.strength ? ozgI18n.v_dom_w_s : (pScores.strength > pScores.wisdom ? ozgI18n.v_dom_s_w : ozgI18n.v_dual_w_s);\n                else if (dominant.includes('wisdom') && dominant.includes('wealth')) archText = pScores.wisdom > pScores.wealth ? ozgI18n.v_dom_w_c : (pScores.wealth > pScores.wisdom ? ozgI18n.v_dom_c_w : ozgI18n.v_dual_w_c);\n                else if (dominant.includes('wisdom') && dominant.includes('balance')) archText = pScores.wisdom > pScores.balance ? ozgI18n.v_dom_w_b : (pScores.balance > pScores.wisdom ? ozgI18n.v_dom_b_w : ozgI18n.v_dual_w_b);\n                else if (dominant.includes('strength') && dominant.includes('wealth')) archText = pScores.strength > pScores.wealth ? ozgI18n.v_dom_s_c : (pScores.wealth > pScores.strength ? ozgI18n.v_dom_c_s : ozgI18n.v_dual_s_c);\n                else if (dominant.includes('strength') && dominant.includes('balance')) archText = pScores.strength > pScores.balance ? ozgI18n.v_dom_s_b : (pScores.balance > pScores.strength ? ozgI18n.v_dom_b_s : ozgI18n.v_dual_s_b);\n                else archText = pScores.wealth > pScores.balance ? ozgI18n.v_dom_c_b : (pScores.balance > pScores.wealth ? ozgI18n.v_dom_b_c : ozgI18n.v_dual_c_b);\n            } else { archText = ozgI18n.v_mix; }\n\n            let weakPillar = Object.keys(pScores).reduce((a, b) => pScores[a] < pScores[b] ? a : b);\n            if (weakPillar === 'wisdom') warnText = ozgI18n.w_wisdom;\n            else if (weakPillar === 'strength') warnText = ozgI18n.w_strength;\n            else if (weakPillar === 'wealth') warnText = ozgI18n.w_wealth;\n            else warnText = ozgI18n.w_balance;\n\n            const listEl = document.getElementById('final-focus-list'); listEl.innerHTML = '';\n            selectedFocus.forEach(f => {\n                let p = f.split('_')[0]; let a = f.split('_')[1];\n                let pData = kingdomStruct[p]; let aName = pData.areas[a];\n                listEl.innerHTML += `<div style=\"background:rgba(255,255,255,0.05); border:1px solid ${pData.color}50; border-radius:12px; padding:12px; display:flex; align-items:center; gap:10px;\"><i data-lucide=\"${pData.icon}\" style=\"color:${pData.color}; width:18px;\"><\/i> <span style=\"color:#fff; font-size:0.9rem; font-weight:500;\">${aName}<\/span><\/div>`;\n            });\n\n            const vTextEl = document.getElementById('ai-verdict-text'); vTextEl.innerHTML = '';\n            let typeIdx = 0;\n            const typeEffect = () => {\n                if (typeIdx < archText.length) {\n                    vTextEl.innerHTML = `<strong>${archText.substring(0, typeIdx + 1)}<\/strong>`;\n                    typeIdx++;\n                    setTimeout(typeEffect, 15);\n                } else {\n                    vTextEl.innerHTML += `<div style=\"opacity:0; transition: opacity 1.5s ease-in-out; margin-top:16px; color:var(--warning-color); display:flex; align-items:flex-start; gap:10px; background: rgba(255, 51, 102, 0.05); padding: 12px; border-radius: 12px; border: 1px solid rgba(255, 51, 102, 0.2);\" id=\"warn-fade-box\"><i data-lucide=\"alert-triangle\" style=\"width:20px; min-width:20px; margin-top:2px;\"><\/i> <span>${warnText}<\/span><\/div>`;\n                    lucide.createIcons();\n                    setTimeout(() => { document.getElementById('warn-fade-box').style.opacity = '1'; }, 100);\n                }\n            };\n            setTimeout(typeEffect, 400);\n\n            const cP = (v) => Math.round((v \/ 60) * 100);\n            const ctx = document.getElementById('kingdomChart');\n            if (window.kingdomChartInstance) window.kingdomChartInstance.destroy();\n            const gradient = ctx.getContext('2d').createLinearGradient(0, 0, 0, 400);\n            gradient.addColorStop(0, 'rgba(0, 240, 255, 0.4)');\n            gradient.addColorStop(1, 'rgba(138, 43, 226, 0.4)');\n\n            window.kingdomChartInstance = new Chart(ctx, {\n                type: 'radar',\n                data: {\n                    labels: ['Wisdom', 'Wealth', 'Balance', 'Strength'],\n                    datasets: [{\n                        data: [cP(pScores.wisdom), cP(pScores.wealth), cP(pScores.balance), cP(pScores.strength)],\n                        backgroundColor: gradient, borderColor: '#00f0ff', pointBackgroundColor: ['#3b82f6', '#eab308', '#22c55e', '#ef4444'], pointBorderColor: '#fff', borderWidth: 2, pointRadius: 4\n                    }]\n                },\n                options: {\n                    responsive: true,\n                    maintainAspectRatio: true,\n                    scales: { r: { angleLines: { color: 'rgba(255, 255, 255, 0.1)' }, grid: { color: 'rgba(255, 255, 255, 0.1)' }, pointLabels: { color: '#8b9bb4', font: { family: 'Inter', size: 13, weight: '600' } }, ticks: { display: false, min: 0, max: 100 } } },\n                    plugins: { legend: { display: false } }\n                }\n            });\n\n            loadSmartFeed(true);\n        }\n\n        async function resetQuizAndRetake() {\n            if (!confirm(ozgI18n.confirmErase)) return;\n            localStorage.removeItem('ozg_quiz_answers');\n            localStorage.removeItem('ozg_age_group');\n            await fetch(`${apiBase}\/kingdom\/save_quiz`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ scores: null }) });\n            await fetch(`${apiBase}\/kingdom\/save_focus`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ areas: [] }) });\n            location.reload();\n        }\n\n        async function ozgToggleHabit(el, id) {\n            el.classList.toggle('completed');\n            await fetch(`${apiBase}\/habit\/toggle`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({habit_id: id}) });\n        }\n\n        function ozgOpenSubscribeModal(progId) {\n            ozgCloseAllModals();\n            document.getElementById('ozgSubProgId').value = progId;\n            document.getElementById('ozgSubscribeModal').classList.add('show');\n        }\n\n        async function ozgConfirmSubscribe() {\n            const progId = document.getElementById('ozgSubProgId').value;\n            const coachId = document.getElementById('selectedSubCoachId').value;\n            try {\n                const resp = await fetch(`${apiBase}\/program\/subscribe`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({program_id: progId, coach_id: coachId}) });\n                const result = await resp.json();\n                if (result.success) {\n                    if(result.message) alert(result.message);\n                    window.location.reload();\n                } else if (result.status === 'requires_payment') {\n                    alert(result.message);\n                    window.location.href = result.checkout_url;\n                } else {\n                    alert(result.message || ozgI18n.errorConnection);\n                }\n            } catch(e) { alert(ozgI18n.errorConnection); }\n        }\n\n        async function ozgRemoveQuest(progId) {\n            if (!confirm(ozgI18n.deleteQuestConfirm)) return;\n            await fetch(`${apiBase}\/program\/remove`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ program_id: progId }) });\n            window.location.reload();\n        }\n\n        function ozgShowAddQuestModal(pillar, area) {\n            document.getElementById('addQuestPillar').value = pillar;\n            document.getElementById('addQuestArea').value = area;\n            const select = document.getElementById('addQuestProgramId');\n            select.innerHTML = '';\n            const available = programsWithMeta.filter(p => p.pillar === pillar && p.area === area);\n            if (available.length === 0) {\n                select.innerHTML = `<option value=\"\">${ozgI18n.noAvailableQuests}<\/option>`;\n            } else {\n                available.forEach(prog => {\n                    const option = document.createElement('option');\n                    option.value = prog.ID;\n                    option.textContent = prog.post_title;\n                    select.appendChild(option);\n                });\n            }\n            document.getElementById('ozgAddQuestModal').classList.add('show');\n        }\n\n        async function ozgConfirmAddQuest() {\n            const progId = document.getElementById('addQuestProgramId').value;\n            const coachId = document.getElementById('selectedAddQuestCoachId').value;\n            if (!progId) { alert(ozgI18n.selectQuest); return; }\n            try {\n                const resp = await fetch(`${apiBase}\/program\/add`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ program_id: progId, coach_id: coachId }) });\n                const result = await resp.json();\n                if (result.success) {\n                    if(result.message) alert(result.message);\n                    window.location.reload();\n                } else if (result.status === 'requires_payment') {\n                    alert(result.message);\n                    window.location.href = result.checkout_url;\n                } else {\n                    alert(result.message || ozgI18n.errorConnection);\n                }\n            } catch(e) { alert(ozgI18n.errorConnection); }\n        }\n\n        async function ozgToggleBookmarkFromDash(btn, postId) {\n            if(!confirm('Remove this bookmark?')) return;\n            btn.closest('.ozg-glass').style.opacity = '0.5';\n            await fetch(`${apiBase}\/bookmark\/toggle`, {\n                method: 'POST',\n                headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce},\n                body: JSON.stringify({post_id: postId})\n            });\n            window.location.reload();\n        }\n\n        async function ozgTogglePassionFromDash(btn, postId) {\n            if(!confirm('Remove this from your Main Passion?')) return;\n            btn.closest('.ozg-glass').style.opacity = '0.5';\n            await fetch(`${apiBase}\/passion\/toggle`, {\n                method: 'POST',\n                headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce},\n                body: JSON.stringify({post_id: postId})\n            });\n            window.location.reload();\n        }\n\n        function ozgShowChangeCoachModal(programId) { document.getElementById('changeCoachProgramId').value = programId; document.getElementById('ozgChangeCoachModal').classList.add('show'); }\n\n        async function ozgConfirmChangeCoach() {\n            const programId = document.getElementById('changeCoachProgramId').value;\n            const coachId = document.getElementById('selectedCoachId').value;\n            const resp = await fetch(`${apiBase}\/program\/update_coach`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ program_id: programId, coach_id: coachId }) });\n            const result = await resp.json();\n            if(result.message) alert(result.message);\n            window.location.reload();\n        }\n\n        function ozgShowChangeBossModal(programId) { document.getElementById('changeBossProgramId').value = programId; document.getElementById('ozgChangeBossModal').classList.add('show'); }\n\n        async function ozgConfirmChangeBoss() {\n            const programId = document.getElementById('changeBossProgramId').value;\n            const bossId = document.getElementById('selectedBossId').value;\n            const resp = await fetch(`${apiBase}\/program\/update_boss`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ program_id: programId, boss_id: bossId }) });\n            const result = await resp.json();\n            if(result.message) alert(result.message);\n            window.location.reload();\n        }\n\n        function ozgShowChangeProgramBuddyModal(programId) { document.getElementById('changeBuddyProgramId').value = programId; document.getElementById('ozgChangeProgramBuddyModal').classList.add('show'); }\n\n        async function ozgConfirmChangeProgramBuddy() {\n            const programId = document.getElementById('changeBuddyProgramId').value;\n            const buddyId = document.getElementById('selectedProgBuddyId').value;\n            const resp = await fetch(`${apiBase}\/program\/update_buddy`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ program_id: programId, buddy_id: buddyId }) });\n            const result = await resp.json();\n            if(result.message) alert(result.message);\n            window.location.reload();\n        }\n\n        async function ozgSetBuddy() {\n            const buddyId = document.getElementById('selectedBuddyId').value;\n            if (buddyId == 0) return;\n            const resp = await fetch(`${apiBase}\/buddy\/set`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({buddy_id: buddyId}) });\n            const result = await resp.json();\n            if(result.message) alert(result.message);\n            window.location.reload();\n        }\n\n        async function ozgRespondRequest(reqId, action) {\n            const resp = await fetch(`${apiBase}\/team\/respond`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({request_id: reqId, action: action}) });\n            const result = await resp.json();\n            if(result.success) window.location.reload();\n        }\n\n        async function toggleStudentProgress(studentId, programId, btnElement) {\n            const container = document.getElementById(`student-prog-${studentId}-${programId}`);\n            if (container.style.display === 'none') {\n                container.style.display = 'block';\n                btnElement.innerHTML = `<i data-lucide=\"eye-off\" style=\"width:14px;\"><\/i> ${ozgI18n.hideTrack}`;\n                lucide.createIcons();\n                if (container.innerHTML === '') {\n                    container.innerHTML = '<div style=\"text-align:center;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; width:20px; color:var(--accent-cyan);\"><\/i><\/div>';\n                    lucide.createIcons();\n                    const res = await fetch(`${apiBase}\/team\/student_data?student_id=${studentId}&program_id=${programId}`, { headers: {'X-WP-Nonce': nonce} });\n                    const data = await res.json();\n                    let html = '';\n                    if (data.type === 'global') {\n                        html += `<div style=\"font-size:0.85rem; color:var(--text-muted); margin-bottom:8px;\">${ozgI18n.activeQuests}<\/div>`;\n                        if (data.programs.length === 0) { html += `<div>${ozgI18n.noActiveQuests}<\/div>`; }\n                        else { data.programs.forEach(p => { html += `<div style=\"background:rgba(255,255,255,0.05); padding:8px 12px; border-radius:8px; margin-bottom:6px; font-size:0.9rem;\">${escapeHtml(p)}<\/div>`; }); }\n                    } else {\n                        html += `<div style=\"display:grid; grid-template-columns: 1fr 1fr; gap:16px;\"><div><h5 style=\"color:var(--accent-cyan); margin:0 0 10px 0;\">${ozgI18n.habits}<\/h5>`;\n                        if (data.habits.length === 0) html += `<div style=\"color:var(--text-muted); font-size:0.8rem;\">${ozgI18n.noHabits}<\/div>`;\n                        data.habits.forEach(h => { html += `<div style=\"display:flex; align-items:center; gap:8px; margin-bottom:6px; font-size:0.85rem;\"><i data-lucide=\"${h.completed ? 'check-circle-2' : 'circle'}\" style=\"width:14px; color:${h.completed ? 'var(--success-color)' : 'var(--text-muted)'}\"><\/i> <span style=\"${h.completed ? 'text-decoration:line-through; color:var(--text-muted);' : ''}\">${escapeHtml(h.title)}<\/span><\/div>`; });\n                        html += `<\/div><div><h5 style=\"color:var(--accent-purple); margin:0 0 10px 0;\">${ozgI18n.milestones}<\/h5>`;\n                        if (data.milestones.length === 0) html += `<div style=\"color:var(--text-muted); font-size:0.8rem;\">${ozgI18n.noMilestones}<\/div>`;\n                        data.milestones.forEach(m => { html += `<div style=\"display:flex; align-items:center; gap:8px; margin-bottom:6px; font-size:0.85rem;\"><i data-lucide=\"${m.completed ? 'check-circle-2' : 'circle'}\" style=\"width:14px; color:${m.completed ? 'var(--success-color)' : 'var(--text-muted)'}\"><\/i> <span style=\"${m.completed ? 'color:var(--text-muted);' : ''}\">${escapeHtml(m.title)}<\/span><\/div>`; });\n                        html += `<\/div><\/div>`;\n                    }\n                    container.innerHTML = html;\n                    lucide.createIcons();\n                }\n            } else {\n                container.style.display = 'none';\n                btnElement.innerHTML = `<i data-lucide=\"eye\" style=\"width:14px;\"><\/i> ${ozgI18n.viewTrack}`;\n                lucide.createIcons();\n            }\n        }\n\n        async function rateProgram( programId, rating ) {\n            const starsDiv = document.querySelector(`.stars[data-program=\"${programId}\"]`);\n            if (starsDiv) {\n                for (let i = 1; i <= 5; i++) {\n                    const star = starsDiv.querySelector(`.star[data-value=\"${i}\"]`);\n                    if (star) {\n                        if (i <= rating) star.classList.add('active');\n                        else star.classList.remove('active');\n                    }\n                }\n            }\n            const resp = await fetch(`${apiBase}\/program\/rate`, { method: 'POST', headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': nonce }, body: JSON.stringify( { program_id: programId, rating: rating } ) });\n            if (resp.ok) {\n                const rResp = await fetch(`${apiBase}\/program\/get_rating?program_id=${programId}`, { headers: { 'X-WP-Nonce': nonce } });\n                const data = await rResp.json();\n                const displayDiv = document.getElementById(`rating-display-${programId}`);\n                if (displayDiv && data.average) {\n                    displayDiv.innerHTML = `Average rating: ${data.average} (${data.count} ratings)`;\n                }\n            }\n        }\n\n        \/\/ Keep for backward compatibility - MBTI test redirects to Kingdom Test\n        async function ozgCompleteRPGTest(testType) {\n            if (testType === 'mbti') {\n                ozgOpenKingdomTest();\n            } else if (testType === 'industry') {\n                ozgOpenIndustryQuiz();\n            }\n        }\n\n        function ozgOpenJournalModal(milestoneId = '') {\n            if (ozgI18n.isGuest) return ozgShowSignUpPrompt();\n            ozgCloseAllModals();\n            document.getElementById('ozgJournalMilestoneId').value = milestoneId;\n            document.getElementById('ozgJournalEntry').value = '';\n            document.getElementById('ozgJournalModal').classList.add('show');\n        }\n\n        function ozgInternalNavigate(url) {\n            if (!url || url === '#') return;\n            \/\/ In a mini-app, we want to stay within the same window\n            window.location.href = url;\n        }\n\n\n\n        function ozgOpenModal(type, progId, entityId = 0, currentTitle = '') {\n            ozgCloseAllModals();\n            document.getElementById('ozgType').value = type;\n            document.getElementById('ozgProgId').value = progId;\n            document.getElementById('ozgEntityId').value = entityId;\n            document.getElementById('ozgTitle').value = currentTitle;\n            document.getElementById('ozgProgramFields').style.display = type === 'program' ? 'block' : 'none';\n            document.getElementById('ozgFreq').style.display = type === 'habit' ? 'block' : 'none';\n            document.getElementById('ozgLink').style.display = type === 'milestone' ? 'block' : 'none';\n\n            let title = type === 'program' ? 'Quest' : (type === 'habit' ? 'Habit' : 'Milestone');\n            document.getElementById('ozgModalTitle').innerText = (entityId ? 'Edit ' : 'Create ') + title;\n            document.getElementById('ozgModal').classList.add('show');\n        }\n\n        function ozgUpdateAreas() {\n            const pillar = document.getElementById('ozgPillar').value;\n            const areaSelect = document.getElementById('ozgArea');\n            areaSelect.innerHTML = '';\n            if (pillar && kingdomStruct[pillar]) {\n                for (let a in kingdomStruct[pillar].areas) {\n                    areaSelect.innerHTML += `<option value=\"${a}\">${kingdomStruct[pillar].areas[a]}<\/option>`;\n                }\n            }\n        }\n\n        async function ozgSave() {\n            const type = document.getElementById('ozgType').value;\n            const title = document.getElementById('ozgTitle').value;\n            if (!title.trim()) return;\n            const data = { action: document.getElementById('ozgEntityId').value == 0 ? 'create' : 'update', entity_id: document.getElementById('ozgEntityId').value, entity_type: type, title: title, program_id: document.getElementById('ozgProgId').value };\n            if (type === 'program') { data.pillar = document.getElementById('ozgPillar').value; data.area = document.getElementById('ozgArea').value; }\n            if (type === 'habit') data.frequency = document.getElementById('ozgFreq').value;\n            if (type === 'milestone') data.linked_course = document.getElementById('ozgLink').value;\n\n            const res = await fetch(`${apiBase}\/coach\/manage`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify(data) });\n            const result = await res.json();\n            if (result.success) { if (result.is_copy) alert(ozgI18n.copyCreated); window.location.reload(); } else { alert(ozgI18n.errorConnection); }\n        }\n\n        async function ozgDelete(id) {\n            if (!confirm(ozgI18n.deleteConfirm)) return;\n            const res = await fetch(`${apiBase}\/coach\/manage`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ action: 'delete', entity_id: id }) });\n            if ((await res.json()).success) window.location.reload();\n        }\n\n\n\n\n\n\n\n\n\n        async function ozgSaveJournalEntry() {\n            const text = document.getElementById('ozgJournalEntry').value;\n            const milestoneId = document.getElementById('ozgJournalMilestoneId').value;\n            if (!text.trim()) { alert(ozgI18n.enterJournalText); return; }\n            await fetch(`${apiBase}\/journal\/add`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ entry_text: text, milestone_id: milestoneId }) });\n            document.getElementById('ozgJournalModal').classList.remove('show');\n            if (milestoneId) {\n                await fetch(`${apiBase}\/milestone\/complete`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ milestone_id: milestoneId }) });\n                alert(ozgI18n.milestoneCompletedLog); window.location.reload();\n            } else {\n                loadJournalEntries();\n                loadCohortActivities();\n            }\n        }\n\n        async function loadJournalEntries() {\n            const container = document.getElementById('journal-entries');\n            if (!container) return;\n            container.innerHTML = '<div style=\"text-align:center;\"><i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite; color:var(--accent-purple);\"><\/i><\/div>';\n            lucide.createIcons();\n            try {\n                const res = await fetch(`${apiBase}\/journal\/list`, { headers: {'X-WP-Nonce': nonce} });\n                const entries = await res.json();\n                if (entries.length === 0) {\n                    container.innerHTML = `<div style=\"text-align:center; color:var(--text-muted);\">${ozgI18n.noActiveQuests}<\/div>`;\n                } else {\n                    container.innerHTML = entries.map(e => `\n                        <div style=\"background:rgba(255,255,255,0.03); padding:16px; border-radius:16px; margin-bottom:12px; border:1px solid rgba(255,255,255,0.05);\">\n                            <div style=\"font-size:0.8rem; color:var(--text-muted); margin-bottom:8px;\"><i data-lucide=\"clock\" style=\"width:12px; display:inline-block; vertical-align:middle;\"><\/i> ${new Date(e.created_at).toLocaleString()}<\/div>\n                            <div style=\"color:var(--text-main); font-size:0.95rem; line-height:1.5;\">${escapeHtml(e.entry_text).replace(\/\\n\/g, '<br>')}<\/div>\n                        <\/div>\n                    `).join('');\n                }\n                lucide.createIcons();\n            } catch(e) { container.innerHTML = `<div style=\"color:var(--warning-color);\">${ozgI18n.errorConnection}<\/div>`; }\n        }\n\n        async function loadCohortActivities() {\n            const container = document.getElementById('cohort-activities');\n            if (!container) return;\n            try {\n                const res = await fetch(`${apiBase}\/cohort\/activities`, { headers: {'X-WP-Nonce': nonce} });\n                const activities = await res.json();\n                if (activities.length > 0) {\n                    container.innerHTML = activities.map(a => `\n                        <div style=\"display:flex; align-items:flex-start; gap:10px; margin-bottom:12px; font-size:0.85rem; border-bottom:1px dashed rgba(255,255,255,0.1); padding-bottom:8px;\">\n                            <div style=\"width:8px; height:8px; border-radius:50%; background:var(--accent-cyan); margin-top:6px;\"><\/div>\n                            <div><strong style=\"color:#fff;\">${escapeHtml(a.display_name)}<\/strong> <span style=\"color:var(--text-muted);\">${a.action_text}<\/span><\/div>\n                        <\/div>\n                    `).join('');\n                } else {\n                    container.innerHTML = `<div style=\"color:var(--text-muted); font-size:0.85rem; text-align:center;\">${ozgI18n.noActiveQuests}<\/div>`;\n                }\n            } catch(e) {}\n        }\n\n\n\n        function ozgShowCreateChallenge() { document.getElementById('ozgCreateChallengeModal').classList.add('show'); }\n\n        async function ozgCreateChallenge() {\n            const title = document.getElementById('ozgChallengeTitle').value;\n            const habitId = document.getElementById('ozgChallengeHabit').value;\n            const type = document.getElementById('ozgChallengeType').value;\n            if (!title.trim() || habitId == 0) { alert(ozgI18n.enterTitleHabit); return; }\n            await fetch(`${apiBase}\/challenge\/create`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ title: title, habit_id: habitId, type: type }) });\n            window.location.reload();\n        }\n\n        function ozgJoinChallenge(id) {\n            fetch(`${apiBase}\/challenge\/join`, { method: 'POST', headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce}, body: JSON.stringify({ challenge_id: id }) })\n            .then(() => window.location.reload());\n        }\n\n\n\n        \/\/ \u2500\u2500 v11.30 helpers \u2500\u2500\n        \/\/ Set creation bar bottom to sit above mobile nav\n        function ozgUpdateCreationBarBottom() {\n            const nav = document.querySelector('.ozg-mob-nav');\n            const footer = document.getElementById('draggableFooter');\n            const bar = document.getElementById('ozgCreationBar');\n            if (bar) {\n                let bottom = 8;\n                if (nav && window.getComputedStyle(nav).display !== 'none') {\n                    bottom = nav.offsetHeight + 8;\n                } else if (footer && window.getComputedStyle(footer).display !== 'none') {\n                    bottom = footer.offsetHeight + 8;\n                }\n                bar.style.bottom = bottom + 'px';\n            }\n        }\n\n                function ozgCreationGuardedClose() {\n            if (window._ozgCreationDraftSaved) { ozgForceCloseCreation(); return; }\n            const w = document.getElementById('ozgUnsavedWarnModal');\n            if (w) { w.style.display = 'flex'; lucide.createIcons(); }\n        }\n        function ozgForceCloseCreation() {\n            document.getElementById('ozgUnsavedWarnModal').style.display = 'none';\n            const m = document.getElementById('ozgCreationPanelModal');\n            if (m) m.classList.remove('show');\n            const iw = document.getElementById('ozgEditorIframeWrap');\n            if (iw) iw.style.display = 'none';\n            const iframe = document.getElementById('ozgEditorIframe');\n            if (iframe) iframe.src = 'about:blank';\n            const body = document.getElementById('ozgCreationPanelBody');\n            if (body) body.style.display = 'block';\n            const ab = document.getElementById('ozgCreationActionBar');\n            if (ab) ab.style.display = 'none';\n            window._ozgCreationDraftSaved = false;\n            window._ozgCreationDraftId = null;\n            window._ozgCreationEditUrl = null;\n            if (localStorage.getItem('ozgActiveTab') === 'coach') {\n                const bar = document.getElementById('ozgCreationBar');\n                if (bar) bar.classList.add('visible');\n            }\n        }\n        async function ozgPublishCreationDraft() {\n            if (!window._ozgCreationDraftId) return;\n            try {\n                const r = await fetch(apiBase + '\/content\/publish', { method:'POST', headers:{'Content-Type':'application\/json','X-WP-Nonce':nonce}, body:JSON.stringify({id:window._ozgCreationDraftId}) });\n                const d = await r.json();\n                showHeaderToast(d.success ? '\ud83d\ude80 Published!' : '\u26a0\ufe0f ' + (d.message||'Error'));\n                if (d.success) { window._ozgCreationDraftSaved = true; ozgForceCloseCreation(); }\n            } catch(e) { showHeaderToast(ozgI18n.errorConnection); }\n        }\n        function ozgOpenCreationEditor() {\n            if (!window._ozgCreationEditUrl) return;\n            ozgOpenIframeEditor(window._ozgCreationEditUrl, 'Full Editor');\n            window._ozgCreationDraftSaved = true;\n        }\n        let _ozgPFTag = '';\n        function ozgSetProfileFeedTag(tag, btn) {\n            _ozgPFTag = tag;\n            document.querySelectorAll('#ozgProfileFeedTags .ozg-feed-tag-btn').forEach(b => b.classList.remove('active'));\n            if (btn) btn.classList.add('active');\n            ozgFilterProfileFeed();\n        }\n        function ozgFilterProfileFeed() {\n            const q = (document.getElementById('ozgProfileFeedSearch')?.value || '').toLowerCase();\n            const typeMap = { 'finance': ['wp-fundraising','campaign'], 'courses': ['courses','course'], 'jobs': ['job','vacancy'], 'challenges': ['challenge','arena'], 'video': ['video'], 'photo': ['photo','image'] };\n            document.querySelectorAll('#ozgProfileFeedGrid .ozg-profile-post-item').forEach(el => {\n                const t = (el.dataset.title||'').toLowerCase();\n                const tp = (el.dataset.type||'').toLowerCase();\n                const matchQ = !q || t.includes(q);\n                const matchTag = !_ozgPFTag || (typeMap[_ozgPFTag] ? typeMap[_ozgPFTag].some(v => tp.includes(v)) : tp.includes(_ozgPFTag));\n                el.style.display = (matchQ && matchTag) ? 'block' : 'none';\n            });\n        }\n        function ozgCoachSearchFilter() {\n            const q = (document.getElementById('ozgCoachSearch')?.value || '').toLowerCase();\n            document.querySelectorAll('#coach-programs-container .ozg-coach-item').forEach(el => {\n                const t = (el.dataset.title || '').toLowerCase();\n                el.style.display = (!q || t.includes(q)) ? 'block' : 'none';\n            });\n        }\n\n        function ozgCoachFilter(cat, btn) {\n            document.querySelectorAll('#coach .ozg-feed-tag-btn').forEach(b => b.classList.remove('active'));\n            if (btn) btn.classList.add('active');\n            document.querySelectorAll('#coach-programs-container .ozg-coach-item').forEach(el => {\n                el.style.display = (!cat || (el.dataset.type||'') === cat) ? 'block' : 'none';\n            });\n        }\n\n        function ozgCompleteMilestoneWithJournal(milestoneId, title) {\n            ozgOpenJournalModal(milestoneId);\n            const titleEl = document.getElementById('ozgJournalModalTitle');\n            if (titleEl) titleEl.innerText = 'Complete: ' + title;\n        }\n\n        function ozgSwitchModalProfileTab(tab, btn) {\n            document.querySelectorAll('#ozgUserProfileModal .ozg-profile-tab').forEach(b => {\n                b.classList.remove('active');\n                b.style.color = 'var(--text-muted)';\n                b.style.borderBottomColor = 'transparent';\n            });\n            btn.classList.add('active');\n            btn.style.color = '#fff';\n            btn.style.borderBottomColor = 'var(--accent-cyan)';\n\n            document.querySelectorAll('.ozg-modal-profile-view').forEach(v => v.style.display = 'none');\n            const target = document.getElementById('ozgModalProfile-' + tab);\n            if (target) target.style.display = 'block';\n        }\n\n        async function ozgOpenUserProfileModal(userId) {\n            ozgCloseAllModals();\n            ozgSwitchTab('profile');\n            loadUserProfile(userId);\n        }\n\n        function escapeHtml(str) {\n            if (!str) return '';\n            return str.replace(\/[&<>]\/g, function(m) {\n                if (m === '&') return '&amp;';\n                if (m === '<') return '&lt;';\n                if (m === '>') return '&gt;';\n                return m;\n            }).replace(\/\"\/g, '&quot;').replace(\/'\/g, '&#039;');\n        }\n\n\n        async function ozgStartContentWizard(type) {\n            ozgTriggerBotHelp(type + '_start');\n\n            if (type === 'hobbist_course') {\n                ozgOpenModal('program'); \/\/ Fallback to existing modal until custom wizard ready\n            } else if (type === 'Finance_campaign') {\n                 window.location.href = '\/dashboard\/create-campaign\/'; \/\/ Direct to FundEngine FE\n            } else if (type === 'product') {\n                 window.location.href = '\/dashboard\/add-product\/';\n            } else {\n                 window.location.href = '\/wp-admin\/post-new.php'; \/\/ Post fallback\n            }\n        }\n\n\n\n        function ozgTriggerBotHelp(step) {\n            if (typeof qcld_wp_chatbot_open !== 'function') return;\n\n            const intents = {\n                'general_creator': 'How do I add content?',\n                'course_start': 'Help me create an Emirat Course',\n                'course_curriculum': 'How to add lessons and quizzes?',\n                'campaign_start': 'Tell me about Finance campaigns',\n                'product_start': 'How to add a store product?'\n            };\n\n            const msg = intents[step] || 'I need help adding content';\n\n            \/\/ Open and send message\n            qcld_wp_chatbot_open();\n            setTimeout(() => {\n                const input = document.getElementById('qlcd_wp_chatbot_input');\n                if (input) {\n                    input.value = msg;\n                    const sendBtn = document.getElementById('qlcd_wp_chatbot_send_btn');\n                    if (sendBtn) sendBtn.click();\n                }\n            }, 500);\n        }\n\n\n\n        function ozgOpenFsModal(type) {\n            const typeMap = { hobbist_course:'course', Finance_campaign:'campaign', product:'product', service:'product', page:'page', post:'post', lesson:'lesson' };\n            ozgShowCreationPanel(typeMap[type] || type);\n        }\n\n\n\n        function ozgFsModalAction(action) {\n            if (action === 'bot') {\n                if (typeof qcld_wp_chatbot_open === 'function') {\n                    qcld_wp_chatbot_open();\n                } else {\n                    alert('AI Assistant is currently offline.');\n                }\n            }\n        }\n\n\n\n        async function ozgOpenFullEditor(type, postId) {\n            if (ozgI18n.isGuest) return ozgShowSignUpPrompt();\n\n            let editUrl;\n            try {\n                const r = await fetch(`${apiBase}\/content\/edit_url?id=${postId}`, { headers: {'X-WP-Nonce': nonce} });\n                const d = await r.json();\n                editUrl = d.edit_url || null;\n            } catch(e) { editUrl = null; }\n\n            if (!editUrl) { showHeaderToast('Could not find editor URL.'); return; }\n\n            const m = document.getElementById('ozgCreationPanelModal');\n            if (m) m.classList.remove('show');\n\n            ozgOpenIframeEditor(editUrl, 'Full Editor');\n        }\n\n        function ozgOpenIframeEditor(url, title) {\n            const modal = document.getElementById('ozgCreationPanelModal');\n            const titleEl = document.getElementById('ozgCreationPanelTitle');\n            const panelBody = document.getElementById('ozgCreationPanelBody');\n            const iframeWrap = document.getElementById('ozgEditorIframeWrap');\n            const iframe = document.getElementById('ozgEditorIframe');\n            const actionBar = document.getElementById('ozgCreationActionBar');\n\n            if (!modal || !iframe) return;\n\n            if (titleEl) titleEl.innerHTML = `<i data-lucide=\"pencil-ruler\" style=\"width:18px;color:var(--cyan);\"><\/i> ${title || 'Editor'}`;\n            if (panelBody) panelBody.style.display = 'none';\n            if (actionBar) actionBar.style.display = 'none';\n            if (iframeWrap) iframeWrap.style.display = 'block';\n\n            iframe.src = url;\n\n            \/\/ Listen for load to detect redirects (e.g. after save)\n            iframe.onload = function() {\n                try {\n                    const currentUrl = iframe.contentWindow.location.href;\n                    \/\/ If it redirects back to the campaign list or dashboard, close and show modal\n                    if (currentUrl.includes('wfp-page=campaign') && !currentUrl.includes('camp=')) {\n                         showHeaderToast('\u2705 Campaign saved!');\n                         ozgForceCloseCreation();\n                         if (window._ozgCreationDraftId) ozgOpenFundraisingModal(window._ozgCreationDraftId);\n                    }\n                } catch(e) {\n                    \/\/ Cross-origin might block reading href, but FundEngine is same-origin\n                }\n            };\n\n            modal.classList.add('show');\n            lucide.createIcons();\n        }\n\n        async function ozgOpenEditorModal(postId) {\n            if (ozgI18n.isGuest) return ozgShowSignUpPrompt();\n\n            try {\n                const r = await fetch(`${apiBase}\/feed\/item\/${postId}`, { headers: {'X-WP-Nonce': nonce} });\n                const item = await r.json();\n\n                if (!item.success) { showHeaderToast('Item not found.'); return; }\n\n                if (item.type === 'courses' || item.type === 'wp-fundraising' || item.type === 'campaign') {\n                    showHeaderToast('Opening Simple Editor...');\n                    const simpleType = (item.type === 'courses') ? 'course' : 'campaign';\n                    ozgShowCreationPanel(simpleType, postId);\n                } else {\n                    showHeaderToast('Opening Full Editor...');\n                    let editUrl;\n                    try {\n                        const r2 = await fetch(`${apiBase}\/content\/edit_url?id=${postId}`, { headers: {'X-WP-Nonce': nonce} });\n                        const d2 = await r2.json();\n                        editUrl = d2.edit_url || null;\n                    } catch(e) { editUrl = null; }\n\n                    if (!editUrl) { showHeaderToast('Could not find editor URL.'); return; }\n                    ozgOpenIframeEditor(editUrl, 'Full Editor');\n                }\n            } catch(e) {\n                console.error('Editor open error:', e);\n                showHeaderToast('Error opening editor.');\n            }\n        }\n\n\n\n        async function ozgSendEnrollRequest(studentId, programId, btnEl) {\n            if (!studentId || !programId) { showHeaderToast('Select a student and program first.'); return; }\n            if (btnEl) { btnEl.disabled = true; btnEl.innerText = 'Sending\u2026'; }\n            try {\n                const resp = await fetch(`${apiBase}\/enroll\/request`, {\n                    method: 'POST',\n                    headers: {'Content-Type':'application\/json','X-WP-Nonce': nonce},\n                    body: JSON.stringify({ student_id: studentId, program_id: programId })\n                });\n                const result = await resp.json();\n                if (result.success) {\n                    showHeaderToast('\u2705 ' + (result.message || 'Enrollment request sent!'));\n                    \/\/ Close the enroll modal\n                    const enrollModal = document.getElementById('ozgEnrollRequestModal');\n                    if (enrollModal) enrollModal.classList.remove('show');\n                } else {\n                    showHeaderToast('\u26a0\ufe0f ' + (result.message || 'Failed to send request.'));\n                    if (btnEl) { btnEl.disabled = false; btnEl.innerText = 'Send Enroll Request'; }\n                }\n            } catch(e) { showHeaderToast(ozgI18n.errorConnection); if (btnEl) { btnEl.disabled = false; btnEl.innerText = 'Send Enroll Request'; } }\n        }\n\n\n\n        async function ozgSearchStudentsForEnroll(query) {\n            const results = document.getElementById('ozgEnrollStudentResults');\n            if (!query || query.length < 2) { results.innerHTML = ''; return; }\n            try {\n                const resp = await fetch(`${apiBase}\/users\/search?q=${encodeURIComponent(query)}`, { headers: {'X-WP-Nonce': nonce} });\n                const users = await resp.json();\n                results.innerHTML = users.map(u => `\n                    <div style=\"padding:8px 12px; border-radius:8px; cursor:pointer; display:flex; align-items:center; gap:10px; background:rgba(255,255,255,0.03);\"\n                        onclick=\"document.getElementById('ozgEnrollStudentId').value=${u.id}; document.getElementById('ozgEnrollStudentSearch').value='${escapeHtml(u.name)}'; document.getElementById('ozgEnrollStudentResults').innerHTML='';\">\n                        <img decoding=\"async\" src=\"${u.avatar||'https:\/\/www.gravatar.com\/avatar\/?d=mp&s=32'}\" style=\"width:32px;height:32px;border-radius:50%;\">\n                        <div><div style=\"color:#fff;font-size:0.9rem;\">${escapeHtml(u.name)}<\/div><div style=\"color:var(--text-muted);font-size:0.75rem;\">${escapeHtml(u.email||'')}<\/div><\/div>\n                    <\/div>`).join('');\n            } catch(e) { results.innerHTML = ''; }\n        }\n\n\n\n        function ozgShowEnrollRequestModal(programId, programTitle) {\n            const modal = document.getElementById('ozgEnrollRequestModal');\n            if (!modal) {\n                \/\/ Build modal on the fly if not in DOM\n                const m = document.createElement('div');\n                m.className = 'ozg-modal-overlay';\n                m.id = 'ozgEnrollRequestModal';\n                m.innerHTML = `<div class=\"ozg-modal\" style=\"max-width:440px;\">\n                    <h3 style=\"color:#fff; margin:0 0 16px 0;\">Send Enrollment Request<\/h3>\n                    <p style=\"color:var(--text-muted); font-size:0.9rem; margin-bottom:16px;\">\n                        Course: <strong style=\"color:#fff;\" id=\"ozgEnrollProgTitle\"><\/strong>\n                    <\/p>\n                    <input type=\"hidden\" id=\"ozgEnrollProgId\">\n                    <input type=\"text\" id=\"ozgEnrollStudentSearch\" class=\"ozg-input\" placeholder=\"Search student by name or email\u2026\"\n                        oninput=\"ozgSearchStudentsForEnroll(this.value)\" style=\"margin-bottom:8px;\">\n                    <div id=\"ozgEnrollStudentResults\" style=\"max-height:200px; overflow-y:auto; margin-bottom:16px;\"><\/div>\n                    <input type=\"hidden\" id=\"ozgEnrollStudentId\">\n                    <div style=\"display:flex; justify-content:flex-end; gap:10px;\">\n                        <button class=\"ozg-btn-sec\" onclick=\"document.getElementById('ozgEnrollRequestModal').classList.remove('show')\">Cancel<\/button>\n                        <button class=\"ozg-btn\" onclick=\"ozgSendEnrollRequest(parseInt(document.getElementById('ozgEnrollStudentId').value), parseInt(document.getElementById('ozgEnrollProgId').value), this)\">Send Enroll Request<\/button>\n                    <\/div>\n                <\/div>`;\n                document.body.appendChild(m);\n            }\n            document.getElementById('ozgEnrollProgId').value = programId;\n            document.getElementById('ozgEnrollProgTitle').innerText = programTitle;\n            document.getElementById('ozgEnrollStudentId').value = '';\n            document.getElementById('ozgEnrollStudentSearch').value = '';\n            document.getElementById('ozgEnrollStudentResults').innerHTML = '';\n            document.getElementById('ozgEnrollRequestModal').classList.add('show');\n        }\n\n\n\n        async function ozgShowDonationPanel(campaignId, campaignUrl, btn, kaspiMobile = '') {\n            const panel = document.getElementById(`ozgDonationPanel_${campaignId}`);\n            if (!panel) return;\n\n            if (panel.style.display === 'none') {\n                panel.style.display = 'block';\n                panel.style.background = '#0f121e';\n                panel.style.padding = '20px';\n                panel.style.color = '#fff';\n                panel.style.border = '1px solid #eab308';\n                panel.style.borderRadius = '16px';\n\n                const resp = await fetch(`${apiBase}\/fundraising\/details\/${campaignId}`, { headers: {'X-WP-Nonce': nonce} });\n                const data = await resp.json();\n\n                const transferMethods = data.transfer_methods || ['kaspi_payment'];\n                const receiverName = data.receiver_name || '';\n                const halykMobile = data.halyk_mobile || '';\n                const currentKaspiMobile = data.kaspi_mobile || kaspiMobile;\n\n                const investorName = EXPECTED_USER_NAME || '';\n\n                let methodSelector = '';\n                if (transferMethods.length > 1) {\n                    methodSelector = `\n                        <div style=\"margin-bottom:16px;\">\n                            <label style=\"display:block; font-size:0.8rem; color:var(--text-muted); margin-bottom:6px;\">Choose Payment Method<\/label>\n                            <select id=\"ozgPaymentMethod_${campaignId}\" class=\"ozg-input\" onchange=\"ozgUpdateDonationMethodView(${campaignId}, this.value)\">\n                                ${transferMethods.map(m => {\n                                    let label = 'Other';\n                                    if (m === 'kaspi_payment') label = 'Kaspi.kz';\n                                    else if (m === 'halyk_payment') label = 'Halyk Bank';\n                                    else if (m === 'bank_payment') label = 'Bank Transfer';\n                                    else if (m === 'offline_payment') label = 'Cash';\n                                    return `<option value=\"${m}\">${label}<\/option>`;\n                                }).join('')}\n                            <\/select>\n                        <\/div>\n                    `;\n                }\n\n                panel.innerHTML = `\n                    <div style=\"display:flex; flex-direction:column; gap:16px;\">\n                        <h4 style=\"margin:0; color:#eab308; font-size:1.1rem; display:flex; align-items:center; gap:8px;\">\n                            <i data-lucide=\"heart-handshake\" style=\"width:20px;\"><\/i> Support Mission\n                        <\/h4>\n\n                        ${methodSelector}\n\n                        <div id=\"ozgMethodDetails_${campaignId}\">\n                            ${ozgGetMethodDetailsHtml(transferMethods[0], currentKaspiMobile, halykMobile, receiverName, data.kaspi_name, data.halyk_name)}\n                        <\/div>\n\n                        <div style=\"background:rgba(255,170,0,0.05); border:1px solid rgba(255,170,0,0.2); padding:12px; border-radius:12px; font-size:0.85rem; color:#fef08a;\">\n                            After clicking \"Invest now\", you will be redirected to complete the transfer.\n                        <\/div>\n                        <div>\n                            <label style=\"display:block; font-size:0.8rem; color:var(--text-muted); margin-bottom:6px;\">Your Name (for records)<\/label>\n                            <input type=\"text\" id=\"ozgKaspiName_${campaignId}\" class=\"ozg-input\" value=\"${investorName}\" style=\"margin-bottom:0; background:rgba(255,255,255,0.05); border-color:rgba(255,255,255,0.1);\">\n                        <\/div>\n                        <div>\n                            <label style=\"display:block; font-size:0.8rem; color:var(--text-muted); margin-bottom:6px;\">Amount (\u20b8)<\/label>\n                            <input type=\"number\" id=\"ozgKaspiAmount_${campaignId}\" class=\"ozg-input\" placeholder=\"e.g. 5000\" style=\"margin-bottom:0; background:rgba(255,255,255,0.05); border-color:rgba(255,255,255,0.1);\">\n                        <\/div>\n                        <label style=\"display:flex; align-items:center; gap:8px; font-size:0.85rem; cursor:pointer; color:rgba(255,255,255,0.7);\">\n                            <input type=\"checkbox\" id=\"ozgKaspiAnon_${campaignId}\" style=\"width:16px; height:16px; accent-color:#eab308;\">\n                            Incognito (Anonymous investment)\n                        <\/label>\n                        <button class=\"ozg-btn\" style=\"background:linear-gradient(135deg,#eab308,#fbbf24); color:#000; width:100%; justify-content:center; padding:14px; font-weight:800;\"\n                            onclick=\"ozgSubmitDonationIntent(${campaignId}, this)\">\n                            <i data-lucide=\"send\"><\/i> Invest now\n                        <\/button>\n                    <\/div>\n                `;\n                btn.innerHTML = '<i data-lucide=\"chevron-up\"><\/i> Hide Form';\n                lucide.createIcons();\n\n                \/\/ Store data for view updates\n                panel._campaignData = data;\n\n                setTimeout(() => panel.scrollIntoView({ behavior:'smooth', block:'start' }), 150);\n            } else {\n                panel.style.display = 'none';\n                btn.innerHTML = '<i data-lucide=\"heart\"><\/i> Invest now';\n                lucide.createIcons();\n            }\n        }\n\n        function ozgUpdateDonationMethodView(campaignId, method) {\n            const panel = document.getElementById(`ozgDonationPanel_${campaignId}`);\n            const details = document.getElementById(`ozgMethodDetails_${campaignId}`);\n            if (!panel || !details || !panel._campaignData) return;\n\n            const data = panel._campaignData;\n            details.innerHTML = ozgGetMethodDetailsHtml(method, data.kaspi_mobile, data.halyk_mobile, data.receiver_name, data.kaspi_name, data.halyk_name);\n            if (typeof lucide !== 'undefined') lucide.createIcons();\n        }\n\n        function ozgGetMethodDetailsHtml(method, kaspi, halyk, receiver, kaspiName, halykName) {\n            let phone = '';\n            let label = '';\n            let name = receiver || '';\n            if (method === 'kaspi_payment') {\n                phone = kaspi;\n                label = 'Kaspi Number';\n                if (kaspiName) name = kaspiName;\n            } else if (method === 'halyk_payment') {\n                phone = halyk;\n                label = 'Halyk Number';\n                if (halykName) name = halykName;\n            }\n\n            if (!phone && !name) return `<div style=\"background:rgba(255,255,255,0.05); padding:14px; border-radius:12px; border:1px solid rgba(255,255,255,0.1); color:var(--text-muted); font-size:0.9rem;\">Please contact the creator for ${method.replace('_', ' ')} details.<\/div>`;\n\n            return `\n                <div style=\"background:rgba(255,255,255,0.05); padding:14px; border-radius:12px; border:1px solid rgba(255,255,255,0.1);\">\n                    ${phone ? `\n                    <div style=\"font-size:0.75rem; color:var(--text-muted); margin-bottom:4px; text-transform:uppercase;\">${label}<\/div>\n                    <div style=\"display:flex; justify-content:space-between; align-items:center; margin-bottom:8px;\">\n                        <span style=\"font-size:1.2rem; font-weight:700; color:#fff; letter-spacing:1px;\">${phone}<\/span>\n                        <button class=\"ozg-btn-sec\" style=\"padding:6px 12px; font-size:0.75rem;\" onclick=\"ozgCopyText('${phone}', this)\">\n                            <i data-lucide=\"copy\" style=\"width:14px;\"><\/i> Copy\n                        <\/button>\n                    <\/div>\n                    ` : ''}\n                    ${name ? `\n                    <div style=\"font-size:0.75rem; color:var(--text-muted); margin-bottom:4px; text-transform:uppercase; border-top:1px solid rgba(255,255,255,0.1); padding-top:8px;\">Receiver Name<\/div>\n                    <div style=\"font-size:1rem; font-weight:600; color:#fff; display:flex; align-items:center; justify-content:space-between;\">\n                        <span>${escapeHtml(name)}<\/span>\n                        <button class=\"ozg-btn-sec\" style=\"padding:4px 10px; font-size:0.7rem;\" onclick=\"ozgCopyText('${escapeHtml(name)}', this)\">\n                            <i data-lucide=\"copy\" style=\"width:12px;\"><\/i> Copy\n                        <\/button>\n                    <\/div>\n                    ` : ''}\n                <\/div>\n            `;\n        }\n\n        async function ozgSubmitDonationIntent(campaignId, btnEl) {\n            const method = document.getElementById(`ozgPaymentMethod_${campaignId}`)?.value || 'kaspi_payment';\n            const name = document.getElementById(`ozgKaspiName_${campaignId}`).value.trim();\n            const amount = parseFloat(document.getElementById(`ozgKaspiAmount_${campaignId}`).value);\n            const anonymous = document.getElementById(`ozgKaspiAnon_${campaignId}`).checked;\n\n            if (!name || isNaN(amount) || amount <= 0) {\n                alert('Please enter a valid name and amount.');\n                return;\n            }\n\n            btnEl.disabled = true;\n            btnEl.innerHTML = '<i data-lucide=\"loader\" style=\"animation:spin 1s linear infinite;\"><\/i> Processing...';\n            lucide.createIcons();\n\n            try {\n                const resp = await fetch(`${apiBase}\/fundraising\/kaspi_intent`, {\n                    method: 'POST',\n                    headers: {'Content-Type': 'application\/json', 'X-WP-Nonce': nonce},\n                    body: JSON.stringify({\n                        campaign_id: campaignId,\n                        amount: amount,\n                        investor_name: name,\n                        anonymous: anonymous,\n                        payment_method: method\n                    })\n                });\n                const data = await resp.json();\n                if (data.success) {\n                    showHeaderToast('\u2705 Donation recorded!');\n\n                    let targetUrl = '';\n                    if (method === 'kaspi_payment' && data.kaspi_url) {\n                        targetUrl = data.kaspi_url;\n                    } else if (method === 'halyk_payment') {\n                        \/\/ Halyk deep link if available, or just instructions\n                        const cleanPhone = (data.halyk_mobile || '').replace(\/[^0-9]\/g, '');\n                        if (cleanPhone) targetUrl = `https:\/\/www.halykbank.kz\/payments\/transfers?phone=${cleanPhone}&amount=${amount}`;\n                    }\n\n                    setTimeout(() => {\n                        if (targetUrl) {\n                            if (tg && tg.openLink) {\n                                tg.openLink(targetUrl);\n                            } else {\n                                const a = document.createElement('a');\n                                a.href = targetUrl;\n                                a.target = '_blank';\n                                a.rel = 'noopener noreferrer';\n                                a.click();\n                            }\n                        } else {\n                            alert('Donation recorded. Please complete the transfer using the information provided.');\n                        }\n                        document.getElementById('ozgFundraisingModal').classList.remove('show');\n                        loadSmartFeed(true);\n                    }, 1000);\n                } else {\n                    alert(data.message || 'Error processing intent.');\n                    btnEl.disabled = false;\n                    btnEl.innerHTML = '<i data-lucide=\"send\"><\/i> Invest now';\n                    lucide.createIcons();\n                }\n            } catch(e) {\n                console.error(e);\n                alert('Connection error. Please try again.');\n                btnEl.disabled = false;\n                btnEl.innerHTML = '<i data-lucide=\"send\"><\/i> Invest now';\n                lucide.createIcons();\n            }\n        }\n\n\n\n        async function ozgOpenFeedCardFromId(postId) {\n            \/\/ INSTANT FEEDBACK: Open a generic modal shell with a loader\n            ozgCloseAllModals();\n\n            \/\/ Check if we already have the type info in some data attribute to avoid extra fetch\n            const cardEl = document.querySelector(`.ozg-feed-card[data-post-id=\"${postId}\"]`) ||\n                           document.querySelector(`[data-post-id=\"${postId}\"]`);\n            const postType = cardEl ? cardEl.getAttribute('data-post-type') : null;\n\n            if (postType) {\n                if (postType === 'courses' && ozgI18n.coursePopupId > 0 && typeof elementorProFrontend !== 'undefined') {\n                    elementorProFrontend.modules.popup.showPopup( { id: ozgI18n.coursePopupId } );\n                    return;\n                }\n                if ((postType === 'wp-fundraising' || postType === 'campaign') && ozgI18n.campaignPopupId > 0 && typeof elementorProFrontend !== 'undefined') {\n                    elementorProFrontend.modules.popup.showPopup( { id: ozgI18n.campaignPopupId } );\n                    return;\n                }\n            }\n\n            const modal = document.getElementById('ozgFsModal'); \/\/ Use floating modal as a generic \"System Loader\"\n            const titleEl = document.getElementById('ozgFsModalTitle');\n\n            if (modal) {\n                if (titleEl) titleEl.innerHTML = '<i data-lucide=\"loader\" class=\"ozg-spin\"><\/i> Loading...';\n                modal.classList.add('show');\n                if (typeof lucide !== 'undefined') lucide.createIcons();\n            }\n\n            try {\n                const resp = await fetch(`${apiBase}\/feed\/item\/${postId}?_=${Date.now()}`, { headers: {'X-WP-Nonce': nonce} });\n                const data = await resp.json();\n\n                if (!data.success) {\n                    if (modal) modal.classList.remove('show');\n                    showHeaderToast('Content not found');\n                    return;\n                }\n\n                \/\/ If type matched a popup, close skeleton and open popup\n                if (data.type === 'courses' && ozgI18n.coursePopupId > 0 && typeof elementorProFrontend !== 'undefined') {\n                    if (modal) modal.classList.remove('show');\n                    elementorProFrontend.modules.popup.showPopup( { id: ozgI18n.coursePopupId } );\n                    return;\n                }\n                if ((data.type === 'wp-fundraising' || data.type === 'campaign') && ozgI18n.campaignPopupId > 0 && typeof elementorProFrontend !== 'undefined') {\n                    if (modal) modal.classList.remove('show');\n                    elementorProFrontend.modules.popup.showPopup( { id: ozgI18n.campaignPopupId } );\n                    return;\n                }\n\n                \/\/ Hide the generic loader modal before opening the specific one\n                if (modal) modal.classList.remove('show');\n\n                if (data.type === 'courses') {\n                    ozgOpenCourseModal(postId);\n                } else if (['lesson', 'tutor_quiz', 'tutor_assignments', 'sfwd-lessons', 'topics'].includes(data.type)) {\n                    ozgOpenLessonModal(postId);\n                } else if (['wp-fundraising', 'campaign', 'give_forms', 'give_p2p', 'p2p_campaign'].includes(data.type)) {\n                    ozgOpenFundraisingModal(postId);\n                } else {\n                    ozgOpenPageInDashboard(postId, data.title, data.url);\n                }\n            } catch (e) {\n                if (modal) modal.classList.remove('show');\n                console.error('Feed item fetch error:', e);\n                showHeaderToast('Error opening content.');\n            }\n        }\n\n        function ozgShowBrowserSyncPrompt(token) {\n            const syncUrl = `${window.location.origin}\/?ozg_login_token=${token}`;\n\n            \/\/ Create a custom toast\/notification for syncing\n            const prompt = document.createElement('div');\n            prompt.style.cssText = 'position:fixed; bottom:80px; left:50%; transform:translateX(-50%); background:#1c1c1e; border:1px solid var(--accent-cyan); color:#fff; padding:20px; border-radius:20px; box-shadow:0 10px 40px rgba(0,0,0,0.5); z-index:200000; width:90%; max-width:350px; text-align:center; animation:fadeInUp 0.3s ease;';\n            prompt.innerHTML = `\n                <div style=\"font-weight:700; margin-bottom:10px;\">Login on all devices?<\/div>\n                <p style=\"font-size:0.85rem; color:var(--text-muted); margin-bottom:16px;\">Synchronize your login to your system browser for a better experience.<\/p>\n                <div style=\"display:flex; gap:10px;\">\n                    <button class=\"ozg-btn\" style=\"flex:1; padding:10px; font-size:0.9rem;\" id=\"ozgSyncYes\">Sync Now<\/button>\n                    <button class=\"ozg-btn-sec\" style=\"flex:1; padding:10px; font-size:0.9rem; border:none;\" onclick=\"this.parentElement.parentElement.remove()\">Later<\/button>\n                <\/div>\n            `;\n            document.body.appendChild(prompt);\n\n            document.getElementById('ozgSyncYes').onclick = function() {\n                if (tg && tg.openLink) {\n                    tg.openLink(syncUrl);\n                } else {\n                    window.open(syncUrl, '_blank');\n                }\n                prompt.remove();\n                showHeaderToast('\u2705 Sync link opened!');\n            };\n        }\n\n        async function ozgOpenInExternalBrowser(url = null) {\n            try {\n                const resp = await fetch(`${apiBase}\/me\/magic-link`, { headers: {'X-WP-Nonce': nonce} });\n                const data = await resp.json();\n                if (data.success && data.url) {\n                    let targetUrl = data.url;\n                    if (url) {\n                        \/\/ Append token to custom URL if provided\n                        const u = new URL(url);\n                        const token = new URL(data.url).searchParams.get('ozg_login_token');\n                        u.searchParams.set('ozg_login_token', token);\n                        targetUrl = u.toString();\n                    }\n\n                    if (tg && tg.openLink) {\n                        tg.openLink(targetUrl);\n                    } else {\n                        window.open(targetUrl, '_blank');\n                    }\n                }\n            } catch(e) { console.error('Magic link error:', e); if(url) window.open(url, '_blank'); }\n        }\n\n        function ozgOpenPageInDashboard(id, title, url) {\n            \/\/ Guard against recursive dashboard loop in iframe\n            if (!url || url === '#' || url.includes('\/dashboard') || url.includes('\/ozgeris')) {\n                if (id) window.location.href = `\/?p=${id}`;\n                return;\n            }\n\n            ozgCloseAllModals();\n            const modal = document.getElementById('ozgFsModal');\n            const titleEl = document.getElementById('ozgFsModalTitle');\n            const iframe = document.getElementById('ozgFsIframe');\n            if (!modal || !iframe) return;\n\n            if (titleEl) titleEl.innerHTML = `<i data-lucide=\"external-link\" style=\"width:16px; color:var(--accent-cyan); vertical-align:middle; margin-right:6px;\"><\/i> ${escapeHtml(title || 'Emirat')}`;\n\n            try {\n                const u = new URL(url);\n                u.searchParams.set('ozg_iframe', '1');\n                iframe.src = u.toString();\n            } catch(e) {\n                iframe.src = url + (url.includes('?') ? '&' : '?') + 'ozg_iframe=1';\n            }\n\n            modal.classList.add('show');\n            modal.classList.remove('ozg-fs-minimised');\n            if (typeof lucide !== 'undefined') lucide.createIcons();\n        }\n\n\n\n        function ozgTimeAgo(date) {\n            const diff = Math.floor((Date.now() - date.getTime()) \/ 1000);\n            if (diff < 60)   return diff + 's ago';\n            if (diff < 3600) return Math.floor(diff\/60) + 'm ago';\n            if (diff < 86400) return Math.floor(diff\/3600) + 'h ago';\n            return Math.floor(diff\/86400) + 'd ago';\n        }\n\n\n\n        function buildProfileCard(item) {\n            const pillarColor = item.pillar_color || '#8a2be2';\n            const bg = item.thumb\n                ? `background-image: url(${item.thumb}); background-size:cover; background-position:center;`\n                : `background: linear-gradient(135deg, ${pillarColor}40, #05070f);`;\n            const likes = item.likes_count || item.likes || 0;\n            const views = item.views_count || item.views || 0;\n            const safeTitle = (item.title || '').replace(\/'\/g, \"\\\\'\").replace(\/\"\/g, '&quot;');\n            const postTypeLabel = (item.type || '').replace('courses','course').replace('wp-fundraising','finance');\n\n            let centerActionHtml = '';\n            if (item.has_media) {\n                const playIcon = item.media_type === 'audio' ? 'headphones' : (item.media_type === 'document' ? 'book-open' : 'play');\n                centerActionHtml = `<button class=\"ozg-feed-play-btn\" style=\"width:36px; height:36px; min-width:36px; min-height:36px; flex-shrink:0; border-radius:50%; background:rgba(0,0,0,0.6); border:1px solid rgba(255,255,255,0.8); display:flex; align-items:center; justify-content:center; cursor:pointer; position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); z-index:4;\" onclick=\"event.stopPropagation(); ozgPlayFeedMedia(event, this, '${item.media_data}', ${item.id})\">\n                    <i data-lucide=\"${playIcon}\" style=\"width:18px; height:18px; min-width:18px; min-height:18px; flex-shrink:0; fill:white; color:white; ${item.media_type === 'audio' || item.media_type === 'document' ? '' : 'margin-left:2px;'}\"><\/i>\n                <\/button>`;\n            }\n\n            return `\n                <div class=\"ozg-profile-post-item\" data-title=\"${escapeHtml(item.title||'')}\" data-type=\"${escapeHtml(item.type||'')}\" style=\"--card-color:${pillarColor}; aspect-ratio:1\/1; min-width:0; width:100%; cursor:pointer; border-radius:12px; border:1px solid rgba(255,255,255,0.1); overflow:hidden; position:relative; background:#121526; box-sizing:border-box;\"\n                    onclick=\"ozgOpenPostFromProfile('${item.type}',${item.id}, '${safeTitle}', '${item.url}')\">\n                    <div class=\"ozg-feed-media-container\" style=\"position:absolute; inset:0; z-index:1;\">\n                        <div style=\"${bg} position:absolute; inset:0;\"><\/div>\n                    <\/div>\n                    <div style=\"position:absolute; inset:0; background:linear-gradient(to bottom, transparent 40%, rgba(0,0,0,0.85) 100%); z-index:2; pointer-events:none;\"><\/div>\n                    <div style=\"position:absolute; top:8px; left:8px; z-index:3; display:flex; flex-direction:column; gap:4px; pointer-events:none;\">\n                        <span style=\"background: ${pillarColor}; color: #000; font-size: 0.55rem; padding: 2px 6px; border-radius: 4px; font-weight:800; text-transform:uppercase; letter-spacing:0.3px; display:inline-block; flex-shrink:0;\">${postTypeLabel}<\/span>\n                    <\/div>\n                    ${centerActionHtml}\n                    <div style=\"position:absolute; bottom:8px; left:8px; right:8px; z-index:3; pointer-events:none;\">\n                        <div style=\"font-size:0.75rem; font-weight:600; color:#fff; line-height:1.2; margin-bottom:4px; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; text-shadow:0 1px 3px rgba(0,0,0,0.8);\">${escapeHtml(item.title||'')}<\/div>\n                        <div style=\"display:flex; align-items:center; gap:10px; opacity:0.85; font-size:0.65rem; color:#fff;\">\n                            <span style=\"display:flex; align-items:center; gap:3px; flex-shrink:0;\"><i data-lucide=\"heart\" style=\"width:12px; height:12px; min-width:12px; min-height:12px; flex-shrink:0; fill:currentColor;\"><\/i> ${likes}<\/span>\n                            <span style=\"display:flex; align-items:center; gap:3px; flex-shrink:0;\"><i data-lucide=\"eye\" style=\"width:12px; height:12px; min-width:12px; min-height:12px; flex-shrink:0;\"><\/i> ${views}<\/span>\n                        <\/div>\n                    <\/div>\n                <\/div>`;\n        }\n\n\n\n        function renderNextProfileBatch() {\n                        const batch = allPosts.slice(profilePostIndex, profilePostIndex + BATCH);\n                        if (batch.length === 0) return;\n                        profilePostIndex += BATCH;\n                        const frag = document.createDocumentFragment();\n                        batch.forEach(item => {\n                            const div = document.createElement('div');\n                            div.innerHTML = buildProfileCard(item).trim();\n                            frag.appendChild(div.firstElementChild);\n                        });\n                        grid.appendChild(frag);\n                        lucide.createIcons();\n                        \/\/ Observe the last card to trigger next batch\n                        if (profilePostIndex < allPosts.length) {\n                            const lastCard = grid.lastElementChild;\n                            if (lastCard && window.IntersectionObserver) {\n                                new IntersectionObserver((entries, obs) => {\n                                    if (entries[0].isIntersecting) {\n                                        obs.disconnect();\n                                        renderNextProfileBatch();\n                                    }\n                                }, { rootMargin: '600px' }).observe(lastCard);\n                            }\n                        }\n                    }\n\n\n\n        async function ozgAdvanceToNextLesson(courseId, completedLessonId) {\n            try {\n                const resp = await fetch(`${apiBase}\/course\/details\/${courseId}?_=${Date.now()}`, { headers: {'X-WP-Nonce': nonce} });\n                const data = await resp.json();\n                if (!data.success || !data.curriculum) return;\n\n                let allItems = [];\n                data.curriculum.forEach(ch => { if (ch.items) ch.items.forEach(item => allItems.push(item)); });\n                if (allItems.length === 0) return;\n\n                const currentIdx = allItems.findIndex(it => it.id === completedLessonId);\n                if (currentIdx >= 0 && currentIdx < allItems.length - 1) {\n                    const next = allItems[currentIdx + 1];\n                    showHeaderToast('\u2705 Lesson done! Opening next\u2026');\n                    setTimeout(() => ozgOpenLessonModal(next.id), 1200);\n                }\n                \/\/ If this was the last lesson \u2014 simply stay on the completed lesson view.\n                \/\/ The course-complete celebration is not triggered here to avoid confusion.\n            } catch(e) { console.error('Next lesson advance error:', e); }\n        }\n\n\n\n        async function ozgCheckLessonOrder(lessonId, courseId) {\n            if (!courseId) return;\n            try {\n                const resp = await fetch(`${apiBase}\/course\/details\/${courseId}?_=${Date.now()}`, { headers: {'X-WP-Nonce': nonce} });\n                const data = await resp.json();\n                if (!data.success || !data.curriculum) return;\n\n                let allItems = [];\n                data.curriculum.forEach(ch => { if (ch.items) ch.items.forEach(item => allItems.push(item)); });\n                if (allItems.length < 2) return;\n\n                const firstItem  = allItems[0];\n                const currentIdx = allItems.findIndex(it => it.id === lessonId);\n                \/\/ Only prompt if user opened lesson 3+ and lesson 1 is not yet completed\n                if (currentIdx > 1 && !firstItem.is_completed && firstItem.id !== lessonId) {\n                    \/\/ Show a non-blocking banner inside the lesson modal\n                    const modal = document.getElementById('ozgLessonModal');\n                    if (!modal) return;\n                    const banner = document.createElement('div');\n                    banner.id = 'ozgLessonOrderBanner';\n                    banner.style.cssText = 'background:rgba(234,179,8,0.12); border:1px solid #eab308; border-radius:12px; padding:12px 16px; margin:0 0 16px 0; display:flex; align-items:center; gap:12px; flex-wrap:wrap;';\n                    banner.innerHTML = `\n                        <i data-lucide=\"alert-triangle\" style=\"color:#eab308; width:18px; flex-shrink:0;\"><\/i>\n                        <span style=\"flex:1; font-size:0.85rem; color:#fef08a;\">\n                            You opened lesson <strong>${currentIdx + 1}<\/strong> \u2014 it is recommended to start from lesson 1.\n                        <\/span>\n                        <button class=\"ozg-btn\" style=\"padding:6px 14px; font-size:0.8rem; background:linear-gradient(135deg,#eab308,#fbbf24); color:#000;\"\n                            onclick=\"document.getElementById('ozgLessonOrderBanner').remove(); ozgOpenLessonModal(${firstItem.id});\">\n                            Start from Lesson 1\n                        <\/button>\n                        <button onclick=\"this.closest('#ozgLessonOrderBanner').remove();\"\n                            style=\"background:none; border:none; color:var(--muted); cursor:pointer; font-size:0.8rem; padding:4px;\">\n                            Continue anyway\n                        <\/button>\n                    `;\n                    const content = document.getElementById('ozgLessonModalContent');\n                    if (content) content.insertBefore(banner, content.firstChild);\n                    lucide.createIcons();\n                }\n            } catch(e) { \/* non-critical \u2014 ignore *\/ }\n        }\n\n        <\/script>\n    <\/div>\n\t\t\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":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":-8,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-16013","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/emirat.hobbi.st\/ru\/wp-json\/wp\/v2\/pages\/16013","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/emirat.hobbi.st\/ru\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/emirat.hobbi.st\/ru\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/emirat.hobbi.st\/ru\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/emirat.hobbi.st\/ru\/wp-json\/wp\/v2\/comments?post=16013"}],"version-history":[{"count":3,"href":"https:\/\/emirat.hobbi.st\/ru\/wp-json\/wp\/v2\/pages\/16013\/revisions"}],"predecessor-version":[{"id":16017,"href":"https:\/\/emirat.hobbi.st\/ru\/wp-json\/wp\/v2\/pages\/16013\/revisions\/16017"}],"wp:attachment":[{"href":"https:\/\/emirat.hobbi.st\/ru\/wp-json\/wp\/v2\/media?parent=16013"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}