{"id":105,"date":"2026-03-13T18:29:15","date_gmt":"2026-03-14T01:29:15","guid":{"rendered":"https:\/\/gogoit.com\/video\/?page_id=105"},"modified":"2026-03-13T18:50:45","modified_gmt":"2026-03-14T01:50:45","slug":"broker-dashboard","status":"publish","type":"page","link":"https:\/\/gogoit.com\/video\/broker-dashboard\/","title":{"rendered":"broker dashboard"},"content":{"rendered":"\n\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n\n<style>\n:root {\n    --dash-primary: #6366F1;\n    --dash-primary-dark: #4F46E5;\n    --dash-primary-light: #818CF8;\n    --dash-primary-glow: rgba(99, 102, 241, 0.15);\n    --dash-success: #10B981;\n    --dash-success-light: #D1FAE5;\n    --dash-warning: #F59E0B;\n    --dash-warning-light: #FEF3C7;\n    --dash-danger: #EF4444;\n    --dash-danger-light: #FEE2E2;\n    --dash-gray-50: #F9FAFB;\n    --dash-gray-100: #F3F4F6;\n    --dash-gray-200: #E5E7EB;\n    --dash-gray-300: #D1D5DB;\n    --dash-gray-400: #9CA3AF;\n    --dash-gray-500: #6B7280;\n    --dash-gray-600: #4B5563;\n    --dash-gray-700: #374151;\n    --dash-gray-800: #1F2937;\n    --dash-gray-900: #111827;\n    --sidebar-width: 260px;\n    --wp-admin-bar: 32px;\n    --card-shadow: 0 1px 3px rgba(0,0,0,0.04), 0 4px 12px rgba(0,0,0,0.03);\n    --card-shadow-hover: 0 4px 16px rgba(0,0,0,0.08);\n    --transition-fast: 0.15s ease;\n    --transition-smooth: 0.25s ease;\n    --border-radius-sm: 8px;\n    --border-radius-md: 12px;\n    --border-radius-lg: 16px;\n}\n\n* { box-sizing: border-box; }\n\n.entry-title, .page-title, article > header, .entry-header, .ast-archive-description, h1.entry-title {\n    display: none !important;\n}\n\n.site-footer, footer.site-footer, .ast-footer-copyright, .site-info, footer[role=\"contentinfo\"] {\n    margin-left: var(--sidebar-width) !important;\n    text-align: center !important;\n}\n\n@media (max-width: 768px) {\n    .site-footer, footer.site-footer, .ast-footer-copyright, .site-info, footer[role=\"contentinfo\"] {\n        margin-left: 0 !important;\n    }\n}\n\n.gvei-dashboard-wrapper { margin: 0; padding: 0; width: 100%; background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%); min-height: 100vh; }\n\n.page .entry-content, .gvei-dashboard-wrapper .entry-content, article.page, .site-content, .content-area, .ast-container, .site-main, main#main, #primary, #content, .hentry, .ast-separate-container .ast-article-single, .ast-separate-container .ast-article-post {\n    max-width: none !important; width: 100% !important; padding: 0 !important; margin: 0 !important; background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%) !important;\n}\n\nbody.admin-bar .gvei-sidebar { top: var(--wp-admin-bar); height: calc(100vh - var(--wp-admin-bar)); }\nbody.admin-bar .gvei-dashboard { min-height: calc(100vh - var(--wp-admin-bar)); }\nbody.admin-bar .gvei-sidebar-overlay { top: var(--wp-admin-bar); }\n\n.gvei-dashboard {\n    font-family: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n    background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n    min-height: 100vh; padding: 0; margin: 0; display: flex;\n    -webkit-font-smoothing: antialiased;\n}\n\n.gvei-main { flex: 1; margin-left: var(--sidebar-width); min-height: 100vh; }\n\n\/* Sidebar *\/\n.gvei-sidebar {\n    width: var(--sidebar-width); height: 100vh; max-height: 100vh;\n    background: linear-gradient(180deg, #0F172A 0%, #1E293B 100%);\n    position: fixed; left: 0; top: 0; z-index: 1000;\n    display: flex; flex-direction: column;\n    transition: transform 0.3s ease;\n    box-shadow: 4px 0 24px rgba(0,0,0,0.15);\n    overflow: hidden;\n}\n\n.gvei-sidebar-header { flex-shrink: 0; padding: 28px 24px; border-bottom: 1px solid rgba(255,255,255,0.08); }\n.gvei-sidebar-logo { font-size: 26px; font-weight: 800; letter-spacing: 1px; display: flex; align-items: center; text-transform: uppercase; }\n.gvei-sidebar-logo .logo-gogo { color: #fff; }\n.gvei-sidebar-logo .logo-it { color: #cbc9c9; font-weight: 800; }\n\n.gvei-sidebar-user { margin-top: 16px; display: flex; align-items: center; gap: 12px; }\n.gvei-sidebar-avatar {\n    width: 40px; height: 40px; border-radius: 50%;\n    background: linear-gradient(135deg, var(--dash-primary), var(--dash-primary-light));\n    display: flex; align-items: center; justify-content: center;\n    color: #fff; font-weight: 700; font-size: 16px; overflow: hidden; flex-shrink: 0;\n}\n.gvei-sidebar-avatar img { width: 100%; height: 100%; object-fit: cover; }\n.gvei-sidebar-user-info { min-width: 0; }\n.gvei-sidebar-user-name { color: #fff; font-weight: 600; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.gvei-sidebar-user-status { color: var(--dash-success); font-size: 12px; font-weight: 500; }\n\n.gvei-sidebar-nav { flex: 1; overflow-y: auto; padding: 16px 12px; }\n.gvei-nav-group-label { color: var(--dash-gray-400); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; padding: 16px 12px 6px; }\n\n.gvei-nav-item {\n    display: flex; align-items: center; gap: 12px; padding: 10px 12px; border-radius: 10px;\n    color: var(--dash-gray-400); font-size: 14px; font-weight: 500;\n    text-decoration: none; transition: all var(--transition-fast); margin-bottom: 2px;\n}\n.gvei-nav-item:hover { background: rgba(255,255,255,0.06); color: #fff; text-decoration: none; }\n.gvei-nav-item.active { background: var(--dash-primary-glow); color: var(--dash-primary-light); font-weight: 600; }\n.gvei-nav-icon { font-size: 18px; width: 24px; text-align: center; flex-shrink: 0; }\n\n.gvei-sidebar-footer { padding: 16px 12px; border-top: 1px solid rgba(255,255,255,0.08); flex-shrink: 0; }\n.gvei-sidebar-help {\n    width: 100%; padding: 10px 12px; border-radius: 10px; background: rgba(255,255,255,0.04);\n    border: 1px solid rgba(255,255,255,0.08); color: var(--dash-gray-400);\n    font-size: 13px; cursor: pointer; display: flex; align-items: center; gap: 8px; transition: all var(--transition-fast);\n}\n.gvei-sidebar-help:hover { background: rgba(99,102,241,0.9); border-color: rgba(99,102,241,0.9); color: #fff; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(99,102,241,0.3); }\n\n\/* Support Panel *\/\n.gvei-support-overlay { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 9998; opacity: 0; transition: opacity 0.3s ease; }\n.gvei-support-overlay.open { display: block; opacity: 1; }\n.gvei-support-panel {\n    position: fixed; bottom: 0; left: 0; right: 0; background: #fff;\n    border-radius: 20px 20px 0 0; box-shadow: 0 -4px 24px rgba(0,0,0,0.15);\n    z-index: 9999; max-height: 90vh; overflow-y: auto;\n    transform: translateY(100%); transition: transform 0.3s ease;\n}\n.gvei-support-panel.open { transform: translateY(0); }\n@media (min-width: 769px) {\n    .gvei-support-panel { left: auto; right: 24px; bottom: 24px; width: 420px; max-height: 80vh; border-radius: 16px; transform: translateY(20px); opacity: 0; pointer-events: none; }\n    .gvei-support-panel.open { transform: translateY(0); opacity: 1; pointer-events: auto; }\n}\n.gvei-support-header {\n    display: flex; align-items: center; justify-content: space-between;\n    padding: 20px 24px; border-bottom: 1px solid var(--dash-gray-200);\n    background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n    border-radius: 20px 20px 0 0;\n}\n@media (min-width: 769px) { .gvei-support-header { border-radius: 16px 16px 0 0; } }\n.gvei-support-header h3 { margin: 0; font-size: 18px; font-weight: 700; color: var(--dash-gray-900); }\n.gvei-support-close {\n    background: var(--dash-gray-100); border: none; width: 32px; height: 32px; border-radius: 8px;\n    color: var(--dash-gray-500); cursor: pointer; padding: 0;\n    display: flex; align-items: center; justify-content: center; transition: all 0.2s ease; font-size: 0;\n}\n.gvei-support-close::before {\n    content: ''; width: 14px; height: 14px;\n    background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C\/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C\/line%3E%3C\/svg%3E\");\n    background-size: contain; background-repeat: no-repeat; background-position: center;\n}\n.gvei-support-close:hover { background: var(--dash-primary); }\n.gvei-support-close:hover::before {\n    background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C\/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C\/line%3E%3C\/svg%3E\");\n}\n.gvei-support-body { padding: 16px 20px 20px 20px; overflow: visible; }\n.gvei-support-body select {\n    -webkit-appearance: none; -moz-appearance: none; appearance: none;\n    background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%236b7280' d='M6 8L1 3h10z'\/%3E%3C\/svg%3E\");\n    background-repeat: no-repeat; background-position: right 12px center; padding-right: 36px;\n    text-overflow: ellipsis; white-space: nowrap; overflow: hidden; min-height: 44px;\n}\n.gvei-support-greeting {\n    background: linear-gradient(135deg, #EEF2FF 0%, #E0E7FF 100%); border: 1px solid #C7D2FE;\n    border-radius: 10px; padding: 12px 14px; margin-bottom: 16px;\n    font-size: 13px; color: var(--dash-gray-700); line-height: 1.4;\n}\n.gvei-support-greeting strong { color: var(--dash-gray-900); }\n#gvei-support-form .gvei-form-group { margin-bottom: 14px; }\n#gvei-support-form .gvei-label { font-size: 13px; margin-bottom: 6px; }\n#gvei-support-form .gvei-input { padding: 10px 12px; font-size: 14px; }\n#gvei-support-form textarea.gvei-input { min-height: 80px; }\n#gvei-support-form .gvei-helper { margin-top: 4px; font-size: 11px; }\n.gvei-support-submit { margin-top: 8px; }\n.gvei-support-submit:disabled { opacity: 0.6; cursor: not-allowed; }\n.gvei-support-upload-area {\n    border: 2px dashed var(--dash-gray-300); border-radius: 8px; padding: 12px;\n    text-align: center; cursor: pointer; transition: all 0.2s; background: var(--dash-gray-50);\n}\n.gvei-support-upload-area:hover { border-color: var(--dash-primary); background: rgba(34,197,94,0.05); }\n.gvei-support-upload-prompt { display: flex; flex-direction: row; align-items: center; justify-content: center; gap: 8px; color: var(--dash-gray-500); font-size: 12px; }\n.gvei-support-upload-prompt span:first-child { font-size: 20px !important; }\n.gvei-support-upload-preview { position: relative; display: inline-block; }\n.gvei-support-upload-preview img { max-width: 100%; max-height: 150px; border-radius: 8px; object-fit: contain; }\n.gvei-support-remove-upload {\n    position: absolute; top: -10px; right: -10px; width: 28px; height: 28px;\n    min-width: 28px; min-height: 28px; background: #ef4444; color: white;\n    border: 2px solid white; border-radius: 50%; font-size: 20px; font-weight: 300;\n    line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center;\n    padding: 0; padding-bottom: 2px; box-shadow: 0 2px 6px rgba(0,0,0,0.2); font-family: Arial, sans-serif;\n}\n.gvei-support-remove-upload:hover { background: #dc2626; transform: scale(1.1); }\n\n\/* Sidebar overlay (mobile) *\/\n.gvei-sidebar-overlay {\n    display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%;\n    background: rgba(0,0,0,0.5); z-index: 999;\n}\n.gvei-sidebar-overlay.active { display: block; }\n\n\/* Mobile hamburger *\/\n.gvei-mobile-header {\n    display: none; position: fixed; top: 0; left: 0; right: 0; z-index: 998;\n    background: #0F172A; padding: 12px 16px; align-items: center; justify-content: space-between;\n    box-shadow: 0 2px 12px rgba(0,0,0,0.15);\n}\n.gvei-hamburger { background: none; border: none; color: #fff; font-size: 24px; cursor: pointer; padding: 4px; }\n.gvei-mobile-logo { font-size: 20px; font-weight: 800; color: #fff; letter-spacing: 1px; }\n.gvei-mobile-logo span { color: #cbc9c9; }\n\n@media (max-width: 768px) {\n    .gvei-sidebar { transform: translateX(-100%); }\n    .gvei-sidebar.open { transform: translateX(0); }\n    .gvei-main { margin-left: 0; padding-top: 60px; }\n    .gvei-mobile-header { display: flex; }\n    body.admin-bar .gvei-mobile-header { top: var(--wp-admin-bar); }\n    body.admin-bar .gvei-main { padding-top: calc(60px + var(--wp-admin-bar)); }\n}\n\n\/* Main content area *\/\n.gvei-main-content { padding: 32px; max-width: 960px; }\n@media (max-width: 768px) { .gvei-main-content { padding: 20px 16px; } }\n\n.gvei-page-title { font-size: 24px; font-weight: 700; color: var(--dash-gray-900); margin: 0 0 4px; }\n.gvei-page-desc { font-size: 14px; color: var(--dash-gray-500); margin: 0 0 24px; }\n\n\/* Cards *\/\n.gvei-card {\n    background: #fff; border-radius: var(--border-radius-md); padding: 24px;\n    box-shadow: var(--card-shadow); margin-bottom: 20px;\n}\n.gvei-card-title { font-size: 16px; font-weight: 700; color: var(--dash-gray-900); margin: 0 0 16px; }\n\n\/* Form elements *\/\n.gvei-form-group { margin-bottom: 20px; }\n.gvei-label { display: block; font-size: 13px; font-weight: 600; color: var(--dash-gray-700); margin-bottom: 6px; }\n.gvei-input {\n    width: 100%; padding: 10px 14px; border: 1px solid var(--dash-gray-200); border-radius: var(--border-radius-sm);\n    font-size: 14px; font-family: inherit; color: var(--dash-gray-900); transition: border-color var(--transition-fast);\n}\n.gvei-input:focus { outline: none; border-color: var(--dash-primary); box-shadow: 0 0 0 3px var(--dash-primary-glow); }\ntextarea.gvei-input { min-height: 80px; resize: vertical; }\n\n\/* Buttons *\/\n.gvei-btn {\n    display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 10px 20px;\n    border-radius: var(--border-radius-sm); font-size: 14px; font-weight: 600;\n    font-family: inherit; cursor: pointer; transition: all var(--transition-fast); border: none;\n    text-align: center;\n}\n.gvei-btn-primary { background: var(--dash-primary); color: #fff; }\n.gvei-btn-primary:hover { background: var(--dash-primary-dark); }\n.gvei-btn-primary:disabled { opacity: 0.5; cursor: not-allowed; }\n.gvei-btn-secondary { background: var(--dash-gray-100); color: var(--dash-gray-700); }\n.gvei-btn-secondary:hover { background: var(--dash-gray-200); }\n\n\/* Category \/ checkbox cards *\/\n.gvei-check-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 10px; }\n.gvei-check-card {\n    position: relative; border: 2px solid var(--dash-gray-200); border-radius: var(--border-radius-sm);\n    padding: 12px 14px; cursor: pointer; transition: all var(--transition-fast);\n}\n.gvei-check-card:hover { border-color: var(--dash-gray-300); }\n.gvei-check-card.checked { border-color: var(--dash-primary); background: rgba(99,102,241,0.04); }\n.gvei-check-card input { position: absolute; opacity: 0; pointer-events: none; }\n.gvei-check-card label { display: flex; align-items: center; gap: 8px; cursor: pointer; font-size: 13px; font-weight: 500; color: var(--dash-gray-700); }\n.gvei-check-card .check-mark {\n    width: 20px; height: 20px; border-radius: 4px; border: 2px solid var(--dash-gray-300);\n    display: flex; align-items: center; justify-content: center; flex-shrink: 0;\n    font-size: 12px; color: #fff; transition: all var(--transition-fast);\n}\n.gvei-check-card.checked .check-mark { background: var(--dash-primary); border-color: var(--dash-primary); }\n\n\/* Radio cards (tone) *\/\n.gvei-radio-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }\n.gvei-radio-card {\n    position: relative; border: 2px solid var(--dash-gray-200); border-radius: var(--border-radius-sm);\n    overflow: hidden; cursor: pointer; transition: all var(--transition-fast);\n}\n.gvei-radio-card:hover { border-color: var(--dash-gray-300); }\n.gvei-radio-card.selected { border-color: var(--dash-primary); background: rgba(99,102,241,0.04); }\n.gvei-radio-card input[type=\"radio\"] { position: absolute; opacity: 0; pointer-events: none; }\n.gvei-radio-card label { display: flex; align-items: center; gap: 8px; padding: 12px 14px; cursor: pointer; font-size: 13px; font-weight: 600; color: var(--dash-gray-700); }\n.gvei-radio-card .dash-tone-name { flex: 1; font-weight: 600; font-size: 13px; }\n.gvei-radio-card.selected .dash-tone-name { color: var(--dash-primary); }\n.dash-tone-info-btn {\n    flex: 0 0 22px; width: 22px; height: 22px; border-radius: 50%;\n    border: 1.5px solid var(--dash-gray-300); background: white; color: var(--dash-gray-400);\n    font-size: 12px; font-weight: 600; font-style: italic; font-family: Georgia, serif;\n    display: flex; align-items: center; justify-content: center;\n    cursor: pointer; transition: all 0.15s; line-height: 1;\n}\n.dash-tone-info-btn:hover, .dash-tone-info-btn.active { border-color: var(--dash-primary); color: var(--dash-primary); background: rgba(99,102,241,0.06); }\n.dash-tone-desc-panel {\n    display: none; padding: 8px 14px 12px; font-size: 12px; line-height: 1.5;\n    color: var(--dash-gray-500); background: var(--dash-gray-50); border-top: 1px solid var(--dash-gray-200);\n}\n.dash-tone-desc-panel.open { display: block; }\n@media (max-width: 500px) { .gvei-radio-grid { grid-template-columns: 1fr; } }\n\n\/* Video grid *\/\n.gvei-video-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 20px; }\n.gvei-video-card {\n    background: #fff; border-radius: var(--border-radius-md); overflow: hidden;\n    box-shadow: var(--card-shadow); transition: all var(--transition-smooth); cursor: pointer;\n}\n.gvei-video-card:hover { box-shadow: var(--card-shadow-hover); transform: translateY(-2px); }\n.gvei-video-thumb {\n    width: 100%; aspect-ratio: 16\/9; background: var(--dash-gray-100);\n    display: flex; align-items: center; justify-content: center; font-size: 40px; color: var(--dash-gray-300);\n    overflow: hidden; position: relative;\n}\n.gvei-video-thumb img { width: 100%; height: 100%; object-fit: cover; }\n.gvei-video-thumb .play-icon {\n    position: absolute; width: 48px; height: 48px; border-radius: 50%;\n    background: rgba(0,0,0,0.6); color: #fff; display: flex; align-items: center; justify-content: center;\n    font-size: 20px; backdrop-filter: blur(4px);\n}\n.gvei-video-info { padding: 14px 16px; }\n.gvei-video-title { font-size: 14px; font-weight: 600; color: var(--dash-gray-900); margin: 0 0 6px; }\n.gvei-video-meta { font-size: 12px; color: var(--dash-gray-500); display: flex; align-items: center; gap: 8px; }\n.gvei-video-badge {\n    display: inline-block; padding: 2px 8px; border-radius: 4px;\n    font-size: 11px; font-weight: 600; text-transform: uppercase;\n    background: var(--dash-primary-glow); color: var(--dash-primary);\n}\n\n\/* Video modal *\/\n.gvei-modal-overlay {\n    display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%;\n    background: rgba(0,0,0,0.7); z-index: 10000; align-items: center; justify-content: center;\n}\n.gvei-modal-overlay.active { display: flex; }\n.gvei-modal {\n    background: #000; border-radius: var(--border-radius-lg); max-width: 800px; width: 90%;\n    overflow: hidden; position: relative;\n}\n.gvei-modal video { width: 100%; display: block; }\n.gvei-modal-close {\n    position: absolute; top: 12px; right: 12px; width: 36px; height: 36px; border-radius: 50%;\n    background: rgba(255,255,255,0.2); border: none; color: #fff; font-size: 20px; cursor: pointer;\n    display: flex; align-items: center; justify-content: center; backdrop-filter: blur(4px); z-index: 1;\n}\n.gvei-modal-actions { padding: 12px 16px; background: var(--dash-gray-900); display: flex; justify-content: flex-end; gap: 8px; }\n\n\/* Voice cards *\/\n.gvei-voice-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; }\n.gvei-voice-card {\n    border: 2px solid var(--dash-gray-200); border-radius: var(--border-radius-sm);\n    padding: 14px; cursor: pointer; transition: all var(--transition-fast);\n}\n.gvei-voice-card:hover { border-color: var(--dash-gray-300); }\n.gvei-voice-card.selected { border-color: var(--dash-primary); background: rgba(99,102,241,0.04); }\n.gvei-voice-card-name { font-size: 14px; font-weight: 600; color: var(--dash-gray-900); margin-bottom: 4px; }\n.gvei-voice-card-desc { font-size: 12px; color: var(--dash-gray-500); margin-bottom: 8px; }\n.gvei-voice-play {\n    width: 40px; height: 40px; min-width: 40px; min-height: 40px; border-radius: 50%;\n    background: var(--dash-primary); color: white; border: none; cursor: pointer;\n    display: inline-flex; align-items: center; justify-content: center; font-size: 14px;\n    box-shadow: 0 2px 8px rgba(99,102,241,0.3); transition: all 0.2s ease; padding: 0; line-height: 1;\n}\n.gvei-voice-play:hover { transform: scale(1.08); box-shadow: 0 4px 12px rgba(99,102,241,0.4); }\n.gvei-voice-play.playing { background: #10b981; }\n\n\/* Voice mode toggle *\/\n.gvei-voice-mode-toggle { display: flex; gap: 12px; margin-bottom: 20px; }\n.gvei-voice-mode-option {\n    flex: 1; padding: 16px; border: 2px solid var(--dash-gray-200); border-radius: var(--border-radius-md);\n    text-align: center; cursor: pointer; transition: all var(--transition-fast);\n}\n.gvei-voice-mode-option:hover { border-color: var(--dash-gray-300); }\n.gvei-voice-mode-option.selected { border-color: var(--dash-primary); background: rgba(99,102,241,0.04); }\n.gvei-voice-mode-icon { font-size: 28px; margin-bottom: 6px; }\n.gvei-voice-mode-label { font-size: 14px; font-weight: 600; color: var(--dash-gray-800); }\n.gvei-voice-mode-desc { font-size: 12px; color: var(--dash-gray-500); margin-top: 2px; }\n\n\/* Profile photo *\/\n.gvei-photo-area { display: flex; align-items: center; gap: 20px; margin-bottom: 20px; }\n.gvei-photo-preview {\n    width: 80px; height: 80px; border-radius: 50%; background: var(--dash-gray-100);\n    display: flex; align-items: center; justify-content: center; font-size: 32px;\n    color: var(--dash-gray-300); overflow: hidden; flex-shrink: 0; position: relative;\n}\n.gvei-photo-preview img { width: 100%; height: 100%; object-fit: cover; }\n\n\/* End card preview *\/\n.gvei-endcard-preview {\n    background: #000; border-radius: 12px; padding: 32px 24px; color: #fff;\n    text-align: center; margin-bottom: 24px; aspect-ratio: 9\/16; max-width: 260px;\n    margin-left: auto; margin-right: auto; display: flex; flex-direction: column;\n    align-items: center; justify-content: flex-start; overflow: hidden;\n}\n.gvei-endcard-agency-logo {\n    background: rgba(255,255,255,0.1); border-radius: 8px; padding: 12px 24px;\n    margin-bottom: 28px; min-height: 50px; display: flex; align-items: center; justify-content: center;\n}\n.gvei-endcard-no-logo-spacer { height: 0; margin-bottom: 80px; flex-shrink: 0; }\n.gvei-endcard-agency-logo img { max-height: 40px; max-width: 160px; object-fit: contain; }\n.gvei-endcard-photo {\n    width: 110px; height: 110px; border-radius: 50%; background: rgba(255,255,255,0.1);\n    margin: 0 auto 18px; display: flex; align-items: center; justify-content: center;\n    font-size: 44px; overflow: hidden; flex-shrink: 0;\n}\n.gvei-endcard-photo img { width: 100%; height: 100%; object-fit: cover; }\n.gvei-endcard-name { font-size: 22px; font-weight: 300; margin-bottom: 6px; letter-spacing: 1px; }\n.gvei-endcard-phone { font-size: 18px; font-weight: 300; letter-spacing: 1px; opacity: 0.8; }\n.gvei-endcard-preview .gvei-endcard-phone a,\n.gvei-endcard-preview .gvei-endcard-phone .gvei-endcard-phone-inner {\n    color: inherit !important; text-decoration: none !important; -webkit-tap-highlight-color: transparent;\n}\n.gvei-endcard-preview .gvei-endcard-phone a { pointer-events: none; }\n\n\/* Logo area *\/\n.gvei-logo-area { display: flex; align-items: center; gap: 16px; }\n.gvei-logo-preview {\n    width: 120px; height: 60px; border-radius: 8px; background: var(--dash-gray-100);\n    display: flex; align-items: center; justify-content: center; overflow: hidden;\n    border: 1px solid var(--dash-gray-200); flex-shrink: 0;\n}\n.gvei-logo-preview img { max-width: 100%; max-height: 100%; object-fit: contain; padding: 6px; }\n.gvei-logo-preview .placeholder-text { font-size: 11px; color: var(--dash-gray-400); }\n\n\/* Crop modal *\/\n.gvei-crop-modal {\n    display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0;\n    background: rgba(0,0,0,0.6); backdrop-filter: blur(4px); z-index: 10001;\n    align-items: center; justify-content: center; padding: 20px;\n}\n.gvei-crop-modal.active { display: flex; }\n.gvei-crop-container { background: white; border-radius: var(--border-radius-lg); max-width: 500px; width: 100%; max-height: 90vh; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.3); }\n.gvei-crop-header { padding: 24px 28px 16px; text-align: center; }\n.gvei-crop-header h3 { font-size: 1.25rem; font-weight: 600; color: var(--dash-gray-900); margin-bottom: 6px; }\n.gvei-crop-header p { font-size: 0.875rem; color: var(--dash-gray-400); }\n.gvei-crop-area { padding: 0 28px; display: flex; justify-content: center; align-items: center; min-height: 300px; background: #f5f7fa; }\n.gvei-crop-area img { max-width: 100%; max-height: 350px; }\n.gvei-crop-zoom { display: flex; align-items: center; justify-content: center; gap: 16px; padding: 16px 28px; background: white; }\n.gvei-zoom-btn { width: 44px; height: 44px; border-radius: 50%; border: none; background: #f5f7fa; color: var(--dash-gray-900); font-size: 1.5rem; font-weight: 300; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; justify-content: center; line-height: 1; }\n.gvei-zoom-btn:hover { background: var(--dash-primary); color: white; }\n.gvei-zoom-label { font-size: 0.8125rem; color: var(--dash-gray-400); font-weight: 500; min-width: 50px; text-align: center; }\n.gvei-crop-actions { padding: 16px 28px 28px; display: flex; gap: 12px; }\n.gvei-crop-actions .gvei-btn { flex: 1; }\n.cropper-view-box, .cropper-face { border-radius: 50%; }\n.gvei-photo-loading { position: absolute; inset: 0; background: rgba(255,255,255,0.85); border-radius: 50%; display: flex; flex-direction: column; align-items: center; justify-content: center; z-index: 2; }\n.gvei-photo-loading .gvei-photo-spinner { width: 28px; height: 28px; border: 3px solid #e5e7eb; border-top-color: var(--dash-primary); border-radius: 50%; animation: gveiPhotoSpin 0.7s linear infinite; }\n.gvei-photo-loading span { font-size: 10px; color: var(--dash-gray-400); margin-top: 4px; }\n@keyframes gveiPhotoSpin { to { transform: rotate(360deg); } }\n\n\/* Autosave \/ toast *\/\n.gvei-toast {\n    position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%);\n    background: var(--dash-gray-900); color: #fff; padding: 10px 20px; border-radius: 8px;\n    font-size: 13px; font-weight: 500; display: none; z-index: 10002;\n    box-shadow: 0 4px 20px rgba(0,0,0,0.2);\n}\n.gvei-toast.show { display: block; animation: toastIn 0.3s ease; }\n@keyframes toastIn { from { opacity: 0; transform: translateX(-50%) translateY(10px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } }\n@keyframes dashRecPulse { 0%, 100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(239,68,68,0.4); } 50% { transform: scale(1.05); box-shadow: 0 0 0 14px rgba(239,68,68,0); } }\n@keyframes dashCountPop { from { transform: scale(0.5); opacity: 0; } to { transform: scale(1); opacity: 1; } }\n@keyframes dashSpin { to { transform: rotate(360deg); } }\n@keyframes gvei-spin { to { transform: rotate(360deg); } }\n@keyframes gvei-pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.4; transform: scale(0.7); } }\n#dash-countdown-num { animation: dashCountPop 0.35s ease; }\n.dash-spinner { width: 36px; height: 36px; border: 3px solid #e5e7eb; border-top-color: var(--dash-primary, #6366f1); border-radius: 50%; animation: dashSpin 0.7s linear infinite; }\n\n\/* Empty state *\/\n.gvei-empty {\n    text-align: center; padding: 60px 20px; color: var(--dash-gray-400);\n}\n.gvei-empty-icon { font-size: 48px; margin-bottom: 12px; }\n.gvei-empty-text { font-size: 15px; font-weight: 500; }\n.gvei-empty-sub { font-size: 13px; color: var(--dash-gray-400); margin-top: 6px; }\n\n\/* Override request form *\/\n.gvei-override-type-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-bottom: 20px; }\n.gvei-override-type {\n    border: 2px solid var(--dash-gray-200); border-radius: var(--border-radius-sm);\n    padding: 14px; text-align: center; cursor: pointer; transition: all var(--transition-fast);\n}\n.gvei-override-type:hover { border-color: var(--dash-gray-300); }\n.gvei-override-type.selected { border-color: var(--dash-primary); background: rgba(99,102,241,0.04); }\n.gvei-override-type input { position: absolute; opacity: 0; pointer-events: none; }\n.gvei-override-type-icon { font-size: 24px; margin-bottom: 4px; }\n.gvei-override-type-label { font-size: 13px; font-weight: 600; color: var(--dash-gray-700); }\n\n\/* Placeholder info card *\/\n.gvei-info-card {\n    background: linear-gradient(135deg, rgba(99,102,241,0.06), rgba(139,92,246,0.06));\n    border: 1px solid rgba(99,102,241,0.15); border-radius: var(--border-radius-md);\n    padding: 24px; text-align: center;\n}\n.gvei-info-card-icon { font-size: 36px; margin-bottom: 8px; }\n.gvei-info-card-title { font-size: 16px; font-weight: 600; color: var(--dash-gray-800); margin-bottom: 4px; }\n.gvei-info-card-desc { font-size: 13px; color: var(--dash-gray-500); }\n\n\/* Audio player *\/\n.gvei-audio-player { margin: 12px 0; }\n.gvei-audio-player audio { width: 100%; max-width: 400px; }\n<\/style>\n\n<div class=\"gvei-dashboard-wrapper\">\n<div class=\"gvei-dashboard\">\n\n    <!-- Mobile header -->\n    <div class=\"gvei-mobile-header\">\n        <button class=\"gvei-hamburger\" id=\"gvei-hamburger\">\u2630<\/button>\n        <div class=\"gvei-mobile-logo\">GOGO<span>IT<\/span><\/div>\n        <div style=\"width:32px;\"><\/div>\n    <\/div>\n\n    <!-- Sidebar overlay -->\n    <div class=\"gvei-sidebar-overlay\" id=\"gvei-sidebar-overlay\"><\/div>\n\n    <!-- Sidebar -->\n    <aside class=\"gvei-sidebar\" id=\"gvei-sidebar\">\n        <div class=\"gvei-sidebar-header\">\n            <div class=\"gvei-sidebar-logo\">\n                <span class=\"logo-gogo\">GOGO<\/span><span class=\"logo-it\">IT<\/span>\n            <\/div>\n                    <\/div>\n\n        <nav class=\"gvei-sidebar-nav\">\n                                            <a href=\"https:\/\/gogoit.com\/video\/broker-dashboard\/?token&#038;tab=videos\"\n                   class=\"gvei-nav-item active\">\n                    <span class=\"gvei-nav-icon\">\ud83d\udcf9<\/span>\n                    My Videos                <\/a>\n                                            <a href=\"https:\/\/gogoit.com\/video\/broker-dashboard\/?token&#038;tab=content\"\n                   class=\"gvei-nav-item \">\n                    <span class=\"gvei-nav-icon\">\ud83d\udccb<\/span>\n                    Content Preferences                <\/a>\n                                            <a href=\"https:\/\/gogoit.com\/video\/broker-dashboard\/?token&#038;tab=override\"\n                   class=\"gvei-nav-item \">\n                    <span class=\"gvei-nav-icon\">\u270f\ufe0f<\/span>\n                    Request Video                <\/a>\n                                            <a href=\"https:\/\/gogoit.com\/video\/broker-dashboard\/?token&#038;tab=schedule\"\n                   class=\"gvei-nav-item \">\n                    <span class=\"gvei-nav-icon\">\ud83d\udcc5<\/span>\n                    Schedule                <\/a>\n                                                <div class=\"gvei-nav-group-label\">Settings<\/div>\n                                <a href=\"https:\/\/gogoit.com\/video\/broker-dashboard\/?token&#038;tab=profile\"\n                   class=\"gvei-nav-item \">\n                    <span class=\"gvei-nav-icon\">\ud83d\udc64<\/span>\n                    Profile                <\/a>\n                                            <a href=\"https:\/\/gogoit.com\/video\/broker-dashboard\/?token&#038;tab=voice\"\n                   class=\"gvei-nav-item \">\n                    <span class=\"gvei-nav-icon\">\ud83c\udf99\ufe0f<\/span>\n                    Voice &amp; Audio                <\/a>\n                                            <a href=\"https:\/\/gogoit.com\/video\/broker-dashboard\/?token&#038;tab=billing\"\n                   class=\"gvei-nav-item \">\n                    <span class=\"gvei-nav-icon\">\ud83d\udcb3<\/span>\n                    Billing                <\/a>\n                                            <a href=\"https:\/\/gogoit.com\/video\/broker-dashboard\/?token&#038;tab=referrals\"\n                   class=\"gvei-nav-item \">\n                    <span class=\"gvei-nav-icon\">\ud83d\udcb0<\/span>\n                    Referrals                <\/a>\n                    <\/nav>\n\n        <div class=\"gvei-sidebar-footer\">\n            <button type=\"button\" class=\"gvei-sidebar-help\" id=\"gvei-open-support-form\">\n                <span>\ud83d\udcac<\/span> Need help? Contact us            <\/button>\n        <\/div>\n    <\/aside>\n\n    <!-- Support Form Panel -->\n    <div class=\"gvei-support-overlay\" id=\"gvei-support-overlay\"><\/div>\n    <div class=\"gvei-support-panel\" id=\"gvei-support-panel\">\n        <div class=\"gvei-support-header\">\n            <h3>\ud83d\udcac Contact Support<\/h3>\n            <button type=\"button\" class=\"gvei-support-close\" id=\"gvei-close-support\">&times;<\/button>\n        <\/div>\n\n        <div class=\"gvei-support-body\">\n            <div class=\"gvei-support-greeting\">\n                Hi <strong>there<\/strong>! Need help? We&#039;ll reply to <strong><\/strong>            <\/div>\n\n            <form id=\"gvei-support-form\" enctype=\"multipart\/form-data\">\n                <input type=\"hidden\" name=\"action\" value=\"gvei_broker_submit_support\">\n                <input type=\"hidden\" name=\"broker_id\" value=\"\">\n                <input type=\"hidden\" name=\"current_tab\" value=\"videos\">\n                <input type=\"hidden\" name=\"token\" value=\"\">\n                <input type=\"hidden\" id=\"gvei_broker_support_nonce\" name=\"gvei_broker_support_nonce\" value=\"f1aa65c9e7\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/video\/wp-json\/wp\/v2\/pages\/105\" \/>\n                <div class=\"gvei-form-group\">\n                    <label class=\"gvei-label\">Subject <span style=\"color: #ef4444;\">*<\/span><\/label>\n                    <select name=\"subject\" class=\"gvei-input\" required>\n                        <option value=\"\">Select a topic...<\/option>\n                        <option value=\"Account Help\">Account Help<\/option>\n                        <option value=\"Billing Question\">Billing Question<\/option>\n                        <option value=\"Bug Report\">Bug Report<\/option>\n                        <option value=\"Video Issue\">Video Issue<\/option>\n                        <option value=\"General Question\">General Question<\/option>\n                    <\/select>\n                <\/div>\n\n                <div class=\"gvei-form-group\">\n                    <label class=\"gvei-label\">Message <span style=\"color: #ef4444;\">*<\/span><\/label>\n                    <textarea name=\"message\" class=\"gvei-input\" rows=\"4\" required\n                              placeholder=\"Please describe your question or issue in detail...\"><\/textarea>\n                <\/div>\n\n                <div class=\"gvei-form-group\">\n                    <label class=\"gvei-label\">Screenshot (optional)<\/label>\n                    <div class=\"gvei-support-upload-area\" id=\"gvei-support-upload-area\">\n                        <input type=\"file\" name=\"screenshot\" id=\"gvei-support-screenshot\" accept=\"image\/jpeg,image\/png,image\/gif,image\/webp,.jpg,.jpeg,.png,.gif,.webp\" style=\"display: none;\">\n                        <div class=\"gvei-support-upload-prompt\" id=\"gvei-support-upload-prompt\">\n                            <span style=\"font-size: 24px;\">\ud83d\udcf7<\/span>\n                            <span>Click to add screenshot<\/span>\n                        <\/div>\n                        <div class=\"gvei-support-upload-preview\" id=\"gvei-support-upload-preview\" style=\"display: none;\">\n                            <img decoding=\"async\" id=\"gvei-support-preview-img\" src=\"\" alt=\"\">\n                            <button type=\"button\" class=\"gvei-support-remove-upload\" onclick=\"event.stopPropagation(); removeSupportScreenshot();\">&times;<\/button>\n                        <\/div>\n                    <\/div>\n                    <p class=\"gvei-helper\">Max 10MB. JPG, PNG, GIF, or WebP.<\/p>\n                <\/div>\n\n                <button type=\"submit\" class=\"gvei-btn gvei-btn-primary gvei-support-submit\" style=\"width: 100%;\">\n                    \ud83d\udce8 Send Message                <\/button>\n            <\/form>\n\n            <div class=\"gvei-support-success\" id=\"gvei-support-success\" style=\"display: none;\">\n                <div style=\"text-align: center; padding: 20px 20px 40px 20px;\">\n                    <div style=\"font-size: 48px; margin-bottom: 12px;\">\u2705<\/div>\n                    <h4 style=\"margin: 0 0 8px 0; color: var(--dash-gray-900); font-size: 20px;\">Message Sent!<\/h4>\n                    <p style=\"color: var(--dash-gray-600); margin: 0 0 24px 0; font-size: 14px;\">\n                        We&#039;ve received your request and will get back to you within 24 hours.                    <\/p>\n                    <button type=\"button\" class=\"gvei-btn gvei-btn-secondary\" onclick=\"closeSupportPanel()\">\n                        Close                    <\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Main Content -->\n    <main class=\"gvei-main\">\n        <div class=\"gvei-main-content\">\n\n                    <div class=\"gvei-card\" style=\"border-left: 4px solid var(--dash-danger);\">\n                <p style=\"color: var(--dash-danger); font-weight: 600;\">Invalid or missing access token.<\/p>\n            <\/div>\n        \n        <\/div>\n    <\/main>\n\n<\/div>\n<\/div>\n\n<!-- Video modal -->\n<div class=\"gvei-modal-overlay\" id=\"video-modal\">\n    <div class=\"gvei-modal\">\n        <button class=\"gvei-modal-close\" onclick=\"closeVideoModal()\">&times;<\/button>\n        <video id=\"modal-video\" controls><\/video>\n        <div class=\"gvei-modal-actions\">\n            <a id=\"modal-download\" href=\"#\" download class=\"gvei-btn gvei-btn-secondary\" style=\"font-size: 12px;\">\u2b07 Download<\/a>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- Toast -->\n<div class=\"gvei-toast\" id=\"gvei-toast\"><\/div>\n\n\n<script>\n(function(){\n    var ajaxUrl = document.getElementById('ajax-url') ? document.getElementById('ajax-url').value : '\/wp-admin\/admin-ajax.php';\n    var brokerId = document.getElementById('broker-id') ? document.getElementById('broker-id').value : '';\n    var brokerToken = document.getElementById('broker-token') ? document.getElementById('broker-token').value : '';\n    var nonceEl = document.getElementById('gvei_broker_dashboard_nonce') || document.querySelector('input[name=\"gvei_broker_dashboard_nonce\"]');\n    var nonce = nonceEl ? nonceEl.value : '';\n    var sampleAudio = null;\n    var photoCropper = null;\n\n    \/* ============================\n       Mobile sidebar\n    ============================ *\/\n    var hamburger = document.getElementById('gvei-hamburger');\n    var sidebar = document.getElementById('gvei-sidebar');\n    var overlay = document.getElementById('gvei-sidebar-overlay');\n    if (hamburger) {\n        hamburger.addEventListener('click', function() {\n            sidebar.classList.toggle('open');\n            overlay.classList.toggle('active');\n        });\n    }\n    if (overlay) {\n        overlay.addEventListener('click', function() {\n            sidebar.classList.remove('open');\n            overlay.classList.remove('active');\n        });\n    }\n\n    \/* ============================\n       Support Panel\n    ============================ *\/\n    var supportPanel = document.getElementById('gvei-support-panel');\n    var supportOverlay = document.getElementById('gvei-support-overlay');\n    var openSupportBtn = document.getElementById('gvei-open-support-form');\n    var closeSupportBtn = document.getElementById('gvei-close-support');\n    var supportForm = document.getElementById('gvei-support-form');\n    var supportSuccess = document.getElementById('gvei-support-success');\n\n    function openSupportPanel() {\n        if (supportPanel && supportOverlay) {\n            supportPanel.classList.add('open');\n            supportOverlay.classList.add('open');\n            document.body.style.overflow = 'hidden';\n            if (sidebar) sidebar.classList.remove('open');\n            if (overlay) overlay.classList.remove('active');\n        }\n    }\n\n    window.closeSupportPanel = function() {\n        if (supportPanel && supportOverlay) {\n            supportPanel.classList.remove('open');\n            supportOverlay.classList.remove('open');\n            document.body.style.overflow = '';\n            setTimeout(function() {\n                if (supportForm) {\n                    supportForm.reset();\n                    supportForm.style.display = 'block';\n                    var submitBtn = supportForm.querySelector('.gvei-support-submit');\n                    if (submitBtn) { submitBtn.innerHTML = '\ud83d\udce8 Send Message'; submitBtn.disabled = false; }\n                }\n                if (supportSuccess) supportSuccess.style.display = 'none';\n                var greetingBox = document.querySelector('.gvei-support-greeting');\n                if (greetingBox) greetingBox.style.display = 'block';\n                window.removeSupportScreenshot();\n            }, 300);\n        }\n    };\n\n    if (openSupportBtn) openSupportBtn.addEventListener('click', openSupportPanel);\n    if (closeSupportBtn) closeSupportBtn.addEventListener('click', closeSupportPanel);\n    if (supportOverlay) supportOverlay.addEventListener('click', closeSupportPanel);\n\n    var supportUploadArea = document.getElementById('gvei-support-upload-area');\n    var supportScreenshotInput = document.getElementById('gvei-support-screenshot');\n    var supportUploadPrompt = document.getElementById('gvei-support-upload-prompt');\n    var supportUploadPreview = document.getElementById('gvei-support-upload-preview');\n    var supportPreviewImg = document.getElementById('gvei-support-preview-img');\n\n    if (supportUploadArea && supportScreenshotInput) {\n        supportUploadArea.addEventListener('click', function() { supportScreenshotInput.click(); });\n        supportScreenshotInput.addEventListener('change', function(e) {\n            var file = e.target.files[0];\n            if (!file) return;\n            if (file.size > 10 * 1024 * 1024) { alert('File is too large. Maximum size is 10MB.'); supportScreenshotInput.value = ''; return; }\n            var validTypes = ['image\/jpeg', 'image\/png', 'image\/gif', 'image\/webp'];\n            if (validTypes.indexOf(file.type) === -1) { alert('Invalid file type. Please upload JPG, PNG, GIF, or WebP.'); supportScreenshotInput.value = ''; return; }\n            var reader = new FileReader();\n            reader.onload = function(ev) {\n                supportPreviewImg.src = ev.target.result;\n                supportUploadPrompt.style.display = 'none';\n                supportUploadPreview.style.display = 'block';\n            };\n            reader.readAsDataURL(file);\n        });\n    }\n\n    window.removeSupportScreenshot = function() {\n        if (supportScreenshotInput) supportScreenshotInput.value = '';\n        if (supportUploadPrompt) supportUploadPrompt.style.display = 'flex';\n        if (supportUploadPreview) supportUploadPreview.style.display = 'none';\n        if (supportPreviewImg) supportPreviewImg.src = '';\n    };\n\n    if (supportForm) {\n        supportForm.addEventListener('submit', function(e) {\n            e.preventDefault();\n            var submitBtn = supportForm.querySelector('.gvei-support-submit');\n            var originalText = submitBtn.innerHTML;\n            submitBtn.innerHTML = '\u23f3 Sending...';\n            submitBtn.disabled = true;\n            var formData = new FormData(supportForm);\n            var xhr = new XMLHttpRequest();\n            xhr.open('POST', ajaxUrl, true);\n            xhr.onload = function() {\n                try {\n                    var data = JSON.parse(xhr.responseText);\n                    if (data.success) {\n                        supportForm.style.display = 'none';\n                        var greetingBox = document.querySelector('.gvei-support-greeting');\n                        if (greetingBox) greetingBox.style.display = 'none';\n                        supportSuccess.style.display = 'block';\n                    } else {\n                        alert(data.data && data.data.message ? data.data.message : 'Something went wrong. Please try again.');\n                        submitBtn.innerHTML = originalText;\n                        submitBtn.disabled = false;\n                    }\n                } catch (err) {\n                    alert('Something went wrong. Please try again.');\n                    submitBtn.innerHTML = originalText;\n                    submitBtn.disabled = false;\n                }\n            };\n            xhr.onerror = function() {\n                alert('Network error. Please try again.');\n                submitBtn.innerHTML = originalText;\n                submitBtn.disabled = false;\n            };\n            xhr.send(formData);\n        });\n    }\n\n    \/* ============================\n       Toast\n    ============================ *\/\n    function showToast(msg) {\n        var t = document.getElementById('gvei-toast');\n        if (!t) return;\n        t.textContent = msg;\n        t.classList.add('show');\n        clearTimeout(t._timer);\n        t._timer = setTimeout(function() { t.classList.remove('show'); }, 2500);\n    }\n\n    \/* ============================\n       Checkbox \/ Radio helpers\n    ============================ *\/\n    window.toggleCheck = function(card) {\n        var cb = card.querySelector('input[type=\"checkbox\"]');\n        if (!cb) return;\n        cb.checked = !cb.checked;\n        card.classList.toggle('checked', cb.checked);\n        updateCatCount();\n    };\n\n    window.selectRadio = function(card) {\n        var radio = card.querySelector('input[type=\"radio\"]');\n        if (!radio) return;\n        var name = radio.name;\n        document.querySelectorAll('.gvei-radio-card input[name=\"' + name + '\"]').forEach(function(r) {\n            r.closest('.gvei-radio-card').classList.remove('selected');\n        });\n        radio.checked = true;\n        card.classList.add('selected');\n    };\n\n    window.dashToggleToneInfo = function(btn) {\n        var card = btn.closest('.gvei-radio-card');\n        if (!card) return;\n        var panel = card.querySelector('.dash-tone-desc-panel');\n        if (!panel) return;\n        var wasOpen = panel.classList.contains('open');\n        document.querySelectorAll('.dash-tone-desc-panel.open').forEach(function(p) { p.classList.remove('open'); });\n        document.querySelectorAll('.dash-tone-info-btn.active').forEach(function(b) { b.classList.remove('active'); });\n        if (!wasOpen) { panel.classList.add('open'); btn.classList.add('active'); }\n    };\n\n    function updateCatCount() {\n        var checked = document.querySelectorAll('#categories-grid input[type=\"checkbox\"]:checked').length;\n        var msg = document.getElementById('cat-count-msg');\n        if (msg) msg.textContent = checked + ' selected' + (checked < 3 ? ' (minimum 3)' : '');\n    }\n\n    \/* ============================\n       Dashboard Service Area ZIP Lookup\n    ============================ *\/\n    var dashZipCache = {};\n    var DASH_MAX_AREAS = 5;\n\n    function dashResolveZip(input) {\n        var zip = input.value.replace(\/\\D\/g, '');\n        if (zip.length !== 5) return;\n        input.value = zip;\n\n        var row = input.closest('.dash-area-row');\n        if (!row) return;\n        var resolved = row.querySelector('.dash-zip-resolved');\n        var cityHidden = row.querySelector('input[name=\"area_cities[]\"]');\n        var stateHidden = row.querySelector('input[name=\"area_states[]\"]');\n\n        if (dashZipCache[zip]) {\n            var c = dashZipCache[zip];\n            if (resolved) resolved.textContent = c.city + ', ' + c.state;\n            if (cityHidden) cityHidden.value = c.city;\n            if (stateHidden) stateHidden.value = c.state;\n            input.style.borderColor = '#10b981';\n            return;\n        }\n\n        if (resolved) resolved.innerHTML = '<span style=\"color:#94a3b8;\">Looking up...<\/span>';\n\n        fetch('https:\/\/api.zippopotam.us\/us\/' + zip)\n            .then(function(r) { if (!r.ok) throw new Error('not found'); return r.json(); })\n            .then(function(data) {\n                var place = data.places && data.places[0] ? data.places[0] : null;\n                if (place) {\n                    var city = place['place name'];\n                    var state = place['state abbreviation'];\n                    dashZipCache[zip] = { city: city, state: state };\n                    if (resolved) resolved.textContent = city + ', ' + state;\n                    if (cityHidden) cityHidden.value = city;\n                    if (stateHidden) stateHidden.value = state;\n                    input.style.borderColor = '#10b981';\n                } else {\n                    if (resolved) resolved.innerHTML = '<span style=\"color:#ef4444;\">Not found<\/span>';\n                    if (cityHidden) cityHidden.value = '';\n                    if (stateHidden) stateHidden.value = '';\n                }\n            })\n            .catch(function() {\n                if (resolved) resolved.innerHTML = '<span style=\"color:#ef4444;\">ZIP not found<\/span>';\n                if (cityHidden) cityHidden.value = '';\n                if (stateHidden) stateHidden.value = '';\n            });\n    }\n\n    window.dashAddArea = function() {\n        var list = document.getElementById('dash-service-areas-list');\n        if (!list) return;\n        var rows = list.querySelectorAll('.dash-area-row');\n        if (rows.length >= DASH_MAX_AREAS) return;\n\n        var div = document.createElement('div');\n        div.className = 'dash-area-row';\n        div.style.cssText = 'display:flex;align-items:center;gap:8px;padding:8px 10px;background:#f8fafc;border:1px solid #e5e7eb;border-radius:10px;margin-bottom:8px;';\n        div.innerHTML = '<input type=\"text\" name=\"area_zips[]\" class=\"gvei-input dash-zip-input\" placeholder=\"ZIP\" maxlength=\"5\" inputmode=\"numeric\" style=\"width:100px;text-align:center;font-size:15px;letter-spacing:1px;padding:8px 6px;font-weight:600;\">'\n            + '<span class=\"dash-zip-resolved\" style=\"flex:1;font-size:13px;color:#94a3b8;\">Enter ZIP<\/span>'\n            + '<input type=\"hidden\" name=\"area_cities[]\" value=\"\">'\n            + '<input type=\"hidden\" name=\"area_states[]\" value=\"\">'\n            + '<button type=\"button\" onclick=\"dashRemoveArea(this)\" title=\"Remove\" style=\"width:28px;height:28px;border:none;background:#fee2e2;color:#dc2626;border-radius:6px;font-size:14px;cursor:pointer;display:flex;align-items:center;justify-content:center;\">\u2715<\/button>';\n        list.appendChild(div);\n\n        var newInput = div.querySelector('.dash-zip-input');\n        if (newInput) {\n            newInput.addEventListener('blur', function() { dashResolveZip(this); });\n            newInput.addEventListener('input', function() {\n                var v = this.value.replace(\/\\D\/g, '');\n                this.value = v;\n                if (v.length === 5) dashResolveZip(this);\n            });\n            newInput.focus();\n        }\n\n        if (list.querySelectorAll('.dash-area-row').length >= DASH_MAX_AREAS) {\n            var wrap = document.getElementById('dash-add-area-wrap');\n            if (wrap) wrap.style.display = 'none';\n        }\n    };\n\n    window.dashRemoveArea = function(btn) {\n        var row = btn.closest('.dash-area-row');\n        if (row) row.remove();\n        var wrap = document.getElementById('dash-add-area-wrap');\n        var list = document.getElementById('dash-service-areas-list');\n        if (wrap && list && list.querySelectorAll('.dash-area-row').length < DASH_MAX_AREAS) {\n            wrap.style.display = '';\n        }\n    };\n\n    (function initDashZipInputs() {\n        document.querySelectorAll('.dash-zip-input').forEach(function(input) {\n            input.addEventListener('blur', function() { dashResolveZip(this); });\n            input.addEventListener('input', function() {\n                var v = this.value.replace(\/\\D\/g, '');\n                this.value = v;\n                if (v.length === 5) dashResolveZip(this);\n            });\n        });\n    })();\n\n    \/* ============================\n       Override: Two-step submit flow\n       Step 1: Generate AI draft preview\n       Step 2: Broker confirms \u2192 save\n    ============================ *\/\n    var _overrideDraft = null;\n\n    var _loadingInterval = null;\n\n    function showLoadingOverlay() {\n        var overlay = document.getElementById('override-loading');\n        overlay.style.display = 'flex';\n\n        var steps = overlay.querySelectorAll('.ovr-step');\n        steps.forEach(function(s) {\n            s.style.color = 'var(--dash-gray-400)';\n            var icon = s.querySelector('.ovr-step-icon');\n            icon.style.background = 'transparent';\n            icon.style.borderColor = 'var(--dash-gray-200)';\n            icon.style.color = 'transparent';\n            icon.innerHTML = '';\n        });\n\n        var currentStep = 0;\n        var stepTimings = [0, 2000, 5000, 8000];\n\n        function activateStep(idx) {\n            if (idx >= steps.length) return;\n            if (idx > 0) {\n                var prev = steps[idx - 1];\n                prev.style.color = 'var(--dash-success, #10b981)';\n                var prevIcon = prev.querySelector('.ovr-step-icon');\n                prevIcon.style.background = 'var(--dash-success, #10b981)';\n                prevIcon.style.borderColor = 'var(--dash-success, #10b981)';\n                prevIcon.style.color = '#fff';\n                prevIcon.innerHTML = '&#10003;';\n            }\n            var step = steps[idx];\n            step.style.color = 'var(--dash-gray-800)';\n            step.style.fontWeight = '600';\n            var icon = step.querySelector('.ovr-step-icon');\n            icon.style.borderColor = 'var(--dash-primary)';\n            icon.style.background = 'var(--dash-primary-glow)';\n            icon.innerHTML = '<span style=\"display:block;width:6px;height:6px;background:var(--dash-primary);border-radius:50%;animation:gvei-pulse 1s ease infinite;\"><\/span>';\n        }\n\n        stepTimings.forEach(function(delay, i) {\n            setTimeout(function() { activateStep(i); }, delay);\n        });\n    }\n\n    function hideLoadingOverlay() {\n        var overlay = document.getElementById('override-loading');\n        var steps = overlay.querySelectorAll('.ovr-step');\n        steps.forEach(function(s) {\n            s.style.color = 'var(--dash-success, #10b981)';\n            var icon = s.querySelector('.ovr-step-icon');\n            icon.style.background = 'var(--dash-success, #10b981)';\n            icon.style.borderColor = 'var(--dash-success, #10b981)';\n            icon.style.color = '#fff';\n            icon.innerHTML = '&#10003;';\n        });\n        setTimeout(function() { overlay.style.display = 'none'; }, 400);\n    }\n\n    window.submitOverride = function() {\n        var btn = document.getElementById('btn-submit-override');\n        var resultDiv = document.getElementById('override-result');\n        var requestText = (document.getElementById('override-request') || {}).value || '';\n\n        if (!requestText.trim()) {\n            showToast('Please describe what you want your video to cover.', 'error');\n            return;\n        }\n\n        btn.disabled = true;\n        btn.style.opacity = '0.5';\n        resultDiv.style.display = 'none';\n        showLoadingOverlay();\n\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_generate_draft');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('token', brokerToken);\n        fd.append('request_text', requestText);\n\n        fetch('https:\/\/gogoit.com\/video\/wp-admin\/admin-ajax.php', { method: 'POST', body: fd })\n            .then(function(r) { return r.json(); })\n            .then(function(res) {\n                btn.disabled = false;\n                btn.style.opacity = '1';\n                if (res.success && res.data && res.data.draft) {\n                    hideLoadingOverlay();\n                    _overrideDraft = res.data.draft;\n                    setTimeout(function() { showDraftPreview(res.data.draft); }, 500);\n                } else {\n                    document.getElementById('override-loading').style.display = 'none';\n                    showToast(res.data || 'Could not generate draft. Please try again.', 'error');\n                }\n            })\n            .catch(function() {\n                btn.disabled = false;\n                btn.style.opacity = '1';\n                document.getElementById('override-loading').style.display = 'none';\n                showToast('Network error. Please try again.', 'error');\n            });\n    };\n\n    var DRAFT_MAX_WORDS = 90;\n\n    function showDraftPreview(draft) {\n        document.getElementById('draft-topic-text').textContent = draft.video_topic || '';\n        document.getElementById('draft-audience').textContent = draft.audience || '';\n        document.getElementById('draft-angle').textContent = draft.angle || '';\n        document.getElementById('draft-script').value = draft.script || '';\n        document.getElementById('draft-cta').textContent = draft.cta || '';\n\n        updateDraftWordCount();\n\n        document.getElementById('override-form-card').style.display = 'none';\n        document.getElementById('override-draft-card').style.display = '';\n        document.getElementById('override-draft-card').scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }\n\n    window.updateDraftWordCount = function() {\n        var textarea = document.getElementById('draft-script');\n        var countEl = document.getElementById('draft-word-count');\n        var warningEl = document.getElementById('draft-word-warning');\n        var confirmBtn = document.getElementById('btn-confirm-override');\n        if (!textarea || !countEl) return;\n\n        var text = textarea.value.trim();\n        var words = text ? text.split(\/\\s+\/).length : 0;\n        countEl.textContent = words + ' \/ ' + DRAFT_MAX_WORDS + ' words';\n\n        if (words > DRAFT_MAX_WORDS) {\n            countEl.style.color = '#dc2626';\n            warningEl.style.display = '';\n            confirmBtn.disabled = true;\n        } else if (words > DRAFT_MAX_WORDS - 10) {\n            countEl.style.color = '#f59e0b';\n            warningEl.style.display = 'none';\n            confirmBtn.disabled = false;\n        } else {\n            countEl.style.color = 'var(--dash-gray-400)';\n            warningEl.style.display = 'none';\n            confirmBtn.disabled = false;\n        }\n    };\n\n    window.editOverride = function() {\n        document.getElementById('override-draft-card').style.display = 'none';\n        document.getElementById('override-form-card').style.display = '';\n        _overrideDraft = null;\n    };\n\n    window.confirmOverride = function() {\n        if (!_overrideDraft) { showToast('No draft to submit.', 'error'); return; }\n\n        var scriptText = (document.getElementById('draft-script') || {}).value || '';\n        var words = scriptText.trim().split(\/\\s+\/).length;\n        if (words > DRAFT_MAX_WORDS) {\n            showToast('Script is over ' + DRAFT_MAX_WORDS + ' words. Please shorten it before submitting.', 'error');\n            return;\n        }\n\n        _overrideDraft.script = scriptText;\n\n        var btn = document.getElementById('btn-confirm-override');\n        var requestText = (document.getElementById('override-request') || {}).value || '';\n\n        btn.disabled = true;\n        btn.innerHTML = '<span class=\"gvei-spinner\" style=\"display:inline-block;width:14px;height:14px;border:2px solid rgba(255,255,255,0.3);border-top-color:#fff;border-radius:50%;animation:gvei-spin .6s linear infinite;margin-right:8px;vertical-align:middle;\"><\/span>Submitting\u2026';\n\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_submit_override');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('token', brokerToken);\n        fd.append('request_text', requestText);\n        fd.append('draft_json', JSON.stringify(_overrideDraft));\n        fd.append('content_type', _overrideDraft.content_type || 'talking_points');\n        fd.append('category', _overrideDraft.category || '');\n\n        fetch('https:\/\/gogoit.com\/video\/wp-admin\/admin-ajax.php', { method: 'POST', body: fd })\n            .then(function(r) { return r.json(); })\n            .then(function(res) {\n                btn.disabled = false;\n                btn.textContent = 'Looks Good \u2014 Submit';\n                if (res.success) {\n                    document.getElementById('override-draft-card').style.display = 'none';\n                    document.getElementById('override-form-card').style.display = 'none';\n\n                    var formCard = document.getElementById('override-form-card');\n                    var successCard = document.createElement('div');\n                    successCard.className = 'gvei-card';\n                    successCard.style.cssText = 'max-width:640px;margin:0 auto;text-align:center;padding:48px 32px;';\n                    successCard.innerHTML = ''\n                        + '<div style=\"font-size:56px;margin-bottom:12px;line-height:1;\">\ud83c\udf89<\/div>'\n                        + '<h2 style=\"font-size:24px;font-weight:700;color:var(--dash-gray-800);margin:0 0 10px;\">You\\'re All Set!<\/h2>'\n                        + '<p style=\"font-size:16px;color:var(--dash-gray-500);max-width:420px;margin:0 auto 24px;line-height:1.6;\">'\n                        + 'Your video request has been submitted. Our team is on it \u2014 we\\'ll write, produce, and deliver your custom video.'\n                        + '<\/p>'\n                        + '<div style=\"display:inline-flex;align-items:center;gap:8px;background:#ecfdf5;border:1px solid #a7f3d0;border-radius:100px;padding:10px 24px;margin-bottom:24px;\">'\n                        + '<span style=\"font-size:16px;\">\ud83d\udce7<\/span>'\n                        + '<span style=\"font-size:14px;font-weight:600;color:#065f46;\">We\\'ll email you when it\\'s ready to view<\/span>'\n                        + '<\/div>'\n                        + '<div style=\"background:#f9fafb;border:1px solid var(--dash-gray-200,#e5e7eb);border-radius:10px;padding:16px 20px;max-width:400px;margin:0 auto;\">'\n                        + '<p style=\"font-size:14px;color:var(--dash-gray-500);margin:0;line-height:1.6;\">'\n                        + 'You can request another video once this one is complete. We want to give every video the attention it deserves! \u2728'\n                        + '<\/p>'\n                        + '<\/div>';\n                    formCard.parentNode.insertBefore(successCard, formCard);\n\n                    document.getElementById('override-request').value = '';\n                    _overrideDraft = null;\n                } else {\n                    showToast(res.data || 'Submission failed.', 'error');\n                }\n            })\n            .catch(function() {\n                btn.disabled = false;\n                btn.textContent = 'Looks Good \u2014 Submit';\n                showToast('Network error.', 'error');\n            });\n    };\n\n    \/* ============================\n       Save Content Preferences\n    ============================ *\/\n    window.saveContentPrefs = function() {\n        var checked = document.querySelectorAll('#categories-grid input[type=\"checkbox\"]:checked').length;\n        if (checked < 3) { alert('Please select at least 3 categories.'); return; }\n\n        var btn = document.getElementById('save-prefs-btn');\n        if (btn) { btn.disabled = true; btn.textContent = 'Saving...'; }\n\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_dashboard_save_prefs');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('broker_id', brokerId);\n        fd.append('token', brokerToken);\n\n        document.querySelectorAll('#categories-grid input[type=\"checkbox\"]:checked').forEach(function(cb) {\n            fd.append('categories[]', cb.value);\n        });\n\n        var toneRadio = document.querySelector('input[name=\"tone\"]:checked');\n        if (toneRadio) fd.append('tone', toneRadio.value);\n\n        document.querySelectorAll('input[name=\"specialty_focus[]\"]:checked').forEach(function(cb) {\n            fd.append('specialty_focus[]', cb.value);\n        });\n\n        document.querySelectorAll('#dash-service-areas-list .dash-area-row').forEach(function(row) {\n            var zipInput = row.querySelector('.dash-zip-input');\n            var cityHidden = row.querySelector('input[name=\"area_cities[]\"]');\n            var stateHidden = row.querySelector('input[name=\"area_states[]\"]');\n            if (zipInput && zipInput.value.trim()) {\n                fd.append('area_zips[]', zipInput.value.trim());\n                fd.append('area_cities[]', cityHidden ? cityHidden.value : '');\n                fd.append('area_states[]', stateHidden ? stateHidden.value : '');\n            }\n        });\n\n        var sigPhrase = document.querySelector('textarea[name=\"signature_phrase\"]');\n        if (sigPhrase) fd.append('signature_phrase', sigPhrase.value);\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            if (btn) { btn.disabled = false; btn.textContent = 'Save Preferences'; }\n            try {\n                var resp = JSON.parse(xhr.responseText);\n                showToast(resp.success ? 'Preferences saved \u2713' : 'Save failed');\n            } catch (e) { showToast('Save failed'); }\n        };\n        xhr.onerror = function() { if (btn) { btn.disabled = false; btn.textContent = 'Save Preferences'; } showToast('Network error'); };\n        xhr.send(fd);\n    };\n\n    \/* ============================\n       Save Profile\n    ============================ *\/\n    window.saveProfile = function() {\n        var btn = document.getElementById('save-profile-btn');\n        if (btn) { btn.disabled = true; btn.textContent = 'Saving...'; }\n\n        var form = document.getElementById('profile-form');\n        var fd = new FormData(form);\n        fd.append('action', 'gvei_broker_dashboard_save_profile');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('broker_id', brokerId);\n        fd.append('token', brokerToken);\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            if (btn) { btn.disabled = false; btn.textContent = 'Save Profile'; }\n            try {\n                var resp = JSON.parse(xhr.responseText);\n                showToast(resp.success ? 'Profile saved \u2713' : 'Save failed');\n            } catch (e) { showToast('Save failed'); }\n        };\n        xhr.onerror = function() { if (btn) { btn.disabled = false; btn.textContent = 'Save Profile'; } showToast('Network error'); };\n        xhr.send(fd);\n    };\n\n    \/* ============================\n       Logo Upload \/ Remove\n    ============================ *\/\n    var logoInput = document.getElementById('logo-file-input');\n    if (logoInput) {\n        logoInput.addEventListener('change', function() {\n            if (!this.files || !this.files[0]) return;\n            var file = this.files[0];\n            if (file.size > 5 * 1024 * 1024) { alert('Logo must be under 5 MB.'); this.value = ''; return; }\n\n            var fd = new FormData();\n            fd.append('action', 'gvei_broker_upload_logo');\n            fd.append('broker_id', brokerId);\n            fd.append('token', brokerToken);\n            fd.append('logo_file', file);\n            fd.append('gvei_broker_dashboard_nonce', nonce);\n\n            showToast('Uploading logo...');\n            var xhr = new XMLHttpRequest();\n            xhr.open('POST', ajaxUrl, true);\n            xhr.onload = function() {\n                try {\n                    var resp = JSON.parse(xhr.responseText);\n                    if (resp.success && resp.data && resp.data.url) {\n                        var preview = document.getElementById('logo-preview');\n                        if (preview) preview.innerHTML = '<img decoding=\"async\" src=\"' + resp.data.url + '\" alt=\"Logo\">';\n\n                        var wrap = document.getElementById('endcard-logo-wrap');\n                        if (wrap) {\n                            wrap.className = 'gvei-endcard-agency-logo';\n                            wrap.id = 'endcard-logo-wrap';\n                            wrap.innerHTML = '<img decoding=\"async\" src=\"' + resp.data.url + '\" alt=\"Logo\" id=\"endcard-logo-img\">';\n                        }\n                        showToast('Logo uploaded \u2713');\n                    } else {\n                        showToast(resp.data && resp.data.message ? resp.data.message : 'Upload failed');\n                    }\n                } catch (e) { showToast('Upload failed'); }\n            };\n            xhr.onerror = function() { showToast('Network error'); };\n            xhr.send(fd);\n            this.value = '';\n        });\n    }\n\n    window.removeLogo = function() {\n        if (!confirm('Remove your company logo?')) return;\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_dashboard_save_profile');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('broker_id', brokerId);\n        fd.append('token', brokerToken);\n        fd.append('remove_logo', '1');\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            try {\n                var resp = JSON.parse(xhr.responseText);\n                if (resp.success) {\n                    var preview = document.getElementById('logo-preview');\n                    if (preview) preview.innerHTML = '<span class=\"placeholder-text\">No logo<\/span>';\n\n                    var wrap = document.getElementById('endcard-logo-wrap');\n                    if (wrap) {\n                        wrap.className = 'gvei-endcard-no-logo-spacer';\n                        wrap.removeAttribute('aria-hidden');\n                        wrap.innerHTML = '';\n                    }\n                    showToast('Logo removed \u2713');\n                }\n            } catch (e) { showToast('Remove failed'); }\n        };\n        xhr.send(fd);\n    };\n\n    \/* ============================\n       End Card Color Live Preview\n    ============================ *\/\n    var ecBgInput = document.getElementById('end-card-bg-color');\n    var ecTextInput = document.getElementById('end-card-text-color');\n    var ecPreview = document.getElementById('gvei-endcard-preview');\n    if (ecBgInput && ecPreview) {\n        ecBgInput.addEventListener('input', function() {\n            ecPreview.style.background = this.value;\n        });\n    }\n    if (ecTextInput && ecPreview) {\n        ecTextInput.addEventListener('input', function() {\n            ecPreview.style.color = this.value;\n            var nameEl = ecPreview.querySelector('.gvei-endcard-name');\n            var phoneEl = ecPreview.querySelector('.gvei-endcard-phone');\n            if (nameEl) nameEl.style.color = this.value;\n            if (phoneEl) phoneEl.style.color = this.value;\n        });\n    }\n\n    window.saveEndCardColors = function() {\n        var btn = document.getElementById('save-colors-btn');\n        if (btn) { btn.disabled = true; btn.textContent = 'Saving...'; }\n\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_dashboard_save_profile');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('broker_id', brokerId);\n        fd.append('token', brokerToken);\n\n        var accent = document.getElementById('v2-accent-color');\n        var bg = document.getElementById('end-card-bg-color');\n        var txt = document.getElementById('end-card-text-color');\n        if (accent) fd.append('v2_accent_color', accent.value);\n        if (bg) fd.append('end_card_bg_color', bg.value);\n        if (txt) fd.append('end_card_text_color', txt.value);\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            if (btn) { btn.disabled = false; btn.textContent = 'Save Changes'; }\n            try {\n                var resp = JSON.parse(xhr.responseText);\n                showToast(resp.success ? 'Colors saved \u2713' : 'Save failed');\n            } catch (e) { showToast('Save failed'); }\n        };\n        xhr.onerror = function() { if (btn) { btn.disabled = false; btn.textContent = 'Save Changes'; } showToast('Network error'); };\n        xhr.send(fd);\n    };\n\n    \/* ============================\n       Photo Upload (Cropper.js)\n    ============================ *\/\n    var photoInput = document.getElementById('photo-file-input');\n    var cropModal = document.getElementById('crop-modal');\n    var cropImage = document.getElementById('crop-image');\n    var cropSave = document.getElementById('crop-save');\n    var cropCancel = document.getElementById('crop-cancel');\n    var zoomInBtn = document.getElementById('zoom-in');\n    var zoomOutBtn = document.getElementById('zoom-out');\n\n    function showPhotoLoading(msg) {\n        var preview = document.getElementById('photo-preview');\n        if (!preview) return;\n        var existing = preview.querySelector('.gvei-photo-loading');\n        if (existing) existing.remove();\n        var overlay = document.createElement('div');\n        overlay.className = 'gvei-photo-loading';\n        overlay.innerHTML = '<div class=\"gvei-photo-spinner\"><\/div><span>' + (msg || 'Converting\u2026') + '<\/span>';\n        preview.appendChild(overlay);\n    }\n    function hidePhotoLoading() {\n        var el = document.querySelector('.gvei-photo-loading');\n        if (el) el.remove();\n    }\n\n    if (photoInput) {\n        photoInput.addEventListener('click', function() { this.value = ''; });\n        photoInput.addEventListener('change', function(e) {\n            var file = e.target.files[0];\n            if (!file) return;\n\n            var isImage = file.type.indexOf('image') === 0;\n            var isHeic = \/\\.(heic|heif)$\/i.test(file.name) || file.type === 'image\/heic' || file.type === 'image\/heif';\n\n            if (!isImage && !isHeic) { alert('Please select an image file.'); return; }\n\n            if (isHeic) {\n                showPhotoLoading('Converting\u2026');\n                if (typeof heic2any !== 'undefined') {\n                    heic2any({ blob: file, toType: 'image\/jpeg', quality: 0.92 }).then(function(jpegBlob) {\n                        hidePhotoLoading();\n                        var reader = new FileReader();\n                        reader.onload = function(ev) { openCropper(ev.target.result); };\n                        reader.readAsDataURL(jpegBlob);\n                    }).catch(function() { serverConvertHeic(file); });\n                } else {\n                    serverConvertHeic(file);\n                }\n            } else {\n                var reader = new FileReader();\n                reader.onload = function(ev) { openCropper(ev.target.result); };\n                reader.readAsDataURL(file);\n            }\n        });\n    }\n\n    function serverConvertHeic(file) {\n        showPhotoLoading('Converting\u2026');\n        var fd = new FormData();\n        fd.append('action', 'gvei_convert_heic');\n        fd.append('image', file, file.name);\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            hidePhotoLoading();\n            try {\n                var resp = JSON.parse(xhr.responseText);\n                if (resp.success && resp.data && resp.data.jpeg_data) {\n                    openCropper('data:image\/jpeg;base64,' + resp.data.jpeg_data);\n                } else {\n                    showToast(resp.data && resp.data.message ? resp.data.message : 'Could not convert HEIC image. Try a JPEG or PNG.');\n                }\n            } catch (e) {\n                showToast('Could not convert HEIC image. Try a JPEG or PNG.');\n            }\n        };\n        xhr.onerror = function() { hidePhotoLoading(); showToast('HEIC conversion failed. Try a JPEG or PNG.'); };\n        xhr.send(fd);\n    }\n\n    function openCropper(src) {\n        if (!cropImage || !cropModal) return;\n        if (photoCropper) { photoCropper.destroy(); photoCropper = null; }\n        cropImage.src = '';\n        cropModal.classList.add('active');\n        cropImage.onload = function() {\n            if (typeof Cropper !== 'undefined') {\n                setTimeout(function() {\n                    photoCropper = new Cropper(cropImage, {\n                        aspectRatio: 1, viewMode: 1, dragMode: 'move', autoCropArea: 0.8,\n                        cropBoxMovable: false, cropBoxResizable: false, background: false,\n                        guides: false, center: true, highlight: false, responsive: true,\n                    });\n                }, 100);\n            }\n        };\n        cropImage.src = src;\n    }\n\n    if (zoomInBtn) zoomInBtn.addEventListener('click', function() { if (photoCropper) photoCropper.zoom(0.1); });\n    if (zoomOutBtn) zoomOutBtn.addEventListener('click', function() { if (photoCropper) photoCropper.zoom(-0.1); });\n\n    if (cropCancel) {\n        cropCancel.addEventListener('click', function() {\n            if (cropModal) cropModal.classList.remove('active');\n            if (photoCropper) { photoCropper.destroy(); photoCropper = null; }\n        });\n    }\n\n    if (cropSave) {\n        cropSave.addEventListener('click', function() {\n            if (!photoCropper) return;\n            var canvas = photoCropper.getCroppedCanvas({ width: 500, height: 500, imageSmoothingQuality: 'high' });\n            var dataUrl = canvas.toDataURL('image\/jpeg', 0.92);\n\n            var preview = document.getElementById('photo-preview');\n            if (preview) preview.innerHTML = '<img decoding=\"async\" src=\"' + dataUrl + '\" alt=\"Profile\">';\n\n            var croppedInput = document.getElementById('broker-photo-cropped');\n            if (croppedInput) croppedInput.value = dataUrl;\n\n            var btn = document.getElementById('upload-photo-btn');\n            if (btn) btn.textContent = 'Change Photo';\n\n            if (cropModal) cropModal.classList.remove('active');\n            photoCropper.destroy(); photoCropper = null;\n\n            uploadCroppedPhoto(dataUrl);\n        });\n    }\n\n    if (cropModal) {\n        cropModal.addEventListener('click', function(e) {\n            if (e.target === cropModal && cropCancel) cropCancel.click();\n        });\n    }\n\n    function uploadCroppedPhoto(dataUrl) {\n        showToast('Uploading photo...');\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_upload_photo');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('broker_id', brokerId);\n        fd.append('token', brokerToken);\n        fd.append('photo_data', dataUrl);\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            try {\n                var resp = JSON.parse(xhr.responseText);\n                showToast(resp.success ? 'Photo saved \u2713' : 'Photo upload failed');\n            } catch (e) { showToast('Photo upload failed'); }\n        };\n        xhr.send(fd);\n    }\n\n    \/* ============================\n       Voice Mode \/ Selection\n    ============================ *\/\n    window.selectVoiceMode = function(mode) {\n        document.getElementById('voice-mode-input').value = mode;\n        document.querySelectorAll('.gvei-voice-mode-option').forEach(function(el) {\n            el.classList.toggle('selected', el.getAttribute('data-mode') === mode);\n        });\n        document.getElementById('clone-panel').style.display = mode === 'clone' ? '' : 'none';\n        document.getElementById('preset-panel').style.display = mode === 'preset' ? '' : 'none';\n    };\n\n    window.selectPresetVoice = function(el, voiceId, voiceName) {\n        document.querySelectorAll('.gvei-voice-card').forEach(function(c) { c.classList.remove('selected'); });\n        el.classList.add('selected');\n        document.getElementById('voice-library-id-input').value = voiceId;\n        document.getElementById('voice-preset-input').value = voiceName;\n    };\n\n    window.playVoiceSample = function(btn, url) {\n        if (sampleAudio && btn.classList.contains('playing')) {\n            sampleAudio.pause(); sampleAudio = null;\n            btn.classList.remove('playing'); btn.innerHTML = '\u25b6';\n            return;\n        }\n        if (sampleAudio) { sampleAudio.pause(); sampleAudio = null; }\n        document.querySelectorAll('.gvei-voice-play').forEach(function(b) { b.classList.remove('playing'); b.innerHTML = '\u25b6'; });\n        sampleAudio = new Audio(url);\n        btn.classList.add('playing'); btn.innerHTML = '\u23f8';\n        sampleAudio.play();\n        sampleAudio.onended = function() { btn.classList.remove('playing'); btn.innerHTML = '\u25b6'; sampleAudio = null; };\n    };\n\n    \/* ============================\n       Dashboard Voice Tab Toggle\n    ============================ *\/\n    window.dashSwitchVoiceTab = function(tab) {\n        var recBtn = document.getElementById('dash-tab-record');\n        var uplBtn = document.getElementById('dash-tab-upload');\n        var recPanel = document.getElementById('dash-record-panel');\n        var uplPanel = document.getElementById('dash-upload-panel');\n        if (tab === 'record') {\n            if (recBtn) { recBtn.style.background = 'white'; recBtn.style.color = '#374151'; recBtn.style.boxShadow = '0 1px 3px rgba(0,0,0,0.08)'; recBtn.classList.add('active'); }\n            if (uplBtn) { uplBtn.style.background = 'transparent'; uplBtn.style.color = '#6b7280'; uplBtn.style.boxShadow = 'none'; uplBtn.classList.remove('active'); }\n            if (recPanel) recPanel.style.display = '';\n            if (uplPanel) uplPanel.style.display = 'none';\n        } else {\n            if (uplBtn) { uplBtn.style.background = 'white'; uplBtn.style.color = '#374151'; uplBtn.style.boxShadow = '0 1px 3px rgba(0,0,0,0.08)'; uplBtn.classList.add('active'); }\n            if (recBtn) { recBtn.style.background = 'transparent'; recBtn.style.color = '#6b7280'; recBtn.style.boxShadow = 'none'; recBtn.classList.remove('active'); }\n            if (uplPanel) uplPanel.style.display = '';\n            if (recPanel) recPanel.style.display = 'none';\n        }\n    };\n\n    \/* ============================\n       Dashboard Recording State\n    ============================ *\/\n    var dRecorder = null, dStream = null, dChunks = [], dBlob = null, dSec = 0, dTimer = null;\n    var D_MIN = 20, D_GOOD = 40, D_GREAT = 60, D_MAX = 120;\n\n    window.dashStartRecording = function() {\n        if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {\n            alert('Your browser does not support audio recording. Please upload a file instead.');\n            return;\n        }\n        navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, sampleRate: 44100 } })\n        .then(function(stream) {\n            dStream = stream;\n            var opts = {};\n            if (MediaRecorder.isTypeSupported('audio\/webm;codecs=opus')) opts.mimeType = 'audio\/webm;codecs=opus';\n            else if (MediaRecorder.isTypeSupported('audio\/webm')) opts.mimeType = 'audio\/webm';\n            else if (MediaRecorder.isTypeSupported('audio\/mp4')) opts.mimeType = 'audio\/mp4';\n\n            dRecorder = new MediaRecorder(stream, opts);\n            dChunks = [];\n            dRecorder.ondataavailable = function(e) { dChunks.push(e.data); };\n            dRecorder.onstop = function() {\n                dBlob = new Blob(dChunks, { type: dRecorder.mimeType || 'audio\/webm' });\n                dashShowReview();\n            };\n\n            document.getElementById('dash-rec-start').style.display = 'none';\n            document.getElementById('dash-rec-countdown').style.display = '';\n\n            var count = 3;\n            var numEl = document.getElementById('dash-countdown-num');\n            numEl.textContent = count;\n\n            var cdI = setInterval(function() {\n                count--;\n                if (count === 0) { dRecorder.start(); dSec = 0; }\n                if (count > 0) {\n                    numEl.style.animation = 'none'; numEl.offsetHeight; numEl.style.animation = '';\n                    numEl.textContent = count;\n                } else {\n                    clearInterval(cdI);\n                    document.getElementById('dash-rec-countdown').style.display = 'none';\n                    document.getElementById('dash-rec-active').style.display = '';\n                    dTimer = setInterval(function() {\n                        dSec++;\n                        dashUpdateTimer();\n                        dashUpdateProgress();\n                        if (dSec >= D_MAX) dashStopRecording();\n                    }, 1000);\n                }\n            }, 1000);\n        }).catch(function() { alert('Could not access microphone. Check permissions or upload a file instead.'); });\n    };\n\n    function dashUpdateTimer() {\n        var el = document.getElementById('dash-rec-timer');\n        if (el) el.textContent = Math.floor(dSec \/ 60) + ':' + (dSec % 60 < 10 ? '0' : '') + (dSec % 60);\n    }\n\n    function dashUpdateProgress() {\n        var bar = document.getElementById('dash-rec-progress');\n        var txt = document.getElementById('dash-rec-progress-text');\n        if (!bar || !txt) return;\n        bar.style.width = Math.min((dSec \/ D_MAX) * 100, 100) + '%';\n        if (dSec >= D_GREAT) { bar.style.background = 'linear-gradient(90deg, #22c55e, #10b981)'; txt.style.color = '#10b981'; txt.textContent = '\u2713 Excellent! You can stop whenever you\\'re ready'; }\n        else if (dSec >= D_GOOD) { bar.style.background = 'linear-gradient(90deg, #f59e0b, #22c55e)'; txt.style.color = '#16a34a'; txt.textContent = '\u2713 Great sample! Keep going for even better quality'; }\n        else if (dSec >= D_MIN) { bar.style.background = 'linear-gradient(90deg, #f97316, #f59e0b)'; txt.style.color = '#d97706'; txt.textContent = '\u2713 Good \u2014 a bit more will improve voice quality'; }\n        else { bar.style.background = 'linear-gradient(90deg, #ef4444, #f97316)'; txt.style.color = '#ef4444'; txt.textContent = 'Keep going! Need at least ' + (D_MIN - dSec) + ' more seconds'; }\n    }\n\n    window.dashStopRecording = function() {\n        if (dRecorder && dRecorder.state === 'recording') dRecorder.stop();\n        if (dTimer) { clearInterval(dTimer); dTimer = null; }\n        if (dStream) { dStream.getTracks().forEach(function(t) { t.stop(); }); dStream = null; }\n    };\n\n    function dashShowReview() {\n        document.getElementById('dash-rec-active').style.display = 'none';\n        document.getElementById('dash-rec-review').style.display = '';\n        var audio = document.getElementById('dash-rec-audio-review');\n        if (audio && dBlob) audio.src = URL.createObjectURL(dBlob);\n        var badge = document.getElementById('dash-rec-duration-badge');\n        if (badge) {\n            var m = Math.floor(dSec \/ 60), s = dSec % 60, label = '';\n            if (dSec >= D_GREAT) { label = '\u2713\u2713\u2713 Excellent'; badge.style.background = '#dcfce7'; badge.style.color = '#166534'; }\n            else if (dSec >= D_GOOD) { label = '\u2713\u2713 Great'; badge.style.background = '#dcfce7'; badge.style.color = '#166534'; }\n            else if (dSec >= D_MIN) { label = '\u2713 Good'; badge.style.background = '#fef3c7'; badge.style.color = '#92400e'; }\n            else { label = '\u26a0\ufe0f Short'; badge.style.background = '#fee2e2'; badge.style.color = '#991b1b'; }\n            badge.textContent = label + ' \u2022 ' + m + ':' + (s < 10 ? '0' : '') + s;\n        }\n    }\n\n    window.dashResetRecording = function() {\n        dBlob = null; dSec = 0;\n        var timer = document.getElementById('dash-rec-timer'); if (timer) timer.textContent = '0:00';\n        var numEl = document.getElementById('dash-countdown-num'); if (numEl) numEl.textContent = '3';\n        var bar = document.getElementById('dash-rec-progress'); if (bar) { bar.style.width = '0%'; bar.style.background = 'linear-gradient(90deg, #ef4444, #f97316)'; }\n        var txt = document.getElementById('dash-rec-progress-text'); if (txt) { txt.textContent = 'Keep going! Need at least 20 seconds'; txt.style.color = '#ef4444'; }\n        \/\/ Restore review area HTML if it was replaced by the upload spinner\n        var reviewArea = document.getElementById('dash-rec-review');\n        if (reviewArea && window._mbDashReviewHTML) {\n            reviewArea.innerHTML = window._mbDashReviewHTML;\n        }\n        document.getElementById('dash-rec-start').style.display = '';\n        document.getElementById('dash-rec-countdown').style.display = 'none';\n        document.getElementById('dash-rec-active').style.display = 'none';\n        document.getElementById('dash-rec-review').style.display = 'none';\n        document.getElementById('dash-rec-success').style.display = 'none';\n    };\n\n    window.dashSubmitRecording = function() {\n        if (!dBlob) { alert('No recording found. Please try again.'); return; }\n        var reviewArea = document.getElementById('dash-rec-review');\n        if (reviewArea) {\n            if (!window._mbDashReviewHTML) {\n                window._mbDashReviewHTML = reviewArea.innerHTML;\n            }\n            reviewArea.innerHTML = '<div style=\"text-align:center; padding:40px 20px;\"><div class=\"dash-spinner\" style=\"margin:0 auto 16px;\"><\/div><p style=\"color:#64748b;\">Saving your voice...<\/p><\/div>';\n        }\n\n        var ext = 'webm';\n        if (dBlob.type.indexOf('mp4') !== -1) ext = 'm4a';\n        if (dBlob.type.indexOf('mpeg') !== -1) ext = 'mp3';\n\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_upload_voice');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('broker_id', brokerId);\n        fd.append('token', brokerToken);\n        fd.append('voice_file', dBlob, 'voice-recording.' + ext);\n        fd.append('duration', dSec);\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            if (xhr.status === 200) {\n                try {\n                    var resp = JSON.parse(xhr.responseText);\n                    if (resp.success && resp.data && resp.data.url) {\n                        document.getElementById('voice-mode-input').value = 'clone';\n                        document.getElementById('dash-rec-review').style.display = 'none';\n                        document.getElementById('dash-rec-success').style.display = '';\n                        showToast('Voice sample saved \u2713');\n                    } else { showToast('Upload failed'); dashResetRecording(); }\n                } catch (e) { showToast('Upload failed'); dashResetRecording(); }\n            } else { showToast('Upload failed'); dashResetRecording(); }\n        };\n        xhr.onerror = function() { showToast('Network error'); dashResetRecording(); };\n        xhr.send(fd);\n    };\n\n    \/* ============================\n       Voice File Input + Upload\n    ============================ *\/\n    var dashVoiceInput = document.getElementById('voice-file-input');\n    if (dashVoiceInput) {\n        dashVoiceInput.addEventListener('change', function() {\n            dashHandleVoiceFile(this.files);\n        });\n    }\n\n    function dashHandleVoiceFile(files) {\n        var btn = document.getElementById('dash-upload-voice-btn');\n        var preview = document.getElementById('dash-voice-local-preview');\n        var audio = document.getElementById('dash-voice-local-audio');\n        if (files && files.length > 0) {\n            if (files[0].size > 40 * 1024 * 1024) {\n                alert('File too large. Maximum size is 40MB.');\n                return;\n            }\n            if (btn) btn.disabled = false;\n            if (preview && audio) { audio.src = URL.createObjectURL(files[0]); preview.style.display = ''; }\n        } else {\n            if (btn) btn.disabled = true;\n            if (preview) preview.style.display = 'none';\n        }\n    }\n\n    var dashDropZone = document.getElementById('dash-voice-drop-zone');\n    if (dashDropZone) {\n        ['dragenter', 'dragover'].forEach(function(evt) {\n            dashDropZone.addEventListener(evt, function(e) {\n                e.preventDefault(); e.stopPropagation();\n                dashDropZone.style.borderColor = '#6366f1';\n                dashDropZone.style.background = 'linear-gradient(135deg, #f5f3ff, #ede9fe)';\n                document.getElementById('dash-voice-drop-icon').textContent = '\u2b07\ufe0f';\n                document.getElementById('dash-voice-drop-text').textContent = 'Drop your audio file here';\n            });\n        });\n        ['dragleave', 'drop'].forEach(function(evt) {\n            dashDropZone.addEventListener(evt, function(e) {\n                e.preventDefault(); e.stopPropagation();\n                dashDropZone.style.borderColor = '#d1d5db';\n                dashDropZone.style.background = 'transparent';\n                document.getElementById('dash-voice-drop-icon').textContent = '\ud83d\udcc1';\n                document.getElementById('dash-voice-drop-text').textContent = 'Tap or drag file here';\n            });\n        });\n        dashDropZone.addEventListener('drop', function(e) {\n            var files = e.dataTransfer.files;\n            if (files.length > 0) {\n                var file = files[0];\n                var valid = \/\\.(mp3|wav|m4a|webm)$\/i.test(file.name) || file.type.indexOf('audio') === 0;\n                if (!valid) { alert('Please drop an audio file (MP3, WAV, or M4A).'); return; }\n                var input = document.getElementById('voice-file-input');\n                var dt = new DataTransfer();\n                dt.items.add(file);\n                input.files = dt.files;\n                dashHandleVoiceFile(input.files);\n            }\n        });\n    }\n\n    window.uploadVoiceFile = function() {\n        var fileInput = document.getElementById('voice-file-input');\n        if (!fileInput || !fileInput.files.length) { alert('Please select a file first.'); return; }\n\n        showToast('Uploading voice sample...');\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_upload_voice');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('broker_id', brokerId);\n        fd.append('token', brokerToken);\n        fd.append('voice_file', fileInput.files[0]);\n\n        var statusEl = document.getElementById('dash-voice-upload-status');\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            try {\n                var resp = JSON.parse(xhr.responseText);\n                if (resp.success && resp.data && resp.data.url) {\n                    document.getElementById('voice-mode-input').value = 'clone';\n                    var dashDropZone = document.getElementById('dash-voice-drop-zone');\n                    var dashLocalPreview = document.getElementById('dash-voice-local-preview');\n                    if (dashDropZone) dashDropZone.style.display = 'none';\n                    if (dashLocalPreview) dashLocalPreview.style.display = 'none';\n                    if (statusEl) statusEl.innerHTML = '<div style=\"text-align:center; padding:20px; background:linear-gradient(135deg,#ecfdf5,#d1fae5); border-radius:12px; border:1px solid #86efac;\">' +\n                        '<div style=\"font-size:32px; margin-bottom:8px;\">\u2705<\/div>' +\n                        '<p style=\"color:#166534; font-weight:600; font-size:15px; margin:0 0 12px;\">Voice sample uploaded!<\/p>' +\n                        '<audio controls src=\"' + resp.data.url + '\" style=\"width:100%;max-width:320px;margin-bottom:12px;\"><\/audio>' +\n                        '<div><button type=\"button\" onclick=\"dashResetFileUpload()\" style=\"padding:8px 20px; border:1px solid #86efac; background:white; border-radius:20px; font-size:13px; color:#166534; cursor:pointer;\">Upload Different File<\/button><\/div><\/div>';\n                    showToast('Voice uploaded \u2713');\n                } else {\n                    showToast('Upload failed');\n                    if (statusEl) statusEl.textContent = 'Upload failed: ' + (resp.data || 'Unknown error');\n                }\n            } catch (e) { showToast('Upload failed'); }\n        };\n        xhr.onerror = function() { showToast('Network error'); };\n        xhr.send(fd);\n    };\n\n    window.dashResetFileUpload = function() {\n        var dz = document.getElementById('dash-voice-drop-zone');\n        var st = document.getElementById('dash-voice-upload-status');\n        var lp = document.getElementById('dash-voice-local-preview');\n        if (dz) dz.style.display = '';\n        if (st) st.innerHTML = '';\n        if (lp) lp.style.display = 'none';\n        var fi = document.getElementById('voice-file-input');\n        if (fi) fi.value = '';\n    };\n\n    \/* ============================\n       Voice Preview\n    ============================ *\/\n    window.previewVoice = function() {\n        showToast('Generating preview...');\n        var previewBtn = document.getElementById('dash-preview-voice-btn');\n        var stopBtn = document.getElementById('dash-stop-preview-btn');\n        if (previewBtn) previewBtn.disabled = true;\n\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_preview_voice');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('broker_id', brokerId);\n        fd.append('token', brokerToken);\n        fd.append('voice_mode', document.getElementById('voice-mode-input').value);\n        fd.append('voice_library_id', document.getElementById('voice-library-id-input').value);\n        var styleSelect = document.getElementById('voice-style-select');\n        if (styleSelect) fd.append('voice_style', styleSelect.value);\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            if (previewBtn) previewBtn.disabled = false;\n            try {\n                var resp = JSON.parse(xhr.responseText);\n                if (resp.success && resp.data && resp.data.audio_url) {\n                    var player = document.getElementById('voice-preview-player');\n                    var audio = document.getElementById('voice-preview-audio');\n                    if (player && audio) {\n                        audio.src = resp.data.audio_url; player.style.display = ''; audio.play();\n                        if (stopBtn) stopBtn.style.display = '';\n                        audio.onended = function() { if (stopBtn) stopBtn.style.display = 'none'; };\n                    }\n                    showToast('Preview ready');\n                } else {\n                    showToast(resp.data && resp.data.message ? resp.data.message : 'Preview failed');\n                }\n            } catch (e) { showToast('Preview failed'); }\n        };\n        xhr.send(fd);\n    };\n\n    window.dashStopPreview = function() {\n        var audio = document.getElementById('voice-preview-audio');\n        var stopBtn = document.getElementById('dash-stop-preview-btn');\n        if (audio) { audio.pause(); audio.currentTime = 0; }\n        if (stopBtn) stopBtn.style.display = 'none';\n    };\n\n    \/* ============================\n       Save Voice Settings\n    ============================ *\/\n    window.saveVoice = function() {\n        showToast('Saving voice settings...');\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_dashboard_save_voice');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('broker_id', brokerId);\n        fd.append('token', brokerToken);\n        fd.append('voice_mode', document.getElementById('voice-mode-input').value);\n        fd.append('voice_preset', document.getElementById('voice-preset-input').value);\n        fd.append('voice_library_id', document.getElementById('voice-library-id-input').value);\n        var styleSelect = document.getElementById('voice-style-select');\n        if (styleSelect) fd.append('voice_style', styleSelect.value);\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            try {\n                var resp = JSON.parse(xhr.responseText);\n                showToast(resp.success ? 'Voice settings saved \u2713' : 'Save failed');\n            } catch (e) { showToast('Save failed'); }\n        };\n        xhr.send(fd);\n    };\n\n    \/* ============================\n       Video Modal\n    ============================ *\/\n    window.openVideoModal = function(card) {\n        var url = card.getAttribute('data-video-url');\n        if (!url) return;\n        var modal = document.getElementById('video-modal');\n        var video = document.getElementById('modal-video');\n        var dl = document.getElementById('modal-download');\n        if (modal && video) {\n            video.src = url;\n            if (dl) dl.href = url;\n            modal.classList.add('active');\n        }\n    };\n\n    window.closeVideoModal = function() {\n        var modal = document.getElementById('video-modal');\n        var video = document.getElementById('modal-video');\n        if (video) { video.pause(); video.src = ''; }\n        if (modal) modal.classList.remove('active');\n    };\n\n    var videoModal = document.getElementById('video-modal');\n    if (videoModal) {\n        videoModal.addEventListener('click', function(e) {\n            if (e.target === videoModal) closeVideoModal();\n        });\n    }\n\n    \/* ============================\n       Creative Review \u2014 Request Revision\n    ============================ *\/\n    window.requestRevision = function(videoId) {\n        if (!confirm('Want to make changes? This will use 1 of your remaining revisions. Your current video will be replaced with the updated version.')) {\n            return;\n        }\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_request_revision');\n        fd.append('gvei_broker_dashboard_nonce', document.getElementById('gvei_broker_dashboard_nonce').value);\n        fd.append('broker_id', document.getElementById('broker-id').value);\n        fd.append('token', document.getElementById('broker-token').value);\n        fd.append('video_id', videoId);\n\n        fetch(document.getElementById('ajax-url').value, { method: 'POST', body: fd })\n            .then(function(r) { return r.json(); })\n            .then(function(res) {\n                if (res.success) {\n                    window.location.href = res.data.review_url || window.location.href;\n                } else {\n                    alert(res.data.message || 'Could not request revision.');\n                }\n            })\n            .catch(function() { alert('Network error. Please try again.'); });\n    };\n\n    \/* ============================\n       Billing\n    ============================ *\/\n    window.openBillingPortal = function() {\n        showToast('Opening billing portal...');\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_billing_portal');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('broker_id', brokerId);\n        fd.append('token', brokerToken);\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            try {\n                var resp = JSON.parse(xhr.responseText);\n                if (resp.success && resp.data && resp.data.url) {\n                    window.location.href = resp.data.url;\n                } else {\n                    showToast(resp.data && resp.data.message ? resp.data.message : 'Could not open billing portal');\n                }\n            } catch (e) { showToast('Error opening billing portal'); }\n        };\n        xhr.onerror = function() { showToast('Network error'); };\n        xhr.send(fd);\n    };\n\n    window.subscribeToPlan = function(tierId) {\n        showToast('Redirecting to checkout...');\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_checkout');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('broker_id', brokerId);\n        fd.append('token', brokerToken);\n        fd.append('tier_id', tierId);\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            try {\n                var resp = JSON.parse(xhr.responseText);\n                if (resp.success && resp.data && resp.data.checkout_url) {\n                    window.location.href = resp.data.checkout_url;\n                } else {\n                    showToast(resp.data && resp.data.message ? resp.data.message : 'Checkout failed');\n                }\n            } catch (e) { showToast('Checkout error'); }\n        };\n        xhr.onerror = function() { showToast('Network error'); };\n        xhr.send(fd);\n    };\n\n    \/* ============================\n       Cancel Subscription Modal\n    ============================ *\/\n    window.gveiOpenCancelModal = function() {\n        var modal = document.getElementById('gvei-cancel-modal');\n        if (!modal) return;\n        modal.style.display = 'flex';\n        document.getElementById('gvei-cancel-step1').style.display = '';\n        document.getElementById('gvei-cancel-step2').style.display = 'none';\n        document.getElementById('gvei-cancel-step3').style.display = 'none';\n        var input = document.getElementById('gvei-cancel-confirm-input');\n        if (input) input.value = '';\n        gveiValidateCancelInput(input);\n    };\n    window.gveiCloseCancelModal = function() {\n        var modal = document.getElementById('gvei-cancel-modal');\n        if (modal) modal.style.display = 'none';\n    };\n    window.gveiCancelStep2 = function() {\n        document.getElementById('gvei-cancel-step1').style.display = 'none';\n        document.getElementById('gvei-cancel-step2').style.display = '';\n        var input = document.getElementById('gvei-cancel-confirm-input');\n        if (input) { input.value = ''; input.focus(); }\n        gveiValidateCancelInput(input);\n    };\n    window.gveiCancelStep1 = function() {\n        document.getElementById('gvei-cancel-step2').style.display = 'none';\n        document.getElementById('gvei-cancel-step1').style.display = '';\n    };\n    window.gveiValidateCancelInput = function(el) {\n        var btn = document.getElementById('gvei-cancel-confirm-btn');\n        if (!btn || !el) return;\n        var match = el.value.trim().toUpperCase() === 'CANCEL';\n        btn.disabled = !match;\n        btn.style.background = match ? '#dc2626' : '#d1d5db';\n        btn.style.color = match ? '#fff' : '#9ca3af';\n        btn.style.borderColor = match ? '#dc2626' : '#d1d5db';\n        btn.style.cursor = match ? 'pointer' : 'not-allowed';\n        if (el) el.style.borderColor = match ? '#dc2626' : '#e5e7eb';\n    };\n    window.gveiConfirmCancel = function() {\n        var input = document.getElementById('gvei-cancel-confirm-input');\n        if (!input || input.value.trim().toUpperCase() !== 'CANCEL') return;\n\n        document.getElementById('gvei-cancel-step2').style.display = 'none';\n        document.getElementById('gvei-cancel-step3').style.display = '';\n        document.getElementById('gvei-cancel-processing').style.display = '';\n        document.getElementById('gvei-cancel-done').style.display = 'none';\n\n        var fd = new FormData();\n        fd.append('action', 'gvei_broker_cancel_subscription');\n        fd.append('gvei_broker_dashboard_nonce', nonce);\n        fd.append('broker_id', brokerId);\n        fd.append('token', brokerToken);\n        fd.append('confirmation_text', 'CANCEL');\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('POST', ajaxUrl, true);\n        xhr.onload = function() {\n            document.getElementById('gvei-cancel-processing').style.display = 'none';\n            try {\n                var resp = JSON.parse(xhr.responseText);\n                if (resp.success) {\n                    document.getElementById('gvei-cancel-done').style.display = '';\n                    var msg = document.getElementById('gvei-cancel-access-msg');\n                    if (msg && resp.data.access_end) {\n                        msg.textContent = 'You still have access until ' + resp.data.access_end + '.';\n                    }\n                } else {\n                    showToast(resp.data && resp.data.message ? resp.data.message : 'Something went wrong');\n                    gveiCloseCancelModal();\n                }\n            } catch (e) { showToast('Error processing cancellation'); gveiCloseCancelModal(); }\n        };\n        xhr.onerror = function() { showToast('Network error'); gveiCloseCancelModal(); };\n        xhr.send(fd);\n    };\n    (function() {\n        var modal = document.getElementById('gvei-cancel-modal');\n        if (modal) modal.addEventListener('click', function(e) { if (e.target === modal) gveiCloseCancelModal(); });\n    })();\n\n})();\n<\/script>\n\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-105","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/gogoit.com\/video\/wp-json\/wp\/v2\/pages\/105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gogoit.com\/video\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gogoit.com\/video\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gogoit.com\/video\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gogoit.com\/video\/wp-json\/wp\/v2\/comments?post=105"}],"version-history":[{"count":2,"href":"https:\/\/gogoit.com\/video\/wp-json\/wp\/v2\/pages\/105\/revisions"}],"predecessor-version":[{"id":109,"href":"https:\/\/gogoit.com\/video\/wp-json\/wp\/v2\/pages\/105\/revisions\/109"}],"wp:attachment":[{"href":"https:\/\/gogoit.com\/video\/wp-json\/wp\/v2\/media?parent=105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}