{"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:\/\/go.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: 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; justify-content: space-around; 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; }\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=\"1791874998\">\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=\"car-taxi-front\"><\/i> Ride &amp; Delivery<\/a>\n                                            <a class=\"ozg-nav-link ozg-auth-link\" href=\"https:\/\/go.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                <!-- RIDE & DELIVERY SECTION (inDrive-style: you set the price, drivers respond) -->\n                <section id=\"kingdom\" class=\"ozg-section active\">\n                                <style>\n                    #ride-app { --r-bg: rgba(10,14,26,.97); --r-line: rgba(255,255,255,.09); --r-acc: var(--accent-cyan); max-width: 1120px; margin: 0 auto; padding: 0 0 90px; }\n                    #ride-app * { box-sizing: border-box; }\n                    #ride-app [hidden] { display: none !important; }\n                    .ride-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                    .ride-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                    .ride-modebar button.active { background: var(--r-acc); color: #000; }\n                    .ride-grid { display: grid; grid-template-columns: 1fr; }\n                    .ride-mapwrap { position: relative; height: 42vh; min-height: 300px; border-radius: 0 0 28px 28px; overflow: hidden; background: #0b1020; z-index: 1; }\n                    #ride-map { position: absolute; inset: 0; z-index: 1; }\n                    #ride-map .leaflet-container { background: #0b1020; font-family: inherit; }\n                    .ride-hint { position: absolute; left: 50%; top: 12px; transform: translateX(-50%); z-index: 500; background: rgba(8,12,24,.9); 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; max-width: 92%; overflow: hidden; text-overflow: ellipsis; }\n                    .ride-hint:empty { display: none; }\n                    .ride-fab { position: absolute; right: 12px; top: 12px; z-index: 500; width: 42px; height: 42px; border-radius: 50%; border: 1px solid var(--r-line); background: rgba(8,12,24,.9); color: #fff; font-size: 1.2rem; cursor: pointer; display: flex; align-items: center; justify-content: center; }\n                    .ride-pin { width: 18px; height: 18px; border-radius: 50%; border: 3px solid #fff; box-shadow: 0 2px 8px rgba(0,0,0,.6); }\n                    .ride-pin.from { background: #00e676; } .ride-pin.to { background: #ff3366; border-radius: 4px; } .ride-pin.me { background: #00f0ff; box-shadow: 0 0 0 6px rgba(0,240,255,.25); }\n                    .ride-car { font-size: 24px; filter: drop-shadow(0 2px 4px rgba(0,0,0,.7)); line-height: 1; }\n                    .ride-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                    .ride-handle { width: 42px; height: 4px; border-radius: 4px; background: rgba(255,255,255,.2); margin: 0 auto 14px; }\n                    .ride-sheet h2 { margin: 0 0 4px; font-size: 1.3rem; color: #fff; }\n                    .ride-sub { color: var(--text-muted); font-size: .85rem; margin: 0 0 12px; line-height: 1.45; }\n                    .ride-seg { display: flex; gap: 6px; padding: 4px; background: rgba(255,255,255,.05); border-radius: 14px; margin-bottom: 12px; }\n                    .ride-seg button { flex: 1; border: 0; background: transparent; color: #cfd8e8; font-weight: 700; padding: 10px; border-radius: 10px; cursor: pointer; font-family: inherit; font-size: .95rem; }\n                    .ride-seg button.on { background: var(--r-acc); color: #000; }\n                    .ride-route { position: relative; background: rgba(255,255,255,.05); border: 1px solid var(--r-line); border-radius: 16px; padding: 4px 14px 4px 38px; margin-bottom: 8px; }\n                    .ride-route:before { content: ''; position: absolute; left: 19px; top: 28px; bottom: 28px; border-left: 2px dotted rgba(255,255,255,.25); }\n                    .ride-pt { position: relative; display: flex; align-items: center; }\n                    .ride-pt .dot { position: absolute; left: -26px; width: 12px; height: 12px; border-radius: 50%; background: #00e676; }\n                    .ride-pt .sq { position: absolute; left: -26px; width: 12px; height: 12px; border-radius: 3px; background: #ff3366; }\n                    .ride-pt input { width: 100%; background: transparent; border: 0; outline: 0; color: #fff; font-size: 1rem; font-weight: 600; padding: 13px 0; margin: 0; font-family: inherit; text-overflow: ellipsis; }\n                    .ride-pt + .ride-pt { border-top: 1px solid var(--r-line); }\n                    .ride-pt.act input { color: var(--r-acc); }\n                    .ride-sugg { background: rgba(255,255,255,.04); border: 1px solid var(--r-line); border-radius: 14px; margin-bottom: 10px; overflow: hidden; }\n                    .ride-sugg button { display: block; width: 100%; text-align: left; background: none; border: 0; border-bottom: 1px solid var(--r-line); color: #fff; padding: 11px 14px; cursor: pointer; font-family: inherit; font-size: .88rem; }\n                    .ride-sugg button:last-child { border-bottom: 0; } .ride-sugg button:hover { background: rgba(255,255,255,.06); }\n                    .ride-sugg small { display: block; color: var(--text-muted); margin-top: 2px; }\n                    .ride-trip { display: flex; justify-content: space-between; color: var(--text-muted); font-size: .8rem; margin: 2px 4px 10px; }\n                    .ride-opt { 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: 11px 14px; margin-bottom: 8px; cursor: pointer; color: #fff; font-family: inherit; }\n                    .ride-opt.on { border-color: var(--r-acc); background: rgba(0,240,255,.08); box-shadow: 0 0 0 3px rgba(0,240,255,.12); }\n                    .ride-opt .ic { font-size: 1.7rem; width: 38px; text-align: center; }\n                    .ride-opt .nm { font-weight: 800; } .ride-opt .ds { font-size: .74rem; color: var(--text-muted); margin-top: 2px; }\n                    .ride-opt .pr { margin-left: auto; font-weight: 800; white-space: nowrap; }\n                    .ride-offerbox { background: rgba(255,255,255,.05); border: 1px solid var(--r-line); border-radius: 18px; padding: 12px 14px; margin: 12px 0 8px; text-align: center; }\n                    .ride-offerrow { display: flex; align-items: center; gap: 10px; justify-content: center; }\n                    .ride-offerrow button { width: 46px; height: 46px; border-radius: 50%; border: 1px solid var(--r-line); background: rgba(255,255,255,.06); color: #fff; font-size: 1.5rem; cursor: pointer; line-height: 1; }\n                    .ride-offerrow input { width: 160px; text-align: center; background: transparent; border: 0; outline: 0; color: #fff; font-size: 1.9rem; font-weight: 800; font-family: inherit; padding: 0; margin: 0; }\n                    .ride-offerlbl { font-size: .72rem; text-transform: uppercase; letter-spacing: .05em; color: var(--text-muted); }\n                    .ride-offerhint { font-size: .78rem; margin-top: 4px; }\n                    .ride-in { width: 100%; background: rgba(255,255,255,.05); border: 1px solid var(--r-line); border-radius: 14px; color: #fff; padding: 12px 14px; margin-bottom: 8px; font-family: inherit; font-size: .95rem; outline: 0; }\n                    .ride-in:focus { border-color: var(--r-acc); }\n                    .ride-row2 { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }\n                    .ride-chk { display: flex; gap: 10px; align-items: flex-start; font-size: .82rem; color: #cfd8e8; margin: 4px 0 8px; }\n                    .ride-cta { width: 100%; justify-content: center; font-size: 1.05rem; padding: 16px; margin-top: 8px; border-radius: 16px; }\n                    .ride-cta[disabled] { opacity: .45; cursor: not-allowed; box-shadow: none; }\n                    .ride-note { font-size: .74rem; color: var(--text-muted); text-align: center; margin-top: 8px; }\n                    .ride-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                    .ride-chip.on { background: var(--r-acc); color: #000; border-color: var(--r-acc); }\n                    .ride-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                    .ride-summary .meta { color: var(--text-muted); font-size: .8rem; }\n                    .ride-summary b { color: #fff; }\n                    .ride-radar { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }\n                    .ride-pulse { width: 14px; height: 14px; border-radius: 50%; background: var(--success-color); position: relative; flex-shrink: 0; }\n                    .ride-pulse:after { content: ''; position: absolute; inset: -6px; border-radius: 50%; border: 2px solid var(--success-color); animation: ridePulse 1.6s infinite; }\n                    @keyframes ridePulse { 0% { transform: scale(.6); opacity: 1; } 100% { transform: scale(1.8); opacity: 0; } }\n                    .ride-sortbar { display: flex; align-items: center; justify-content: space-between; margin: 6px 0 10px; gap: 8px; }\n                    .ride-h3 { font-size: .8rem; text-transform: uppercase; letter-spacing: .06em; color: var(--text-muted); margin: 0; font-weight: 700; }\n                    .ride-empty { text-align: center; padding: 24px 10px; color: var(--text-muted); font-size: .88rem; line-height: 1.5; }\n                    .ride-empty b { display: block; color: #fff; margin-bottom: 4px; font-size: 1rem; }\n                    .ride-card { 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                    .ride-card.new { border-color: var(--success-color); }\n                    .ride-top { display: flex; align-items: center; gap: 12px; }\n                    .ride-avatar { width: 46px; height: 46px; border-radius: 50%; background: linear-gradient(135deg, #8a2be2, #00f0ff); display: flex; align-items: center; justify-content: center; font-weight: 800; color: #fff; flex-shrink: 0; }\n                    .ride-info { flex: 1; min-width: 0; }\n                    .ride-name { font-weight: 800; color: #fff; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n                    .ride-meta { font-size: .78rem; color: var(--text-muted); margin-top: 2px; line-height: 1.4; }\n                    .ride-star { color: #fbbf24; font-weight: 700; }\n                    .ride-price { text-align: right; font-weight: 800; font-size: 1.15rem; color: #fff; white-space: nowrap; }\n                    .ride-price small { display: block; font-size: .68rem; font-weight: 700; color: var(--success-color); }\n                    .ride-foot { display: flex; align-items: center; gap: 8px; margin-top: 12px; }\n                    .ride-timer { font-variant-numeric: tabular-nums; font-size: .8rem; color: var(--text-muted); flex: 1; }\n                    .ride-mini { padding: 9px 16px; font-size: .88rem; border-radius: 12px; }\n                    .ride-badge { display: inline-block; background: rgba(0,230,118,.14); color: var(--success-color); font-size: .64rem; font-weight: 800; padding: 2px 7px; border-radius: 999px; margin-left: 6px; vertical-align: middle; }\n                    .ride-plate { display: inline-block; background: #f5f5f5; color: #111; font-weight: 800; font-size: .72rem; padding: 1px 7px; border-radius: 5px; letter-spacing: .04em; }\n                    .ride-link { background: none; border: 0; color: var(--warning-color); font-weight: 600; cursor: pointer; margin: 12px auto 0; display: block; font-family: inherit; }\n                    .ride-status { display: flex; align-items: center; gap: 10px; background: rgba(0,230,118,.1); border: 1px solid rgba(0,230,118,.3); border-radius: 16px; padding: 12px 14px; margin-bottom: 12px; font-weight: 700; color: #fff; }\n                    .ride-actions { display: flex; gap: 8px; margin-top: 10px; }\n                    .ride-actions > * { flex: 1; justify-content: center; text-decoration: none; }\n                    .ride-sos { background: #ff3366; color: #fff; border: 0; font-weight: 800; border-radius: 12px; cursor: pointer; padding: 12px; font-family: inherit; }\n                    .ride-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                    .ride-modal[hidden] { display: none !important; }\n                    .ride-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) { .ride-modal { align-items: center; } .ride-modal-box { border-radius: 26px; } }\n                    .ride-stars { display: flex; gap: 8px; justify-content: center; margin: 14px 0; }\n                    .ride-stars button { background: none; border: 0; font-size: 2.2rem; color: rgba(255,255,255,.2); cursor: pointer; padding: 0; line-height: 1; }\n                    .ride-stars button.on { color: #fbbf24; }\n                    .ride-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                    .ride-label { display: block; font-size: .7rem; text-transform: uppercase; letter-spacing: .05em; color: var(--text-muted); margin: 6px 2px 4px; }\n                    @media (min-width: 960px) {\n                        .ride-grid { grid-template-columns: 1.15fr 460px; gap: 20px; align-items: start; padding: 0 12px; }\n                        .ride-mapwrap { height: 700px; border-radius: 24px; position: sticky; top: 76px; }\n                        .ride-sheet { margin-top: 0; border-radius: 24px; } .ride-handle { display: none; }\n                    }\n                <\/style>\n\n                <div id=\"ride-app\">\n                    <div class=\"ride-modebar\"><button id=\"ride-m-p\" class=\"active\" onclick=\"rideSetMode('p')\"><\/button><button id=\"ride-m-d\" onclick=\"rideSetMode('d')\"><\/button><\/div>\n                    <div class=\"ride-grid\">\n                        <div class=\"ride-mapwrap\"><div id=\"ride-map\"><\/div><div class=\"ride-hint\" id=\"ride-hint\"><\/div><button class=\"ride-fab\" id=\"ride-locate\" title=\"Locate me\" onclick=\"rideLocate(true)\">\u2316<\/button><\/div>\n                        <div class=\"ride-sheet\"><div class=\"ride-handle\"><\/div>\n                            <div id=\"ride-p\"><\/div>\n                            <div id=\"ride-d\" hidden><\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n                <div id=\"ride-modal\" class=\"ride-modal\" hidden onclick=\"if(event.target===this)rideCloseModal()\"><div class=\"ride-modal-box\" id=\"ride-modal-box\"><\/div><\/div>\n\n                <script>\n                (function () {\n                    const cfg = {\"api\":\"https:\\\/\\\/go.hobbi.st\\\/ru\\\/wp-json\\\/ozgeris\\\/v1\\\/ride\",\"nonce\":\"4468a59a6a\",\"tiles\":\"https:\\\/\\\/{s}.basemaps.cartocdn.com\\\/dark_all\\\/{z}\\\/{x}\\\/{y}{r}.png\",\"attr\":\"&copy; OpenStreetMap contributors &copy; CARTO\",\"geocoder\":\"https:\\\/\\\/photon.komoot.io\",\"router\":\"https:\\\/\\\/router.project-osrm.org\",\"rideClasses\":[{\"key\":\"moto\",\"name\":\"Moto\",\"icon\":\"\\ud83c\\udfcd\\ufe0f\",\"desc\":\"1 passenger, fastest in traffic\"},{\"key\":\"economy\",\"name\":\"Economy\",\"icon\":\"\\ud83d\\ude97\",\"desc\":\"Affordable car, up to 4 seats\"},{\"key\":\"comfort\",\"name\":\"Comfort\",\"icon\":\"\\ud83d\\ude99\",\"desc\":\"Newer, more spacious car\"},{\"key\":\"xl\",\"name\":\"XL \\\/ Van\",\"icon\":\"\\ud83d\\ude90\",\"desc\":\"Up to 6 seats or lots of luggage\"}],\"sizes\":[{\"key\":\"s\",\"name\":\"Small\",\"icon\":\"\\u2709\\ufe0f\",\"desc\":\"Documents, small parcel (up to 2 kg)\"},{\"key\":\"m\",\"name\":\"Medium\",\"icon\":\"\\ud83d\\udce6\",\"desc\":\"Backpack-size, up to 10 kg\"},{\"key\":\"l\",\"name\":\"Large\",\"icon\":\"\\ud83e\\uddf3\",\"desc\":\"Up to 30 kg, needs a car\"},{\"key\":\"xl\",\"name\":\"Cargo\",\"icon\":\"\\ud83d\\ude9a\",\"desc\":\"Bulky items, needs a van\"}],\"t\":{\"ride\":\"Ride\",\"delivery\":\"Delivery\",\"mode_p\":\"Order\",\"mode_d\":\"Drive & deliver\",\"from_ph\":\"Pickup location\",\"to_ph\":\"Where to?\",\"to_ph_del\":\"Deliver to\",\"hint_map\":\"Search an address or tap the map\",\"locating\":\"Finding your location\\u2026\",\"no_results\":\"Nothing found\",\"route_fail\":\"Could not build the route. Try different points.\",\"est_route\":\"Approximate route\",\"your_offer\":\"Your offer\",\"recommended\":\"Recommended: {0}\",\"hint_low\":\"Low price - drivers may take longer to respond\",\"hint_ok\":\"Fair price - good chance of quick offers\",\"hint_high\":\"Higher price - faster pickup\",\"note_ph\":\"Comment for the driver (optional)\",\"phone_ph\":\"Your phone number\",\"item_ph\":\"What are you sending?\",\"rcpt_name_ph\":\"Recipient name\",\"rcpt_phone_ph\":\"Recipient phone\",\"ack\":\"The package contains no illegal or dangerous items\",\"cash\":\"Pay the driver directly (cash or as agreed)\",\"find_driver\":\"Find a driver\",\"find_courier\":\"Find a courier\",\"need_points\":\"Choose pickup and destination\",\"searching\":\"Looking for drivers\\u2026\",\"nearby\":\"{0} drivers online nearby\",\"nearby_none\":\"No drivers online nearby yet - your request stays open\",\"offers\":\"Offers\",\"sort_price\":\"Price\",\"sort_eta\":\"Nearest\",\"sort_rating\":\"Rating\",\"no_offers\":\"Waiting for offers\\u2026\",\"no_offers_sub\":\"Drivers nearby can accept your price or suggest their own. Try raising your offer to get a faster response.\",\"raise\":\"Raise offer to {0}\",\"cancel\":\"Cancel request\",\"cancel_trip\":\"Cancel trip\",\"cancel_confirm\":\"Cancel this request?\",\"accept\":\"Accept\",\"profile\":\"Profile\",\"accept_confirm\":\"Accept the offer from {0} for {1}?\",\"accepts_yours\":\"Accepts your price\",\"min\":\"{0} min\",\"trips\":\"{0} trips\",\"new_driver\":\"New\",\"verified\":\"Verified\",\"st_awarded\":\"Driver is on the way\",\"st_arrived\":\"Your driver has arrived\",\"st_started\":\"Trip in progress\",\"st_awarded_del\":\"Courier is heading to pickup\",\"st_arrived_del\":\"Courier is at the pickup point\",\"st_started_del\":\"Delivery in progress\",\"call\":\"Call\",\"sos\":\"SOS\",\"sos_confirm\":\"Call emergency services ({0})?\",\"rate_title\":\"How was your trip?\",\"rate_ph\":\"Leave a comment (optional)\",\"send\":\"Send\",\"skip\":\"Skip\",\"paid\":\"Fare to pay\",\"drv_cancelled\":\"The driver cancelled the trip. You can order again.\",\"expired\":\"No driver accepted in time. Try again or raise your offer.\",\"login_needed\":\"Sign in to place an order\",\"error\":\"Something went wrong. Please try again.\",\"saved\":\"Saved\",\"d_profile\":\"Driver profile\",\"d_setup\":\"Create your profile to start earning. An admin verifies every driver before the first trip.\",\"d_pending\":\"Profile submitted. Waiting for verification - you will be able to go online once approved.\",\"d_name\":\"Public name\",\"d_phone\":\"Phone\",\"d_car\":\"Vehicle make & model\",\"d_color\":\"Color\",\"d_plate\":\"Plate number\",\"d_class\":\"Vehicle type\",\"d_services\":\"I want to\",\"d_save\":\"Save profile\",\"d_edit\":\"Edit profile\",\"go_online\":\"Go online\",\"go_offline\":\"Go offline\",\"online_now\":\"You are online\",\"offline_now\":\"You are offline\",\"need_loc\":\"Allow location access to go online\",\"requests\":\"Requests nearby\",\"no_requests\":\"No requests nearby right now. Stay online - new ones appear automatically.\",\"accept_price\":\"Accept {0}\",\"counter\":\"Offer\",\"your_bid\":\"Your offer: {0}\",\"pickup_in\":\"Pickup {0} away \\u00b7 ~{1} min\",\"trip_len\":\"Trip {0}\",\"a_arrived\":\"I've arrived\",\"a_started\":\"Start trip\",\"a_done\":\"Complete trip\",\"a_cancel\":\"Cancel trip\",\"navigate\":\"Navigate\",\"passenger\":\"Passenger\",\"recipient\":\"Recipient\",\"item\":\"Item\",\"trip_done\":\"Trip completed. Collect {0} from the passenger.\",\"job_gone\":\"The trip was cancelled by the passenger.\",\"since\":\"Since {0}\"}};\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 isGuest = () => (typeof ozgI18n !== 'undefined' && ozgI18n.isGuest);\n                    const icons = () => { if (window.lucide) lucide.createIcons(); };\n                    const optsOf = svc => svc === 'delivery' ? cfg.sizes : cfg.rideClasses;\n\n                    const st = {\n                        mode: 'p', service: 'ride', from: null, to: null, active: 'from', route: null, quote: null, cls: { ride: 'economy', delivery: 's' }, offer: 0,\n                        form: { phone: localStorage.getItem('ozg_ride_phone') || '', note: '', item: '', rn: '', rp: '', ack: false },\n                        order: null, seen: new Set(), sort: 'price', timeOff: 0, map: null, ml: {}, pos: null, watchId: null, busy: false, rating: 0, inited: false,\n                        d: { profile: null, online: false, job: null, inbox: [], editing: false, counters: {}, lastJob: 0 }, searchSeq: 0, routeSeq: 0, searchT: null, stageKey: '',\n                    };\n\n                    \/\/ ---------- helpers ----------\n                    const nowTs = () => Date.now() \/ 1000 + st.timeOff;\n                    const hms = s => { s = Math.max(0, Math.floor(s)); return String(Math.floor(s \/ 60)).padStart(2, '0') + ':' + String(s % 60).padStart(2, '0'); };\n                    function money(n, cur, dec) {\n                        cur = cur || 'USD'; dec = dec == null ? 2 : dec;\n                        try { return new Intl.NumberFormat(undefined, { style: 'currency', currency: cur, minimumFractionDigits: dec, maximumFractionDigits: dec }).format(n); }\n                        catch (e) { return n.toFixed(dec) + ' ' + cur; }\n                    }\n                    function fmtDist(m, unit) { if (unit === 'mi') { const v = m \/ 1609.344; return v.toFixed(v < 10 ? 1 : 0) + ' mi'; } return m < 1000 ? Math.round(m) + ' m' : (m \/ 1000).toFixed(m < 10000 ? 1 : 0) + ' km'; }\n                    function fmtMin(s) { const m = Math.max(1, Math.round(s \/ 60)); return m < 60 ? m + ' min' : Math.floor(m \/ 60) + ' h ' + (m % 60) + ' min'; }\n                    function toast(msg) { const t = document.createElement('div'); t.className = 'ride-toast'; t.textContent = msg; document.body.appendChild(t); setTimeout(() => t.remove(), 3400); }\n                    function hav(a, b) { const R = 6371000, p1 = a.lat * Math.PI \/ 180, p2 = b.lat * Math.PI \/ 180, dp = p2 - p1, dl = (b.lng - a.lng) * Math.PI \/ 180; const x = Math.sin(dp \/ 2) ** 2 + Math.cos(p1) * Math.cos(p2) * Math.sin(dl \/ 2) ** 2; return 2 * R * Math.asin(Math.min(1, Math.sqrt(x))); }\n                    const initials = n => String(n || '?').trim().split(\/\\s+\/).slice(0, 2).map(w => w[0]).join('').toUpperCase();\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 openModal(html) { if ($('ride-modal').parentNode !== document.body) document.body.appendChild($('ride-modal')); $('ride-modal-box').innerHTML = html; $('ride-modal').hidden = false; }\n                    window.rideCloseModal = () => { $('ride-modal').hidden = true; };\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:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.9.4\/leaflet.min.css'; document.head.appendChild(css);\n                            const s = document.createElement('script'); s.src = 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.9.4\/leaflet.min.js'; s.onload = res; s.onerror = rej; document.head.appendChild(s);\n                        });\n                    }\n                    const pinIcon = cls => L.divIcon({ className: '', html: `<div class=\"ride-pin ${cls}\"><\/div>`, iconSize: [18, 18], iconAnchor: [9, 9] });\n                    const carIcon = () => L.divIcon({ className: '', html: '<div class=\"ride-car\">\ud83d\ude97<\/div>', iconSize: [26, 26], iconAnchor: [13, 13] });\n                    function setMarker(key, pt, icon) {\n                        if (!st.map) return;\n                        if (!pt) { if (st.ml[key]) { st.map.removeLayer(st.ml[key]); delete st.ml[key]; } return; }\n                        if (st.ml[key]) st.ml[key].setLatLng([pt.lat, pt.lng]); else st.ml[key] = L.marker([pt.lat, pt.lng], { icon, interactive: false }).addTo(st.map);\n                    }\n                    function setLine(key, coords, style) {\n                        if (!st.map) return;\n                        if (st.ml[key]) { st.map.removeLayer(st.ml[key]); delete st.ml[key]; }\n                        if (coords && coords.length) st.ml[key] = L.polyline(coords, style).addTo(st.map);\n                    }\n                    function fit(pts) { if (st.map && pts.length) st.map.fitBounds(L.latLngBounds(pts.map(p => [p.lat, p.lng])), { padding: [50, 50], maxZoom: 16 }); }\n                    async function initMap() {\n                        try { await loadLeaflet(); } catch (e) { $('ride-map').innerHTML = '<div style=\"padding:20px;color:#8b9bb4;\">Map failed to load.<\/div>'; return; }\n                        st.map = L.map('ride-map', { zoomControl: false }).setView([25, 15], 2);\n                        L.tileLayer(cfg.tiles, { maxZoom: 19, attribution: cfg.attr }).addTo(st.map);\n                        L.control.zoom({ position: 'bottomright' }).addTo(st.map);\n                        st.map.on('click', e => { if (st.mode === 'p' && !st.order) setPointFromMap({ lat: e.latlng.lat, lng: e.latlng.lng }); });\n                        syncMapForState();\n                        rideLocate(false);\n                    }\n                    window.rideLocate = function (manual) {\n                        if (!navigator.geolocation) { if (manual) toast(T('need_loc')); return; }\n                        if (!manual && !st.from && st.mode === 'p') $('ride-hint').textContent = T('locating');\n                        navigator.geolocation.getCurrentPosition(pos => {\n                            st.pos = { lat: pos.coords.latitude, lng: pos.coords.longitude };\n                            setMarker('me', st.pos, pinIcon('me'));\n                            if (st.map && (manual || !st.from)) st.map.setView([st.pos.lat, st.pos.lng], 15);\n                            if (st.mode === 'p' && !st.order && (manual || !st.from)) setPointFromMap(st.pos, 'from');\n                            else $('ride-hint').textContent = '';\n                        }, () => { if (manual) toast(T('need_loc')); $('ride-hint').textContent = st.from ? '' : T('hint_map'); }, { enableHighAccuracy: true, timeout: 10000, maximumAge: 30000 });\n                    };\n\n                    \/\/ ---------- geocoding ----------\n                    function featAddr(f) {\n                        const p = f.properties || {};\n                        const street = p.street ? p.street + (p.housenumber ? ' ' + p.housenumber : '') : '';\n                        const parts = [p.name, street, p.district, p.city || p.town || p.village || p.county, p.country].filter(Boolean);\n                        return parts.filter((v, i) => parts.indexOf(v) === i).join(', ');\n                    }\n                    async function reverse(pt) {\n                        try {\n                            const r = await (await fetch(`${cfg.geocoder}\/reverse?lon=${pt.lng}&lat=${pt.lat}`)).json();\n                            const f = r.features && r.features[0];\n                            if (f) return { addr: featAddr(f), cc: (f.properties.countrycode || '').toUpperCase() };\n                        } catch (e) {}\n                        return { addr: pt.lat.toFixed(5) + ', ' + pt.lng.toFixed(5), cc: '' };\n                    }\n                    async function setPointFromMap(ll, which) {\n                        which = which || st.active;\n                        const pt = { lat: ll.lat, lng: ll.lng, addr: '\u2026', cc: '' };\n                        setPoint(which, pt, false);\n                        const r = await reverse(ll);\n                        if (st[which] && st[which].lat === pt.lat && st[which].lng === pt.lng) { st[which].addr = r.addr; st[which].cc = r.cc; const inp = $('ride-' + which); if (inp) inp.value = r.addr; if (st.from && st.to) routeAndQuote(); }\n                    }\n                    function setPoint(which, pt, fly) {\n                        st[which] = pt;\n                        const inp = $('ride-' + which); if (inp) inp.value = pt.addr === '\u2026' ? '' : pt.addr;\n                        setMarker(which, pt, pinIcon(which));\n                        $('ride-hint').textContent = '';\n                        if (fly && st.map) st.map.setView([pt.lat, pt.lng], 15);\n                        if (which === 'from' && !st.to) { st.active = 'to'; markActive(); }\n                        if (st.from && st.to && pt.addr !== '\u2026') routeAndQuote();\n                        else { st.route = null; st.quote = null; setLine('route', null); renderOptions(); }\n                    }\n                    function markActive() { ['from', 'to'].forEach(w => { const el = $('ride-pt-' + w); if (el) el.classList.toggle('act', st.active === w); }); }\n                    function onSearchInput(which) {\n                        st.active = which; markActive();\n                        const q = $('ride-' + which).value.trim();\n                        clearTimeout(st.searchT);\n                        if (q.length < 3) { $('ride-sugg').hidden = true; return; }\n                        st.searchT = setTimeout(async () => {\n                            const seq = ++st.searchSeq;\n                            const c = st.map ? st.map.getCenter() : null;\n                            try {\n                                const r = await (await fetch(`${cfg.geocoder}\/api\/?q=${encodeURIComponent(q)}&limit=6${c ? `&lat=${c.lat}&lon=${c.lng}` : ''}`)).json();\n                                if (seq !== st.searchSeq) return;\n                                const list = (r.features || []).map(f => ({ lat: f.geometry.coordinates[1], lng: f.geometry.coordinates[0], addr: featAddr(f), cc: (f.properties.countrycode || '').toUpperCase(), name: f.properties.name || '', sub: [f.properties.city, f.properties.country].filter(Boolean).join(', ') }));\n                                st.sugg = list;\n                                $('ride-sugg').hidden = false;\n                                $('ride-sugg').innerHTML = list.length ? list.map((s, i) => `<button onclick=\"ridePick(${i},'${which}')\">${esc(s.name || s.addr)}<small>${esc(s.sub || s.addr)}<\/small><\/button>`).join('') : `<div class=\"ride-empty\" style=\"padding:12px;\">${esc(T('no_results'))}<\/div>`;\n                            } catch (e) {}\n                        }, 450);\n                    }\n                    window.ridePick = (i, which) => { const s = st.sugg[i]; if (!s) return; $('ride-sugg').hidden = true; setPoint(which, { lat: s.lat, lng: s.lng, addr: s.addr, cc: s.cc }, true); };\n\n                    async function routeAndQuote() {\n                        if (!(st.from && st.to)) return;\n                        const seq = ++st.routeSeq; let dist = 0, dur = 0, coords = null, estimated = false;\n                        try {\n                            const r = await (await fetch(`${cfg.router}\/route\/v1\/driving\/${st.from.lng},${st.from.lat};${st.to.lng},${st.to.lat}?overview=full&geometries=geojson`)).json();\n                            if (r.routes && r.routes[0]) { dist = r.routes[0].distance; dur = r.routes[0].duration; coords = r.routes[0].geometry.coordinates.map(c => [c[1], c[0]]); }\n                        } catch (e) {}\n                        if (seq !== st.routeSeq) return;\n                        if (!dist) { dist = hav(st.from, st.to) * 1.35; dur = dist \/ 7; estimated = true; coords = [[st.from.lat, st.from.lng], [st.to.lat, st.to.lng]]; }\n                        st.route = { dist, dur, estimated };\n                        setLine('route', coords, estimated ? { color: '#8b9bb4', weight: 3, dashArray: '6 8' } : { color: '#00f0ff', weight: 5, opacity: .85 });\n                        fit([st.from, st.to]);\n                        try {\n                            const q = await api('\/quote', 'POST', { from: st.from, to: st.to, dist_m: dist, dur_s: dur });\n                            if (seq !== st.routeSeq) return;\n                            st.quote = q; st.route.dist = q.dist_m; st.route.dur = q.dur_s;\n                            resetOffer();\n                        } catch (e) { st.quote = null; toast(e.message); }\n                        renderOptions();\n                    }\n\n                    \/\/ ---------- passenger: form ----------\n                    function est() { return st.quote ? st.quote.fares[st.service][st.cls[st.service]] : 0; }\n                    function resetOffer() { st.offer = est(); }\n                    function clampOffer(v) { const q = st.quote, e = est(); v = Math.max(e * q.offer_min, Math.min(e * q.offer_max, v)); return Math.round(v \/ q.round) * q.round; }\n                    function stepSize() { const q = st.quote; return Math.max(q.round, Math.round(est() * 0.05 \/ q.round) * q.round); }\n                    window.rideStep = dir => { if (!st.quote) return; st.offer = clampOffer(st.offer + dir * stepSize()); refreshOffer(); };\n                    window.rideOfferInput = el => { const v = parseFloat(el.value); if (isFinite(v)) { st.offer = clampOffer(v); } refreshOffer(); };\n                    function refreshOffer(keepInput) {\n                        if (!st.quote) return;\n                        const q = st.quote, e = est(), r = st.offer \/ e;\n                        const inp = $('ride-offer'); if (inp && !keepInput) inp.value = st.offer.toFixed(q.decimals);\n                        const h = $('ride-offer-hint');\n                        if (h) { h.textContent = r < 0.85 ? T('hint_low') : r > 1.15 ? T('hint_high') : T('hint_ok'); h.style.color = r < 0.85 ? '#ffb347' : '#00e676'; }\n                        const rec = $('ride-offer-rec'); if (rec) rec.textContent = T('recommended', money(e, q.currency, q.decimals));\n                        const cta = $('ride-cta'); if (cta) { cta.textContent = T(st.service === 'delivery' ? 'find_courier' : 'find_driver') + ' \u00b7 ' + money(st.offer, q.currency, q.decimals); cta.disabled = st.busy; }\n                    }\n                    window.rideSetService = s => { st.service = s; $('ride-to').placeholder = T(s === 'delivery' ? 'to_ph_del' : 'to_ph'); document.querySelectorAll('#ride-svc button').forEach(b => b.classList.toggle('on', b.dataset.s === s)); if (st.quote) resetOffer(); renderOptions(); };\n                    window.ridePickCls = k => { st.cls[st.service] = k; resetOffer(); renderOptions(); };\n                    const bindForm = () => { ['phone', 'note', 'item', 'rn', 'rp'].forEach(k => { const el = $('ride-f-' + k); if (el) el.oninput = () => { st.form[k] = el.value; }; }); const a = $('ride-f-ack'); if (a) a.onchange = () => { st.form.ack = a.checked; }; };\n                    function renderOptions() {\n                        const box = $('ride-opts'); if (!box) return;\n                        if (!st.quote || !st.route) { box.innerHTML = `<button class=\"ozg-btn ride-cta\" disabled>${esc(T('need_points'))}<\/button>`; return; }\n                        const q = st.quote, svc = st.service, sel = st.cls[svc];\n                        let html = `<div class=\"ride-trip\"><span>${esc(fmtDist(q.dist_m, q.unit))} \u00b7 ${esc(fmtMin(q.dur_s))}<\/span><span>${st.route.estimated ? esc(T('est_route')) : ''}<\/span><\/div>`;\n                        html += optsOf(svc).map(o => `<button class=\"ride-opt ${o.key === sel ? 'on' : ''}\" onclick=\"ridePickCls('${o.key}')\"><span class=\"ic\">${o.icon}<\/span><span><div class=\"nm\">${esc(o.name)}<\/div><div class=\"ds\">${esc(o.desc)}<\/div><\/span><span class=\"pr\">${esc(money(q.fares[svc][o.key], q.currency, q.decimals))}<\/span><\/button>`).join('');\n                        html += `<div class=\"ride-offerbox\"><div class=\"ride-offerlbl\">${esc(T('your_offer'))}<\/div>\n                            <div class=\"ride-offerrow\"><button onclick=\"rideStep(-1)\">\u2212<\/button><input id=\"ride-offer\" type=\"number\" inputmode=\"decimal\" step=\"any\" onchange=\"rideOfferInput(this)\" value=\"${st.offer.toFixed(q.decimals)}\"><button onclick=\"rideStep(1)\">+<\/button><\/div>\n                            <div class=\"ride-offerhint\" id=\"ride-offer-hint\"><\/div><div class=\"ride-meta\" id=\"ride-offer-rec\"><\/div><\/div>`;\n                        if (svc === 'delivery') {\n                            html += `<input class=\"ride-in\" id=\"ride-f-item\" maxlength=\"120\" placeholder=\"${esc(T('item_ph'))}\" value=\"${esc(st.form.item)}\">\n                                <div class=\"ride-row2\"><input class=\"ride-in\" id=\"ride-f-rn\" maxlength=\"60\" placeholder=\"${esc(T('rcpt_name_ph'))}\" value=\"${esc(st.form.rn)}\"><input class=\"ride-in\" id=\"ride-f-rp\" inputmode=\"tel\" placeholder=\"${esc(T('rcpt_phone_ph'))}\" value=\"${esc(st.form.rp)}\"><\/div>`;\n                        }\n                        html += `<input class=\"ride-in\" id=\"ride-f-phone\" inputmode=\"tel\" placeholder=\"${esc(T('phone_ph'))}\" value=\"${esc(st.form.phone)}\">\n                            <input class=\"ride-in\" id=\"ride-f-note\" maxlength=\"140\" placeholder=\"${esc(T('note_ph'))}\" value=\"${esc(st.form.note)}\">`;\n                        if (svc === 'delivery') html += `<label class=\"ride-chk\"><input type=\"checkbox\" id=\"ride-f-ack\" ${st.form.ack ? 'checked' : ''}> <span>${esc(T('ack'))}<\/span><\/label>`;\n                        html += `<button class=\"ozg-btn ride-cta\" id=\"ride-cta\" onclick=\"rideSubmit()\"><\/button><div class=\"ride-note\">${esc(T('cash'))}<\/div>`;\n                        box.innerHTML = html; bindForm(); refreshOffer();\n                    }\n                    window.rideSubmit = async () => {\n                        if (isGuest()) { if (typeof ozgShowSignUpPrompt === 'function') ozgShowSignUpPrompt(); else toast(T('login_needed')); return; }\n                        const f = st.form; localStorage.setItem('ozg_ride_phone', f.phone);\n                        st.busy = true; refreshOffer();\n                        try {\n                            const r = await api('\/order', 'POST', { service: st.service, cls: st.cls[st.service], from: st.from, to: st.to, dist_m: st.route.dist, dur_s: st.route.dur, offer: st.offer, phone: f.phone, note: f.note, item: f.item, rcpt_name: f.rn, rcpt_phone: f.rp, ack: f.ack });\n                            st.seen = new Set(); applyOrder(r.order);\n                        } catch (e) { toast(e.message); }\n                        st.busy = false; refreshOffer();\n                    };\n\n                    \/\/ ---------- passenger: stages ----------\n                    function renderPassengerShell() {\n                        $('ride-p').innerHTML = `<div id=\"ride-st-form\">\n                            <div class=\"ride-seg\" id=\"ride-svc\"><button data-s=\"ride\" class=\"on\" onclick=\"rideSetService('ride')\">\ud83d\ude97 ${esc(T('ride'))}<\/button><button data-s=\"delivery\" onclick=\"rideSetService('delivery')\">\ud83d\udce6 ${esc(T('delivery'))}<\/button><\/div>\n                            <div class=\"ride-route\">\n                                <div class=\"ride-pt\" id=\"ride-pt-from\"><span class=\"dot\"><\/span><input id=\"ride-from\" placeholder=\"${esc(T('from_ph'))}\" onfocus=\"rideFocus('from')\" oninput=\"rideSearch('from')\" autocomplete=\"off\"><\/div>\n                                <div class=\"ride-pt\" id=\"ride-pt-to\"><span class=\"sq\"><\/span><input id=\"ride-to\" placeholder=\"${esc(T('to_ph'))}\" onfocus=\"rideFocus('to')\" oninput=\"rideSearch('to')\" autocomplete=\"off\"><\/div>\n                            <\/div>\n                            <div class=\"ride-sugg\" id=\"ride-sugg\" hidden><\/div>\n                            <div id=\"ride-opts\"><\/div><\/div>\n                            <div id=\"ride-st-live\" hidden><\/div>`;\n                        window.rideFocus = w => { st.active = w; markActive(); };\n                        window.rideSearch = w => onSearchInput(w);\n                        if (st.from) $('ride-from').value = st.from.addr === '\u2026' ? '' : st.from.addr;\n                        if (st.to) $('ride-to').value = st.to.addr === '\u2026' ? '' : st.to.addr;\n                        markActive(); renderOptions(); rideSetService(st.service);\n                    }\n                    function showStage(name) { $('ride-st-form').hidden = name !== 'form'; $('ride-st-live').hidden = name === 'form'; if (st.map) setTimeout(() => st.map.invalidateSize(), 60); }\n                    function syncMapForState() {\n                        if (!st.map) return;\n                        if (st.mode === 'p') {\n                            const o = st.order;\n                            setMarker('from', o ? o.from : st.from, pinIcon('from')); setMarker('to', o ? o.to : st.to, pinIcon('to'));\n                        }\n                    }\n                    function applyOrder(o) {\n                        const prev = st.order; st.order = o;\n                        if (!o) {\n                            st.stageKey = ''; showStage('form'); renderOptions(); syncMapForState();\n                            setMarker('driver', null);\n                            if (st.route && st.from && st.to) routeAndQuote(); \/\/ restore drawn route\n                            return;\n                        }\n                        setMarker('from', o.from, pinIcon('from')); setMarker('to', o.to, pinIcon('to'));\n                        fit([o.from, o.to]);\n                        const key = o.id + ':' + o.status; if (key === st.stageKey) { updateLive(); return; }\n                        st.stageKey = key;\n                        if (o.status === 'open') renderSearching(); else if (o.status === 'done') renderRate(); else renderTrip();\n                        showStage('live'); updateLive();\n                    }\n                    function head(o) {\n                        return `<div class=\"ride-summary\"><div style=\"min-width:0;\"><b>${esc(o.cls_icon)} ${esc(o.cls_name)} \u00b7 ${esc(fmtDist(o.dist_m, o.unit))}<\/b><div class=\"meta\" style=\"white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\">${esc(o.from.addr)} \u2192 ${esc(o.to.addr)}<\/div><\/div>\n                            <div style=\"text-align:right;\"><div class=\"meta\">${esc(T('your_offer'))}<\/div><b id=\"ride-live-offer\">${esc(money(o.offer, o.currency, o.decimals))}<\/b><\/div><\/div>`;\n                    }\n                    function renderSearching() {\n                        const o = st.order;\n                        $('ride-st-live').innerHTML = head(o) + `<div class=\"ride-radar\"><div class=\"ride-pulse\"><\/div><div><b style=\"color:#fff;\">${esc(T('searching'))}<\/b><div class=\"ride-sub\" style=\"margin:2px 0 0;\" id=\"ride-nearby\"><\/div><\/div><\/div>\n                            <button class=\"ozg-btn-sec ride-cta\" style=\"display:flex;margin-top:0;margin-bottom:10px;\" id=\"ride-raise\" onclick=\"rideRaise()\"><\/button>\n                            <div class=\"ride-sortbar\"><div class=\"ride-h3\">${esc(T('offers'))}<\/div><div style=\"display:flex;gap:6px;\">${['price', 'eta', 'rating'].map(k => `<button class=\"ride-chip ${st.sort === k ? 'on' : ''}\" data-sort=\"${k}\" onclick=\"rideSort('${k}')\">${esc(T('sort_' + k))}<\/button>`).join('')}<\/div><\/div>\n                            <div id=\"ride-offers\"><\/div><button class=\"ride-link\" onclick=\"rideCancel()\">${esc(T('cancel'))}<\/button>`;\n                    }\n                    window.rideSort = k => { st.sort = k; document.querySelectorAll('[data-sort]').forEach(b => b.classList.toggle('on', b.dataset.sort === k)); renderOffers(); };\n                    function ratingLine(d) { return (d.reviews_count ? `<span class=\"ride-star\">\u2605 ${d.rating.toFixed(2)}<\/span>` : `<span class=\"ride-star\">\u2605<\/span> ${esc(T('new_driver'))}`) + ' \u00b7 ' + esc(T('trips', d.trips)); }\n                    function carLine(d) { return `${esc(d.car)}${d.color ? ' \u00b7 ' + esc(d.color) : ''} <span class=\"ride-plate\">${esc(d.plate)}<\/span>`; }\n                    function renderOffers() {\n                        const o = st.order; const box = $('ride-offers'); if (!o || o.status !== 'open' || !box) return;\n                        const list = (o.bids || []).slice();\n                        list.sort(st.sort === 'eta' ? (a, b) => a.eta_min - b.eta_min || a.price - b.price : st.sort === 'rating' ? (a, b) => b.driver.rating - a.driver.rating || b.driver.trips - a.driver.trips : (a, b) => a.price - b.price || a.eta_min - b.eta_min);\n                        if (!list.length) { box.innerHTML = `<div class=\"ride-empty\"><b>${esc(T('no_offers'))}<\/b>${esc(T('no_offers_sub'))}<\/div>`; return; }\n                        box.innerHTML = list.map(b => {\n                            const d = b.driver, isNew = !st.seen.has(b.id);\n                            return `<div class=\"ride-card ${isNew ? 'new' : ''}\" data-bid=\"${b.id}\">\n                                <div class=\"ride-top\"><div class=\"ride-avatar\">${esc(initials(d.name))}<\/div>\n                                    <div class=\"ride-info\"><div class=\"ride-name\">${esc(d.name)}${d.verified ? `<span class=\"ride-badge\">${esc(T('verified'))}<\/span>` : ''}<\/div><div class=\"ride-meta\">${ratingLine(d)}<\/div><div class=\"ride-meta\">${carLine(d)}<\/div><\/div>\n                                    <div class=\"ride-price\">${esc(money(b.price, o.currency, o.decimals))}${b.matches_offer ? `<small>${esc(T('accepts_yours'))}<\/small>` : ''}<div class=\"ride-meta\" style=\"font-weight:600;\">${esc(T('min', b.eta_min))}<\/div><\/div><\/div>\n                                <div class=\"ride-foot\"><span class=\"ride-timer\" data-exp=\"${b.expires_ts}\">${hms(b.expires_ts - nowTs())}<\/span>\n                                    <button class=\"ozg-btn-sec ride-mini\" onclick=\"rideProfile(${d.id})\">${esc(T('profile'))}<\/button><button class=\"ozg-btn ride-mini\" onclick=\"rideAccept(${b.id})\">${esc(T('accept'))}<\/button><\/div><\/div>`;\n                        }).join('');\n                    }\n                    function updateLive() {\n                        const o = st.order; if (!o) return;\n                        const off = $('ride-live-offer'); if (off) off.textContent = money(o.offer, o.currency, o.decimals);\n                        if (o.status === 'open') {\n                            const n = $('ride-nearby'); if (n) n.textContent = o.nearby > 0 ? T('nearby', o.nearby) : T('nearby_none');\n                            const r = $('ride-raise'); if (r) { const nx = Math.min(o.est * 3, o.offer + o.step); r.textContent = T('raise', money(nx, o.currency, o.decimals)); r.dataset.next = nx; r.hidden = nx <= o.offer; }\n                            renderOffers();\n                        } else if (o.status === 'awarded' || o.status === 'arrived' || o.status === 'started') {\n                            const dv = o.driver || {}; const s = $('ride-trip-status');\n                            const del = o.service === 'delivery';\n                            if (s) s.textContent = T('st_' + o.status + (del ? '_del' : '')) + (o.status === 'awarded' && dv.eta_min ? ' \u00b7 ' + T('min', dv.eta_min) : '');\n                            if (dv.loc) { setMarker('driver', dv.loc, carIcon()); }\n                        }\n                    }\n                    window.rideRaise = async () => {\n                        const nx = parseFloat($('ride-raise').dataset.next); if (!nx) return;\n                        try { const r = await api('\/order\/raise', 'POST', { order_id: st.order.id, offer: nx }); st.order = r.order; updateLive(); } catch (e) { toast(e.message); }\n                    };\n                    window.rideAccept = async bidId => {\n                        const b = (st.order.bids || []).find(x => x.id === bidId); if (!b) return;\n                        if (!confirm(T('accept_confirm', b.driver.name, money(b.price, st.order.currency, st.order.decimals)))) return;\n                        try { const r = await api('\/bid\/accept', 'POST', { bid_id: bidId }); rideCloseModal(); applyOrder(r.order); } catch (e) { toast(e.message); pollP(); }\n                    };\n                    window.rideCancel = async () => {\n                        if (!confirm(T('cancel_confirm'))) return;\n                        try { await api('\/order\/cancel', 'POST', { order_id: st.order.id }); st.order = null; setMarker('driver', null); applyOrder(null); } catch (e) { toast(e.message); }\n                    };\n                    window.rideProfile = async id => {\n                        openModal('<div class=\"ride-empty\">\u2026<\/div>');\n                        try {\n                            const d = await api('\/driver\/' + id);\n                            openModal(`<div class=\"ride-top\" style=\"margin-bottom:12px;\"><div class=\"ride-avatar\" style=\"width:56px;height:56px;\">${esc(initials(d.name))}<\/div><div class=\"ride-info\"><div class=\"ride-name\" style=\"font-size:1.15rem;\">${esc(d.name)}${d.verified ? `<span class=\"ride-badge\">${esc(T('verified'))}<\/span>` : ''}<\/div><div class=\"ride-meta\">${ratingLine(d)}<\/div><\/div><\/div>\n                                <div class=\"ride-summary\"><span class=\"ride-meta\">${carLine(d)}<\/span><span class=\"ride-meta\">${d.since ? esc(T('since', d.since)) : ''}<\/span><\/div>`);\n                        } catch (e) { rideCloseModal(); toast(e.message); }\n                    };\n                    function renderTrip() {\n                        const o = st.order, dv = o.driver || {}, p = dv.profile || {};\n                        $('ride-st-live').innerHTML = `<div class=\"ride-status\"><i data-lucide=\"navigation\"><\/i><span id=\"ride-trip-status\"><\/span><\/div>\n                            <div class=\"ride-card\"><div class=\"ride-top\"><div class=\"ride-avatar\">${esc(initials(p.name))}<\/div>\n                                <div class=\"ride-info\"><div class=\"ride-name\">${esc(p.name)}<\/div><div class=\"ride-meta\">${ratingLine(p)}<\/div><div class=\"ride-meta\">${carLine(p)}<\/div><\/div>\n                                <div class=\"ride-price\"><div class=\"ride-meta\" style=\"font-weight:600;\">${esc(T('paid'))}<\/div>${esc(money(o.price, o.currency, o.decimals))}<\/div><\/div>\n                                <div class=\"ride-meta\" style=\"margin-top:10px;\">${esc(o.from.addr)} \u2192 ${esc(o.to.addr)}${o.item ? '<br>\ud83d\udce6 ' + esc(o.item) : ''}<\/div>\n                                <div class=\"ride-actions\">${dv.phone ? `<a class=\"ozg-btn ride-mini\" href=\"tel:${esc(dv.phone)}\">\ud83d\udcde ${esc(T('call'))}<\/a>` : ''}<button class=\"ride-sos\" onclick=\"rideSOS()\">\ud83c\udd98 ${esc(T('sos'))}<\/button><\/div><\/div>\n                            ${o.status !== 'started' ? `<button class=\"ride-link\" onclick=\"rideCancel()\">${esc(T('cancel_trip'))}<\/button>` : ''}`;\n                        icons();\n                    }\n                    window.rideSOS = () => { const n = (st.order && st.order.emergency) || '112'; if (confirm(T('sos_confirm', n))) location.href = 'tel:' + n; };\n                    function renderRate() {\n                        const o = st.order, p = (o.driver && o.driver.profile) || {}; st.rating = 0; setMarker('driver', null);\n                        $('ride-st-live').innerHTML = `<div style=\"text-align:center;padding:6px 0;\"><div class=\"ride-avatar\" style=\"margin:0 auto 10px;width:60px;height:60px;\">${esc(initials(p.name))}<\/div><h2>${esc(T('rate_title'))}<\/h2>\n                            <div class=\"ride-sub\">${esc(T('paid'))}: <b style=\"color:#fff;\">${esc(money(o.price, o.currency, o.decimals))}<\/b><\/div>\n                            <div class=\"ride-stars\" id=\"ride-stars\">${[1, 2, 3, 4, 5].map(n => `<button onclick=\"rideStar(${n})\">\u2605<\/button>`).join('')}<\/div><\/div>\n                            <button class=\"ozg-btn ride-cta\" onclick=\"rideRate()\">${esc(T('send'))}<\/button><button class=\"ride-link\" style=\"color:var(--text-muted);\" onclick=\"rideRate(true)\">${esc(T('skip'))}<\/button>`;\n                    }\n                    window.rideStar = n => { st.rating = n; document.querySelectorAll('#ride-stars button').forEach((b, i) => b.classList.toggle('on', i < n)); };\n                    window.rideRate = async skip => {\n                        if (!skip && !st.rating) return;\n                        try { await api('\/order\/rate', 'POST', { order_id: st.order.id, rating: skip ? 0 : st.rating }); st.order = null; st.to = null; st.route = null; st.quote = null; setMarker('to', null); setLine('route', null); if ($('ride-to')) $('ride-to').value = ''; applyOrder(null); }\n                        catch (e) { toast(e.message); }\n                    };\n                    async function pollP() {\n                        if (st.mode !== 'p' || isGuest() || !st.order) return;\n                        try {\n                            const s = await api('\/state'); const o = s.order;\n                            if (!o) {\n                                if (s.last && s.last.status === 'cancelled' && s.last.by === 'driver') toast(T('drv_cancelled'));\n                                else if (s.last && s.last.status === 'expired') toast(T('expired'));\n                                st.order = null; applyOrder(null); return;\n                            }\n                            if (st.order && o.id === st.order.id && o.status === 'open') {\n                                const fresh = (o.bids || []).filter(b => !st.seen.has(b.id) && !(st.order.bids || []).some(x => x.id === b.id));\n                                st.order = o; updateLive();\n                                if (fresh.length) { toast('\ud83d\udd14 +' + fresh.length + ' ' + T('offers').toLowerCase()); if (navigator.vibrate) navigator.vibrate(60); setTimeout(() => (st.order && st.order.bids || []).forEach(b => st.seen.add(b.id)), 4000); }\n                            } else applyOrder(o);\n                        } catch (e) {}\n                    }\n\n                    \/\/ ---------- driver mode ----------\n                    function startWatch() {\n                        if (st.watchId != null || !navigator.geolocation) return;\n                        st.watchId = navigator.geolocation.watchPosition(p => { st.pos = { lat: p.coords.latitude, lng: p.coords.longitude }; setMarker('me', st.pos, st.mode === 'd' ? carIcon() : pinIcon('me')); }, () => {}, { enableHighAccuracy: true, maximumAge: 5000, timeout: 20000 });\n                    }\n                    async function pollD(forceOnline) {\n                        if (isGuest()) return;\n                        const d = st.d;\n                        try {\n                            const r = await api('\/driver\/poll', 'POST', { online: forceOnline != null ? forceOnline : d.online, lat: st.pos ? st.pos.lat : null, lng: st.pos ? st.pos.lng : null });\n                            const hadJob = !!d.job;\n                            d.profile = r.profile; d.online = r.online; d.job = r.job; d.inbox = r.inbox || [];\n                            if (hadJob && !r.job && !d.finishing) toast(T('job_gone'));\n                            d.finishing = false;\n                            renderDriver();\n                        } catch (e) { toast(e.message); }\n                    }\n                    function renderDriver() {\n                        const d = st.d, box = $('ride-d'); if (!box) return;\n                        if (box.contains(document.activeElement) && document.activeElement.tagName === 'INPUT' && d.job === null && d.inbox.length && box.dataset.sig) { \/* keep typing *\/ updateTimersOnly(); return; }\n                        const p = d.profile;\n                        let h = '';\n                        if (!p || d.editing) {\n                            const c = p || { name: '', phone: '', car: '', color: '', plate: '', vehicle_class: 'economy', services: ['ride', 'delivery'] };\n                            h += `<h2>${esc(T('d_profile'))}<\/h2>${p ? '' : `<p class=\"ride-sub\">${esc(T('d_setup'))}<\/p>`}\n                                <label class=\"ride-label\">${esc(T('d_name'))}<\/label><input class=\"ride-in\" id=\"dp-name\" maxlength=\"40\" value=\"${esc(c.name)}\">\n                                <label class=\"ride-label\">${esc(T('d_phone'))}<\/label><input class=\"ride-in\" id=\"dp-phone\" inputmode=\"tel\" value=\"${esc(c.phone)}\">\n                                <label class=\"ride-label\">${esc(T('d_car'))}<\/label><input class=\"ride-in\" id=\"dp-car\" maxlength=\"50\" value=\"${esc(c.car)}\">\n                                <div class=\"ride-row2\"><div><label class=\"ride-label\">${esc(T('d_color'))}<\/label><input class=\"ride-in\" id=\"dp-color\" maxlength=\"20\" value=\"${esc(c.color)}\"><\/div><div><label class=\"ride-label\">${esc(T('d_plate'))}<\/label><input class=\"ride-in\" id=\"dp-plate\" maxlength=\"15\" value=\"${esc(c.plate)}\"><\/div><\/div>\n                                <label class=\"ride-label\">${esc(T('d_class'))}<\/label><div style=\"display:flex;gap:6px;flex-wrap:wrap;margin-bottom:8px;\" id=\"dp-class\">${cfg.rideClasses.map(o => `<button class=\"ride-chip ${c.vehicle_class === o.key ? 'on' : ''}\" data-v=\"${o.key}\" onclick=\"rideDpClass(this)\">${o.icon} ${esc(o.name)}<\/button>`).join('')}<\/div>\n                                <label class=\"ride-label\">${esc(T('d_services'))}<\/label><div style=\"display:flex;gap:6px;margin-bottom:8px;\" id=\"dp-svc\">${['ride', 'delivery'].map(s => `<button class=\"ride-chip ${(c.services || []).includes(s) ? 'on' : ''}\" data-s=\"${s}\" onclick=\"this.classList.toggle('on')\">${s === 'ride' ? '\ud83d\ude97' : '\ud83d\udce6'} ${esc(T(s))}<\/button>`).join('')}<\/div>\n                                <button class=\"ozg-btn ride-cta\" onclick=\"rideSaveProfile()\">${esc(T('d_save'))}<\/button>`;\n                            box.dataset.sig = ''; box.innerHTML = h; return;\n                        }\n                        h += `<div class=\"ride-summary\"><div><b>${esc(p.name)}<\/b><div class=\"meta\">${ratingLine(p)}<\/div><div class=\"meta\">${carLine(p)}<\/div><\/div><button class=\"ride-chip\" onclick=\"rideEditProfile()\">${esc(T('d_edit'))}<\/button><\/div>`;\n                        if (!p.approved) h += `<div class=\"ride-status\" style=\"background:rgba(255,179,71,.1);border-color:rgba(255,179,71,.4);\">\u23f3 <span>${esc(T('d_pending'))}<\/span><\/div>`;\n                        else h += `<button class=\"ozg-btn ride-cta\" style=\"margin-top:0;${d.online ? 'background:#ff3366;color:#fff;box-shadow:none;' : ''}\" onclick=\"rideToggleOnline()\">${esc(T(d.online ? 'go_offline' : 'go_online'))}<\/button><div class=\"ride-note\" style=\"margin-bottom:10px;\">${esc(T(d.online ? 'online_now' : 'offline_now'))}<\/div>`;\n                        if (d.job) h += jobHtml(d.job);\n                        else if (d.online) {\n                            h += `<div class=\"ride-h3\" style=\"margin:10px 0;\">${esc(T('requests'))}<\/div>`;\n                            h += d.inbox.length ? d.inbox.map(reqHtml).join('') : `<div class=\"ride-empty\">${esc(T('no_requests'))}<\/div>`;\n                        }\n                        box.dataset.sig = d.job ? 'job' : d.inbox.length ? 'inbox' : '';\n                        box.innerHTML = h; icons(); drawDriverMap();\n                    }\n                    function updateTimersOnly() {}\n                    window.rideEditProfile = () => { st.d.editing = true; renderDriver(); };\n                    window.rideDpClass = el => { document.querySelectorAll('#dp-class .ride-chip').forEach(b => b.classList.toggle('on', b === el)); };\n                    window.rideSaveProfile = async () => {\n                        try {\n                            const r = await api('\/driver\/save', 'POST', { name: $('dp-name').value, phone: $('dp-phone').value, car: $('dp-car').value, color: $('dp-color').value, plate: $('dp-plate').value,\n                                vehicle_class: (document.querySelector('#dp-class .on') || {}).dataset ? document.querySelector('#dp-class .on').dataset.v : '', services: [...document.querySelectorAll('#dp-svc .on')].map(b => b.dataset.s) });\n                            st.d.profile = r.profile; st.d.editing = false; toast(T('saved')); pollD();\n                        } catch (e) { toast(e.message); }\n                    };\n                    window.rideToggleOnline = () => {\n                        const d = st.d;\n                        if (d.online) { d.online = false; pollD(false); return; }\n                        startWatch();\n                        const go = () => { d.online = true; pollD(true); };\n                        if (st.pos) return go();\n                        navigator.geolocation.getCurrentPosition(p => { st.pos = { lat: p.coords.latitude, lng: p.coords.longitude }; go(); }, () => toast(T('need_loc')), { enableHighAccuracy: true, timeout: 12000 });\n                    };\n                    function reqHtml(o) {\n                        const del = o.service === 'delivery', m = o.my_bid, c = st.d.counters[o.id];\n                        const val = c != null ? c : (m ? m.price : o.offer);\n                        return `<div class=\"ride-card\" data-req=\"${o.id}\" onclick=\"rideFocusReq(${o.id})\">\n                            <div class=\"ride-top\"><div class=\"ride-avatar\" style=\"border-radius:14px;\">${o.cls_icon}<\/div><div class=\"ride-info\"><div class=\"ride-name\">${del ? esc(T('delivery')) : esc(T('ride'))} \u00b7 ${esc(o.cls_name)}${del && o.item ? ' \u00b7 ' + esc(o.item) : ''}<\/div>\n                                <div class=\"ride-meta\">${esc(T('pickup_in', fmtDist(o.pickup_m, o.unit), o.eta_min))}<\/div><div class=\"ride-meta\">${esc(T('trip_len', fmtDist(o.dist_m, o.unit) + ' \u00b7 ' + fmtMin(o.dur_s)))}<\/div><\/div>\n                                <div class=\"ride-price\">${esc(money(o.offer, o.currency, o.decimals))}<\/div><\/div>\n                            <div class=\"ride-meta\" style=\"margin-top:8px;\">\ud83d\udccd ${esc(o.from.addr)}<br>\ud83c\udfc1 ${esc(o.to.addr)}${o.note ? '<br>\ud83d\udcac ' + esc(o.note) : ''}<\/div>\n                            ${m ? `<div class=\"ride-meta\" style=\"color:var(--success-color);margin-top:8px;\">\u2714 ${esc(T('your_bid', money(m.price, o.currency, o.decimals)))} \u00b7 <span class=\"ride-timer\" data-exp=\"${m.expires_ts}\">${hms(m.expires_ts - nowTs())}<\/span><\/div>` : ''}\n                            <div class=\"ride-foot\" onclick=\"event.stopPropagation()\"><input class=\"ride-in\" style=\"margin:0;flex:1;min-width:0;\" type=\"number\" inputmode=\"decimal\" step=\"any\" id=\"cb-${o.id}\" value=\"${val}\" oninput=\"rideCounter(${o.id},this.value)\">\n                                <button class=\"ozg-btn-sec ride-mini\" onclick=\"rideBid(${o.id},false)\">${esc(T('counter'))}<\/button><button class=\"ozg-btn ride-mini\" onclick=\"rideBid(${o.id},true)\">${esc(T('accept_price', money(o.offer, o.currency, o.decimals)))}<\/button><\/div><\/div>`;\n                    }\n                    window.rideCounter = (id, v) => { st.d.counters[id] = v; };\n                    window.rideBid = async (id, atOffer) => {\n                        const o = st.d.inbox.find(x => x.id === id); if (!o) return;\n                        const price = atOffer ? o.offer : parseFloat($('cb-' + id).value);\n                        try { await api('\/bid', 'POST', { order_id: id, price }); toast(T('saved')); delete st.d.counters[id]; document.activeElement && document.activeElement.blur(); pollD(); } catch (e) { toast(e.message); }\n                    };\n                    window.rideFocusReq = id => { const o = st.d.inbox.find(x => x.id === id); if (!o || !st.map) return; setMarker('from', o.from, pinIcon('from')); setMarker('to', o.to, pinIcon('to')); setLine('route', [[o.from.lat, o.from.lng], [o.to.lat, o.to.lng]], { color: '#8b9bb4', weight: 3, dashArray: '6 8' }); fit([o.from, o.to].concat(st.pos ? [st.pos] : [])); };\n                    function jobHtml(j) {\n                        const del = j.service === 'delivery';\n                        const next = { awarded: 'arrived', arrived: 'started', started: 'done' }[j.status];\n                        const nav = (j.status === 'started' ? j.to : j.from);\n                        return `<div class=\"ride-card\"><div class=\"ride-top\"><div class=\"ride-avatar\" style=\"border-radius:14px;\">${j.cls_icon}<\/div><div class=\"ride-info\"><div class=\"ride-name\">${esc(T('passenger'))}: ${esc(j.passenger)}<\/div><div class=\"ride-meta\">${esc(j.cls_name)} \u00b7 ${esc(fmtDist(j.dist_m, j.unit))}<\/div><\/div><div class=\"ride-price\">${esc(money(j.price, j.currency, j.decimals))}<\/div><\/div>\n                            <div class=\"ride-meta\" style=\"margin-top:8px;\">\ud83d\udccd ${esc(j.from.addr)}<br>\ud83c\udfc1 ${esc(j.to.addr)}${j.note ? '<br>\ud83d\udcac ' + esc(j.note) : ''}${del ? `<br>\ud83d\udce6 ${esc(T('item'))}: ${esc(j.item)}<br>\ud83d\udc64 ${esc(T('recipient'))}: ${esc(j.rcpt_name)} ${j.rcpt_phone ? `<a href=\"tel:${esc(j.rcpt_phone)}\" style=\"color:var(--r-acc);\">${esc(j.rcpt_phone)}<\/a>` : ''}` : ''}<\/div>\n                            <div class=\"ride-actions\">${j.phone ? `<a class=\"ozg-btn-sec ride-mini\" href=\"tel:${esc(j.phone)}\">\ud83d\udcde ${esc(T('call'))}<\/a>` : ''}<a class=\"ozg-btn-sec ride-mini\" target=\"_blank\" rel=\"noopener\" href=\"https:\/\/www.google.com\/maps\/dir\/?api=1&destination=${nav.lat},${nav.lng}\">\ud83e\udded ${esc(T('navigate'))}<\/a><\/div>\n                            ${next ? `<button class=\"ozg-btn ride-cta\" onclick=\"rideJob('${next}')\">${esc(T('a_' + next))}<\/button>` : ''}\n                            ${j.status !== 'started' ? `<button class=\"ride-link\" onclick=\"rideJob('cancel')\">${esc(T('a_cancel'))}<\/button>` : ''}<\/div>`;\n                    }\n                    window.rideJob = async action => {\n                        const j = st.d.job; if (!j) return;\n                        if (action === 'cancel' && !confirm(T('cancel_confirm'))) return;\n                        try {\n                            if (action === 'done') st.d.finishing = true;\n                            const r = await api('\/job\/status', 'POST', { order_id: j.id, action });\n                            st.d.job = r.job; if (action === 'done' && r.completed_price != null) toast(T('trip_done', money(r.completed_price, j.currency, j.decimals)));\n                            if (!r.job) { setMarker('from', null); setMarker('to', null); setLine('route', null); }\n                            st.d.finishing = false; renderDriver();\n                        } catch (e) { st.d.finishing = false; toast(e.message); }\n                    };\n                    function drawDriverMap() {\n                        const j = st.d.job; if (!st.map || st.mode !== 'd') return;\n                        if (j) {\n                            setMarker('from', j.from, pinIcon('from')); setMarker('to', j.to, pinIcon('to'));\n                            setLine('route', [[j.from.lat, j.from.lng], [j.to.lat, j.to.lng]], { color: '#00f0ff', weight: 4, opacity: .8 });\n                            const key = 'job' + j.id; if (st.d.lastJob !== key) { st.d.lastJob = key; fit([j.from, j.to].concat(st.pos ? [st.pos] : [])); }\n                        } else if (!st.d.inbox.length) { setMarker('from', null); setMarker('to', null); setLine('route', null); }\n                    }\n\n                    \/\/ ---------- mode \/ lifecycle ----------\n                    window.rideSetMode = m => {\n                        if (m === 'd' && isGuest()) { if (typeof ozgShowSignUpPrompt === 'function') ozgShowSignUpPrompt(); return; }\n                        st.mode = m;\n                        $('ride-m-p').classList.toggle('active', m === 'p'); $('ride-m-d').classList.toggle('active', m === 'd');\n                        $('ride-p').hidden = m !== 'p'; $('ride-d').hidden = m !== 'd';\n                        ['from', 'to', 'driver', 'me'].forEach(k => setMarker(k, null)); setLine('route', null);\n                        if (m === 'p') { syncMapForState(); if (st.route && st.from && st.to) routeAndQuote(); if (st.order) { setMarker('from', st.order.from, pinIcon('from')); setMarker('to', st.order.to, pinIcon('to')); } if (st.pos) setMarker('me', st.pos, pinIcon('me')); }\n                        else { startWatch(); if (st.pos) setMarker('me', st.pos, carIcon()); pollD(); }\n                        if (st.map) setTimeout(() => st.map.invalidateSize(), 60);\n                    };\n                    async function init() {\n                        st.inited = true;\n                        $('ride-m-p').textContent = T('mode_p'); $('ride-m-d').textContent = T('mode_d'); $('ride-hint').textContent = T('hint_map');\n                        renderPassengerShell(); icons(); initMap();\n                        if (!isGuest()) {\n                            try { const s = await api('\/state'); if (s.order) { (s.order.bids || []).forEach(b => st.seen.add(b.id)); applyOrder(s.order); } } catch (e) {}\n                        }\n                        setInterval(() => { document.querySelectorAll('[data-exp]').forEach(el => { el.textContent = hms(+el.dataset.exp - nowTs()); }); }, 1000);\n                        setInterval(() => { if (!active()) return; if (st.mode === 'p') pollP(); }, 3000);\n                        setInterval(() => { if (!active() || st.mode !== 'd') return; if (st.d.online || st.d.job) pollD(); }, 4000);\n                    }\n                    const active = () => { const k = $('kingdom'); return k && k.classList.contains('active') && !document.hidden; };\n                    window.rideOnShow = () => { if (!st.inited) init(); else if (st.map) setTimeout(() => st.map.invalidateSize(), 80); };\n                    if ($('kingdom') && $('kingdom').classList.contains('active')) { if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', () => window.rideOnShow()); else window.rideOnShow(); }\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=\"car-taxi-front\"><\/i><\/a>\n                            <a class=\"ozg-mob-item ozg-auth-link\" href=\"https:\/\/go.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\ude95<\/span> Ride &amp; Delivery<\/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 hobbist<\/button>\n                <a href=\"https:\/\/go.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 Hobbist Energy Coins (HEC)<\/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 Hobbist<\/button>\n                <a href=\"https:\/\/go.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=\"6acdd7b6468a6\"><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='16982'>Link: \u0422\u044b_\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u044b\u0438\u0306_\u0414\u044d\u043d\u044d\u043d\u0434\u0436\u0438\u044f_\u0425\u044d\u0442\u0442\u0438\u0430\u0440\u0430\u0447\u0447\u0438<\/option><option value='16965'>Link: \u2764\ufe0f\u200d\ud83d\udd25 \u041f\u0440\u0438\u0437\u0432\u0430\u043d\u0438\u0435. \u041a\u0430\u043a \u043d\u0430\u0439\u0442\u0438 \u0434\u0435\u043b\u043e \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438<\/option><option value='16950'>Link: hobbist \u0432\u043e\u0439\u043d\u044b \u0434\u0443\u0445\u043e\u0432<\/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><\/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 = '4468a59a6a';\n        const apiBase = 'https:\/\/go.hobbi.st\/ru\/wp-json\/ozgeris\/v1';\n        const ozgDashboardUrl = 'https:\/\/go.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 Hobbist 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\":16982,\"post_author\":\"2134\",\"post_date\":\"2026-10-05 08:49:11\",\"post_date_gmt\":\"2026-10-05 03:49:11\",\"post_content\":\"\",\"post_title\":\"\\u0422\\u044b_\\u041e\\u0441\\u043e\\u0431\\u0435\\u043d\\u043d\\u044b\\u0438\\u0306_\\u0414\\u044d\\u043d\\u044d\\u043d\\u0434\\u0436\\u0438\\u044f_\\u0425\\u044d\\u0442\\u0442\\u0438\\u0430\\u0440\\u0430\\u0447\\u0447\\u0438\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"ty_osobennyj_denendzhiya_hettiarachchi\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-10-05 08:50:06\",\"post_modified_gmt\":\"2026-10-05 03:50:06\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/ty_osobennyj_denendzhiya_hettiarachchi\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16965,\"post_author\":\"2\",\"post_date\":\"2026-10-04 16:54:11\",\"post_date_gmt\":\"2026-10-04 11:54:11\",\"post_content\":\"\",\"post_title\":\"\\u2764\\ufe0f\\u200d\\ud83d\\udd25 \\u041f\\u0440\\u0438\\u0437\\u0432\\u0430\\u043d\\u0438\\u0435. \\u041a\\u0430\\u043a \\u043d\\u0430\\u0439\\u0442\\u0438 \\u0434\\u0435\\u043b\\u043e \\u0441\\u0432\\u043e\\u0435\\u0439 \\u0436\\u0438\\u0437\\u043d\\u0438\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"worklife\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-10-04 18:31:46\",\"post_modified_gmt\":\"2026-10-04 13:31:46\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/%e2%9d%a4%ef%b8%8f%f0%9f%94%a5-%d0%bf%d1%80%d0%b8%d0%b7%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%ba%d0%b0%d0%ba-%d0%bd%d0%b0%d0%b9%d1%82%d0%b8-%d0%b4%d0%b5%d0%bb%d0%be-%d1%81%d0%b2%d0%be%d0%b5\\\/\",\"menu_order\":0,\"post_type\":\"courses\",\"post_mime_type\":\"\",\"comment_count\":\"0\",\"filter\":\"raw\"},{\"ID\":16950,\"post_author\":\"2\",\"post_date\":\"2026-09-30 15:37:48\",\"post_date_gmt\":\"2026-09-30 10:37:48\",\"post_content\":\"\",\"post_title\":\"hobbist \\u0432\\u043e\\u0439\\u043d\\u044b \\u0434\\u0443\\u0445\\u043e\\u0432\",\"post_excerpt\":\"\",\"post_status\":\"publish\",\"comment_status\":\"closed\",\"ping_status\":\"closed\",\"post_password\":\"\",\"post_name\":\"hobbist-%d0%b2%d0%be%d0%b9%d0%bd%d1%8b-%d0%b4%d1%83%d1%85%d0%be%d0%b2\",\"to_ping\":\"\",\"pinged\":\"\",\"post_modified\":\"2026-09-30 15:37:48\",\"post_modified_gmt\":\"2026-09-30 10:37:48\",\"post_content_filtered\":\"\",\"post_parent\":0,\"guid\":\"https:\\\/\\\/hobbi.st\\\/courses\\\/hobbist-%d0%b2%d0%be%d0%b9%d0%bd%d1%8b-%d0%b4%d1%83%d1%85%d0%be%d0%b2\\\/\",\"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\"}];\n        const programsWithMeta = [{\"ID\":16982,\"post_title\":\"\\u0422\\u044b_\\u041e\\u0441\\u043e\\u0431\\u0435\\u043d\\u043d\\u044b\\u0438\\u0306_\\u0414\\u044d\\u043d\\u044d\\u043d\\u0434\\u0436\\u0438\\u044f_\\u0425\\u044d\\u0442\\u0442\\u0438\\u0430\\u0440\\u0430\\u0447\\u0447\\u0438\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16965,\"post_title\":\"\\u2764\\ufe0f\\u200d\\ud83d\\udd25 \\u041f\\u0440\\u0438\\u0437\\u0432\\u0430\\u043d\\u0438\\u0435. \\u041a\\u0430\\u043a \\u043d\\u0430\\u0439\\u0442\\u0438 \\u0434\\u0435\\u043b\\u043e \\u0441\\u0432\\u043e\\u0435\\u0439 \\u0436\\u0438\\u0437\\u043d\\u0438\",\"pillar\":\"\",\"area\":\"\"},{\"ID\":16950,\"post_title\":\"hobbist \\u0432\\u043e\\u0439\\u043d\\u044b \\u0434\\u0443\\u0445\\u043e\\u0432\",\"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\"}];\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\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 rideOnShow === 'function') rideOnShow();\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 Hobbist!');\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() || 'Hobbist', 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 a Hobbist 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 || 'Hobbist')}`;\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:\/\/go.hobbi.st\/ru\/wp-json\/wp\/v2\/pages\/16013","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/go.hobbi.st\/ru\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/go.hobbi.st\/ru\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/go.hobbi.st\/ru\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/go.hobbi.st\/ru\/wp-json\/wp\/v2\/comments?post=16013"}],"version-history":[{"count":3,"href":"https:\/\/go.hobbi.st\/ru\/wp-json\/wp\/v2\/pages\/16013\/revisions"}],"predecessor-version":[{"id":16017,"href":"https:\/\/go.hobbi.st\/ru\/wp-json\/wp\/v2\/pages\/16013\/revisions\/16017"}],"wp:attachment":[{"href":"https:\/\/go.hobbi.st\/ru\/wp-json\/wp\/v2\/media?parent=16013"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}